|
|
import util from 'node:util' |
|
|
import lodash from 'lodash' |
|
|
|
|
|
let events = {} |
|
|
let Handler = { |
|
|
add (cfg) { |
|
|
let { ns, fn, self, property = 50 } = cfg |
|
|
let key = cfg.key || cfg.event |
|
|
if (!key || !fn) { |
|
|
return |
|
|
} |
|
|
Handler.del(ns, key) |
|
|
logger.mark(`[Handler][Reg]: [${ns}][${key}]`) |
|
|
events[key] = events[key] || [] |
|
|
events[key].push({ |
|
|
property, |
|
|
fn, |
|
|
ns, |
|
|
self, |
|
|
key |
|
|
}) |
|
|
events[key] = lodash.orderBy(events[key], ['priority'], ['asc']) |
|
|
}, |
|
|
del (ns, key = '') { |
|
|
if (!key) { |
|
|
for (let key in events) { |
|
|
Handler.del(ns, key) |
|
|
} |
|
|
return |
|
|
} |
|
|
if (!events[key]) { |
|
|
return |
|
|
} |
|
|
for (let idx = 0; idx < events[key].length; idx++) { |
|
|
let handler = events[key][idx] |
|
|
if (handler.ns === ns) { |
|
|
events[key].splice(idx, 1) |
|
|
events[key] = lodash.orderBy(events[key], ['priority'], ['asc']) |
|
|
} |
|
|
} |
|
|
}, |
|
|
async callAll (key, e, args) { |
|
|
|
|
|
|
|
|
}, |
|
|
async call (key, e, args, allHandler = false) { |
|
|
let ret |
|
|
for (let obj of events[key]) { |
|
|
let fn = obj.fn |
|
|
let done = true |
|
|
let reject = (msg = '') => { |
|
|
if (msg) { |
|
|
logger.mark(`[Handler][Reject]: [${obj.ns}][${key}] ${msg}`) |
|
|
} |
|
|
done = false |
|
|
} |
|
|
ret = fn.call(obj.self, e, args, reject) |
|
|
if (util.types.isPromise(ret)) { |
|
|
ret = await ret |
|
|
} |
|
|
if (done && !allHandler) { |
|
|
logger.mark(`[Handler][Done]: [${obj.ns}][${key}]`) |
|
|
return ret |
|
|
} |
|
|
} |
|
|
return ret |
|
|
}, |
|
|
has (key) { |
|
|
return !!events[key] |
|
|
} |
|
|
} |
|
|
export default Handler |
|
|
|
|
|
|