flying-squid/src/lib/behavior.js

34 lines
No EOL
1.3 KiB
JavaScript

module.exports = (obj) => {
return async (eventName, data, func, cancelFunc) => {
let hiddenCancelled = false;
let cancelled = false;
let cancelCount = 0;
let defaultCancel = true;
const cancel = (dC=true, hidden=false) => { // Hidden shouldn't be used often but it's not hard to implement so meh
if (hidden) hiddenCancelled = true;
else {
cancelled = true;
cancelCount++;
}
defaultCancel = dC;
};
let resp;
await obj.emitThen(eventName + '_cancel', data, cancel).catch((err)=> setTimeout(() => {throw err;},0));
await obj.emitThen(eventName, data, cancelled, cancelCount).catch((err)=> setTimeout(() => {throw err;},0));
if (!hiddenCancelled && !cancelled) {
resp = func(data);
if (resp instanceof Promise) resp = await resp.catch((err)=> setTimeout(() => {throw err;},0));
if (typeof resp == 'undefined') resp = true;
} else if (cancelFunc && defaultCancel) {
resp = cancelFunc(data);
if (resp instanceof Promise) resp = await resp.catch((err)=> setTimeout(() => {throw err;},0));
if (typeof resp == 'undefined') resp = false;
}
await obj.emitThen(eventName + '_done', data, cancelled).catch((err)=> setTimeout(() => {throw err;},0));
return resp;
}
};