Quellcode durchsuchen

Merge remote-tracking branch 'origin/1348-transaction-locks'

tags/v0.4.3^2
Shaun Kichenbrand vor 4 Jahren
Ursprung
Commit
96b68a9b31
6 geänderte Dateien mit 89 neuen und 13 gelöschten Zeilen
  1. +6
    -1
      src/server/components/inventory.js
  2. +2
    -8
      src/server/mail/mailSqlite.js
  3. +5
    -4
      src/server/security/rest.js
  4. +37
    -0
      src/server/security/transactions.js
  5. +30
    -0
      src/server/world/atlas.js
  6. +9
    -0
      src/server/world/instancer.js

+ 6
- 1
src/server/components/inventory.js Datei anzeigen

@@ -5,6 +5,7 @@ let classes = require('../config/spirits');
let mtx = require('../mtx/mtx');
let factions = require('../config/factions');
let itemEffects = require('../items/itemEffects');
const transactions = require('../security/transactions');

const { applyItemStats } = require('./equipment/helpers');

@@ -469,6 +470,8 @@ module.exports = {
} else if (!this.findItem(msg.itemId))
return;

const resolveTrans = transactions.register();

let blocked = false;
if (res.components) {
let social = res.components.find(f => f.type === 'social');
@@ -480,9 +483,11 @@ module.exports = {
this.destroyItem(item.id);

if (!blocked)
this.obj.instance.mail.sendMail(msg.recipient, [mappedItem]);
await this.obj.instance.mail.sendMail(msg.recipient, [mappedItem]);

this.resolveCallback(msg);

resolveTrans();
},

hookItemEvents: function (items) {


+ 2
- 8
src/server/mail/mailSqlite.js Datei anzeigen

@@ -138,20 +138,14 @@ module.exports = {
noParse: true
});

this.doSendMail(playerName, items, callback, result);
},

doSendMail: async function (playerName, items, callback, result) {
if (result === 'null')
result = null;

result = JSON.parse(result || '[]');

items.forEach(function (i) {
result.push(i);
});
result.push(...items);

let itemString = JSON.stringify(result).split('\'').join('`');
const itemString = JSON.stringify(result).split('\'').join('`');

await io.setAsync({
key: playerName,


+ 5
- 4
src/server/security/rest.js Datei anzeigen

@@ -1,5 +1,4 @@
const serverConfig = require('../config/serverConfig');
const connections = require('../security/connections');
const version = serverConfig.version;
const bcrypt = require('bcrypt-nodejs');
const roles = require('../config/roles');
@@ -37,7 +36,7 @@ module.exports = {
bcrypt.compare(config.pwd, storedPassword, this.doSaveAll.bind(this, res, config));
},

doSaveAll: function (res, config, err, compareResult) {
doSaveAll: async function (res, config, err, compareResult) {
if (!compareResult)
return;

@@ -47,18 +46,20 @@ module.exports = {
if (roleLevel < 9)
return;

await atlas.returnWhenZonesIdle();

cons.emit('event', {
event: 'onGetMessages',
data: {
messages: [{
class: 'color-blueA',
message: config.msg,
message: 'asdd',
type: 'chat'
}]
}
});

connections.forceSaveAll();
cons.forceSaveAll();

res.jsonp({
success: true


+ 37
- 0
src/server/security/transactions.js Datei anzeigen

@@ -0,0 +1,37 @@
let lastId = 0;
const list = [];

const complete = id => {
list.spliceWhere(l => l === id);
};

const register = () => {
const nextId = ++lastId;
list.push(nextId);

return complete.bind(null, nextId);
};

const returnWhenDone = async () => {
if (!list.length)
return;

return new Promise(res => {
const checker = () => {
if (!list.length) {
res();

return;
}

setTimeout(checker, 100);
};

checker();
});
};

module.exports = {
register,
returnWhenDone
};

+ 30
- 0
src/server/world/atlas.js Datei anzeigen

@@ -5,6 +5,8 @@ let connections = require('../security/connections');
let serverConfig = require('../config/serverConfig');
let events = require('../misc/events');

const listenersOnZoneIdle = [];

module.exports = {
nextId: 0,
lastCallbackId: 0,
@@ -220,6 +222,34 @@ module.exports = {
serverObj.player.broadcastSelf();

this.addObject(obj, true, true);
},

onZoneIdle: function (thread) {
listenersOnZoneIdle.forEach(l => l(thread));
}
},

returnWhenZonesIdle: async function () {
return new Promise(res => {
const waiting = [...this.threads];

const onZoneIdle = thread => {
waiting.spliceWhere(w => w === thread);

if (waiting.length)
return;

listenersOnZoneIdle.spliceWhere(l => l === onZoneIdle);
res();
};

listenersOnZoneIdle.push(onZoneIdle);

this.threads.forEach(t => {
t.worker.send({
method: 'notifyOnceIdle'
});
});
});
}
};

+ 9
- 0
src/server/world/instancer.js Datei anzeigen

@@ -12,6 +12,7 @@ let scheduler = require('../misc/scheduler');
let mail = require('../mail/mail');
let herbs = require('../config/herbs');
let eventEmitter = require('../misc/events');
const transactions = require('../security/transactions');

module.exports = {
instances: [],
@@ -211,5 +212,13 @@ module.exports = {
}
});
}
},

notifyOnceIdle: async function () {
await transactions.returnWhenDone();

process.send({
method: 'onZoneIdle'
});
}
};

Laden…
Abbrechen
Speichern