2018-08-16 22:30:59 +00:00
|
|
|
/*
|
2024-01-13 20:03:36 +00:00
|
|
|
* Copyright (c) 2010-2024 Tim Düsterhus.
|
2018-08-16 22:30:59 +00:00
|
|
|
*
|
|
|
|
* Use of this software is governed by the Business Source License
|
|
|
|
* included in the LICENSE file.
|
|
|
|
*
|
2024-06-15 19:56:58 +00:00
|
|
|
* Change Date: 2028-06-15
|
2018-08-16 22:30:59 +00:00
|
|
|
*
|
|
|
|
* On the date above, in accordance with the Business Source
|
|
|
|
* License, use of this software will be governed by version 2
|
|
|
|
* or later of the General Public License.
|
|
|
|
*/
|
|
|
|
|
2020-11-01 16:41:19 +00:00
|
|
|
define([], function () {
|
|
|
|
'use strict'
|
2018-08-16 22:30:59 +00:00
|
|
|
|
|
|
|
const listeners = new WeakMap()
|
|
|
|
const EventEmitter = function (target) {
|
|
|
|
Object.assign(target, {
|
2020-11-01 16:41:19 +00:00
|
|
|
on(type, listener, options = {}) {
|
2018-08-16 22:30:59 +00:00
|
|
|
if (!listeners.has(this)) {
|
|
|
|
listeners.set(this, new Map())
|
|
|
|
}
|
|
|
|
if (!listeners.get(this).has(type)) {
|
|
|
|
listeners.get(this).set(type, new Set())
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!options.once) options.once = false
|
|
|
|
listeners.get(this).get(type).add({ listener, options })
|
|
|
|
},
|
|
|
|
|
|
|
|
off(type, listener) {
|
|
|
|
listeners.get(this).get(type).delete(listener)
|
|
|
|
},
|
|
|
|
|
2020-11-01 16:41:19 +00:00
|
|
|
emit(type, detail = {}) {
|
2018-08-16 22:30:59 +00:00
|
|
|
if (!listeners.has(this)) return
|
|
|
|
if (!listeners.get(this).has(type)) return
|
|
|
|
|
|
|
|
const set = listeners.get(this).get(type)
|
|
|
|
|
2020-11-01 16:41:19 +00:00
|
|
|
set.forEach(
|
|
|
|
function ({ listener, options }) {
|
|
|
|
if (options.once) {
|
|
|
|
set.delete(listener)
|
|
|
|
}
|
2018-08-16 22:30:59 +00:00
|
|
|
|
2020-11-01 16:41:19 +00:00
|
|
|
listener({ target: this, detail })
|
|
|
|
}.bind(this)
|
|
|
|
)
|
|
|
|
},
|
2018-08-16 22:30:59 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return EventEmitter
|
2020-11-01 16:41:19 +00:00
|
|
|
})
|