@dafengzhen/event-bus 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +96 -0
- package/README.zh.md +26 -0
- package/dist/cjs/legacy/index.js +2 -0
- package/dist/cjs/legacy/index.js.map +1 -0
- package/dist/cjs/legacy-dev/index.js +829 -0
- package/dist/cjs/legacy-dev/index.js.map +1 -0
- package/dist/cjs/modern/index.js +2 -0
- package/dist/cjs/modern/index.js.map +1 -0
- package/dist/cjs/modern-dev/index.js +247 -0
- package/dist/cjs/modern-dev/index.js.map +1 -0
- package/dist/esm/legacy/index.js +2 -0
- package/dist/esm/legacy/index.js.map +1 -0
- package/dist/esm/legacy-dev/index.js +241 -0
- package/dist/esm/legacy-dev/index.js.map +1 -0
- package/dist/esm/modern/index.js +2 -0
- package/dist/esm/modern/index.js.map +1 -0
- package/dist/esm/modern-dev/index.js +241 -0
- package/dist/esm/modern-dev/index.js.map +1 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +160 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/index.ts","src/event-bus.ts","src/types.ts","node_modules/@swc/helpers/cjs/_async_to_generator.cjs","node_modules/@swc/helpers/cjs/_class_call_check.cjs","node_modules/@swc/helpers/cjs/_create_class.cjs","node_modules/@swc/helpers/cjs/_object_spread.cjs","node_modules/@swc/helpers/cjs/_define_property.cjs","node_modules/@swc/helpers/cjs/_object_spread_props.cjs","node_modules/@swc/helpers/cjs/_to_consumable_array.cjs","node_modules/@swc/helpers/cjs/_array_without_holes.cjs","node_modules/@swc/helpers/cjs/_array_like_to_array.cjs","node_modules/@swc/helpers/cjs/_iterable_to_array.cjs","node_modules/@swc/helpers/cjs/_non_iterable_spread.cjs","node_modules/@swc/helpers/cjs/_unsupported_iterable_to_array.cjs","node_modules/@swc/helpers/cjs/_ts_generator.cjs"],"sourcesContent":["import { EventBus } from './event-bus.ts';\nimport * as Types from './types.ts';\n\nexport { EventBus, Types };\n","import type {\n AnyListener,\n CompiledPatternListener,\n EmitContext,\n EventMap,\n Listener,\n MatchKeys,\n Middleware,\n Pattern,\n PatternKind,\n PatternListenerInfo,\n PatternMiddleware,\n PatternOptions,\n} from './types.ts';\n\n/**\n * EventBus.\n *\n * @author dafengzhen\n */\nexport class EventBus<E extends EventMap> {\n private anyListeners = new Set<AnyListener<E>>();\n\n private listenersByEvent = new Map<keyof E, Set<Listener<any>>>();\n\n private middlewares: Middleware<E>[] = [];\n\n private patternMiddlewares: PatternMiddleware<E>[] = [];\n\n private patternListeners: CompiledPatternListener<E>[] = [];\n\n clear(event?: keyof E): void {\n if (event === undefined) {\n this.listenersByEvent.clear();\n this.anyListeners.clear();\n this.patternListeners.length = 0;\n this.middlewares.length = 0;\n this.patternMiddlewares.length = 0;\n return;\n }\n\n this.listenersByEvent.delete(event);\n }\n\n on<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n this.getListenerSet(event).add(listener);\n return () => this.off(event, listener);\n }\n\n off<K extends keyof E>(event: K, listener: Listener<E[K]>): void {\n const set = this.listenersByEvent.get(event);\n if (!set) {\n return;\n }\n\n set.delete(listener);\n if (set.size === 0) {\n this.listenersByEvent.delete(event);\n }\n }\n\n once<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n const off = this.on(event, ((payload: E[K]) => {\n off();\n listener(payload);\n }) as Listener<E[K]>);\n\n return off;\n }\n\n onAny(listener: AnyListener<E>): () => void {\n this.anyListeners.add(listener);\n return () => this.anyListeners.delete(listener);\n }\n\n use(mw: Middleware<E>): () => void {\n this.middlewares.push(mw);\n return () => this.removeFromArray(this.middlewares, mw);\n }\n\n usePattern(mw: PatternMiddleware<E>): () => void {\n this.patternMiddlewares.push(mw);\n return () => this.removeFromArray(this.patternMiddlewares, mw);\n }\n\n onPattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: PatternOptions,\n ): () => void {\n const compiled = this.compilePatternMatcher(pattern);\n\n const entry: CompiledPatternListener<E> = {\n pattern,\n kind: compiled.kind,\n match: compiled.match,\n priority: options?.priority ?? compiled.priority,\n once: options?.once,\n handler: handler as any,\n };\n\n this.insertPatternByPriority(entry);\n\n return () => this.removeFromArray(this.patternListeners, entry);\n }\n\n oncePattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: Omit<PatternOptions, 'once'>,\n ): () => void {\n return this.onPattern(pattern, handler, { ...options, once: true });\n }\n\n listenerCount(event: keyof E): number {\n let count = 0;\n count += this.listenersByEvent.get(event)?.size ?? 0;\n count += this.anyListeners.size;\n\n if (typeof event === 'string') {\n for (const p of this.patternListeners) {\n if (p.match(event)) {\n count++;\n }\n }\n }\n\n return count;\n }\n\n emit<K extends keyof E>(event: K, ...args: E[K] extends void ? [] : [payload: E[K]]): void {\n void this._emit(event, ...args).catch((err) => {\n queueMicrotask(() => {\n throw err;\n });\n });\n }\n\n emitAsync<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n return this._emit(event, ...args);\n }\n\n private async _emit<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n const payload = args[0] as E[K];\n\n let blocked = false;\n\n const ctx: EmitContext<E, K> = {\n get blocked() {\n return blocked;\n },\n event,\n payload,\n matched: [],\n meta: {},\n block() {\n blocked = true;\n },\n };\n\n await this.runMiddlewares(ctx);\n }\n\n private async runMiddlewares<K extends keyof E>(ctx: EmitContext<E, K>): Promise<void> {\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (ctx.blocked) {\n return;\n }\n\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n\n index = n;\n\n const mw = this.middlewares[n];\n if (!mw) {\n this.invokeExactAndAnyListeners(ctx.event, ctx.payload);\n await this.invokePatternPipeline(ctx);\n return;\n }\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private invokeExactAndAnyListeners<K extends keyof E>(event: K, payload: E[K]): void {\n const set = this.listenersByEvent.get(event);\n if (set) {\n for (const fn of set) {\n this.safeCall(() => fn(payload));\n }\n }\n\n for (const fn of this.anyListeners) {\n this.safeCall(() => fn(event, payload));\n }\n }\n\n private async invokePatternPipeline(ctx: EmitContext<E, keyof E>): Promise<void> {\n const matched: Array<{ entry: CompiledPatternListener<E>; params: Record<string, string> }> =\n [];\n\n if (typeof ctx.event === 'string') {\n for (const entry of this.patternListeners) {\n const params = entry.match(ctx.event);\n if (params) {\n matched.push({ entry, params });\n }\n }\n }\n\n (ctx as any).matched = matched.map(\n (m): PatternListenerInfo<E> => ({\n handler: m.entry.handler,\n kind: m.entry.kind,\n once: m.entry.once,\n priority: m.entry.priority,\n prefix: m.entry.prefix,\n }),\n );\n\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n index = n;\n\n const mw = this.patternMiddlewares[n];\n if (!mw) {\n for (const { entry, params } of matched) {\n this.safeCall(() => entry.handler(ctx.event, ctx.payload, params));\n if (entry.once) {\n this.removeFromArray(this.patternListeners, entry);\n }\n }\n return;\n }\n\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private getListenerSet<K extends keyof E>(event: K): Set<Listener<E[K]>> {\n let set = this.listenersByEvent.get(event) as Set<Listener<E[K]>> | undefined;\n if (!set) {\n set = new Set();\n this.listenersByEvent.set(event, set);\n }\n return set;\n }\n\n private insertPatternByPriority(entry: CompiledPatternListener<E>): void {\n let lo = 0;\n let hi = this.patternListeners.length;\n\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.patternListeners[mid].priority >= entry.priority) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n this.patternListeners.splice(lo, 0, entry);\n }\n\n private removeFromArray<T>(arr: T[], item: T): void {\n const i = arr.indexOf(item);\n if (i >= 0) {\n arr.splice(i, 1);\n }\n }\n\n private safeCall(fn: () => void): void {\n try {\n fn();\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n }\n\n private escapeRegexLiteral(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n private compilePatternMatcher(p: string): {\n kind: PatternKind;\n priority: number;\n match: (event: string) => null | Record<string, string>;\n } {\n if (p === '*') {\n return { kind: 'star', priority: 0, match: () => ({}) };\n }\n\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (!prefix) {\n throw new Error(`Invalid pattern: ${p}.`);\n }\n\n const prefixWithColon = prefix + ':';\n\n return {\n kind: 'prefix',\n priority: 10,\n match: (event: string) =>\n event === prefix || event.startsWith(prefixWithColon) ? {} : null,\n };\n }\n\n if (p.includes('{')) {\n const keys: string[] = [];\n const parts = p.split(/\\{(\\w+)}/g);\n\n let src = '^';\n for (let i = 0; i < parts.length; i++) {\n if (i % 2 === 0) {\n src += this.escapeRegexLiteral(parts[i]);\n } else {\n keys.push(parts[i]);\n src += '([^:]+)';\n }\n }\n src += '$';\n\n const regex = new RegExp(src);\n\n return {\n kind: 'param',\n priority: 100 + keys.length,\n match: (event: string) => {\n const m = event.match(regex);\n if (!m) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < keys.length; i++) {\n params[keys[i]] = m[i + 1];\n }\n return params;\n },\n };\n }\n\n throw new Error(`Unsupported pattern: ${p}.`);\n }\n}\n","export type EventMap = Record<string, unknown>;\n\nexport type Listener<Payload> = Payload extends void ? () => void : (payload: Payload) => void;\n\nexport type AnyListener<E extends EventMap> = <K extends keyof E>(event: K, payload: E[K]) => void;\n\nexport type PatternKind = 'star' | 'prefix' | 'param';\n\nexport type Pattern<_K extends string> = '*' | `${string}:*` | `${string}{${string}}${string}`;\n\ntype PatternToKeyShape<P extends string> = P extends '*'\n ? string\n : P extends `${infer Prefix}:*`\n ? `${Prefix}:${string}` | Prefix\n : P extends `${infer A}{${string}}${infer B}`\n ? `${A}${string}${B}`\n : never;\n\nexport type MatchKeys<Keys extends string, P extends Pattern<Keys>> = Extract<\n Keys,\n PatternToKeyShape<P>\n>;\n\nexport type EmitContext<E extends EventMap, K extends keyof E> = {\n readonly blocked: boolean;\n readonly event: K;\n readonly payload: E[K];\n readonly matched: readonly PatternListenerInfo<E>[];\n readonly meta: Record<string, unknown>;\n block(): void;\n};\n\nexport type Middleware<E extends EventMap> = <K extends keyof E>(\n ctx: EmitContext<E, K>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternMiddleware<E extends EventMap> = (\n ctx: EmitContext<E, keyof E>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternListenerInfo<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly handler: (event: keyof E, payload: E[keyof E]) => void;\n};\n\nexport type CompiledPatternListener<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly prefixWithColon?: string;\n readonly pattern: Pattern<Extract<keyof E, string>> | RegExp | ((event: string) => boolean);\n readonly handler: (event: keyof E, payload: E[keyof E], params?: Record<string, string>) => void;\n match(event: string): null | Record<string, string>;\n};\n\nexport type PatternOptions = { once?: boolean; priority?: number };\n","\"use strict\";\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\nexports._ = _async_to_generator;\n","\"use strict\";\n\nfunction _class_call_check(instance, Constructor) {\n if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexports._ = _class_call_check;\n","\"use strict\";\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n\n if (\"value\" in descriptor) descriptor.writable = true;\n\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n\n return Constructor;\n}\nexports._ = _create_class;\n","\"use strict\";\n\nvar _define_property = require(\"./_define_property.cjs\");\n\nfunction _object_spread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(\n Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n })\n );\n }\n\n ownKeys.forEach(function(key) {\n _define_property._(target, key, source[key]);\n });\n }\n\n return target;\n}\nexports._ = _object_spread;\n","\"use strict\";\n\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });\n } else obj[key] = value;\n\n return obj;\n}\nexports._ = _define_property;\n","\"use strict\";\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n\n return target;\n}\nexports._ = _object_spread_props;\n","\"use strict\";\n\nvar _array_without_holes = require(\"./_array_without_holes.cjs\");\nvar _iterable_to_array = require(\"./_iterable_to_array.cjs\");\nvar _non_iterable_spread = require(\"./_non_iterable_spread.cjs\");\nvar _unsupported_iterable_to_array = require(\"./_unsupported_iterable_to_array.cjs\");\n\nfunction _to_consumable_array(arr) {\n return _array_without_holes._(arr) || _iterable_to_array._(arr) || _unsupported_iterable_to_array._(arr) || _non_iterable_spread._();\n}\nexports._ = _to_consumable_array;\n","\"use strict\";\n\nvar _array_like_to_array = require(\"./_array_like_to_array.cjs\");\n\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array._(arr);\n}\nexports._ = _array_without_holes;\n","\"use strict\";\n\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexports._ = _array_like_to_array;\n","\"use strict\";\n\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) {\n return Array.from(iter);\n }\n}\nexports._ = _iterable_to_array;\n","\"use strict\";\n\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexports._ = _non_iterable_spread;\n","\"use strict\";\n\nvar _array_like_to_array = require(\"./_array_like_to_array.cjs\");\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array._(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array._(o, minLen);\n}\nexports._ = _unsupported_iterable_to_array;\n","\"use strict\";\n\nfunction _ts_generator(thisArg, body) {\n var f, y, t, _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype), d = Object.defineProperty;\n return d(g, \"next\", { value: verb(0) }), d(g, \"throw\", { value: verb(1) }), d(g, \"return\", { value: verb(2) }), typeof Symbol === \"function\" && d(g, Symbol.iterator, { value: function () { return this; } }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexports._ = _ts_generator;\n"],"names":[],"version":3,"file":"index.js.map"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function $parcel$export(e,t,r,i){Object.defineProperty(e,t,{get:r,set:i,enumerable:!0,configurable:!0})}$parcel$export(module.exports,"EventBus",()=>$68ec0e6739cc5df0$export$5087227eb54526),$parcel$export(module.exports,"Types",()=>$fe52285e36dff70f$exports);class $68ec0e6739cc5df0$export$5087227eb54526{clear(e){if(void 0===e){this.listenersByEvent.clear(),this.anyListeners.clear(),this.patternListeners.length=0,this.middlewares.length=0,this.patternMiddlewares.length=0;return}this.listenersByEvent.delete(e)}on(e,t){return this.getListenerSet(e).add(t),()=>this.off(e,t)}off(e,t){let r=this.listenersByEvent.get(e);r&&(r.delete(t),0===r.size&&this.listenersByEvent.delete(e))}once(e,t){let r=this.on(e,e=>{r(),t(e)});return r}onAny(e){return this.anyListeners.add(e),()=>this.anyListeners.delete(e)}use(e){return this.middlewares.push(e),()=>this.removeFromArray(this.middlewares,e)}usePattern(e){return this.patternMiddlewares.push(e),()=>this.removeFromArray(this.patternMiddlewares,e)}onPattern(e,t,r){let i=this.compilePatternMatcher(e),n={pattern:e,kind:i.kind,match:i.match,priority:r?.priority??i.priority,once:r?.once,handler:t};return this.insertPatternByPriority(n),()=>this.removeFromArray(this.patternListeners,n)}oncePattern(e,t,r){return this.onPattern(e,t,{...r,once:!0})}listenerCount(e){let t;if(t=0+(this.listenersByEvent.get(e)?.size??0)+this.anyListeners.size,"string"==typeof e)for(let r of this.patternListeners)r.match(e)&&t++;return t}emit(e,...t){this._emit(e,...t).catch(e=>{queueMicrotask(()=>{throw e})})}emitAsync(e,...t){return this._emit(e,...t)}async _emit(e,...t){let r=t[0],i=!1;await this.runMiddlewares({get blocked(){return i},event:e,payload:r,matched:[],meta:{},block(){i=!0}})}async runMiddlewares(e){let t=-1,r=async i=>{if(e.blocked)return;if(i<=t)throw Error("next() called multiple times.");t=i;let n=this.middlewares[i];if(!n){this.invokeExactAndAnyListeners(e.event,e.payload),await this.invokePatternPipeline(e);return}await n(e,()=>r(i+1))};await r(0)}invokeExactAndAnyListeners(e,t){let r=this.listenersByEvent.get(e);if(r)for(let e of r)this.safeCall(()=>e(t));for(let r of this.anyListeners)this.safeCall(()=>r(e,t))}async invokePatternPipeline(e){let t=[];if("string"==typeof e.event)for(let r of this.patternListeners){let i=r.match(e.event);i&&t.push({entry:r,params:i})}e.matched=t.map(e=>({handler:e.entry.handler,kind:e.entry.kind,once:e.entry.once,priority:e.entry.priority,prefix:e.entry.prefix}));let r=-1,i=async n=>{if(n<=r)throw Error("next() called multiple times.");r=n;let s=this.patternMiddlewares[n];if(!s){for(let{entry:r,params:i}of t)this.safeCall(()=>r.handler(e.event,e.payload,i)),r.once&&this.removeFromArray(this.patternListeners,r);return}await s(e,()=>i(n+1))};await i(0)}getListenerSet(e){let t=this.listenersByEvent.get(e);return t||(t=new Set,this.listenersByEvent.set(e,t)),t}insertPatternByPriority(e){let t=0,r=this.patternListeners.length;for(;t<r;){let i=t+r>>>1;this.patternListeners[i].priority>=e.priority?t=i+1:r=i}this.patternListeners.splice(t,0,e)}removeFromArray(e,t){let r=e.indexOf(t);r>=0&&e.splice(r,1)}safeCall(e){try{e()}catch(e){queueMicrotask(()=>{throw e})}}escapeRegexLiteral(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}compilePatternMatcher(e){if("*"===e)return{kind:"star",priority:0,match:()=>({})};if(e.endsWith(":*")){let t=e.slice(0,-2);if(!t)throw Error(`Invalid pattern: ${e}.`);let r=t+":";return{kind:"prefix",priority:10,match:e=>e===t||e.startsWith(r)?{}:null}}if(e.includes("{")){let t=[],r=e.split(/\{(\w+)}/g),i="^";for(let e=0;e<r.length;e++)e%2==0?i+=this.escapeRegexLiteral(r[e]):(t.push(r[e]),i+="([^:]+)");let n=new RegExp(i+="$");return{kind:"param",priority:100+t.length,match:e=>{let r=e.match(n);if(!r)return null;let i={};for(let e=0;e<t.length;e++)i[t[e]]=r[e+1];return i}}}throw Error(`Unsupported pattern: ${e}.`)}constructor(){this.anyListeners=new Set,this.listenersByEvent=new Map,this.middlewares=[],this.patternMiddlewares=[],this.patternListeners=[]}}var $fe52285e36dff70f$exports={};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["<anon>","src/index.ts","src/event-bus.ts","src/types.ts"],"sourcesContent":["\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\n$parcel$export(module.exports, \"EventBus\", () => $68ec0e6739cc5df0$export$5087227eb54526);\n$parcel$export(module.exports, \"Types\", () => $fe52285e36dff70f$exports);\nclass $68ec0e6739cc5df0$export$5087227eb54526 {\n clear(event) {\n if (event === undefined) {\n this.listenersByEvent.clear();\n this.anyListeners.clear();\n this.patternListeners.length = 0;\n this.middlewares.length = 0;\n this.patternMiddlewares.length = 0;\n return;\n }\n this.listenersByEvent.delete(event);\n }\n on(event, listener) {\n this.getListenerSet(event).add(listener);\n return ()=>this.off(event, listener);\n }\n off(event, listener) {\n const set = this.listenersByEvent.get(event);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) this.listenersByEvent.delete(event);\n }\n once(event, listener) {\n const off = this.on(event, (payload)=>{\n off();\n listener(payload);\n });\n return off;\n }\n onAny(listener) {\n this.anyListeners.add(listener);\n return ()=>this.anyListeners.delete(listener);\n }\n use(mw) {\n this.middlewares.push(mw);\n return ()=>this.removeFromArray(this.middlewares, mw);\n }\n usePattern(mw) {\n this.patternMiddlewares.push(mw);\n return ()=>this.removeFromArray(this.patternMiddlewares, mw);\n }\n onPattern(pattern, handler, options) {\n const compiled = this.compilePatternMatcher(pattern);\n const entry = {\n pattern: pattern,\n kind: compiled.kind,\n match: compiled.match,\n priority: options?.priority ?? compiled.priority,\n once: options?.once,\n handler: handler\n };\n this.insertPatternByPriority(entry);\n return ()=>this.removeFromArray(this.patternListeners, entry);\n }\n oncePattern(pattern, handler, options) {\n return this.onPattern(pattern, handler, {\n ...options,\n once: true\n });\n }\n listenerCount(event) {\n let count = 0;\n count += this.listenersByEvent.get(event)?.size ?? 0;\n count += this.anyListeners.size;\n if (typeof event === 'string') {\n for (const p of this.patternListeners)if (p.match(event)) count++;\n }\n return count;\n }\n emit(event, ...args) {\n this._emit(event, ...args).catch((err)=>{\n queueMicrotask(()=>{\n throw err;\n });\n });\n }\n emitAsync(event, ...args) {\n return this._emit(event, ...args);\n }\n async _emit(event, ...args) {\n const payload = args[0];\n let blocked = false;\n const ctx = {\n get blocked () {\n return blocked;\n },\n event: event,\n payload: payload,\n matched: [],\n meta: {},\n block () {\n blocked = true;\n }\n };\n await this.runMiddlewares(ctx);\n }\n async runMiddlewares(ctx) {\n let index = -1;\n const dispatch = async (n)=>{\n if (ctx.blocked) return;\n if (n <= index) throw new Error('next() called multiple times.');\n index = n;\n const mw = this.middlewares[n];\n if (!mw) {\n this.invokeExactAndAnyListeners(ctx.event, ctx.payload);\n await this.invokePatternPipeline(ctx);\n return;\n }\n await mw(ctx, ()=>dispatch(n + 1));\n };\n await dispatch(0);\n }\n invokeExactAndAnyListeners(event, payload) {\n const set = this.listenersByEvent.get(event);\n if (set) for (const fn of set)this.safeCall(()=>fn(payload));\n for (const fn of this.anyListeners)this.safeCall(()=>fn(event, payload));\n }\n async invokePatternPipeline(ctx) {\n const matched = [];\n if (typeof ctx.event === 'string') for (const entry of this.patternListeners){\n const params = entry.match(ctx.event);\n if (params) matched.push({\n entry: entry,\n params: params\n });\n }\n ctx.matched = matched.map((m)=>({\n handler: m.entry.handler,\n kind: m.entry.kind,\n once: m.entry.once,\n priority: m.entry.priority,\n prefix: m.entry.prefix\n }));\n let index = -1;\n const dispatch = async (n)=>{\n if (n <= index) throw new Error('next() called multiple times.');\n index = n;\n const mw = this.patternMiddlewares[n];\n if (!mw) {\n for (const { entry: entry, params: params } of matched){\n this.safeCall(()=>entry.handler(ctx.event, ctx.payload, params));\n if (entry.once) this.removeFromArray(this.patternListeners, entry);\n }\n return;\n }\n await mw(ctx, ()=>dispatch(n + 1));\n };\n await dispatch(0);\n }\n getListenerSet(event) {\n let set = this.listenersByEvent.get(event);\n if (!set) {\n set = new Set();\n this.listenersByEvent.set(event, set);\n }\n return set;\n }\n insertPatternByPriority(entry) {\n let lo = 0;\n let hi = this.patternListeners.length;\n while(lo < hi){\n const mid = lo + hi >>> 1;\n if (this.patternListeners[mid].priority >= entry.priority) lo = mid + 1;\n else hi = mid;\n }\n this.patternListeners.splice(lo, 0, entry);\n }\n removeFromArray(arr, item) {\n const i = arr.indexOf(item);\n if (i >= 0) arr.splice(i, 1);\n }\n safeCall(fn) {\n try {\n fn();\n } catch (err) {\n queueMicrotask(()=>{\n throw err;\n });\n }\n }\n escapeRegexLiteral(s) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n compilePatternMatcher(p) {\n if (p === '*') return {\n kind: 'star',\n priority: 0,\n match: ()=>({})\n };\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (!prefix) throw new Error(`Invalid pattern: ${p}.`);\n const prefixWithColon = prefix + ':';\n return {\n kind: 'prefix',\n priority: 10,\n match: (event)=>event === prefix || event.startsWith(prefixWithColon) ? {} : null\n };\n }\n if (p.includes('{')) {\n const keys = [];\n const parts = p.split(/\\{(\\w+)}/g);\n let src = '^';\n for(let i = 0; i < parts.length; i++)if (i % 2 === 0) src += this.escapeRegexLiteral(parts[i]);\n else {\n keys.push(parts[i]);\n src += '([^:]+)';\n }\n src += '$';\n const regex = new RegExp(src);\n return {\n kind: 'param',\n priority: 100 + keys.length,\n match: (event)=>{\n const m = event.match(regex);\n if (!m) return null;\n const params = {};\n for(let i = 0; i < keys.length; i++)params[keys[i]] = m[i + 1];\n return params;\n }\n };\n }\n throw new Error(`Unsupported pattern: ${p}.`);\n }\n constructor(){\n this.anyListeners = new Set();\n this.listenersByEvent = new Map();\n this.middlewares = [];\n this.patternMiddlewares = [];\n this.patternListeners = [];\n }\n}\n\n\nvar $fe52285e36dff70f$exports = {};\n\n\n\n\n//# sourceMappingURL=index.js.map\n","import { EventBus } from './event-bus.ts';\nimport * as Types from './types.ts';\n\nexport { EventBus, Types };\n","import type {\n AnyListener,\n CompiledPatternListener,\n EmitContext,\n EventMap,\n Listener,\n MatchKeys,\n Middleware,\n Pattern,\n PatternKind,\n PatternListenerInfo,\n PatternMiddleware,\n PatternOptions,\n} from './types.ts';\n\n/**\n * EventBus.\n *\n * @author dafengzhen\n */\nexport class EventBus<E extends EventMap> {\n private anyListeners = new Set<AnyListener<E>>();\n\n private listenersByEvent = new Map<keyof E, Set<Listener<any>>>();\n\n private middlewares: Middleware<E>[] = [];\n\n private patternMiddlewares: PatternMiddleware<E>[] = [];\n\n private patternListeners: CompiledPatternListener<E>[] = [];\n\n clear(event?: keyof E): void {\n if (event === undefined) {\n this.listenersByEvent.clear();\n this.anyListeners.clear();\n this.patternListeners.length = 0;\n this.middlewares.length = 0;\n this.patternMiddlewares.length = 0;\n return;\n }\n\n this.listenersByEvent.delete(event);\n }\n\n on<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n this.getListenerSet(event).add(listener);\n return () => this.off(event, listener);\n }\n\n off<K extends keyof E>(event: K, listener: Listener<E[K]>): void {\n const set = this.listenersByEvent.get(event);\n if (!set) {\n return;\n }\n\n set.delete(listener);\n if (set.size === 0) {\n this.listenersByEvent.delete(event);\n }\n }\n\n once<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n const off = this.on(event, ((payload: E[K]) => {\n off();\n listener(payload);\n }) as Listener<E[K]>);\n\n return off;\n }\n\n onAny(listener: AnyListener<E>): () => void {\n this.anyListeners.add(listener);\n return () => this.anyListeners.delete(listener);\n }\n\n use(mw: Middleware<E>): () => void {\n this.middlewares.push(mw);\n return () => this.removeFromArray(this.middlewares, mw);\n }\n\n usePattern(mw: PatternMiddleware<E>): () => void {\n this.patternMiddlewares.push(mw);\n return () => this.removeFromArray(this.patternMiddlewares, mw);\n }\n\n onPattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: PatternOptions,\n ): () => void {\n const compiled = this.compilePatternMatcher(pattern);\n\n const entry: CompiledPatternListener<E> = {\n pattern,\n kind: compiled.kind,\n match: compiled.match,\n priority: options?.priority ?? compiled.priority,\n once: options?.once,\n handler: handler as any,\n };\n\n this.insertPatternByPriority(entry);\n\n return () => this.removeFromArray(this.patternListeners, entry);\n }\n\n oncePattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: Omit<PatternOptions, 'once'>,\n ): () => void {\n return this.onPattern(pattern, handler, { ...options, once: true });\n }\n\n listenerCount(event: keyof E): number {\n let count = 0;\n count += this.listenersByEvent.get(event)?.size ?? 0;\n count += this.anyListeners.size;\n\n if (typeof event === 'string') {\n for (const p of this.patternListeners) {\n if (p.match(event)) {\n count++;\n }\n }\n }\n\n return count;\n }\n\n emit<K extends keyof E>(event: K, ...args: E[K] extends void ? [] : [payload: E[K]]): void {\n void this._emit(event, ...args).catch((err) => {\n queueMicrotask(() => {\n throw err;\n });\n });\n }\n\n emitAsync<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n return this._emit(event, ...args);\n }\n\n private async _emit<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n const payload = args[0] as E[K];\n\n let blocked = false;\n\n const ctx: EmitContext<E, K> = {\n get blocked() {\n return blocked;\n },\n event,\n payload,\n matched: [],\n meta: {},\n block() {\n blocked = true;\n },\n };\n\n await this.runMiddlewares(ctx);\n }\n\n private async runMiddlewares<K extends keyof E>(ctx: EmitContext<E, K>): Promise<void> {\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (ctx.blocked) {\n return;\n }\n\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n\n index = n;\n\n const mw = this.middlewares[n];\n if (!mw) {\n this.invokeExactAndAnyListeners(ctx.event, ctx.payload);\n await this.invokePatternPipeline(ctx);\n return;\n }\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private invokeExactAndAnyListeners<K extends keyof E>(event: K, payload: E[K]): void {\n const set = this.listenersByEvent.get(event);\n if (set) {\n for (const fn of set) {\n this.safeCall(() => fn(payload));\n }\n }\n\n for (const fn of this.anyListeners) {\n this.safeCall(() => fn(event, payload));\n }\n }\n\n private async invokePatternPipeline(ctx: EmitContext<E, keyof E>): Promise<void> {\n const matched: Array<{ entry: CompiledPatternListener<E>; params: Record<string, string> }> =\n [];\n\n if (typeof ctx.event === 'string') {\n for (const entry of this.patternListeners) {\n const params = entry.match(ctx.event);\n if (params) {\n matched.push({ entry, params });\n }\n }\n }\n\n (ctx as any).matched = matched.map(\n (m): PatternListenerInfo<E> => ({\n handler: m.entry.handler,\n kind: m.entry.kind,\n once: m.entry.once,\n priority: m.entry.priority,\n prefix: m.entry.prefix,\n }),\n );\n\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n index = n;\n\n const mw = this.patternMiddlewares[n];\n if (!mw) {\n for (const { entry, params } of matched) {\n this.safeCall(() => entry.handler(ctx.event, ctx.payload, params));\n if (entry.once) {\n this.removeFromArray(this.patternListeners, entry);\n }\n }\n return;\n }\n\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private getListenerSet<K extends keyof E>(event: K): Set<Listener<E[K]>> {\n let set = this.listenersByEvent.get(event) as Set<Listener<E[K]>> | undefined;\n if (!set) {\n set = new Set();\n this.listenersByEvent.set(event, set);\n }\n return set;\n }\n\n private insertPatternByPriority(entry: CompiledPatternListener<E>): void {\n let lo = 0;\n let hi = this.patternListeners.length;\n\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.patternListeners[mid].priority >= entry.priority) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n this.patternListeners.splice(lo, 0, entry);\n }\n\n private removeFromArray<T>(arr: T[], item: T): void {\n const i = arr.indexOf(item);\n if (i >= 0) {\n arr.splice(i, 1);\n }\n }\n\n private safeCall(fn: () => void): void {\n try {\n fn();\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n }\n\n private escapeRegexLiteral(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n private compilePatternMatcher(p: string): {\n kind: PatternKind;\n priority: number;\n match: (event: string) => null | Record<string, string>;\n } {\n if (p === '*') {\n return { kind: 'star', priority: 0, match: () => ({}) };\n }\n\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (!prefix) {\n throw new Error(`Invalid pattern: ${p}.`);\n }\n\n const prefixWithColon = prefix + ':';\n\n return {\n kind: 'prefix',\n priority: 10,\n match: (event: string) =>\n event === prefix || event.startsWith(prefixWithColon) ? {} : null,\n };\n }\n\n if (p.includes('{')) {\n const keys: string[] = [];\n const parts = p.split(/\\{(\\w+)}/g);\n\n let src = '^';\n for (let i = 0; i < parts.length; i++) {\n if (i % 2 === 0) {\n src += this.escapeRegexLiteral(parts[i]);\n } else {\n keys.push(parts[i]);\n src += '([^:]+)';\n }\n }\n src += '$';\n\n const regex = new RegExp(src);\n\n return {\n kind: 'param',\n priority: 100 + keys.length,\n match: (event: string) => {\n const m = event.match(regex);\n if (!m) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < keys.length; i++) {\n params[keys[i]] = m[i + 1];\n }\n return params;\n },\n };\n }\n\n throw new Error(`Unsupported pattern: ${p}.`);\n }\n}\n","export type EventMap = Record<string, unknown>;\n\nexport type Listener<Payload> = Payload extends void ? () => void : (payload: Payload) => void;\n\nexport type AnyListener<E extends EventMap> = <K extends keyof E>(event: K, payload: E[K]) => void;\n\nexport type PatternKind = 'star' | 'prefix' | 'param';\n\nexport type Pattern<_K extends string> = '*' | `${string}:*` | `${string}{${string}}${string}`;\n\ntype PatternToKeyShape<P extends string> = P extends '*'\n ? string\n : P extends `${infer Prefix}:*`\n ? `${Prefix}:${string}` | Prefix\n : P extends `${infer A}{${string}}${infer B}`\n ? `${A}${string}${B}`\n : never;\n\nexport type MatchKeys<Keys extends string, P extends Pattern<Keys>> = Extract<\n Keys,\n PatternToKeyShape<P>\n>;\n\nexport type EmitContext<E extends EventMap, K extends keyof E> = {\n readonly blocked: boolean;\n readonly event: K;\n readonly payload: E[K];\n readonly matched: readonly PatternListenerInfo<E>[];\n readonly meta: Record<string, unknown>;\n block(): void;\n};\n\nexport type Middleware<E extends EventMap> = <K extends keyof E>(\n ctx: EmitContext<E, K>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternMiddleware<E extends EventMap> = (\n ctx: EmitContext<E, keyof E>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternListenerInfo<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly handler: (event: keyof E, payload: E[keyof E]) => void;\n};\n\nexport type CompiledPatternListener<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly prefixWithColon?: string;\n readonly pattern: Pattern<Extract<keyof E, string>> | RegExp | ((event: string) => boolean);\n readonly handler: (event: keyof E, payload: E[keyof E], params?: Record<string, string>) => void;\n match(event: string): null | Record<string, string>;\n};\n\nexport type PatternOptions = { once?: boolean; priority?: number };\n"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","module","exports","$68ec0e6739cc5df0$export$5087227eb54526","$fe52285e36dff70f$exports","clear","event","undefined","listenersByEvent","anyListeners","patternListeners","length","middlewares","patternMiddlewares","delete","on","listener","getListenerSet","add","off","size","once","payload","onAny","use","mw","push","removeFromArray","usePattern","onPattern","pattern","handler","options","compiled","compilePatternMatcher","entry","kind","match","priority","insertPatternByPriority","oncePattern","listenerCount","count","p","emit","args","_emit","catch","err","queueMicrotask","emitAsync","blocked","runMiddlewares","matched","meta","block","ctx","index","dispatch","Error","invokeExactAndAnyListeners","invokePatternPipeline","fn","safeCall","params","map","m","prefix","Set","lo","hi","mid","splice","arr","item","i","indexOf","escapeRegexLiteral","replace","endsWith","slice","prefixWithColon","startsWith","includes","keys","parts","split","src","regex","RegExp","Map"],"version":3,"file":"index.js.map"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
|
|
2
|
+
function $parcel$export(e, n, v, s) {
|
|
3
|
+
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
$parcel$export(module.exports, "EventBus", () => $821b549449277cfa$export$5087227eb54526);
|
|
7
|
+
$parcel$export(module.exports, "Types", () => $40f8dc2575b83437$exports);
|
|
8
|
+
class $821b549449277cfa$export$5087227eb54526 {
|
|
9
|
+
clear(event) {
|
|
10
|
+
if (event === undefined) {
|
|
11
|
+
this.listenersByEvent.clear();
|
|
12
|
+
this.anyListeners.clear();
|
|
13
|
+
this.patternListeners.length = 0;
|
|
14
|
+
this.middlewares.length = 0;
|
|
15
|
+
this.patternMiddlewares.length = 0;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
this.listenersByEvent.delete(event);
|
|
19
|
+
}
|
|
20
|
+
on(event, listener) {
|
|
21
|
+
this.getListenerSet(event).add(listener);
|
|
22
|
+
return ()=>this.off(event, listener);
|
|
23
|
+
}
|
|
24
|
+
off(event, listener) {
|
|
25
|
+
const set = this.listenersByEvent.get(event);
|
|
26
|
+
if (!set) return;
|
|
27
|
+
set.delete(listener);
|
|
28
|
+
if (set.size === 0) this.listenersByEvent.delete(event);
|
|
29
|
+
}
|
|
30
|
+
once(event, listener) {
|
|
31
|
+
const off = this.on(event, (payload)=>{
|
|
32
|
+
off();
|
|
33
|
+
listener(payload);
|
|
34
|
+
});
|
|
35
|
+
return off;
|
|
36
|
+
}
|
|
37
|
+
onAny(listener) {
|
|
38
|
+
this.anyListeners.add(listener);
|
|
39
|
+
return ()=>this.anyListeners.delete(listener);
|
|
40
|
+
}
|
|
41
|
+
use(mw) {
|
|
42
|
+
this.middlewares.push(mw);
|
|
43
|
+
return ()=>this.removeFromArray(this.middlewares, mw);
|
|
44
|
+
}
|
|
45
|
+
usePattern(mw) {
|
|
46
|
+
this.patternMiddlewares.push(mw);
|
|
47
|
+
return ()=>this.removeFromArray(this.patternMiddlewares, mw);
|
|
48
|
+
}
|
|
49
|
+
onPattern(pattern, handler, options) {
|
|
50
|
+
const compiled = this.compilePatternMatcher(pattern);
|
|
51
|
+
const entry = {
|
|
52
|
+
pattern: pattern,
|
|
53
|
+
kind: compiled.kind,
|
|
54
|
+
match: compiled.match,
|
|
55
|
+
priority: options?.priority ?? compiled.priority,
|
|
56
|
+
once: options?.once,
|
|
57
|
+
handler: handler
|
|
58
|
+
};
|
|
59
|
+
this.insertPatternByPriority(entry);
|
|
60
|
+
return ()=>this.removeFromArray(this.patternListeners, entry);
|
|
61
|
+
}
|
|
62
|
+
oncePattern(pattern, handler, options) {
|
|
63
|
+
return this.onPattern(pattern, handler, {
|
|
64
|
+
...options,
|
|
65
|
+
once: true
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
listenerCount(event) {
|
|
69
|
+
let count = 0;
|
|
70
|
+
count += this.listenersByEvent.get(event)?.size ?? 0;
|
|
71
|
+
count += this.anyListeners.size;
|
|
72
|
+
if (typeof event === 'string') {
|
|
73
|
+
for (const p of this.patternListeners)if (p.match(event)) count++;
|
|
74
|
+
}
|
|
75
|
+
return count;
|
|
76
|
+
}
|
|
77
|
+
emit(event, ...args) {
|
|
78
|
+
this._emit(event, ...args).catch((err)=>{
|
|
79
|
+
queueMicrotask(()=>{
|
|
80
|
+
throw err;
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
emitAsync(event, ...args) {
|
|
85
|
+
return this._emit(event, ...args);
|
|
86
|
+
}
|
|
87
|
+
async _emit(event, ...args) {
|
|
88
|
+
const payload = args[0];
|
|
89
|
+
let blocked = false;
|
|
90
|
+
const ctx = {
|
|
91
|
+
get blocked () {
|
|
92
|
+
return blocked;
|
|
93
|
+
},
|
|
94
|
+
event: event,
|
|
95
|
+
payload: payload,
|
|
96
|
+
matched: [],
|
|
97
|
+
meta: {},
|
|
98
|
+
block () {
|
|
99
|
+
blocked = true;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
await this.runMiddlewares(ctx);
|
|
103
|
+
}
|
|
104
|
+
async runMiddlewares(ctx) {
|
|
105
|
+
let index = -1;
|
|
106
|
+
const dispatch = async (n)=>{
|
|
107
|
+
if (ctx.blocked) return;
|
|
108
|
+
if (n <= index) throw new Error('next() called multiple times.');
|
|
109
|
+
index = n;
|
|
110
|
+
const mw = this.middlewares[n];
|
|
111
|
+
if (!mw) {
|
|
112
|
+
this.invokeExactAndAnyListeners(ctx.event, ctx.payload);
|
|
113
|
+
await this.invokePatternPipeline(ctx);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
await mw(ctx, ()=>dispatch(n + 1));
|
|
117
|
+
};
|
|
118
|
+
await dispatch(0);
|
|
119
|
+
}
|
|
120
|
+
invokeExactAndAnyListeners(event, payload) {
|
|
121
|
+
const set = this.listenersByEvent.get(event);
|
|
122
|
+
if (set) for (const fn of set)this.safeCall(()=>fn(payload));
|
|
123
|
+
for (const fn of this.anyListeners)this.safeCall(()=>fn(event, payload));
|
|
124
|
+
}
|
|
125
|
+
async invokePatternPipeline(ctx) {
|
|
126
|
+
const matched = [];
|
|
127
|
+
if (typeof ctx.event === 'string') for (const entry of this.patternListeners){
|
|
128
|
+
const params = entry.match(ctx.event);
|
|
129
|
+
if (params) matched.push({
|
|
130
|
+
entry: entry,
|
|
131
|
+
params: params
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
ctx.matched = matched.map((m)=>({
|
|
135
|
+
handler: m.entry.handler,
|
|
136
|
+
kind: m.entry.kind,
|
|
137
|
+
once: m.entry.once,
|
|
138
|
+
priority: m.entry.priority,
|
|
139
|
+
prefix: m.entry.prefix
|
|
140
|
+
}));
|
|
141
|
+
let index = -1;
|
|
142
|
+
const dispatch = async (n)=>{
|
|
143
|
+
if (n <= index) throw new Error('next() called multiple times.');
|
|
144
|
+
index = n;
|
|
145
|
+
const mw = this.patternMiddlewares[n];
|
|
146
|
+
if (!mw) {
|
|
147
|
+
for (const { entry: entry, params: params } of matched){
|
|
148
|
+
this.safeCall(()=>entry.handler(ctx.event, ctx.payload, params));
|
|
149
|
+
if (entry.once) this.removeFromArray(this.patternListeners, entry);
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
await mw(ctx, ()=>dispatch(n + 1));
|
|
154
|
+
};
|
|
155
|
+
await dispatch(0);
|
|
156
|
+
}
|
|
157
|
+
getListenerSet(event) {
|
|
158
|
+
let set = this.listenersByEvent.get(event);
|
|
159
|
+
if (!set) {
|
|
160
|
+
set = new Set();
|
|
161
|
+
this.listenersByEvent.set(event, set);
|
|
162
|
+
}
|
|
163
|
+
return set;
|
|
164
|
+
}
|
|
165
|
+
insertPatternByPriority(entry) {
|
|
166
|
+
let lo = 0;
|
|
167
|
+
let hi = this.patternListeners.length;
|
|
168
|
+
while(lo < hi){
|
|
169
|
+
const mid = lo + hi >>> 1;
|
|
170
|
+
if (this.patternListeners[mid].priority >= entry.priority) lo = mid + 1;
|
|
171
|
+
else hi = mid;
|
|
172
|
+
}
|
|
173
|
+
this.patternListeners.splice(lo, 0, entry);
|
|
174
|
+
}
|
|
175
|
+
removeFromArray(arr, item) {
|
|
176
|
+
const i = arr.indexOf(item);
|
|
177
|
+
if (i >= 0) arr.splice(i, 1);
|
|
178
|
+
}
|
|
179
|
+
safeCall(fn) {
|
|
180
|
+
try {
|
|
181
|
+
fn();
|
|
182
|
+
} catch (err) {
|
|
183
|
+
queueMicrotask(()=>{
|
|
184
|
+
throw err;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
escapeRegexLiteral(s) {
|
|
189
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
190
|
+
}
|
|
191
|
+
compilePatternMatcher(p) {
|
|
192
|
+
if (p === '*') return {
|
|
193
|
+
kind: 'star',
|
|
194
|
+
priority: 0,
|
|
195
|
+
match: ()=>({})
|
|
196
|
+
};
|
|
197
|
+
if (p.endsWith(':*')) {
|
|
198
|
+
const prefix = p.slice(0, -2);
|
|
199
|
+
if (!prefix) throw new Error(`Invalid pattern: ${p}.`);
|
|
200
|
+
const prefixWithColon = prefix + ':';
|
|
201
|
+
return {
|
|
202
|
+
kind: 'prefix',
|
|
203
|
+
priority: 10,
|
|
204
|
+
match: (event)=>event === prefix || event.startsWith(prefixWithColon) ? {} : null
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
if (p.includes('{')) {
|
|
208
|
+
const keys = [];
|
|
209
|
+
const parts = p.split(/\{(\w+)}/g);
|
|
210
|
+
let src = '^';
|
|
211
|
+
for(let i = 0; i < parts.length; i++)if (i % 2 === 0) src += this.escapeRegexLiteral(parts[i]);
|
|
212
|
+
else {
|
|
213
|
+
keys.push(parts[i]);
|
|
214
|
+
src += '([^:]+)';
|
|
215
|
+
}
|
|
216
|
+
src += '$';
|
|
217
|
+
const regex = new RegExp(src);
|
|
218
|
+
return {
|
|
219
|
+
kind: 'param',
|
|
220
|
+
priority: 100 + keys.length,
|
|
221
|
+
match: (event)=>{
|
|
222
|
+
const m = event.match(regex);
|
|
223
|
+
if (!m) return null;
|
|
224
|
+
const params = {};
|
|
225
|
+
for(let i = 0; i < keys.length; i++)params[keys[i]] = m[i + 1];
|
|
226
|
+
return params;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
throw new Error(`Unsupported pattern: ${p}.`);
|
|
231
|
+
}
|
|
232
|
+
constructor(){
|
|
233
|
+
this.anyListeners = new Set();
|
|
234
|
+
this.listenersByEvent = new Map();
|
|
235
|
+
this.middlewares = [];
|
|
236
|
+
this.patternMiddlewares = [];
|
|
237
|
+
this.patternListeners = [];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
var $40f8dc2575b83437$exports = {};
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":";;;;;;;ACoBO,MAAM;IAWX,MAAM,KAAe,EAAQ;QAC3B,IAAI,UAAU,WAAW;YACvB,IAAI,CAAC,gBAAgB,CAAC,KAAK;YAC3B,IAAI,CAAC,YAAY,CAAC,KAAK;YACvB,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG;YAC/B,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG;YAC1B,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG;YACjC;QACF;QAEA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IAC/B;IAEA,GAAsB,KAAQ,EAAE,QAAwB,EAAc;QACpE,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC;QAC/B,OAAO,IAAM,IAAI,CAAC,GAAG,CAAC,OAAO;IAC/B;IAEA,IAAuB,KAAQ,EAAE,QAAwB,EAAQ;QAC/D,MAAM,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QACtC,IAAI,CAAC,KACH;QAGF,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,IAAI,KAAK,GACf,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IAEjC;IAEA,KAAwB,KAAQ,EAAE,QAAwB,EAAc;QACtE,MAAM,MAAM,IAAI,CAAC,EAAE,CAAC,OAAQ,CAAC;YAC3B;YACA,SAAS;QACX;QAEA,OAAO;IACT;IAEA,MAAM,QAAwB,EAAc;QAC1C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QACtB,OAAO,IAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACxC;IAEA,IAAI,EAAiB,EAAc;QACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACtB,OAAO,IAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE;IACtD;IAEA,WAAW,EAAwB,EAAc;QAC/C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC7B,OAAO,IAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,kBAAkB,EAAE;IAC7D;IAEA,UACE,OAAU,EACV,OAIS,EACT,OAAwB,EACZ;QACZ,MAAM,WAAW,IAAI,CAAC,qBAAqB,CAAC;QAE5C,MAAM,QAAoC;qBACxC;YACA,MAAM,SAAS,IAAI;YACnB,OAAO,SAAS,KAAK;YACrB,UAAU,SAAS,YAAY,SAAS,QAAQ;YAChD,MAAM,SAAS;YACf,SAAS;QACX;QAEA,IAAI,CAAC,uBAAuB,CAAC;QAE7B,OAAO,IAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE;IAC3D;IAEA,YACE,OAAU,EACV,OAIS,EACT,OAAsC,EAC1B;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,SAAS;YAAE,GAAG,OAAO;YAAE,MAAM;QAAK;IACnE;IAEA,cAAc,KAAc,EAAU;QACpC,IAAI,QAAQ;QACZ,SAAS,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,QAAQ;QACnD,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI;QAE/B,IAAI,OAAO,UAAU,UAAU;YAC7B,KAAK,MAAM,KAAK,IAAI,CAAC,gBAAgB,CACnC,IAAI,EAAE,KAAK,CAAC,QACV;QAGN;QAEA,OAAO;IACT;IAEA,KAAwB,KAAQ,EAAE,GAAG,IAA8C,EAAQ;QACpF,IAAI,CAAC,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,CAAC;YACrC,eAAe;gBACb,MAAM;YACR;QACF;IACF;IAEA,UACE,KAAQ,EACR,GAAG,IAA8C,EAClC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU;IAC9B;IAEA,MAAc,MACZ,KAAQ,EACR,GAAG,IAA8C,EAClC;QACf,MAAM,UAAU,IAAI,CAAC,EAAE;QAEvB,IAAI,UAAU;QAEd,MAAM,MAAyB;YAC7B,IAAI,WAAU;gBACZ,OAAO;YACT;mBACA;qBACA;YACA,SAAS,EAAE;YACX,MAAM,CAAC;YACP;gBACE,UAAU;YACZ;QACF;QAEA,MAAM,IAAI,CAAC,cAAc,CAAC;IAC5B;IAEA,MAAc,eAAkC,GAAsB,EAAiB;QACrF,IAAI,QAAQ;QAEZ,MAAM,WAAW,OAAO;YACtB,IAAI,IAAI,OAAO,EACb;YAGF,IAAI,KAAK,OACP,MAAM,IAAI,MAAM;YAGlB,QAAQ;YAER,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE;YAC9B,IAAI,CAAC,IAAI;gBACP,IAAI,CAAC,0BAA0B,CAAC,IAAI,KAAK,EAAE,IAAI,OAAO;gBACtD,MAAM,IAAI,CAAC,qBAAqB,CAAC;gBACjC;YACF;YACA,MAAM,GAAG,KAAK,IAAM,SAAS,IAAI;QACnC;QAEA,MAAM,SAAS;IACjB;IAEQ,2BAA8C,KAAQ,EAAE,OAAa,EAAQ;QACnF,MAAM,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QACtC,IAAI,KACF,KAAK,MAAM,MAAM,IACf,IAAI,CAAC,QAAQ,CAAC,IAAM,GAAG;QAI3B,KAAK,MAAM,MAAM,IAAI,CAAC,YAAY,CAChC,IAAI,CAAC,QAAQ,CAAC,IAAM,GAAG,OAAO;IAElC;IAEA,MAAc,sBAAsB,GAA4B,EAAiB;QAC/E,MAAM,UACJ,EAAE;QAEJ,IAAI,OAAO,IAAI,KAAK,KAAK,UACvB,KAAK,MAAM,SAAS,IAAI,CAAC,gBAAgB,CAAE;YACzC,MAAM,SAAS,MAAM,KAAK,CAAC,IAAI,KAAK;YACpC,IAAI,QACF,QAAQ,IAAI,CAAC;uBAAE;wBAAO;YAAO;QAEjC;QAGD,IAAY,OAAO,GAAG,QAAQ,GAAG,CAChC,CAAC,IAA+B,CAAA;gBAC9B,SAAS,EAAE,KAAK,CAAC,OAAO;gBACxB,MAAM,EAAE,KAAK,CAAC,IAAI;gBAClB,MAAM,EAAE,KAAK,CAAC,IAAI;gBAClB,UAAU,EAAE,KAAK,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,KAAK,CAAC,MAAM;YACxB,CAAA;QAGF,IAAI,QAAQ;QAEZ,MAAM,WAAW,OAAO;YACtB,IAAI,KAAK,OACP,MAAM,IAAI,MAAM;YAElB,QAAQ;YAER,MAAM,KAAK,IAAI,CAAC,kBAAkB,CAAC,EAAE;YACrC,IAAI,CAAC,IAAI;gBACP,KAAK,MAAM,SAAE,KAAK,UAAE,MAAM,EAAE,IAAI,QAAS;oBACvC,IAAI,CAAC,QAAQ,CAAC,IAAM,MAAM,OAAO,CAAC,IAAI,KAAK,EAAE,IAAI,OAAO,EAAE;oBAC1D,IAAI,MAAM,IAAI,EACZ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAEhD;gBACA;YACF;YAEA,MAAM,GAAG,KAAK,IAAM,SAAS,IAAI;QACnC;QAEA,MAAM,SAAS;IACjB;IAEQ,eAAkC,KAAQ,EAAuB;QACvE,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,KAAK;YACR,MAAM,IAAI;YACV,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO;QACnC;QACA,OAAO;IACT;IAEQ,wBAAwB,KAAiC,EAAQ;QACvE,IAAI,KAAK;QACT,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,MAAM;QAErC,MAAO,KAAK,GAAI;YACd,MAAM,MAAM,AAAC,KAAK,OAAQ;YAC1B,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,QAAQ,EACvD,KAAK,MAAM;iBAEX,KAAK;QAET;QAEA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,GAAG;IACtC;IAEQ,gBAAmB,GAAQ,EAAE,IAAO,EAAQ;QAClD,MAAM,IAAI,IAAI,OAAO,CAAC;QACtB,IAAI,KAAK,GACP,IAAI,MAAM,CAAC,GAAG;IAElB;IAEQ,SAAS,EAAc,EAAQ;QACrC,IAAI;YACF;QACF,EAAE,OAAO,KAAK;YACZ,eAAe;gBACb,MAAM;YACR;QACF;IACF;IAEQ,mBAAmB,CAAS,EAAU;QAC5C,OAAO,EAAE,OAAO,CAAC,uBAAuB;IAC1C;IAEQ,sBAAsB,CAAS,EAIrC;QACA,IAAI,MAAM,KACR,OAAO;YAAE,MAAM;YAAQ,UAAU;YAAG,OAAO,IAAO,CAAA,CAAC,CAAA;QAAG;QAGxD,IAAI,EAAE,QAAQ,CAAC,OAAO;YACpB,MAAM,SAAS,EAAE,KAAK,CAAC,GAAG;YAC1B,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YAG1C,MAAM,kBAAkB,SAAS;YAEjC,OAAO;gBACL,MAAM;gBACN,UAAU;gBACV,OAAO,CAAC,QACN,UAAU,UAAU,MAAM,UAAU,CAAC,mBAAmB,CAAC,IAAI;YACjE;QACF;QAEA,IAAI,EAAE,QAAQ,CAAC,MAAM;YACnB,MAAM,OAAiB,EAAE;YACzB,MAAM,QAAQ,EAAE,KAAK,CAAC;YAEtB,IAAI,MAAM;YACV,IAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,EAAE,IAChC,IAAI,IAAI,MAAM,GACZ,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE;iBAClC;gBACL,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;gBAClB,OAAO;YACT;YAEF,OAAO;YAEP,MAAM,QAAQ,IAAI,OAAO;YAEzB,OAAO;gBACL,MAAM;gBACN,UAAU,MAAM,KAAK,MAAM;gBAC3B,OAAO,CAAC;oBACN,MAAM,IAAI,MAAM,KAAK,CAAC;oBACtB,IAAI,CAAC,GACH,OAAO;oBAGT,MAAM,SAAiC,CAAC;oBACxC,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;oBAE5B,OAAO;gBACT;YACF;QACF;QAEA,MAAM,IAAI,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC9C;;aA9VQ,eAAe,IAAI;aAEnB,mBAAmB,IAAI;aAEvB,cAA+B,EAAE;aAEjC,qBAA6C,EAAE;aAE/C,mBAAiD,EAAE;;AAuV7D;;;;;","sources":["src/index.ts","src/event-bus.ts","src/types.ts"],"sourcesContent":["import { EventBus } from './event-bus.ts';\nimport * as Types from './types.ts';\n\nexport { EventBus, Types };\n","import type {\n AnyListener,\n CompiledPatternListener,\n EmitContext,\n EventMap,\n Listener,\n MatchKeys,\n Middleware,\n Pattern,\n PatternKind,\n PatternListenerInfo,\n PatternMiddleware,\n PatternOptions,\n} from './types.ts';\n\n/**\n * EventBus.\n *\n * @author dafengzhen\n */\nexport class EventBus<E extends EventMap> {\n private anyListeners = new Set<AnyListener<E>>();\n\n private listenersByEvent = new Map<keyof E, Set<Listener<any>>>();\n\n private middlewares: Middleware<E>[] = [];\n\n private patternMiddlewares: PatternMiddleware<E>[] = [];\n\n private patternListeners: CompiledPatternListener<E>[] = [];\n\n clear(event?: keyof E): void {\n if (event === undefined) {\n this.listenersByEvent.clear();\n this.anyListeners.clear();\n this.patternListeners.length = 0;\n this.middlewares.length = 0;\n this.patternMiddlewares.length = 0;\n return;\n }\n\n this.listenersByEvent.delete(event);\n }\n\n on<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n this.getListenerSet(event).add(listener);\n return () => this.off(event, listener);\n }\n\n off<K extends keyof E>(event: K, listener: Listener<E[K]>): void {\n const set = this.listenersByEvent.get(event);\n if (!set) {\n return;\n }\n\n set.delete(listener);\n if (set.size === 0) {\n this.listenersByEvent.delete(event);\n }\n }\n\n once<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n const off = this.on(event, ((payload: E[K]) => {\n off();\n listener(payload);\n }) as Listener<E[K]>);\n\n return off;\n }\n\n onAny(listener: AnyListener<E>): () => void {\n this.anyListeners.add(listener);\n return () => this.anyListeners.delete(listener);\n }\n\n use(mw: Middleware<E>): () => void {\n this.middlewares.push(mw);\n return () => this.removeFromArray(this.middlewares, mw);\n }\n\n usePattern(mw: PatternMiddleware<E>): () => void {\n this.patternMiddlewares.push(mw);\n return () => this.removeFromArray(this.patternMiddlewares, mw);\n }\n\n onPattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: PatternOptions,\n ): () => void {\n const compiled = this.compilePatternMatcher(pattern);\n\n const entry: CompiledPatternListener<E> = {\n pattern,\n kind: compiled.kind,\n match: compiled.match,\n priority: options?.priority ?? compiled.priority,\n once: options?.once,\n handler: handler as any,\n };\n\n this.insertPatternByPriority(entry);\n\n return () => this.removeFromArray(this.patternListeners, entry);\n }\n\n oncePattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: Omit<PatternOptions, 'once'>,\n ): () => void {\n return this.onPattern(pattern, handler, { ...options, once: true });\n }\n\n listenerCount(event: keyof E): number {\n let count = 0;\n count += this.listenersByEvent.get(event)?.size ?? 0;\n count += this.anyListeners.size;\n\n if (typeof event === 'string') {\n for (const p of this.patternListeners) {\n if (p.match(event)) {\n count++;\n }\n }\n }\n\n return count;\n }\n\n emit<K extends keyof E>(event: K, ...args: E[K] extends void ? [] : [payload: E[K]]): void {\n void this._emit(event, ...args).catch((err) => {\n queueMicrotask(() => {\n throw err;\n });\n });\n }\n\n emitAsync<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n return this._emit(event, ...args);\n }\n\n private async _emit<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n const payload = args[0] as E[K];\n\n let blocked = false;\n\n const ctx: EmitContext<E, K> = {\n get blocked() {\n return blocked;\n },\n event,\n payload,\n matched: [],\n meta: {},\n block() {\n blocked = true;\n },\n };\n\n await this.runMiddlewares(ctx);\n }\n\n private async runMiddlewares<K extends keyof E>(ctx: EmitContext<E, K>): Promise<void> {\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (ctx.blocked) {\n return;\n }\n\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n\n index = n;\n\n const mw = this.middlewares[n];\n if (!mw) {\n this.invokeExactAndAnyListeners(ctx.event, ctx.payload);\n await this.invokePatternPipeline(ctx);\n return;\n }\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private invokeExactAndAnyListeners<K extends keyof E>(event: K, payload: E[K]): void {\n const set = this.listenersByEvent.get(event);\n if (set) {\n for (const fn of set) {\n this.safeCall(() => fn(payload));\n }\n }\n\n for (const fn of this.anyListeners) {\n this.safeCall(() => fn(event, payload));\n }\n }\n\n private async invokePatternPipeline(ctx: EmitContext<E, keyof E>): Promise<void> {\n const matched: Array<{ entry: CompiledPatternListener<E>; params: Record<string, string> }> =\n [];\n\n if (typeof ctx.event === 'string') {\n for (const entry of this.patternListeners) {\n const params = entry.match(ctx.event);\n if (params) {\n matched.push({ entry, params });\n }\n }\n }\n\n (ctx as any).matched = matched.map(\n (m): PatternListenerInfo<E> => ({\n handler: m.entry.handler,\n kind: m.entry.kind,\n once: m.entry.once,\n priority: m.entry.priority,\n prefix: m.entry.prefix,\n }),\n );\n\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n index = n;\n\n const mw = this.patternMiddlewares[n];\n if (!mw) {\n for (const { entry, params } of matched) {\n this.safeCall(() => entry.handler(ctx.event, ctx.payload, params));\n if (entry.once) {\n this.removeFromArray(this.patternListeners, entry);\n }\n }\n return;\n }\n\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private getListenerSet<K extends keyof E>(event: K): Set<Listener<E[K]>> {\n let set = this.listenersByEvent.get(event) as Set<Listener<E[K]>> | undefined;\n if (!set) {\n set = new Set();\n this.listenersByEvent.set(event, set);\n }\n return set;\n }\n\n private insertPatternByPriority(entry: CompiledPatternListener<E>): void {\n let lo = 0;\n let hi = this.patternListeners.length;\n\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.patternListeners[mid].priority >= entry.priority) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n this.patternListeners.splice(lo, 0, entry);\n }\n\n private removeFromArray<T>(arr: T[], item: T): void {\n const i = arr.indexOf(item);\n if (i >= 0) {\n arr.splice(i, 1);\n }\n }\n\n private safeCall(fn: () => void): void {\n try {\n fn();\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n }\n\n private escapeRegexLiteral(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n private compilePatternMatcher(p: string): {\n kind: PatternKind;\n priority: number;\n match: (event: string) => null | Record<string, string>;\n } {\n if (p === '*') {\n return { kind: 'star', priority: 0, match: () => ({}) };\n }\n\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (!prefix) {\n throw new Error(`Invalid pattern: ${p}.`);\n }\n\n const prefixWithColon = prefix + ':';\n\n return {\n kind: 'prefix',\n priority: 10,\n match: (event: string) =>\n event === prefix || event.startsWith(prefixWithColon) ? {} : null,\n };\n }\n\n if (p.includes('{')) {\n const keys: string[] = [];\n const parts = p.split(/\\{(\\w+)}/g);\n\n let src = '^';\n for (let i = 0; i < parts.length; i++) {\n if (i % 2 === 0) {\n src += this.escapeRegexLiteral(parts[i]);\n } else {\n keys.push(parts[i]);\n src += '([^:]+)';\n }\n }\n src += '$';\n\n const regex = new RegExp(src);\n\n return {\n kind: 'param',\n priority: 100 + keys.length,\n match: (event: string) => {\n const m = event.match(regex);\n if (!m) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < keys.length; i++) {\n params[keys[i]] = m[i + 1];\n }\n return params;\n },\n };\n }\n\n throw new Error(`Unsupported pattern: ${p}.`);\n }\n}\n","export type EventMap = Record<string, unknown>;\n\nexport type Listener<Payload> = Payload extends void ? () => void : (payload: Payload) => void;\n\nexport type AnyListener<E extends EventMap> = <K extends keyof E>(event: K, payload: E[K]) => void;\n\nexport type PatternKind = 'star' | 'prefix' | 'param';\n\nexport type Pattern<_K extends string> = '*' | `${string}:*` | `${string}{${string}}${string}`;\n\ntype PatternToKeyShape<P extends string> = P extends '*'\n ? string\n : P extends `${infer Prefix}:*`\n ? `${Prefix}:${string}` | Prefix\n : P extends `${infer A}{${string}}${infer B}`\n ? `${A}${string}${B}`\n : never;\n\nexport type MatchKeys<Keys extends string, P extends Pattern<Keys>> = Extract<\n Keys,\n PatternToKeyShape<P>\n>;\n\nexport type EmitContext<E extends EventMap, K extends keyof E> = {\n readonly blocked: boolean;\n readonly event: K;\n readonly payload: E[K];\n readonly matched: readonly PatternListenerInfo<E>[];\n readonly meta: Record<string, unknown>;\n block(): void;\n};\n\nexport type Middleware<E extends EventMap> = <K extends keyof E>(\n ctx: EmitContext<E, K>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternMiddleware<E extends EventMap> = (\n ctx: EmitContext<E, keyof E>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternListenerInfo<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly handler: (event: keyof E, payload: E[keyof E]) => void;\n};\n\nexport type CompiledPatternListener<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly prefixWithColon?: string;\n readonly pattern: Pattern<Extract<keyof E, string>> | RegExp | ((event: string) => boolean);\n readonly handler: (event: keyof E, payload: E[keyof E], params?: Record<string, string>) => void;\n match(event: string): null | Record<string, string>;\n};\n\nexport type PatternOptions = { once?: boolean; priority?: number };\n"],"names":[],"version":3,"file":"index.js.map"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
class e{clear(e){if(void 0===e){this.listenersByEvent.clear(),this.anyListeners.clear(),this.patternListeners.length=0,this.middlewares.length=0,this.patternMiddlewares.length=0;return}this.listenersByEvent.delete(e)}on(e,t){return this.getListenerSet(e).add(t),()=>this.off(e,t)}off(e,t){let r=this.listenersByEvent.get(e);r&&(r.delete(t),0===r.size&&this.listenersByEvent.delete(e))}once(e,t){let r=this.on(e,e=>{r(),t(e)});return r}onAny(e){return this.anyListeners.add(e),()=>this.anyListeners.delete(e)}use(e){return this.middlewares.push(e),()=>this.removeFromArray(this.middlewares,e)}usePattern(e){return this.patternMiddlewares.push(e),()=>this.removeFromArray(this.patternMiddlewares,e)}onPattern(e,t,r){let i=this.compilePatternMatcher(e),n={pattern:e,kind:i.kind,match:i.match,priority:r?.priority??i.priority,once:r?.once,handler:t};return this.insertPatternByPriority(n),()=>this.removeFromArray(this.patternListeners,n)}oncePattern(e,t,r){return this.onPattern(e,t,{...r,once:!0})}listenerCount(e){let t;if(t=0+(this.listenersByEvent.get(e)?.size??0)+this.anyListeners.size,"string"==typeof e)for(let r of this.patternListeners)r.match(e)&&t++;return t}emit(e,...t){this._emit(e,...t).catch(e=>{queueMicrotask(()=>{throw e})})}emitAsync(e,...t){return this._emit(e,...t)}async _emit(e,...t){let r=t[0],i=!1;await this.runMiddlewares({get blocked(){return i},event:e,payload:r,matched:[],meta:{},block(){i=!0}})}async runMiddlewares(e){let t=-1,r=async i=>{if(e.blocked)return;if(i<=t)throw Error("next() called multiple times.");t=i;let n=this.middlewares[i];if(!n){this.invokeExactAndAnyListeners(e.event,e.payload),await this.invokePatternPipeline(e);return}await n(e,()=>r(i+1))};await r(0)}invokeExactAndAnyListeners(e,t){let r=this.listenersByEvent.get(e);if(r)for(let e of r)this.safeCall(()=>e(t));for(let r of this.anyListeners)this.safeCall(()=>r(e,t))}async invokePatternPipeline(e){let t=[];if("string"==typeof e.event)for(let r of this.patternListeners){let i=r.match(e.event);i&&t.push({entry:r,params:i})}e.matched=t.map(e=>({handler:e.entry.handler,kind:e.entry.kind,once:e.entry.once,priority:e.entry.priority,prefix:e.entry.prefix}));let r=-1,i=async n=>{if(n<=r)throw Error("next() called multiple times.");r=n;let s=this.patternMiddlewares[n];if(!s){for(let{entry:r,params:i}of t)this.safeCall(()=>r.handler(e.event,e.payload,i)),r.once&&this.removeFromArray(this.patternListeners,r);return}await s(e,()=>i(n+1))};await i(0)}getListenerSet(e){let t=this.listenersByEvent.get(e);return t||(t=new Set,this.listenersByEvent.set(e,t)),t}insertPatternByPriority(e){let t=0,r=this.patternListeners.length;for(;t<r;){let i=t+r>>>1;this.patternListeners[i].priority>=e.priority?t=i+1:r=i}this.patternListeners.splice(t,0,e)}removeFromArray(e,t){let r=e.indexOf(t);r>=0&&e.splice(r,1)}safeCall(e){try{e()}catch(e){queueMicrotask(()=>{throw e})}}escapeRegexLiteral(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}compilePatternMatcher(e){if("*"===e)return{kind:"star",priority:0,match:()=>({})};if(e.endsWith(":*")){let t=e.slice(0,-2);if(!t)throw Error(`Invalid pattern: ${e}.`);let r=t+":";return{kind:"prefix",priority:10,match:e=>e===t||e.startsWith(r)?{}:null}}if(e.includes("{")){let t=[],r=e.split(/\{(\w+)}/g),i="^";for(let e=0;e<r.length;e++)e%2==0?i+=this.escapeRegexLiteral(r[e]):(t.push(r[e]),i+="([^:]+)");let n=new RegExp(i+="$");return{kind:"param",priority:100+t.length,match:e=>{let r=e.match(n);if(!r)return null;let i={};for(let e=0;e<t.length;e++)i[t[e]]=r[e+1];return i}}}throw Error(`Unsupported pattern: ${e}.`)}constructor(){this.anyListeners=new Set,this.listenersByEvent=new Map,this.middlewares=[],this.patternMiddlewares=[],this.patternListeners=[]}}export{e as EventBus};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["<anon>","src/index.ts","src/event-bus.ts","src/types.ts"],"sourcesContent":["class $54a742859ac4854f$export$5087227eb54526 {\n clear(event) {\n if (event === undefined) {\n this.listenersByEvent.clear();\n this.anyListeners.clear();\n this.patternListeners.length = 0;\n this.middlewares.length = 0;\n this.patternMiddlewares.length = 0;\n return;\n }\n this.listenersByEvent.delete(event);\n }\n on(event, listener) {\n this.getListenerSet(event).add(listener);\n return ()=>this.off(event, listener);\n }\n off(event, listener) {\n const set = this.listenersByEvent.get(event);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) this.listenersByEvent.delete(event);\n }\n once(event, listener) {\n const off = this.on(event, (payload)=>{\n off();\n listener(payload);\n });\n return off;\n }\n onAny(listener) {\n this.anyListeners.add(listener);\n return ()=>this.anyListeners.delete(listener);\n }\n use(mw) {\n this.middlewares.push(mw);\n return ()=>this.removeFromArray(this.middlewares, mw);\n }\n usePattern(mw) {\n this.patternMiddlewares.push(mw);\n return ()=>this.removeFromArray(this.patternMiddlewares, mw);\n }\n onPattern(pattern, handler, options) {\n const compiled = this.compilePatternMatcher(pattern);\n const entry = {\n pattern: pattern,\n kind: compiled.kind,\n match: compiled.match,\n priority: options?.priority ?? compiled.priority,\n once: options?.once,\n handler: handler\n };\n this.insertPatternByPriority(entry);\n return ()=>this.removeFromArray(this.patternListeners, entry);\n }\n oncePattern(pattern, handler, options) {\n return this.onPattern(pattern, handler, {\n ...options,\n once: true\n });\n }\n listenerCount(event) {\n let count = 0;\n count += this.listenersByEvent.get(event)?.size ?? 0;\n count += this.anyListeners.size;\n if (typeof event === 'string') {\n for (const p of this.patternListeners)if (p.match(event)) count++;\n }\n return count;\n }\n emit(event, ...args) {\n this._emit(event, ...args).catch((err)=>{\n queueMicrotask(()=>{\n throw err;\n });\n });\n }\n emitAsync(event, ...args) {\n return this._emit(event, ...args);\n }\n async _emit(event, ...args) {\n const payload = args[0];\n let blocked = false;\n const ctx = {\n get blocked () {\n return blocked;\n },\n event: event,\n payload: payload,\n matched: [],\n meta: {},\n block () {\n blocked = true;\n }\n };\n await this.runMiddlewares(ctx);\n }\n async runMiddlewares(ctx) {\n let index = -1;\n const dispatch = async (n)=>{\n if (ctx.blocked) return;\n if (n <= index) throw new Error('next() called multiple times.');\n index = n;\n const mw = this.middlewares[n];\n if (!mw) {\n this.invokeExactAndAnyListeners(ctx.event, ctx.payload);\n await this.invokePatternPipeline(ctx);\n return;\n }\n await mw(ctx, ()=>dispatch(n + 1));\n };\n await dispatch(0);\n }\n invokeExactAndAnyListeners(event, payload) {\n const set = this.listenersByEvent.get(event);\n if (set) for (const fn of set)this.safeCall(()=>fn(payload));\n for (const fn of this.anyListeners)this.safeCall(()=>fn(event, payload));\n }\n async invokePatternPipeline(ctx) {\n const matched = [];\n if (typeof ctx.event === 'string') for (const entry of this.patternListeners){\n const params = entry.match(ctx.event);\n if (params) matched.push({\n entry: entry,\n params: params\n });\n }\n ctx.matched = matched.map((m)=>({\n handler: m.entry.handler,\n kind: m.entry.kind,\n once: m.entry.once,\n priority: m.entry.priority,\n prefix: m.entry.prefix\n }));\n let index = -1;\n const dispatch = async (n)=>{\n if (n <= index) throw new Error('next() called multiple times.');\n index = n;\n const mw = this.patternMiddlewares[n];\n if (!mw) {\n for (const { entry: entry, params: params } of matched){\n this.safeCall(()=>entry.handler(ctx.event, ctx.payload, params));\n if (entry.once) this.removeFromArray(this.patternListeners, entry);\n }\n return;\n }\n await mw(ctx, ()=>dispatch(n + 1));\n };\n await dispatch(0);\n }\n getListenerSet(event) {\n let set = this.listenersByEvent.get(event);\n if (!set) {\n set = new Set();\n this.listenersByEvent.set(event, set);\n }\n return set;\n }\n insertPatternByPriority(entry) {\n let lo = 0;\n let hi = this.patternListeners.length;\n while(lo < hi){\n const mid = lo + hi >>> 1;\n if (this.patternListeners[mid].priority >= entry.priority) lo = mid + 1;\n else hi = mid;\n }\n this.patternListeners.splice(lo, 0, entry);\n }\n removeFromArray(arr, item) {\n const i = arr.indexOf(item);\n if (i >= 0) arr.splice(i, 1);\n }\n safeCall(fn) {\n try {\n fn();\n } catch (err) {\n queueMicrotask(()=>{\n throw err;\n });\n }\n }\n escapeRegexLiteral(s) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n compilePatternMatcher(p) {\n if (p === '*') return {\n kind: 'star',\n priority: 0,\n match: ()=>({})\n };\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (!prefix) throw new Error(`Invalid pattern: ${p}.`);\n const prefixWithColon = prefix + ':';\n return {\n kind: 'prefix',\n priority: 10,\n match: (event)=>event === prefix || event.startsWith(prefixWithColon) ? {} : null\n };\n }\n if (p.includes('{')) {\n const keys = [];\n const parts = p.split(/\\{(\\w+)}/g);\n let src = '^';\n for(let i = 0; i < parts.length; i++)if (i % 2 === 0) src += this.escapeRegexLiteral(parts[i]);\n else {\n keys.push(parts[i]);\n src += '([^:]+)';\n }\n src += '$';\n const regex = new RegExp(src);\n return {\n kind: 'param',\n priority: 100 + keys.length,\n match: (event)=>{\n const m = event.match(regex);\n if (!m) return null;\n const params = {};\n for(let i = 0; i < keys.length; i++)params[keys[i]] = m[i + 1];\n return params;\n }\n };\n }\n throw new Error(`Unsupported pattern: ${p}.`);\n }\n constructor(){\n this.anyListeners = new Set();\n this.listenersByEvent = new Map();\n this.middlewares = [];\n this.patternMiddlewares = [];\n this.patternListeners = [];\n }\n}\n\n\nvar $50402f782971a62d$exports = {};\n\n\n\n\nexport {$54a742859ac4854f$export$5087227eb54526 as EventBus};\n//# sourceMappingURL=index.js.map\n","import { EventBus } from './event-bus.ts';\nimport * as Types from './types.ts';\n\nexport { EventBus, Types };\n","import type {\n AnyListener,\n CompiledPatternListener,\n EmitContext,\n EventMap,\n Listener,\n MatchKeys,\n Middleware,\n Pattern,\n PatternKind,\n PatternListenerInfo,\n PatternMiddleware,\n PatternOptions,\n} from './types.ts';\n\n/**\n * EventBus.\n *\n * @author dafengzhen\n */\nexport class EventBus<E extends EventMap> {\n private anyListeners = new Set<AnyListener<E>>();\n\n private listenersByEvent = new Map<keyof E, Set<Listener<any>>>();\n\n private middlewares: Middleware<E>[] = [];\n\n private patternMiddlewares: PatternMiddleware<E>[] = [];\n\n private patternListeners: CompiledPatternListener<E>[] = [];\n\n clear(event?: keyof E): void {\n if (event === undefined) {\n this.listenersByEvent.clear();\n this.anyListeners.clear();\n this.patternListeners.length = 0;\n this.middlewares.length = 0;\n this.patternMiddlewares.length = 0;\n return;\n }\n\n this.listenersByEvent.delete(event);\n }\n\n on<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n this.getListenerSet(event).add(listener);\n return () => this.off(event, listener);\n }\n\n off<K extends keyof E>(event: K, listener: Listener<E[K]>): void {\n const set = this.listenersByEvent.get(event);\n if (!set) {\n return;\n }\n\n set.delete(listener);\n if (set.size === 0) {\n this.listenersByEvent.delete(event);\n }\n }\n\n once<K extends keyof E>(event: K, listener: Listener<E[K]>): () => void {\n const off = this.on(event, ((payload: E[K]) => {\n off();\n listener(payload);\n }) as Listener<E[K]>);\n\n return off;\n }\n\n onAny(listener: AnyListener<E>): () => void {\n this.anyListeners.add(listener);\n return () => this.anyListeners.delete(listener);\n }\n\n use(mw: Middleware<E>): () => void {\n this.middlewares.push(mw);\n return () => this.removeFromArray(this.middlewares, mw);\n }\n\n usePattern(mw: PatternMiddleware<E>): () => void {\n this.patternMiddlewares.push(mw);\n return () => this.removeFromArray(this.patternMiddlewares, mw);\n }\n\n onPattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: PatternOptions,\n ): () => void {\n const compiled = this.compilePatternMatcher(pattern);\n\n const entry: CompiledPatternListener<E> = {\n pattern,\n kind: compiled.kind,\n match: compiled.match,\n priority: options?.priority ?? compiled.priority,\n once: options?.once,\n handler: handler as any,\n };\n\n this.insertPatternByPriority(entry);\n\n return () => this.removeFromArray(this.patternListeners, entry);\n }\n\n oncePattern<P extends Pattern<Extract<keyof E, string>>>(\n pattern: P,\n handler: <K extends keyof E & MatchKeys<Extract<keyof E, string>, P>>(\n event: K,\n payload: E[K],\n params?: Record<string, string>,\n ) => void,\n options?: Omit<PatternOptions, 'once'>,\n ): () => void {\n return this.onPattern(pattern, handler, { ...options, once: true });\n }\n\n listenerCount(event: keyof E): number {\n let count = 0;\n count += this.listenersByEvent.get(event)?.size ?? 0;\n count += this.anyListeners.size;\n\n if (typeof event === 'string') {\n for (const p of this.patternListeners) {\n if (p.match(event)) {\n count++;\n }\n }\n }\n\n return count;\n }\n\n emit<K extends keyof E>(event: K, ...args: E[K] extends void ? [] : [payload: E[K]]): void {\n void this._emit(event, ...args).catch((err) => {\n queueMicrotask(() => {\n throw err;\n });\n });\n }\n\n emitAsync<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n return this._emit(event, ...args);\n }\n\n private async _emit<K extends keyof E>(\n event: K,\n ...args: E[K] extends void ? [] : [payload: E[K]]\n ): Promise<void> {\n const payload = args[0] as E[K];\n\n let blocked = false;\n\n const ctx: EmitContext<E, K> = {\n get blocked() {\n return blocked;\n },\n event,\n payload,\n matched: [],\n meta: {},\n block() {\n blocked = true;\n },\n };\n\n await this.runMiddlewares(ctx);\n }\n\n private async runMiddlewares<K extends keyof E>(ctx: EmitContext<E, K>): Promise<void> {\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (ctx.blocked) {\n return;\n }\n\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n\n index = n;\n\n const mw = this.middlewares[n];\n if (!mw) {\n this.invokeExactAndAnyListeners(ctx.event, ctx.payload);\n await this.invokePatternPipeline(ctx);\n return;\n }\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private invokeExactAndAnyListeners<K extends keyof E>(event: K, payload: E[K]): void {\n const set = this.listenersByEvent.get(event);\n if (set) {\n for (const fn of set) {\n this.safeCall(() => fn(payload));\n }\n }\n\n for (const fn of this.anyListeners) {\n this.safeCall(() => fn(event, payload));\n }\n }\n\n private async invokePatternPipeline(ctx: EmitContext<E, keyof E>): Promise<void> {\n const matched: Array<{ entry: CompiledPatternListener<E>; params: Record<string, string> }> =\n [];\n\n if (typeof ctx.event === 'string') {\n for (const entry of this.patternListeners) {\n const params = entry.match(ctx.event);\n if (params) {\n matched.push({ entry, params });\n }\n }\n }\n\n (ctx as any).matched = matched.map(\n (m): PatternListenerInfo<E> => ({\n handler: m.entry.handler,\n kind: m.entry.kind,\n once: m.entry.once,\n priority: m.entry.priority,\n prefix: m.entry.prefix,\n }),\n );\n\n let index = -1;\n\n const dispatch = async (n: number): Promise<void> => {\n if (n <= index) {\n throw new Error('next() called multiple times.');\n }\n index = n;\n\n const mw = this.patternMiddlewares[n];\n if (!mw) {\n for (const { entry, params } of matched) {\n this.safeCall(() => entry.handler(ctx.event, ctx.payload, params));\n if (entry.once) {\n this.removeFromArray(this.patternListeners, entry);\n }\n }\n return;\n }\n\n await mw(ctx, () => dispatch(n + 1));\n };\n\n await dispatch(0);\n }\n\n private getListenerSet<K extends keyof E>(event: K): Set<Listener<E[K]>> {\n let set = this.listenersByEvent.get(event) as Set<Listener<E[K]>> | undefined;\n if (!set) {\n set = new Set();\n this.listenersByEvent.set(event, set);\n }\n return set;\n }\n\n private insertPatternByPriority(entry: CompiledPatternListener<E>): void {\n let lo = 0;\n let hi = this.patternListeners.length;\n\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (this.patternListeners[mid].priority >= entry.priority) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n this.patternListeners.splice(lo, 0, entry);\n }\n\n private removeFromArray<T>(arr: T[], item: T): void {\n const i = arr.indexOf(item);\n if (i >= 0) {\n arr.splice(i, 1);\n }\n }\n\n private safeCall(fn: () => void): void {\n try {\n fn();\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n }\n\n private escapeRegexLiteral(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n private compilePatternMatcher(p: string): {\n kind: PatternKind;\n priority: number;\n match: (event: string) => null | Record<string, string>;\n } {\n if (p === '*') {\n return { kind: 'star', priority: 0, match: () => ({}) };\n }\n\n if (p.endsWith(':*')) {\n const prefix = p.slice(0, -2);\n if (!prefix) {\n throw new Error(`Invalid pattern: ${p}.`);\n }\n\n const prefixWithColon = prefix + ':';\n\n return {\n kind: 'prefix',\n priority: 10,\n match: (event: string) =>\n event === prefix || event.startsWith(prefixWithColon) ? {} : null,\n };\n }\n\n if (p.includes('{')) {\n const keys: string[] = [];\n const parts = p.split(/\\{(\\w+)}/g);\n\n let src = '^';\n for (let i = 0; i < parts.length; i++) {\n if (i % 2 === 0) {\n src += this.escapeRegexLiteral(parts[i]);\n } else {\n keys.push(parts[i]);\n src += '([^:]+)';\n }\n }\n src += '$';\n\n const regex = new RegExp(src);\n\n return {\n kind: 'param',\n priority: 100 + keys.length,\n match: (event: string) => {\n const m = event.match(regex);\n if (!m) {\n return null;\n }\n\n const params: Record<string, string> = {};\n for (let i = 0; i < keys.length; i++) {\n params[keys[i]] = m[i + 1];\n }\n return params;\n },\n };\n }\n\n throw new Error(`Unsupported pattern: ${p}.`);\n }\n}\n","export type EventMap = Record<string, unknown>;\n\nexport type Listener<Payload> = Payload extends void ? () => void : (payload: Payload) => void;\n\nexport type AnyListener<E extends EventMap> = <K extends keyof E>(event: K, payload: E[K]) => void;\n\nexport type PatternKind = 'star' | 'prefix' | 'param';\n\nexport type Pattern<_K extends string> = '*' | `${string}:*` | `${string}{${string}}${string}`;\n\ntype PatternToKeyShape<P extends string> = P extends '*'\n ? string\n : P extends `${infer Prefix}:*`\n ? `${Prefix}:${string}` | Prefix\n : P extends `${infer A}{${string}}${infer B}`\n ? `${A}${string}${B}`\n : never;\n\nexport type MatchKeys<Keys extends string, P extends Pattern<Keys>> = Extract<\n Keys,\n PatternToKeyShape<P>\n>;\n\nexport type EmitContext<E extends EventMap, K extends keyof E> = {\n readonly blocked: boolean;\n readonly event: K;\n readonly payload: E[K];\n readonly matched: readonly PatternListenerInfo<E>[];\n readonly meta: Record<string, unknown>;\n block(): void;\n};\n\nexport type Middleware<E extends EventMap> = <K extends keyof E>(\n ctx: EmitContext<E, K>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternMiddleware<E extends EventMap> = (\n ctx: EmitContext<E, keyof E>,\n next: () => Promise<void>,\n) => Promise<void> | void;\n\nexport type PatternListenerInfo<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly handler: (event: keyof E, payload: E[keyof E]) => void;\n};\n\nexport type CompiledPatternListener<E extends EventMap> = {\n readonly kind: PatternKind;\n readonly once?: boolean;\n readonly priority: number;\n readonly prefix?: string;\n readonly prefixWithColon?: string;\n readonly pattern: Pattern<Extract<keyof E, string>> | RegExp | ((event: string) => boolean);\n readonly handler: (event: keyof E, payload: E[keyof E], params?: Record<string, string>) => void;\n match(event: string): null | Record<string, string>;\n};\n\nexport type PatternOptions = { once?: boolean; priority?: number };\n"],"names":["$54a742859ac4854f$export$5087227eb54526","clear","event","undefined","listenersByEvent","anyListeners","patternListeners","length","middlewares","patternMiddlewares","delete","on","listener","getListenerSet","add","off","set","get","size","once","payload","onAny","use","mw","push","removeFromArray","usePattern","onPattern","pattern","handler","options","compiled","compilePatternMatcher","entry","kind","match","priority","insertPatternByPriority","oncePattern","listenerCount","count","p","emit","args","_emit","catch","err","queueMicrotask","emitAsync","blocked","runMiddlewares","matched","meta","block","ctx","index","dispatch","n","Error","invokeExactAndAnyListeners","invokePatternPipeline","fn","safeCall","params","map","m","prefix","Set","lo","hi","mid","splice","arr","item","i","indexOf","escapeRegexLiteral","s","replace","endsWith","slice","prefixWithColon","startsWith","includes","keys","parts","split","src","regex","RegExp","Map","EventBus"],"version":3,"file":"index.js.map"}
|