UNPKG

flying-squid

Version:
37 lines (31 loc) 1.33 kB
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 func = func || (() => {}) 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 } }