🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

fastevent

Package Overview
Dependencies
Maintainers
1
Versions
45
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fastevent - npm Package Compare versions

Comparing version
2.3.6
to
2.3.7
+1
-1
dist/devTools.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../../node_modules/redux/src/utils/formatProdErrorMessage.ts","../../../node_modules/redux/src/utils/symbol-observable.ts","../../../node_modules/redux/src/utils/actionTypes.ts","../../../node_modules/redux/src/utils/isPlainObject.ts","../../../node_modules/redux/src/utils/kindOf.ts","../../../node_modules/redux/src/createStore.ts","../src/utils/WeakObjectMap.ts","../src/devTools.ts"],"names":["formatProdErrorMessage","code","__name","$$observable","symbol_observable_default","randomString","ActionTypes","actionTypes_default","isPlainObject","obj","proto","miniKindOf","val","type","isDate","isError","constructorName","ctorName","kindOf","typeOfVal","createStore","reducer","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","listenerIdCounter","isDispatching","ensureCanMutateNextListeners","listener","key","getState","subscribe","isSubscribed","listenerId","dispatch","action","replaceReducer","nextReducer","observable","outerSubscribe","observer","observeState","observerAsObserver","legacy_createStore","WeakObjectMap","map","finalizationRegistry","constructor","Map","FinalizationRegistry","delete","set","value","weakRef","WeakRef","register","get","deref","undefined","has","initialState","getDefaultFastEventState","instance","messageCount","listenerCount","retainMessageCount","retainedMessages","size","FlexEventDevTools","reduxStore","_installed","fastEvents","install","add","id","options","onAddListener","event","name","emitter","onRemoveListener","onClearListeners","onAfterExecuteListener","message","returns","listeners","results","r","Error","sresults","reduce","cur","push","__listeners","i","console","log","payload","meta","remove","state","startsWith","eventState","bind","window","__REDUX_DEVTOOLS_EXTENSION__","info","globalThis","__FLEXEVENT_DEVTOOLS__"],"mappings":"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","file":"devTools.js","sourcesContent":["/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}","declare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\nconst $$observable = /* #__PURE__ */(() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();\nexport default $$observable;","/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\nconst randomString = () => Math.random().toString(36).substring(7).split('').join('.');\nconst ActionTypes = {\n INIT: `@@redux/INIT${/* #__PURE__ */randomString()}`,\n REPLACE: `@@redux/REPLACE${/* #__PURE__ */randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nexport default ActionTypes;","/**\n * @param obj The object to inspect.\n * @returns True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj: any): obj is object {\n if (typeof obj !== 'object' || obj === null) return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}","// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nexport function miniKindOf(val: any): string {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n const type = typeof val;\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n const constructorName = ctorName(val);\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n }\n\n // other\n return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\nfunction ctorName(val: any): string | null {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\nfunction isError(val: any) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\nfunction isDate(val: any) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\nexport function kindOf(val: any) {\n let typeOfVal: string = typeof val;\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n return typeOfVal;\n}","import { formatProdErrorMessage as _formatProdErrorMessage13 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage12 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage11 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage10 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage9 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage8 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage7 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage6 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage5 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage4 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport $$observable from './utils/symbol-observable';\nimport { Store, StoreEnhancer, Dispatch, Observer, ListenerCallback, UnknownIfNonSpecific } from './types/store';\nimport { Action } from './types/actions';\nimport { Reducer } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport { kindOf } from './utils/kindOf';\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(2) : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`);\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = (preloadedState as StoreEnhancer<Ext, StateExt>);\n preloadedState = undefined;\n }\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(1) : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`);\n }\n return enhancer(createStore)(reducer, (preloadedState as PreloadedState | undefined));\n }\n let currentReducer = reducer;\n let currentState: S | PreloadedState | undefined = (preloadedState as PreloadedState | undefined);\n let currentListeners: Map<number, ListenerCallback> | null = new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns The current state tree of your application.\n */\n function getState(): S {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n return (currentState as S);\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param listener A callback to be invoked on every dispatch.\n * @returns A function to remove this change listener.\n */\n function subscribe(listener: () => void) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(4) : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action: A) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage8(7) : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);\n }\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage9(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n if (typeof action.type !== 'string') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage10(17) : `Action \"type\" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage11(9) : 'Reducers may not dispatch actions.');\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach(listener => {\n listener();\n });\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param nextReducer The reducer for the store to use instead.\n */\n function replaceReducer(nextReducer: Reducer<S, A>): void {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage12(10) : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`);\n }\n currentReducer = ((nextReducer as unknown) as Reducer<S, A, PreloadedState>);\n\n // This action has a similar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n dispatch(({\n type: ActionTypes.REPLACE\n } as A));\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer: unknown) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage13(11) : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`);\n }\n function observeState() {\n const observerAsObserver = (observer as Observer<S>);\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [$$observable]() {\n return this;\n }\n };\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch(({\n type: ActionTypes.INIT\n } as A));\n const store = (({\n dispatch: (dispatch as Dispatch<A>),\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n } as unknown) as Store<S, A, StateExt> & Ext);\n return store;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n return createStore(reducer, (preloadedState as any), enhancer);\n}","// @ts-nocheck\n/**\n * 一个基于弱引用(WeakRef)的键值映射集合\n * \n * @template T - 值的类型,必须是对象类型(继承自 `object`)\n * \n * @example\n * const map = new WeakObjectMap<MyObject>();\n * map.set('key1', obj1);\n * const retrieved = map.get('key1'); // 返回 obj1 或 undefined(如果已被垃圾回收)\n */\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n\n /**\n * 构造一个新的 WeakObjectMap 实例\n */\n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n\n /**\n * 设置键值对\n * @param key - 字符串键名\n * @param value - 要存储的对象值(会被自动包装为弱引用)\n */\n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n\n /**\n * 获取指定键对应的值\n * @param key - 要查找的键名\n * @returns 如果值存在且未被垃圾回收则返回值,否则返回 undefined\n */\n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n\n /**\n * 删除指定键的映射\n * @param key - 要删除的键名\n * @returns 如果键存在并已删除则返回 true,否则返回 false\n */\n delete(key: string): boolean {\n return this.map.delete(key);\n }\n\n /**\n * 检查是否存在指定键的映射(且值未被垃圾回收)\n * @param key - 要检查的键名\n * @returns 如果键存在且值未被回收则返回 true,否则返回 false\n */\n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n","/**\n * \n * 基于开发工具\n * \n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * FLEXEVENT是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看FLEXEVENT的状态变化 \n * \n * import { createStore } from \"@FLEXEVENTjs/react\"\n * import { install } from \"@FLEXEVENTjs/devtools\"\n * \n * \n * const store = createStore({})\n * \n * install()\n * \n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\"\nimport { WeakObjectMap } from \"./utils/WeakObjectMap\"\nimport { FastEvent } from \"./event\"\nimport { FastListenerMeta } from \"./types\"\n\nconst initialState = {\n\n}\n\n\nfunction getDefaultFastEventState(instance: FastEvent) {\n return {\n messageCount: 0,\n listenerCount: instance.listenerCount,\n retainMessageCount: instance.retainedMessages.size,\n }\n}\n\nexport class FlexEventDevTools {\n private reduxStore: any\n private _installed: boolean = false\n fastEvents = new WeakObjectMap()\n constructor() {\n this.install()\n }\n add(instance: FastEvent) {\n this.fastEvents.set(instance.id, instance)\n\n instance.options.onAddListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__ADD_LISTENER__\",\n event: type,\n listener: listener.name || 'anonymous',\n emitter: instance.id\n })\n }\n instance.options.onRemoveListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__REMOVE_LISTENER__\",\n event: type,\n listener: listener.name || 'anonymous',\n emitter: instance.id\n })\n }\n instance.options.onClearListeners = () => {\n this.reduxStore.dispatch({\n type: \"__CLEAR_LISTENERS__\",\n emitter: instance.id\n })\n }\n instance.options.onAfterExecuteListener = (message, returns, listeners) => {\n const results = returns.map(r => r instanceof Error ? `Error(${r.message})` : r)\n const sresults = listeners.reduce<FastListenerMeta[]>((results, cur) => {\n results.push(...cur.__listeners)\n return results\n }, [])\n .map((listener, i) => `${listener[0].name || 'anonymous'}(${listener[2]}) -> ${results[i]} ${listener[3] ? `(tag=${listener[3]})` : ''}`)\n\n console.log(`FastEvent<\\x1B[31m${message.type}\\x1B[30m> is emit, listeners:`, listeners)\n this.reduxStore.dispatch({\n type: message.type,\n payload: message.payload,\n meta: message.meta,\n emitter: instance.id,\n returns: sresults\n })\n }\n this.reduxStore.dispatch({\n type: \"__ADD_FASTEVENT__\",\n emitter: instance.id\n })\n }\n remove(instance: FastEvent) {\n if (this.fastEvents.has(instance.id)) {\n this.fastEvents.delete(instance.id)\n }\n }\n private reducer(state: any = initialState, action: any) {\n if (action.type.startsWith(\"@@\")) return state\n const instance = this.fastEvents.get(action.emitter) as FastEvent\n if (action.type === '__ADD_FASTEVENT__') {\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance)\n }\n } else if (action.type === '__ADD_LISTENER__') {\n const eventState = state[action.emitter] || getDefaultFastEventState(instance)\n eventState.listenerCount++\n return {\n ...state,\n [action.emitter]: {\n ...eventState\n }\n }\n } else if (action.type === '__REMOVE_LISTENER__') {\n const eventState = state[action.emitter]\n if (!eventState) return state\n eventState.listenerCount++\n return {\n ...state,\n [action.emitter]: {\n ...eventState\n }\n }\n } else if (action.type === '__CLEAR_LISTENERS__') {\n const eventState = state[action.emitter]\n if (!eventState) return state\n eventState.listenerCount++\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance)\n }\n } else {\n const eventState = state[action.emitter]\n if (!eventState) return state\n eventState.messageCount++\n eventState.listenerCount = instance.listenerCount\n eventState.retainMessageCount = instance.retainedMessages.size\n return {\n ...state,\n [action.emitter]: { ...eventState }\n }\n }\n }\n private install() {\n if (this._installed) return\n this.reduxStore = createStore(\n this.reducer.bind(this),\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n );\n this._installed = true\n console.info('%c FlexEventDevTools installed. Please open <Redux devtools> to view. %c', \"color:red;\", '')\n }\n}\n\nexport function install() {\n // @ts-ignore\n if (!globalThis.__FLEXEVENT_DEVTOOLS__) globalThis.__FLEXEVENT_DEVTOOLS__ = new FlexEventDevTools()\n}\n\ndeclare global {\n // @ts-ignore\n var __FLEXEVENT_DEVTOOLS__: FlexEventDevTools\n}\n\n\ninstall()\n\n"]}
{"version":3,"sources":["../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/formatProdErrorMessage.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/symbol-observable.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/actionTypes.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/isPlainObject.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/kindOf.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/createStore.ts","../src/utils/WeakObjectMap.ts","../src/devTools.ts"],"names":["formatProdErrorMessage","code","__name","$$observable","symbol_observable_default","randomString","ActionTypes","actionTypes_default","isPlainObject","obj","proto","miniKindOf","val","type","isDate","isError","constructorName","ctorName","kindOf","typeOfVal","createStore","reducer","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","listenerIdCounter","isDispatching","ensureCanMutateNextListeners","listener","key","getState","subscribe","isSubscribed","listenerId","dispatch","action","replaceReducer","nextReducer","observable","outerSubscribe","observer","observeState","observerAsObserver","legacy_createStore","WeakObjectMap","map","finalizationRegistry","Map","FinalizationRegistry","delete","set","value","weakRef","WeakRef","register","get","deref","undefined","has","initialState","getDefaultFastEventState","instance","messageCount","listenerCount","retainMessageCount","retainedMessages","size","FlexEventDevTools","reduxStore","_installed","fastEvents","install","add","id","options","onAddListener","event","name","emitter","onRemoveListener","onClearListeners","onAfterExecuteListener","message","returns","listeners","results","r","Error","sresults","reduce","cur","push","__listeners","i","console","log","payload","meta","remove","state","startsWith","eventState","bind","window","__REDUX_DEVTOOLS_EXTENSION__","info","globalThis","__FLEXEVENT_DEVTOOLS__"],"mappings":"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","file":"devTools.js","sourcesContent":["/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}","declare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\nconst $$observable = /* #__PURE__ */(() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();\nexport default $$observable;","/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\nconst randomString = () => Math.random().toString(36).substring(7).split('').join('.');\nconst ActionTypes = {\n INIT: `@@redux/INIT${/* #__PURE__ */randomString()}`,\n REPLACE: `@@redux/REPLACE${/* #__PURE__ */randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nexport default ActionTypes;","/**\n * @param obj The object to inspect.\n * @returns True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj: any): obj is object {\n if (typeof obj !== 'object' || obj === null) return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}","// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nexport function miniKindOf(val: any): string {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n const type = typeof val;\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n const constructorName = ctorName(val);\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n }\n\n // other\n return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\nfunction ctorName(val: any): string | null {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\nfunction isError(val: any) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\nfunction isDate(val: any) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\nexport function kindOf(val: any) {\n let typeOfVal: string = typeof val;\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n return typeOfVal;\n}","import { formatProdErrorMessage as _formatProdErrorMessage13 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage12 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage11 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage10 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage9 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage8 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage7 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage6 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage5 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage4 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport $$observable from './utils/symbol-observable';\nimport { Store, StoreEnhancer, Dispatch, Observer, ListenerCallback, UnknownIfNonSpecific } from './types/store';\nimport { Action } from './types/actions';\nimport { Reducer } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport { kindOf } from './utils/kindOf';\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(2) : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`);\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = (preloadedState as StoreEnhancer<Ext, StateExt>);\n preloadedState = undefined;\n }\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(1) : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`);\n }\n return enhancer(createStore)(reducer, (preloadedState as PreloadedState | undefined));\n }\n let currentReducer = reducer;\n let currentState: S | PreloadedState | undefined = (preloadedState as PreloadedState | undefined);\n let currentListeners: Map<number, ListenerCallback> | null = new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns The current state tree of your application.\n */\n function getState(): S {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n return (currentState as S);\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param listener A callback to be invoked on every dispatch.\n * @returns A function to remove this change listener.\n */\n function subscribe(listener: () => void) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(4) : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action: A) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage8(7) : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);\n }\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage9(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n if (typeof action.type !== 'string') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage10(17) : `Action \"type\" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage11(9) : 'Reducers may not dispatch actions.');\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach(listener => {\n listener();\n });\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param nextReducer The reducer for the store to use instead.\n */\n function replaceReducer(nextReducer: Reducer<S, A>): void {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage12(10) : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`);\n }\n currentReducer = ((nextReducer as unknown) as Reducer<S, A, PreloadedState>);\n\n // This action has a similar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n dispatch(({\n type: ActionTypes.REPLACE\n } as A));\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer: unknown) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage13(11) : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`);\n }\n function observeState() {\n const observerAsObserver = (observer as Observer<S>);\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [$$observable]() {\n return this;\n }\n };\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch(({\n type: ActionTypes.INIT\n } as A));\n const store = (({\n dispatch: (dispatch as Dispatch<A>),\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n } as unknown) as Store<S, A, StateExt> & Ext);\n return store;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n return createStore(reducer, (preloadedState as any), enhancer);\n}","// @ts-nocheck\n/**\n * 一个基于弱引用(WeakRef)的键值映射集合\n * \n * @template T - 值的类型,必须是对象类型(继承自 `object`)\n * \n * @example\n * const map = new WeakObjectMap<MyObject>();\n * map.set('key1', obj1);\n * const retrieved = map.get('key1'); // 返回 obj1 或 undefined(如果已被垃圾回收)\n */\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n\n /**\n * 构造一个新的 WeakObjectMap 实例\n */\n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n\n /**\n * 设置键值对\n * @param key - 字符串键名\n * @param value - 要存储的对象值(会被自动包装为弱引用)\n */\n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n\n /**\n * 获取指定键对应的值\n * @param key - 要查找的键名\n * @returns 如果值存在且未被垃圾回收则返回值,否则返回 undefined\n */\n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n\n /**\n * 删除指定键的映射\n * @param key - 要删除的键名\n * @returns 如果键存在并已删除则返回 true,否则返回 false\n */\n delete(key: string): boolean {\n return this.map.delete(key);\n }\n\n /**\n * 检查是否存在指定键的映射(且值未被垃圾回收)\n * @param key - 要检查的键名\n * @returns 如果键存在且值未被回收则返回 true,否则返回 false\n */\n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n","/**\n *\n * 基于开发工具\n *\n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * FLEXEVENT是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看FLEXEVENT的状态变化\n *\n * import { createStore } from \"@FLEXEVENTjs/react\"\n * import { install } from \"@FLEXEVENTjs/devtools\"\n *\n *\n * const store = createStore({})\n *\n * install()\n *\n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\";\nimport { WeakObjectMap } from \"./utils/WeakObjectMap\";\nimport { FastEvent } from \"./event\";\nimport { FastEventListenerMeta } from \"./types/FastEventListeners\";\n\nconst initialState = {};\n\nfunction getDefaultFastEventState(instance: FastEvent) {\n return {\n messageCount: 0,\n listenerCount: instance.listenerCount,\n retainMessageCount: instance.retainedMessages.size,\n };\n}\n\nexport class FlexEventDevTools {\n private reduxStore: any;\n private _installed: boolean = false;\n fastEvents = new WeakObjectMap();\n constructor() {\n this.install();\n }\n add(instance: FastEvent) {\n this.fastEvents.set(instance.id, instance);\n\n instance.options.onAddListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__ADD_LISTENER__\",\n event: type,\n listener: listener.name || \"anonymous\",\n emitter: instance.id,\n });\n };\n instance.options.onRemoveListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__REMOVE_LISTENER__\",\n event: type,\n listener: listener.name || \"anonymous\",\n emitter: instance.id,\n });\n };\n instance.options.onClearListeners = () => {\n this.reduxStore.dispatch({\n type: \"__CLEAR_LISTENERS__\",\n emitter: instance.id,\n });\n };\n instance.options.onAfterExecuteListener = (message, returns, listeners) => {\n const results = returns.map((r) => (r instanceof Error ? `Error(${r.message})` : r));\n const sresults = listeners\n .reduce<FastEventListenerMeta[]>((results, cur) => {\n results.push(...cur.__listeners);\n return results;\n }, [])\n .map(\n (listener, i) =>\n `${listener[0].name || \"anonymous\"}(${listener[2]}) -> ${results[i]} ${listener[3] ? `(tag=${listener[3]})` : \"\"}`,\n );\n\n console.log(\n `FastEvent<\\x1B[31m${message.type}\\x1B[30m> is emit, listeners:`,\n listeners,\n );\n this.reduxStore.dispatch({\n type: message.type,\n payload: message.payload,\n meta: message.meta,\n emitter: instance.id,\n returns: sresults,\n });\n };\n this.reduxStore.dispatch({\n type: \"__ADD_FASTEVENT__\",\n emitter: instance.id,\n });\n }\n remove(instance: FastEvent) {\n if (this.fastEvents.has(instance.id)) {\n this.fastEvents.delete(instance.id);\n }\n }\n private reducer(state: any = initialState, action: any) {\n if (action.type.startsWith(\"@@\")) return state;\n const instance = this.fastEvents.get(action.emitter) as FastEvent;\n if (action.type === \"__ADD_FASTEVENT__\") {\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance),\n };\n } else if (action.type === \"__ADD_LISTENER__\") {\n const eventState = state[action.emitter] || getDefaultFastEventState(instance);\n eventState.listenerCount++;\n return {\n ...state,\n [action.emitter]: {\n ...eventState,\n },\n };\n } else if (action.type === \"__REMOVE_LISTENER__\") {\n const eventState = state[action.emitter];\n if (!eventState) return state;\n eventState.listenerCount++;\n return {\n ...state,\n [action.emitter]: {\n ...eventState,\n },\n };\n } else if (action.type === \"__CLEAR_LISTENERS__\") {\n const eventState = state[action.emitter];\n if (!eventState) return state;\n eventState.listenerCount++;\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance),\n };\n } else {\n const eventState = state[action.emitter];\n if (!eventState) return state;\n eventState.messageCount++;\n eventState.listenerCount = instance.listenerCount;\n eventState.retainMessageCount = instance.retainedMessages.size;\n return {\n ...state,\n [action.emitter]: { ...eventState },\n };\n }\n }\n private install() {\n if (this._installed) return;\n this.reduxStore = createStore(\n this.reducer.bind(this),\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),\n );\n this._installed = true;\n console.info(\n \"%c FlexEventDevTools installed. Please open <Redux devtools> to view. %c\",\n \"color:red;\",\n \"\",\n );\n }\n}\n\nexport function install() {\n // @ts-ignore\n if (!globalThis.__FLEXEVENT_DEVTOOLS__)\n globalThis.__FLEXEVENT_DEVTOOLS__ = new FlexEventDevTools();\n}\n\ndeclare global {\n // @ts-ignore\n var __FLEXEVENT_DEVTOOLS__: FlexEventDevTools;\n}\n\ninstall();\n"]}

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../../node_modules/redux/src/utils/formatProdErrorMessage.ts","../../../node_modules/redux/src/utils/symbol-observable.ts","../../../node_modules/redux/src/utils/actionTypes.ts","../../../node_modules/redux/src/utils/isPlainObject.ts","../../../node_modules/redux/src/utils/kindOf.ts","../../../node_modules/redux/src/createStore.ts","../src/utils/WeakObjectMap.ts","../src/devTools.ts"],"names":["formatProdErrorMessage","code","__name","$$observable","symbol_observable_default","randomString","ActionTypes","actionTypes_default","isPlainObject","obj","proto","miniKindOf","val","type","isDate","isError","constructorName","ctorName","kindOf","typeOfVal","createStore","reducer","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","listenerIdCounter","isDispatching","ensureCanMutateNextListeners","listener","key","getState","subscribe","isSubscribed","listenerId","dispatch","action","replaceReducer","nextReducer","observable","outerSubscribe","observer","observeState","observerAsObserver","legacy_createStore","WeakObjectMap","map","finalizationRegistry","constructor","Map","FinalizationRegistry","delete","set","value","weakRef","WeakRef","register","get","deref","undefined","has","initialState","getDefaultFastEventState","instance","messageCount","listenerCount","retainMessageCount","retainedMessages","size","FlexEventDevTools","reduxStore","_installed","fastEvents","install","add","id","options","onAddListener","event","name","emitter","onRemoveListener","onClearListeners","onAfterExecuteListener","message","returns","listeners","results","r","Error","sresults","reduce","cur","push","__listeners","i","console","log","payload","meta","remove","state","startsWith","eventState","bind","window","__REDUX_DEVTOOLS_EXTENSION__","info","globalThis","__FLEXEVENT_DEVTOOLS__"],"mappings":"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","file":"devTools.mjs","sourcesContent":["/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}","declare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\nconst $$observable = /* #__PURE__ */(() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();\nexport default $$observable;","/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\nconst randomString = () => Math.random().toString(36).substring(7).split('').join('.');\nconst ActionTypes = {\n INIT: `@@redux/INIT${/* #__PURE__ */randomString()}`,\n REPLACE: `@@redux/REPLACE${/* #__PURE__ */randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nexport default ActionTypes;","/**\n * @param obj The object to inspect.\n * @returns True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj: any): obj is object {\n if (typeof obj !== 'object' || obj === null) return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}","// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nexport function miniKindOf(val: any): string {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n const type = typeof val;\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n const constructorName = ctorName(val);\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n }\n\n // other\n return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\nfunction ctorName(val: any): string | null {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\nfunction isError(val: any) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\nfunction isDate(val: any) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\nexport function kindOf(val: any) {\n let typeOfVal: string = typeof val;\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n return typeOfVal;\n}","import { formatProdErrorMessage as _formatProdErrorMessage13 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage12 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage11 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage10 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage9 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage8 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage7 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage6 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage5 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage4 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport $$observable from './utils/symbol-observable';\nimport { Store, StoreEnhancer, Dispatch, Observer, ListenerCallback, UnknownIfNonSpecific } from './types/store';\nimport { Action } from './types/actions';\nimport { Reducer } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport { kindOf } from './utils/kindOf';\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(2) : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`);\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = (preloadedState as StoreEnhancer<Ext, StateExt>);\n preloadedState = undefined;\n }\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(1) : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`);\n }\n return enhancer(createStore)(reducer, (preloadedState as PreloadedState | undefined));\n }\n let currentReducer = reducer;\n let currentState: S | PreloadedState | undefined = (preloadedState as PreloadedState | undefined);\n let currentListeners: Map<number, ListenerCallback> | null = new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns The current state tree of your application.\n */\n function getState(): S {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n return (currentState as S);\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param listener A callback to be invoked on every dispatch.\n * @returns A function to remove this change listener.\n */\n function subscribe(listener: () => void) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(4) : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action: A) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage8(7) : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);\n }\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage9(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n if (typeof action.type !== 'string') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage10(17) : `Action \"type\" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage11(9) : 'Reducers may not dispatch actions.');\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach(listener => {\n listener();\n });\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param nextReducer The reducer for the store to use instead.\n */\n function replaceReducer(nextReducer: Reducer<S, A>): void {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage12(10) : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`);\n }\n currentReducer = ((nextReducer as unknown) as Reducer<S, A, PreloadedState>);\n\n // This action has a similar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n dispatch(({\n type: ActionTypes.REPLACE\n } as A));\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer: unknown) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage13(11) : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`);\n }\n function observeState() {\n const observerAsObserver = (observer as Observer<S>);\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [$$observable]() {\n return this;\n }\n };\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch(({\n type: ActionTypes.INIT\n } as A));\n const store = (({\n dispatch: (dispatch as Dispatch<A>),\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n } as unknown) as Store<S, A, StateExt> & Ext);\n return store;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n return createStore(reducer, (preloadedState as any), enhancer);\n}","// @ts-nocheck\n/**\n * 一个基于弱引用(WeakRef)的键值映射集合\n * \n * @template T - 值的类型,必须是对象类型(继承自 `object`)\n * \n * @example\n * const map = new WeakObjectMap<MyObject>();\n * map.set('key1', obj1);\n * const retrieved = map.get('key1'); // 返回 obj1 或 undefined(如果已被垃圾回收)\n */\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n\n /**\n * 构造一个新的 WeakObjectMap 实例\n */\n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n\n /**\n * 设置键值对\n * @param key - 字符串键名\n * @param value - 要存储的对象值(会被自动包装为弱引用)\n */\n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n\n /**\n * 获取指定键对应的值\n * @param key - 要查找的键名\n * @returns 如果值存在且未被垃圾回收则返回值,否则返回 undefined\n */\n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n\n /**\n * 删除指定键的映射\n * @param key - 要删除的键名\n * @returns 如果键存在并已删除则返回 true,否则返回 false\n */\n delete(key: string): boolean {\n return this.map.delete(key);\n }\n\n /**\n * 检查是否存在指定键的映射(且值未被垃圾回收)\n * @param key - 要检查的键名\n * @returns 如果键存在且值未被回收则返回 true,否则返回 false\n */\n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n","/**\n * \n * 基于开发工具\n * \n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * FLEXEVENT是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看FLEXEVENT的状态变化 \n * \n * import { createStore } from \"@FLEXEVENTjs/react\"\n * import { install } from \"@FLEXEVENTjs/devtools\"\n * \n * \n * const store = createStore({})\n * \n * install()\n * \n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\"\nimport { WeakObjectMap } from \"./utils/WeakObjectMap\"\nimport { FastEvent } from \"./event\"\nimport { FastListenerMeta } from \"./types\"\n\nconst initialState = {\n\n}\n\n\nfunction getDefaultFastEventState(instance: FastEvent) {\n return {\n messageCount: 0,\n listenerCount: instance.listenerCount,\n retainMessageCount: instance.retainedMessages.size,\n }\n}\n\nexport class FlexEventDevTools {\n private reduxStore: any\n private _installed: boolean = false\n fastEvents = new WeakObjectMap()\n constructor() {\n this.install()\n }\n add(instance: FastEvent) {\n this.fastEvents.set(instance.id, instance)\n\n instance.options.onAddListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__ADD_LISTENER__\",\n event: type,\n listener: listener.name || 'anonymous',\n emitter: instance.id\n })\n }\n instance.options.onRemoveListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__REMOVE_LISTENER__\",\n event: type,\n listener: listener.name || 'anonymous',\n emitter: instance.id\n })\n }\n instance.options.onClearListeners = () => {\n this.reduxStore.dispatch({\n type: \"__CLEAR_LISTENERS__\",\n emitter: instance.id\n })\n }\n instance.options.onAfterExecuteListener = (message, returns, listeners) => {\n const results = returns.map(r => r instanceof Error ? `Error(${r.message})` : r)\n const sresults = listeners.reduce<FastListenerMeta[]>((results, cur) => {\n results.push(...cur.__listeners)\n return results\n }, [])\n .map((listener, i) => `${listener[0].name || 'anonymous'}(${listener[2]}) -> ${results[i]} ${listener[3] ? `(tag=${listener[3]})` : ''}`)\n\n console.log(`FastEvent<\\x1B[31m${message.type}\\x1B[30m> is emit, listeners:`, listeners)\n this.reduxStore.dispatch({\n type: message.type,\n payload: message.payload,\n meta: message.meta,\n emitter: instance.id,\n returns: sresults\n })\n }\n this.reduxStore.dispatch({\n type: \"__ADD_FASTEVENT__\",\n emitter: instance.id\n })\n }\n remove(instance: FastEvent) {\n if (this.fastEvents.has(instance.id)) {\n this.fastEvents.delete(instance.id)\n }\n }\n private reducer(state: any = initialState, action: any) {\n if (action.type.startsWith(\"@@\")) return state\n const instance = this.fastEvents.get(action.emitter) as FastEvent\n if (action.type === '__ADD_FASTEVENT__') {\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance)\n }\n } else if (action.type === '__ADD_LISTENER__') {\n const eventState = state[action.emitter] || getDefaultFastEventState(instance)\n eventState.listenerCount++\n return {\n ...state,\n [action.emitter]: {\n ...eventState\n }\n }\n } else if (action.type === '__REMOVE_LISTENER__') {\n const eventState = state[action.emitter]\n if (!eventState) return state\n eventState.listenerCount++\n return {\n ...state,\n [action.emitter]: {\n ...eventState\n }\n }\n } else if (action.type === '__CLEAR_LISTENERS__') {\n const eventState = state[action.emitter]\n if (!eventState) return state\n eventState.listenerCount++\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance)\n }\n } else {\n const eventState = state[action.emitter]\n if (!eventState) return state\n eventState.messageCount++\n eventState.listenerCount = instance.listenerCount\n eventState.retainMessageCount = instance.retainedMessages.size\n return {\n ...state,\n [action.emitter]: { ...eventState }\n }\n }\n }\n private install() {\n if (this._installed) return\n this.reduxStore = createStore(\n this.reducer.bind(this),\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n );\n this._installed = true\n console.info('%c FlexEventDevTools installed. Please open <Redux devtools> to view. %c', \"color:red;\", '')\n }\n}\n\nexport function install() {\n // @ts-ignore\n if (!globalThis.__FLEXEVENT_DEVTOOLS__) globalThis.__FLEXEVENT_DEVTOOLS__ = new FlexEventDevTools()\n}\n\ndeclare global {\n // @ts-ignore\n var __FLEXEVENT_DEVTOOLS__: FlexEventDevTools\n}\n\n\ninstall()\n\n"]}
{"version":3,"sources":["../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/formatProdErrorMessage.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/symbol-observable.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/actionTypes.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/isPlainObject.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/utils/kindOf.ts","../../../node_modules/.bun/redux@5.0.1/node_modules/redux/src/createStore.ts","../src/utils/WeakObjectMap.ts","../src/devTools.ts"],"names":["formatProdErrorMessage","code","__name","$$observable","symbol_observable_default","randomString","ActionTypes","actionTypes_default","isPlainObject","obj","proto","miniKindOf","val","type","isDate","isError","constructorName","ctorName","kindOf","typeOfVal","createStore","reducer","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","listenerIdCounter","isDispatching","ensureCanMutateNextListeners","listener","key","getState","subscribe","isSubscribed","listenerId","dispatch","action","replaceReducer","nextReducer","observable","outerSubscribe","observer","observeState","observerAsObserver","legacy_createStore","WeakObjectMap","map","finalizationRegistry","Map","FinalizationRegistry","delete","set","value","weakRef","WeakRef","register","get","deref","undefined","has","initialState","getDefaultFastEventState","instance","messageCount","listenerCount","retainMessageCount","retainedMessages","size","FlexEventDevTools","reduxStore","_installed","fastEvents","install","add","id","options","onAddListener","event","name","emitter","onRemoveListener","onClearListeners","onAfterExecuteListener","message","returns","listeners","results","r","Error","sresults","reduce","cur","push","__listeners","i","console","log","payload","meta","remove","state","startsWith","eventState","bind","window","__REDUX_DEVTOOLS_EXTENSION__","info","globalThis","__FLEXEVENT_DEVTOOLS__"],"mappings":"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","file":"devTools.mjs","sourcesContent":["/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nexport function formatProdErrorMessage(code: number) {\n return `Minified Redux error #${code}; visit https://redux.js.org/Errors?code=${code} for the full message or ` + 'use the non-minified dev environment for full errors. ';\n}","declare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\nconst $$observable = /* #__PURE__ */(() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();\nexport default $$observable;","/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\n\nconst randomString = () => Math.random().toString(36).substring(7).split('').join('.');\nconst ActionTypes = {\n INIT: `@@redux/INIT${/* #__PURE__ */randomString()}`,\n REPLACE: `@@redux/REPLACE${/* #__PURE__ */randomString()}`,\n PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`\n};\nexport default ActionTypes;","/**\n * @param obj The object to inspect.\n * @returns True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj: any): obj is object {\n if (typeof obj !== 'object' || obj === null) return false;\n let proto = obj;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(obj) === proto || Object.getPrototypeOf(obj) === null;\n}","// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nexport function miniKindOf(val: any): string {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n const type = typeof val;\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n const constructorName = ctorName(val);\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n }\n\n // other\n return Object.prototype.toString.call(val).slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\nfunction ctorName(val: any): string | null {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\nfunction isError(val: any) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\nfunction isDate(val: any) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\nexport function kindOf(val: any) {\n let typeOfVal: string = typeof val;\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n return typeOfVal;\n}","import { formatProdErrorMessage as _formatProdErrorMessage13 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage12 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage11 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage10 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage9 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage8 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage7 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage6 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage5 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage4 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage2 } from \"src/utils/formatProdErrorMessage\";\nimport { formatProdErrorMessage as _formatProdErrorMessage } from \"src/utils/formatProdErrorMessage\";\nimport $$observable from './utils/symbol-observable';\nimport { Store, StoreEnhancer, Dispatch, Observer, ListenerCallback, UnknownIfNonSpecific } from './types/store';\nimport { Action } from './types/actions';\nimport { Reducer } from './types/reducers';\nimport ActionTypes from './utils/actionTypes';\nimport isPlainObject from './utils/isPlainObject';\nimport { kindOf } from './utils/kindOf';\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(2) : `Expected the root reducer to be a function. Instead, received: '${kindOf(reducer)}'`);\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = (preloadedState as StoreEnhancer<Ext, StateExt>);\n preloadedState = undefined;\n }\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(1) : `Expected the enhancer to be a function. Instead, received: '${kindOf(enhancer)}'`);\n }\n return enhancer(createStore)(reducer, (preloadedState as PreloadedState | undefined));\n }\n let currentReducer = reducer;\n let currentState: S | PreloadedState | undefined = (preloadedState as PreloadedState | undefined);\n let currentListeners: Map<number, ListenerCallback> | null = new Map();\n let nextListeners = currentListeners;\n let listenerIdCounter = 0;\n let isDispatching = false;\n\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = new Map();\n currentListeners.forEach((listener, key) => {\n nextListeners.set(key, listener);\n });\n }\n }\n\n /**\n * Reads the state tree managed by the store.\n *\n * @returns The current state tree of your application.\n */\n function getState(): S {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n return (currentState as S);\n }\n\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param listener A callback to be invoked on every dispatch.\n * @returns A function to remove this change listener.\n */\n function subscribe(listener: () => void) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage5(4) : `Expected the listener to be a function. Instead, received: '${kindOf(listener)}'`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage6(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n let isSubscribed = true;\n ensureCanMutateNextListeners();\n const listenerId = listenerIdCounter++;\n nextListeners.set(listenerId, listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage7(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n isSubscribed = false;\n ensureCanMutateNextListeners();\n nextListeners.delete(listenerId);\n currentListeners = null;\n };\n }\n\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n function dispatch(action: A) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage8(7) : `Actions must be plain objects. Instead, the actual type was: '${kindOf(action)}'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.`);\n }\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage9(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n if (typeof action.type !== 'string') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage10(17) : `Action \"type\" property must be a string. Instead, the actual type was: '${kindOf(action.type)}'. Value was: '${action.type}' (stringified)`);\n }\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage11(9) : 'Reducers may not dispatch actions.');\n }\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n const listeners = currentListeners = nextListeners;\n listeners.forEach(listener => {\n listener();\n });\n return action;\n }\n\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param nextReducer The reducer for the store to use instead.\n */\n function replaceReducer(nextReducer: Reducer<S, A>): void {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage12(10) : `Expected the nextReducer to be a function. Instead, received: '${kindOf(nextReducer)}`);\n }\n currentReducer = ((nextReducer as unknown) as Reducer<S, A, PreloadedState>);\n\n // This action has a similar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n dispatch(({\n type: ActionTypes.REPLACE\n } as A));\n }\n\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n function observable() {\n const outerSubscribe = subscribe;\n return {\n /**\n * The minimal observable subscription method.\n * @param observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe(observer: unknown) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage13(11) : `Expected the observer to be an object. Instead, received: '${kindOf(observer)}'`);\n }\n function observeState() {\n const observerAsObserver = (observer as Observer<S>);\n if (observerAsObserver.next) {\n observerAsObserver.next(getState());\n }\n }\n observeState();\n const unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe\n };\n },\n [$$observable]() {\n return this;\n }\n };\n }\n\n // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n dispatch(({\n type: ActionTypes.INIT\n } as A));\n const store = (({\n dispatch: (dispatch as Dispatch<A>),\n subscribe,\n getState,\n replaceReducer,\n [$$observable]: observable\n } as unknown) as Store<S, A, StateExt> & Ext);\n return store;\n}\n\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A, PreloadedState>, preloadedState?: PreloadedState | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext;\nexport function legacy_createStore<S, A extends Action, Ext extends {} = {}, StateExt extends {} = {}, PreloadedState = S>(reducer: Reducer<S, A>, preloadedState?: PreloadedState | StoreEnhancer<Ext, StateExt> | undefined, enhancer?: StoreEnhancer<Ext, StateExt>): Store<S, A, UnknownIfNonSpecific<StateExt>> & Ext {\n return createStore(reducer, (preloadedState as any), enhancer);\n}","// @ts-nocheck\n/**\n * 一个基于弱引用(WeakRef)的键值映射集合\n * \n * @template T - 值的类型,必须是对象类型(继承自 `object`)\n * \n * @example\n * const map = new WeakObjectMap<MyObject>();\n * map.set('key1', obj1);\n * const retrieved = map.get('key1'); // 返回 obj1 或 undefined(如果已被垃圾回收)\n */\nexport class WeakObjectMap<T extends object> {\n private map: Map<string, WeakRef<T>>;\n private finalizationRegistry: FinalizationRegistry<string>;\n\n /**\n * 构造一个新的 WeakObjectMap 实例\n */\n constructor() {\n this.map = new Map();\n this.finalizationRegistry = new FinalizationRegistry((key) => {\n this.map.delete(key);\n });\n }\n\n /**\n * 设置键值对\n * @param key - 字符串键名\n * @param value - 要存储的对象值(会被自动包装为弱引用)\n */\n set(key: string, value: T): void {\n const weakRef = new WeakRef(value);\n this.map.set(key, weakRef);\n this.finalizationRegistry.register(value, key);\n }\n\n /**\n * 获取指定键对应的值\n * @param key - 要查找的键名\n * @returns 如果值存在且未被垃圾回收则返回值,否则返回 undefined\n */\n get(key: string): T | undefined {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() : undefined;\n }\n\n /**\n * 删除指定键的映射\n * @param key - 要删除的键名\n * @returns 如果键存在并已删除则返回 true,否则返回 false\n */\n delete(key: string): boolean {\n return this.map.delete(key);\n }\n\n /**\n * 检查是否存在指定键的映射(且值未被垃圾回收)\n * @param key - 要检查的键名\n * @returns 如果键存在且值未被回收则返回 true,否则返回 false\n */\n has(key: string): boolean {\n const weakRef = this.map.get(key);\n return weakRef ? weakRef.deref() !== undefined : false;\n }\n}\n","/**\n *\n * 基于开发工具\n *\n * Redux DevTools 是一个实用工具,用于开发和调试 Redux 应用程序。\n * FLEXEVENT是基于Redux DevTools 的简单包装,可以让开发者使用Redux DevTools\n * 来查看FLEXEVENT的状态变化\n *\n * import { createStore } from \"@FLEXEVENTjs/react\"\n * import { install } from \"@FLEXEVENTjs/devtools\"\n *\n *\n * const store = createStore({})\n *\n * install()\n *\n */\n\n//@ts-ignore\nimport { legacy_createStore as createStore } from \"redux\";\nimport { WeakObjectMap } from \"./utils/WeakObjectMap\";\nimport { FastEvent } from \"./event\";\nimport { FastEventListenerMeta } from \"./types/FastEventListeners\";\n\nconst initialState = {};\n\nfunction getDefaultFastEventState(instance: FastEvent) {\n return {\n messageCount: 0,\n listenerCount: instance.listenerCount,\n retainMessageCount: instance.retainedMessages.size,\n };\n}\n\nexport class FlexEventDevTools {\n private reduxStore: any;\n private _installed: boolean = false;\n fastEvents = new WeakObjectMap();\n constructor() {\n this.install();\n }\n add(instance: FastEvent) {\n this.fastEvents.set(instance.id, instance);\n\n instance.options.onAddListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__ADD_LISTENER__\",\n event: type,\n listener: listener.name || \"anonymous\",\n emitter: instance.id,\n });\n };\n instance.options.onRemoveListener = (type: string, listener: any) => {\n this.reduxStore.dispatch({\n type: \"__REMOVE_LISTENER__\",\n event: type,\n listener: listener.name || \"anonymous\",\n emitter: instance.id,\n });\n };\n instance.options.onClearListeners = () => {\n this.reduxStore.dispatch({\n type: \"__CLEAR_LISTENERS__\",\n emitter: instance.id,\n });\n };\n instance.options.onAfterExecuteListener = (message, returns, listeners) => {\n const results = returns.map((r) => (r instanceof Error ? `Error(${r.message})` : r));\n const sresults = listeners\n .reduce<FastEventListenerMeta[]>((results, cur) => {\n results.push(...cur.__listeners);\n return results;\n }, [])\n .map(\n (listener, i) =>\n `${listener[0].name || \"anonymous\"}(${listener[2]}) -> ${results[i]} ${listener[3] ? `(tag=${listener[3]})` : \"\"}`,\n );\n\n console.log(\n `FastEvent<\\x1B[31m${message.type}\\x1B[30m> is emit, listeners:`,\n listeners,\n );\n this.reduxStore.dispatch({\n type: message.type,\n payload: message.payload,\n meta: message.meta,\n emitter: instance.id,\n returns: sresults,\n });\n };\n this.reduxStore.dispatch({\n type: \"__ADD_FASTEVENT__\",\n emitter: instance.id,\n });\n }\n remove(instance: FastEvent) {\n if (this.fastEvents.has(instance.id)) {\n this.fastEvents.delete(instance.id);\n }\n }\n private reducer(state: any = initialState, action: any) {\n if (action.type.startsWith(\"@@\")) return state;\n const instance = this.fastEvents.get(action.emitter) as FastEvent;\n if (action.type === \"__ADD_FASTEVENT__\") {\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance),\n };\n } else if (action.type === \"__ADD_LISTENER__\") {\n const eventState = state[action.emitter] || getDefaultFastEventState(instance);\n eventState.listenerCount++;\n return {\n ...state,\n [action.emitter]: {\n ...eventState,\n },\n };\n } else if (action.type === \"__REMOVE_LISTENER__\") {\n const eventState = state[action.emitter];\n if (!eventState) return state;\n eventState.listenerCount++;\n return {\n ...state,\n [action.emitter]: {\n ...eventState,\n },\n };\n } else if (action.type === \"__CLEAR_LISTENERS__\") {\n const eventState = state[action.emitter];\n if (!eventState) return state;\n eventState.listenerCount++;\n return {\n ...state,\n [action.emitter]: getDefaultFastEventState(instance),\n };\n } else {\n const eventState = state[action.emitter];\n if (!eventState) return state;\n eventState.messageCount++;\n eventState.listenerCount = instance.listenerCount;\n eventState.retainMessageCount = instance.retainedMessages.size;\n return {\n ...state,\n [action.emitter]: { ...eventState },\n };\n }\n }\n private install() {\n if (this._installed) return;\n this.reduxStore = createStore(\n this.reducer.bind(this),\n // @ts-ignore\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),\n );\n this._installed = true;\n console.info(\n \"%c FlexEventDevTools installed. Please open <Redux devtools> to view. %c\",\n \"color:red;\",\n \"\",\n );\n }\n}\n\nexport function install() {\n // @ts-ignore\n if (!globalThis.__FLEXEVENT_DEVTOOLS__)\n globalThis.__FLEXEVENT_DEVTOOLS__ = new FlexEventDevTools();\n}\n\ndeclare global {\n // @ts-ignore\n var __FLEXEVENT_DEVTOOLS__: FlexEventDevTools;\n}\n\ninstall();\n"]}

@@ -0,1 +1,33 @@

type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**
* 检查类型是否为多级通配符(包含 **)
* @description 判断字符串类型是否包含多级通配符 "**"
* @example
* type Result1 = IsMultiWildcard<"user/**">;
* // Result1 = true
* type Result2 = IsMultiWildcard<"user/*">;
* // Result2 = false
* type Result3 = IsMultiWildcard<**">;
* // Result3 = true
*/
type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false;
type Join<T extends string[], Delimiter extends string = "/"> = T extends [
infer First extends string,
...infer Rest extends string[]
] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : "";
type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;
type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];
type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T;
/**
* 事件消息相关
*/
interface FastEventMeta {

@@ -5,20 +37,21 @@ }

}
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`;
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
[K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: {
type: ReplaceWildcard<K>;
payload: Events[K];
meta?: Partial<FastEventMeta & M> & Record<string, any>;
};
} & {
[K in keyof Events as K extends WildcardStyle ? never : K]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta: FastEventMeta & M & Record<string, any>;
meta?: Partial<FastEventMeta> & M & Record<string, any>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
})[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
* 事件相关
*/
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
declare enum FastEventListenerFlags {

@@ -55,7 +88,22 @@ Transformed = 1

};
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
*/
type FastEventListenerMeta = [
TypedFastEventListener<any, any>,
number,
number,
string,
number
];
type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type FastListenerExecutorBuilder<T extends Record<string, any>> = (options?: T) => FastListenerExecutor;

@@ -147,7 +195,7 @@

onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean;
onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error');
onError?: "skip" | "abort" | "error" | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | "skip" | "abort" | "error");
};
declare const series: (options?: SeriesExecutorOptions) => FastListenerExecutor;
type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>;
type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, "onError" | "onReturns" | "onStep">;
/**

@@ -154,0 +202,0 @@ * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器

@@ -0,1 +1,33 @@

type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**
* 检查类型是否为多级通配符(包含 **)
* @description 判断字符串类型是否包含多级通配符 "**"
* @example
* type Result1 = IsMultiWildcard<"user/**">;
* // Result1 = true
* type Result2 = IsMultiWildcard<"user/*">;
* // Result2 = false
* type Result3 = IsMultiWildcard<**">;
* // Result3 = true
*/
type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false;
type Join<T extends string[], Delimiter extends string = "/"> = T extends [
infer First extends string,
...infer Rest extends string[]
] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : "";
type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;
type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];
type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T;
/**
* 事件消息相关
*/
interface FastEventMeta {

@@ -5,20 +37,21 @@ }

}
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`;
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
[K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: {
type: ReplaceWildcard<K>;
payload: Events[K];
meta?: Partial<FastEventMeta & M> & Record<string, any>;
};
} & {
[K in keyof Events as K extends WildcardStyle ? never : K]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta: FastEventMeta & M & Record<string, any>;
meta?: Partial<FastEventMeta> & M & Record<string, any>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
})[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
* 事件相关
*/
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
declare enum FastEventListenerFlags {

@@ -55,7 +88,22 @@ Transformed = 1

};
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
*/
type FastEventListenerMeta = [
TypedFastEventListener<any, any>,
number,
number,
string,
number
];
type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type FastListenerExecutorBuilder<T extends Record<string, any>> = (options?: T) => FastListenerExecutor;

@@ -147,7 +195,7 @@

onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean;
onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error');
onError?: "skip" | "abort" | "error" | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | "skip" | "abort" | "error");
};
declare const series: (options?: SeriesExecutorOptions) => FastListenerExecutor;
type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>;
type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, "onError" | "onReturns" | "onStep">;
/**

@@ -154,0 +202,0 @@ * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器

@@ -1,2 +0,2 @@

'use strict';var S=Object.defineProperty;var o=(r,n)=>S(r,"name",{value:n,configurable:true});var F=o(()=>(r,n,t,f)=>(r.forEach(e=>e[2]--),r[0][2]++,[f(r[0][0],n,t)]),"first");var v=o(()=>(r,n,t,f)=>(r.forEach(e=>e[2]--),r[r.length-1][2]++,[f(r[r.length-1][0],n,t)]),"last");var P=o(()=>(r,n,t,f)=>{let e,i;return (!t||t&&!t.abortSignal)&&(i=new AbortController,t||(t={}),t.abortSignal=i.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(f(c[0],n,t)).then(s=>(e||(e=c,c[2]++),i?.abort(),s)))))]},"race");var R=o(()=>(r,n,t,f)=>{let e=Math.floor(Math.random()*r.length);return r.forEach(i=>i[2]--),r[e][2]++,[f(r[e][0],n,t)]},"random");var W=o(()=>(r,n,t,f)=>{let e,i=0;return r.forEach((u,c)=>{u[2]--,(e===void 0||e>u[2])&&(e=u[2],i=c);}),r[i][2]++,[f(r[i][0],n,t)]},"balance");function a(r){return r&&typeof r=="function"}o(a,"isFunction");function d(r){return r&&typeof r=="string"}o(d,"isString");var _=o(r=>{let{reverse:n,onNext:t,onReturns:f,onError:e}=Object.assign({reverse:false,onError:o(()=>{},"onError"),onNext:o(()=>true,"onNext"),onReturns:o((i,u)=>u,"onReturns")},r);return async(i,u,c,s)=>{let p,l,y=0;i.forEach(x=>x[2]--);for(let x=0;x<i.length;x++){let h=i[n?i.length-1-x:x],E=h[0];try{if(a(t)&&t(++y,l,u,c,p)===!1)break;l=await s(E,u,c,!1),a(f)?p=f(p,l):p=l,h[2]++;}catch(b){try{let m=d(e)?e:a(e)&&e(b,u,c);if(m==="skip")continue;if(m==="error"){p=b;break}else if(m==="abort")break}catch{}}}return p}},"series");var _r=o(r=>_(Object.assign({},r,{onError:"abort",onNext:o((n,t,f)=>{f.payload=t;},"onNext")})),"waterfall");var Sr=o(()=>(r,n,t,f)=>r.map(e=>f(e[0],n,t,true)),"parallel");exports.balance=W;exports.first=F;exports.last=v;exports.parallel=Sr;exports.race=P;exports.random=R;exports.series=_;exports.waterfall=_r;//# sourceMappingURL=index.js.map
'use strict';var S=Object.defineProperty;var t=(r,n)=>S(r,"name",{value:n,configurable:true});var j=t(()=>(r,n,o,f)=>(r.forEach(e=>e[2]--),r[0][2]++,[f(r[0][0],n,o)]),"first");var w=t(()=>(r,n,o,f)=>(r.forEach(e=>e[2]--),r[r.length-1][2]++,[f(r[r.length-1][0],n,o)]),"last");var N=t(()=>(r,n,o,f)=>{let e,i;return (!o||o&&!o.abortSignal)&&(i=new AbortController,o||(o={}),o.abortSignal=i.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(f(c[0],n,o)).then(l=>(e||(e=c,c[2]++),i?.abort(),l)))))]},"race");var L=t(()=>(r,n,o,f)=>{let e=Math.floor(Math.random()*r.length);return r.forEach(i=>i[2]--),r[e][2]++,[f(r[e][0],n,o)]},"random");var W=t(()=>(r,n,o,f)=>{let e,i=0;return r.forEach((u,c)=>{u[2]--,(e===void 0||e>u[2])&&(e=u[2],i=c);}),r[i][2]++,[f(r[i][0],n,o)]},"balance");function s(r){return r&&typeof r=="function"}t(s,"isFunction");function d(r){return r&&typeof r=="string"}t(d,"isString");var _=t(r=>{let{reverse:n,onNext:o,onReturns:f,onError:e}=Object.assign({reverse:false,onError:t(()=>{},"onError"),onNext:t(()=>true,"onNext"),onReturns:t((i,u)=>u,"onReturns")},r);return async(i,u,c,l)=>{let p,a,y=0;i.forEach(x=>x[2]--);for(let x=0;x<i.length;x++){let b=i[n?i.length-1-x:x],E=b[0];try{if(s(o)&&o(++y,a,u,c,p)===!1)break;a=await l(E,u,c,!1),s(f)?p=f(p,a):p=a,b[2]++;}catch(h){try{let m=d(e)?e:s(e)&&e(h,u,c);if(m==="skip")continue;if(m==="error"){p=h;break}else if(m==="abort")break}catch{}}}return p}},"series");var dr=t(r=>_(Object.assign({},r,{onError:"abort",onNext:t((n,o,f)=>{f.payload=o;},"onNext")})),"waterfall");var Er=t(()=>(r,n,o,f)=>r.map(e=>f(e[0],n,o,true)),"parallel");exports.balance=W;exports.first=j;exports.last=w;exports.parallel=Er;exports.race=N;exports.random=L;exports.series=_;exports.waterfall=dr;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/utils/expandable.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.js","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastListenerMeta } from \"../types\"\nimport { FastListenerExecutor } from \"./types\"\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n * \n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n * \n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isString } from \"../utils\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerExecutor } from \"./types\"\n\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n * \n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error')\n}\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign({\n reverse: false,\n onError: () => { },\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur\n }, options) as SeriesExecutorOptions\n return async (listeners, message, args, execute) => {\n let results: any = undefined\n let stepResult: any = undefined\n let index: number = 0\n // 全部执行次数-1\n listeners.forEach(listener => listener[2]--)\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i]\n const listener = item[0] as TypedFastEventListener<any, any, any>\n try {\n if (isFunction(onNext) && onNext(++index, stepResult, message, args, results) === false) {\n break\n }\n stepResult = await execute(listener, message, args, false)\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult)\n } else {\n results = stepResult\n }\n // 实际执行次数+1\n item[2]++\n } catch (e: any) {\n try {\n const behavior = isString(onError) ? onError : isFunction(onError) && onError!(e, message, args)\n if (behavior === 'skip') {\n continue\n } else if (behavior === 'error') {\n results = e\n break\n } else if (behavior === 'abort') {\n break\n }\n } catch { }\n }\n }\n return results\n }\n\n}","import { TypedFastEventMessage } from \"../types\"\nimport { series, SeriesExecutorOptions } from \"./series\"\nimport { FastListenerExecutor } from \"./types\"\n\nexport type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>\n\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n * \n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n * \n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: 'abort',\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous\n }\n }) as unknown as SeriesExecutorOptions)\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}
{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.js","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastEventListenerMeta } from \"../types/FastEventListeners\";\nimport { FastListenerExecutor } from \"./types\";\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n *\n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n *\n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastEventListenerMeta | undefined;\n let abortController: AbortController | undefined;\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController();\n if (!args) args = {};\n args.abortSignal = abortController.signal;\n }\n const result = Promise.race(\n listeners.map((listener) => {\n listener[2]--;\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener;\n listener[2]++;\n }\n abortController?.abort();\n return result;\n });\n }),\n );\n return [result];\n };\n};\n","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isString } from \"../utils\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean; // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n *\n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any;\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (\n index: number,\n previous: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n results: any,\n ) => boolean;\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?:\n | \"skip\"\n | \"abort\"\n | \"error\"\n | ((\n e: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => void | \"skip\" | \"abort\" | \"error\");\n};\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign(\n {\n reverse: false,\n onError: () => {},\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur,\n },\n options,\n ) as SeriesExecutorOptions;\n return async (listeners, message, args, execute) => {\n let results: any = undefined;\n let stepResult: any = undefined;\n let index: number = 0;\n // 全部执行次数-1\n listeners.forEach((listener) => listener[2]--);\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i];\n const listener = item[0] as TypedFastEventListener<any, any, any>;\n try {\n if (\n isFunction(onNext) &&\n onNext(++index, stepResult, message, args, results) === false\n ) {\n break;\n }\n stepResult = await execute(listener, message, args, false);\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult);\n } else {\n results = stepResult;\n }\n // 实际执行次数+1\n item[2]++;\n } catch (e: any) {\n try {\n const behavior = isString(onError)\n ? onError\n : isFunction(onError) && onError!(e, message, args);\n if (behavior === \"skip\") {\n continue;\n } else if (behavior === \"error\") {\n results = e;\n break;\n } else if (behavior === \"abort\") {\n break;\n }\n } catch {}\n }\n }\n return results;\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { series, SeriesExecutorOptions } from \"./series\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type WaterfallExecutorOptions = Omit<\n SeriesExecutorOptions,\n \"onError\" | \"onReturns\" | \"onStep\"\n>;\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n *\n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n *\n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(\n Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: \"abort\",\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous;\n },\n }) as unknown as SeriesExecutorOptions,\n );\n};\n","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}

@@ -1,2 +0,2 @@

var S=Object.defineProperty;var o=(r,n)=>S(r,"name",{value:n,configurable:true});var F=o(()=>(r,n,t,f)=>(r.forEach(e=>e[2]--),r[0][2]++,[f(r[0][0],n,t)]),"first");var v=o(()=>(r,n,t,f)=>(r.forEach(e=>e[2]--),r[r.length-1][2]++,[f(r[r.length-1][0],n,t)]),"last");var P=o(()=>(r,n,t,f)=>{let e,i;return (!t||t&&!t.abortSignal)&&(i=new AbortController,t||(t={}),t.abortSignal=i.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(f(c[0],n,t)).then(s=>(e||(e=c,c[2]++),i?.abort(),s)))))]},"race");var R=o(()=>(r,n,t,f)=>{let e=Math.floor(Math.random()*r.length);return r.forEach(i=>i[2]--),r[e][2]++,[f(r[e][0],n,t)]},"random");var W=o(()=>(r,n,t,f)=>{let e,i=0;return r.forEach((u,c)=>{u[2]--,(e===void 0||e>u[2])&&(e=u[2],i=c);}),r[i][2]++,[f(r[i][0],n,t)]},"balance");function a(r){return r&&typeof r=="function"}o(a,"isFunction");function d(r){return r&&typeof r=="string"}o(d,"isString");var _=o(r=>{let{reverse:n,onNext:t,onReturns:f,onError:e}=Object.assign({reverse:false,onError:o(()=>{},"onError"),onNext:o(()=>true,"onNext"),onReturns:o((i,u)=>u,"onReturns")},r);return async(i,u,c,s)=>{let p,l,y=0;i.forEach(x=>x[2]--);for(let x=0;x<i.length;x++){let h=i[n?i.length-1-x:x],E=h[0];try{if(a(t)&&t(++y,l,u,c,p)===!1)break;l=await s(E,u,c,!1),a(f)?p=f(p,l):p=l,h[2]++;}catch(b){try{let m=d(e)?e:a(e)&&e(b,u,c);if(m==="skip")continue;if(m==="error"){p=b;break}else if(m==="abort")break}catch{}}}return p}},"series");var _r=o(r=>_(Object.assign({},r,{onError:"abort",onNext:o((n,t,f)=>{f.payload=t;},"onNext")})),"waterfall");var Sr=o(()=>(r,n,t,f)=>r.map(e=>f(e[0],n,t,true)),"parallel");export{W as balance,F as first,v as last,Sr as parallel,P as race,R as random,_ as series,_r as waterfall};//# sourceMappingURL=index.mjs.map
var S=Object.defineProperty;var t=(r,n)=>S(r,"name",{value:n,configurable:true});var j=t(()=>(r,n,o,f)=>(r.forEach(e=>e[2]--),r[0][2]++,[f(r[0][0],n,o)]),"first");var w=t(()=>(r,n,o,f)=>(r.forEach(e=>e[2]--),r[r.length-1][2]++,[f(r[r.length-1][0],n,o)]),"last");var N=t(()=>(r,n,o,f)=>{let e,i;return (!o||o&&!o.abortSignal)&&(i=new AbortController,o||(o={}),o.abortSignal=i.signal),[Promise.race(r.map(c=>(c[2]--,Promise.resolve(f(c[0],n,o)).then(l=>(e||(e=c,c[2]++),i?.abort(),l)))))]},"race");var L=t(()=>(r,n,o,f)=>{let e=Math.floor(Math.random()*r.length);return r.forEach(i=>i[2]--),r[e][2]++,[f(r[e][0],n,o)]},"random");var W=t(()=>(r,n,o,f)=>{let e,i=0;return r.forEach((u,c)=>{u[2]--,(e===void 0||e>u[2])&&(e=u[2],i=c);}),r[i][2]++,[f(r[i][0],n,o)]},"balance");function s(r){return r&&typeof r=="function"}t(s,"isFunction");function d(r){return r&&typeof r=="string"}t(d,"isString");var _=t(r=>{let{reverse:n,onNext:o,onReturns:f,onError:e}=Object.assign({reverse:false,onError:t(()=>{},"onError"),onNext:t(()=>true,"onNext"),onReturns:t((i,u)=>u,"onReturns")},r);return async(i,u,c,l)=>{let p,a,y=0;i.forEach(x=>x[2]--);for(let x=0;x<i.length;x++){let b=i[n?i.length-1-x:x],E=b[0];try{if(s(o)&&o(++y,a,u,c,p)===!1)break;a=await l(E,u,c,!1),s(f)?p=f(p,a):p=a,b[2]++;}catch(h){try{let m=d(e)?e:s(e)&&e(h,u,c);if(m==="skip")continue;if(m==="error"){p=h;break}else if(m==="abort")break}catch{}}}return p}},"series");var dr=t(r=>_(Object.assign({},r,{onError:"abort",onNext:t((n,o,f)=>{f.payload=o;},"onNext")})),"waterfall");var Er=t(()=>(r,n,o,f)=>r.map(e=>f(e[0],n,o,true)),"parallel");export{W as balance,j as first,w as last,Er as parallel,N as race,L as random,_ as series,dr as waterfall};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/utils/expandable.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastListenerMeta } from \"../types\"\nimport { FastListenerExecutor } from \"./types\"\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n * \n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n * \n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastListenerMeta | undefined\n let abortController: AbortController | undefined\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController()\n if (!args) args = {}\n args.abortSignal = abortController.signal\n }\n const result = Promise.race(listeners.map(listener => {\n listener[2]--\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener\n listener[2]++\n }\n abortController?.abort()\n return result\n })\n }))\n return [\n result\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","/**\n * \n * \n * 用于包括输入值为可展开的对象\n * \n * \n * 用在emit事件\n * \n * emitter1 = new FastEvent()\n * emitter2 = new FastEvent()\n * \n * emitter1.on(\"xxx\",(message)=>{\n * return emitter2.emit(message)\n * })\n * \n * emitter2.on(\"xxx\",()=>1)\n * emitter2.on(\"xxx\",()=>2)\n * \n * const results = emitter1.emit(\"xxx\")\n * // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]\n * \n * expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开\n * \n * \n * \n * \n * emitter1.on(\"xxx\",(message)=>{\n * // 告诉emitter2.emit返回的是一个expandable对象\n * // 然后在内部就展开此对象\n * return emitter2.emit(message)\n * })\n * \n* const results = emitter1.emit(\"xxx\")\n * // results == [1,2]\n * \n * 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查\n * 这多了一个迭代操作,为了不影响性能,可以关闭此特性\n * options.expandEmitResults = false\n * \n * \n */\n\nexport const __expandable__ = Symbol.for('__expandable__')\n\nexport function expandable(value: any) {\n value[__expandable__] = true\n return value\n}\n\nexport function isExpandable(value: any) {\n return value && value[__expandable__]\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isString } from \"../utils\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerExecutor } from \"./types\"\n\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n * \n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (index: number, previous: any, message: TypedFastEventMessage, args: FastEventListenerArgs, results: any) => boolean\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?: 'skip' | 'abort' | 'error' | ((e: any, message: TypedFastEventMessage, args: FastEventListenerArgs) => void | 'skip' | 'abort' | 'error')\n}\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign({\n reverse: false,\n onError: () => { },\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur\n }, options) as SeriesExecutorOptions\n return async (listeners, message, args, execute) => {\n let results: any = undefined\n let stepResult: any = undefined\n let index: number = 0\n // 全部执行次数-1\n listeners.forEach(listener => listener[2]--)\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i]\n const listener = item[0] as TypedFastEventListener<any, any, any>\n try {\n if (isFunction(onNext) && onNext(++index, stepResult, message, args, results) === false) {\n break\n }\n stepResult = await execute(listener, message, args, false)\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult)\n } else {\n results = stepResult\n }\n // 实际执行次数+1\n item[2]++\n } catch (e: any) {\n try {\n const behavior = isString(onError) ? onError : isFunction(onError) && onError!(e, message, args)\n if (behavior === 'skip') {\n continue\n } else if (behavior === 'error') {\n results = e\n break\n } else if (behavior === 'abort') {\n break\n }\n } catch { }\n }\n }\n return results\n }\n\n}","import { TypedFastEventMessage } from \"../types\"\nimport { series, SeriesExecutorOptions } from \"./series\"\nimport { FastListenerExecutor } from \"./types\"\n\nexport type WaterfallExecutorOptions = Omit<SeriesExecutorOptions, 'onError' | 'onReturns' | 'onStep'>\n\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n * \n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n * \n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: 'abort',\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous\n }\n }) as unknown as SeriesExecutorOptions)\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}
{"version":3,"sources":["../../src/executors/first.ts","../../src/executors/last.ts","../../src/executors/race.ts","../../src/executors/random.ts","../../src/executors/balance.ts","../../src/utils/isFunction.ts","../../src/utils/isString.ts","../../src/executors/series.ts","../../src/executors/waterfall.ts","../../src/executors/parallel.ts"],"names":["first","__name","listeners","message","args","execute","forEach","listener","last","length","race","winner","abortController","abortSignal","AbortController","signal","Promise","map","resolve","then","result","abort","random","index","Math","floor","balance","count","i","undefined","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","Object","assign","_","cur","results","stepResult","item","e","behavior","waterfall","previous","payload","parallel"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行第一个监听器的执行器函数\n * \n * @param listeners - 监听器数组,每个元素是一个包含监听器函数的元组\n * @param message - 要传递给监听器的消息对象\n * @param args - 要传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回一个数组,包含第一个监听器的执行结果\n */\nexport const first = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[0][2]++\n return [\n execute(listeners[0][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 执行监听器列表中的最后一个监听器\n * @param listeners - 监听器数组\n * @param message - 事件消息\n * @param args - 事件参数\n * @param execute - 执行器函数\n * @returns 返回包含最后一个监听器执行结果的数组\n */\nexport const last = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n listeners.forEach(listener => listener[2]--)\n listeners[listeners.length - 1][2]++\n return [\n execute(listeners[listeners.length - 1][0], message, args)\n ]\n }\n}","import { FastEventListenerMeta } from \"../types/FastEventListeners\";\nimport { FastListenerExecutor } from \"./types\";\n\n/**\n * 竞态执行器 - 同时执行多个监听器,只返回最快完成的结果\n *\n * @param listeners - 监听器元数据列表\n * @param message - 要处理的消息\n * @param args - 执行参数\n * @param execute - 执行函数\n * @returns 包含最快完成监听器结果的数组\n *\n * @description\n * - 只有第一个完成的监听器结果会被返回\n * - 其他未完成的监听器会被中止\n * - 如果没有提供中止信号,会自动创建一个\n * - 胜出的监听器计数会被恢复\n */\nexport const race = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n let winner: FastEventListenerMeta | undefined;\n let abortController: AbortController | undefined;\n if (!args || (args && !args.abortSignal)) {\n abortController = new AbortController();\n if (!args) args = {};\n args.abortSignal = abortController.signal;\n }\n const result = Promise.race(\n listeners.map((listener) => {\n listener[2]--;\n return Promise.resolve(execute(listener[0], message, args)).then((result: any) => {\n if (!winner) {\n winner = listener;\n listener[2]++;\n }\n abortController?.abort();\n return result;\n });\n }),\n );\n return [result];\n };\n};\n","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 随机执行器 - 从监听器列表中随机选择一个监听器执行\n * \n * @param listeners - 监听器列表,每个元素为 [监听器函数, 优先级, 执行次数] 的元组\n * @param message - 要处理的消息对象\n * @param args - 传递给监听器的额外参数\n * @param execute - 执行监听器的函数\n * @returns 返回包含执行结果的数组\n * \n * @remarks\n * - 随机选择一个监听器执行\n * - 所有监听器的执行次数计数减1\n * - 被选中执行的监听器执行次数加1\n */\nexport const random = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n const index = Math.floor(Math.random() * listeners.length)\n listeners.forEach(listener => listener[2]--)\n listeners[index][2]++\n return [\n execute(listeners[index][0], message, args)\n ]\n }\n}","import { FastListenerExecutor } from \"./types\"\n\n/**\n * 负载均衡执行器,用于在多个监听器中选择执行次数最少的进行调用\n * @param listeners 监听器列表\n * @param message 消息对象\n * @param args 参数列表\n * @param execute 执行函数\n * @returns 返回包含单个执行结果的数组\n * \n * 执行策略:\n * 1. 遍历所有监听器,找出执行次数最少的监听器\n * 2. 由于监听器执行后会自动+1,因此先对所有监听器执行次数-1,以抵消后续的+1\n * 3. 只执行选中的监听器,其他监听器不执行\n */\nexport const balance = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n // 找出listeners里面所有执行器的执行次数最少的项\n let count: number\n let index: number = 0\n listeners.forEach((listener, i) => {\n // 为什么所有监听器的执行次数均减1?\n // 因为监听器执行完毕后会自动+1,但是在balance执行器中,只有一个会监听器会执行,因此在此先减一用来抵消后续的+1\n listener[2]--\n if (count === undefined || count > listener[2]) {\n count = listener[2]\n index = i\n }\n })\n listeners[index][2]++\n return [execute(listeners[index][0], message, args)]\n }\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","export function isString(str: any): str is string {\n return str && typeof (str) === \"string\"\n}","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isString } from \"../utils\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type SeriesExecutorOptions = {\n reverse?: boolean; // 反向执行监听器\n /**\n * 控制监听器如何返回结果\n *\n * 提供一个reduce函数对所有监听器返回结果进行reduce操作\n * series({\n * onReturns: (result, cur)=>{\n * if(!result) result = []\n * return result.push(cur)\n * }\n * })\n */\n onReturns?: (results: any, cur: any) => any;\n // 当调用下一个监听器前执行,返回false或触发错误均不再执行后续的监听器\n // 可以在此修改message\n onNext?: (\n index: number,\n previous: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n results: any,\n ) => boolean;\n // 当执行监听器出错时的回调,返回false中止后续执行\n onError?:\n | \"skip\"\n | \"abort\"\n | \"error\"\n | ((\n e: any,\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => void | \"skip\" | \"abort\" | \"error\");\n};\n\nexport const series = (options?: SeriesExecutorOptions): FastListenerExecutor => {\n const { reverse, onNext, onReturns, onError } = Object.assign(\n {\n reverse: false,\n onError: () => {},\n onNext: () => true,\n onReturns: (_: any, cur: any) => cur,\n },\n options,\n ) as SeriesExecutorOptions;\n return async (listeners, message, args, execute) => {\n let results: any = undefined;\n let stepResult: any = undefined;\n let index: number = 0;\n // 全部执行次数-1\n listeners.forEach((listener) => listener[2]--);\n for (let i = 0; i < listeners.length; i++) {\n const item = listeners[reverse ? listeners.length - 1 - i : i];\n const listener = item[0] as TypedFastEventListener<any, any, any>;\n try {\n if (\n isFunction(onNext) &&\n onNext(++index, stepResult, message, args, results) === false\n ) {\n break;\n }\n stepResult = await execute(listener, message, args, false);\n if (isFunction(onReturns)) {\n results = onReturns(results, stepResult);\n } else {\n results = stepResult;\n }\n // 实际执行次数+1\n item[2]++;\n } catch (e: any) {\n try {\n const behavior = isString(onError)\n ? onError\n : isFunction(onError) && onError!(e, message, args);\n if (behavior === \"skip\") {\n continue;\n } else if (behavior === \"error\") {\n results = e;\n break;\n } else if (behavior === \"abort\") {\n break;\n }\n } catch {}\n }\n }\n return results;\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { series, SeriesExecutorOptions } from \"./series\";\nimport { FastListenerExecutor } from \"./types\";\n\nexport type WaterfallExecutorOptions = Omit<\n SeriesExecutorOptions,\n \"onError\" | \"onReturns\" | \"onStep\"\n>;\n\n/**\n * 创建一个瀑布流执行器,用于按顺序执行监听器,并将前一个监听器的结果传递给下一个监听器\n * 如果出错就不再执行后续的监听器\n *\n * @param options - 执行器配置选项\n * @returns 返回一个 FastListener 执行器实例\n *\n * @remarks\n * - 当任一监听器执行出错时,会中断后续监听器的执行\n * - 每个监听器的执行结果会作为下一个监听器的 payload 参数\n */\nexport const waterfall = (options?: WaterfallExecutorOptions): FastListenerExecutor => {\n return series(\n Object.assign({}, options, {\n // 出错时不再执行后续的监听器\n onError: \"abort\",\n // 将结果作为payload传给下一个监听器\n onNext: (index: number, previous: any, message: TypedFastEventMessage) => {\n message.payload = previous;\n },\n }) as unknown as SeriesExecutorOptions,\n );\n};\n","import { FastListenerExecutor } from \"./types\"\n\n/**\n * \n */\nexport const parallel = (): FastListenerExecutor => {\n return (listeners, message, args, execute) => {\n return listeners.map(listener => execute(listener[0], message, args, true))\n }\n}"]}

@@ -1,2 +0,2 @@

'use strict';var R=Object.defineProperty;var z=(i,t,e)=>t in i?R(i,t,{enumerable:true,configurable:true,writable:true,value:e}):i[t]=e;var f=(i,t)=>R(i,"name",{value:t,configurable:true});var h=(i,t,e)=>z(i,typeof t!="symbol"?t+"":t,e);var H=Symbol.for("__FastEvent__"),J=Symbol.for("__FastEventScope__"),S=class S extends Error{constructor(t){super(t);}};f(S,"FastEventError");var m=S,A=class A extends m{};f(A,"TimeoutError");var C=A,M=class M extends m{};f(M,"UnboundError");var x=M,w=class w extends m{};f(w,"AbortError");var d=w,F=class F extends m{};f(F,"CancelError");var y=F,j=class j extends m{};f(j,"QueueOverflowError");var W=j,b={clearRetain:Symbol.for("ClearRetain")};var _=function(i){return i[i.Transformed=1]="Transformed",i}({});function L(i,t,e,s){let n,r={},o={};return typeof i[0]=="object"?(Object.assign(o,i[0]),r=typeof i[1]=="boolean"?{retain:i[1]}:i[1]||{},n=i[0].meta):(o.type=i[0],o.payload=i[1],r=typeof i[2]=="boolean"?{retain:i[2]}:i[2]||{}),n=Object.assign({},t,e,r.meta,n),Object.keys(n).length===0&&(n=void 0),o.meta=n,r.executor===void 0&&(r.executor=s),[o,r]}f(L,"parseEmitArgs");function D(i){return i?typeof i=="object"&&"__FastEventScope__"in i:false}f(D,"isFastEventScope");function E(i,t,e){let s=i[0],n=D(i[1])?i[1]:void 0,r=(n?i[2]:i[1])||{};return r.meta=Object.assign({},t,r?.meta),r.context=r.context!==void 0?r.context:e,[s,n,r]}f(E,"parseScopeArgs");function g(i,t){return Object.defineProperty(i,"name",{value:t||"anonymous",configurable:true}),i}f(g,"renameFn");function u(i){return i&&typeof i=="function"}f(u,"isFunction");var T=class T{constructor(t){h(this,"__FastEventScope__",true);h(this,"_options",{});h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(t));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(t,e,s){this.emitter=t,this._options=Object.assign(this._options,{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}_initOptions(t){return t}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;t||(t=(this._options.onMessage||this.onMessage).bind(this));let s=this;return g(function(r,o){let p=o.rawEventType||r.type;if(p.startsWith(e)){let c=((o.flags||0)&_.Transformed)>0?r:Object.assign({},r,{type:p.substring(e.length)});return t.call(s.context,c,o)}},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){if(!this.emitter)throw new x;let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===b.clearRetain)return this.emitter.emit(this._getScopeType(arguments[0]));let[t,e]=L(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(t,e),t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}_transformMessage(t,e){u(this._options.transform)&&(e.rawEventType=this._getScopeType(t.type),e.flags=(e.flags||0)|_.Transformed,t.payload=this._options.transform.call(this,t));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[t,e,s]=E(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new T,n.bind(this.emitter,this.prefix+t,s),n}onMessage(t,e){}};f(T,"FastEventScope");var v=T;function O(i,t){if(i.length!==t.length&&i.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:i.length-t.length+1}).fill("*"));for(let s=0;s<i.length;s++)if(e[s]!=="*"&&e[s]!==i[s])return false;return true}f(O,"isPathMatched");function N(i,t){let e=[];for(;;){let s=i.findIndex(n=>t(n));if(s===-1){e.push(s);break}i.splice(s,1);}return e}f(N,"removeItem");var V=Symbol.for("__expandable__");function Tt(i){return i[V]=true,i}f(Tt,"expandable");function I(i){return i&&i[V]}f(I,"isExpandable");function B(i){for(let t=0;t<i.length;t++){let e=i[t];Array.isArray(e)&&I(e)&&(i.splice(t,1,...e),t+=e.length-1);}return i}f(B,"expandEmitResults");function X(i){return i&&typeof i=="object"&&"off"in i&&"listener"in i}f(X,"isSubsctiber");function $(i,t){return i.catch(e=>(t&&t(e),Promise.resolve(e)))}f($,"tryReturnError");var P=class P{constructor(t){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true},this._initOptions(t)),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}_initOptions(t){return t}_addListener(t,e,s){let{count:n,prepend:r}=s,o=0;return [this._forEachNodes(t,a=>{let c=[e,n,0,s.tag,s.flags];r?(a.__listeners.splice(0,0,c),o=0):(a.__listeners.push(c),o=a.__listeners.length-1),this.listenerCount++;}),o]}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let n=0;n<t.length;n++){let r=t[n];if(r in s||(s[r]={__listeners:[]}),n===t.length-1){let o=s[r];return e(o,s),o}else s=s[r];}}_removeListener(t,e,s){s&&N(t.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let r=n===s;return r&&(this.listenerCount--,u(this._options.onRemoveListener)&&this._options.onRemoveListener(e.join(this._delimiter),s)),r});}_pipeListener(t,e){return e.forEach(s=>{t=g(s(t),t.name);}),t}on(){let t=arguments[0],e=u(arguments[1])?arguments[1]:(this._options.onMessage||this.onMessage).bind(this),s=Object.assign({count:0,flags:0,prepend:false},u(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");if(u(this._options.onAddListener)){let a=this._options.onAddListener(t,e,s);if(a===false)throw new y;if(X(a))return a}let n=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),u(s.filter)||u(s.off)){let a=e;e=g(function(c,l){if(u(s.off)&&s.off.call(this,c,l)){p();return}if(u(s.filter)){if(s.filter.call(this,c,l))return a.call(this,c,l)}else return a.call(this,c,l)},e.name);}let[r,o]=this._addListener(n,e,s),p=f(()=>r&&this._removeListener(r,n,e),"off");return this._emitRetainMessage(t,r,o),{off:p,listener:e}}once(){return u(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t,e){}off(){let t=arguments,e=u(t[0])?void 0:t[0],s=u(t[0])?t[0]:t[1],n=e?e.split(this._delimiter):[],r=e?e.includes("*"):false;if(e&&!r)this._traverseToPath(this.listeners,n,o=>{s?this._removeListener(o,n,s):e&&(o.__listeners=[]);});else {let o=r?[]:n;this._traverseListeners(this.listeners,o,(p,a)=>{(s!==void 0||r&&O(p,n))&&(s?this._removeListener(a,n,s):a.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(n,r)=>{s+=r.__listeners.length,r.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,n)=>{e+=n.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}u(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitRetainMessage(t,e,s){let n=[];if(t.includes("*")){let r=t.split(this._delimiter);this.retainedMessages.forEach((o,p)=>{let a=p.split(this._delimiter);O(a,r)&&n.push(o);});}else this.retainedMessages.has(t)&&n.push(this.retainedMessages.get(t));e&&n.forEach(r=>{this._executeListeners([e],r,{},o=>o[0]===e.__listeners[s][0]);});}_traverseToPath(t,e,s,n=0,r){if(n>=e.length){s(t);return}let o=e[n];if(r===true){this._traverseToPath(t,e,s,n+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,n+1),"**"in t&&this._traverseToPath(t["**"],e,s,n+1,true),o in t&&this._traverseToPath(t[o],e,s,n+1);}_traverseListeners(t,e,s){let n=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{n=o;});let r=f((o,p,a)=>{p(a,o);for(let[c,l]of Object.entries(o))c.startsWith("__")||l&&r(l,p,[...a,c]);},"traverseNodes");r(n,s,[]);}_onListenerError(t,e,s,n){if(n instanceof Error&&(n._emitter=`${t.name||"anonymous"}:${e.type}`),u(this._options.onListenerError))try{this._options.onListenerError.call(this,n,t,e,s);}catch{}if(this._options.ignoreErrors)return n;throw n}_setListenerFlags(t,e){return !t||t===0?e:t|e}_executeListener(t,e,s,n=false){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new d(t.name));let r=((s?.flags||0)&_.Transformed)>0,o=t.call(this.context,r?e.payload:e,s);return n&&o&&o instanceof Promise&&(o=$(o,p=>this._onListenerError(t,e,s,p))),o}catch(r){return this._onListenerError(t,e,s,r)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(u(e))return e}_executeListeners(t,e,s,n){if(!t||t.length===0)return [];let r=t.reduce((p,a)=>p.concat(a.__listeners.filter(c=>u(n)?n(c,a):true).map((c,l)=>[c,l,a.__listeners])),[]);u(this._options.transform)&&(s||(s={}),s.rawEventType=e.type,e.payload=this._options.transform.call(this,e),s.flags=this._setListenerFlags(s.flags,_.Transformed)),this._decListenerExecCount(r);let o=this._getListenerExecutor(s);if(o){let p=o(r.map(a=>a[0]),e,s,this._executeListener.bind(this));return Array.isArray(p)?p:[p]}else return r.map(p=>this._executeListener(p[0][0],e,s,true))}_decListenerExecCount(t){for(let e=t.length-1;e>=0;e--){let s=t[e][0];s[2]++,s[1]>0&&s[1]<=s[2]&&t[e][2].splice(e,1);}}getListeners(t){let e=[],s=t.split(this._delimiter);return this._traverseToPath(this.listeners,s,n=>{e.push(n);}),e[0].__listeners}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===b.clearRetain)return this.retainedMessages.delete(arguments[0]),[];let[t,e]=L(arguments,this.options.meta);u(e.parseArgs)&&e.parseArgs(t,e);let s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let n=[],r=[];if(this._traverseToPath(this.listeners,s,o=>{r.push(o);}),u(this._options.onBeforeExecuteListener)){let o=this._options.onBeforeExecuteListener.call(this,t,e);if(Array.isArray(o))return o;if(o===false)throw new d(t.type)}return u(this._options.transform)&&(t.payload=this._options.transform.call(this,t),e.rawEventType=t.type,e.flags=(e.flags||0)|_.Transformed),n.push(...this._executeListeners(r,t,e)),u(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,n,r),this._options.expandEmitResults&&B(n),n}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,n)=>{let r,o,p=f(a=>{clearTimeout(r),o&&o.off(),s(a);},"listener");e&&e>0&&(r=setTimeout(()=>{o&&o.off(),n(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,p);})}scope(){let[t,e,s]=E(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new v,n.bind(this,t,s),n}};f(P,"FastEvent");var q=P;function Kt(i){return i?typeof i=="object"&&"type"in i:false}f(Kt,"isFastEventMessage");function kt(i){return i&&typeof i=="string"}f(kt,"isString");function te(i){return typeof i=="function"&&(i.toString().startsWith("class ")||i.prototype?.constructor===i)}f(te,"isClass");function ie(i){return i?typeof i=="object"&&"__FastEvent__"in i:false}f(ie,"isFastEvent");exports.AbortError=d;exports.CancelError=y;exports.FastEvent=q;exports.FastEventDirectives=b;exports.FastEventError=m;exports.FastEventListenerFlags=_;exports.FastEventScope=v;exports.QueueOverflowError=W;exports.TimeoutError=C;exports.UnboundError=x;exports.__FastEventScope__=J;exports.__FastEvent__=H;exports.__expandable__=V;exports.expandable=Tt;exports.isClass=te;exports.isExpandable=I;exports.isFastEvent=ie;exports.isFastEventMessage=Kt;exports.isFastEventScope=D;exports.isFunction=u;exports.isPathMatched=O;exports.isString=kt;exports.isSubsctiber=X;//# sourceMappingURL=index.js.map
'use strict';var W=Object.defineProperty;var Z=(o,e,t)=>e in o?W(o,e,{enumerable:true,configurable:true,writable:true,value:t}):o[e]=t;var n=(o,e)=>W(o,"name",{value:e,configurable:true});var p=(o,e,t)=>Z(o,typeof e!="symbol"?e+"":e,t);var ee=Symbol.for("__FastEvent__"),te=Symbol.for("__FastEventScope__"),A=class A extends Error{constructor(e){super(e);}};n(A,"FastEventError");var m=A,O=class O extends m{};n(O,"TimeoutError");var I=O,M=class M extends m{};n(M,"UnboundError");var E=M,P=class P extends m{};n(P,"AbortError");var _=P,j=class j extends m{};n(j,"CancelError");var y=j,F=class F extends m{};n(F,"QueueOverflowError");var V=F;var x=(function(o){return o[o.Transformed=1]="Transformed",o})({});function w(o,e,t,r){let s,i={},f={};return typeof o[0]=="object"?(Object.assign(f,o[0]),i=typeof o[1]=="boolean"?{retain:o[1]}:o[1]||{},s=o[0].meta):(f.type=o[0],f.payload=o[1],i=typeof o[2]=="boolean"?{retain:o[2]}:o[2]||{}),s=Object.assign({},e,t,i.meta,s),Object.keys(s).length===0?(s=void 0,delete f.meta):f.meta=s,i.executor===void 0&&(i.executor=r),[f,i]}n(w,"parseEmitArgs");function $(o){return o?typeof o=="object"&&"__FastEventScope__"in o:false}n($,"isFastEventScope");function L(o,e,t){let r=o[0],s=$(o[1])?o[1]:void 0,i=(s?o[2]:o[1])||{};return i.meta=Object.assign({},e,i?.meta),i.context=i.context!==void 0?i.context:t,[r,s,i]}n(L,"parseScopeArgs");function d(o,e){return Object.defineProperty(o,"name",{value:e||"anonymous",configurable:true}),o}n(d,"renameFn");function h(o){return o&&typeof o=="function"}n(h,"isFunction");var T=class T{constructor(e){p(this,"__FastEventScope__",true);p(this,"__events__");p(this,"__meta__");p(this,"__context__");p(this,"_options",{});p(this,"prefix","");p(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,r){this.emitter=e,this._options=Object.assign(this._options,{scope:t},r),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let r=this;return d(function(i,f){let a=f.rawEventType||i.type;if(a.startsWith(t)){let l=((f.flags||0)&x.Transformed)>0?i:Object.assign({},i,{type:a.substring(t.length)});return e.call(r.context,l,f)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new E;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[e,t]=w(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){h(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|x.Transformed,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],r=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},r,{type:this._fixScopeType(r.type)})}scope(){let[e,t,r]=L(arguments,this.options.meta,this.options.context),s;return t?s=t:s=new T,s.bind(this.emitter,this.prefix+e,r),s}};n(T,"FastEventScope");var S=T;function R(o,e){let t=o.length,r=e.length;if(t!==r&&(r===0||e[r-1]!=="**"))return false;if(r>0&&e[r-1]==="**"){for(let s=0;s<r-1;s++)if(e[s]!=="*"&&e[s]!==o[s])return false;return true}for(let s=0;s<t;s++)if(e[s]!=="*"&&e[s]!==o[s])return false;return true}n(R,"isPathMatched");function k(o,e){let t=[];for(let r=o.length-1;r>=0;r--)e(o[r])&&(t.push(r),o.splice(r,1));return t.reverse()}n(k,"removeItem");function We(o){return o?typeof o=="object"&&"type"in o:false}n(We,"isFastEventMessage");function U(o){return o&&typeof o=="string"}n(U,"isString");var B=Symbol.for("__expandable__");function Be(o){return o[B]=true,o}n(Be,"expandable");function q(o){return o&&o[B]}n(q,"isExpandable");function z(o){return o&&typeof o=="object"&&"off"in o&&"listener"in o}n(z,"isSubsctiber");function Ke(o){return typeof o=="function"&&(o.toString().startsWith("class ")||o.prototype?.constructor===o)}n(Ke,"isClass");function Ze(o){return o?typeof o=="object"&&"__FastEvent__"in o:false}n(Ze,"isFastEvent");var G=n(()=>(o,e,t,r)=>o.map(s=>r(s[0],e,t,true)),"parallel");function H(o){for(let e=0;e<o.length;e++){let t=o[e];Array.isArray(t)&&q(t)&&(o.splice(e,1,...t),e+=t.length-1);}return o}n(H,"expandEmitResults");function J(o,e){return o.catch(t=>(e&&e(t),Promise.resolve(t)))}n(J,"tryReturnError");var N=class N{constructor(e,t,r={}){p(this,"eventEmitter");p(this,"eventName");p(this,"buffer",[]);p(this,"resolvers",[]);p(this,"errorResolvers",[]);p(this,"isStopped",false);p(this,"error",null);p(this,"options");p(this,"currentSize");p(this,"hasNewMessage",false);p(this,"_listener");p(this,"_ready",false);p(this,"_listenOptions");p(this,"_cleanups",[]);this.eventEmitter=e,this.eventName=t;let s=20,i=100;this.options={size:r.size??s,maxExpandSize:r.maxExpandSize??i,expandOverflow:r.expandOverflow??"slide",overflow:r.overflow??"slide",lifetime:r.lifetime??0,onPush:r.onPush,onPop:r.onPop,onDrop:r.onDrop,onError:r.onError??(()=>true),signal:r.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let r=n(()=>{this.off(!0);},"offFn");this.options.signal.addEventListener("abort",r),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",r);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let r=this.buffer.shift();return this.options.onDrop&&r&&this.options.onDrop(r[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let r=e;if(this.resolvers.length>0){this.resolvers.shift()({value:r,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(r):this.handleOverflow(r);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new _);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let r=this.options.onPop(this.buffer,this.hasNewMessage);r?[e,t]=r:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};n(N,"FastEventIterator");var D=N;function K(o,e,t={}){return new D(o,e,t)}n(K,"createAsyncEventIterator");function X(o,e){return Array.isArray(e)&&e.forEach(t=>{o=d(t(o),o.name);}),o}n(X,"wrapPipeListener");var C=class C{constructor(e){p(this,"__FastEvent__",true);p(this,"listeners",{__listeners:[]});p(this,"_options");p(this,"_delimiter","/");p(this,"_context");p(this,"retainedMessages",new Map);p(this,"listenerCount",0);p(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:G()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}_initOptions(e){return e}_addListener(e,t,r){let{count:s,prepend:i}=r,f=0;return [this._forEachNodes(e,u=>{let l=[t,s,0,r.tag,r.flags];i?(u.__listeners.splice(0,0,l),f=0):(u.__listeners.push(l),f=u.__listeners.length-1),this.listenerCount++;}),f]}_enableDevTools(){this.options.debug&&globalThis.__FASTEVENT_DEVTOOLS__&&globalThis.__FASTEVENT_DEVTOOLS__.add(this);}_forEachNodes(e,t){if(e.length===0)return;let r=this.listeners;for(let s=0;s<e.length;s++){let i=e[s];if(i in r||(r[i]={__listeners:[]}),s===e.length-1){let f=r[i];return t(f,r),f}else r=r[i];}}_removeListener(e,t,r){r&&k(e.__listeners,s=>{s=Array.isArray(s)?s[0]:s;let i=s===r;return i&&(this.listenerCount--,h(this._options.onRemoveListener)&&this._options.onRemoveListener(t.join(this._delimiter),r)),i});}_onAddListener(e,t,r){if(h(this._options.onAddListener)){let s=this._options.onAddListener(e,t,r);if(s===false)throw new y;if(z(s))return s}}on(){let e=arguments[0],t=null,r,s=!h(arguments[1]);s?r=arguments[1]||{}:(t=arguments[1],r=arguments[2]||{});let i=Object.assign({count:0,flags:0,prepend:false},r);if(e.length===0)throw new Error("event type cannot be empty");if(s||t===null){let c=Object.assign({overflow:"expand",size:10,maxExpandSize:100},i.iterable),g=K(this,e,c);return g.create(i),this._onAddListener(e,g.listener,i),g}if(h(this._options.onAddListener)){let c=this._options.onAddListener(e,t,i);if(c===false)throw new y;if(z(c))return c}let f=e.split(this._delimiter);if(i.pipes&&i.pipes.length>0&&(t=X(t,i.pipes)),h(i.filter)||h(i.off)){let c=t,g=n(()=>a&&this._removeListener(a,f,t),"off");t=d(function(b,v){if(h(i.off)&&i.off.call(this,b,v)){g();return}if(h(i.filter)){if(i.filter.call(this,b,v))return c.call(this,b,v)}else return c.call(this,b,v)},t.name);}let[a,u]=this._addListener(f,t,i),l=n(()=>a&&this._removeListener(a,f,t),"off");return this._emitRetainMessage(e,a,u),{off:l,listener:t,[Symbol.dispose](){l();}}}once(){return h(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments,t=h(e[0])?void 0:e[0],r=h(e[0])?e[0]:e[1],s=t?t.split(this._delimiter):[],i=t?t.includes("*"):false;if(t&&!i)this._traverseToPath(this.listeners,s,f=>{r?this._removeListener(f,s,r):t&&(f.__listeners=[]);});else {let f=i?[]:s;this._traverseListeners(this.listeners,f,(a,u)=>{(r!==void 0||i&&R(a,s))&&(r?this._removeListener(u,s,r):u.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),r=0;this._traverseListeners(this.listeners,t,(s,i)=>{r+=i.__listeners.length,i.__listeners=[];}),this.listenerCount-=r,this._removeRetainedEvents(e);}else {let t=0;this._traverseListeners(this.listeners,[],(r,s)=>{t+=s.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}h(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,r){let s=[];if(e.includes("*")){let i=e.split(this._delimiter);this.retainedMessages.forEach((f,a)=>{let u=a.split(this._delimiter);R(u,i)&&s.push(f);});}else this.retainedMessages.has(e)&&s.push(this.retainedMessages.get(e));t&&s.forEach(i=>{this._executeListeners([t],i,{},f=>f[0]===t.__listeners[r][0]);});}_traverseToPath(e,t,r,s=0,i){if(s>=t.length){r(e);return}let f=t[s];if(i===true){this._traverseToPath(e,t,r,s+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,r,s+1),"**"in e&&this._traverseToPath(e["**"],t,r,s+1,true),f in e&&this._traverseToPath(e[f],t,r,s+1);}_traverseListeners(e,t,r){let s=e;t&&t.length>0&&this._traverseToPath(e,t,f=>{s=f;});let i=n((f,a,u)=>{a(u,f);for(let[l,c]of Object.entries(f))l.startsWith("__")||c&&i(c,a,[...u,l]);},"traverseNodes");i(s,r,[]);}_onListenerError(e,t,r,s){if(s instanceof Error&&(s._emitter=`${e.name||"anonymous"}:${t.type}`),h(this._options.onListenerError))try{this._options.onListenerError.call(this,s,e,t,r);}catch{}if(this._options.ignoreErrors)return s;throw s}_setListenerFlags(e,t){return !e||e===0?t:e|t}_executeListener(e,t,r,s=false){try{if(r&&r.abortSignal&&r.abortSignal.aborted)return this._onListenerError(e,t,r,new _(e.name));let i=((r?.flags||0)&x.Transformed)>0,f=e.call(this.context,i?t.payload:t,r);return s&&f&&f instanceof Promise&&(f=J(f,a=>this._onListenerError(e,t,r,a))),f}catch(i){return this._onListenerError(e,t,r,i)}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(h(t))return t}_executeListeners(e,t,r,s){if(!e||e.length===0)return [];let i=[];for(let a of e){let u=0;for(let l of a.__listeners)(!s||s(l,a))&&i.push([l,u++,a.__listeners]);}this._decListenerExecCount(i);let f=this._getListenerExecutor(r);if(f){let a=f(i.map(u=>u[0]),t,r,this._executeListener.bind(this));return Array.isArray(a)?a:[a]}else return i.map(a=>this._executeListener(a[0][0],t,r,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let r=e[t][0];r[2]++,r[1]>0&&r[1]<=r[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],r=e.split(this._delimiter);return this._traverseToPath(this.listeners,r,s=>{t.push(s);}),t[0].__listeners}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=w(arguments,this.options.meta);h(t.parseArgs)&&t.parseArgs(e,t);let r=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let s=[],i=[];if(this._traverseToPath(this.listeners,r,f=>{i.push(f);}),h(this._options.onBeforeExecuteListener)){let f=this._options.onBeforeExecuteListener.call(this,e,t);if(Array.isArray(f))return f;if(f===false)throw new _(e.type)}return h(this._options.transform)&&(e.payload=this._options.transform.call(this,e),t.rawEventType=e.type,t.flags=(t.flags||0)|x.Transformed),s.push(...this._executeListeners(i,e,t)),h(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,e,s,i),this._options.expandEmitResults&&H(s),s}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((r,s)=>{let i,f,a=n(u=>{clearTimeout(i),f?.off(),r(u);},"listener");t&&t>0&&(i=setTimeout(()=>{f?.off(),s(new Error("wait for event<"+e+"> is timeout"));},t)),f=this.on(e,a);})}scope(){let[e,t,r]=L(arguments,this.options.meta,this.options.context),s;return t?s=t:s=new S,s.bind(this,e,r),s}};n(C,"FastEvent");var Y=C;exports.AbortError=_;exports.CancelError=y;exports.FastEvent=Y;exports.FastEventError=m;exports.FastEventListenerFlags=x;exports.FastEventScope=S;exports.QueueOverflowError=V;exports.TimeoutError=I;exports.UnboundError=E;exports.__FastEventScope__=te;exports.__FastEvent__=ee;exports.__expandable__=B;exports.expandable=Be;exports.isClass=Ke;exports.isExpandable=q;exports.isFastEvent=Ze;exports.isFastEventMessage=We;exports.isFastEventScope=$;exports.isFunction=h;exports.isPathMatched=R;exports.isString=U;exports.isSubsctiber=z;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,2 +0,2 @@

var R=Object.defineProperty;var z=(i,t,e)=>t in i?R(i,t,{enumerable:true,configurable:true,writable:true,value:e}):i[t]=e;var f=(i,t)=>R(i,"name",{value:t,configurable:true});var h=(i,t,e)=>z(i,typeof t!="symbol"?t+"":t,e);var H=Symbol.for("__FastEvent__"),J=Symbol.for("__FastEventScope__"),S=class S extends Error{constructor(t){super(t);}};f(S,"FastEventError");var m=S,A=class A extends m{};f(A,"TimeoutError");var C=A,M=class M extends m{};f(M,"UnboundError");var x=M,w=class w extends m{};f(w,"AbortError");var d=w,F=class F extends m{};f(F,"CancelError");var y=F,j=class j extends m{};f(j,"QueueOverflowError");var W=j,b={clearRetain:Symbol.for("ClearRetain")};var _=function(i){return i[i.Transformed=1]="Transformed",i}({});function L(i,t,e,s){let n,r={},o={};return typeof i[0]=="object"?(Object.assign(o,i[0]),r=typeof i[1]=="boolean"?{retain:i[1]}:i[1]||{},n=i[0].meta):(o.type=i[0],o.payload=i[1],r=typeof i[2]=="boolean"?{retain:i[2]}:i[2]||{}),n=Object.assign({},t,e,r.meta,n),Object.keys(n).length===0&&(n=void 0),o.meta=n,r.executor===void 0&&(r.executor=s),[o,r]}f(L,"parseEmitArgs");function D(i){return i?typeof i=="object"&&"__FastEventScope__"in i:false}f(D,"isFastEventScope");function E(i,t,e){let s=i[0],n=D(i[1])?i[1]:void 0,r=(n?i[2]:i[1])||{};return r.meta=Object.assign({},t,r?.meta),r.context=r.context!==void 0?r.context:e,[s,n,r]}f(E,"parseScopeArgs");function g(i,t){return Object.defineProperty(i,"name",{value:t||"anonymous",configurable:true}),i}f(g,"renameFn");function u(i){return i&&typeof i=="function"}f(u,"isFunction");var T=class T{constructor(t){h(this,"__FastEventScope__",true);h(this,"_options",{});h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(t));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(t,e,s){this.emitter=t,this._options=Object.assign(this._options,{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}_initOptions(t){return t}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;t||(t=(this._options.onMessage||this.onMessage).bind(this));let s=this;return g(function(r,o){let p=o.rawEventType||r.type;if(p.startsWith(e)){let c=((o.flags||0)&_.Transformed)>0?r:Object.assign({},r,{type:p.substring(e.length)});return t.call(s.context,c,o)}},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){if(!this.emitter)throw new x;let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===b.clearRetain)return this.emitter.emit(this._getScopeType(arguments[0]));let[t,e]=L(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(t,e),t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}_transformMessage(t,e){u(this._options.transform)&&(e.rawEventType=this._getScopeType(t.type),e.flags=(e.flags||0)|_.Transformed,t.payload=this._options.transform.call(this,t));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[t,e,s]=E(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new T,n.bind(this.emitter,this.prefix+t,s),n}onMessage(t,e){}};f(T,"FastEventScope");var v=T;function O(i,t){if(i.length!==t.length&&i.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:i.length-t.length+1}).fill("*"));for(let s=0;s<i.length;s++)if(e[s]!=="*"&&e[s]!==i[s])return false;return true}f(O,"isPathMatched");function N(i,t){let e=[];for(;;){let s=i.findIndex(n=>t(n));if(s===-1){e.push(s);break}i.splice(s,1);}return e}f(N,"removeItem");var V=Symbol.for("__expandable__");function Tt(i){return i[V]=true,i}f(Tt,"expandable");function I(i){return i&&i[V]}f(I,"isExpandable");function B(i){for(let t=0;t<i.length;t++){let e=i[t];Array.isArray(e)&&I(e)&&(i.splice(t,1,...e),t+=e.length-1);}return i}f(B,"expandEmitResults");function X(i){return i&&typeof i=="object"&&"off"in i&&"listener"in i}f(X,"isSubsctiber");function $(i,t){return i.catch(e=>(t&&t(e),Promise.resolve(e)))}f($,"tryReturnError");var P=class P{constructor(t){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true},this._initOptions(t)),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}_initOptions(t){return t}_addListener(t,e,s){let{count:n,prepend:r}=s,o=0;return [this._forEachNodes(t,a=>{let c=[e,n,0,s.tag,s.flags];r?(a.__listeners.splice(0,0,c),o=0):(a.__listeners.push(c),o=a.__listeners.length-1),this.listenerCount++;}),o]}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let n=0;n<t.length;n++){let r=t[n];if(r in s||(s[r]={__listeners:[]}),n===t.length-1){let o=s[r];return e(o,s),o}else s=s[r];}}_removeListener(t,e,s){s&&N(t.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let r=n===s;return r&&(this.listenerCount--,u(this._options.onRemoveListener)&&this._options.onRemoveListener(e.join(this._delimiter),s)),r});}_pipeListener(t,e){return e.forEach(s=>{t=g(s(t),t.name);}),t}on(){let t=arguments[0],e=u(arguments[1])?arguments[1]:(this._options.onMessage||this.onMessage).bind(this),s=Object.assign({count:0,flags:0,prepend:false},u(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");if(u(this._options.onAddListener)){let a=this._options.onAddListener(t,e,s);if(a===false)throw new y;if(X(a))return a}let n=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),u(s.filter)||u(s.off)){let a=e;e=g(function(c,l){if(u(s.off)&&s.off.call(this,c,l)){p();return}if(u(s.filter)){if(s.filter.call(this,c,l))return a.call(this,c,l)}else return a.call(this,c,l)},e.name);}let[r,o]=this._addListener(n,e,s),p=f(()=>r&&this._removeListener(r,n,e),"off");return this._emitRetainMessage(t,r,o),{off:p,listener:e}}once(){return u(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t,e){}off(){let t=arguments,e=u(t[0])?void 0:t[0],s=u(t[0])?t[0]:t[1],n=e?e.split(this._delimiter):[],r=e?e.includes("*"):false;if(e&&!r)this._traverseToPath(this.listeners,n,o=>{s?this._removeListener(o,n,s):e&&(o.__listeners=[]);});else {let o=r?[]:n;this._traverseListeners(this.listeners,o,(p,a)=>{(s!==void 0||r&&O(p,n))&&(s?this._removeListener(a,n,s):a.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(n,r)=>{s+=r.__listeners.length,r.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,n)=>{e+=n.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}u(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitRetainMessage(t,e,s){let n=[];if(t.includes("*")){let r=t.split(this._delimiter);this.retainedMessages.forEach((o,p)=>{let a=p.split(this._delimiter);O(a,r)&&n.push(o);});}else this.retainedMessages.has(t)&&n.push(this.retainedMessages.get(t));e&&n.forEach(r=>{this._executeListeners([e],r,{},o=>o[0]===e.__listeners[s][0]);});}_traverseToPath(t,e,s,n=0,r){if(n>=e.length){s(t);return}let o=e[n];if(r===true){this._traverseToPath(t,e,s,n+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,n+1),"**"in t&&this._traverseToPath(t["**"],e,s,n+1,true),o in t&&this._traverseToPath(t[o],e,s,n+1);}_traverseListeners(t,e,s){let n=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{n=o;});let r=f((o,p,a)=>{p(a,o);for(let[c,l]of Object.entries(o))c.startsWith("__")||l&&r(l,p,[...a,c]);},"traverseNodes");r(n,s,[]);}_onListenerError(t,e,s,n){if(n instanceof Error&&(n._emitter=`${t.name||"anonymous"}:${e.type}`),u(this._options.onListenerError))try{this._options.onListenerError.call(this,n,t,e,s);}catch{}if(this._options.ignoreErrors)return n;throw n}_setListenerFlags(t,e){return !t||t===0?e:t|e}_executeListener(t,e,s,n=false){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new d(t.name));let r=((s?.flags||0)&_.Transformed)>0,o=t.call(this.context,r?e.payload:e,s);return n&&o&&o instanceof Promise&&(o=$(o,p=>this._onListenerError(t,e,s,p))),o}catch(r){return this._onListenerError(t,e,s,r)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(u(e))return e}_executeListeners(t,e,s,n){if(!t||t.length===0)return [];let r=t.reduce((p,a)=>p.concat(a.__listeners.filter(c=>u(n)?n(c,a):true).map((c,l)=>[c,l,a.__listeners])),[]);u(this._options.transform)&&(s||(s={}),s.rawEventType=e.type,e.payload=this._options.transform.call(this,e),s.flags=this._setListenerFlags(s.flags,_.Transformed)),this._decListenerExecCount(r);let o=this._getListenerExecutor(s);if(o){let p=o(r.map(a=>a[0]),e,s,this._executeListener.bind(this));return Array.isArray(p)?p:[p]}else return r.map(p=>this._executeListener(p[0][0],e,s,true))}_decListenerExecCount(t){for(let e=t.length-1;e>=0;e--){let s=t[e][0];s[2]++,s[1]>0&&s[1]<=s[2]&&t[e][2].splice(e,1);}}getListeners(t){let e=[],s=t.split(this._delimiter);return this._traverseToPath(this.listeners,s,n=>{e.push(n);}),e[0].__listeners}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===b.clearRetain)return this.retainedMessages.delete(arguments[0]),[];let[t,e]=L(arguments,this.options.meta);u(e.parseArgs)&&e.parseArgs(t,e);let s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let n=[],r=[];if(this._traverseToPath(this.listeners,s,o=>{r.push(o);}),u(this._options.onBeforeExecuteListener)){let o=this._options.onBeforeExecuteListener.call(this,t,e);if(Array.isArray(o))return o;if(o===false)throw new d(t.type)}return u(this._options.transform)&&(t.payload=this._options.transform.call(this,t),e.rawEventType=t.type,e.flags=(e.flags||0)|_.Transformed),n.push(...this._executeListeners(r,t,e)),u(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,n,r),this._options.expandEmitResults&&B(n),n}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,n)=>{let r,o,p=f(a=>{clearTimeout(r),o&&o.off(),s(a);},"listener");e&&e>0&&(r=setTimeout(()=>{o&&o.off(),n(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,p);})}scope(){let[t,e,s]=E(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new v,n.bind(this,t,s),n}};f(P,"FastEvent");var q=P;function Kt(i){return i?typeof i=="object"&&"type"in i:false}f(Kt,"isFastEventMessage");function kt(i){return i&&typeof i=="string"}f(kt,"isString");function te(i){return typeof i=="function"&&(i.toString().startsWith("class ")||i.prototype?.constructor===i)}f(te,"isClass");function ie(i){return i?typeof i=="object"&&"__FastEvent__"in i:false}f(ie,"isFastEvent");export{d as AbortError,y as CancelError,q as FastEvent,b as FastEventDirectives,m as FastEventError,_ as FastEventListenerFlags,v as FastEventScope,W as QueueOverflowError,C as TimeoutError,x as UnboundError,J as __FastEventScope__,H as __FastEvent__,V as __expandable__,Tt as expandable,te as isClass,I as isExpandable,ie as isFastEvent,Kt as isFastEventMessage,D as isFastEventScope,u as isFunction,O as isPathMatched,kt as isString,X as isSubsctiber};//# sourceMappingURL=index.mjs.map
var W=Object.defineProperty;var Z=(o,e,t)=>e in o?W(o,e,{enumerable:true,configurable:true,writable:true,value:t}):o[e]=t;var n=(o,e)=>W(o,"name",{value:e,configurable:true});var p=(o,e,t)=>Z(o,typeof e!="symbol"?e+"":e,t);var ee=Symbol.for("__FastEvent__"),te=Symbol.for("__FastEventScope__"),A=class A extends Error{constructor(e){super(e);}};n(A,"FastEventError");var m=A,O=class O extends m{};n(O,"TimeoutError");var I=O,M=class M extends m{};n(M,"UnboundError");var E=M,P=class P extends m{};n(P,"AbortError");var _=P,j=class j extends m{};n(j,"CancelError");var y=j,F=class F extends m{};n(F,"QueueOverflowError");var V=F;var x=(function(o){return o[o.Transformed=1]="Transformed",o})({});function w(o,e,t,r){let s,i={},f={};return typeof o[0]=="object"?(Object.assign(f,o[0]),i=typeof o[1]=="boolean"?{retain:o[1]}:o[1]||{},s=o[0].meta):(f.type=o[0],f.payload=o[1],i=typeof o[2]=="boolean"?{retain:o[2]}:o[2]||{}),s=Object.assign({},e,t,i.meta,s),Object.keys(s).length===0?(s=void 0,delete f.meta):f.meta=s,i.executor===void 0&&(i.executor=r),[f,i]}n(w,"parseEmitArgs");function $(o){return o?typeof o=="object"&&"__FastEventScope__"in o:false}n($,"isFastEventScope");function L(o,e,t){let r=o[0],s=$(o[1])?o[1]:void 0,i=(s?o[2]:o[1])||{};return i.meta=Object.assign({},e,i?.meta),i.context=i.context!==void 0?i.context:t,[r,s,i]}n(L,"parseScopeArgs");function d(o,e){return Object.defineProperty(o,"name",{value:e||"anonymous",configurable:true}),o}n(d,"renameFn");function h(o){return o&&typeof o=="function"}n(h,"isFunction");var T=class T{constructor(e){p(this,"__FastEventScope__",true);p(this,"__events__");p(this,"__meta__");p(this,"__context__");p(this,"_options",{});p(this,"prefix","");p(this,"emitter");this._options=Object.assign({},this._initOptions(e));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(e,t,r){this.emitter=e,this._options=Object.assign(this._options,{scope:t},r),t.length>0&&!t.endsWith(e.options.delimiter)&&(this.prefix=t+e.options.delimiter);}_initOptions(e){return e}_getScopeListener(e){let t=this.prefix;if(t.length===0)return e;if(!e)throw new Error;let r=this;return d(function(i,f){let a=f.rawEventType||i.type;if(a.startsWith(t)){let l=((f.flags||0)&x.Transformed)>0?i:Object.assign({},i,{type:a.substring(t.length)});return e.call(r.context,l,f)}},e.name)}_getScopeType(e){return e===void 0?void 0:this.prefix+e}_fixScopeType(e){return e.startsWith(this.prefix)?e.substring(this.prefix.length):e}on(){if(!this.emitter)throw new E;let e=[...arguments];return e[0]=this._getScopeType(e[0]),e[1]=this._getScopeListener(e[1]),this.emitter.on(...e)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments;typeof e[0]=="string"&&(e[0]=this._getScopeType(e[0])),this.emitter.off(...e);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){let[e,t]=w(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(e,t),e.type=this._getScopeType(e.type),this.emitter.emit(e,t)}_transformMessage(e,t){h(this._options.transform)&&(t.rawEventType=this._getScopeType(e.type),t.flags=(t.flags||0)|x.Transformed,e.payload=this._options.transform.call(this,e));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}async waitFor(){let e=arguments[0],t=arguments[1],r=await this.emitter.waitFor(this._getScopeType(e),t);return Object.assign({},r,{type:this._fixScopeType(r.type)})}scope(){let[e,t,r]=L(arguments,this.options.meta,this.options.context),s;return t?s=t:s=new T,s.bind(this.emitter,this.prefix+e,r),s}};n(T,"FastEventScope");var S=T;function R(o,e){let t=o.length,r=e.length;if(t!==r&&(r===0||e[r-1]!=="**"))return false;if(r>0&&e[r-1]==="**"){for(let s=0;s<r-1;s++)if(e[s]!=="*"&&e[s]!==o[s])return false;return true}for(let s=0;s<t;s++)if(e[s]!=="*"&&e[s]!==o[s])return false;return true}n(R,"isPathMatched");function k(o,e){let t=[];for(let r=o.length-1;r>=0;r--)e(o[r])&&(t.push(r),o.splice(r,1));return t.reverse()}n(k,"removeItem");function We(o){return o?typeof o=="object"&&"type"in o:false}n(We,"isFastEventMessage");function U(o){return o&&typeof o=="string"}n(U,"isString");var B=Symbol.for("__expandable__");function Be(o){return o[B]=true,o}n(Be,"expandable");function q(o){return o&&o[B]}n(q,"isExpandable");function z(o){return o&&typeof o=="object"&&"off"in o&&"listener"in o}n(z,"isSubsctiber");function Ke(o){return typeof o=="function"&&(o.toString().startsWith("class ")||o.prototype?.constructor===o)}n(Ke,"isClass");function Ze(o){return o?typeof o=="object"&&"__FastEvent__"in o:false}n(Ze,"isFastEvent");var G=n(()=>(o,e,t,r)=>o.map(s=>r(s[0],e,t,true)),"parallel");function H(o){for(let e=0;e<o.length;e++){let t=o[e];Array.isArray(t)&&q(t)&&(o.splice(e,1,...t),e+=t.length-1);}return o}n(H,"expandEmitResults");function J(o,e){return o.catch(t=>(e&&e(t),Promise.resolve(t)))}n(J,"tryReturnError");var N=class N{constructor(e,t,r={}){p(this,"eventEmitter");p(this,"eventName");p(this,"buffer",[]);p(this,"resolvers",[]);p(this,"errorResolvers",[]);p(this,"isStopped",false);p(this,"error",null);p(this,"options");p(this,"currentSize");p(this,"hasNewMessage",false);p(this,"_listener");p(this,"_ready",false);p(this,"_listenOptions");p(this,"_cleanups",[]);this.eventEmitter=e,this.eventName=t;let s=20,i=100;this.options={size:r.size??s,maxExpandSize:r.maxExpandSize??i,expandOverflow:r.expandOverflow??"slide",overflow:r.overflow??"slide",lifetime:r.lifetime??0,onPush:r.onPush,onPop:r.onPop,onDrop:r.onDrop,onError:r.onError??(()=>true),signal:r.signal},this.currentSize=this.options.size,this._listener=this.onMessage.bind(this);}get listener(){return this._listener}get ready(){return this._ready}create(e){if(!this._ready){this._listenOptions=e;try{let t=this.eventEmitter.on(this.eventName,this._listener,e);if(this._cleanups.push(()=>t.off()),this.options.signal&&!this.options.signal.aborted){let r=n(()=>{this.off(!0);},"offFn");this.options.signal.addEventListener("abort",r),this._cleanups.push(()=>{this.options.signal.removeEventListener("abort",r);});}}finally{this._ready=true;}}}push(e){this.options.onPush?this.options.onPush(e,this.buffer):this.buffer.push(this.options.lifetime>0?[e,Date.now()]:[e,0]);}handleOverflow(e){switch(this.buffer.length>=this.options.maxExpandSize&&this.options.overflow==="expand"?this.options.expandOverflow:this.options.overflow){case "drop":return this.options.onDrop&&this.options.onDrop(e),false;case "expand":return this.currentSize=Math.min(this.currentSize+this.options.size,this.options.maxExpandSize),this.push(e),true;case "slide":let r=this.buffer.shift();return this.options.onDrop&&r&&this.options.onDrop(r[0]),this.push(e),true;case "throw":throw this.options.onDrop&&this.options.onDrop(e),new Error(`EventIterator queue overflow: buffer size (${this.currentSize}) exceeded`);default:return false}}onMessage(e,t){if(this.isStopped)return;let r=e;if(this.resolvers.length>0){this.resolvers.shift()({value:r,done:false});return}this.hasNewMessage=true,this.buffer.length<this.currentSize?this.push(r):this.handleOverflow(r);}off(e){this._ready&&(this.isStopped||(this.isStopped=true,this._cleanups.forEach(t=>t()),this._cleanups=[],this.buffer=[],this._ready=false,e?(this.errorResolvers.forEach(t=>{t(new _);}),this.errorResolvers=[]):(this.resolvers.forEach(t=>{t({value:void 0,done:true});}),this.resolvers=[]),this._ready=false));}async next(){if(this.error)return Promise.reject(this.error);if(this.isStopped&&this.buffer.length===0)return {value:void 0,done:true};if(this.buffer.length>0){let e,t;if(this.options.onPop){let r=this.options.onPop(this.buffer,this.hasNewMessage);r?[e,t]=r:[e,t]=this.buffer.shift()||[void 0,0];}else [e,t]=this.buffer.shift()||[void 0,0];if(this.hasNewMessage=false,e!==void 0)return this.options.lifetime>0&&Date.now()-t>this.options.lifetime?(this.options.onDrop&&this.options.onDrop(e),this.next()):{value:e,done:false}}return new Promise((e,t)=>{this.resolvers.push(e),this.errorResolvers.push(t);})}[Symbol.asyncIterator](){return this}async done(){return this.off(),{value:void 0,done:true}}async throw(e){return this.error=e,this.off(),Promise.reject(e)}async return(){return this.off(),{value:void 0,done:true}}[Symbol.dispose](){this.off();}on(){this.create(this._listenOptions),this.isStopped=false;}};n(N,"FastEventIterator");var D=N;function K(o,e,t={}){return new D(o,e,t)}n(K,"createAsyncEventIterator");function X(o,e){return Array.isArray(e)&&e.forEach(t=>{o=d(t(o),o.name);}),o}n(X,"wrapPipeListener");var C=class C{constructor(e){p(this,"__FastEvent__",true);p(this,"listeners",{__listeners:[]});p(this,"_options");p(this,"_delimiter","/");p(this,"_context");p(this,"retainedMessages",new Map);p(this,"listenerCount",0);p(this,"types",null);this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true,executor:G()},this._initOptions(e)),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}_initOptions(e){return e}_addListener(e,t,r){let{count:s,prepend:i}=r,f=0;return [this._forEachNodes(e,u=>{let l=[t,s,0,r.tag,r.flags];i?(u.__listeners.splice(0,0,l),f=0):(u.__listeners.push(l),f=u.__listeners.length-1),this.listenerCount++;}),f]}_enableDevTools(){this.options.debug&&globalThis.__FASTEVENT_DEVTOOLS__&&globalThis.__FASTEVENT_DEVTOOLS__.add(this);}_forEachNodes(e,t){if(e.length===0)return;let r=this.listeners;for(let s=0;s<e.length;s++){let i=e[s];if(i in r||(r[i]={__listeners:[]}),s===e.length-1){let f=r[i];return t(f,r),f}else r=r[i];}}_removeListener(e,t,r){r&&k(e.__listeners,s=>{s=Array.isArray(s)?s[0]:s;let i=s===r;return i&&(this.listenerCount--,h(this._options.onRemoveListener)&&this._options.onRemoveListener(t.join(this._delimiter),r)),i});}_onAddListener(e,t,r){if(h(this._options.onAddListener)){let s=this._options.onAddListener(e,t,r);if(s===false)throw new y;if(z(s))return s}}on(){let e=arguments[0],t=null,r,s=!h(arguments[1]);s?r=arguments[1]||{}:(t=arguments[1],r=arguments[2]||{});let i=Object.assign({count:0,flags:0,prepend:false},r);if(e.length===0)throw new Error("event type cannot be empty");if(s||t===null){let c=Object.assign({overflow:"expand",size:10,maxExpandSize:100},i.iterable),g=K(this,e,c);return g.create(i),this._onAddListener(e,g.listener,i),g}if(h(this._options.onAddListener)){let c=this._options.onAddListener(e,t,i);if(c===false)throw new y;if(z(c))return c}let f=e.split(this._delimiter);if(i.pipes&&i.pipes.length>0&&(t=X(t,i.pipes)),h(i.filter)||h(i.off)){let c=t,g=n(()=>a&&this._removeListener(a,f,t),"off");t=d(function(b,v){if(h(i.off)&&i.off.call(this,b,v)){g();return}if(h(i.filter)){if(i.filter.call(this,b,v))return c.call(this,b,v)}else return c.call(this,b,v)},t.name);}let[a,u]=this._addListener(f,t,i),l=n(()=>a&&this._removeListener(a,f,t),"off");return this._emitRetainMessage(e,a,u),{off:l,listener:t,[Symbol.dispose](){l();}}}once(){return h(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let e=arguments,t=h(e[0])?void 0:e[0],r=h(e[0])?e[0]:e[1],s=t?t.split(this._delimiter):[],i=t?t.includes("*"):false;if(t&&!i)this._traverseToPath(this.listeners,s,f=>{r?this._removeListener(f,s,r):t&&(f.__listeners=[]);});else {let f=i?[]:s;this._traverseListeners(this.listeners,f,(a,u)=>{(r!==void 0||i&&R(a,s))&&(r?this._removeListener(u,s,r):u.__listeners=[]);});}}offAll(e){if(e){let t=e.split(this._delimiter),r=0;this._traverseListeners(this.listeners,t,(s,i)=>{r+=i.__listeners.length,i.__listeners=[];}),this.listenerCount-=r,this._removeRetainedEvents(e);}else {let t=0;this._traverseListeners(this.listeners,[],(r,s)=>{t+=s.__listeners.length;}),this.listenerCount-=t,this.retainedMessages.clear(),this.listeners={__listeners:[]};}h(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(e){e||this.retainedMessages.clear(),e?.endsWith(this._delimiter)&&(e+=this._delimiter),this.retainedMessages.delete(e);for(let t of this.retainedMessages.keys())t.startsWith(e)&&this.retainedMessages.delete(t);}clear(e){this.offAll(e),this._removeRetainedEvents(e);}_emitRetainMessage(e,t,r){let s=[];if(e.includes("*")){let i=e.split(this._delimiter);this.retainedMessages.forEach((f,a)=>{let u=a.split(this._delimiter);R(u,i)&&s.push(f);});}else this.retainedMessages.has(e)&&s.push(this.retainedMessages.get(e));t&&s.forEach(i=>{this._executeListeners([t],i,{},f=>f[0]===t.__listeners[r][0]);});}_traverseToPath(e,t,r,s=0,i){if(s>=t.length){r(e);return}let f=t[s];if(i===true){this._traverseToPath(e,t,r,s+1,true);return}"*"in e&&this._traverseToPath(e["*"],t,r,s+1),"**"in e&&this._traverseToPath(e["**"],t,r,s+1,true),f in e&&this._traverseToPath(e[f],t,r,s+1);}_traverseListeners(e,t,r){let s=e;t&&t.length>0&&this._traverseToPath(e,t,f=>{s=f;});let i=n((f,a,u)=>{a(u,f);for(let[l,c]of Object.entries(f))l.startsWith("__")||c&&i(c,a,[...u,l]);},"traverseNodes");i(s,r,[]);}_onListenerError(e,t,r,s){if(s instanceof Error&&(s._emitter=`${e.name||"anonymous"}:${t.type}`),h(this._options.onListenerError))try{this._options.onListenerError.call(this,s,e,t,r);}catch{}if(this._options.ignoreErrors)return s;throw s}_setListenerFlags(e,t){return !e||e===0?t:e|t}_executeListener(e,t,r,s=false){try{if(r&&r.abortSignal&&r.abortSignal.aborted)return this._onListenerError(e,t,r,new _(e.name));let i=((r?.flags||0)&x.Transformed)>0,f=e.call(this.context,i?t.payload:t,r);return s&&f&&f instanceof Promise&&(f=J(f,a=>this._onListenerError(e,t,r,a))),f}catch(i){return this._onListenerError(e,t,r,i)}}_getListenerExecutor(e){if(!e)return;let t=e.executor||this._options.executor;if(h(t))return t}_executeListeners(e,t,r,s){if(!e||e.length===0)return [];let i=[];for(let a of e){let u=0;for(let l of a.__listeners)(!s||s(l,a))&&i.push([l,u++,a.__listeners]);}this._decListenerExecCount(i);let f=this._getListenerExecutor(r);if(f){let a=f(i.map(u=>u[0]),t,r,this._executeListener.bind(this));return Array.isArray(a)?a:[a]}else return i.map(a=>this._executeListener(a[0][0],t,r,true))}_decListenerExecCount(e){for(let t=e.length-1;t>=0;t--){let r=e[t][0];r[2]++,r[1]>0&&r[1]<=r[2]&&e[t][2].splice(t,1);}}getListeners(e){let t=[],r=e.split(this._delimiter);return this._traverseToPath(this.listeners,r,s=>{t.push(s);}),t[0].__listeners}clearRetainMessages(e){e?this.retainedMessages.delete(e):this.retainedMessages.clear();}emit(){let[e,t]=w(arguments,this.options.meta);h(t.parseArgs)&&t.parseArgs(e,t);let r=e.type.split(this._delimiter);t.retain&&this.retainedMessages.set(e.type,e);let s=[],i=[];if(this._traverseToPath(this.listeners,r,f=>{i.push(f);}),h(this._options.onBeforeExecuteListener)){let f=this._options.onBeforeExecuteListener.call(this,e,t);if(Array.isArray(f))return f;if(f===false)throw new _(e.type)}return h(this._options.transform)&&(e.payload=this._options.transform.call(this,e),t.rawEventType=e.type,t.flags=(t.flags||0)|x.Transformed),s.push(...this._executeListeners(i,e,t)),h(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,e,s,i),this._options.expandEmitResults&&H(s),s}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(t=>t.status==="fulfilled"?t.value:t.reason)}waitFor(){let e=arguments[0],t=arguments[1];return new Promise((r,s)=>{let i,f,a=n(u=>{clearTimeout(i),f?.off(),r(u);},"listener");t&&t>0&&(i=setTimeout(()=>{f?.off(),s(new Error("wait for event<"+e+"> is timeout"));},t)),f=this.on(e,a);})}scope(){let[e,t,r]=L(arguments,this.options.meta,this.options.context),s;return t?s=t:s=new S,s.bind(this,e,r),s}};n(C,"FastEvent");var Y=C;export{_ as AbortError,y as CancelError,Y as FastEvent,m as FastEventError,x as FastEventListenerFlags,S as FastEventScope,V as QueueOverflowError,I as TimeoutError,E as UnboundError,te as __FastEventScope__,ee as __FastEvent__,B as __expandable__,Be as expandable,Ke as isClass,q as isExpandable,Ze as isFastEvent,We as isFastEventMessage,$ as isFastEventScope,h as isFunction,R as isPathMatched,U as isString,z as isSubsctiber};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,3 +0,33 @@

type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**
* 检查类型是否为多级通配符(包含 **)
* @description 判断字符串类型是否包含多级通配符 "**"
* @example
* type Result1 = IsMultiWildcard<"user/**">;
* // Result1 = true
* type Result2 = IsMultiWildcard<"user/*">;
* // Result2 = false
* type Result3 = IsMultiWildcard<**">;
* // Result3 = true
*/
type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false;
type Join<T extends string[], Delimiter extends string = "/"> = T extends [
infer First extends string,
...infer Rest extends string[]
] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : "";
type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;
type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];
type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T;
/**
* 事件消息相关
*/
interface FastEventMeta {

@@ -7,20 +37,23 @@ }

}
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`;
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
[K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: {
type: ReplaceWildcard<K>;
payload: Events[K];
meta?: Partial<FastEventMeta & M> & Record<string, any>;
};
} & {
[K in keyof Events as K extends WildcardStyle ? never : K]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta: FastEventMeta & M & Record<string, any>;
meta?: Partial<FastEventMeta> & M & Record<string, any>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
})[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
* 事件相关
*/
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
declare enum FastEventListenerFlags {

@@ -57,6 +90,21 @@ Transformed = 1

};
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
*/
type FastEventListenerMeta = [
TypedFastEventListener<any, any>,
number,
number,
string,
number
];
type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;

@@ -67,8 +115,8 @@

}
type FastQueuePriority = 'none';
type FastQueueOverflows = "drop" | "expand" | 'slide' | 'throw';
type FastQueuePriority = "none";
type FastQueueOverflows = "drop" | "expand" | "slide" | "throw";
type QueueListenerPipeOptions = {
size?: number;
maxExpandSize?: number;
expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
expandOverflow?: Omit<FastQueueOverflows, "expand">;
overflow?: FastQueueOverflows;

@@ -86,2 +134,3 @@ lifetime?: number;

interface RetryListenerPipeOptions {
retries?: number;
interval?: number | ((retryCount: number) => number);

@@ -92,7 +141,7 @@ drop?: (message: TypedFastEventMessage, error: Error) => void;

* 创建一个重试管道,在监听器执行失败时自动重试
* @param count 最大重试次数
* @param retries 最大重试次数
* @param options 配置选项
* @returns FastListenerPipe
*/
declare const retry: (count: number, options?: RetryListenerPipeOptions) => FastListenerPipe;
declare function retry(options?: RetryListenerPipeOptions): FastListenerPipe;

@@ -99,0 +148,0 @@ /**

@@ -1,3 +0,33 @@

type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
/**
* 检查类型是否为多级通配符(包含 **)
* @description 判断字符串类型是否包含多级通配符 "**"
* @example
* type Result1 = IsMultiWildcard<"user/**">;
* // Result1 = true
* type Result2 = IsMultiWildcard<"user/*">;
* // Result2 = false
* type Result3 = IsMultiWildcard<**">;
* // Result3 = true
*/
type IsMultiWildcard<T extends string> = T extends `${string}/**` | "**" ? true : false;
type Join<T extends string[], Delimiter extends string = "/"> = T extends [
infer First extends string,
...infer Rest extends string[]
] ? Rest["length"] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : "";
type Split<S extends string, Delimiter extends string = "/"> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
type ProcessSegment<S extends string> = S extends "*" ? `${string}` : S;
type ProcessSegments<Arr extends string[]> = Arr extends [] ? [] : Arr extends [infer First extends string, ...infer Rest extends string[]] ? [ProcessSegment<First>, ...ProcessSegments<Rest>] : [];
type ReplaceWildcard<T> = T extends string ? IsMultiWildcard<T> extends true ? T extends "**" ? `${string}/${string}` : T extends "*" ? string : T extends `${infer Head}/**` ? `${ReplaceWildcard<Head>}/${string}` : T : Join<ProcessSegments<Split<T>>> : T;
/**
* 事件消息相关
*/
interface FastEventMeta {

@@ -7,20 +37,23 @@ }

}
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type WildcardStyle = `*` | `**` | `${string}/*` | `*/${string}` | `${string}/*/${string}` | `${string}/**`;
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = ({
[K in keyof Events as K extends WildcardStyle ? ReplaceWildcard<K> : never]: {
type: ReplaceWildcard<K>;
payload: Events[K];
meta?: Partial<FastEventMeta & M> & Record<string, any>;
};
} & {
[K in keyof Events as K extends WildcardStyle ? never : K]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta: FastEventMeta & M & Record<string, any>;
meta?: Partial<FastEventMeta> & M & Record<string, any>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
})[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type FastListenerExecutor = (listeners: FastEventListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
* 事件相关
*/
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
declare enum FastEventListenerFlags {

@@ -57,6 +90,21 @@ Transformed = 1

};
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
*/
type FastEventListenerMeta = [
TypedFastEventListener<any, any>,
number,
number,
string,
number
];
type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;

@@ -67,8 +115,8 @@

}
type FastQueuePriority = 'none';
type FastQueueOverflows = "drop" | "expand" | 'slide' | 'throw';
type FastQueuePriority = "none";
type FastQueueOverflows = "drop" | "expand" | "slide" | "throw";
type QueueListenerPipeOptions = {
size?: number;
maxExpandSize?: number;
expandOverflow?: Omit<FastQueueOverflows, 'expand'>;
expandOverflow?: Omit<FastQueueOverflows, "expand">;
overflow?: FastQueueOverflows;

@@ -86,2 +134,3 @@ lifetime?: number;

interface RetryListenerPipeOptions {
retries?: number;
interval?: number | ((retryCount: number) => number);

@@ -92,7 +141,7 @@ drop?: (message: TypedFastEventMessage, error: Error) => void;

* 创建一个重试管道,在监听器执行失败时自动重试
* @param count 最大重试次数
* @param retries 最大重试次数
* @param options 配置选项
* @returns FastListenerPipe
*/
declare const retry: (count: number, options?: RetryListenerPipeOptions) => FastListenerPipe;
declare function retry(options?: RetryListenerPipeOptions): FastListenerPipe;

@@ -99,0 +148,0 @@ /**

@@ -1,2 +0,2 @@

'use strict';var R=Object.defineProperty;var n=(t,o)=>R(t,"name",{value:o,configurable:true});var F=class F extends Error{constructor(o){super(o);}};n(F,"FastEventError");var y=F,T=class T extends y{};n(T,"TimeoutError");var v=T;var D=class D extends y{};n(D,"QueueOverflowError");var P=D;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var M=n(t=>{let{lifetime:o,size:l,overflow:r,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:e,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],x=l,S=false,m=false,_=n(u=>{p(s)?s(u,c):c.push(o>0?[u,Date.now()]:[u,0]);},"pushMessage"),O=n(u=>{switch(c.length>=i&&r==="expand"?a:r){case "drop":return p(e)&&e(u),false;case "expand":return x=Math.min(x+l,i),_(u),true;case "slide":let d=c.shift();return p(e)&&d&&e(d[0]),_(u),true;case "throw":throw p(e)&&e(u),new P;default:return false}},"handleOverflow");return u=>async function(h,d){if(m=true,S){c.length<x?_(h):O(h);return}S=true;try{for(await u.call(this,h,d);c.length>0;){let w,z;if(m&&p(f)?([w,z]=f(c,m)||[void 0,0],m=!1):[w,z]=c.shift()||[void 0,0],w){if(o>0&&Date.now()-z>o){p(e)&&e(w);continue}await u.call(this,w,d);}}}finally{S=false;}}},"queue"),E=n((t=10)=>M({size:t,overflow:"drop"}),"dropping"),G=n((t=10)=>M({size:t,overflow:"slide"}),"sliding"),J=n(t=>M(Object.assign({},t,{overflow:"expand"})),"expanding");var Y=n((t,o)=>{let{interval:l=1e3,drop:r}=o||{};return i=>async function(a,s){let e=0,f;for(;e<=t;)try{return await i.call(this,a,s)}catch(c){if(f=c,e<t)await new Promise(x=>{setTimeout(x,p(l)?l(e):l);}),e++;else throw p(r)&&r(a,f),f}}},"retry");var Q=n((t,o)=>l=>async function(r,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{o!==void 0?f(o):c(new v);},t);}),e=Promise.resolve(l.call(this,r,i));try{return await Promise.race([e,s])}finally{clearTimeout(a);}},"timeout");var U=n((t,o)=>l=>{let r=false,i=null;return async function(a,s){if(r){o?.drop&&o.drop(a);return}try{r=!0;let e=await l.call(this,a,s);return i=setTimeout(()=>{r=!1,i=null;},t),e}catch(e){throw r=false,i&&(clearTimeout(i),i=null),e}}},"debounce");var nt=n((t,o)=>l=>{let r=0;return async function(i,a){let s=Date.now();if(s-r<t){o?.drop&&o.drop(i);return}return r=s,await l.call(this,i,a)}},"throttle");function it(t){let o,l=false,r,i=typeof t=="function";return function(a){return async function(s,e){if(l){if(typeof t=="function"){if(await t(s,e))return o}else if(s.payload===r)return o}let f=await a.call(this,s,e);return o=f,i||(r=s.payload),l=true,f}}}n(it,"memorize");exports.debounce=U;exports.dropping=E;exports.expanding=J;exports.memorize=it;exports.queue=M;exports.retry=Y;exports.sliding=G;exports.throttle=nt;exports.timeout=Q;//# sourceMappingURL=index.js.map
'use strict';var j=Object.defineProperty;var n=(t,e)=>j(t,"name",{value:e,configurable:true});var T=class T extends Error{constructor(e){super(e);}};n(T,"FastEventError");var h=T,F=class F extends h{};n(F,"TimeoutError");var y=F;var O=class O extends h{};n(O,"QueueOverflowError");var v=O;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var D=n(t=>{let{lifetime:e,size:l,overflow:o,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:r,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],P=l,_=false,m=false,S=n(u=>{p(s)?s(u,c):c.push(e>0?[u,Date.now()]:[u,0]);},"pushMessage"),b=n(u=>{switch(c.length>=i&&o==="expand"?a:o){case "drop":return p(r)&&r(u),false;case "expand":return P=Math.min(P+l,i),S(u),true;case "slide":let x=c.shift();return p(r)&&x&&r(x[0]),S(u),true;case "throw":throw p(r)&&r(u),new v;default:return false}},"handleOverflow");return u=>async function(w,x){if(m=true,_){c.length<P?S(w):b(w);return}_=true;try{for(await u.call(this,w,x);c.length>0;){let d,z;if(m&&p(f)?([d,z]=f(c,m)||[void 0,0],m=!1):[d,z]=c.shift()||[void 0,0],d){if(e>0&&Date.now()-z>e){p(r)&&r(d);continue}await u.call(this,d,x);}}}finally{_=false;}}},"queue"),H=n((t=10)=>D({size:t,overflow:"drop"}),"dropping"),N=n((t=10)=>D({size:t,overflow:"slide"}),"sliding"),G=n(t=>D(Object.assign({},t,{overflow:"expand"})),"expanding");var M=n(t=>new Promise(e=>setTimeout(e,t)),"delay");function $(t){let{retries:e,interval:l,drop:o}=Object.assign({retries:1,interval:100},t);return i=>async function(a,s){let r=0,f;for(;r<=e;)try{return await i.call(this,a,s)}catch(c){if(f=c,r++,r<=e)await M(p(l)?l(r):l);else throw p(o)&&o(a,f),f}}}n($,"retry");var V=n((t,e)=>l=>async function(o,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{e!==void 0?f(e):c(new y);},t);}),r=Promise.resolve(l.call(this,o,i));try{return await Promise.race([r,s])}finally{clearTimeout(a);}},"timeout");var tt=n((t,e)=>l=>{let o=false,i=null;return async function(a,s){if(o){e?.drop&&e.drop(a);return}try{o=!0;let r=await l.call(this,a,s);return i=setTimeout(()=>{o=!1,i=null;},t),r}catch(r){throw o=false,i&&(clearTimeout(i),i=null),r}}},"debounce");var rt=n((t,e)=>l=>{let o=0;return async function(i,a){let s=Date.now();if(s-o<t){e?.drop&&e.drop(i);return}return o=s,await l.call(this,i,a)}},"throttle");function st(t){let e,l=false,o,i=typeof t=="function";return function(a){return async function(s,r){if(l){if(typeof t=="function"){if(await t(s,r))return e}else if(s.payload===o)return e}let f=await a.call(this,s,r);return e=f,i||(o=s.payload),l=true,f}}}n(st,"memorize");exports.debounce=tt;exports.dropping=H;exports.expanding=G;exports.memorize=st;exports.queue=D;exports.retry=$;exports.sliding=N;exports.throttle=rt;exports.timeout=V;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","constructor","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","FastEventDirectives","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","Object","assign","buffer","currentSize","isHandling","hasNewMessage","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","retry","count","interval","drop","retries","lastError","error","Promise","resolve","setTimeout","timeout","ms","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","race","clearTimeout","debounce","isBlocked","result","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate","payload"],"mappings":"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","file":"index.js","sourcesContent":["export const __FastEvent__ = Symbol.for('__FastEvent__')\nexport const __FastEventScope__ = Symbol.for('__FastEventScope__')\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message)\n }\n}\n\nexport class TimeoutError extends FastEventError { }\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError { }\nexport class AbortError extends FastEventError { }\nexport class CancelError extends FastEventError { }\nexport class QueueOverflowError extends FastEventError { }\n\n\nexport const FastEventDirectives = {\n clearRetain: Symbol.for('ClearRetain')\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\"\nimport { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onPush?: (newMessage: TypedFastEventMessage, messages: [TypedFastEventMessage, number][]) => void\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (messages: [TypedFastEventMessage, number][], hasNew: boolean) => [TypedFastEventMessage, number] | undefined\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n let buffer: [TypedFastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer)\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0])\n }\n }\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n let nextMessage, enterTime\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0]\n hasNewMessage = false\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0]\n }\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage)\n continue\n }\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number | ((retryCount: number) => number) // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, isFunction(interval) ? interval(retries) : interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/utils/delay.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","Object","assign","buffer","currentSize","isHandling","hasNewMessage","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","delay","ms","Promise","resolve","setTimeout","retry","retries","interval","drop","retryCount","lastError","error","timeout","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","race","clearTimeout","debounce","isBlocked","result","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate","payload"],"mappings":"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","file":"index.js","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface FastEventListenerDecorators {\n queue: string;\n}\nexport type FastQueuePriority = \"none\";\n\nexport type FastQueueOverflows =\n | \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | \"slide\" // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | \"throw\"; // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number; // 缓冲区默认大小\n maxExpandSize?: number; // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, \"expand\">;\n overflow?: FastQueueOverflows;\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number;\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onPush?: (\n newMessage: TypedFastEventMessage,\n messages: [TypedFastEventMessage, number][],\n ) => void;\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (\n messages: [TypedFastEventMessage, number][],\n hasNew: boolean,\n ) => [TypedFastEventMessage, number] | undefined;\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void;\n};\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } =\n Object.assign(\n {\n size: 10,\n maxExpandSize: 100,\n overflow: \"expand\",\n expandOverflow: \"slide\",\n lifetime: 0,\n },\n options,\n );\n\n let buffer: [TypedFastEventMessage, number][] = [];\n let currentSize = size; // 当前缓冲区大小\n let isHandling = false; // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false;\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer);\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n };\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n buffer.length >= maxExpandSize && overflow === \"expand\" ? expandOverflow : overflow;\n switch (strategy) {\n case \"drop\":\n if (isFunction(onDrop)) onDrop(message);\n return false;\n case \"expand\":\n currentSize = Math.min(currentSize + size, maxExpandSize);\n pushMessage(message);\n return true;\n case \"slide\":\n const msg = buffer.shift(); // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0]);\n pushMessage(message);\n return true;\n case \"throw\":\n if (isFunction(onDrop)) onDrop(message);\n throw new QueueOverflowError();\n default:\n return false;\n }\n };\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true;\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message);\n } else {\n handleOverflow(message);\n }\n return;\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true;\n try {\n await listener.call(this, message, args);\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n let nextMessage, enterTime;\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0];\n hasNewMessage = false;\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0];\n }\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage);\n continue;\n }\n await listener.call(this, nextMessage, args);\n }\n }\n } finally {\n isHandling = false;\n }\n };\n };\n};\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: \"drop\" });\nexport const sliding = (size: number = 10) => queue({ size, overflow: \"slide\" });\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, \"overflow\">) =>\n queue(\n Object.assign({}, options, { overflow: \"expand\" as QueueListenerPipeOptions[\"overflow\"] }),\n );\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\nimport { delay } from \"../utils/delay\";\n\nexport interface RetryListenerPipeOptions {\n retries?: number; // 重试次数\n interval?: number | ((retryCount: number) => number); // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void; // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param retries 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\n\nexport function retry(options?: RetryListenerPipeOptions): FastListenerPipe {\n const { retries, interval, drop } = Object.assign(\n {\n retries: 1,\n interval: 100,\n },\n options,\n );\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retryCount = 0;\n let lastError: Error | undefined;\n while (retryCount <= retries) {\n try {\n return await listener.call(this, message, args);\n } catch (error) {\n lastError = error as Error;\n retryCount++;\n if (retryCount <= retries) {\n await delay(isFunction(interval) ? interval(retryCount) : interval);\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError);\n }\n throw lastError;\n }\n }\n }\n };\n };\n}\n","import { TimeoutError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any;\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue);\n } else {\n reject(new TimeoutError());\n }\n }, ms);\n });\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args));\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise]);\n } finally {\n clearTimeout(timeoutId!);\n }\n };\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void;\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false;\n let timeoutId: any = null;\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message);\n }\n return;\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true;\n\n // 执行监听器\n const result = await listener.call(this, message, args);\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false;\n timeoutId = null;\n }, ms);\n\n return result;\n } catch (error) {\n isBlocked = false;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n throw error;\n }\n };\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void;\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0;\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now();\n const timeSinceLastExecution = now - lastExecutionTime;\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message);\n }\n return;\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now;\n return await listener.call(this, message, args);\n };\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport type { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(\n predicate?: (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => boolean | Promise<boolean>,\n): FastListenerPipe {\n let lastResult: any = undefined;\n let hasResult = false;\n let lastPayload: any = undefined;\n let hasPredicate = typeof predicate === \"function\";\n return function (listener: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof predicate === \"function\") {\n if (await predicate(message, args)) {\n return lastResult;\n }\n } else {\n // 默认根据message.payload判断\n if (message.payload === lastPayload) {\n return lastResult;\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args);\n lastResult = result;\n if (!hasPredicate) lastPayload = message.payload;\n hasResult = true;\n return result;\n };\n };\n}\n"]}

@@ -1,2 +0,2 @@

var R=Object.defineProperty;var n=(t,o)=>R(t,"name",{value:o,configurable:true});var F=class F extends Error{constructor(o){super(o);}};n(F,"FastEventError");var y=F,T=class T extends y{};n(T,"TimeoutError");var v=T;var D=class D extends y{};n(D,"QueueOverflowError");var P=D;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var M=n(t=>{let{lifetime:o,size:l,overflow:r,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:e,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],x=l,S=false,m=false,_=n(u=>{p(s)?s(u,c):c.push(o>0?[u,Date.now()]:[u,0]);},"pushMessage"),O=n(u=>{switch(c.length>=i&&r==="expand"?a:r){case "drop":return p(e)&&e(u),false;case "expand":return x=Math.min(x+l,i),_(u),true;case "slide":let d=c.shift();return p(e)&&d&&e(d[0]),_(u),true;case "throw":throw p(e)&&e(u),new P;default:return false}},"handleOverflow");return u=>async function(h,d){if(m=true,S){c.length<x?_(h):O(h);return}S=true;try{for(await u.call(this,h,d);c.length>0;){let w,z;if(m&&p(f)?([w,z]=f(c,m)||[void 0,0],m=!1):[w,z]=c.shift()||[void 0,0],w){if(o>0&&Date.now()-z>o){p(e)&&e(w);continue}await u.call(this,w,d);}}}finally{S=false;}}},"queue"),E=n((t=10)=>M({size:t,overflow:"drop"}),"dropping"),G=n((t=10)=>M({size:t,overflow:"slide"}),"sliding"),J=n(t=>M(Object.assign({},t,{overflow:"expand"})),"expanding");var Y=n((t,o)=>{let{interval:l=1e3,drop:r}=o||{};return i=>async function(a,s){let e=0,f;for(;e<=t;)try{return await i.call(this,a,s)}catch(c){if(f=c,e<t)await new Promise(x=>{setTimeout(x,p(l)?l(e):l);}),e++;else throw p(r)&&r(a,f),f}}},"retry");var Q=n((t,o)=>l=>async function(r,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{o!==void 0?f(o):c(new v);},t);}),e=Promise.resolve(l.call(this,r,i));try{return await Promise.race([e,s])}finally{clearTimeout(a);}},"timeout");var U=n((t,o)=>l=>{let r=false,i=null;return async function(a,s){if(r){o?.drop&&o.drop(a);return}try{r=!0;let e=await l.call(this,a,s);return i=setTimeout(()=>{r=!1,i=null;},t),e}catch(e){throw r=false,i&&(clearTimeout(i),i=null),e}}},"debounce");var nt=n((t,o)=>l=>{let r=0;return async function(i,a){let s=Date.now();if(s-r<t){o?.drop&&o.drop(i);return}return r=s,await l.call(this,i,a)}},"throttle");function it(t){let o,l=false,r,i=typeof t=="function";return function(a){return async function(s,e){if(l){if(typeof t=="function"){if(await t(s,e))return o}else if(s.payload===r)return o}let f=await a.call(this,s,e);return o=f,i||(r=s.payload),l=true,f}}}n(it,"memorize");export{U as debounce,E as dropping,J as expanding,it as memorize,M as queue,Y as retry,G as sliding,nt as throttle,Q as timeout};//# sourceMappingURL=index.mjs.map
var j=Object.defineProperty;var n=(t,e)=>j(t,"name",{value:e,configurable:true});var T=class T extends Error{constructor(e){super(e);}};n(T,"FastEventError");var h=T,F=class F extends h{};n(F,"TimeoutError");var y=F;var O=class O extends h{};n(O,"QueueOverflowError");var v=O;function p(t){return t&&typeof t=="function"}n(p,"isFunction");var D=n(t=>{let{lifetime:e,size:l,overflow:o,maxExpandSize:i,expandOverflow:a,onPush:s,onDrop:r,onPop:f}=Object.assign({size:10,maxExpandSize:100,overflow:"expand",expandOverflow:"slide",lifetime:0},t),c=[],P=l,_=false,m=false,S=n(u=>{p(s)?s(u,c):c.push(e>0?[u,Date.now()]:[u,0]);},"pushMessage"),b=n(u=>{switch(c.length>=i&&o==="expand"?a:o){case "drop":return p(r)&&r(u),false;case "expand":return P=Math.min(P+l,i),S(u),true;case "slide":let x=c.shift();return p(r)&&x&&r(x[0]),S(u),true;case "throw":throw p(r)&&r(u),new v;default:return false}},"handleOverflow");return u=>async function(w,x){if(m=true,_){c.length<P?S(w):b(w);return}_=true;try{for(await u.call(this,w,x);c.length>0;){let d,z;if(m&&p(f)?([d,z]=f(c,m)||[void 0,0],m=!1):[d,z]=c.shift()||[void 0,0],d){if(e>0&&Date.now()-z>e){p(r)&&r(d);continue}await u.call(this,d,x);}}}finally{_=false;}}},"queue"),H=n((t=10)=>D({size:t,overflow:"drop"}),"dropping"),N=n((t=10)=>D({size:t,overflow:"slide"}),"sliding"),G=n(t=>D(Object.assign({},t,{overflow:"expand"})),"expanding");var M=n(t=>new Promise(e=>setTimeout(e,t)),"delay");function $(t){let{retries:e,interval:l,drop:o}=Object.assign({retries:1,interval:100},t);return i=>async function(a,s){let r=0,f;for(;r<=e;)try{return await i.call(this,a,s)}catch(c){if(f=c,r++,r<=e)await M(p(l)?l(r):l);else throw p(o)&&o(a,f),f}}}n($,"retry");var V=n((t,e)=>l=>async function(o,i){let a,s=new Promise((f,c)=>{a=setTimeout(()=>{e!==void 0?f(e):c(new y);},t);}),r=Promise.resolve(l.call(this,o,i));try{return await Promise.race([r,s])}finally{clearTimeout(a);}},"timeout");var tt=n((t,e)=>l=>{let o=false,i=null;return async function(a,s){if(o){e?.drop&&e.drop(a);return}try{o=!0;let r=await l.call(this,a,s);return i=setTimeout(()=>{o=!1,i=null;},t),r}catch(r){throw o=false,i&&(clearTimeout(i),i=null),r}}},"debounce");var rt=n((t,e)=>l=>{let o=0;return async function(i,a){let s=Date.now();if(s-o<t){e?.drop&&e.drop(i);return}return o=s,await l.call(this,i,a)}},"throttle");function st(t){let e,l=false,o,i=typeof t=="function";return function(a){return async function(s,r){if(l){if(typeof t=="function"){if(await t(s,r))return e}else if(s.payload===o)return e}let f=await a.call(this,s,r);return e=f,i||(o=s.payload),l=true,f}}}n(st,"memorize");export{tt as debounce,H as dropping,G as expanding,st as memorize,D as queue,$ as retry,N as sliding,rt as throttle,V as timeout};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","constructor","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","FastEventDirectives","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","Object","assign","buffer","currentSize","isHandling","hasNewMessage","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","retry","count","interval","drop","retries","lastError","error","Promise","resolve","setTimeout","timeout","ms","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","race","clearTimeout","debounce","isBlocked","result","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate","payload"],"mappings":"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","file":"index.mjs","sourcesContent":["export const __FastEvent__ = Symbol.for('__FastEvent__')\nexport const __FastEventScope__ = Symbol.for('__FastEventScope__')\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message)\n }\n}\n\nexport class TimeoutError extends FastEventError { }\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError { }\nexport class AbortError extends FastEventError { }\nexport class CancelError extends FastEventError { }\nexport class QueueOverflowError extends FastEventError { }\n\n\nexport const FastEventDirectives = {\n clearRetain: Symbol.for('ClearRetain')\n}","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\"\nimport { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\n\nexport interface FastEventListenerDecorators {\n queue: string\n}\nexport type FastQueuePriority = 'none'\n\nexport type FastQueueOverflows =\n \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | 'slide' // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | 'throw' // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number // 缓冲区默认大小\n maxExpandSize?: number // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, 'expand'>\n overflow?: FastQueueOverflows\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onPush?: (newMessage: TypedFastEventMessage, messages: [TypedFastEventMessage, number][]) => void\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (messages: [TypedFastEventMessage, number][], hasNew: boolean) => [TypedFastEventMessage, number] | undefined\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void\n}\n\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } = Object.assign({\n size: 10,\n maxExpandSize: 100,\n overflow: 'expand',\n expandOverflow: 'slide',\n lifetime: 0\n }, options)\n\n let buffer: [TypedFastEventMessage, number][] = []\n let currentSize = size // 当前缓冲区大小\n let isHandling = false // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer)\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0])\n }\n }\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy = (buffer.length >= maxExpandSize && overflow === 'expand') ? expandOverflow : overflow\n switch (strategy) {\n case 'drop':\n if (isFunction(onDrop)) onDrop(message)\n return false\n case 'expand':\n currentSize = Math.min(currentSize + size, maxExpandSize)\n pushMessage(message)\n return true\n case 'slide':\n const msg = buffer.shift() // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0])\n pushMessage(message)\n return true\n case 'throw':\n if (isFunction(onDrop)) onDrop(message)\n throw new QueueOverflowError()\n default:\n return false\n }\n }\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message)\n } else {\n handleOverflow(message)\n }\n return\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true\n try {\n await listener.call(this, message, args)\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n let nextMessage, enterTime\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0]\n hasNewMessage = false\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0]\n }\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage)\n continue\n }\n await listener.call(this, nextMessage, args)\n }\n }\n } finally {\n isHandling = false\n }\n }\n }\n}\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: 'drop' })\nexport const sliding = (size: number = 10) => queue({ size, overflow: 'slide' })\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, 'overflow'>) => queue(Object.assign({}, options, { overflow: 'expand' as QueueListenerPipeOptions['overflow'] }))","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { isFunction } from \"../utils/isFunction\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface RetryListenerPipeOptions {\n interval?: number | ((retryCount: number) => number) // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param count 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\nexport const retry = (count: number, options?: RetryListenerPipeOptions): FastListenerPipe => {\n const { interval = 1000, drop } = options || {}\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retries = 0\n let lastError: Error | undefined\n while (retries <= count) {\n try {\n return await listener.call(this, message, args)\n } catch (error) {\n lastError = error as Error\n if (retries < count) {\n // 等待interval后重试\n await new Promise(resolve => {\n setTimeout(resolve, isFunction(interval) ? interval(retries) : interval)\n })\n retries++\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError)\n }\n throw lastError\n }\n }\n }\n }\n }\n}","import { TimeoutError } from \"../consts\"\nimport { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue)\n } else {\n reject(new TimeoutError())\n }\n }, ms)\n })\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args))\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise])\n } finally {\n clearTimeout(timeoutId!)\n }\n }\n }\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false\n let timeoutId: any = null\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true\n\n // 执行监听器\n const result = await listener.call(this, message, args)\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false\n timeoutId = null\n }, ms)\n\n return result\n } catch (error) {\n isBlocked = false\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n throw error\n }\n }\n }\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport { FastListenerPipe } from \"./types\"\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now()\n const timeSinceLastExecution = now - lastExecutionTime\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message)\n }\n return\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now\n return await listener.call(this, message, args)\n }\n }\n}","import { TypedFastEventListener, FastEventListenerArgs, TypedFastEventMessage } from \"../types\"\nimport type { FastListenerPipe } from \"./types\"\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(predicate?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => boolean | Promise<boolean>): FastListenerPipe {\n let lastResult: any = undefined\n let hasResult = false\n let lastPayload: any = undefined\n let hasPredicate = typeof (predicate) === 'function'\n return function (listener: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof (predicate) === 'function') {\n if (await predicate(message, args)) {\n return lastResult\n }\n } else {// 默认根据message.payload判断 \n if (message.payload === lastPayload) {\n return lastResult\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args)\n lastResult = result\n if (!hasPredicate) lastPayload = message.payload\n hasResult = true\n return result\n }\n }\n}"]}
{"version":3,"sources":["../../src/consts.ts","../../src/utils/isFunction.ts","../../src/pipes/queue.ts","../../src/utils/delay.ts","../../src/pipes/retry.ts","../../src/pipes/timeout.ts","../../src/pipes/debounce.ts","../../src/pipes/throttle.ts","../../src/pipes/memorize.ts"],"names":["FastEventError","Error","message","_FastEventError","TimeoutError","_TimeoutError","QueueOverflowError","_QueueOverflowError","isFunction","fn","queue","__name","options","lifetime","size","overflow","maxExpandSize","expandOverflow","onPush","onDrop","onPop","Object","assign","buffer","currentSize","isHandling","hasNewMessage","pushMessage","push","Date","now","handleOverflow","length","strategy","Math","min","msg","shift","listener","args","call","nextMessage","enterTime","undefined","dropping","sliding","expanding","delay","ms","Promise","resolve","setTimeout","retry","retries","interval","drop","retryCount","lastError","error","timeout","defaultValue","timeoutId","timeoutPromise","reject","listenerPromise","race","clearTimeout","debounce","isBlocked","result","throttle","lastExecutionTime","memorize","predicate","lastResult","hasResult","lastPayload","hasPredicate","payload"],"mappings":"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","file":"index.mjs","sourcesContent":["export const __FastEvent__ = Symbol.for(\"__FastEvent__\");\nexport const __FastEventScope__ = Symbol.for(\"__FastEventScope__\");\nexport class FastEventError extends Error {\n constructor(message?: string) {\n super(message);\n }\n}\n\nexport class TimeoutError extends FastEventError {}\n// 当Scope没有绑定到了Emitter时提示这个错误\nexport class UnboundError extends FastEventError {}\nexport class AbortError extends FastEventError {}\nexport class CancelError extends FastEventError {}\nexport class QueueOverflowError extends FastEventError {}\n","export function isFunction(fn: any): fn is Function {\n return fn && typeof (fn) == \"function\"\n}","import { QueueOverflowError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface FastEventListenerDecorators {\n queue: string;\n}\nexport type FastQueuePriority = \"none\";\n\nexport type FastQueueOverflows =\n | \"drop\" // 当缓冲区满时,丢弃新消息\n | \"expand\" // 当缓冲区满时,扩展缓冲区,每次扩展size,直到缓冲区大小达到maxSize\n | \"slide\" // 当缓冲区满时,将缓冲区中的消息向前移动,丢弃旧的消息\n | \"throw\"; // 当缓冲区满时,抛出异常\n\nexport type QueueListenerPipeOptions = {\n size?: number; // 缓冲区默认大小\n maxExpandSize?: number; // 缓冲区扩展到到多大时不再扩展\n expandOverflow?: Omit<FastQueueOverflows, \"expand\">;\n overflow?: FastQueueOverflows;\n // =0不启用此机制,当消息在队列中的时间到达lifetime(ms)后,自动丢弃\n lifetime?: number;\n // 当新消息到达时触发此回调,可以用来处理新消息,转让默认是采用push操作\n onPush?: (\n newMessage: TypedFastEventMessage,\n messages: [TypedFastEventMessage, number][],\n ) => void;\n // 当消息被弹出时触发此回调,可以在此消息队列进行排序等操作\n // hasNew: 自上次pop弹出消息后,是否有新的消息入列\n onPop?: (\n messages: [TypedFastEventMessage, number][],\n hasNew: boolean,\n ) => [TypedFastEventMessage, number] | undefined;\n // 当消息被丢弃时触发此回调\n onDrop?: (message: TypedFastEventMessage) => void;\n};\n\nexport const queue = (options?: QueueListenerPipeOptions): FastListenerPipe => {\n const { lifetime, size, overflow, maxExpandSize, expandOverflow, onPush, onDrop, onPop } =\n Object.assign(\n {\n size: 10,\n maxExpandSize: 100,\n overflow: \"expand\",\n expandOverflow: \"slide\",\n lifetime: 0,\n },\n options,\n );\n\n let buffer: [TypedFastEventMessage, number][] = [];\n let currentSize = size; // 当前缓冲区大小\n let isHandling = false; // 是否正在处理缓冲区中的消息\n let hasNewMessage: boolean = false;\n\n const pushMessage = (message: TypedFastEventMessage) => {\n if (isFunction(onPush)) {\n onPush(message, buffer);\n } else {\n buffer.push(lifetime > 0 ? [message, Date.now()] : [message, 0]);\n }\n };\n\n const handleOverflow = (message: TypedFastEventMessage): boolean => {\n // 如果已达到最大大小且当前策略为expand,使用expandOverflow策略\n const strategy =\n buffer.length >= maxExpandSize && overflow === \"expand\" ? expandOverflow : overflow;\n switch (strategy) {\n case \"drop\":\n if (isFunction(onDrop)) onDrop(message);\n return false;\n case \"expand\":\n currentSize = Math.min(currentSize + size, maxExpandSize);\n pushMessage(message);\n return true;\n case \"slide\":\n const msg = buffer.shift(); // 移除最旧的消息\n if (isFunction(onDrop) && msg) onDrop(msg[0]);\n pushMessage(message);\n return true;\n case \"throw\":\n if (isFunction(onDrop)) onDrop(message);\n throw new QueueOverflowError();\n default:\n return false;\n }\n };\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage<any>, args: FastEventListenerArgs) {\n hasNewMessage = true;\n if (isHandling) {\n // 如果正在处理消息,尝试将新消息添加到缓冲区\n if (buffer.length < currentSize) {\n pushMessage(message);\n } else {\n handleOverflow(message);\n }\n return;\n }\n // 如果没有正在处理的消息,先处理当前消息\n isHandling = true;\n try {\n await listener.call(this, message, args);\n // 处理缓冲区中的消息\n while (buffer.length > 0) {\n let nextMessage, enterTime;\n // 从队列中弹出消息进行处理\n if (hasNewMessage && isFunction(onPop)) {\n [nextMessage, enterTime] = onPop(buffer, hasNewMessage) || [undefined, 0];\n hasNewMessage = false;\n } else {\n [nextMessage, enterTime] = buffer.shift() || [undefined, 0];\n }\n if (nextMessage) {\n // 如果消息在缓冲区中停留的时间超过lifetime,丢弃该消息\n if (lifetime > 0 && Date.now() - enterTime > lifetime) {\n if (isFunction(onDrop)) onDrop(nextMessage);\n continue;\n }\n await listener.call(this, nextMessage, args);\n }\n }\n } finally {\n isHandling = false;\n }\n };\n };\n};\n\nexport const dropping = (size: number = 10) => queue({ size, overflow: \"drop\" });\nexport const sliding = (size: number = 10) => queue({ size, overflow: \"slide\" });\nexport const expanding = (options?: Omit<QueueListenerPipeOptions, \"overflow\">) =>\n queue(\n Object.assign({}, options, { overflow: \"expand\" as QueueListenerPipeOptions[\"overflow\"] }),\n );\n","export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { isFunction } from \"../utils/isFunction\";\nimport { FastListenerPipe } from \"./types\";\nimport { delay } from \"../utils/delay\";\n\nexport interface RetryListenerPipeOptions {\n retries?: number; // 重试次数\n interval?: number | ((retryCount: number) => number); // 重试间隔,默认1000ms\n drop?: (message: TypedFastEventMessage, error: Error) => void; // 所有重试失败后的回调\n}\n\n/**\n * 创建一个重试管道,在监听器执行失败时自动重试\n * @param retries 最大重试次数\n * @param options 配置选项\n * @returns FastListenerPipe\n */\n\nexport function retry(options?: RetryListenerPipeOptions): FastListenerPipe {\n const { retries, interval, drop } = Object.assign(\n {\n retries: 1,\n interval: 100,\n },\n options,\n );\n\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let retryCount = 0;\n let lastError: Error | undefined;\n while (retryCount <= retries) {\n try {\n return await listener.call(this, message, args);\n } catch (error) {\n lastError = error as Error;\n retryCount++;\n if (retryCount <= retries) {\n await delay(isFunction(interval) ? interval(retryCount) : interval);\n } else {\n // 所有重试失败,调用drop回调\n if (isFunction(drop)) {\n drop(message, lastError);\n }\n throw lastError;\n }\n }\n }\n };\n };\n}\n","import { TimeoutError } from \"../consts\";\nimport { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个超时装饰器,限制监听器函数的执行时间\n * @param ms 超时时间(毫秒)\n * @param defaultValue 可选的默认返回值,如果提供则超时时返回此值,否则抛出TimeoutError\n * @returns 装饰器函数\n */\nexport const timeout = <T = any>(ms: number, defaultValue?: T): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n let timeoutId: any;\n\n const timeoutPromise = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n if (defaultValue !== undefined) {\n resolve(defaultValue);\n } else {\n reject(new TimeoutError());\n }\n }, ms);\n });\n\n const listenerPromise = Promise.resolve(listener.call(this, message, args));\n\n try {\n return await Promise.race([listenerPromise, timeoutPromise]);\n } finally {\n clearTimeout(timeoutId!);\n }\n };\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface DebounceOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void;\n}\n\n/**\n * 创建一个防抖动装饰器,限制监听器函数的执行频率\n * @param ms 防抖动时间(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const debounce = (ms: number, options?: DebounceOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let isBlocked = false;\n let timeoutId: any = null;\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n // 如果当前处于防抖动时间内,丢弃消息\n if (isBlocked) {\n if (options?.drop) {\n options.drop(message);\n }\n return;\n }\n\n try {\n // 设置阻塞标志\n isBlocked = true;\n\n // 执行监听器\n const result = await listener.call(this, message, args);\n\n // 设置定时器,在ms毫秒后解除阻塞\n timeoutId = setTimeout(() => {\n isBlocked = false;\n timeoutId = null;\n }, ms);\n\n return result;\n } catch (error) {\n isBlocked = false;\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n throw error;\n }\n };\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport { FastListenerPipe } from \"./types\";\n\nexport interface ThrottleOptions {\n /**\n * 当消息被丢弃时的回调函数\n */\n drop?: (message: TypedFastEventMessage) => void;\n}\n\n/**\n * 创建一个节流装饰器,限制监听器函数的执行频率\n * @param interval 节流时间间隔(毫秒)\n * @param options 可选的配置项\n * @returns 装饰器函数\n */\nexport const throttle = (interval: number, options?: ThrottleOptions): FastListenerPipe => {\n return (listener: TypedFastEventListener): TypedFastEventListener => {\n let lastExecutionTime = 0;\n\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n const now = Date.now();\n const timeSinceLastExecution = now - lastExecutionTime;\n\n // 如果在节流时间内,则丢弃消息\n if (timeSinceLastExecution < interval) {\n if (options?.drop) {\n options.drop(message);\n }\n return;\n }\n\n // 更新最后执行时间并执行监听器\n lastExecutionTime = now;\n return await listener.call(this, message, args);\n };\n };\n};\n","import { TypedFastEventMessage } from \"../types/FastEventMessages\";\nimport { TypedFastEventListener } from \"../types/FastEventListeners\";\nimport { FastEventListenerArgs } from \"../types/FastEvents\";\nimport type { FastListenerPipe } from \"./types\";\n\n/**\n * 创建一个memorize pipe,用于缓存上一次的返回值\n * @param predicate 可选的判断函数,用于决定是否使用缓存\n * @returns FastListenerPipe\n */\nexport function memorize(\n predicate?: (\n message: TypedFastEventMessage,\n args: FastEventListenerArgs,\n ) => boolean | Promise<boolean>,\n): FastListenerPipe {\n let lastResult: any = undefined;\n let hasResult = false;\n let lastPayload: any = undefined;\n let hasPredicate = typeof predicate === \"function\";\n return function (listener: TypedFastEventListener): TypedFastEventListener {\n return async function (message: TypedFastEventMessage, args: FastEventListenerArgs) {\n if (hasResult) {\n // 如果有自定义判断函数,使用它来决定是否使用缓存\n if (typeof predicate === \"function\") {\n if (await predicate(message, args)) {\n return lastResult;\n }\n } else {\n // 默认根据message.payload判断\n if (message.payload === lastPayload) {\n return lastResult;\n }\n }\n }\n // 执行原始监听器并缓存结果\n const result = await listener.call(this, message, args);\n lastResult = result;\n if (!hasPredicate) lastPayload = message.payload;\n hasResult = true;\n return result;\n };\n };\n}\n"]}
{
"name": "fastevent",
"version": "2.3.6",
"version": "2.3.7",
"description": "The Ultimate Event Trigger Library – Fast, Feature-Rich, Battle-Tested!",

@@ -43,15 +43,10 @@ "main": "dist/index.js",

"scripts": {
"test": "vitest",
"test": "bun test",
"test:coverage": "vitest --coverage --exclude=\"src/__benchmarks__/**\" --exclude=src/devTools",
"build": "tsup",
"bench": "tsx src/__benchmarks__/index.ts",
"changeset": "changeset",
"release": "bun run build && bun run changeset version && bun run changeset publish",
"sync": "cnpm sync fastevent",
"docs:dev": "vitepress dev docs",
"docs:build": "vitepress build docs",
"docs:preview": "vitepress preview docs"
"bench": "tsx src/__benchmarks__/index.ts"
},
"keywords": [
"eventemitter"
"eventemitter",
"events"
],

@@ -66,19 +61,20 @@ "files": [

"@changesets/cli": "^2.28.1",
"@swc/core": "^1.11.16",
"@swc/core": "^1.15.18",
"@type-challenges/utils": "^0.1.1",
"@vitest/coverage-v8": "3.1.1",
"@vitest/coverage-v8": "4.1.0",
"eventemitter2": "^6.4.9",
"redux": "^5.0.1",
"tinybench": "^4.0.1",
"tsup": "^8.4.0",
"tsx": "^4.19.3",
"typescript": "^5.9.2",
"vitepress": "^1.6.3",
"vitest": "^3.1.2"
"tinybench": "^6.0.0",
"tsup": "^8.5.1",
"tsx": "^4.21.0",
"typescript": "^5.9.3",
"vitepress": "^1.6.4",
"vitest": "^4.1.0"
},
"packageManager": "bun@1.2.0",
"packageManager": "bun@1.3.10",
"workspaces": [
"packages/*",
"examples/*",
"docs"
]
}
type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;
type Expand$1<T> = T extends infer O ? {
[K in keyof O]: O[K];
} : never;
type ContainsWildcard<T extends string> = T extends `${string}/*/${string}` ? true : T extends `${string}/*` ? true : T extends `*/${string}` ? true : T extends `*` ? true : false;
type ReplaceWildcard<T extends string> = T extends `*${infer Rest}` ? `${string}${ReplaceWildcard<Rest>}` : T extends `${infer Head}*${infer Rest}` ? `${Head}${string}${ReplaceWildcard<Rest>}` : T;
type WildcardKeys<T> = {
[K in keyof T]: K extends string ? (ContainsWildcard<K> extends true ? K : never) : never;
}[keyof T];
type ExpandWildcard<T extends Record<string, any>> = Expand$1<T & {
[K in WildcardKeys<T> as ReplaceWildcard<K>]: T[K];
}>;
type UnionToTuple<T> = UnionToTupleRec<T, []>;
type UnionToTupleRec<T, R extends any[]> = [T] extends [never] ? R : UnionToTupleRec<Exclude<T, LastOfUnion<T>>, [LastOfUnion<T>, ...R]>;
type LastOfUnion<T> = UnionToIntersection<T extends any ? (x: T) => 0 : never> extends (x: infer L) => 0 ? L : never;
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
type Keys<T extends Record<string, any>> = UnionToTuple<keyof T>;
type MergeUnion<T> = (T extends any ? (x: T) => void : never) extends (x: infer U) => void ? {
[K in keyof U]: U[K];
} : never;
type Split$1<S extends string, Delimiter extends string = '/'> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split$1<Tail, Delimiter>] : [S];
type MatchSegment<Input extends string, Pattern extends string> = Pattern extends '*' ? true : Pattern extends '**' ? true : Input extends Pattern ? true : false;
type MatchPatternArray<InputArr extends string[], PatternArr extends string[]> = InputArr extends [infer InputHead extends string, ...infer InputTail extends string[]] ? PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends '**' ? MatchPatternArray<InputTail, PatternTail> extends true ? true : MatchPatternArray<InputTail, PatternArr> extends true ? true : MatchPatternArray<InputArr, PatternTail> extends true ? true : false : MatchSegment<InputHead, PatternHead> extends true ? MatchPatternArray<InputTail, PatternTail> : false : false : PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends '**' ? MatchPatternArray<InputArr, PatternTail> : false : true;
type MatchPattern<T extends string, Pattern extends string> = MatchPatternArray<Split$1<T>, Split$1<Pattern>> extends true ? {
[K in Pattern]: any;
} : never;
type Fallback$1<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
/**
*
* 返回所有匹配事件的类型
*
* 支持通配符
*
* @param T 事件名称
* @param Events 事件类型
* @returns
*
*/
type WildcardEvents<Events extends Record<string, any>, T extends string> = MergeUnion<Fallback$1<{
[K in keyof Events]: MatchPattern<T, K & string> extends never ? never : {
[P in K]: Events[K];
};
}[keyof Events] extends infer Result ? Result extends Record<string, any> ? Result : Record<string, any> : Record<string, any>, {
[K in T]: any;
}>>;
/**
* 保留对象中第一项
*/
type FirstObjectItem<T extends Record<string, any>> = Pick<T, Keys<T> extends any[] ? Keys<T>[0] : never>;
type isEmpty<T extends Record<string, any>> = keyof T extends never ? true : false;
type GetWildcardItems<T extends Record<string, any>> = {
[K in keyof T as K extends `${string}*${string}` ? K : K extends `*` ? K : never]: T[K];
};
type GetNotWildcardItems<T extends Record<string, any>> = {
[K in keyof T as K extends `${string}*${string}` ? never : K extends `*` ? never : K]: T[K];
};
type GetFirstMatchedItem<T extends Record<string, any>> = FirstObjectItem<isEmpty<GetNotWildcardItems<T>> extends true ? GetWildcardItems<T> : GetNotWildcardItems<T>>;
type ClosestWildcardEvents<Events extends Record<string, any>, T extends string> = GetFirstMatchedItem<WildcardEvents<Events, T>>;
type Split<S extends string, Delimiter extends string> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
type MatchPatternAndGetRemainder<KeyParts extends string[], PrefixParts extends string[], Result extends string[] = []> = PrefixParts['length'] extends 0 ? KeyParts['length'] extends 0 ? never : KeyParts : KeyParts['length'] extends 0 ? never : KeyParts[0] extends PrefixParts[0] | '*' ? MatchPatternAndGetRemainder<Slice<KeyParts, 1>, Slice<PrefixParts, 1>, Result> : never;
type Slice<T extends any[], Start extends number, Result extends any[] = []> = Start extends 0 ? T : T extends [infer First, ...infer Rest] ? Slice<Rest, Decrement<Start>, Result> : Result;
type Decrement<N extends number> = N extends 0 ? 0 : N extends 1 ? 0 : N extends 2 ? 1 : N extends 3 ? 2 : N extends 4 ? 3 : N extends 5 ? 4 : N extends 6 ? 5 : N extends 7 ? 6 : N extends 8 ? 7 : N extends 9 ? 8 : number;
type Join<T extends string[], Delimiter extends string = '/'> = T extends [infer First extends string, ...infer Rest extends string[]] ? Rest['length'] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : '';
type ScopeEvents<Events extends Record<string, any>, Prefix extends string> = {
[K in keyof Events as K extends string ? MatchPatternAndGetRemainder<Split<K, '/'>, Split<Prefix, '/'>> extends infer Remainder ? Remainder extends string[] ? Join<Remainder, '/'> : never : never : never]: Events[K];
};
interface FastEventMeta {
}
interface FastEventMessageExtends {
}
type FastEventMessage<P = any, M extends Record<string, any> = Record<string, any>, T extends string = string> = {
type: T;
payload: P;
meta?: M & Partial<FastEventMeta>;
} & FastEventMessageExtends;
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta: FastEventMeta & M & Record<string, any>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type TypedFastEventMessageOptional<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type FastEventEmitMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type: Exclude<K, number | symbol>;
payload?: Events[K];
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type FastMessagePayload<P = any> = {
type: P;
__IS_FAST_MESSAGE__: true;
};
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
type TypedFastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
type FastEventListeners<Events extends Record<string, any> = Record<string, any>, M = any, C = any> = {
[K in keyof Events]: TypedFastEventListener<Exclude<K, number | symbol>, Events[K], M, C>;
};
type FastEventListener<P = any, M extends Record<string, any> = Record<string, any>, T extends string = string> = (message: FastEventMessage<P, M, T>, args: FastEventListenerArgs<M>) => any | Promise<any>;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
*/
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
type FastListenerNode = {
__listeners: FastListenerMeta[];
} & {
[key: string]: FastListenerNode;
};
type FastEventSubscriber = {
off: () => void;
/**
* 为什么要有一个listener引用? 主要用于移除监听器时使用
*
* - 正常情况下
* const subscriber = emitter.on('event', listener)
*
* subscriber.off()
* emitter.off('event', listener)
* emitter.off(listener)
*
* - 在使用scope时
* const scope = emitter.scope("xxx")
* const subscriber = scope.on('event', listener)
*
* subscriber.off() 可以正常生效
* scope.off('event', listener) // 无法生效
* scope.off(listener) // 无法生效
* 因为在scope中,为了让监听器可以处理scope的逻辑,对listener进行了包装,
* 因此在事件注册表中登记的不是listener,而是经过包装的监听器
* subscriber.off() 可以正常生效
* 如果要使用scope.off或emitter.off
* 需要使用subscriber.listener, subscriber.listener记录了原始的监听器引用
* subscriber.listener===listener
*
* scope.off('event', subscriber.listener) // 生效
* scope.off(subscriber.listener) // 生效
*
*/
listener: TypedFastEventListener<any, any, any>;
};
type FastListeners = FastListenerNode;
type FastEventOptions<Meta = Record<string, any>, Context = never> = {
id: string;
debug: boolean;
delimiter: string;
context: Context;
ignoreErrors: boolean;
meta: Meta;
onAddListener?: (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void;
onRemoveListener?: (type: string, listener: TypedFastEventListener) => void;
onClearListeners?: () => void;
onListenerError?: (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void;
onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[];
onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastListenerNode[]) => void;
/**
* 全局执行器
*/
executor?: FastListenerExecutor;
onMessage?: TypedFastEventListener;
expandEmitResults?: boolean;
/**
* 对接收到的消息进行转换,用于将消息转换成其他格式
*
* new FastEvent({
* transform:(message)=>{
* message.payload
* }
* })
*/
transform?: (message: FastEventMessage) => any;
};
interface FastEvents {
}
type FastEventListenOptions<Events extends Record<string, any> = Record<string, any>, Meta = any> = {
count?: number;
prepend?: boolean;
flags?: number;
filter?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
off?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
pipes?: FastListenerPipe[];
/**
* 为监听器添加一个tag,在监听器注册表中记录,用于调试使用
* emitter.on(type,listener,{tag:"x"})
* emitter.getListeners(tag)
*/
tag?: string;
};
declare enum FastEventListenerFlags {
Transformed = 1
}
type FastEventListenerArgs<M = Record<string, any>> = {
retain?: boolean;
meta?: DeepPartial<M> & Record<string, any>;
abortSignal?: AbortSignal;
/**
*
* allSettled: 使用Promise.allSettled()执行所有监听器
* race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略
* balance: 尽可能平均执行各个监听器
* sequence: 按照监听器添加顺序依次执行
*/
executor?: FastListenerExecutor;
/**
* 当emit参数解析完成后的回调,用于修改emit参数
*/
parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;
/**
* 额外的标识
*
* - 1: transformed 当消息是经过transform转换后的消息时的标识
*
*/
flags?: FastEventListenerFlags;
/**
* 如果消息经过转换前的原主题
*/
rawEventType?: string;
};
type Merge<T extends object, U extends object> = {
[K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
};
type RequiredItems<T extends object, Items extends string[]> = Omit<T, Items[number]> & {
[K in Items[number] & keyof T]-?: Exclude<T[K], undefined>;
};
type Expand<T> = T extends infer O ? {
[K in keyof O]: O[K];
} : never;
type OptionalItems<T, K extends keyof T> = Expand<Omit<T, K> & {
[P in K]?: T[P];
}>;
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type Fallback<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
type ChangeFieldType<Record, Name extends string, Type = any> = Expand<Omit<Record, Name> & {
[K in Name]: Type;
}>;
type OverrideOptions<T> = ChangeFieldType<Required<T>, 'context', never>;
type ObjectKeys<T, I = string> = {
[P in keyof T]: P extends I ? P : never;
}[keyof T];
/**
* 从类型数组中移除重复项,返回保留唯一类型的元组
* @template T - 输入的任意类型数组(元组)
* @template Result - 内部使用的累积结果数组(默认空数组)
* @returns {any[]} 去重后的类型元组,保留首次出现的顺序
*
* @example
* type T1 = Unique<[number, string, number]>; // [number, string]
* type T2 = Unique<[1, 2, 2, 3]>; // [1, 2, 3]
* type T3 = Unique<['a', 'b', 'a']>; // ['a', 'b']
*/
type Unique<T extends any[], Result extends any[] = []> = T extends [infer First, ...infer Rest] ? First extends Result[number] ? Unique<Rest, Result> : Unique<Rest, [...Result, First]> : Result;
type Overloads<T> = Unique<T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
(...args: infer A7): infer R7;
(...args: infer A8): infer R8;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6, (...args: A7) => R7, (...args: A8) => R8] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
(...args: infer A7): infer R7;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6, (...args: A7) => R7] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
} ? [(...args: A1) => R1, (...args: A2) => R2] : T extends {
(...args: infer A1): infer R1;
} ? [(...args: A1) => R1] : [T]>;
type Dict<V = any> = Record<Exclude<string, number | symbol>, V>;
type RecordValues<R extends Record<string, any>> = R[keyof R];
type RecordPrefix<P extends string, R extends Record<string, any>> = {
[K in keyof R as K extends `${P}/${infer S}` ? S : never]: R[K];
};
/**
* 声明事件类型时,一般情况下,K=事件名称,V=事件Payload参数类型
*
* AssertFastMessage用于声明V是一个FastMessage类型,而不是Payload类型
*
* 一般配合transform参数使用
*
* 例如:
* type CustomEvents = {
click: { x: number; y: number };
}
const emitter = new FastEvent<CustomEvents>();
emitter.on('click', (message) => {
// typeof message.payload === { x: number; y: number }
})
const emitter = new FastEvent<CustomEvents>({
transform:(message)=>{
if(message.type === 'click'){
return message.payload
}else{
return message
}
}
});
emitter.on('click', (message) => {
// typeof message === { x: number; y: number }
}
*/
type AssertFastMessage<M> = {
type: M;
__IS_FAST_MESSAGE__: true;
};
type NotPayload<M> = AssertFastMessage<M>;
type PickPayload<M> = M extends FastMessagePayload ? M['type'] : M;
type AtPayloads<Events extends Record<string, any>> = {
[K in keyof Events]: PickPayload<Events[K]>;
};
type PickTransformedEvents<T extends Record<string, any>> = ExpandWildcard<{
[key in keyof T as T[key] extends FastMessagePayload ? key : never]: T[key];
}>;
type OmitTransformedEvents<T extends Record<string, any>> = {
[key in keyof T as T[key] extends FastMessagePayload ? never : key]: T[key];
};
type TransformedEvents<Events extends Record<string, any>> = {
[K in keyof Events]: NotPayload<Events[K]>;
};
type Class = (new (...args: any[]) => any) | (abstract new (...args: any[]) => any);
type FastEventBusMessage<Events extends Record<string, any> = Record<string, any>, M = any> = FastEventEmitMessage<Events, M> & {
from?: string;
to?: string;
};
type FastEventBusOptions<Meta = Record<string, any>, Context = any> = FastEventOptions<Meta, Context>;
interface FastEventBusEvents {
'$connect': string;
'$disconnect': string;
'data': any;
}
type FastEventBusEventTypes = keyof FastEventBusEvents;
interface FastEventBusNodes {
}
type FastEventBusNodeIds = keyof FastEventBusNodes;
type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {
meta: FastEventScopeMeta & FastEventMeta & Meta;
context: Context;
executor?: FastListenerExecutor;
onMessage?: TypedFastEventListener;
/**
* 对接收到的消息进行转换,用于将消息转换成其他格式
*
* new FastEvent({
* transform:(message)=>{
* message.payload
* }
* })
*/
transform?: (message: FastEventMessage) => any;
};
interface FastEventScopeMeta {
scope: string;
}
declare class FastEventScope<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, Types extends keyof Events = keyof Events, FinalMeta extends Record<string, any> = FastEventMeta & FastEventScopeMeta & Meta> {
__FastEventScope__: boolean;
private _options;
types: {
events: Events;
meta: FinalMeta;
context: Fallback<Context, typeof this>;
message: TypedFastEventMessageOptional<Events, FinalMeta>;
listeners: FastEventListeners<Events, FinalMeta>;
anyListener: TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>;
};
prefix: string;
emitter: FastEvent<any>;
constructor(options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>);
get context(): Fallback<Context, typeof this>;
get options(): FastEventScopeOptions<FinalMeta, Context>;
/**
* 获取监听器
* @returns 监听器
*/
get listeners(): FastListenerMeta[];
bind(emitter: FastEvent<any>, prefix: string, options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>): void;
/**
* 初始化选项
*
* 本方法主要供子类重载
*
* @param initial - 可选的初始字典对象
* @returns 返回传入的初始字典对象
*/
_initOptions(initial: Dict | undefined): Dict | undefined;
/**
* 获取作用域监听器
* 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑
* @param listener 原始事件监听器
* @returns 包装后的作用域监听器
* @private
*/
private _getScopeListener;
private _getScopeType;
private _fixScopeType;
on<T extends Types = Types>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
on<T extends Exclude<string, Types>>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
on(type: '**', options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
on<T extends keyof OmitTransformedEvents<Events>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
on<T extends keyof PickTransformedEvents<Events>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<Events, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<Events, Meta>): FastEventSubscriber;
on<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<Events, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
on(type: '**', listener: TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
once<T extends Types = Types>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
once<T extends Exclude<string, Types>>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
once<T extends keyof OmitTransformedEvents<Events>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
once<T extends keyof PickTransformedEvents<Events>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<Events, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<Events, Meta>): FastEventSubscriber;
once<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<Events, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
onAny(options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
onAny<P = any>(listener: TypedFastEventAnyListener<{
[K: string]: P;
}, FinalMeta, Fallback<Context, typeof this>>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
off(listener: TypedFastEventListener<any, any, any>): void;
off(type: string, listener: TypedFastEventListener<any, any, any>): void;
off(type: Types, listener: TypedFastEventListener<any, any, any>): void;
off(type: string): void;
off(type: Types): void;
offAll(): void;
clear(): void;
emit(type: Types, directive: symbol): void;
emit(type: string, directive: symbol): void;
emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, retain?: boolean): R[];
emit<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : RecordValues<WildcardEvents<Events, T>>>, retain?: boolean): R[];
emit<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : RecordValues<WildcardEvents<Events, T>>>, options?: FastEventListenerArgs<FinalMeta>): R[];
emit<R = any>(message: FastEventEmitMessage<AtPayloads<Events>, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? Events[K] : any>;
}, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
private _transformMessage;
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : any>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : any>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? Events[K] : any>;
}, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
[key in T]: Events[T];
}, FinalMeta>>;
waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<{
[key: string]: any;
}, FinalMeta>>;
waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
[key: string]: P;
}, FinalMeta>>;
/**
* 创建一个新的作用域实例
* @param prefix - 作用域前缀
* @returns 新的FastEventScope实例
*
* @description
* 基于当前作用域创建一个新的子作用域。新作用域会继承当前作用域的所有特性,
* 并在事件类型前添加额外的前缀。这允许创建层级化的事件命名空间。
*
* 作用域的特性:
* - 自动为所有事件类型添加前缀
* - 在触发事件时自动添加前缀
* - 在接收事件时自动移除前缀
* - 支持多层级的作用域嵌套
*
* @example
* ```ts
* const emitter = new FastEvent();
* const userScope = emitter.scope('user');
* const profileScope = userScope.scope('profile');
*
* // 在profileScope中监听'update'事件
* // 实际监听的是'user/profile/update'
* profileScope.on('update', (data) => {
* console.log('Profile updated:', data);
* });
*
* // 在profileScope中触发'update'事件
* // 实际触发的是'user/profile/update'
* profileScope.emit('update', { name: 'John' });
* ```
*/
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context, ScopeObject extends InstanceType<Class> = InstanceType<Class>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScopeExtend<Events, P, ScopeObject>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeInstance extends FastEventScope<Record<string, any>, any, any> = FastEventScope<Record<string, any>, any, any>>(prefix: P, scopeObj: ScopeInstance, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): ScopeInstance & FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;
/**
* 当on/once/onAny未指定监听器时,此为默认监听器
* @param message
*/
onMessage(message: TypedFastEventMessage<Events, FinalMeta>, args: FastEventListenerArgs<FinalMeta>): void;
}
type FastEventScopeExtend<Events extends Record<string, any>, Prefix extends string, T extends InstanceType<Class> = never> = FastEventScope<ScopeEvents<Events, Prefix>> & T;
/**
* FastEvent 事件发射器类
*
* @template Events - 事件类型定义,继承自FastEvents接口
* @template Meta - 事件元数据类型,默认为任意键值对对象
* @template Types - 事件类型的键名类型,默认为Events的键名类型
*/
declare class FastEvent<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Expand<Events & FastEvents>, Types extends keyof AllEvents = Expand<Exclude<keyof AllEvents, number | symbol>>> {
__FastEvent__: boolean;
/** 事件监听器树结构,存储所有注册的事件监听器 */
listeners: FastListeners;
/** 事件发射器的配置选项 */
private _options;
/** 事件名称的分隔符,默认为'/' */
private _delimiter;
/** 事件监听器执行时的上下文对象 */
private _context;
/** 保留的事件消息映射,Key是事件名称,Value是保留的事件消息 */
retainedMessages: Map<string, any>;
/** 当前注册的监听器总数 */
listenerCount: number;
types: {
events: AllEvents;
meta: Expand<FastEventMeta & Meta & Record<string, any>>;
context: Expand<Fallback<Context, typeof this>>;
message: TypedFastEventMessageOptional<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
listeners: FastEventListeners<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
anyListener: TypedFastEventAnyListener<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>, Expand<Fallback<Context, typeof this>>>;
};
/**
* 创建FastEvent实例
* @param options - 事件发射器的配置选项
*
* 默认配置:
* - debug: false - 是否启用调试模式
* - id: 随机字符串 - 实例唯一标识符
* - delimiter: '/' - 事件名称分隔符
* - context: null - 监听器执行上下文
* - ignoreErrors: true - 是否忽略监听器执行错误
*/
constructor(options?: Partial<FastEventOptions<Meta, Context>>);
/** 获取事件发射器的配置选项 */
get options(): FastEventOptions<Meta, Context>;
get context(): Fallback<Context, typeof this>;
get meta(): Meta;
/** 获取事件发射器的唯一标识符 */
get id(): string;
/**
* 初始化选项
*
* 本方法主要供子类重载
*
* @param initial - 可选的初始字典对象
* @returns 返回传入的初始字典对象
*/
_initOptions(initial?: Partial<FastEventOptions<Meta, Context>>): Partial<FastEventOptions<Meta, Context>> | undefined;
/**
* 添加事件监听器到事件树中
* @param parts - 事件路径数组
* @param listener - 事件监听器函数
* @param options - 监听器配置选项
* @param options.count - 监听器触发次数限制
* @param options.prepend - 是否将监听器添加到监听器列表开头
* @returns [节点, 监听器索引] - 返回监听器所在节点和在节点监听器列表中的索引
* @private
*/
private _addListener;
private _enableDevTools;
/**
*
* 根据parts路径遍历监听器树,并在最后的节点上执行回调函数
*
* @param parts
* @param callback
* @returns
*/
private _forEachNodes;
/**
* 从监听器节点中移除指定的事件监听器
* @private
* @param node - 监听器节点
* @param listener - 需要移除的事件监听器
* @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器
*/
private _removeListener;
private _pipeListener;
/**
* 注册事件监听器
* @param type - 事件类型,支持以下格式:
* - 普通字符串:'user/login'
* - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)
* - 全局监听:'**'(监听所有事件)
* @param listener - 事件监听器函数
* @param options - 监听器配置选项:
* - count: 触发次数限制,0表示无限制
* - prepend: 是否将监听器添加到监听器队列开头
* @returns 返回订阅者对象,包含off方法用于取消监听
*
* @example
* ```ts
* // 监听特定事件
* emitter.on('user/login', (data) => console.log(data));
*
* // 使用通配符
* emitter.on('user/*', (data) => console.log(data));
*
* // 限制触发次数
* emitter.on('event', handler, { count: 3 });
* ```
*/
on<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends keyof OmitTransformedEvents<AllEvents>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends keyof PickTransformedEvents<AllEvents>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<AllEvents, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<AllEvents, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on(type: '**', listener: TypedFastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
/**
* 注册一次性事件监听器
* @param type - 事件类型,支持与on方法相同的格式:
* - 普通字符串:'user/login'
* - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)
* @param listener - 事件监听器函数
* @returns 返回订阅者对象,包含off方法用于取消监听
*
* @description
* 监听器只会在事件首次触发时被调用一次,之后会自动解除注册。
* 这是on方法的特例,相当于设置options.count = 1。
* 如果事件有保留消息,新注册的监听器会立即收到最近一次的保留消息并解除注册。
*
* @example
* ```ts
* // 只监听一次登录事件
* emitter.once('user/login', (data) => {
* console.log('用户登录:', data);
* });
* ```
*/
once<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends keyof OmitTransformedEvents<AllEvents>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends keyof PickTransformedEvents<AllEvents>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<AllEvents, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<AllEvents, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
/**
* 注册一个监听器,用于监听所有事件
* @param listener 事件监听器函数,可以接收任意类型的事件数据
* @returns {FastEventSubscriber} 返回一个订阅者对象,包含 off 方法用于取消监听
* @example
* ```ts
* const subscriber = emitter.onAny((eventName, data) => {
* console.log(eventName, data);
* });
*
* // 取消监听
* subscriber.off();
* ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber
*/
onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
onAny<P = any>(listener: TypedFastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
/**
*
* 当调用on/once/onAny时如果没有指定监听器,则调用此方法
*
* 此方法供子类继承
*
*/
onMessage(message: TypedFastEventMessage<AllEvents, Meta>, args: FastEventListenerArgs<Meta>): void;
off(listener: TypedFastEventListener<any, any, any>): void;
off(type: string, listener: TypedFastEventListener<any, any, any>): void;
off(type: Types, listener: TypedFastEventListener<any, any, any>): void;
off(type: string): void;
off(type: Types): void;
/**
* 移除所有事件监听器
* @param entry - 可选的事件前缀,如果提供则只移除指定前缀下的的监听器
* @description
* - 如果提供了prefix参数,则只清除该前缀下的所有监听器
* - 如果没有提供prefix,则清除所有监听器
* - 同时会清空保留的事件(_retainedEvents)
* - 重置监听器对象为空
* @example
*
* ```ts
* emitter.offAll(); // 清除所有监听器
* emitter.offAll('a/b'); // 清除a/b下的所有监听器
*
*/
offAll(entry?: string): void;
/**
* 移除保留的事件
* @param prefix - 事件前缀。如果不提供,将清除所有保留的事件。
* 如果提供前缀,将删除所有以该前缀开头的事件。
* 如果前缀不以分隔符结尾,会自动添加分隔符。
* @private
*/
private _removeRetainedEvents;
clear(prefix?: string): void;
/**
* 发送最后一次事件的消息给对应的监听器
*
* @param type - 事件类型,支持通配符(*)匹配
* @private
*
* 处理流程:
* 1. 如果事件类型包含通配符,则遍历所有保留的消息,匹配符合模式的事件
* 2. 如果是普通事件类型,则直接获取对应的保留消息
* 3. 遍历匹配到的消息,查找对应路径的监听器节点
* 4. 执行所有匹配到的监听器
*/
private _emitRetainMessage;
/**
* 遍历监听器节点树
* @param node 当前遍历的监听器节点
* @param parts 事件名称按'.'分割的部分数组
* @param callback 遍历到目标节点时的回调函数
* @param index 当前遍历的parts数组索引,默认为0
* @param lastFollowing 当命中**时该值为true, 注意**只能作在路径的最后面,如a.**有效,而a.**.b无效
* @private
*
* 支持三种匹配模式:
* - 精确匹配: 'a.b.c'
* - 单层通配: 'a.*.c'
* - 多层通配: 'a.**'
*/
private _traverseToPath;
private _traverseListeners;
private _onListenerError;
private _setListenerFlags;
/**
* 执行单个监听器函数
* @param listener - 要执行的监听器函数或包装过的监听器对象
* @param message - 事件消息对象,包含type、payload和meta
* @param args - 监听器参数
* @param catchErrors - 是否捕获并处理执行过程中的错误
* @returns 监听器的执行结果或错误对象(如果配置了ignoreErrors)
* @private
*
* @description
* 执行单个监听器函数,处理以下情况:
* - 如果监听器是包装过的(有__wrappedListener属性),调用包装的函数
* - 否则直接调用监听器函数
* - 使用配置的上下文(_context)作为this
* - 捕获并处理执行过程中的错误:
* - 如果有onListenerError回调,调用它
* - 如果配置了ignoreErrors,返回错误对象
* - 否则抛出错误
*/
private _executeListener;
private _getListenerExecutor;
/**
* 执行监听器节点列表中的所有监听器函数
* @param nodes 监听器节点列表
* @param message 事件消息对象
* @param args 监听器参数
* @param args 监听器参数
* @returns 所有监听器函数的执行结果数组
* @private
*
* 执行流程:
* 1. 将所有节点中的监听器函数展平为一维数组
* 2. 通过执行器执行所有监听器函数
* 3. 更新监听器的执行次数,并移除达到执行次数限制的监听器
*/
private _executeListeners;
/**
* 减少侦听器的执行次数
* @param listeners
*/
_decListenerExecCount(listeners: [FastListenerMeta, number, FastListenerMeta[]][]): void;
/**
* 获取指定类型的所有事件监听器
* @param type - 事件类型,必须是 AllEvents 的键
* @returns 包含指定类型的所有监听器元数据的数组
*/
getListeners(type: keyof AllEvents): FastListenerMeta[];
/**
* 触发事件并执行对应的监听器
*
* @param type - 事件类型字符串或包含事件信息的对象
* @param payload - 事件携带的数据负载
* @param retain - 是否保留该事件(用于新订阅者)
* @param meta - 事件元数据
* @returns 所有监听器的执行结果数组
*
* @example
* // 方式1: 参数形式
* emit('user.login', { id: 1 }, true)
*
* // 方式2: 对象形式
* emit({ type: 'user.login', payload: { id: 1 } ,meta:{...}}}, true)
*/
/**
* 同步触发事件
* @param type - 事件类型,可以是字符串或预定义的事件类型
* @param payload - 事件数据负载
* @param retain - 是否保留该事件,用于后续新的订阅者
* @param meta - 事件元数据
* @returns 所有监听器的执行结果数组
*
* @description
* 同步触发指定类型的事件,支持两种调用方式:
* 1. 参数形式:emit(type, payload, retain, meta)
* 2. 对象形式:emit({ type, payload, meta }, retain)
*
* 特性:
* - 支持通配符匹配,一个事件可能触发多个监听器
* - 如果设置了retain为true,会保存最后一次的事件数据
* - 按照注册顺序同步调用所有匹配的监听器
* - 如果配置了ignoreErrors,监听器抛出的错误会被捕获并返回
*
* @example
* ```ts
* // 简单事件触发
* emitter.emit('user/login', { userId: 123 });
*
* // 带保留的事件触发
* emitter.emit('status/change', { online: true }, true);
*
* // 带元数据的事件触发
* emitter.emit('data/update', newData, false, { timestamp: Date.now() });
*
* // 使用对象形式触发
* emitter.emit({
* type: 'user/login',
* payload: { userId: 123 },
* meta: { time: Date.now() }
* }, true);
*
* // 清除保留事件
* emitter.emit("user/login")
*
* ```
*/
emit<T extends Types = Types>(type: T, directive: symbol): any[];
emit(type: string, directive: symbol): any[];
emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, retain?: boolean): R[];
emit<R = any, T extends string = string>(type: T, payload: PickPayload<T extends Types ? AllEvents[T] : RecordValues<WildcardEvents<AllEvents, T>>>, retain?: boolean): R[];
emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: K extends Types ? AllEvents[K] : any;
}, Meta>, retain?: boolean): R[];
emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[];
emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, options?: FastEventListenerArgs<Meta>): R[];
emit<R = any, T extends string = string>(type: T, payload: PickPayload<T extends Types ? AllEvents[T] : RecordValues<WildcardEvents<AllEvents, T>>>, options?: FastEventListenerArgs<Meta>): R[];
emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
}, Meta>, options?: FastEventListenerArgs<Meta>): R[];
emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[];
/**
* 异步触发事件
* @param type - 事件类型,可以是字符串或预定义的事件类型
* @param payload - 事件数据负载
* @param retain - 是否保留该事件,用于后续新的订阅者
* @param meta - 事件元数据
* @returns Promise,解析为所有监听器的执行结果数组
*
* @description
* 异步触发指定类型的事件,与emit方法类似,但有以下区别:
* - 返回Promise,等待所有异步监听器执行完成
* - 使用Promise.allSettled处理监听器的执行结果
* - 即使某些监听器失败,也会等待所有监听器执行完成
* - 返回结果包含成功值或错误信息
*
* @example
* ```ts
* // 异步事件处理
* const results = await emitter.emitAsync('data/process', rawData);
*
* // 处理结果包含成功和失败的情况
* results.forEach(result => {
* if (result instanceof Error) {
* console.error('处理失败:', result);
* } else {
* console.log('处理成功:', result);
* }
* });
*
* // 带元数据的异步事件
* await emitter.emitAsync('batch/process', items, false, {
* batchId: 'batch-001',
* timestamp: Date.now()
* });
* ```
*/
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? AllEvents[T] : any>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
}, Meta>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? AllEvents[T] : any>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
}, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
/**
* 等待指定事件发生,返回一个Promise
* @param type - 要等待的事件类型
* @param timeout - 超时时间(毫秒),默认为0表示永不超时
* @returns Promise,解析为事件消息对象,包含type、payload和meta
*
* @description
* 创建一个Promise,在指定事件发生时解析。
* - 当事件触发时,Promise会解析为事件消息对象
* - 如果设置了timeout且超时,Promise会被拒绝
* - 一旦事件发生或超时,会自动取消事件监听
*
* @example
* ```ts
* try {
* // 等待登录事件,最多等待5秒
* const event = await emitter.waitFor('user/login', 5000);
* console.log('用户登录成功:', event.payload);
* } catch (error) {
* console.error('等待登录超时');
* }
*
* // 无限等待事件
* const event = await emitter.waitFor('server/ready');
* console.log('服务器就绪');
*
* // 等待指定的事件发生,并且如果该事件有其他订阅者,则同时等待该事件的所有订阅执行完成
* waitFor
*
*
*
* ```
*/
waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
[key in T]: AllEvents[T];
}, Meta>>;
waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<AllEvents, Meta>>;
waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
[key: string]: P;
}, Meta>>;
/**
* 创建一个新的事件作用域
* @param prefix - 作用域前缀,将自动添加到该作用域下所有事件名称前
* @returns 新的FastEventScope实例
*
* @description
* 创建一个新的事件作用域,用于在特定命名空间下管理事件。
*
* 重要特性:
* - 作用域与父事件发射器共享同一个监听器表
* - 作用域中的事件会自动添加前缀
* - 作用域的所有操作都会映射到父事件发射器上
* - 作用域不是完全隔离的,只是提供了事件名称的命名空间
*
* @example
* ```ts
* const emitter = new FastEvent();
*
* // 创建用户相关事件的作用域
* const userEvents = emitter.scope('user');
*
* // 在作用域中监听事件
* userEvents.on('login', (data) => {
* // 实际监听的是 'user/login'
* console.log('用户登录:', data);
* });
*
* // 在作用域中触发事件
* userEvents.emit('login', { userId: 123 });
* // 等同于 emitter.emit('user/login', { userId: 123 })
*
* // 创建嵌套作用域
* const profileEvents = userEvents.scope('profile');
* profileEvents.emit('update', { name: 'John' });
* // 等同于 emitter.emit('user/profile/update', { name: 'John' })
*
* // 清理作用域
* userEvents.offAll(); // 清理 'user' 前缀下的所有事件
* ```
*/
scope<P extends string>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta, Context>>): FastEventScope<ScopeEvents<AllEvents, P>, Meta, Context>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context, ScopeObject extends InstanceType<Class> = InstanceType<Class>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScopeExtend<AllEvents, P, ScopeObject>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeObject extends FastEventScope<any, any, any> = FastEventScope<any, any, any>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): ScopeObject & FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>;
}
type FastEventBusNodeOptions<Meta = Record<string, any>, Context = any> = FastEventOptions<Meta, Context> & {};
declare class FastEventBusNode<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never> extends FastEvent<Events, Meta, Context> {
eventbus?: FastEventBus<any, any, any, any, any>;
private _subscribers;
constructor(options?: DeepPartial<FastEventBusNodeOptions<Meta, Context>>);
/**
*
* 如果事件名称带有名称空间分隔符::,则说明该触发的消息是要转发到其他节点,
* 由eventbus进行转发
*
* emit("otherNode@<事件名>") // 在otherNode节点上触发事件
* emit("@<事件名>") // 在当前总线队象上触发事件
*
* 事件执行前的监听器处理函数
* 处理带有命名空间前缀的事件,格式为 "<节点id>::<事件名>"
* 如果事件包含命名空间,则将事件转发到对应节点或全局事件总线
*
* @param message - 事件消息对象
* @param args - 事件监听器参数
* @returns {boolean} false 表示取消在内部触发事件,undefined 表示继续执行
* @private
*/
private _onBeforeExecuteListener;
private _onAddListener;
/**
* 加入事件总线
* @param eventBus 要加入的事件总线
*/
connect<E extends Record<string, any> = Record<string, any>, M extends Record<string, any> = Record<string, any>, C = any>(eventbus: FastEventBus<E, M, C>): void;
disconnect(): void;
/**
*
* 订阅来自其他节点的消息
*
* 在Eventbus中的所有以`node::<节点id>/<事件>`的事件均会被转发到当前节点
*
* @private
*/
private _onSubscribeForNode;
/**
* 发送点对点消息到指定节点
* @param toNodeId 目标节点ID
* @param message 要发送的消息
*/
send<R = any, T extends FastEventBusNodeIds = FastEventBusNodeIds>(toNodeId: T, payload: any, args?: FastEventListenerArgs): R[];
send<R = any, T extends string = string>(toNodeId: T, payload: any, args?: FastEventListenerArgs): R[];
private _assertConnected;
/**
* 广播消息到所有其他节点
*
*
* @param message 要广播的消息
*/
broadcast<R = any, T extends FastEventBusEventTypes = FastEventBusEventTypes>(message: FastEventBusMessage<{
[K in T]: K extends FastEventBusEventTypes ? FastEventBusEvents[K] : any;
}>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends string = string>(message: FastEventBusMessage<{
[K in T]: K extends FastEventBusEventTypes ? FastEventBusEvents[K] : any;
}, Meta>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends FastEventBusEventTypes = FastEventBusEventTypes>(type: T, payload: FastEventBusEvents[T], options?: FastEventListenerArgs<Meta>): R[];
broadcast<R = any, T extends string = string>(type: T, payload: T extends FastEventBusEventTypes ? FastEventBusEvents[T] : any, options?: FastEventListenerArgs<Meta>): R[];
/**
* 处理接收到的消息
* 供子类继承重载
*/
onMessage(message: FastEventBusMessage, args: FastEventListenerArgs): void;
}
/**
*
* const eventbus = new FastEventBus()
*
* const node1 = new FastEventBusNode({id:"node1",...})
* const node2 = new FastEventBusNode({id:"node2",...})
* const node3 = new FastEventBusNode({id:"node3",...})
*
* - 将节点添加到FastEventBus中
* eventbus.add(node1)
* eventbus.add(node2)
* eventbus.add(node3)
* 或者
* node1.join(eventbus)
* node2.join(eventbus)
* node3.join(eventbus)
*
* - 每个节点均有唯一的节点名称,用于区分不同的节点
* - 每个节点是一个独立的FastEvent实例
* - 每个节点的配置选项与FastEvent相同
* - 节点之间相互独立,互不影响
* - FastEventBus负载节点之间的通讯
* - 所有节点均可以在onMessage中接收到其订阅或点对点或广播的消息
*
* - 可以广播消息给所有节点
*
* eventbus.broadcast(message)
* node1.broadcast(message)
*
* - 可以在节点之间进行点对点发送消息
*
* eventbus.send(node1.id, message)
* node1.send(node2.id, message)
*
*
* - 节点消息接收到的消息是FastEventBusNodeMessage,增加了from代表是消息来自哪里
* - 节点如果要订阅其他节点的消息,需要在事件类型名称加::
* node1.on("node2::test",listener,{...})代表订阅node2的test事件
* - 节点可以在全局触发事件
* node1.emit("::test") 在全局(即Eventbus)触发事件
* node2.on("::test",listener,{...})
*
*/
declare class FastEventBus<Events extends Record<string, any> = FastEventBusEvents, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Exclude<Expand<Events & FastEventBusEvents>, number | symbol>, Types extends keyof AllEvents = Expand<Exclude<keyof (AllEvents), number | symbol>>> extends FastEvent<Events & FastEventBusEvents, Meta, Context> {
nodes: Map<string, FastEventBusNode<any, any, any>>;
constructor(options?: FastEventBusOptions<Meta, Context>);
/**
* 添加节点到事件总线
* @param node 要添加的节点
*/
add(...nodes: FastEventBusNode<any, any, any>[]): void;
/**
* 从事件总线移除节点
* @param nodeId 要移除的节点ID
*/
remove(nodeId: string): void;
/**
* 广播消息到所有节点
*
* broadcast(1) // 默认广播主题data
* broadcast({
* type: 'connect',
* payload: 100
* }) *
*
* @param message 要广播的消息
*/
broadcast<R = any, T extends Types = Types>(message: FastEventBusMessage<{
[K in T]: AllEvents[T];
}, Meta>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends string = string>(message: FastEventBusMessage<{
[K in T]: K extends Types ? AllEvents[K] : any;
}, Meta>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[];
broadcast<R = any, T extends Types = Types>(type: T, payload: AllEvents[T], args?: FastEventListenerArgs): R[];
/**
* 发送消息到指定节点
*
* 点对点消息的事件名称为data
*
* @param toNodeId 目标节点ID
* @param message 要发送的消息
*/
send<R = any>(message: FastEventBusMessage, args?: FastEventListenerArgs): R[];
}
declare const NamespaceDelimiter = "::";
declare const BroadcastEvent = "@";
declare const NodeDataEvent = "data";
declare const __FastEvent__: unique symbol;
declare const __FastEventScope__: unique symbol;
declare class FastEventError extends Error {
constructor(message?: string);
}
declare class TimeoutError extends FastEventError {
}
declare class UnboundError extends FastEventError {
}
declare class AbortError extends FastEventError {
}
declare class CancelError extends FastEventError {
}
declare class QueueOverflowError extends FastEventError {
}
declare const FastEventDirectives: {
clearRetain: symbol;
};
declare function isFastEventScope(target: any): target is FastEventScope;
declare function isFastEventMessage(msg: any): msg is TypedFastEventMessage;
declare function isFunction(fn: any): fn is Function;
declare function isString(str: any): str is string;
/**
*
*
* 用于包括输入值为可展开的对象
*
*
* 用在emit事件
*
* emitter1 = new FastEvent()
* emitter2 = new FastEvent()
*
* emitter1.on("xxx",(message)=>{
* return emitter2.emit(message)
* })
*
* emitter2.on("xxx",()=>1)
* emitter2.on("xxx",()=>2)
*
* const results = emitter1.emit("xxx")
* // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]
*
* expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开
*
*
*
*
* emitter1.on("xxx",(message)=>{
* // 告诉emitter2.emit返回的是一个expandable对象
* // 然后在内部就展开此对象
* return emitter2.emit(message)
* })
*
* const results = emitter1.emit("xxx")
* // results == [1,2]
*
* 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查
* 这多了一个迭代操作,为了不影响性能,可以关闭此特性
* options.expandEmitResults = false
*
*
*/
declare const __expandable__: unique symbol;
declare function expandable(value: any): any;
declare function isExpandable(value: any): any;
/**
*
* 判断path是否与pattern匹配
*
* isPathMatched("a.b.c","a.b.c") == true
* isPathMatched("a.b.c","a.b.*") == true
* isPathMatched("a.b.c","a.*.*") == true
* isPathMatched("a.b.c","*.*.*") == true
* isPathMatched("a.b.c",".b.*") == true
* isPathMatched("a.b.c.d","a.**") == true
*
* - '**' 匹配后续的
* - '*' 匹配任意数量的字符,包括零个字符
*
* @param path
* @param pattern
*/
declare function isPathMatched(path: string[], pattern: string[]): boolean;
declare function isSubsctiber(val: any): val is FastEventSubscriber;
declare function isClass(target: unknown): target is new (...args: any[]) => any;
declare function isFastEvent(target: any): target is FastEvent;
export { AbortError, type AssertFastMessage, type AtPayloads, BroadcastEvent, CancelError, type ChangeFieldType, type Class, type ClosestWildcardEvents, type DeepPartial, type Dict, type Expand, type ExpandWildcard, type Fallback, FastEvent, FastEventBus, type FastEventBusEventTypes, type FastEventBusEvents, type FastEventBusMessage, FastEventBusNode, type FastEventBusNodeIds, type FastEventBusNodeOptions, type FastEventBusNodes, type FastEventBusOptions, FastEventDirectives, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, FastEventListenerFlags, type FastEventListeners, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeExtend, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerMeta, type FastListenerNode, type FastListeners, type FastMessagePayload, type GetFirstMatchedItem, type GetNotWildcardItems, type Keys, type Merge, type MergeUnion, NamespaceDelimiter, NodeDataEvent, type NotPayload, type ObjectKeys, type OmitTransformedEvents, type OptionalItems, type Overloads, type OverrideOptions, type PickPayload, type PickTransformedEvents, QueueOverflowError, type RecordPrefix, type RecordValues, type RequiredItems, type ScopeEvents, TimeoutError, type TransformedEvents, type TypedFastEventAnyListener, type TypedFastEventListener, type TypedFastEventMessage, type TypedFastEventMessageOptional, UnboundError, type Unique, type WildcardEvents, __FastEventScope__, __FastEvent__, __expandable__, expandable, isClass, isExpandable, isFastEvent, isFastEventMessage, isFastEventScope, isFunction, isPathMatched, isString, isSubsctiber };
type FastListenerExecutor = (listeners: FastListenerMeta[], message: TypedFastEventMessage, args: FastEventListenerArgs, execute: (listener: TypedFastEventListener, message: TypedFastEventMessage, args: FastEventListenerArgs, catchErrors?: boolean) => Promise<any> | any) => Promise<any[]> | any[];
type FastListenerPipe = (listener: TypedFastEventListener) => TypedFastEventListener;
type Expand$1<T> = T extends infer O ? {
[K in keyof O]: O[K];
} : never;
type ContainsWildcard<T extends string> = T extends `${string}/*/${string}` ? true : T extends `${string}/*` ? true : T extends `*/${string}` ? true : T extends `*` ? true : false;
type ReplaceWildcard<T extends string> = T extends `*${infer Rest}` ? `${string}${ReplaceWildcard<Rest>}` : T extends `${infer Head}*${infer Rest}` ? `${Head}${string}${ReplaceWildcard<Rest>}` : T;
type WildcardKeys<T> = {
[K in keyof T]: K extends string ? (ContainsWildcard<K> extends true ? K : never) : never;
}[keyof T];
type ExpandWildcard<T extends Record<string, any>> = Expand$1<T & {
[K in WildcardKeys<T> as ReplaceWildcard<K>]: T[K];
}>;
type UnionToTuple<T> = UnionToTupleRec<T, []>;
type UnionToTupleRec<T, R extends any[]> = [T] extends [never] ? R : UnionToTupleRec<Exclude<T, LastOfUnion<T>>, [LastOfUnion<T>, ...R]>;
type LastOfUnion<T> = UnionToIntersection<T extends any ? (x: T) => 0 : never> extends (x: infer L) => 0 ? L : never;
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
type Keys<T extends Record<string, any>> = UnionToTuple<keyof T>;
type MergeUnion<T> = (T extends any ? (x: T) => void : never) extends (x: infer U) => void ? {
[K in keyof U]: U[K];
} : never;
type Split$1<S extends string, Delimiter extends string = '/'> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split$1<Tail, Delimiter>] : [S];
type MatchSegment<Input extends string, Pattern extends string> = Pattern extends '*' ? true : Pattern extends '**' ? true : Input extends Pattern ? true : false;
type MatchPatternArray<InputArr extends string[], PatternArr extends string[]> = InputArr extends [infer InputHead extends string, ...infer InputTail extends string[]] ? PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends '**' ? MatchPatternArray<InputTail, PatternTail> extends true ? true : MatchPatternArray<InputTail, PatternArr> extends true ? true : MatchPatternArray<InputArr, PatternTail> extends true ? true : false : MatchSegment<InputHead, PatternHead> extends true ? MatchPatternArray<InputTail, PatternTail> : false : false : PatternArr extends [infer PatternHead extends string, ...infer PatternTail extends string[]] ? PatternHead extends '**' ? MatchPatternArray<InputArr, PatternTail> : false : true;
type MatchPattern<T extends string, Pattern extends string> = MatchPatternArray<Split$1<T>, Split$1<Pattern>> extends true ? {
[K in Pattern]: any;
} : never;
type Fallback$1<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
/**
*
* 返回所有匹配事件的类型
*
* 支持通配符
*
* @param T 事件名称
* @param Events 事件类型
* @returns
*
*/
type WildcardEvents<Events extends Record<string, any>, T extends string> = MergeUnion<Fallback$1<{
[K in keyof Events]: MatchPattern<T, K & string> extends never ? never : {
[P in K]: Events[K];
};
}[keyof Events] extends infer Result ? Result extends Record<string, any> ? Result : Record<string, any> : Record<string, any>, {
[K in T]: any;
}>>;
/**
* 保留对象中第一项
*/
type FirstObjectItem<T extends Record<string, any>> = Pick<T, Keys<T> extends any[] ? Keys<T>[0] : never>;
type isEmpty<T extends Record<string, any>> = keyof T extends never ? true : false;
type GetWildcardItems<T extends Record<string, any>> = {
[K in keyof T as K extends `${string}*${string}` ? K : K extends `*` ? K : never]: T[K];
};
type GetNotWildcardItems<T extends Record<string, any>> = {
[K in keyof T as K extends `${string}*${string}` ? never : K extends `*` ? never : K]: T[K];
};
type GetFirstMatchedItem<T extends Record<string, any>> = FirstObjectItem<isEmpty<GetNotWildcardItems<T>> extends true ? GetWildcardItems<T> : GetNotWildcardItems<T>>;
type ClosestWildcardEvents<Events extends Record<string, any>, T extends string> = GetFirstMatchedItem<WildcardEvents<Events, T>>;
type Split<S extends string, Delimiter extends string> = S extends `${infer Head}${Delimiter}${infer Tail}` ? [Head, ...Split<Tail, Delimiter>] : [S];
type MatchPatternAndGetRemainder<KeyParts extends string[], PrefixParts extends string[], Result extends string[] = []> = PrefixParts['length'] extends 0 ? KeyParts['length'] extends 0 ? never : KeyParts : KeyParts['length'] extends 0 ? never : KeyParts[0] extends PrefixParts[0] | '*' ? MatchPatternAndGetRemainder<Slice<KeyParts, 1>, Slice<PrefixParts, 1>, Result> : never;
type Slice<T extends any[], Start extends number, Result extends any[] = []> = Start extends 0 ? T : T extends [infer First, ...infer Rest] ? Slice<Rest, Decrement<Start>, Result> : Result;
type Decrement<N extends number> = N extends 0 ? 0 : N extends 1 ? 0 : N extends 2 ? 1 : N extends 3 ? 2 : N extends 4 ? 3 : N extends 5 ? 4 : N extends 6 ? 5 : N extends 7 ? 6 : N extends 8 ? 7 : N extends 9 ? 8 : number;
type Join<T extends string[], Delimiter extends string = '/'> = T extends [infer First extends string, ...infer Rest extends string[]] ? Rest['length'] extends 0 ? First : `${First}${Delimiter}${Join<Rest, Delimiter>}` : '';
type ScopeEvents<Events extends Record<string, any>, Prefix extends string> = {
[K in keyof Events as K extends string ? MatchPatternAndGetRemainder<Split<K, '/'>, Split<Prefix, '/'>> extends infer Remainder ? Remainder extends string[] ? Join<Remainder, '/'> : never : never : never]: Events[K];
};
interface FastEventMeta {
}
interface FastEventMessageExtends {
}
type FastEventMessage<P = any, M extends Record<string, any> = Record<string, any>, T extends string = string> = {
type: T;
payload: P;
meta?: M & Partial<FastEventMeta>;
} & FastEventMessageExtends;
type TypedFastEventMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta: FastEventMeta & M & Record<string, any>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type TypedFastEventMessageOptional<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type: Exclude<K, number | symbol>;
payload: Events[K];
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type FastEventEmitMessage<Events extends Record<string, any> = Record<string, any>, M = any> = {
[K in keyof Events]: {
type: Exclude<K, number | symbol>;
payload?: Events[K];
meta?: DeepPartial<FastEventMeta & M & Record<string, any>>;
};
}[Exclude<keyof Events, number | symbol>] & FastEventMessageExtends;
type FastMessagePayload<P = any> = {
type: P;
__IS_FAST_MESSAGE__: true;
};
type TypedFastEventListener<T extends string = string, P = any, M = any, C = any> = (this: C, message: TypedFastEventMessage<Record<T, P>, M>, args: FastEventListenerArgs<M>) => any | Promise<any>;
type TypedFastEventAnyListener<Events extends Record<string, any> = Record<string, any>, Meta = never, Context = any> = (this: Context, message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => any | Promise<any>;
type FastEventListeners<Events extends Record<string, any> = Record<string, any>, M = any, C = any> = {
[K in keyof Events]: TypedFastEventListener<Exclude<K, number | symbol>, Events[K], M, C>;
};
type FastEventListener<P = any, M extends Record<string, any> = Record<string, any>, T extends string = string> = (message: FastEventMessage<P, M, T>, args: FastEventListenerArgs<M>) => any | Promise<any>;
/**
* [
* 监听器函数引用,
* 需要执行多少次, =0代表不限
* 实际执行的次数(用于负载均衡时记录)
* 标签 用于调试一般可以标识监听器类型或任意信息
* 标识
* ]
*/
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string, number];
type FastListenerNode = {
__listeners: FastListenerMeta[];
} & {
[key: string]: FastListenerNode;
};
type FastEventSubscriber = {
off: () => void;
/**
* 为什么要有一个listener引用? 主要用于移除监听器时使用
*
* - 正常情况下
* const subscriber = emitter.on('event', listener)
*
* subscriber.off()
* emitter.off('event', listener)
* emitter.off(listener)
*
* - 在使用scope时
* const scope = emitter.scope("xxx")
* const subscriber = scope.on('event', listener)
*
* subscriber.off() 可以正常生效
* scope.off('event', listener) // 无法生效
* scope.off(listener) // 无法生效
* 因为在scope中,为了让监听器可以处理scope的逻辑,对listener进行了包装,
* 因此在事件注册表中登记的不是listener,而是经过包装的监听器
* subscriber.off() 可以正常生效
* 如果要使用scope.off或emitter.off
* 需要使用subscriber.listener, subscriber.listener记录了原始的监听器引用
* subscriber.listener===listener
*
* scope.off('event', subscriber.listener) // 生效
* scope.off(subscriber.listener) // 生效
*
*/
listener: TypedFastEventListener<any, any, any>;
};
type FastListeners = FastListenerNode;
type FastEventOptions<Meta = Record<string, any>, Context = never> = {
id: string;
debug: boolean;
delimiter: string;
context: Context;
ignoreErrors: boolean;
meta: Meta;
onAddListener?: (type: string, listener: TypedFastEventListener, options: FastEventListenOptions<Record<string, any>, Meta>) => boolean | FastEventSubscriber | void;
onRemoveListener?: (type: string, listener: TypedFastEventListener) => void;
onClearListeners?: () => void;
onListenerError?: (error: Error, listener: TypedFastEventListener, message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta> | undefined) => void;
onBeforeExecuteListener?: (message: TypedFastEventMessage<any, Meta>, args: FastEventListenerArgs<Meta>) => boolean | void | any[];
onAfterExecuteListener?: (message: TypedFastEventMessage<any, Meta>, returns: any[], listeners: FastListenerNode[]) => void;
/**
* 全局执行器
*/
executor?: FastListenerExecutor;
onMessage?: TypedFastEventListener;
expandEmitResults?: boolean;
/**
* 对接收到的消息进行转换,用于将消息转换成其他格式
*
* new FastEvent({
* transform:(message)=>{
* message.payload
* }
* })
*/
transform?: (message: FastEventMessage) => any;
};
interface FastEvents {
}
type FastEventListenOptions<Events extends Record<string, any> = Record<string, any>, Meta = any> = {
count?: number;
prepend?: boolean;
flags?: number;
filter?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
off?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean;
pipes?: FastListenerPipe[];
/**
* 为监听器添加一个tag,在监听器注册表中记录,用于调试使用
* emitter.on(type,listener,{tag:"x"})
* emitter.getListeners(tag)
*/
tag?: string;
};
declare enum FastEventListenerFlags {
Transformed = 1
}
type FastEventListenerArgs<M = Record<string, any>> = {
retain?: boolean;
meta?: DeepPartial<M> & Record<string, any>;
abortSignal?: AbortSignal;
/**
*
* allSettled: 使用Promise.allSettled()执行所有监听器
* race: 使用Promise.race()执行所有监听器,只有第一个执行完成就返回,其他监听器执行结果会被忽略
* balance: 尽可能平均执行各个监听器
* sequence: 按照监听器添加顺序依次执行
*/
executor?: FastListenerExecutor;
/**
* 当emit参数解析完成后的回调,用于修改emit参数
*/
parseArgs?: (message: TypedFastEventMessage, args: FastEventListenerArgs) => void;
/**
* 额外的标识
*
* - 1: transformed 当消息是经过transform转换后的消息时的标识
*
*/
flags?: FastEventListenerFlags;
/**
* 如果消息经过转换前的原主题
*/
rawEventType?: string;
};
type Merge<T extends object, U extends object> = {
[K in keyof T | keyof U]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never;
};
type RequiredItems<T extends object, Items extends string[]> = Omit<T, Items[number]> & {
[K in Items[number] & keyof T]-?: Exclude<T[K], undefined>;
};
type Expand<T> = T extends infer O ? {
[K in keyof O]: O[K];
} : never;
type OptionalItems<T, K extends keyof T> = Expand<Omit<T, K> & {
[P in K]?: T[P];
}>;
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type Fallback<T, F> = [T] extends [never] ? F : T extends undefined ? F : T;
type ChangeFieldType<Record, Name extends string, Type = any> = Expand<Omit<Record, Name> & {
[K in Name]: Type;
}>;
type OverrideOptions<T> = ChangeFieldType<Required<T>, 'context', never>;
type ObjectKeys<T, I = string> = {
[P in keyof T]: P extends I ? P : never;
}[keyof T];
/**
* 从类型数组中移除重复项,返回保留唯一类型的元组
* @template T - 输入的任意类型数组(元组)
* @template Result - 内部使用的累积结果数组(默认空数组)
* @returns {any[]} 去重后的类型元组,保留首次出现的顺序
*
* @example
* type T1 = Unique<[number, string, number]>; // [number, string]
* type T2 = Unique<[1, 2, 2, 3]>; // [1, 2, 3]
* type T3 = Unique<['a', 'b', 'a']>; // ['a', 'b']
*/
type Unique<T extends any[], Result extends any[] = []> = T extends [infer First, ...infer Rest] ? First extends Result[number] ? Unique<Rest, Result> : Unique<Rest, [...Result, First]> : Result;
type Overloads<T> = Unique<T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
(...args: infer A7): infer R7;
(...args: infer A8): infer R8;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6, (...args: A7) => R7, (...args: A8) => R8] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
(...args: infer A7): infer R7;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6, (...args: A7) => R7] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
(...args: infer A6): infer R6;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5, (...args: A6) => R6] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
(...args: infer A5): infer R5;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4, (...args: A5) => R5] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
(...args: infer A4): infer R4;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3, (...args: A4) => R4] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
(...args: infer A3): infer R3;
} ? [(...args: A1) => R1, (...args: A2) => R2, (...args: A3) => R3] : T extends {
(...args: infer A1): infer R1;
(...args: infer A2): infer R2;
} ? [(...args: A1) => R1, (...args: A2) => R2] : T extends {
(...args: infer A1): infer R1;
} ? [(...args: A1) => R1] : [T]>;
type Dict<V = any> = Record<Exclude<string, number | symbol>, V>;
type RecordValues<R extends Record<string, any>> = R[keyof R];
type RecordPrefix<P extends string, R extends Record<string, any>> = {
[K in keyof R as K extends `${P}/${infer S}` ? S : never]: R[K];
};
/**
* 声明事件类型时,一般情况下,K=事件名称,V=事件Payload参数类型
*
* AssertFastMessage用于声明V是一个FastMessage类型,而不是Payload类型
*
* 一般配合transform参数使用
*
* 例如:
* type CustomEvents = {
click: { x: number; y: number };
}
const emitter = new FastEvent<CustomEvents>();
emitter.on('click', (message) => {
// typeof message.payload === { x: number; y: number }
})
const emitter = new FastEvent<CustomEvents>({
transform:(message)=>{
if(message.type === 'click'){
return message.payload
}else{
return message
}
}
});
emitter.on('click', (message) => {
// typeof message === { x: number; y: number }
}
*/
type AssertFastMessage<M> = {
type: M;
__IS_FAST_MESSAGE__: true;
};
type NotPayload<M> = AssertFastMessage<M>;
type PickPayload<M> = M extends FastMessagePayload ? M['type'] : M;
type AtPayloads<Events extends Record<string, any>> = {
[K in keyof Events]: PickPayload<Events[K]>;
};
type PickTransformedEvents<T extends Record<string, any>> = ExpandWildcard<{
[key in keyof T as T[key] extends FastMessagePayload ? key : never]: T[key];
}>;
type OmitTransformedEvents<T extends Record<string, any>> = {
[key in keyof T as T[key] extends FastMessagePayload ? never : key]: T[key];
};
type TransformedEvents<Events extends Record<string, any>> = {
[K in keyof Events]: NotPayload<Events[K]>;
};
type Class = (new (...args: any[]) => any) | (abstract new (...args: any[]) => any);
type FastEventBusMessage<Events extends Record<string, any> = Record<string, any>, M = any> = FastEventEmitMessage<Events, M> & {
from?: string;
to?: string;
};
type FastEventBusOptions<Meta = Record<string, any>, Context = any> = FastEventOptions<Meta, Context>;
interface FastEventBusEvents {
'$connect': string;
'$disconnect': string;
'data': any;
}
type FastEventBusEventTypes = keyof FastEventBusEvents;
interface FastEventBusNodes {
}
type FastEventBusNodeIds = keyof FastEventBusNodes;
type FastEventScopeOptions<Meta = Record<string, any>, Context = never> = {
meta: FastEventScopeMeta & FastEventMeta & Meta;
context: Context;
executor?: FastListenerExecutor;
onMessage?: TypedFastEventListener;
/**
* 对接收到的消息进行转换,用于将消息转换成其他格式
*
* new FastEvent({
* transform:(message)=>{
* message.payload
* }
* })
*/
transform?: (message: FastEventMessage) => any;
};
interface FastEventScopeMeta {
scope: string;
}
declare class FastEventScope<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, Types extends keyof Events = keyof Events, FinalMeta extends Record<string, any> = FastEventMeta & FastEventScopeMeta & Meta> {
__FastEventScope__: boolean;
private _options;
types: {
events: Events;
meta: FinalMeta;
context: Fallback<Context, typeof this>;
message: TypedFastEventMessageOptional<Events, FinalMeta>;
listeners: FastEventListeners<Events, FinalMeta>;
anyListener: TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>;
};
prefix: string;
emitter: FastEvent<any>;
constructor(options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>);
get context(): Fallback<Context, typeof this>;
get options(): FastEventScopeOptions<FinalMeta, Context>;
/**
* 获取监听器
* @returns 监听器
*/
get listeners(): FastListenerMeta[];
bind(emitter: FastEvent<any>, prefix: string, options?: DeepPartial<FastEventScopeOptions<FinalMeta, Context>>): void;
/**
* 初始化选项
*
* 本方法主要供子类重载
*
* @param initial - 可选的初始字典对象
* @returns 返回传入的初始字典对象
*/
_initOptions(initial: Dict | undefined): Dict | undefined;
/**
* 获取作用域监听器
* 当启用作用域时,对原始监听器进行包装,添加作用域前缀处理逻辑
* @param listener 原始事件监听器
* @returns 包装后的作用域监听器
* @private
*/
private _getScopeListener;
private _getScopeType;
private _fixScopeType;
on<T extends Types = Types>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
on<T extends Exclude<string, Types>>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
on(type: '**', options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
on<T extends keyof OmitTransformedEvents<Events>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
on<T extends keyof PickTransformedEvents<Events>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<Events, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<Events, Meta>): FastEventSubscriber;
on<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<Events, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
on(type: '**', listener: TypedFastEventAnyListener<Events, FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
once<T extends Types = Types>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
once<T extends Exclude<string, Types>>(type: T, options?: FastEventListenOptions<Events, FinalMeta>): FastEventSubscriber;
once<T extends keyof OmitTransformedEvents<Events>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, Events[T], FinalMeta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
once<T extends keyof PickTransformedEvents<Events>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<Events, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<Events, Meta>): FastEventSubscriber;
once<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<Events, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions): FastEventSubscriber;
onAny(options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
onAny<P = any>(listener: TypedFastEventAnyListener<{
[K: string]: P;
}, FinalMeta, Fallback<Context, typeof this>>, options?: Pick<FastEventListenOptions, 'prepend'>): FastEventSubscriber;
off(listener: TypedFastEventListener<any, any, any>): void;
off(type: string, listener: TypedFastEventListener<any, any, any>): void;
off(type: Types, listener: TypedFastEventListener<any, any, any>): void;
off(type: string): void;
off(type: Types): void;
offAll(): void;
clear(): void;
emit(type: Types, directive: symbol): void;
emit(type: string, directive: symbol): void;
emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, retain?: boolean): R[];
emit<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : RecordValues<WildcardEvents<Events, T>>>, retain?: boolean): R[];
emit<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : RecordValues<WildcardEvents<Events, T>>>, options?: FastEventListenerArgs<FinalMeta>): R[];
emit<R = any>(message: FastEventEmitMessage<AtPayloads<Events>, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? Events[K] : any>;
}, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): R[];
private _transformMessage;
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : any>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<Events[T]>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? Events[T] : any>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? Events[K] : any>;
}, FinalMeta>, options?: FastEventListenerArgs<FinalMeta>): Promise<[R | Error][]>;
waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
[key in T]: Events[T];
}, FinalMeta>>;
waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<{
[key: string]: any;
}, FinalMeta>>;
waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
[key: string]: P;
}, FinalMeta>>;
/**
* 创建一个新的作用域实例
* @param prefix - 作用域前缀
* @returns 新的FastEventScope实例
*
* @description
* 基于当前作用域创建一个新的子作用域。新作用域会继承当前作用域的所有特性,
* 并在事件类型前添加额外的前缀。这允许创建层级化的事件命名空间。
*
* 作用域的特性:
* - 自动为所有事件类型添加前缀
* - 在触发事件时自动添加前缀
* - 在接收事件时自动移除前缀
* - 支持多层级的作用域嵌套
*
* @example
* ```ts
* const emitter = new FastEvent();
* const userScope = emitter.scope('user');
* const profileScope = userScope.scope('profile');
*
* // 在profileScope中监听'update'事件
* // 实际监听的是'user/profile/update'
* profileScope.on('update', (data) => {
* console.log('Profile updated:', data);
* });
*
* // 在profileScope中触发'update'事件
* // 实际触发的是'user/profile/update'
* profileScope.emit('update', { name: 'John' });
* ```
*/
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context, ScopeObject extends InstanceType<Class> = InstanceType<Class>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScopeExtend<Events, P, ScopeObject>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeInstance extends FastEventScope<Record<string, any>, any, any> = FastEventScope<Record<string, any>, any, any>>(prefix: P, scopeObj: ScopeInstance, options?: DeepPartial<FastEventScopeOptions<Partial<FinalMeta> & M, C>>): ScopeInstance & FastEventScope<ScopeEvents<Events, P> & E, FinalMeta & M, C>;
/**
* 当on/once/onAny未指定监听器时,此为默认监听器
* @param message
*/
onMessage(message: TypedFastEventMessage<Events, FinalMeta>, args: FastEventListenerArgs<FinalMeta>): void;
}
type FastEventScopeExtend<Events extends Record<string, any>, Prefix extends string, T extends InstanceType<Class> = never> = FastEventScope<ScopeEvents<Events, Prefix>> & T;
/**
* FastEvent 事件发射器类
*
* @template Events - 事件类型定义,继承自FastEvents接口
* @template Meta - 事件元数据类型,默认为任意键值对对象
* @template Types - 事件类型的键名类型,默认为Events的键名类型
*/
declare class FastEvent<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Expand<Events & FastEvents>, Types extends keyof AllEvents = Expand<Exclude<keyof AllEvents, number | symbol>>> {
__FastEvent__: boolean;
/** 事件监听器树结构,存储所有注册的事件监听器 */
listeners: FastListeners;
/** 事件发射器的配置选项 */
private _options;
/** 事件名称的分隔符,默认为'/' */
private _delimiter;
/** 事件监听器执行时的上下文对象 */
private _context;
/** 保留的事件消息映射,Key是事件名称,Value是保留的事件消息 */
retainedMessages: Map<string, any>;
/** 当前注册的监听器总数 */
listenerCount: number;
types: {
events: AllEvents;
meta: Expand<FastEventMeta & Meta & Record<string, any>>;
context: Expand<Fallback<Context, typeof this>>;
message: TypedFastEventMessageOptional<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
listeners: FastEventListeners<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>>;
anyListener: TypedFastEventAnyListener<AllEvents, Expand<FastEventMeta & Meta & Record<string, any>>, Expand<Fallback<Context, typeof this>>>;
};
/**
* 创建FastEvent实例
* @param options - 事件发射器的配置选项
*
* 默认配置:
* - debug: false - 是否启用调试模式
* - id: 随机字符串 - 实例唯一标识符
* - delimiter: '/' - 事件名称分隔符
* - context: null - 监听器执行上下文
* - ignoreErrors: true - 是否忽略监听器执行错误
*/
constructor(options?: Partial<FastEventOptions<Meta, Context>>);
/** 获取事件发射器的配置选项 */
get options(): FastEventOptions<Meta, Context>;
get context(): Fallback<Context, typeof this>;
get meta(): Meta;
/** 获取事件发射器的唯一标识符 */
get id(): string;
/**
* 初始化选项
*
* 本方法主要供子类重载
*
* @param initial - 可选的初始字典对象
* @returns 返回传入的初始字典对象
*/
_initOptions(initial?: Partial<FastEventOptions<Meta, Context>>): Partial<FastEventOptions<Meta, Context>> | undefined;
/**
* 添加事件监听器到事件树中
* @param parts - 事件路径数组
* @param listener - 事件监听器函数
* @param options - 监听器配置选项
* @param options.count - 监听器触发次数限制
* @param options.prepend - 是否将监听器添加到监听器列表开头
* @returns [节点, 监听器索引] - 返回监听器所在节点和在节点监听器列表中的索引
* @private
*/
private _addListener;
private _enableDevTools;
/**
*
* 根据parts路径遍历监听器树,并在最后的节点上执行回调函数
*
* @param parts
* @param callback
* @returns
*/
private _forEachNodes;
/**
* 从监听器节点中移除指定的事件监听器
* @private
* @param node - 监听器节点
* @param listener - 需要移除的事件监听器
* @description 遍历节点的监听器列表,移除所有匹配的监听器。支持移除普通函数和数组形式的监听器
*/
private _removeListener;
private _pipeListener;
/**
* 注册事件监听器
* @param type - 事件类型,支持以下格式:
* - 普通字符串:'user/login'
* - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)
* - 全局监听:'**'(监听所有事件)
* @param listener - 事件监听器函数
* @param options - 监听器配置选项:
* - count: 触发次数限制,0表示无限制
* - prepend: 是否将监听器添加到监听器队列开头
* @returns 返回订阅者对象,包含off方法用于取消监听
*
* @example
* ```ts
* // 监听特定事件
* emitter.on('user/login', (data) => console.log(data));
*
* // 使用通配符
* emitter.on('user/*', (data) => console.log(data));
*
* // 限制触发次数
* emitter.on('event', handler, { count: 3 });
* ```
*/
on<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on(type: '**', options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends keyof OmitTransformedEvents<AllEvents>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends keyof PickTransformedEvents<AllEvents>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<AllEvents, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<AllEvents, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
on(type: '**', listener: TypedFastEventAnyListener<Record<string, any>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
/**
* 注册一次性事件监听器
* @param type - 事件类型,支持与on方法相同的格式:
* - 普通字符串:'user/login'
* - 通配符:'user/*'(匹配单层)或'user/**'(匹配多层)
* @param listener - 事件监听器函数
* @returns 返回订阅者对象,包含off方法用于取消监听
*
* @description
* 监听器只会在事件首次触发时被调用一次,之后会自动解除注册。
* 这是on方法的特例,相当于设置options.count = 1。
* 如果事件有保留消息,新注册的监听器会立即收到最近一次的保留消息并解除注册。
*
* @example
* ```ts
* // 只监听一次登录事件
* emitter.once('user/login', (data) => {
* console.log('用户登录:', data);
* });
* ```
*/
once<T extends Types = Types>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends string>(type: T, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends keyof OmitTransformedEvents<AllEvents>>(type: T, listener: TypedFastEventListener<Exclude<T, number | symbol>, AllEvents[T], Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends keyof PickTransformedEvents<AllEvents>>(type: T, listener: (message: PickPayload<RecordValues<ClosestWildcardEvents<AllEvents, Exclude<T, number | symbol>>>>, args: FastEventListenerArgs<Meta>) => any | Promise<any>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
once<T extends Exclude<string, Types>>(type: T, listener: TypedFastEventAnyListener<ClosestWildcardEvents<AllEvents, T>, Meta, Fallback<Context, typeof this>>, options?: FastEventListenOptions<AllEvents, Meta>): FastEventSubscriber;
/**
* 注册一个监听器,用于监听所有事件
* @param listener 事件监听器函数,可以接收任意类型的事件数据
* @returns {FastEventSubscriber} 返回一个订阅者对象,包含 off 方法用于取消监听
* @example
* ```ts
* const subscriber = emitter.onAny((eventName, data) => {
* console.log(eventName, data);
* });
*
* // 取消监听
* subscriber.off();
* ```listener: FastEventAnyListener<AllEvents, Meta, Fallback<Context, typeof this>>): FastEventSubscriber
*/
onAny(options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
onAny<P = any>(listener: TypedFastEventAnyListener<Record<string, P>, Meta, Fallback<Context, typeof this>>, options?: Omit<FastEventListenOptions<AllEvents, Meta>, 'count'>): FastEventSubscriber;
/**
*
* 当调用on/once/onAny时如果没有指定监听器,则调用此方法
*
* 此方法供子类继承
*
*/
onMessage(message: TypedFastEventMessage<AllEvents, Meta>, args: FastEventListenerArgs<Meta>): void;
off(listener: TypedFastEventListener<any, any, any>): void;
off(type: string, listener: TypedFastEventListener<any, any, any>): void;
off(type: Types, listener: TypedFastEventListener<any, any, any>): void;
off(type: string): void;
off(type: Types): void;
/**
* 移除所有事件监听器
* @param entry - 可选的事件前缀,如果提供则只移除指定前缀下的的监听器
* @description
* - 如果提供了prefix参数,则只清除该前缀下的所有监听器
* - 如果没有提供prefix,则清除所有监听器
* - 同时会清空保留的事件(_retainedEvents)
* - 重置监听器对象为空
* @example
*
* ```ts
* emitter.offAll(); // 清除所有监听器
* emitter.offAll('a/b'); // 清除a/b下的所有监听器
*
*/
offAll(entry?: string): void;
/**
* 移除保留的事件
* @param prefix - 事件前缀。如果不提供,将清除所有保留的事件。
* 如果提供前缀,将删除所有以该前缀开头的事件。
* 如果前缀不以分隔符结尾,会自动添加分隔符。
* @private
*/
private _removeRetainedEvents;
clear(prefix?: string): void;
/**
* 发送最后一次事件的消息给对应的监听器
*
* @param type - 事件类型,支持通配符(*)匹配
* @private
*
* 处理流程:
* 1. 如果事件类型包含通配符,则遍历所有保留的消息,匹配符合模式的事件
* 2. 如果是普通事件类型,则直接获取对应的保留消息
* 3. 遍历匹配到的消息,查找对应路径的监听器节点
* 4. 执行所有匹配到的监听器
*/
private _emitRetainMessage;
/**
* 遍历监听器节点树
* @param node 当前遍历的监听器节点
* @param parts 事件名称按'.'分割的部分数组
* @param callback 遍历到目标节点时的回调函数
* @param index 当前遍历的parts数组索引,默认为0
* @param lastFollowing 当命中**时该值为true, 注意**只能作在路径的最后面,如a.**有效,而a.**.b无效
* @private
*
* 支持三种匹配模式:
* - 精确匹配: 'a.b.c'
* - 单层通配: 'a.*.c'
* - 多层通配: 'a.**'
*/
private _traverseToPath;
private _traverseListeners;
private _onListenerError;
private _setListenerFlags;
/**
* 执行单个监听器函数
* @param listener - 要执行的监听器函数或包装过的监听器对象
* @param message - 事件消息对象,包含type、payload和meta
* @param args - 监听器参数
* @param catchErrors - 是否捕获并处理执行过程中的错误
* @returns 监听器的执行结果或错误对象(如果配置了ignoreErrors)
* @private
*
* @description
* 执行单个监听器函数,处理以下情况:
* - 如果监听器是包装过的(有__wrappedListener属性),调用包装的函数
* - 否则直接调用监听器函数
* - 使用配置的上下文(_context)作为this
* - 捕获并处理执行过程中的错误:
* - 如果有onListenerError回调,调用它
* - 如果配置了ignoreErrors,返回错误对象
* - 否则抛出错误
*/
private _executeListener;
private _getListenerExecutor;
/**
* 执行监听器节点列表中的所有监听器函数
* @param nodes 监听器节点列表
* @param message 事件消息对象
* @param args 监听器参数
* @param args 监听器参数
* @returns 所有监听器函数的执行结果数组
* @private
*
* 执行流程:
* 1. 将所有节点中的监听器函数展平为一维数组
* 2. 通过执行器执行所有监听器函数
* 3. 更新监听器的执行次数,并移除达到执行次数限制的监听器
*/
private _executeListeners;
/**
* 减少侦听器的执行次数
* @param listeners
*/
_decListenerExecCount(listeners: [FastListenerMeta, number, FastListenerMeta[]][]): void;
/**
* 获取指定类型的所有事件监听器
* @param type - 事件类型,必须是 AllEvents 的键
* @returns 包含指定类型的所有监听器元数据的数组
*/
getListeners(type: keyof AllEvents): FastListenerMeta[];
/**
* 触发事件并执行对应的监听器
*
* @param type - 事件类型字符串或包含事件信息的对象
* @param payload - 事件携带的数据负载
* @param retain - 是否保留该事件(用于新订阅者)
* @param meta - 事件元数据
* @returns 所有监听器的执行结果数组
*
* @example
* // 方式1: 参数形式
* emit('user.login', { id: 1 }, true)
*
* // 方式2: 对象形式
* emit({ type: 'user.login', payload: { id: 1 } ,meta:{...}}}, true)
*/
/**
* 同步触发事件
* @param type - 事件类型,可以是字符串或预定义的事件类型
* @param payload - 事件数据负载
* @param retain - 是否保留该事件,用于后续新的订阅者
* @param meta - 事件元数据
* @returns 所有监听器的执行结果数组
*
* @description
* 同步触发指定类型的事件,支持两种调用方式:
* 1. 参数形式:emit(type, payload, retain, meta)
* 2. 对象形式:emit({ type, payload, meta }, retain)
*
* 特性:
* - 支持通配符匹配,一个事件可能触发多个监听器
* - 如果设置了retain为true,会保存最后一次的事件数据
* - 按照注册顺序同步调用所有匹配的监听器
* - 如果配置了ignoreErrors,监听器抛出的错误会被捕获并返回
*
* @example
* ```ts
* // 简单事件触发
* emitter.emit('user/login', { userId: 123 });
*
* // 带保留的事件触发
* emitter.emit('status/change', { online: true }, true);
*
* // 带元数据的事件触发
* emitter.emit('data/update', newData, false, { timestamp: Date.now() });
*
* // 使用对象形式触发
* emitter.emit({
* type: 'user/login',
* payload: { userId: 123 },
* meta: { time: Date.now() }
* }, true);
*
* // 清除保留事件
* emitter.emit("user/login")
*
* ```
*/
emit<T extends Types = Types>(type: T, directive: symbol): any[];
emit(type: string, directive: symbol): any[];
emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, retain?: boolean): R[];
emit<R = any, T extends string = string>(type: T, payload: PickPayload<T extends Types ? AllEvents[T] : RecordValues<WildcardEvents<AllEvents, T>>>, retain?: boolean): R[];
emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: K extends Types ? AllEvents[K] : any;
}, Meta>, retain?: boolean): R[];
emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): R[];
emit<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, options?: FastEventListenerArgs<Meta>): R[];
emit<R = any, T extends string = string>(type: T, payload: PickPayload<T extends Types ? AllEvents[T] : RecordValues<WildcardEvents<AllEvents, T>>>, options?: FastEventListenerArgs<Meta>): R[];
emit<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
}, Meta>, options?: FastEventListenerArgs<Meta>): R[];
emit<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): R[];
/**
* 异步触发事件
* @param type - 事件类型,可以是字符串或预定义的事件类型
* @param payload - 事件数据负载
* @param retain - 是否保留该事件,用于后续新的订阅者
* @param meta - 事件元数据
* @returns Promise,解析为所有监听器的执行结果数组
*
* @description
* 异步触发指定类型的事件,与emit方法类似,但有以下区别:
* - 返回Promise,等待所有异步监听器执行完成
* - 使用Promise.allSettled处理监听器的执行结果
* - 即使某些监听器失败,也会等待所有监听器执行完成
* - 返回结果包含成功值或错误信息
*
* @example
* ```ts
* // 异步事件处理
* const results = await emitter.emitAsync('data/process', rawData);
*
* // 处理结果包含成功和失败的情况
* results.forEach(result => {
* if (result instanceof Error) {
* console.error('处理失败:', result);
* } else {
* console.log('处理成功:', result);
* }
* });
*
* // 带元数据的异步事件
* await emitter.emitAsync('batch/process', items, false, {
* batchId: 'batch-001',
* timestamp: Date.now()
* });
* ```
*/
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? AllEvents[T] : any>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
}, Meta>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, retain?: boolean): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(type: T, payload?: PickPayload<T extends Types ? AllEvents[T] : any>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends Types = Types>(type: T, payload?: PickPayload<AllEvents[T]>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
emitAsync<R = any, T extends string = string>(message: FastEventEmitMessage<{
[K in T]: PickPayload<K extends Types ? AllEvents[K] : any>;
}, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
emitAsync<R = any>(message: FastEventEmitMessage<AllEvents, Meta>, options?: FastEventListenerArgs<Meta>): Promise<[R | Error][]>;
/**
* 等待指定事件发生,返回一个Promise
* @param type - 要等待的事件类型
* @param timeout - 超时时间(毫秒),默认为0表示永不超时
* @returns Promise,解析为事件消息对象,包含type、payload和meta
*
* @description
* 创建一个Promise,在指定事件发生时解析。
* - 当事件触发时,Promise会解析为事件消息对象
* - 如果设置了timeout且超时,Promise会被拒绝
* - 一旦事件发生或超时,会自动取消事件监听
*
* @example
* ```ts
* try {
* // 等待登录事件,最多等待5秒
* const event = await emitter.waitFor('user/login', 5000);
* console.log('用户登录成功:', event.payload);
* } catch (error) {
* console.error('等待登录超时');
* }
*
* // 无限等待事件
* const event = await emitter.waitFor('server/ready');
* console.log('服务器就绪');
*
* // 等待指定的事件发生,并且如果该事件有其他订阅者,则同时等待该事件的所有订阅执行完成
* waitFor
*
*
*
* ```
*/
waitFor<T extends Types>(type: T, timeout?: number): Promise<TypedFastEventMessage<{
[key in T]: AllEvents[T];
}, Meta>>;
waitFor(type: string, timeout?: number): Promise<TypedFastEventMessage<AllEvents, Meta>>;
waitFor<P = any>(type: string, timeout?: number): Promise<TypedFastEventMessage<{
[key: string]: P;
}, Meta>>;
/**
* 创建一个新的事件作用域
* @param prefix - 作用域前缀,将自动添加到该作用域下所有事件名称前
* @returns 新的FastEventScope实例
*
* @description
* 创建一个新的事件作用域,用于在特定命名空间下管理事件。
*
* 重要特性:
* - 作用域与父事件发射器共享同一个监听器表
* - 作用域中的事件会自动添加前缀
* - 作用域的所有操作都会映射到父事件发射器上
* - 作用域不是完全隔离的,只是提供了事件名称的命名空间
*
* @example
* ```ts
* const emitter = new FastEvent();
*
* // 创建用户相关事件的作用域
* const userEvents = emitter.scope('user');
*
* // 在作用域中监听事件
* userEvents.on('login', (data) => {
* // 实际监听的是 'user/login'
* console.log('用户登录:', data);
* });
*
* // 在作用域中触发事件
* userEvents.emit('login', { userId: 123 });
* // 等同于 emitter.emit('user/login', { userId: 123 })
*
* // 创建嵌套作用域
* const profileEvents = userEvents.scope('profile');
* profileEvents.emit('update', { name: 'John' });
* // 等同于 emitter.emit('user/profile/update', { name: 'John' })
*
* // 清理作用域
* userEvents.offAll(); // 清理 'user' 前缀下的所有事件
* ```
*/
scope<P extends string>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta, Context>>): FastEventScope<ScopeEvents<AllEvents, P>, Meta, Context>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context>(prefix: P, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, C = Context, ScopeObject extends InstanceType<Class> = InstanceType<Class>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta>>): FastEventScopeExtend<AllEvents, P, ScopeObject>;
scope<E extends Record<string, any> = Record<string, any>, P extends string = string, M extends Record<string, any> = Record<string, any>, C = Context, ScopeObject extends FastEventScope<any, any, any> = FastEventScope<any, any, any>>(prefix: P, scopeObj: ScopeObject, options?: DeepPartial<FastEventScopeOptions<Meta & M, C>>): ScopeObject & FastEventScope<ScopeEvents<AllEvents, P> & E, Meta & M, C>;
}
type FastEventBusNodeOptions<Meta = Record<string, any>, Context = any> = FastEventOptions<Meta, Context> & {};
declare class FastEventBusNode<Events extends Record<string, any> = Record<string, any>, Meta extends Record<string, any> = Record<string, any>, Context = never> extends FastEvent<Events, Meta, Context> {
eventbus?: FastEventBus<any, any, any, any, any>;
private _subscribers;
constructor(options?: DeepPartial<FastEventBusNodeOptions<Meta, Context>>);
/**
*
* 如果事件名称带有名称空间分隔符::,则说明该触发的消息是要转发到其他节点,
* 由eventbus进行转发
*
* emit("otherNode@<事件名>") // 在otherNode节点上触发事件
* emit("@<事件名>") // 在当前总线队象上触发事件
*
* 事件执行前的监听器处理函数
* 处理带有命名空间前缀的事件,格式为 "<节点id>::<事件名>"
* 如果事件包含命名空间,则将事件转发到对应节点或全局事件总线
*
* @param message - 事件消息对象
* @param args - 事件监听器参数
* @returns {boolean} false 表示取消在内部触发事件,undefined 表示继续执行
* @private
*/
private _onBeforeExecuteListener;
private _onAddListener;
/**
* 加入事件总线
* @param eventBus 要加入的事件总线
*/
connect<E extends Record<string, any> = Record<string, any>, M extends Record<string, any> = Record<string, any>, C = any>(eventbus: FastEventBus<E, M, C>): void;
disconnect(): void;
/**
*
* 订阅来自其他节点的消息
*
* 在Eventbus中的所有以`node::<节点id>/<事件>`的事件均会被转发到当前节点
*
* @private
*/
private _onSubscribeForNode;
/**
* 发送点对点消息到指定节点
* @param toNodeId 目标节点ID
* @param message 要发送的消息
*/
send<R = any, T extends FastEventBusNodeIds = FastEventBusNodeIds>(toNodeId: T, payload: any, args?: FastEventListenerArgs): R[];
send<R = any, T extends string = string>(toNodeId: T, payload: any, args?: FastEventListenerArgs): R[];
private _assertConnected;
/**
* 广播消息到所有其他节点
*
*
* @param message 要广播的消息
*/
broadcast<R = any, T extends FastEventBusEventTypes = FastEventBusEventTypes>(message: FastEventBusMessage<{
[K in T]: K extends FastEventBusEventTypes ? FastEventBusEvents[K] : any;
}>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends string = string>(message: FastEventBusMessage<{
[K in T]: K extends FastEventBusEventTypes ? FastEventBusEvents[K] : any;
}, Meta>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends FastEventBusEventTypes = FastEventBusEventTypes>(type: T, payload: FastEventBusEvents[T], options?: FastEventListenerArgs<Meta>): R[];
broadcast<R = any, T extends string = string>(type: T, payload: T extends FastEventBusEventTypes ? FastEventBusEvents[T] : any, options?: FastEventListenerArgs<Meta>): R[];
/**
* 处理接收到的消息
* 供子类继承重载
*/
onMessage(message: FastEventBusMessage, args: FastEventListenerArgs): void;
}
/**
*
* const eventbus = new FastEventBus()
*
* const node1 = new FastEventBusNode({id:"node1",...})
* const node2 = new FastEventBusNode({id:"node2",...})
* const node3 = new FastEventBusNode({id:"node3",...})
*
* - 将节点添加到FastEventBus中
* eventbus.add(node1)
* eventbus.add(node2)
* eventbus.add(node3)
* 或者
* node1.join(eventbus)
* node2.join(eventbus)
* node3.join(eventbus)
*
* - 每个节点均有唯一的节点名称,用于区分不同的节点
* - 每个节点是一个独立的FastEvent实例
* - 每个节点的配置选项与FastEvent相同
* - 节点之间相互独立,互不影响
* - FastEventBus负载节点之间的通讯
* - 所有节点均可以在onMessage中接收到其订阅或点对点或广播的消息
*
* - 可以广播消息给所有节点
*
* eventbus.broadcast(message)
* node1.broadcast(message)
*
* - 可以在节点之间进行点对点发送消息
*
* eventbus.send(node1.id, message)
* node1.send(node2.id, message)
*
*
* - 节点消息接收到的消息是FastEventBusNodeMessage,增加了from代表是消息来自哪里
* - 节点如果要订阅其他节点的消息,需要在事件类型名称加::
* node1.on("node2::test",listener,{...})代表订阅node2的test事件
* - 节点可以在全局触发事件
* node1.emit("::test") 在全局(即Eventbus)触发事件
* node2.on("::test",listener,{...})
*
*/
declare class FastEventBus<Events extends Record<string, any> = FastEventBusEvents, Meta extends Record<string, any> = Record<string, any>, Context = never, AllEvents extends Record<string, any> = Exclude<Expand<Events & FastEventBusEvents>, number | symbol>, Types extends keyof AllEvents = Expand<Exclude<keyof (AllEvents), number | symbol>>> extends FastEvent<Events & FastEventBusEvents, Meta, Context> {
nodes: Map<string, FastEventBusNode<any, any, any>>;
constructor(options?: FastEventBusOptions<Meta, Context>);
/**
* 添加节点到事件总线
* @param node 要添加的节点
*/
add(...nodes: FastEventBusNode<any, any, any>[]): void;
/**
* 从事件总线移除节点
* @param nodeId 要移除的节点ID
*/
remove(nodeId: string): void;
/**
* 广播消息到所有节点
*
* broadcast(1) // 默认广播主题data
* broadcast({
* type: 'connect',
* payload: 100
* }) *
*
* @param message 要广播的消息
*/
broadcast<R = any, T extends Types = Types>(message: FastEventBusMessage<{
[K in T]: AllEvents[T];
}, Meta>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends string = string>(message: FastEventBusMessage<{
[K in T]: K extends Types ? AllEvents[K] : any;
}, Meta>, args?: FastEventListenerArgs): R[];
broadcast<R = any, T extends string = string>(type: T, payload?: T extends Types ? AllEvents[Types] : any, options?: FastEventListenerArgs<Meta>): R[];
broadcast<R = any, T extends Types = Types>(type: T, payload: AllEvents[T], args?: FastEventListenerArgs): R[];
/**
* 发送消息到指定节点
*
* 点对点消息的事件名称为data
*
* @param toNodeId 目标节点ID
* @param message 要发送的消息
*/
send<R = any>(message: FastEventBusMessage, args?: FastEventListenerArgs): R[];
}
declare const NamespaceDelimiter = "::";
declare const BroadcastEvent = "@";
declare const NodeDataEvent = "data";
declare const __FastEvent__: unique symbol;
declare const __FastEventScope__: unique symbol;
declare class FastEventError extends Error {
constructor(message?: string);
}
declare class TimeoutError extends FastEventError {
}
declare class UnboundError extends FastEventError {
}
declare class AbortError extends FastEventError {
}
declare class CancelError extends FastEventError {
}
declare class QueueOverflowError extends FastEventError {
}
declare const FastEventDirectives: {
clearRetain: symbol;
};
declare function isFastEventScope(target: any): target is FastEventScope;
declare function isFastEventMessage(msg: any): msg is TypedFastEventMessage;
declare function isFunction(fn: any): fn is Function;
declare function isString(str: any): str is string;
/**
*
*
* 用于包括输入值为可展开的对象
*
*
* 用在emit事件
*
* emitter1 = new FastEvent()
* emitter2 = new FastEvent()
*
* emitter1.on("xxx",(message)=>{
* return emitter2.emit(message)
* })
*
* emitter2.on("xxx",()=>1)
* emitter2.on("xxx",()=>2)
*
* const results = emitter1.emit("xxx")
* // results == [[1,2]] 而不 [1,2],因为emitter2.emit返回的是一个[]
*
* expandable的作用就是对emit结果进行包括,当isExpandable时,在emit内部进行展开
*
*
*
*
* emitter1.on("xxx",(message)=>{
* // 告诉emitter2.emit返回的是一个expandable对象
* // 然后在内部就展开此对象
* return emitter2.emit(message)
* })
*
* const results = emitter1.emit("xxx")
* // results == [1,2]
*
* 为了实现对结果数据的展开处理,在emit内部需要对监听器的执行结果进行依次检查
* 这多了一个迭代操作,为了不影响性能,可以关闭此特性
* options.expandEmitResults = false
*
*
*/
declare const __expandable__: unique symbol;
declare function expandable(value: any): any;
declare function isExpandable(value: any): any;
/**
*
* 判断path是否与pattern匹配
*
* isPathMatched("a.b.c","a.b.c") == true
* isPathMatched("a.b.c","a.b.*") == true
* isPathMatched("a.b.c","a.*.*") == true
* isPathMatched("a.b.c","*.*.*") == true
* isPathMatched("a.b.c",".b.*") == true
* isPathMatched("a.b.c.d","a.**") == true
*
* - '**' 匹配后续的
* - '*' 匹配任意数量的字符,包括零个字符
*
* @param path
* @param pattern
*/
declare function isPathMatched(path: string[], pattern: string[]): boolean;
declare function isSubsctiber(val: any): val is FastEventSubscriber;
declare function isClass(target: unknown): target is new (...args: any[]) => any;
declare function isFastEvent(target: any): target is FastEvent;
export { AbortError, type AssertFastMessage, type AtPayloads, BroadcastEvent, CancelError, type ChangeFieldType, type Class, type ClosestWildcardEvents, type DeepPartial, type Dict, type Expand, type ExpandWildcard, type Fallback, FastEvent, FastEventBus, type FastEventBusEventTypes, type FastEventBusEvents, type FastEventBusMessage, FastEventBusNode, type FastEventBusNodeIds, type FastEventBusNodeOptions, type FastEventBusNodes, type FastEventBusOptions, FastEventDirectives, type FastEventEmitMessage, FastEventError, type FastEventListenOptions, type FastEventListener, type FastEventListenerArgs, FastEventListenerFlags, type FastEventListeners, type FastEventMessage, type FastEventMessageExtends, type FastEventMeta, type FastEventOptions, FastEventScope, type FastEventScopeExtend, type FastEventScopeMeta, type FastEventScopeOptions, type FastEventSubscriber, type FastEvents, type FastListenerMeta, type FastListenerNode, type FastListeners, type FastMessagePayload, type GetFirstMatchedItem, type GetNotWildcardItems, type Keys, type Merge, type MergeUnion, NamespaceDelimiter, NodeDataEvent, type NotPayload, type ObjectKeys, type OmitTransformedEvents, type OptionalItems, type Overloads, type OverrideOptions, type PickPayload, type PickTransformedEvents, QueueOverflowError, type RecordPrefix, type RecordValues, type RequiredItems, type ScopeEvents, TimeoutError, type TransformedEvents, type TypedFastEventAnyListener, type TypedFastEventListener, type TypedFastEventMessage, type TypedFastEventMessageOptional, UnboundError, type Unique, type WildcardEvents, __FastEventScope__, __FastEvent__, __expandable__, expandable, isClass, isExpandable, isFastEvent, isFastEventMessage, isFastEventScope, isFunction, isPathMatched, isString, isSubsctiber };
'use strict';var B=Object.defineProperty;var tt=(i,t,e)=>t in i?B(i,t,{enumerable:true,configurable:true,writable:true,value:e}):i[t]=e;var a=(i,t)=>B(i,"name",{value:t,configurable:true});var h=(i,t,e)=>tt(i,typeof t!="symbol"?t+"":t,e);var st=Symbol.for("__FastEvent__"),it=Symbol.for("__FastEventScope__"),$=class $ extends Error{constructor(t){super(t);}};a($,"FastEventError");var m=$,F=class F extends m{};a(F,"TimeoutError");var V=F,j=class j extends m{};a(j,"UnboundError");var v=j,O=class O extends m{};a(O,"AbortError");var x=O,R=class R extends m{};a(R,"CancelError");var E=R,P=class P extends m{};a(P,"QueueOverflowError");var I=P,d={clearRetain:Symbol.for("ClearRetain")};var _=function(i){return i[i.Transformed=1]="Transformed",i}({});function L(i,t,e,s){let n,r={},o={};return typeof i[0]=="object"?(Object.assign(o,i[0]),r=typeof i[1]=="boolean"?{retain:i[1]}:i[1]||{},n=i[0].meta):(o.type=i[0],o.payload=i[1],r=typeof i[2]=="boolean"?{retain:i[2]}:i[2]||{}),n=Object.assign({},t,e,r.meta,n),Object.keys(n).length===0&&(n=void 0),o.meta=n,r.executor===void 0&&(r.executor=s),[o,r]}a(L,"parseEmitArgs");function X(i){return i?typeof i=="object"&&"__FastEventScope__"in i:false}a(X,"isFastEventScope");function T(i,t,e){let s=i[0],n=X(i[1])?i[1]:void 0,r=(n?i[2]:i[1])||{};return r.meta=Object.assign({},t,r?.meta),r.context=r.context!==void 0?r.context:e,[s,n,r]}a(T,"parseScopeArgs");function b(i,t){return Object.defineProperty(i,"name",{value:t||"anonymous",configurable:true}),i}a(b,"renameFn");function c(i){return i&&typeof i=="function"}a(c,"isFunction");var M=class M{constructor(t){h(this,"__FastEventScope__",true);h(this,"_options",{});h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(t));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(t,e,s){this.emitter=t,this._options=Object.assign(this._options,{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}_initOptions(t){return t}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;t||(t=(this._options.onMessage||this.onMessage).bind(this));let s=this;return b(function(r,o){let p=o.rawEventType||r.type;if(p.startsWith(e)){let u=((o.flags||0)&_.Transformed)>0?r:Object.assign({},r,{type:p.substring(e.length)});return t.call(s.context,u,o)}},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){if(!this.emitter)throw new v;let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===d.clearRetain)return this.emitter.emit(this._getScopeType(arguments[0]));let[t,e]=L(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(t,e),t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}_transformMessage(t,e){c(this._options.transform)&&(e.rawEventType=this._getScopeType(t.type),e.flags=(e.flags||0)|_.Transformed,t.payload=this._options.transform.call(this,t));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[t,e,s]=T(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new M,n.bind(this.emitter,this.prefix+t,s),n}onMessage(t,e){}};a(M,"FastEventScope");var S=M;function C(i,t){if(i.length!==t.length&&i.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:i.length-t.length+1}).fill("*"));for(let s=0;s<i.length;s++)if(e[s]!=="*"&&e[s]!==i[s])return false;return true}a(C,"isPathMatched");function q(i,t){let e=[];for(;;){let s=i.findIndex(n=>t(n));if(s===-1){e.push(s);break}i.splice(s,1);}return e}a(q,"removeItem");var z=Symbol.for("__expandable__");function G(i){return i[z]=true,i}a(G,"expandable");function H(i){return i&&i[z]}a(H,"isExpandable");function J(i){for(let t=0;t<i.length;t++){let e=i[t];Array.isArray(e)&&H(e)&&(i.splice(t,1,...e),t+=e.length-1);}return i}a(J,"expandEmitResults");function K(i){return i&&typeof i=="object"&&"off"in i&&"listener"in i}a(K,"isSubsctiber");function Y(i,t){return i.catch(e=>(t&&t(e),Promise.resolve(e)))}a(Y,"tryReturnError");var N=class N{constructor(t){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true},this._initOptions(t)),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}_initOptions(t){return t}_addListener(t,e,s){let{count:n,prepend:r}=s,o=0;return [this._forEachNodes(t,f=>{let u=[e,n,0,s.tag,s.flags];r?(f.__listeners.splice(0,0,u),o=0):(f.__listeners.push(u),o=f.__listeners.length-1),this.listenerCount++;}),o]}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let n=0;n<t.length;n++){let r=t[n];if(r in s||(s[r]={__listeners:[]}),n===t.length-1){let o=s[r];return e(o,s),o}else s=s[r];}}_removeListener(t,e,s){s&&q(t.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let r=n===s;return r&&(this.listenerCount--,c(this._options.onRemoveListener)&&this._options.onRemoveListener(e.join(this._delimiter),s)),r});}_pipeListener(t,e){return e.forEach(s=>{t=b(s(t),t.name);}),t}on(){let t=arguments[0],e=c(arguments[1])?arguments[1]:(this._options.onMessage||this.onMessage).bind(this),s=Object.assign({count:0,flags:0,prepend:false},c(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");if(c(this._options.onAddListener)){let f=this._options.onAddListener(t,e,s);if(f===false)throw new E;if(K(f))return f}let n=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),c(s.filter)||c(s.off)){let f=e;e=b(function(u,l){if(c(s.off)&&s.off.call(this,u,l)){p();return}if(c(s.filter)){if(s.filter.call(this,u,l))return f.call(this,u,l)}else return f.call(this,u,l)},e.name);}let[r,o]=this._addListener(n,e,s),p=a(()=>r&&this._removeListener(r,n,e),"off");return this._emitRetainMessage(t,r,o),{off:p,listener:e}}once(){return c(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t,e){}off(){let t=arguments,e=c(t[0])?void 0:t[0],s=c(t[0])?t[0]:t[1],n=e?e.split(this._delimiter):[],r=e?e.includes("*"):false;if(e&&!r)this._traverseToPath(this.listeners,n,o=>{s?this._removeListener(o,n,s):e&&(o.__listeners=[]);});else {let o=r?[]:n;this._traverseListeners(this.listeners,o,(p,f)=>{(s!==void 0||r&&C(p,n))&&(s?this._removeListener(f,n,s):f.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(n,r)=>{s+=r.__listeners.length,r.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,n)=>{e+=n.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}c(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitRetainMessage(t,e,s){let n=[];if(t.includes("*")){let r=t.split(this._delimiter);this.retainedMessages.forEach((o,p)=>{let f=p.split(this._delimiter);C(f,r)&&n.push(o);});}else this.retainedMessages.has(t)&&n.push(this.retainedMessages.get(t));e&&n.forEach(r=>{this._executeListeners([e],r,{},o=>o[0]===e.__listeners[s][0]);});}_traverseToPath(t,e,s,n=0,r){if(n>=e.length){s(t);return}let o=e[n];if(r===true){this._traverseToPath(t,e,s,n+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,n+1),"**"in t&&this._traverseToPath(t["**"],e,s,n+1,true),o in t&&this._traverseToPath(t[o],e,s,n+1);}_traverseListeners(t,e,s){let n=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{n=o;});let r=a((o,p,f)=>{p(f,o);for(let[u,l]of Object.entries(o))u.startsWith("__")||l&&r(l,p,[...f,u]);},"traverseNodes");r(n,s,[]);}_onListenerError(t,e,s,n){if(n instanceof Error&&(n._emitter=`${t.name||"anonymous"}:${e.type}`),c(this._options.onListenerError))try{this._options.onListenerError.call(this,n,t,e,s);}catch{}if(this._options.ignoreErrors)return n;throw n}_setListenerFlags(t,e){return !t||t===0?e:t|e}_executeListener(t,e,s,n=false){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new x(t.name));let r=((s?.flags||0)&_.Transformed)>0,o=t.call(this.context,r?e.payload:e,s);return n&&o&&o instanceof Promise&&(o=Y(o,p=>this._onListenerError(t,e,s,p))),o}catch(r){return this._onListenerError(t,e,s,r)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(c(e))return e}_executeListeners(t,e,s,n){if(!t||t.length===0)return [];let r=t.reduce((p,f)=>p.concat(f.__listeners.filter(u=>c(n)?n(u,f):true).map((u,l)=>[u,l,f.__listeners])),[]);c(this._options.transform)&&(s||(s={}),s.rawEventType=e.type,e.payload=this._options.transform.call(this,e),s.flags=this._setListenerFlags(s.flags,_.Transformed)),this._decListenerExecCount(r);let o=this._getListenerExecutor(s);if(o){let p=o(r.map(f=>f[0]),e,s,this._executeListener.bind(this));return Array.isArray(p)?p:[p]}else return r.map(p=>this._executeListener(p[0][0],e,s,true))}_decListenerExecCount(t){for(let e=t.length-1;e>=0;e--){let s=t[e][0];s[2]++,s[1]>0&&s[1]<=s[2]&&t[e][2].splice(e,1);}}getListeners(t){let e=[],s=t.split(this._delimiter);return this._traverseToPath(this.listeners,s,n=>{e.push(n);}),e[0].__listeners}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===d.clearRetain)return this.retainedMessages.delete(arguments[0]),[];let[t,e]=L(arguments,this.options.meta);c(e.parseArgs)&&e.parseArgs(t,e);let s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let n=[],r=[];if(this._traverseToPath(this.listeners,s,o=>{r.push(o);}),c(this._options.onBeforeExecuteListener)){let o=this._options.onBeforeExecuteListener.call(this,t,e);if(Array.isArray(o))return o;if(o===false)throw new x(t.type)}return c(this._options.transform)&&(t.payload=this._options.transform.call(this,t),e.rawEventType=t.type,e.flags=(e.flags||0)|_.Transformed),n.push(...this._executeListeners(r,t,e)),c(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,n,r),this._options.expandEmitResults&&J(n),n}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,n)=>{let r,o,p=a(f=>{clearTimeout(r),o&&o.off(),s(f);},"listener");e&&e>0&&(r=setTimeout(()=>{o&&o.off(),n(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,p);})}scope(){let[t,e,s]=T(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new S,n.bind(this,t,s),n}};a(N,"FastEvent");var g=N;var y="::",w="@",Z="data";function k(i){return i?typeof i=="object"&&"type"in i:false}a(k,"isFastEventMessage");function A(i,t="/"){let e=k(i[0]),s=Object.assign({payload:e?i[0].payload:i[1]},e?i[0]:{},{type:`${w}${t}${e?i[0].type:"data"}`}),n=e?i[1]:i[2];return [s,n]}a(A,"parseBroadcaseArgs");var D=class D extends g{constructor(e){super(e);h(this,"nodes");this.nodes=new Map;}add(...e){e.forEach(s=>{if(this.nodes.has(s.id))throw new Error(`Node with id ${s.id} already exists`);s.options.delimiter=this.options.delimiter,s.options.debug=this.options.debug,s.options.ignoreErrors=this.options.ignoreErrors,this.nodes.set(s.id,s),this.emit(`$disconnect${this.options.delimiter}${s.id}`,d.clearRetain),this.emit(`$connect${this.options.delimiter}${s.id}`,s.id,true);});}remove(e){let s=this.nodes.get(e);s&&(s.eventbus=void 0,this.nodes.delete(e),this.emit(`$connect${this.options.delimiter}${s.id}`,d.clearRetain),this.emit(`$disconnect${this.options.delimiter}${s.id}`,s.id,true));}broadcast(){let[e,s]=A(arguments,this.options.delimiter);return this.emit(e,s)}send(e,s){return e.type=`${e.to}${this.options.delimiter}${Z}`,this.emit(e,s)[0]}};a(D,"FastEventBus");var U=D;var W=class W extends g{constructor(e){super(e);h(this,"eventbus");h(this,"_subscribers",[]);this.options.onBeforeExecuteListener=this._onBeforeExecuteListener.bind(this),this.options.onAddListener=this._onAddListener.bind(this),this._subscribers.push(this.on("data"));}_onBeforeExecuteListener(e,s){if(e.type.includes(y))return e.type=e.type.replace(y,this.eventbus.options.delimiter),e.from=this.id,this.eventbus.emit(e,s)}_onAddListener(e,s,n){if(e.includes(y)){let[r,o]=e.split(y);if(r===this.id)return;let p,f=this.eventbus.on(`$connect${this.options.delimiter}*`,u=>{if(u.payload===r){let l=this.eventbus.nodes.get(r);l&&(p=l.on(o,s,n)),f.off();}});return {off:a(()=>p?p.off():f.off(),"off"),listener:p?p.listener:f.listener}}}connect(e){this.eventbus=e,this.eventbus.add(this),this._subscribers.push(this.eventbus.on(`${w}${this.eventbus.options.delimiter}**`,this.onMessage.bind(this))),this._onSubscribeForNode();}disconnect(){this.eventbus?.remove(this.id),this._subscribers.forEach(e=>e.off());}_onSubscribeForNode(){let e=`${this.id}${this.eventbus.options.delimiter}`;this._subscribers.push(this.eventbus.on(`${e}**`,(s,n)=>(s.type=s.type.substring(e.length),G(this.emit(s,n)))));}send(e,s,n){this._assertConnected();let r={type:"data",from:this.id,to:e,payload:s};return this.eventbus.send(r,n)}_assertConnected(){if(!this.eventbus)throw new Error("Node is not connected to any event bus")}broadcast(){this._assertConnected();let[e,s]=A(arguments,this.options.delimiter);return e.from=this.id,this.eventbus.broadcast(e,s)}onMessage(e,s){}};a(W,"FastEventBusNode");var Q=W;function Ee(i){return i&&typeof i=="string"}a(Ee,"isString");function Se(i){return typeof i=="function"&&(i.toString().startsWith("class ")||i.prototype?.constructor===i)}a(Se,"isClass");function Ae(i){return i?typeof i=="object"&&"__FastEvent__"in i:false}a(Ae,"isFastEvent");exports.AbortError=x;exports.BroadcastEvent=w;exports.CancelError=E;exports.FastEvent=g;exports.FastEventBus=U;exports.FastEventBusNode=Q;exports.FastEventDirectives=d;exports.FastEventError=m;exports.FastEventListenerFlags=_;exports.FastEventScope=S;exports.NamespaceDelimiter=y;exports.NodeDataEvent=Z;exports.QueueOverflowError=I;exports.TimeoutError=V;exports.UnboundError=v;exports.__FastEventScope__=it;exports.__FastEvent__=st;exports.__expandable__=z;exports.expandable=G;exports.isClass=Se;exports.isExpandable=H;exports.isFastEvent=Ae;exports.isFastEventMessage=k;exports.isFastEventScope=X;exports.isFunction=c;exports.isPathMatched=C;exports.isString=Ee;exports.isSubsctiber=K;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

Sorry, the diff of this file is too big to display

var B=Object.defineProperty;var tt=(i,t,e)=>t in i?B(i,t,{enumerable:true,configurable:true,writable:true,value:e}):i[t]=e;var a=(i,t)=>B(i,"name",{value:t,configurable:true});var h=(i,t,e)=>tt(i,typeof t!="symbol"?t+"":t,e);var st=Symbol.for("__FastEvent__"),it=Symbol.for("__FastEventScope__"),$=class $ extends Error{constructor(t){super(t);}};a($,"FastEventError");var m=$,F=class F extends m{};a(F,"TimeoutError");var V=F,j=class j extends m{};a(j,"UnboundError");var v=j,O=class O extends m{};a(O,"AbortError");var x=O,R=class R extends m{};a(R,"CancelError");var E=R,P=class P extends m{};a(P,"QueueOverflowError");var I=P,d={clearRetain:Symbol.for("ClearRetain")};var _=function(i){return i[i.Transformed=1]="Transformed",i}({});function L(i,t,e,s){let n,r={},o={};return typeof i[0]=="object"?(Object.assign(o,i[0]),r=typeof i[1]=="boolean"?{retain:i[1]}:i[1]||{},n=i[0].meta):(o.type=i[0],o.payload=i[1],r=typeof i[2]=="boolean"?{retain:i[2]}:i[2]||{}),n=Object.assign({},t,e,r.meta,n),Object.keys(n).length===0&&(n=void 0),o.meta=n,r.executor===void 0&&(r.executor=s),[o,r]}a(L,"parseEmitArgs");function X(i){return i?typeof i=="object"&&"__FastEventScope__"in i:false}a(X,"isFastEventScope");function T(i,t,e){let s=i[0],n=X(i[1])?i[1]:void 0,r=(n?i[2]:i[1])||{};return r.meta=Object.assign({},t,r?.meta),r.context=r.context!==void 0?r.context:e,[s,n,r]}a(T,"parseScopeArgs");function b(i,t){return Object.defineProperty(i,"name",{value:t||"anonymous",configurable:true}),i}a(b,"renameFn");function c(i){return i&&typeof i=="function"}a(c,"isFunction");var M=class M{constructor(t){h(this,"__FastEventScope__",true);h(this,"_options",{});h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});h(this,"prefix","");h(this,"emitter");this._options=Object.assign({},this._initOptions(t));}get context(){return this.options.context||this}get options(){return this._options}get listeners(){return this.emitter.getListeners(this.prefix)}bind(t,e,s){this.emitter=t,this._options=Object.assign(this._options,{scope:e},s),e.length>0&&!e.endsWith(t.options.delimiter)&&(this.prefix=e+t.options.delimiter);}_initOptions(t){return t}_getScopeListener(t){let e=this.prefix;if(e.length===0)return t;t||(t=(this._options.onMessage||this.onMessage).bind(this));let s=this;return b(function(r,o){let p=o.rawEventType||r.type;if(p.startsWith(e)){let u=((o.flags||0)&_.Transformed)>0?r:Object.assign({},r,{type:p.substring(e.length)});return t.call(s.context,u,o)}},t.name)}_getScopeType(t){return t===void 0?void 0:this.prefix+t}_fixScopeType(t){return t.startsWith(this.prefix)?t.substring(this.prefix.length):t}on(){if(!this.emitter)throw new v;let t=[...arguments];return t[0]=this._getScopeType(t[0]),t[1]=this._getScopeListener(t[1]),this.emitter.on(...t)}once(){return this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",...arguments)}off(){let t=arguments;typeof t[0]=="string"&&(t[0]=this._getScopeType(t[0])),this.emitter.off(...t);}offAll(){this.emitter.offAll(this.prefix.substring(0,this.prefix.length-1));}clear(){this.emitter.clear(this.prefix.substring(0,this.prefix.length-1));}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===d.clearRetain)return this.emitter.emit(this._getScopeType(arguments[0]));let[t,e]=L(arguments,this.emitter.options.meta,this.options.meta,this.options.executor);return this._transformMessage(t,e),t.type=this._getScopeType(t.type),this.emitter.emit(t,e)}_transformMessage(t,e){c(this._options.transform)&&(e.rawEventType=this._getScopeType(t.type),e.flags=(e.flags||0)|_.Transformed,t.payload=this._options.transform.call(this,t));}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}async waitFor(){let t=arguments[0],e=arguments[1],s=await this.emitter.waitFor(this._getScopeType(t),e);return Object.assign({},s,{type:this._fixScopeType(s.type)})}scope(){let[t,e,s]=T(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new M,n.bind(this.emitter,this.prefix+t,s),n}onMessage(t,e){}};a(M,"FastEventScope");var S=M;function C(i,t){if(i.length!==t.length&&i.length>0&&t[t.length-1]!=="**")return false;let e=[...t];t.length>0&&t[t.length-1]==="**"&&e.splice(t.length-1,1,...Array.from({length:i.length-t.length+1}).fill("*"));for(let s=0;s<i.length;s++)if(e[s]!=="*"&&e[s]!==i[s])return false;return true}a(C,"isPathMatched");function q(i,t){let e=[];for(;;){let s=i.findIndex(n=>t(n));if(s===-1){e.push(s);break}i.splice(s,1);}return e}a(q,"removeItem");var z=Symbol.for("__expandable__");function G(i){return i[z]=true,i}a(G,"expandable");function H(i){return i&&i[z]}a(H,"isExpandable");function J(i){for(let t=0;t<i.length;t++){let e=i[t];Array.isArray(e)&&H(e)&&(i.splice(t,1,...e),t+=e.length-1);}return i}a(J,"expandEmitResults");function K(i){return i&&typeof i=="object"&&"off"in i&&"listener"in i}a(K,"isSubsctiber");function Y(i,t){return i.catch(e=>(t&&t(e),Promise.resolve(e)))}a(Y,"tryReturnError");var N=class N{constructor(t){h(this,"__FastEvent__",true);h(this,"listeners",{__listeners:[]});h(this,"_options");h(this,"_delimiter","/");h(this,"_context");h(this,"retainedMessages",new Map);h(this,"listenerCount",0);h(this,"types",{events:void 0,meta:void 0,context:void 0,message:void 0,listeners:void 0,anyListener:void 0});this._options=Object.assign({debug:false,id:Math.random().toString(36).substring(2),delimiter:"/",context:null,ignoreErrors:true,meta:void 0,expandEmitResults:true},this._initOptions(t)),this._delimiter=this._options.delimiter,this._context=this._options.context,this._enableDevTools();}get options(){return this._options}get context(){return this.options.context||this}get meta(){return this.options.meta}get id(){return this._options.id}_initOptions(t){return t}_addListener(t,e,s){let{count:n,prepend:r}=s,o=0;return [this._forEachNodes(t,f=>{let u=[e,n,0,s.tag,s.flags];r?(f.__listeners.splice(0,0,u),o=0):(f.__listeners.push(u),o=f.__listeners.length-1),this.listenerCount++;}),o]}_enableDevTools(){this.options.debug&&globalThis.__FLEXEVENT_DEVTOOLS__&&globalThis.__FLEXEVENT_DEVTOOLS__.add(this);}_forEachNodes(t,e){if(t.length===0)return;let s=this.listeners;for(let n=0;n<t.length;n++){let r=t[n];if(r in s||(s[r]={__listeners:[]}),n===t.length-1){let o=s[r];return e(o,s),o}else s=s[r];}}_removeListener(t,e,s){s&&q(t.__listeners,n=>{n=Array.isArray(n)?n[0]:n;let r=n===s;return r&&(this.listenerCount--,c(this._options.onRemoveListener)&&this._options.onRemoveListener(e.join(this._delimiter),s)),r});}_pipeListener(t,e){return e.forEach(s=>{t=b(s(t),t.name);}),t}on(){let t=arguments[0],e=c(arguments[1])?arguments[1]:(this._options.onMessage||this.onMessage).bind(this),s=Object.assign({count:0,flags:0,prepend:false},c(arguments[1])?arguments[2]:arguments[1]);if(t.length===0)throw new Error("event type cannot be empty");if(c(this._options.onAddListener)){let f=this._options.onAddListener(t,e,s);if(f===false)throw new E;if(K(f))return f}let n=t.split(this._delimiter);if(s.pipes&&s.pipes.length>0&&(e=this._pipeListener(e,s.pipes)),c(s.filter)||c(s.off)){let f=e;e=b(function(u,l){if(c(s.off)&&s.off.call(this,u,l)){p();return}if(c(s.filter)){if(s.filter.call(this,u,l))return f.call(this,u,l)}else return f.call(this,u,l)},e.name);}let[r,o]=this._addListener(n,e,s),p=a(()=>r&&this._removeListener(r,n,e),"off");return this._emitRetainMessage(t,r,o),{off:p,listener:e}}once(){return c(arguments[1])?this.on(arguments[0],arguments[1],Object.assign({},arguments[2],{count:1})):this.on(arguments[0],Object.assign({},arguments[2],{count:1}))}onAny(){return this.on("**",arguments[0],arguments[1])}onMessage(t,e){}off(){let t=arguments,e=c(t[0])?void 0:t[0],s=c(t[0])?t[0]:t[1],n=e?e.split(this._delimiter):[],r=e?e.includes("*"):false;if(e&&!r)this._traverseToPath(this.listeners,n,o=>{s?this._removeListener(o,n,s):e&&(o.__listeners=[]);});else {let o=r?[]:n;this._traverseListeners(this.listeners,o,(p,f)=>{(s!==void 0||r&&C(p,n))&&(s?this._removeListener(f,n,s):f.__listeners=[]);});}}offAll(t){if(t){let e=t.split(this._delimiter),s=0;this._traverseListeners(this.listeners,e,(n,r)=>{s+=r.__listeners.length,r.__listeners=[];}),this.listenerCount-=s,this._removeRetainedEvents(t);}else {let e=0;this._traverseListeners(this.listeners,[],(s,n)=>{e+=n.__listeners.length;}),this.listenerCount-=e,this.retainedMessages.clear(),this.listeners={__listeners:[]};}c(this._options.onClearListeners)&&this._options.onClearListeners.call(this);}_removeRetainedEvents(t){t||this.retainedMessages.clear(),t?.endsWith(this._delimiter)&&(t+=this._delimiter),this.retainedMessages.delete(t);for(let e of this.retainedMessages.keys())e.startsWith(t)&&this.retainedMessages.delete(e);}clear(t){this.offAll(t),this._removeRetainedEvents(t);}_emitRetainMessage(t,e,s){let n=[];if(t.includes("*")){let r=t.split(this._delimiter);this.retainedMessages.forEach((o,p)=>{let f=p.split(this._delimiter);C(f,r)&&n.push(o);});}else this.retainedMessages.has(t)&&n.push(this.retainedMessages.get(t));e&&n.forEach(r=>{this._executeListeners([e],r,{},o=>o[0]===e.__listeners[s][0]);});}_traverseToPath(t,e,s,n=0,r){if(n>=e.length){s(t);return}let o=e[n];if(r===true){this._traverseToPath(t,e,s,n+1,true);return}"*"in t&&this._traverseToPath(t["*"],e,s,n+1),"**"in t&&this._traverseToPath(t["**"],e,s,n+1,true),o in t&&this._traverseToPath(t[o],e,s,n+1);}_traverseListeners(t,e,s){let n=t;e&&e.length>0&&this._traverseToPath(t,e,o=>{n=o;});let r=a((o,p,f)=>{p(f,o);for(let[u,l]of Object.entries(o))u.startsWith("__")||l&&r(l,p,[...f,u]);},"traverseNodes");r(n,s,[]);}_onListenerError(t,e,s,n){if(n instanceof Error&&(n._emitter=`${t.name||"anonymous"}:${e.type}`),c(this._options.onListenerError))try{this._options.onListenerError.call(this,n,t,e,s);}catch{}if(this._options.ignoreErrors)return n;throw n}_setListenerFlags(t,e){return !t||t===0?e:t|e}_executeListener(t,e,s,n=false){try{if(s&&s.abortSignal&&s.abortSignal.aborted)return this._onListenerError(t,e,s,new x(t.name));let r=((s?.flags||0)&_.Transformed)>0,o=t.call(this.context,r?e.payload:e,s);return n&&o&&o instanceof Promise&&(o=Y(o,p=>this._onListenerError(t,e,s,p))),o}catch(r){return this._onListenerError(t,e,s,r)}}_getListenerExecutor(t){if(!t)return;let e=t.executor||this._options.executor;if(c(e))return e}_executeListeners(t,e,s,n){if(!t||t.length===0)return [];let r=t.reduce((p,f)=>p.concat(f.__listeners.filter(u=>c(n)?n(u,f):true).map((u,l)=>[u,l,f.__listeners])),[]);c(this._options.transform)&&(s||(s={}),s.rawEventType=e.type,e.payload=this._options.transform.call(this,e),s.flags=this._setListenerFlags(s.flags,_.Transformed)),this._decListenerExecCount(r);let o=this._getListenerExecutor(s);if(o){let p=o(r.map(f=>f[0]),e,s,this._executeListener.bind(this));return Array.isArray(p)?p:[p]}else return r.map(p=>this._executeListener(p[0][0],e,s,true))}_decListenerExecCount(t){for(let e=t.length-1;e>=0;e--){let s=t[e][0];s[2]++,s[1]>0&&s[1]<=s[2]&&t[e][2].splice(e,1);}}getListeners(t){let e=[],s=t.split(this._delimiter);return this._traverseToPath(this.listeners,s,n=>{e.push(n);}),e[0].__listeners}emit(){if(arguments.length===2&&typeof arguments[0]=="string"&&arguments[1]===d.clearRetain)return this.retainedMessages.delete(arguments[0]),[];let[t,e]=L(arguments,this.options.meta);c(e.parseArgs)&&e.parseArgs(t,e);let s=t.type.split(this._delimiter);e.retain&&this.retainedMessages.set(t.type,t);let n=[],r=[];if(this._traverseToPath(this.listeners,s,o=>{r.push(o);}),c(this._options.onBeforeExecuteListener)){let o=this._options.onBeforeExecuteListener.call(this,t,e);if(Array.isArray(o))return o;if(o===false)throw new x(t.type)}return c(this._options.transform)&&(t.payload=this._options.transform.call(this,t),e.rawEventType=t.type,e.flags=(e.flags||0)|_.Transformed),n.push(...this._executeListeners(r,t,e)),c(this._options.onAfterExecuteListener)&&this._options.onAfterExecuteListener.call(this,t,n,r),this._options.expandEmitResults&&J(n),n}async emitAsync(){return (await Promise.allSettled(this.emit.apply(this,arguments))).map(e=>e.status==="fulfilled"?e.value:e.reason)}waitFor(){let t=arguments[0],e=arguments[1];return new Promise((s,n)=>{let r,o,p=a(f=>{clearTimeout(r),o&&o.off(),s(f);},"listener");e&&e>0&&(r=setTimeout(()=>{o&&o.off(),n(new Error("wait for event<"+t+"> is timeout"));},e)),o=this.on(t,p);})}scope(){let[t,e,s]=T(arguments,this.options.meta,this.options.context),n;return e?n=e:n=new S,n.bind(this,t,s),n}};a(N,"FastEvent");var g=N;var y="::",w="@",Z="data";function k(i){return i?typeof i=="object"&&"type"in i:false}a(k,"isFastEventMessage");function A(i,t="/"){let e=k(i[0]),s=Object.assign({payload:e?i[0].payload:i[1]},e?i[0]:{},{type:`${w}${t}${e?i[0].type:"data"}`}),n=e?i[1]:i[2];return [s,n]}a(A,"parseBroadcaseArgs");var D=class D extends g{constructor(e){super(e);h(this,"nodes");this.nodes=new Map;}add(...e){e.forEach(s=>{if(this.nodes.has(s.id))throw new Error(`Node with id ${s.id} already exists`);s.options.delimiter=this.options.delimiter,s.options.debug=this.options.debug,s.options.ignoreErrors=this.options.ignoreErrors,this.nodes.set(s.id,s),this.emit(`$disconnect${this.options.delimiter}${s.id}`,d.clearRetain),this.emit(`$connect${this.options.delimiter}${s.id}`,s.id,true);});}remove(e){let s=this.nodes.get(e);s&&(s.eventbus=void 0,this.nodes.delete(e),this.emit(`$connect${this.options.delimiter}${s.id}`,d.clearRetain),this.emit(`$disconnect${this.options.delimiter}${s.id}`,s.id,true));}broadcast(){let[e,s]=A(arguments,this.options.delimiter);return this.emit(e,s)}send(e,s){return e.type=`${e.to}${this.options.delimiter}${Z}`,this.emit(e,s)[0]}};a(D,"FastEventBus");var U=D;var W=class W extends g{constructor(e){super(e);h(this,"eventbus");h(this,"_subscribers",[]);this.options.onBeforeExecuteListener=this._onBeforeExecuteListener.bind(this),this.options.onAddListener=this._onAddListener.bind(this),this._subscribers.push(this.on("data"));}_onBeforeExecuteListener(e,s){if(e.type.includes(y))return e.type=e.type.replace(y,this.eventbus.options.delimiter),e.from=this.id,this.eventbus.emit(e,s)}_onAddListener(e,s,n){if(e.includes(y)){let[r,o]=e.split(y);if(r===this.id)return;let p,f=this.eventbus.on(`$connect${this.options.delimiter}*`,u=>{if(u.payload===r){let l=this.eventbus.nodes.get(r);l&&(p=l.on(o,s,n)),f.off();}});return {off:a(()=>p?p.off():f.off(),"off"),listener:p?p.listener:f.listener}}}connect(e){this.eventbus=e,this.eventbus.add(this),this._subscribers.push(this.eventbus.on(`${w}${this.eventbus.options.delimiter}**`,this.onMessage.bind(this))),this._onSubscribeForNode();}disconnect(){this.eventbus?.remove(this.id),this._subscribers.forEach(e=>e.off());}_onSubscribeForNode(){let e=`${this.id}${this.eventbus.options.delimiter}`;this._subscribers.push(this.eventbus.on(`${e}**`,(s,n)=>(s.type=s.type.substring(e.length),G(this.emit(s,n)))));}send(e,s,n){this._assertConnected();let r={type:"data",from:this.id,to:e,payload:s};return this.eventbus.send(r,n)}_assertConnected(){if(!this.eventbus)throw new Error("Node is not connected to any event bus")}broadcast(){this._assertConnected();let[e,s]=A(arguments,this.options.delimiter);return e.from=this.id,this.eventbus.broadcast(e,s)}onMessage(e,s){}};a(W,"FastEventBusNode");var Q=W;function Ee(i){return i&&typeof i=="string"}a(Ee,"isString");function Se(i){return typeof i=="function"&&(i.toString().startsWith("class ")||i.prototype?.constructor===i)}a(Se,"isClass");function Ae(i){return i?typeof i=="object"&&"__FastEvent__"in i:false}a(Ae,"isFastEvent");export{x as AbortError,w as BroadcastEvent,E as CancelError,g as FastEvent,U as FastEventBus,Q as FastEventBusNode,d as FastEventDirectives,m as FastEventError,_ as FastEventListenerFlags,S as FastEventScope,y as NamespaceDelimiter,Z as NodeDataEvent,I as QueueOverflowError,V as TimeoutError,v as UnboundError,it as __FastEventScope__,st as __FastEvent__,z as __expandable__,G as expandable,Se as isClass,H as isExpandable,Ae as isFastEvent,k as isFastEventMessage,X as isFastEventScope,c as isFunction,C as isPathMatched,Ee as isString,K as isSubsctiber};//# sourceMappingURL=index.mjs.map
//# sourceMappingURL=index.mjs.map

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display