File size: 1,672 Bytes
af5a34b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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) {
    // 暂时屏蔽调用
    // return Handler.call(key, e, args, true)
  },
  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