{"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","listeners","message","args","execute","listener","last","race","winner","abortController","result","random","index","balance","count","i","isFunction","fn","isString","str","series","options","reverse","onNext","onReturns","onError","_","cur","results","stepResult","item","e","behavior","waterfall","previous","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 [execute.call(listeners[0], listeners[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.call(\n                listeners[listeners.length - 1],\n                listeners[listeners.length - 1],\n                message,\n                args,\n            ),\n        ];\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.call(listener, listener, message, args)).then(\n                    (result: any) => {\n                        if (!winner) {\n                            winner = listener;\n                            listener[2]++;\n                        }\n                        abortController?.abort();\n                        return result;\n                    },\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 [execute.call(listeners[index], listeners[index], 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.call(listeners[index], listeners[index], message, args)];\n    };\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 { FastEventListenerMeta, 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 as unknown as FastEventListenerMeta;\n            try {\n                if (\n                    isFunction(onNext) &&\n                    onNext(++index, stepResult, message, args, results) === false\n                ) {\n                    break;\n                }\n                stepResult = await execute.call(listener, 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, i) =>\n            execute.call(listeners[i], listener, message, args, true),\n        );\n    };\n};\n"]}