vue-fn 0.2.0-rc → 0.3.0-rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/domain/agg.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type DeepReadonly, type EffectScope, type ComputedRef } from 'vue';
1
+ import { type ComputedRef, type DeepReadonly, type EffectScope } from 'vue';
2
2
  import { type DomainBroadcastEvent, type DomainDestroyedEventApi, type DomainEvent, type DomainRequestEvent } from './event';
3
3
  type AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never ? {
4
4
  destroyed: DomainDestroyedEventApi;
package/domain/bind.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Ref, ShallowRef, Reactive, ShallowReactive, WatchCallback, WatchOptions } from 'vue';
1
+ import { type Reactive, type Ref, type ShallowRef, type ShallowReactive, type WatchCallback, type WatchOptions } from 'vue';
2
2
  type DomainAggState = DomainAggRefState | DomainAggReactiveState;
3
3
  type DomainAggRefState = Readonly<Ref<any>> | Readonly<ShallowRef<any>>;
4
4
  type DomainAggReactiveState = Readonly<Reactive<object>> | Readonly<ShallowReactive<object>>;
package/domain/event.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { DeepReadonly, UnwrapNestedRefs } from 'vue';
1
+ import type { DeepReadonly, UnwrapNestedRefs } from 'vue';
2
2
  export type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {
3
3
  dataType?: DATA;
4
4
  onReply: ON_REPLY;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../libs/domain/event.ts","../../libs/domain/common.ts","../../libs/domain/plugin.ts","../../libs/domain/agg.ts","../../libs/domain/bind.ts"],"sourcesContent":["import { Deferred } from 'ts-deferred';\r\nimport { DeepReadonly, UnwrapNestedRefs } from 'vue';\r\n\r\nexport type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {\r\n dataType?: DATA;\r\n onReply: ON_REPLY;\r\n onError?: (e: Error) => void;\r\n maxListenerCount?: number;\r\n isTerminateOnError?: boolean;\r\n timeoutMs?: number | false;\r\n};\r\nexport type DomainRequestEvent<DATA, REPLY_DATA> = {\r\n listeners: DomainRequestEventListener<DATA, REPLY_DATA>[];\r\n publishRequest: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => Promise<REPLY_DATA>;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listenAndReply: (replyFn: DomainRequestEventListener<DATA, REPLY_DATA>) => () => void;\r\n };\r\n};\r\nexport type DomainRequestEventListener<DATA, REPLY_DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => REPLY_DATA;\r\n\r\nexport type DomainBroadcastEvent<DATA> = {\r\n listeners: DomainBroadcastEventListener<DATA>[];\r\n publish: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => void;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listen: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ) => () => void;\r\n };\r\n};\r\nexport type DomainBroadcastEventListener<DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => void;\r\n\r\nexport type DomainDestroyedEventApi = DomainBroadcastEvent<{}>['api'];\r\n\r\nexport type DomainEvent<DATA, REPLY_DATA> =\r\n | DomainRequestEvent<DATA, REPLY_DATA>\r\n | DomainBroadcastEvent<DATA>;\r\n\r\nexport function createRequestEvent<EVT_DATA extends object = never, REPLY_DATA = void>() {\r\n function options<ON_REPLY extends (replyData: REPLY_DATA) => void>(\r\n options: DomainRequestEventOptions<EVT_DATA, ON_REPLY>\r\n ): DomainRequestEvent<EVT_DATA, REPLY_DATA> {\r\n let currentVersion = '0';\r\n let unconsumedEvent: {\r\n version: string;\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>;\r\n resolve: (data: REPLY_DATA) => void;\r\n reject: (e: Error) => void;\r\n timerId: NodeJS.Timeout | undefined;\r\n }[] = [];\r\n const listeners: DomainRequestEventListener<EVT_DATA, REPLY_DATA>[] = [];\r\n function updateEvent(\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>,\r\n resolve: (data: REPLY_DATA) => void,\r\n reject: (e: Error) => void,\r\n timerId: NodeJS.Timeout | undefined\r\n ) {\r\n const nextVer = largeNumberIncrease(currentVersion);\r\n currentVersion = nextVer;\r\n unconsumedEvent.push({\r\n version: nextVer,\r\n data,\r\n resolve,\r\n reject,\r\n timerId,\r\n });\r\n emitEvent();\r\n }\r\n function emitEvent() {\r\n if (unconsumedEvent.length === 0 || listeners.length === 0) {\r\n return;\r\n }\r\n for (const event of unconsumedEvent) {\r\n const { version, data, resolve, reject, timerId } = event;\r\n const context = {\r\n data,\r\n version,\r\n };\r\n for (const listener of listeners) {\r\n try {\r\n const replyData = listener(context);\r\n options.onReply(replyData);\r\n resolve(replyData);\r\n timerId && clearTimeout(timerId);\r\n // return await deferred.promise\r\n } catch (e: unknown) {\r\n if (options.onError && e instanceof Error) {\r\n options.onError(e);\r\n if (options.isTerminateOnError) {\r\n reject(e);\r\n timerId && clearTimeout(timerId);\r\n }\r\n } else {\r\n throw new Error('caught a unknown error' + (e?.toString() || e));\r\n }\r\n }\r\n }\r\n unconsumedEvent.shift();\r\n }\r\n }\r\n return {\r\n listeners,\r\n async publishRequest(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const deferred = new Deferred<REPLY_DATA>();\r\n let timerId: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs) {\r\n timerId = setTimeout(() => {\r\n deferred.reject(new Error(`timeout: ${options.timeoutMs} ms`));\r\n }, options.timeoutMs);\r\n }\r\n updateEvent(data, deferred.resolve, deferred.reject, timerId);\r\n return await deferred.promise;\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listenAndReply(replyFn: DomainRequestEventListener<EVT_DATA, REPLY_DATA>): () => void {\r\n if (options.maxListenerCount && listeners.length >= options.maxListenerCount) {\r\n throw new Error('too many listeners. max limit: ' + options.maxListenerCount);\r\n }\r\n listeners.push(replyFn);\r\n emitEvent();\r\n return () => {\r\n const index = listeners.indexOf(replyFn);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n options,\r\n };\r\n}\r\n\r\nexport function createBroadcastEvent<\r\n EVT_DATA extends object = never\r\n>(): DomainBroadcastEvent<EVT_DATA> {\r\n let currentVersion = '0';\r\n const listeners: DomainBroadcastEventListener<EVT_DATA>[] = [];\r\n return {\r\n listeners,\r\n publish(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const context = {\r\n data,\r\n version: largeNumberIncrease(currentVersion),\r\n };\r\n currentVersion = context.version;\r\n for (const listener of listeners) {\r\n listener(context);\r\n }\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listen(\r\n cb: (options: { data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>; version: string }) => void\r\n ): () => void {\r\n listeners.push(cb);\r\n return () => {\r\n const index = listeners.indexOf(cb);\r\n if (index >= 0) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function largeNumberIncrease(num1: string): string {\r\n if (+num1 < Number.MAX_SAFE_INTEGER) {\r\n return (parseInt(num1) + 1).toString();\r\n }\r\n\r\n // 反转字符串以便从最低位开始相加\r\n let str1 = num1.split('').reverse().join('');\r\n let str2 = '1';\r\n\r\n const maxLength = Math.max(str1.length, str2.length);\r\n let carry = 0;\r\n let result = [];\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n const digit1 = i < str1.length ? parseInt(str1[i], 10) : 0;\r\n const digit2 = i < str2.length ? parseInt(str2[i], 10) : 0;\r\n\r\n const sum = digit1 + digit2 + carry;\r\n result.push(sum % 10); // 当前位的结果\r\n carry = Math.floor(sum / 10); // 计算进位\r\n }\r\n\r\n if (carry > 0) {\r\n result.push(carry);\r\n }\r\n\r\n // 反转结果并转换为字符串\r\n return result.reverse().join('');\r\n}\r\n","// import { nanoid } from 'nanoid';\r\n\r\nexport function genId(prefix = ''): string {\r\n // return nanoid();\r\n const ts = Date.now().toString(36);\r\n const rd = Math.random().toString(36).substring(2, 10);\r\n return `${prefix}${ts}${rd}`;\r\n}\r\n\r\nexport function isEqual(a: any, b: any, cache = new WeakMap<object, object>()): boolean {\r\n // 1. 严格相等或都是 NaN\r\n // NaN === NaN 是 false,但我们通常认为两个 NaN 是相等的\r\n if (a === b) return true;\r\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\r\n\r\n // 2. 如果 a 或 b 不是对象(或为 null),则它们不相等(因为上一步 a === b 已判断过)\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return false;\r\n }\r\n\r\n // 3. 检查缓存,避免循环引用\r\n // 如果 a 已经在缓存中,检查 b 是否是 a 对应的缓存值\r\n if (cache.has(a) && cache.get(a) === b) {\r\n return true;\r\n }\r\n // 将 a 和 b 存入缓存\r\n cache.set(a, b);\r\n // 同样地,反向缓存\r\n cache.set(b, a);\r\n\r\n // 4. 特殊对象类型比较\r\n // Date 对象比较时间戳\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n // RegExp 对象比较字符串表示\r\n if (a instanceof RegExp && b instanceof RegExp) {\r\n return a.toString() === b.toString();\r\n }\r\n\r\n // 5. 数组比较\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i], cache)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n // 6. Set 比较\r\n if (a instanceof Set && b instanceof Set) {\r\n if (a.size !== b.size) return false;\r\n // 将 Set 转换为数组进行比较,注意这可能不适用于包含复杂对象的 Set\r\n // 更稳妥的方式是遍历其中一个 Set,检查所有元素是否存在于另一个 Set 中\r\n const aValues = Array.from(a);\r\n const bValues = Array.from(b);\r\n return isEqual(aValues.sort(), bValues.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 7. Map 比较\r\n if (a instanceof Map && b instanceof Map) {\r\n if (a.size !== b.size) return false;\r\n const aEntries = Array.from(a.entries());\r\n const bEntries = Array.from(b.entries());\r\n return isEqual(aEntries.sort(), bEntries.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 8. 检查原型是否相同\r\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {\r\n return false;\r\n }\r\n\r\n // 9. 通用对象属性比较\r\n const keysA = Reflect.ownKeys(a);\r\n const keysB = Reflect.ownKeys(b);\r\n\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n // 检查键名是否完全一致\r\n for (let i = 0; i < keysA.length; i++) {\r\n if (keysA[i] !== keysB[i]) return false;\r\n }\r\n\r\n // 递归比较所有属性值\r\n for (const key of keysA) {\r\n if (!isEqual((a as any)[key], (b as any)[key], cache)) {\r\n return false;\r\n }\r\n }\r\n\r\n // 如果所有检查都通过,则认为对象相等\r\n return true;\r\n}\r\n\r\nexport function deepClone<T>(target: T, hash = new WeakMap<object, any>()): T {\r\n // 基本类型、null 和函数直接返回\r\n if (target === null || typeof target !== 'object') {\r\n return target;\r\n }\r\n\r\n // 处理 Date 对象\r\n if (target instanceof Date) {\r\n return new Date(target.getTime()) as any;\r\n }\r\n\r\n // 处理 RegExp 对象\r\n if (target instanceof RegExp) {\r\n return new RegExp(target) as any;\r\n }\r\n\r\n // 检查缓存,防止循环引用\r\n if (hash.has(target)) {\r\n return hash.get(target);\r\n }\r\n\r\n // 处理 Set\r\n if (target instanceof Set) {\r\n const cloneSet = new Set<any>();\r\n hash.set(target, cloneSet); // 缓存 Set\r\n target.forEach((value) => {\r\n cloneSet.add(deepClone(value, hash));\r\n });\r\n return cloneSet as any;\r\n }\r\n\r\n // 处理 Map\r\n if (target instanceof Map) {\r\n const cloneMap = new Map<any, any>();\r\n hash.set(target, cloneMap); // 缓存 Map\r\n target.forEach((value, key) => {\r\n cloneMap.set(deepClone(key, hash), deepClone(value, hash));\r\n });\r\n return cloneMap as any;\r\n }\r\n\r\n // 创建一个新的容器(对象或数组)\r\n // 使用 Object.getPrototypeOf 获取原型,以支持更广泛的对象类型\r\n const cloneTarget: T = Array.isArray(target)\r\n ? ([] as T)\r\n : (Object.create(Object.getPrototypeOf(target)) as T);\r\n\r\n // 将新创建的克隆对象放入缓存\r\n hash.set(target, cloneTarget);\r\n\r\n // 递归拷贝对象的属性(包括 Symbol 属性)\r\n // 使用 Reflect.ownKeys 可以获取所有类型的键名\r\n for (const key of Reflect.ownKeys(target)) {\r\n // 使用类型断言来处理索引签名\r\n (cloneTarget as any)[key] = deepClone((target as any)[key], hash);\r\n }\r\n\r\n return cloneTarget;\r\n}\r\n","import { ComputedRef } from 'vue';\r\nimport type { DomainSingletonAgg, DomainMultiInstanceAgg } from './agg';\r\nimport { genId } from './common';\r\n\r\ntype DomainPluginType = 'Setup' | 'HotSwap';\r\n\r\ntype DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;\r\n\r\nexport type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;\r\n\r\nexport type DomainSetupPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'Setup'>;\r\n readonly mount: (util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) => void;\r\n};\r\n\r\ntype DomainSetupPluginOptions<AGG extends DomainAgg> = ReturnType<DomainSetupPluginOptionsFn<AGG>>;\r\n\r\ntype DomainSetupPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'HotSwap'>;\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n readonly unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPluginOptions<AGG extends DomainAgg> = ReturnType<\r\n DomainHotSwapPluginOptionsFn<AGG>\r\n>;\r\n\r\nexport type DomainHotSwapPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\ntype SingletonPluginHelperApi<AGG extends DomainSingletonAgg<any, any, any>> = Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n}>;\r\n\r\ntype MultiInstancePluginHelperApi<AGG extends DomainMultiInstanceAgg<any, any, any, any>> =\r\n Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n onDestroy: (cb: (agg: AGG) => void) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n }>;\r\n\r\ntype PluginHelperApi<AGG extends DomainAgg> = AGG extends DomainMultiInstanceAgg<any, any, any, any>\r\n ? MultiInstancePluginHelperApi<AGG>\r\n : AGG extends DomainSingletonAgg<any, any, any>\r\n ? SingletonPluginHelperApi<AGG>\r\n : never;\r\n\r\nfunction createPluginHelper<AGG extends DomainAgg>(\r\n onDestroyFn?: (agg: AGG) => void\r\n): PluginHelperApi<AGG> {\r\n const setupPlugins: Record<string, DomainSetupPlugin<AGG>> = {};\r\n const hotSwapPlugins: Record<string, DomainHotSwapPlugin<AGG>> = {};\r\n const hotSwapPluginsCheck = new WeakMap<AGG, string[]>();\r\n const aggRecords: Record<string, AGG> = {};\r\n const customDestroyedHandlers: ((agg: AGG) => void)[] = [];\r\n\r\n return Object.freeze({\r\n registerAgg(agg: AGG) {\r\n if (agg.isInitialized.value) {\r\n throw new Error('Agg must register before initialized');\r\n } else if (aggRecords[agg.__id]) {\r\n throw new Error('Agg already registered');\r\n } else if (agg.type === 'MultiInstance') {\r\n agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n });\r\n }\r\n aggRecords[agg.__id] = agg;\r\n const applyedHotSwapPlugins: string[] = [];\r\n for (const p of Object.values(setupPlugins)) {\r\n p.mount({\r\n api: agg.api,\r\n __aggId: agg.__id,\r\n isInitialized: agg.isInitialized,\r\n });\r\n }\r\n for (const p of Object.values(hotSwapPlugins)) {\r\n p.mount({ api: agg.api, __aggId: agg.__id });\r\n applyedHotSwapPlugins.push(p.__id);\r\n }\r\n hotSwapPluginsCheck.set(agg, applyedHotSwapPlugins);\r\n\r\n if (isMultiInstanceAgg(agg)) {\r\n const handler = agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n onDestroyFn?.(agg);\r\n for (const fn of customDestroyedHandlers) {\r\n fn(agg);\r\n }\r\n handler?.();\r\n });\r\n }\r\n },\r\n onDestroy(cb: (agg: AGG) => void) {\r\n customDestroyedHandlers.push(cb);\r\n },\r\n createSetupPlugin(\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ): DomainSetupPlugin<AGG> {\r\n let opts: undefined | DomainSetupPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'Setup',\r\n mount(util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) {\r\n if (util.isInitialized.value) {\r\n throw new Error('Can not setup after initialized');\r\n }\r\n opts!.mount({ api: util.api, __aggId: util.__aggId });\r\n },\r\n });\r\n },\r\n createHotSwapPlugin(\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ): DomainHotSwapPlugin<AGG> {\r\n let opts: undefined | DomainHotSwapPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'HotSwap',\r\n mount: opts!.mount,\r\n unmount: opts!.unmount,\r\n });\r\n },\r\n registerPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n if (setupPlugins[plugin.__id]) {\r\n throw new Error('Plugin already registered');\r\n }\r\n setupPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n isInitialized: aggRecords[k].isInitialized,\r\n });\r\n }\r\n } else if (plugin.type === 'HotSwap') {\r\n hotSwapPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n !hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n hotSwapPluginsCheck.get(aggRecords[k])!.push(plugin.__id);\r\n }\r\n }\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n unregisterPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n throw new Error('Can not unregister setup plugin');\r\n } else if (plugin.type === 'HotSwap') {\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.unmount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id];\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n }) as PluginHelperApi<AGG>;\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainSingletonAgg<any, any, any>\r\n>(_: FUN): SingletonPluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainMultiInstanceAgg<any, any, any, any>\r\n>(_: FUN, onDestroy: (agg: ReturnType<FUN>) => void): MultiInstancePluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(\r\n _: FUN,\r\n onDestroy?: (agg: ReturnType<FUN>) => void\r\n) {\r\n return createPluginHelper<ReturnType<FUN>>(onDestroy);\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainSingletonAgg<any, any, any>>(_: AGG) {\r\n return createPluginHelper<AGG>();\r\n}\r\n\r\nfunction isMultiInstanceAgg(agg: DomainAgg): agg is DomainMultiInstanceAgg<any, any, any, any> {\r\n return agg.type === 'MultiInstance';\r\n}\r\n","import {\r\n type DeepReadonly,\r\n readonly,\r\n shallowReadonly,\r\n type EffectScope,\r\n effectScope,\r\n onScopeDispose,\r\n type ComputedRef,\r\n computed,\r\n ref,\r\n} from 'vue';\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n type DomainEvent,\r\n type DomainRequestEvent,\r\n createBroadcastEvent,\r\n} from './event';\r\nimport { genId } from './common';\r\nimport { Deferred } from 'ts-deferred';\r\n\r\ntype AddDestroyedEvent<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainBroadcastEvent<{}> }\r\n : {\r\n [P in keyof T as P extends K ? 'destroyed' : P]: P extends K\r\n ? DomainBroadcastEvent<{}>\r\n : T[P];\r\n } & { destroyed: DomainBroadcastEvent<{}> };\r\ntype AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainDestroyedEventApi }\r\n : {\r\n [P in keyof T as P]: P extends K ? DomainBroadcastEvent<{}> : T[P];\r\n } & { destroyed: DomainDestroyedEventApi };\r\n\r\ntype InferDomainEvent<EVENT extends DomainEvent<any, any>> = EVENT extends DomainBroadcastEvent<\r\n infer DATA\r\n>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer REPLY_DATA>\r\n ? DomainRequestEvent<DATA, REPLY_DATA>\r\n : never;\r\ntype InferDomainEventApi<EVENT extends DomainEvent<any, any>> = InferDomainEvent<EVENT>['api'];\r\n\r\ntype CustomerStateRecords<T> = keyof T extends never ? {} : Record<string, object>;\r\ntype CustomerCommandRecords<T> = keyof T extends never ? {} : Record<string, Function>;\r\ntype CustomerEventRecords<T> = keyof T extends never\r\n ? {}\r\n : {\r\n [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n ? T[K]\r\n : never;\r\n };\r\nexport type DomainDestroyFunction = (...args: any[]) => void;\r\n\r\nexport type DomainStatesApi<STATES extends CustomerStateRecords<any>> = Readonly<{\r\n [K in keyof STATES]: DeepReadonly<STATES[K]>;\r\n}>;\r\n\r\nexport type DomainCommandsApi<COMMANDS extends CustomerCommandRecords<any>> = Readonly<{\r\n [K in keyof COMMANDS]: COMMANDS[K] extends Function ? COMMANDS[K] : never;\r\n}>;\r\n\r\nexport type DomainEventsApi<EVENTS extends CustomerEventRecords<any>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\r\n ? Readonly<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n : EVENTS;\r\n\r\nexport type DomainMultiInstanceEventsApi<EVENTS extends CustomerEventRecords<EVENTS>> =\r\n EVENTS extends Record<string, DomainRequestEvent<any, any> | DomainBroadcastEvent<any>>\r\n ? Readonly<\r\n AddDestroyedEventApi<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n >\r\n : { destroyed: DomainDestroyedEventApi };\r\n\r\nexport type DomainMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainMultiInstanceEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n}>;\r\n\r\nexport type DomainSingletonAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n}>;\r\n\r\nexport function createMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS> {\r\n return createAggApiContent(option) as unknown as DomainMultiInstanceAggApi<\r\n STATES,\r\n COMMANDS,\r\n EVENTS\r\n >;\r\n}\r\n\r\nexport function createAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainSingletonAggApi<STATES, COMMANDS, EVENTS> {\r\n const apiContent = createAggApiContent(option);\r\n return shallowReadonly({\r\n states: apiContent.states,\r\n commands: apiContent.commands,\r\n events: apiContent.events,\r\n });\r\n}\r\n\r\nfunction createAggApiContent<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): {\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n} {\r\n const optionStates = option.states as Record<string, object>;\r\n for (const k of Object.keys(option.states)) {\r\n optionStates[k] = readonly(optionStates[k]);\r\n }\r\n const states = shallowReadonly(option.states) as DomainStatesApi<STATES>;\r\n const commands = readonly(option.commands) as DomainCommandsApi<COMMANDS>;\r\n const events = {} as DomainEventsApi<EVENTS>;\r\n const optionEvents = option.events as {\r\n [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any>;\r\n };\r\n for (const k in option.events) {\r\n (events as any)[k] = optionEvents[k].api;\r\n }\r\n return shallowReadonly({\r\n states,\r\n commands,\r\n events: shallowReadonly(events) as DomainEventsApi<EVENTS>,\r\n destroy: option.destroy,\r\n });\r\n}\r\n\r\nexport type DomainMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'MultiInstance';\r\n readonly id: ID;\r\n readonly api: DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport type DomainSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'Singleton';\r\n readonly api: DomainSingletonAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport function createMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n id: ID,\r\n init: (context: {\r\n getCurrentScope: () => EffectScope;\r\n onScopeDispose: (fn: () => void, failSilently?: boolean) => void;\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n destroy?: DomainDestroyFunction;\r\n }\r\n): DomainMultiInstanceAgg<ID, STATES, COMMANDS, EVENTS> {\r\n // 声明 生命周期 - init\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n setTimeout(() =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n throw e;\r\n })\r\n );\r\n const scope = effectScope();\r\n const result = scope.run(() =>\r\n init({\r\n getCurrentScope() {\r\n return scope;\r\n },\r\n onScopeDispose,\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n })\r\n )!;\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const eventsExt = (result.events || {}) as AddDestroyedEvent<EVENTS>;\r\n let destroyedEvent: DomainBroadcastEvent<{}> | undefined;\r\n if (!eventsExt.destroyed) {\r\n destroyedEvent = createBroadcastEvent<{}>();\r\n eventsExt.destroyed = destroyedEvent;\r\n } else {\r\n destroyedEvent = eventsExt.destroyed;\r\n }\r\n\r\n let destroy = result.destroy as DomainDestroyFunction;\r\n if (!destroy) {\r\n destroy = (() => {\r\n destroyedEvent?.publish({});\r\n for (const k in eventsExt) {\r\n const event = eventsExt[k];\r\n (event as DomainEvent<any, any>).listeners.length = 0;\r\n // for (const handle of (event as DomainEvent<any, any>).listeners) {\r\n // handle()\r\n // }\r\n }\r\n scope.stop();\r\n }) as DomainDestroyFunction;\r\n }\r\n return shallowReadonly({\r\n __id: genId(),\r\n type: 'MultiInstance',\r\n id,\r\n api: createMultiInstanceAggApi({\r\n states,\r\n commands,\r\n events: eventsExt as unknown as EVENTS,\r\n destroy,\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n });\r\n}\r\n\r\nexport function createSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n init: (context: {\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n }\r\n): DomainSingletonAgg<STATES, COMMANDS, EVENTS> {\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n\r\n const result = init({\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n });\r\n setTimeout(\r\n () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n }),\r\n 0\r\n );\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const events = (result.events || {}) as EVENTS;\r\n return {\r\n __id: genId(),\r\n type: 'Singleton',\r\n api: createAggApi({\r\n states,\r\n commands,\r\n events,\r\n destroy: () => {},\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n };\r\n}\r\n","import {\r\n watch,\r\n ref,\r\n Ref,\r\n ShallowRef,\r\n Reactive,\r\n ShallowReactive,\r\n isReactive,\r\n WatchCallback,\r\n isRef,\r\n WatchOptions,\r\n unref,\r\n} from 'vue';\r\nimport { deepClone, isEqual } from './common';\r\n\r\ntype DomainAggState = DomainAggRefState | DomainAggReactiveState;\r\ntype DomainAggRefState = Readonly<Ref<any>> | Readonly<ShallowRef<any>>;\r\ntype DomainAggReactiveState = Readonly<Reactive<object>> | Readonly<ShallowReactive<object>>;\r\ntype SingleFieldRef = () => any;\r\ntype DeepMutable<T> = {\r\n -readonly [P in keyof T]: T[P] extends object ? DeepMutable<T[P]> : T[P];\r\n};\r\ntype InferValue<T> = T extends () => infer R\r\n ? R\r\n : T extends Readonly<Ref<any>> | Readonly<ShallowRef<any>> | Ref<any> | ShallowRef<any>\r\n ? DeepMutable<T['value']>\r\n : T extends Readonly<Reactive<infer R>> | Readonly<ShallowReactive<infer R>> | Reactive<infer R>\r\n ? DeepMutable<R>\r\n : never;\r\n\r\nexport function bindRef<STATE extends DomainAggState | SingleFieldRef, T extends InferValue<STATE>>(\r\n aggState: STATE,\r\n onChange: WatchCallback<T>,\r\n watchOptions?: WatchOptions & { forceSync?: boolean }\r\n): Ref<T> {\r\n const result = ref<T>(copyValue<T>(aggState));\r\n if (!watchOptions?.forceSync) {\r\n watch(result, onChange as any, watchOptions);\r\n return result as Ref<T>;\r\n }\r\n\r\n watchOptions.forceSync = undefined;\r\n let latestSyncValue: any;\r\n watch(\r\n aggState,\r\n (v) => {\r\n latestSyncValue = v;\r\n result.value = v;\r\n },\r\n watchOptions\r\n );\r\n watch(\r\n result,\r\n (n, o, onCleanup) => {\r\n if (isEqual(n, latestSyncValue)) {\r\n return;\r\n }\r\n onChange(n as T, o, onCleanup);\r\n },\r\n watchOptions\r\n );\r\n return result as Ref<T>;\r\n}\r\n\r\nfunction copyValue<T>(state: DomainAggState | SingleFieldRef): T {\r\n let t: T;\r\n if (typeof state === 'function') {\r\n t = state();\r\n } else if (isReactive(state) || isRef(state)) {\r\n t = unref(state) as any;\r\n } else {\r\n throw new Error('invalid state');\r\n }\r\n if (typeof t === 'object') {\r\n t = deepClone(t);\r\n }\r\n return t;\r\n}\r\n"],"names":["createRequestEvent","options","currentVersion","unconsumedEvent","listeners","updateEvent","data","resolve","reject","timerId","nextVer","largeNumberIncrease","emitEvent","event","version","context","listener","replyData","e","deferred","Deferred","replyFn","index","createBroadcastEvent","cb","num1","str1","str2","maxLength","carry","result","i","digit1","digit2","sum","genId","prefix","ts","rd","isEqual","a","b","cache","aValues","bValues","aEntries","bEntries","keysA","keysB","key","deepClone","target","hash","cloneSet","value","cloneMap","cloneTarget","createPluginHelper","onDestroyFn","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","customDestroyedHandlers","agg","applyedHotSwapPlugins","p","isMultiInstanceAgg","handler","fn","args","opts","util","plugin","k","createPluginHelperByAggCreator","_","onDestroy","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","readonly","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","ref","onBeforeInitialize","beforeInitializeTasks","scope","effectScope","onScopeDispose","computed","eventsExt","destroyedEvent","destroy","createSingletonAgg","bindRef","aggState","onChange","watchOptions","copyValue","watch","latestSyncValue","v","n","o","onCleanup","state","isReactive","isRef","unref"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../libs/domain/event.ts","../../libs/domain/common.ts","../../libs/domain/plugin.ts","../../libs/domain/agg.ts","../../libs/domain/bind.ts"],"sourcesContent":["import { Deferred } from 'ts-deferred';\r\nimport type { DeepReadonly, UnwrapNestedRefs } from 'vue';\r\n\r\nexport type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {\r\n dataType?: DATA;\r\n onReply: ON_REPLY;\r\n onError?: (e: Error) => void;\r\n maxListenerCount?: number;\r\n isTerminateOnError?: boolean;\r\n timeoutMs?: number | false;\r\n};\r\nexport type DomainRequestEvent<DATA, REPLY_DATA> = {\r\n listeners: DomainRequestEventListener<DATA, REPLY_DATA>[];\r\n publishRequest: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => Promise<REPLY_DATA>;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listenAndReply: (replyFn: DomainRequestEventListener<DATA, REPLY_DATA>) => () => void;\r\n };\r\n};\r\nexport type DomainRequestEventListener<DATA, REPLY_DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => REPLY_DATA;\r\n\r\nexport type DomainBroadcastEvent<DATA> = {\r\n listeners: DomainBroadcastEventListener<DATA>[];\r\n publish: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => void;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listen: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ) => () => void;\r\n };\r\n};\r\nexport type DomainBroadcastEventListener<DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => void;\r\n\r\nexport type DomainDestroyedEventApi = DomainBroadcastEvent<{}>['api'];\r\n\r\nexport type DomainEvent<DATA, REPLY_DATA> =\r\n | DomainRequestEvent<DATA, REPLY_DATA>\r\n | DomainBroadcastEvent<DATA>;\r\n\r\nexport function createRequestEvent<EVT_DATA extends object = never, REPLY_DATA = void>() {\r\n function options<ON_REPLY extends (replyData: REPLY_DATA) => void>(\r\n options: DomainRequestEventOptions<EVT_DATA, ON_REPLY>\r\n ): DomainRequestEvent<EVT_DATA, REPLY_DATA> {\r\n let currentVersion = '0';\r\n let unconsumedEvent: {\r\n version: string;\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>;\r\n resolve: (data: REPLY_DATA) => void;\r\n reject: (e: Error) => void;\r\n timerId: NodeJS.Timeout | undefined;\r\n }[] = [];\r\n const listeners: DomainRequestEventListener<EVT_DATA, REPLY_DATA>[] = [];\r\n function updateEvent(\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>,\r\n resolve: (data: REPLY_DATA) => void,\r\n reject: (e: Error) => void,\r\n timerId: NodeJS.Timeout | undefined\r\n ) {\r\n const nextVer = largeNumberIncrease(currentVersion);\r\n currentVersion = nextVer;\r\n unconsumedEvent.push({\r\n version: nextVer,\r\n data,\r\n resolve,\r\n reject,\r\n timerId,\r\n });\r\n emitEvent();\r\n }\r\n function emitEvent() {\r\n if (unconsumedEvent.length === 0 || listeners.length === 0) {\r\n return;\r\n }\r\n for (const event of unconsumedEvent) {\r\n const { version, data, resolve, reject, timerId } = event;\r\n const context = {\r\n data,\r\n version,\r\n };\r\n for (const listener of listeners) {\r\n try {\r\n const replyData = listener(context);\r\n options.onReply(replyData);\r\n resolve(replyData);\r\n timerId && clearTimeout(timerId);\r\n // return await deferred.promise\r\n } catch (e: unknown) {\r\n if (options.onError && e instanceof Error) {\r\n options.onError(e);\r\n if (options.isTerminateOnError) {\r\n reject(e);\r\n timerId && clearTimeout(timerId);\r\n }\r\n } else {\r\n throw new Error('caught a unknown error' + (e?.toString() || e));\r\n }\r\n }\r\n }\r\n unconsumedEvent.shift();\r\n }\r\n }\r\n return {\r\n listeners,\r\n async publishRequest(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const deferred = new Deferred<REPLY_DATA>();\r\n let timerId: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs) {\r\n timerId = setTimeout(() => {\r\n deferred.reject(new Error(`timeout: ${options.timeoutMs} ms`));\r\n }, options.timeoutMs);\r\n }\r\n updateEvent(data, deferred.resolve, deferred.reject, timerId);\r\n return await deferred.promise;\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listenAndReply(replyFn: DomainRequestEventListener<EVT_DATA, REPLY_DATA>): () => void {\r\n if (options.maxListenerCount && listeners.length >= options.maxListenerCount) {\r\n throw new Error('too many listeners. max limit: ' + options.maxListenerCount);\r\n }\r\n listeners.push(replyFn);\r\n emitEvent();\r\n return () => {\r\n const index = listeners.indexOf(replyFn);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n options,\r\n };\r\n}\r\n\r\nexport function createBroadcastEvent<\r\n EVT_DATA extends object = never\r\n>(): DomainBroadcastEvent<EVT_DATA> {\r\n let currentVersion = '0';\r\n const listeners: DomainBroadcastEventListener<EVT_DATA>[] = [];\r\n return {\r\n listeners,\r\n publish(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const context = {\r\n data,\r\n version: largeNumberIncrease(currentVersion),\r\n };\r\n currentVersion = context.version;\r\n for (const listener of listeners) {\r\n listener(context);\r\n }\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listen(\r\n cb: (options: { data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>; version: string }) => void\r\n ): () => void {\r\n listeners.push(cb);\r\n return () => {\r\n const index = listeners.indexOf(cb);\r\n if (index >= 0) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function largeNumberIncrease(num1: string): string {\r\n if (+num1 < Number.MAX_SAFE_INTEGER) {\r\n return (parseInt(num1) + 1).toString();\r\n }\r\n\r\n // 反转字符串以便从最低位开始相加\r\n let str1 = num1.split('').reverse().join('');\r\n let str2 = '1';\r\n\r\n const maxLength = Math.max(str1.length, str2.length);\r\n let carry = 0;\r\n let result = [];\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n const digit1 = i < str1.length ? parseInt(str1[i], 10) : 0;\r\n const digit2 = i < str2.length ? parseInt(str2[i], 10) : 0;\r\n\r\n const sum = digit1 + digit2 + carry;\r\n result.push(sum % 10); // 当前位的结果\r\n carry = Math.floor(sum / 10); // 计算进位\r\n }\r\n\r\n if (carry > 0) {\r\n result.push(carry);\r\n }\r\n\r\n // 反转结果并转换为字符串\r\n return result.reverse().join('');\r\n}\r\n","// import { nanoid } from 'nanoid';\r\n\r\nexport function genId(prefix = ''): string {\r\n // return nanoid();\r\n const ts = Date.now().toString(36);\r\n const rd = Math.random().toString(36).substring(2, 10);\r\n return `${prefix}${ts}${rd}`;\r\n}\r\n\r\nexport function isEqual(a: any, b: any, cache = new WeakMap<object, object>()): boolean {\r\n // 1. 严格相等或都是 NaN\r\n // NaN === NaN 是 false,但我们通常认为两个 NaN 是相等的\r\n if (a === b) return true;\r\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\r\n\r\n // 2. 如果 a 或 b 不是对象(或为 null),则它们不相等(因为上一步 a === b 已判断过)\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return false;\r\n }\r\n\r\n // 3. 检查缓存,避免循环引用\r\n // 如果 a 已经在缓存中,检查 b 是否是 a 对应的缓存值\r\n if (cache.has(a) && cache.get(a) === b) {\r\n return true;\r\n }\r\n // 将 a 和 b 存入缓存\r\n cache.set(a, b);\r\n // 同样地,反向缓存\r\n cache.set(b, a);\r\n\r\n // 4. 特殊对象类型比较\r\n // Date 对象比较时间戳\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n // RegExp 对象比较字符串表示\r\n if (a instanceof RegExp && b instanceof RegExp) {\r\n return a.toString() === b.toString();\r\n }\r\n\r\n // 5. 数组比较\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i], cache)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n // 6. Set 比较\r\n if (a instanceof Set && b instanceof Set) {\r\n if (a.size !== b.size) return false;\r\n // 将 Set 转换为数组进行比较,注意这可能不适用于包含复杂对象的 Set\r\n // 更稳妥的方式是遍历其中一个 Set,检查所有元素是否存在于另一个 Set 中\r\n const aValues = Array.from(a);\r\n const bValues = Array.from(b);\r\n return isEqual(aValues.sort(), bValues.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 7. Map 比较\r\n if (a instanceof Map && b instanceof Map) {\r\n if (a.size !== b.size) return false;\r\n const aEntries = Array.from(a.entries());\r\n const bEntries = Array.from(b.entries());\r\n return isEqual(aEntries.sort(), bEntries.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 8. 检查原型是否相同\r\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {\r\n return false;\r\n }\r\n\r\n // 9. 通用对象属性比较\r\n const keysA = Reflect.ownKeys(a);\r\n const keysB = Reflect.ownKeys(b);\r\n\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n // 检查键名是否完全一致\r\n for (let i = 0; i < keysA.length; i++) {\r\n if (keysA[i] !== keysB[i]) return false;\r\n }\r\n\r\n // 递归比较所有属性值\r\n for (const key of keysA) {\r\n if (!isEqual((a as any)[key], (b as any)[key], cache)) {\r\n return false;\r\n }\r\n }\r\n\r\n // 如果所有检查都通过,则认为对象相等\r\n return true;\r\n}\r\n\r\nexport function deepClone<T>(target: T, hash = new WeakMap<object, any>()): T {\r\n // 基本类型、null 和函数直接返回\r\n if (target === null || typeof target !== 'object') {\r\n return target;\r\n }\r\n\r\n // 处理 Date 对象\r\n if (target instanceof Date) {\r\n return new Date(target.getTime()) as any;\r\n }\r\n\r\n // 处理 RegExp 对象\r\n if (target instanceof RegExp) {\r\n return new RegExp(target) as any;\r\n }\r\n\r\n // 检查缓存,防止循环引用\r\n if (hash.has(target)) {\r\n return hash.get(target);\r\n }\r\n\r\n // 处理 Set\r\n if (target instanceof Set) {\r\n const cloneSet = new Set<any>();\r\n hash.set(target, cloneSet); // 缓存 Set\r\n target.forEach((value) => {\r\n cloneSet.add(deepClone(value, hash));\r\n });\r\n return cloneSet as any;\r\n }\r\n\r\n // 处理 Map\r\n if (target instanceof Map) {\r\n const cloneMap = new Map<any, any>();\r\n hash.set(target, cloneMap); // 缓存 Map\r\n target.forEach((value, key) => {\r\n cloneMap.set(deepClone(key, hash), deepClone(value, hash));\r\n });\r\n return cloneMap as any;\r\n }\r\n\r\n // 创建一个新的容器(对象或数组)\r\n // 使用 Object.getPrototypeOf 获取原型,以支持更广泛的对象类型\r\n const cloneTarget: T = Array.isArray(target)\r\n ? ([] as T)\r\n : (Object.create(Object.getPrototypeOf(target)) as T);\r\n\r\n // 将新创建的克隆对象放入缓存\r\n hash.set(target, cloneTarget);\r\n\r\n // 递归拷贝对象的属性(包括 Symbol 属性)\r\n // 使用 Reflect.ownKeys 可以获取所有类型的键名\r\n for (const key of Reflect.ownKeys(target)) {\r\n // 使用类型断言来处理索引签名\r\n (cloneTarget as any)[key] = deepClone((target as any)[key], hash);\r\n }\r\n\r\n return cloneTarget;\r\n}\r\n","import type { ComputedRef } from 'vue';\r\nimport type { DomainMultiInstanceAgg, DomainSingletonAgg } from './agg';\r\nimport { genId } from './common';\r\n\r\ntype DomainPluginType = 'Setup' | 'HotSwap';\r\n\r\ntype DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;\r\n\r\nexport type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;\r\n\r\nexport type DomainSetupPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'Setup'>;\r\n readonly mount: (util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) => void;\r\n};\r\n\r\ntype DomainSetupPluginOptions<AGG extends DomainAgg> = ReturnType<DomainSetupPluginOptionsFn<AGG>>;\r\n\r\ntype DomainSetupPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'HotSwap'>;\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n readonly unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPluginOptions<AGG extends DomainAgg> = ReturnType<\r\n DomainHotSwapPluginOptionsFn<AGG>\r\n>;\r\n\r\nexport type DomainHotSwapPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\ntype SingletonPluginHelperApi<AGG extends DomainSingletonAgg<any, any, any>> = Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n}>;\r\n\r\ntype MultiInstancePluginHelperApi<AGG extends DomainMultiInstanceAgg<any, any, any, any>> =\r\n Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n onDestroy: (cb: (agg: AGG) => void) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n }>;\r\n\r\ntype PluginHelperApi<AGG extends DomainAgg> = AGG extends DomainMultiInstanceAgg<any, any, any, any>\r\n ? MultiInstancePluginHelperApi<AGG>\r\n : AGG extends DomainSingletonAgg<any, any, any>\r\n ? SingletonPluginHelperApi<AGG>\r\n : never;\r\n\r\nfunction createPluginHelper<AGG extends DomainAgg>(\r\n onDestroyFn?: (agg: AGG) => void\r\n): PluginHelperApi<AGG> {\r\n const setupPlugins: Record<string, DomainSetupPlugin<AGG>> = {};\r\n const hotSwapPlugins: Record<string, DomainHotSwapPlugin<AGG>> = {};\r\n const hotSwapPluginsCheck = new WeakMap<AGG, string[]>();\r\n const aggRecords: Record<string, AGG> = {};\r\n const customDestroyedHandlers: ((agg: AGG) => void)[] = [];\r\n\r\n return Object.freeze({\r\n registerAgg(agg: AGG) {\r\n if (agg.isInitialized.value) {\r\n throw new Error('Agg must register before initialized');\r\n } else if (aggRecords[agg.__id]) {\r\n throw new Error('Agg already registered');\r\n } else if (agg.type === 'MultiInstance') {\r\n agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n });\r\n }\r\n aggRecords[agg.__id] = agg;\r\n const applyedHotSwapPlugins: string[] = [];\r\n for (const p of Object.values(setupPlugins)) {\r\n p.mount({\r\n api: agg.api,\r\n __aggId: agg.__id,\r\n isInitialized: agg.isInitialized,\r\n });\r\n }\r\n for (const p of Object.values(hotSwapPlugins)) {\r\n p.mount({ api: agg.api, __aggId: agg.__id });\r\n applyedHotSwapPlugins.push(p.__id);\r\n }\r\n hotSwapPluginsCheck.set(agg, applyedHotSwapPlugins);\r\n\r\n if (isMultiInstanceAgg(agg)) {\r\n const handler = agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n onDestroyFn?.(agg);\r\n for (const fn of customDestroyedHandlers) {\r\n fn(agg);\r\n }\r\n handler?.();\r\n });\r\n }\r\n },\r\n onDestroy(cb: (agg: AGG) => void) {\r\n customDestroyedHandlers.push(cb);\r\n },\r\n createSetupPlugin(\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ): DomainSetupPlugin<AGG> {\r\n let opts: undefined | DomainSetupPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'Setup',\r\n mount(util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) {\r\n if (util.isInitialized.value) {\r\n throw new Error('Can not setup after initialized');\r\n }\r\n opts!.mount({ api: util.api, __aggId: util.__aggId });\r\n },\r\n });\r\n },\r\n createHotSwapPlugin(\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ): DomainHotSwapPlugin<AGG> {\r\n let opts: undefined | DomainHotSwapPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'HotSwap',\r\n mount: opts!.mount,\r\n unmount: opts!.unmount,\r\n });\r\n },\r\n registerPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n if (setupPlugins[plugin.__id]) {\r\n throw new Error('Plugin already registered');\r\n }\r\n setupPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n isInitialized: aggRecords[k].isInitialized,\r\n });\r\n }\r\n } else if (plugin.type === 'HotSwap') {\r\n hotSwapPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n !hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n hotSwapPluginsCheck.get(aggRecords[k])!.push(plugin.__id);\r\n }\r\n }\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n unregisterPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n throw new Error('Can not unregister setup plugin');\r\n } else if (plugin.type === 'HotSwap') {\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.unmount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id];\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n }) as PluginHelperApi<AGG>;\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainSingletonAgg<any, any, any>\r\n>(_: FUN): SingletonPluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainMultiInstanceAgg<any, any, any, any>\r\n>(_: FUN, onDestroy: (agg: ReturnType<FUN>) => void): MultiInstancePluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(\r\n _: FUN,\r\n onDestroy?: (agg: ReturnType<FUN>) => void\r\n) {\r\n return createPluginHelper<ReturnType<FUN>>(onDestroy);\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainSingletonAgg<any, any, any>>(_: AGG) {\r\n return createPluginHelper<AGG>();\r\n}\r\n\r\nfunction isMultiInstanceAgg(agg: DomainAgg): agg is DomainMultiInstanceAgg<any, any, any, any> {\r\n return agg.type === 'MultiInstance';\r\n}\r\n","import {\r\n type ComputedRef,\r\n type DeepReadonly,\r\n type EffectScope,\r\n computed,\r\n effectScope,\r\n readonly,\r\n ref,\r\n shallowReadonly,\r\n onScopeDispose,\r\n} from 'vue';\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n type DomainEvent,\r\n type DomainRequestEvent,\r\n createBroadcastEvent,\r\n} from './event';\r\nimport { genId } from './common';\r\nimport { Deferred } from 'ts-deferred';\r\n\r\ntype AddDestroyedEvent<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainBroadcastEvent<{}> }\r\n : {\r\n [P in keyof T as P extends K ? 'destroyed' : P]: P extends K\r\n ? DomainBroadcastEvent<{}>\r\n : T[P];\r\n } & { destroyed: DomainBroadcastEvent<{}> };\r\ntype AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainDestroyedEventApi }\r\n : {\r\n [P in keyof T as P]: P extends K ? DomainBroadcastEvent<{}> : T[P];\r\n } & { destroyed: DomainDestroyedEventApi };\r\n\r\ntype InferDomainEvent<EVENT extends DomainEvent<any, any>> = EVENT extends DomainBroadcastEvent<\r\n infer DATA\r\n>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer REPLY_DATA>\r\n ? DomainRequestEvent<DATA, REPLY_DATA>\r\n : never;\r\ntype InferDomainEventApi<EVENT extends DomainEvent<any, any>> = InferDomainEvent<EVENT>['api'];\r\n\r\ntype CustomerStateRecords<T> = keyof T extends never ? {} : Record<string, object>;\r\ntype CustomerCommandRecords<T> = keyof T extends never ? {} : Record<string, Function>;\r\ntype CustomerEventRecords<T> = keyof T extends never\r\n ? {}\r\n : {\r\n [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n ? T[K]\r\n : never;\r\n };\r\nexport type DomainDestroyFunction = (...args: any[]) => void;\r\n\r\nexport type DomainStatesApi<STATES extends CustomerStateRecords<any>> = Readonly<{\r\n [K in keyof STATES]: DeepReadonly<STATES[K]>;\r\n}>;\r\n\r\nexport type DomainCommandsApi<COMMANDS extends CustomerCommandRecords<any>> = Readonly<{\r\n [K in keyof COMMANDS]: COMMANDS[K] extends Function ? COMMANDS[K] : never;\r\n}>;\r\n\r\nexport type DomainEventsApi<EVENTS extends CustomerEventRecords<any>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\r\n ? Readonly<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n : EVENTS;\r\n\r\nexport type DomainMultiInstanceEventsApi<EVENTS extends CustomerEventRecords<EVENTS>> =\r\n EVENTS extends Record<string, DomainRequestEvent<any, any> | DomainBroadcastEvent<any>>\r\n ? Readonly<\r\n AddDestroyedEventApi<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n >\r\n : { destroyed: DomainDestroyedEventApi };\r\n\r\nexport type DomainMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainMultiInstanceEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n}>;\r\n\r\nexport type DomainSingletonAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n}>;\r\n\r\nexport function createMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS> {\r\n return createAggApiContent(option) as unknown as DomainMultiInstanceAggApi<\r\n STATES,\r\n COMMANDS,\r\n EVENTS\r\n >;\r\n}\r\n\r\nexport function createAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainSingletonAggApi<STATES, COMMANDS, EVENTS> {\r\n const apiContent = createAggApiContent(option);\r\n return shallowReadonly({\r\n states: apiContent.states,\r\n commands: apiContent.commands,\r\n events: apiContent.events,\r\n });\r\n}\r\n\r\nfunction createAggApiContent<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): {\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n} {\r\n const optionStates = option.states as Record<string, object>;\r\n for (const k of Object.keys(option.states)) {\r\n optionStates[k] = readonly(optionStates[k]);\r\n }\r\n const states = shallowReadonly(option.states) as DomainStatesApi<STATES>;\r\n const commands = readonly(option.commands) as DomainCommandsApi<COMMANDS>;\r\n const events = {} as DomainEventsApi<EVENTS>;\r\n const optionEvents = option.events as {\r\n [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any>;\r\n };\r\n for (const k in option.events) {\r\n (events as any)[k] = optionEvents[k].api;\r\n }\r\n return shallowReadonly({\r\n states,\r\n commands,\r\n events: shallowReadonly(events) as DomainEventsApi<EVENTS>,\r\n destroy: option.destroy,\r\n });\r\n}\r\n\r\nexport type DomainMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'MultiInstance';\r\n readonly id: ID;\r\n readonly api: DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport type DomainSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'Singleton';\r\n readonly api: DomainSingletonAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport function createMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n id: ID,\r\n init: (context: {\r\n getCurrentScope: () => EffectScope;\r\n onScopeDispose: (fn: () => void, failSilently?: boolean) => void;\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n destroy?: DomainDestroyFunction;\r\n }\r\n): DomainMultiInstanceAgg<ID, STATES, COMMANDS, EVENTS> {\r\n // 声明 生命周期 - init\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n setTimeout(() =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n throw e;\r\n })\r\n );\r\n const scope = effectScope();\r\n const result = scope.run(() =>\r\n init({\r\n getCurrentScope() {\r\n return scope;\r\n },\r\n onScopeDispose,\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n })\r\n )!;\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const eventsExt = (result.events || {}) as AddDestroyedEvent<EVENTS>;\r\n let destroyedEvent: DomainBroadcastEvent<{}> | undefined;\r\n if (!eventsExt.destroyed) {\r\n destroyedEvent = createBroadcastEvent<{}>();\r\n eventsExt.destroyed = destroyedEvent;\r\n } else {\r\n destroyedEvent = eventsExt.destroyed;\r\n }\r\n\r\n let destroy = result.destroy as DomainDestroyFunction;\r\n if (!destroy) {\r\n destroy = (() => {\r\n destroyedEvent?.publish({});\r\n for (const k in eventsExt) {\r\n const event = eventsExt[k];\r\n (event as DomainEvent<any, any>).listeners.length = 0;\r\n // for (const handle of (event as DomainEvent<any, any>).listeners) {\r\n // handle()\r\n // }\r\n }\r\n scope.stop();\r\n }) as DomainDestroyFunction;\r\n }\r\n return shallowReadonly({\r\n __id: genId(),\r\n type: 'MultiInstance',\r\n id,\r\n api: createMultiInstanceAggApi({\r\n states,\r\n commands,\r\n events: eventsExt as unknown as EVENTS,\r\n destroy,\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n });\r\n}\r\n\r\nexport function createSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n init: (context: {\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n }\r\n): DomainSingletonAgg<STATES, COMMANDS, EVENTS> {\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n\r\n const result = init({\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n });\r\n setTimeout(\r\n () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n }),\r\n 0\r\n );\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const events = (result.events || {}) as EVENTS;\r\n return {\r\n __id: genId(),\r\n type: 'Singleton',\r\n api: createAggApi({\r\n states,\r\n commands,\r\n events,\r\n destroy: () => {},\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n };\r\n}\r\n","import {\r\n type Reactive,\r\n type Ref,\r\n type ShallowRef,\r\n type ShallowReactive,\r\n type WatchCallback,\r\n type WatchOptions,\r\n isReactive,\r\n isRef,\r\n ref,\r\n unref,\r\n watch,\r\n} from 'vue';\r\nimport { deepClone, isEqual } from './common';\r\n\r\ntype DomainAggState = DomainAggRefState | DomainAggReactiveState;\r\ntype DomainAggRefState = Readonly<Ref<any>> | Readonly<ShallowRef<any>>;\r\ntype DomainAggReactiveState = Readonly<Reactive<object>> | Readonly<ShallowReactive<object>>;\r\ntype SingleFieldRef = () => any;\r\ntype DeepMutable<T> = {\r\n -readonly [P in keyof T]: T[P] extends object ? DeepMutable<T[P]> : T[P];\r\n};\r\ntype InferValue<T> = T extends () => infer R\r\n ? R\r\n : T extends Readonly<Ref<any>> | Readonly<ShallowRef<any>> | Ref<any> | ShallowRef<any>\r\n ? DeepMutable<T['value']>\r\n : T extends Readonly<Reactive<infer R>> | Readonly<ShallowReactive<infer R>> | Reactive<infer R>\r\n ? DeepMutable<R>\r\n : never;\r\n\r\nexport function bindRef<STATE extends DomainAggState | SingleFieldRef, T extends InferValue<STATE>>(\r\n aggState: STATE,\r\n onChange: WatchCallback<T>,\r\n watchOptions?: WatchOptions & { forceSync?: boolean }\r\n): Ref<T> {\r\n const result = ref<T>(copyValue<T>(aggState));\r\n if (!watchOptions?.forceSync) {\r\n watch(result, onChange as any, watchOptions);\r\n return result as Ref<T>;\r\n }\r\n\r\n watchOptions.forceSync = undefined;\r\n let latestSyncValue: any;\r\n watch(\r\n aggState,\r\n (v) => {\r\n latestSyncValue = v;\r\n result.value = v;\r\n },\r\n watchOptions\r\n );\r\n watch(\r\n result,\r\n (n, o, onCleanup) => {\r\n if (isEqual(n, latestSyncValue)) {\r\n return;\r\n }\r\n onChange(n as T, o, onCleanup);\r\n },\r\n watchOptions\r\n );\r\n return result as Ref<T>;\r\n}\r\n\r\nfunction copyValue<T>(state: DomainAggState | SingleFieldRef): T {\r\n let t: T;\r\n if (typeof state === 'function') {\r\n t = state();\r\n } else if (isReactive(state) || isRef(state)) {\r\n t = unref(state) as any;\r\n } else {\r\n throw new Error('invalid state');\r\n }\r\n if (typeof t === 'object') {\r\n t = deepClone(t);\r\n }\r\n return t;\r\n}\r\n"],"names":["createRequestEvent","options","currentVersion","unconsumedEvent","listeners","updateEvent","data","resolve","reject","timerId","nextVer","largeNumberIncrease","emitEvent","event","version","context","listener","replyData","e","deferred","Deferred","replyFn","index","createBroadcastEvent","cb","num1","str1","str2","maxLength","carry","result","i","digit1","digit2","sum","genId","prefix","ts","rd","isEqual","a","b","cache","aValues","bValues","aEntries","bEntries","keysA","keysB","key","deepClone","target","hash","cloneSet","value","cloneMap","cloneTarget","createPluginHelper","onDestroyFn","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","customDestroyedHandlers","agg","applyedHotSwapPlugins","p","isMultiInstanceAgg","handler","fn","args","opts","util","plugin","k","createPluginHelperByAggCreator","_","onDestroy","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","readonly","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","ref","onBeforeInitialize","beforeInitializeTasks","scope","effectScope","onScopeDispose","computed","eventsExt","destroyedEvent","destroy","createSingletonAgg","bindRef","aggState","onChange","watchOptions","copyValue","watch","latestSyncValue","v","n","o","onCleanup","state","isReactive","isRef","unref"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { ComputedRef } from 'vue';
2
- import type { DomainSingletonAgg, DomainMultiInstanceAgg } from './agg';
1
+ import type { ComputedRef } from 'vue';
2
+ import type { DomainMultiInstanceAgg, DomainSingletonAgg } from './agg';
3
3
  type DomainPluginType = 'Setup' | 'HotSwap';
4
4
  type DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;
5
5
  export type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;
@@ -1,4 +1,4 @@
1
- import { type DeepReadonly, type EffectScope, type ComputedRef } from '@vue/reactivity';
1
+ import { type ComputedRef, type DeepReadonly, type EffectScope } from '@vue/reactivity';
2
2
  import { type DomainBroadcastEvent, type DomainDestroyedEventApi, type DomainEvent, type DomainRequestEvent } from './event';
3
3
  type AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never ? {
4
4
  destroyed: DomainDestroyedEventApi;
@@ -1,4 +1,4 @@
1
- import { Ref, ShallowRef, Reactive, ShallowReactive, WatchCallback, WatchOptions } from '@vue/reactivity';
1
+ import { type Reactive, type Ref, type ShallowRef, type ShallowReactive, type WatchCallback, type WatchOptions } from '@vue/reactivity';
2
2
  type DomainAggState = DomainAggRefState | DomainAggReactiveState;
3
3
  type DomainAggRefState = Readonly<Ref<any>> | Readonly<ShallowRef<any>>;
4
4
  type DomainAggReactiveState = Readonly<Reactive<object>> | Readonly<ShallowReactive<object>>;
@@ -1,4 +1,4 @@
1
- import { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity';
1
+ import type { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity';
2
2
  export type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {
3
3
  dataType?: DATA;
4
4
  onReply: ON_REPLY;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../libs/domain-server/event.ts","../../libs/domain-server/common.ts","../../libs/domain-server/plugin.ts","../../libs/domain-server/agg.ts","../../libs/domain-server/bind.ts"],"sourcesContent":["import { Deferred } from 'ts-deferred';\r\nimport { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity';\r\n\r\nexport type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {\r\n dataType?: DATA;\r\n onReply: ON_REPLY;\r\n onError?: (e: Error) => void;\r\n maxListenerCount?: number;\r\n isTerminateOnError?: boolean;\r\n timeoutMs?: number | false;\r\n};\r\nexport type DomainRequestEvent<DATA, REPLY_DATA> = {\r\n listeners: DomainRequestEventListener<DATA, REPLY_DATA>[];\r\n publishRequest: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => Promise<REPLY_DATA>;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listenAndReply: (replyFn: DomainRequestEventListener<DATA, REPLY_DATA>) => () => void;\r\n };\r\n};\r\nexport type DomainRequestEventListener<DATA, REPLY_DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => REPLY_DATA;\r\n\r\nexport type DomainBroadcastEvent<DATA> = {\r\n listeners: DomainBroadcastEventListener<DATA>[];\r\n publish: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => void;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listen: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ) => () => void;\r\n };\r\n};\r\nexport type DomainBroadcastEventListener<DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => void;\r\n\r\nexport type DomainDestroyedEventApi = DomainBroadcastEvent<{}>['api'];\r\n\r\nexport type DomainEvent<DATA, REPLY_DATA> =\r\n | DomainRequestEvent<DATA, REPLY_DATA>\r\n | DomainBroadcastEvent<DATA>;\r\n\r\nexport function createRequestEvent<EVT_DATA extends object = never, REPLY_DATA = void>() {\r\n function options<ON_REPLY extends (replyData: REPLY_DATA) => void>(\r\n options: DomainRequestEventOptions<EVT_DATA, ON_REPLY>\r\n ): DomainRequestEvent<EVT_DATA, REPLY_DATA> {\r\n let currentVersion = '0';\r\n let unconsumedEvent: {\r\n version: string;\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>;\r\n resolve: (data: REPLY_DATA) => void;\r\n reject: (e: Error) => void;\r\n timerId: NodeJS.Timeout | undefined;\r\n }[] = [];\r\n const listeners: DomainRequestEventListener<EVT_DATA, REPLY_DATA>[] = [];\r\n function updateEvent(\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>,\r\n resolve: (data: REPLY_DATA) => void,\r\n reject: (e: Error) => void,\r\n timerId: NodeJS.Timeout | undefined\r\n ) {\r\n const nextVer = largeNumberIncrease(currentVersion);\r\n currentVersion = nextVer;\r\n unconsumedEvent.push({\r\n version: nextVer,\r\n data,\r\n resolve,\r\n reject,\r\n timerId,\r\n });\r\n emitEvent();\r\n }\r\n function emitEvent() {\r\n if (unconsumedEvent.length === 0 || listeners.length === 0) {\r\n return;\r\n }\r\n for (const event of unconsumedEvent) {\r\n const { version, data, resolve, reject, timerId } = event;\r\n const context = {\r\n data,\r\n version,\r\n };\r\n for (const listener of listeners) {\r\n try {\r\n const replyData = listener(context);\r\n options.onReply(replyData);\r\n resolve(replyData);\r\n timerId && clearTimeout(timerId);\r\n // return await deferred.promise\r\n } catch (e: unknown) {\r\n if (options.onError && e instanceof Error) {\r\n options.onError(e);\r\n if (options.isTerminateOnError) {\r\n reject(e);\r\n timerId && clearTimeout(timerId);\r\n }\r\n } else {\r\n throw new Error('caught a unknown error' + (e?.toString() || e));\r\n }\r\n }\r\n }\r\n unconsumedEvent.shift();\r\n }\r\n }\r\n return {\r\n listeners,\r\n async publishRequest(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const deferred = new Deferred<REPLY_DATA>();\r\n let timerId: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs) {\r\n timerId = setTimeout(() => {\r\n deferred.reject(new Error(`timeout: ${options.timeoutMs} ms`));\r\n }, options.timeoutMs);\r\n }\r\n updateEvent(data, deferred.resolve, deferred.reject, timerId);\r\n return await deferred.promise;\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listenAndReply(replyFn: DomainRequestEventListener<EVT_DATA, REPLY_DATA>): () => void {\r\n if (options.maxListenerCount && listeners.length >= options.maxListenerCount) {\r\n throw new Error('too many listeners. max limit: ' + options.maxListenerCount);\r\n }\r\n listeners.push(replyFn);\r\n emitEvent();\r\n return () => {\r\n const index = listeners.indexOf(replyFn);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n options,\r\n };\r\n}\r\n\r\nexport function createBroadcastEvent<\r\n EVT_DATA extends object = never\r\n>(): DomainBroadcastEvent<EVT_DATA> {\r\n let currentVersion = '0';\r\n const listeners: DomainBroadcastEventListener<EVT_DATA>[] = [];\r\n return {\r\n listeners,\r\n publish(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const context = {\r\n data,\r\n version: largeNumberIncrease(currentVersion),\r\n };\r\n currentVersion = context.version;\r\n for (const listener of listeners) {\r\n listener(context);\r\n }\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listen(\r\n cb: (options: { data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>; version: string }) => void\r\n ): () => void {\r\n listeners.push(cb);\r\n return () => {\r\n const index = listeners.indexOf(cb);\r\n if (index >= 0) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function largeNumberIncrease(num1: string): string {\r\n if (+num1 < Number.MAX_SAFE_INTEGER) {\r\n return (parseInt(num1) + 1).toString();\r\n }\r\n\r\n // 反转字符串以便从最低位开始相加\r\n let str1 = num1.split('').reverse().join('');\r\n let str2 = '1';\r\n\r\n const maxLength = Math.max(str1.length, str2.length);\r\n let carry = 0;\r\n let result = [];\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n const digit1 = i < str1.length ? parseInt(str1[i], 10) : 0;\r\n const digit2 = i < str2.length ? parseInt(str2[i], 10) : 0;\r\n\r\n const sum = digit1 + digit2 + carry;\r\n result.push(sum % 10); // 当前位的结果\r\n carry = Math.floor(sum / 10); // 计算进位\r\n }\r\n\r\n if (carry > 0) {\r\n result.push(carry);\r\n }\r\n\r\n // 反转结果并转换为字符串\r\n return result.reverse().join('');\r\n}\r\n","// import { nanoid } from 'nanoid';\r\n\r\nexport function genId(prefix = ''): string {\r\n // return nanoid();\r\n const ts = Date.now().toString(36);\r\n const rd = Math.random().toString(36).substring(2, 10);\r\n return `${prefix}${ts}${rd}`;\r\n}\r\n\r\nexport function isEqual(a: any, b: any, cache = new WeakMap<object, object>()): boolean {\r\n // 1. 严格相等或都是 NaN\r\n // NaN === NaN 是 false,但我们通常认为两个 NaN 是相等的\r\n if (a === b) return true;\r\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\r\n\r\n // 2. 如果 a 或 b 不是对象(或为 null),则它们不相等(因为上一步 a === b 已判断过)\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return false;\r\n }\r\n\r\n // 3. 检查缓存,避免循环引用\r\n // 如果 a 已经在缓存中,检查 b 是否是 a 对应的缓存值\r\n if (cache.has(a) && cache.get(a) === b) {\r\n return true;\r\n }\r\n // 将 a 和 b 存入缓存\r\n cache.set(a, b);\r\n // 同样地,反向缓存\r\n cache.set(b, a);\r\n\r\n // 4. 特殊对象类型比较\r\n // Date 对象比较时间戳\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n // RegExp 对象比较字符串表示\r\n if (a instanceof RegExp && b instanceof RegExp) {\r\n return a.toString() === b.toString();\r\n }\r\n\r\n // 5. 数组比较\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i], cache)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n // 6. Set 比较\r\n if (a instanceof Set && b instanceof Set) {\r\n if (a.size !== b.size) return false;\r\n // 将 Set 转换为数组进行比较,注意这可能不适用于包含复杂对象的 Set\r\n // 更稳妥的方式是遍历其中一个 Set,检查所有元素是否存在于另一个 Set 中\r\n const aValues = Array.from(a);\r\n const bValues = Array.from(b);\r\n return isEqual(aValues.sort(), bValues.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 7. Map 比较\r\n if (a instanceof Map && b instanceof Map) {\r\n if (a.size !== b.size) return false;\r\n const aEntries = Array.from(a.entries());\r\n const bEntries = Array.from(b.entries());\r\n return isEqual(aEntries.sort(), bEntries.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 8. 检查原型是否相同\r\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {\r\n return false;\r\n }\r\n\r\n // 9. 通用对象属性比较\r\n const keysA = Reflect.ownKeys(a);\r\n const keysB = Reflect.ownKeys(b);\r\n\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n // 检查键名是否完全一致\r\n for (let i = 0; i < keysA.length; i++) {\r\n if (keysA[i] !== keysB[i]) return false;\r\n }\r\n\r\n // 递归比较所有属性值\r\n for (const key of keysA) {\r\n if (!isEqual((a as any)[key], (b as any)[key], cache)) {\r\n return false;\r\n }\r\n }\r\n\r\n // 如果所有检查都通过,则认为对象相等\r\n return true;\r\n}\r\n\r\nexport function deepClone<T>(target: T, hash = new WeakMap<object, any>()): T {\r\n // 基本类型、null 和函数直接返回\r\n if (target === null || typeof target !== 'object') {\r\n return target;\r\n }\r\n\r\n // 处理 Date 对象\r\n if (target instanceof Date) {\r\n return new Date(target.getTime()) as any;\r\n }\r\n\r\n // 处理 RegExp 对象\r\n if (target instanceof RegExp) {\r\n return new RegExp(target) as any;\r\n }\r\n\r\n // 检查缓存,防止循环引用\r\n if (hash.has(target)) {\r\n return hash.get(target);\r\n }\r\n\r\n // 处理 Set\r\n if (target instanceof Set) {\r\n const cloneSet = new Set<any>();\r\n hash.set(target, cloneSet); // 缓存 Set\r\n target.forEach((value) => {\r\n cloneSet.add(deepClone(value, hash));\r\n });\r\n return cloneSet as any;\r\n }\r\n\r\n // 处理 Map\r\n if (target instanceof Map) {\r\n const cloneMap = new Map<any, any>();\r\n hash.set(target, cloneMap); // 缓存 Map\r\n target.forEach((value, key) => {\r\n cloneMap.set(deepClone(key, hash), deepClone(value, hash));\r\n });\r\n return cloneMap as any;\r\n }\r\n\r\n // 创建一个新的容器(对象或数组)\r\n // 使用 Object.getPrototypeOf 获取原型,以支持更广泛的对象类型\r\n const cloneTarget: T = Array.isArray(target)\r\n ? ([] as T)\r\n : (Object.create(Object.getPrototypeOf(target)) as T);\r\n\r\n // 将新创建的克隆对象放入缓存\r\n hash.set(target, cloneTarget);\r\n\r\n // 递归拷贝对象的属性(包括 Symbol 属性)\r\n // 使用 Reflect.ownKeys 可以获取所有类型的键名\r\n for (const key of Reflect.ownKeys(target)) {\r\n // 使用类型断言来处理索引签名\r\n (cloneTarget as any)[key] = deepClone((target as any)[key], hash);\r\n }\r\n\r\n return cloneTarget;\r\n}\r\n","import { ComputedRef } from '@vue/reactivity';\r\nimport type { DomainSingletonAgg, DomainMultiInstanceAgg } from './agg';\r\nimport { genId } from './common';\r\n\r\ntype DomainPluginType = 'Setup' | 'HotSwap';\r\n\r\ntype DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;\r\n\r\nexport type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;\r\n\r\nexport type DomainSetupPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'Setup'>;\r\n readonly mount: (util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) => void;\r\n};\r\n\r\ntype DomainSetupPluginOptions<AGG extends DomainAgg> = ReturnType<DomainSetupPluginOptionsFn<AGG>>;\r\n\r\ntype DomainSetupPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'HotSwap'>;\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n readonly unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPluginOptions<AGG extends DomainAgg> = ReturnType<\r\n DomainHotSwapPluginOptionsFn<AGG>\r\n>;\r\n\r\nexport type DomainHotSwapPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\ntype SingletonPluginHelperApi<AGG extends DomainSingletonAgg<any, any, any>> = Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n}>;\r\n\r\ntype MultiInstancePluginHelperApi<AGG extends DomainMultiInstanceAgg<any, any, any, any>> =\r\n Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n onDestroy: (cb: (agg: AGG) => void) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n }>;\r\n\r\ntype PluginHelperApi<AGG extends DomainAgg> = AGG extends DomainMultiInstanceAgg<any, any, any, any>\r\n ? MultiInstancePluginHelperApi<AGG>\r\n : AGG extends DomainSingletonAgg<any, any, any>\r\n ? SingletonPluginHelperApi<AGG>\r\n : never;\r\n\r\nfunction createPluginHelper<AGG extends DomainAgg>(\r\n onDestroyFn?: (agg: AGG) => void\r\n): PluginHelperApi<AGG> {\r\n const setupPlugins: Record<string, DomainSetupPlugin<AGG>> = {};\r\n const hotSwapPlugins: Record<string, DomainHotSwapPlugin<AGG>> = {};\r\n const hotSwapPluginsCheck = new WeakMap<AGG, string[]>();\r\n const aggRecords: Record<string, AGG> = {};\r\n const customDestroyedHandlers: ((agg: AGG) => void)[] = [];\r\n\r\n return Object.freeze({\r\n registerAgg(agg: AGG) {\r\n if (agg.isInitialized.value) {\r\n throw new Error('Agg must register before initialized');\r\n } else if (aggRecords[agg.__id]) {\r\n throw new Error('Agg already registered');\r\n } else if (agg.type === 'MultiInstance') {\r\n agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n });\r\n }\r\n aggRecords[agg.__id] = agg;\r\n const applyedHotSwapPlugins: string[] = [];\r\n for (const p of Object.values(setupPlugins)) {\r\n p.mount({\r\n api: agg.api,\r\n __aggId: agg.__id,\r\n isInitialized: agg.isInitialized,\r\n });\r\n }\r\n for (const p of Object.values(hotSwapPlugins)) {\r\n p.mount({ api: agg.api, __aggId: agg.__id });\r\n applyedHotSwapPlugins.push(p.__id);\r\n }\r\n hotSwapPluginsCheck.set(agg, applyedHotSwapPlugins);\r\n\r\n if (isMultiInstanceAgg(agg)) {\r\n const handler = agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n onDestroyFn?.(agg);\r\n for (const fn of customDestroyedHandlers) {\r\n fn(agg);\r\n }\r\n handler?.();\r\n });\r\n }\r\n },\r\n onDestroy(cb: (agg: AGG) => void) {\r\n customDestroyedHandlers.push(cb);\r\n },\r\n createSetupPlugin(\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ): DomainSetupPlugin<AGG> {\r\n let opts: undefined | DomainSetupPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'Setup',\r\n mount(util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) {\r\n if (util.isInitialized.value) {\r\n throw new Error('Can not setup after initialized');\r\n }\r\n opts!.mount({ api: util.api, __aggId: util.__aggId });\r\n },\r\n });\r\n },\r\n createHotSwapPlugin(\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ): DomainHotSwapPlugin<AGG> {\r\n let opts: undefined | DomainHotSwapPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'HotSwap',\r\n mount: opts!.mount,\r\n unmount: opts!.unmount,\r\n });\r\n },\r\n registerPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n if (setupPlugins[plugin.__id]) {\r\n throw new Error('Plugin already registered');\r\n }\r\n setupPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n isInitialized: aggRecords[k].isInitialized,\r\n });\r\n }\r\n } else if (plugin.type === 'HotSwap') {\r\n hotSwapPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n !hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n hotSwapPluginsCheck.get(aggRecords[k])!.push(plugin.__id);\r\n }\r\n }\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n unregisterPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n throw new Error('Can not unregister setup plugin');\r\n } else if (plugin.type === 'HotSwap') {\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.unmount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id];\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n }) as PluginHelperApi<AGG>;\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainSingletonAgg<any, any, any>\r\n>(_: FUN): SingletonPluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainMultiInstanceAgg<any, any, any, any>\r\n>(_: FUN, onDestroy: (agg: ReturnType<FUN>) => void): MultiInstancePluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(\r\n _: FUN,\r\n onDestroy?: (agg: ReturnType<FUN>) => void\r\n) {\r\n return createPluginHelper<ReturnType<FUN>>(onDestroy);\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainSingletonAgg<any, any, any>>(_: AGG) {\r\n return createPluginHelper<AGG>();\r\n}\r\n\r\nfunction isMultiInstanceAgg(agg: DomainAgg): agg is DomainMultiInstanceAgg<any, any, any, any> {\r\n return agg.type === 'MultiInstance';\r\n}\r\n","import {\r\n type DeepReadonly,\r\n readonly,\r\n shallowReadonly,\r\n type EffectScope,\r\n effectScope,\r\n onScopeDispose,\r\n type ComputedRef,\r\n computed,\r\n ref,\r\n} from '@vue/reactivity';\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n type DomainEvent,\r\n type DomainRequestEvent,\r\n createBroadcastEvent,\r\n} from './event';\r\nimport { genId } from './common';\r\nimport { Deferred } from 'ts-deferred';\r\n\r\ntype AddDestroyedEvent<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainBroadcastEvent<{}> }\r\n : {\r\n [P in keyof T as P extends K ? 'destroyed' : P]: P extends K\r\n ? DomainBroadcastEvent<{}>\r\n : T[P];\r\n } & { destroyed: DomainBroadcastEvent<{}> };\r\ntype AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainDestroyedEventApi }\r\n : {\r\n [P in keyof T as P]: P extends K ? DomainBroadcastEvent<{}> : T[P];\r\n } & { destroyed: DomainDestroyedEventApi };\r\n\r\ntype InferDomainEvent<EVENT extends DomainEvent<any, any>> = EVENT extends DomainBroadcastEvent<\r\n infer DATA\r\n>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer REPLY_DATA>\r\n ? DomainRequestEvent<DATA, REPLY_DATA>\r\n : never;\r\ntype InferDomainEventApi<EVENT extends DomainEvent<any, any>> = InferDomainEvent<EVENT>['api'];\r\n\r\ntype CustomerStateRecords<T> = keyof T extends never ? {} : Record<string, object>;\r\ntype CustomerCommandRecords<T> = keyof T extends never ? {} : Record<string, Function>;\r\ntype CustomerEventRecords<T> = keyof T extends never\r\n ? {}\r\n : {\r\n [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n ? T[K]\r\n : never;\r\n };\r\nexport type DomainDestroyFunction = (...args: any[]) => void;\r\n\r\nexport type DomainStatesApi<STATES extends CustomerStateRecords<any>> = Readonly<{\r\n [K in keyof STATES]: DeepReadonly<STATES[K]>;\r\n}>;\r\n\r\nexport type DomainCommandsApi<COMMANDS extends CustomerCommandRecords<any>> = Readonly<{\r\n [K in keyof COMMANDS]: COMMANDS[K] extends Function ? COMMANDS[K] : never;\r\n}>;\r\n\r\nexport type DomainEventsApi<EVENTS extends CustomerEventRecords<any>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\r\n ? Readonly<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n : EVENTS;\r\n\r\nexport type DomainMultiInstanceEventsApi<EVENTS extends CustomerEventRecords<EVENTS>> =\r\n EVENTS extends Record<string, DomainRequestEvent<any, any> | DomainBroadcastEvent<any>>\r\n ? Readonly<\r\n AddDestroyedEventApi<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n >\r\n : { destroyed: DomainDestroyedEventApi };\r\n\r\nexport type DomainMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainMultiInstanceEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n}>;\r\n\r\nexport type DomainSingletonAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n}>;\r\n\r\nexport function createMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS> {\r\n return createAggApiContent(option) as unknown as DomainMultiInstanceAggApi<\r\n STATES,\r\n COMMANDS,\r\n EVENTS\r\n >;\r\n}\r\n\r\nexport function createAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainSingletonAggApi<STATES, COMMANDS, EVENTS> {\r\n const apiContent = createAggApiContent(option);\r\n return shallowReadonly({\r\n states: apiContent.states,\r\n commands: apiContent.commands,\r\n events: apiContent.events,\r\n });\r\n}\r\n\r\nfunction createAggApiContent<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): {\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n} {\r\n const optionStates = option.states as Record<string, object>;\r\n for (const k of Object.keys(option.states)) {\r\n optionStates[k] = readonly(optionStates[k]);\r\n }\r\n const states = shallowReadonly(option.states) as DomainStatesApi<STATES>;\r\n const commands = readonly(option.commands) as DomainCommandsApi<COMMANDS>;\r\n const events = {} as DomainEventsApi<EVENTS>;\r\n const optionEvents = option.events as {\r\n [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any>;\r\n };\r\n for (const k in option.events) {\r\n (events as any)[k] = optionEvents[k].api;\r\n }\r\n return shallowReadonly({\r\n states,\r\n commands,\r\n events: shallowReadonly(events) as DomainEventsApi<EVENTS>,\r\n destroy: option.destroy,\r\n });\r\n}\r\n\r\nexport type DomainMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'MultiInstance';\r\n readonly id: ID;\r\n readonly api: DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport type DomainSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'Singleton';\r\n readonly api: DomainSingletonAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport function createMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n id: ID,\r\n init: (context: {\r\n getCurrentScope: () => EffectScope;\r\n onScopeDispose: (fn: () => void, failSilently?: boolean) => void;\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n destroy?: DomainDestroyFunction;\r\n }\r\n): DomainMultiInstanceAgg<ID, STATES, COMMANDS, EVENTS> {\r\n // 声明 生命周期 - init\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n setTimeout(() =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n throw e;\r\n })\r\n );\r\n const scope = effectScope();\r\n const result = scope.run(() =>\r\n init({\r\n getCurrentScope() {\r\n return scope;\r\n },\r\n onScopeDispose,\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n })\r\n )!;\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const eventsExt = (result.events || {}) as AddDestroyedEvent<EVENTS>;\r\n let destroyedEvent: DomainBroadcastEvent<{}> | undefined;\r\n if (!eventsExt.destroyed) {\r\n destroyedEvent = createBroadcastEvent<{}>();\r\n eventsExt.destroyed = destroyedEvent;\r\n } else {\r\n destroyedEvent = eventsExt.destroyed;\r\n }\r\n\r\n let destroy = result.destroy as DomainDestroyFunction;\r\n if (!destroy) {\r\n destroy = (() => {\r\n destroyedEvent?.publish({});\r\n for (const k in eventsExt) {\r\n const event = eventsExt[k];\r\n (event as DomainEvent<any, any>).listeners.length = 0;\r\n // for (const handle of (event as DomainEvent<any, any>).listeners) {\r\n // handle()\r\n // }\r\n }\r\n scope.stop();\r\n }) as DomainDestroyFunction;\r\n }\r\n return shallowReadonly({\r\n __id: genId(),\r\n type: 'MultiInstance',\r\n id,\r\n api: createMultiInstanceAggApi({\r\n states,\r\n commands,\r\n events: eventsExt as unknown as EVENTS,\r\n destroy,\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n });\r\n}\r\n\r\nexport function createSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n init: (context: {\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n }\r\n): DomainSingletonAgg<STATES, COMMANDS, EVENTS> {\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n\r\n const result = init({\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n });\r\n setTimeout(\r\n () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n }),\r\n 0\r\n );\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const events = (result.events || {}) as EVENTS;\r\n return {\r\n __id: genId(),\r\n type: 'Singleton',\r\n api: createAggApi({\r\n states,\r\n commands,\r\n events,\r\n destroy: () => {},\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n };\r\n}\r\n","import {\r\n watch,\r\n ref,\r\n Ref,\r\n ShallowRef,\r\n Reactive,\r\n ShallowReactive,\r\n isReactive,\r\n WatchCallback,\r\n isRef,\r\n WatchOptions,\r\n unref,\r\n} from '@vue/reactivity';\r\nimport { deepClone, isEqual } from './common';\r\n\r\ntype DomainAggState = DomainAggRefState | DomainAggReactiveState;\r\ntype DomainAggRefState = Readonly<Ref<any>> | Readonly<ShallowRef<any>>;\r\ntype DomainAggReactiveState = Readonly<Reactive<object>> | Readonly<ShallowReactive<object>>;\r\ntype SingleFieldRef = () => any;\r\ntype DeepMutable<T> = {\r\n -readonly [P in keyof T]: T[P] extends object ? DeepMutable<T[P]> : T[P];\r\n};\r\ntype InferValue<T> = T extends () => infer R\r\n ? R\r\n : T extends Readonly<Ref<any>> | Readonly<ShallowRef<any>> | Ref<any> | ShallowRef<any>\r\n ? DeepMutable<T['value']>\r\n : T extends Readonly<Reactive<infer R>> | Readonly<ShallowReactive<infer R>> | Reactive<infer R>\r\n ? DeepMutable<R>\r\n : never;\r\n\r\nexport function bindRef<STATE extends DomainAggState | SingleFieldRef, T extends InferValue<STATE>>(\r\n aggState: STATE,\r\n onChange: WatchCallback<T>,\r\n watchOptions?: WatchOptions & { forceSync?: boolean }\r\n): Ref<T> {\r\n const result = ref<T>(copyValue<T>(aggState));\r\n if (!watchOptions?.forceSync) {\r\n watch(result, onChange as any, watchOptions);\r\n return result as Ref<T>;\r\n }\r\n\r\n watchOptions.forceSync = undefined;\r\n let latestSyncValue: any;\r\n watch(\r\n aggState,\r\n (v) => {\r\n latestSyncValue = v;\r\n result.value = v;\r\n },\r\n watchOptions\r\n );\r\n watch(\r\n result,\r\n (n, o, onCleanup) => {\r\n if (isEqual(n, latestSyncValue)) {\r\n return;\r\n }\r\n onChange(n as T, o, onCleanup);\r\n },\r\n watchOptions\r\n );\r\n return result as Ref<T>;\r\n}\r\n\r\nfunction copyValue<T>(state: DomainAggState | SingleFieldRef): T {\r\n let t: T;\r\n if (typeof state === 'function') {\r\n t = state();\r\n } else if (isReactive(state) || isRef(state)) {\r\n t = unref(state) as any;\r\n } else {\r\n throw new Error('invalid state');\r\n }\r\n if (typeof t === 'object') {\r\n t = deepClone(t);\r\n }\r\n return t;\r\n}\r\n"],"names":["createRequestEvent","options","currentVersion","unconsumedEvent","listeners","updateEvent","data","resolve","reject","timerId","nextVer","largeNumberIncrease","emitEvent","event","version","context","listener","replyData","e","deferred","Deferred","replyFn","index","createBroadcastEvent","cb","num1","str1","str2","maxLength","carry","result","i","digit1","digit2","sum","genId","prefix","ts","rd","isEqual","a","b","cache","aValues","bValues","aEntries","bEntries","keysA","keysB","key","deepClone","target","hash","cloneSet","value","cloneMap","cloneTarget","createPluginHelper","onDestroyFn","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","customDestroyedHandlers","agg","applyedHotSwapPlugins","p","isMultiInstanceAgg","handler","fn","args","opts","util","plugin","k","createPluginHelperByAggCreator","_","onDestroy","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","readonly","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","ref","onBeforeInitialize","beforeInitializeTasks","scope","effectScope","onScopeDispose","computed","eventsExt","destroyedEvent","destroy","createSingletonAgg","bindRef","aggState","onChange","watchOptions","copyValue","watch","latestSyncValue","v","n","o","onCleanup","state","isReactive","isRef","unref"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../libs/domain-server/event.ts","../../libs/domain-server/common.ts","../../libs/domain-server/plugin.ts","../../libs/domain-server/agg.ts","../../libs/domain-server/bind.ts"],"sourcesContent":["import { Deferred } from 'ts-deferred';\r\nimport type { DeepReadonly, UnwrapNestedRefs } from '@vue/reactivity';\r\n\r\nexport type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {\r\n dataType?: DATA;\r\n onReply: ON_REPLY;\r\n onError?: (e: Error) => void;\r\n maxListenerCount?: number;\r\n isTerminateOnError?: boolean;\r\n timeoutMs?: number | false;\r\n};\r\nexport type DomainRequestEvent<DATA, REPLY_DATA> = {\r\n listeners: DomainRequestEventListener<DATA, REPLY_DATA>[];\r\n publishRequest: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => Promise<REPLY_DATA>;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listenAndReply: (replyFn: DomainRequestEventListener<DATA, REPLY_DATA>) => () => void;\r\n };\r\n};\r\nexport type DomainRequestEventListener<DATA, REPLY_DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => REPLY_DATA;\r\n\r\nexport type DomainBroadcastEvent<DATA> = {\r\n listeners: DomainBroadcastEventListener<DATA>[];\r\n publish: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => void;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listen: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ) => () => void;\r\n };\r\n};\r\nexport type DomainBroadcastEventListener<DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => void;\r\n\r\nexport type DomainDestroyedEventApi = DomainBroadcastEvent<{}>['api'];\r\n\r\nexport type DomainEvent<DATA, REPLY_DATA> =\r\n | DomainRequestEvent<DATA, REPLY_DATA>\r\n | DomainBroadcastEvent<DATA>;\r\n\r\nexport function createRequestEvent<EVT_DATA extends object = never, REPLY_DATA = void>() {\r\n function options<ON_REPLY extends (replyData: REPLY_DATA) => void>(\r\n options: DomainRequestEventOptions<EVT_DATA, ON_REPLY>\r\n ): DomainRequestEvent<EVT_DATA, REPLY_DATA> {\r\n let currentVersion = '0';\r\n let unconsumedEvent: {\r\n version: string;\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>;\r\n resolve: (data: REPLY_DATA) => void;\r\n reject: (e: Error) => void;\r\n timerId: NodeJS.Timeout | undefined;\r\n }[] = [];\r\n const listeners: DomainRequestEventListener<EVT_DATA, REPLY_DATA>[] = [];\r\n function updateEvent(\r\n data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>,\r\n resolve: (data: REPLY_DATA) => void,\r\n reject: (e: Error) => void,\r\n timerId: NodeJS.Timeout | undefined\r\n ) {\r\n const nextVer = largeNumberIncrease(currentVersion);\r\n currentVersion = nextVer;\r\n unconsumedEvent.push({\r\n version: nextVer,\r\n data,\r\n resolve,\r\n reject,\r\n timerId,\r\n });\r\n emitEvent();\r\n }\r\n function emitEvent() {\r\n if (unconsumedEvent.length === 0 || listeners.length === 0) {\r\n return;\r\n }\r\n for (const event of unconsumedEvent) {\r\n const { version, data, resolve, reject, timerId } = event;\r\n const context = {\r\n data,\r\n version,\r\n };\r\n for (const listener of listeners) {\r\n try {\r\n const replyData = listener(context);\r\n options.onReply(replyData);\r\n resolve(replyData);\r\n timerId && clearTimeout(timerId);\r\n // return await deferred.promise\r\n } catch (e: unknown) {\r\n if (options.onError && e instanceof Error) {\r\n options.onError(e);\r\n if (options.isTerminateOnError) {\r\n reject(e);\r\n timerId && clearTimeout(timerId);\r\n }\r\n } else {\r\n throw new Error('caught a unknown error' + (e?.toString() || e));\r\n }\r\n }\r\n }\r\n unconsumedEvent.shift();\r\n }\r\n }\r\n return {\r\n listeners,\r\n async publishRequest(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const deferred = new Deferred<REPLY_DATA>();\r\n let timerId: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs) {\r\n timerId = setTimeout(() => {\r\n deferred.reject(new Error(`timeout: ${options.timeoutMs} ms`));\r\n }, options.timeoutMs);\r\n }\r\n updateEvent(data, deferred.resolve, deferred.reject, timerId);\r\n return await deferred.promise;\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listenAndReply(replyFn: DomainRequestEventListener<EVT_DATA, REPLY_DATA>): () => void {\r\n if (options.maxListenerCount && listeners.length >= options.maxListenerCount) {\r\n throw new Error('too many listeners. max limit: ' + options.maxListenerCount);\r\n }\r\n listeners.push(replyFn);\r\n emitEvent();\r\n return () => {\r\n const index = listeners.indexOf(replyFn);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n options,\r\n };\r\n}\r\n\r\nexport function createBroadcastEvent<\r\n EVT_DATA extends object = never\r\n>(): DomainBroadcastEvent<EVT_DATA> {\r\n let currentVersion = '0';\r\n const listeners: DomainBroadcastEventListener<EVT_DATA>[] = [];\r\n return {\r\n listeners,\r\n publish(data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>) {\r\n const context = {\r\n data,\r\n version: largeNumberIncrease(currentVersion),\r\n };\r\n currentVersion = context.version;\r\n for (const listener of listeners) {\r\n listener(context);\r\n }\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listen(\r\n cb: (options: { data: DeepReadonly<UnwrapNestedRefs<EVT_DATA>>; version: string }) => void\r\n ): () => void {\r\n listeners.push(cb);\r\n return () => {\r\n const index = listeners.indexOf(cb);\r\n if (index >= 0) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function largeNumberIncrease(num1: string): string {\r\n if (+num1 < Number.MAX_SAFE_INTEGER) {\r\n return (parseInt(num1) + 1).toString();\r\n }\r\n\r\n // 反转字符串以便从最低位开始相加\r\n let str1 = num1.split('').reverse().join('');\r\n let str2 = '1';\r\n\r\n const maxLength = Math.max(str1.length, str2.length);\r\n let carry = 0;\r\n let result = [];\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n const digit1 = i < str1.length ? parseInt(str1[i], 10) : 0;\r\n const digit2 = i < str2.length ? parseInt(str2[i], 10) : 0;\r\n\r\n const sum = digit1 + digit2 + carry;\r\n result.push(sum % 10); // 当前位的结果\r\n carry = Math.floor(sum / 10); // 计算进位\r\n }\r\n\r\n if (carry > 0) {\r\n result.push(carry);\r\n }\r\n\r\n // 反转结果并转换为字符串\r\n return result.reverse().join('');\r\n}\r\n","// import { nanoid } from 'nanoid';\r\n\r\nexport function genId(prefix = ''): string {\r\n // return nanoid();\r\n const ts = Date.now().toString(36);\r\n const rd = Math.random().toString(36).substring(2, 10);\r\n return `${prefix}${ts}${rd}`;\r\n}\r\n\r\nexport function isEqual(a: any, b: any, cache = new WeakMap<object, object>()): boolean {\r\n // 1. 严格相等或都是 NaN\r\n // NaN === NaN 是 false,但我们通常认为两个 NaN 是相等的\r\n if (a === b) return true;\r\n if (Number.isNaN(a) && Number.isNaN(b)) return true;\r\n\r\n // 2. 如果 a 或 b 不是对象(或为 null),则它们不相等(因为上一步 a === b 已判断过)\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return false;\r\n }\r\n\r\n // 3. 检查缓存,避免循环引用\r\n // 如果 a 已经在缓存中,检查 b 是否是 a 对应的缓存值\r\n if (cache.has(a) && cache.get(a) === b) {\r\n return true;\r\n }\r\n // 将 a 和 b 存入缓存\r\n cache.set(a, b);\r\n // 同样地,反向缓存\r\n cache.set(b, a);\r\n\r\n // 4. 特殊对象类型比较\r\n // Date 对象比较时间戳\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n // RegExp 对象比较字符串表示\r\n if (a instanceof RegExp && b instanceof RegExp) {\r\n return a.toString() === b.toString();\r\n }\r\n\r\n // 5. 数组比较\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i], cache)) return false;\r\n }\r\n return true;\r\n }\r\n\r\n // 6. Set 比较\r\n if (a instanceof Set && b instanceof Set) {\r\n if (a.size !== b.size) return false;\r\n // 将 Set 转换为数组进行比较,注意这可能不适用于包含复杂对象的 Set\r\n // 更稳妥的方式是遍历其中一个 Set,检查所有元素是否存在于另一个 Set 中\r\n const aValues = Array.from(a);\r\n const bValues = Array.from(b);\r\n return isEqual(aValues.sort(), bValues.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 7. Map 比较\r\n if (a instanceof Map && b instanceof Map) {\r\n if (a.size !== b.size) return false;\r\n const aEntries = Array.from(a.entries());\r\n const bEntries = Array.from(b.entries());\r\n return isEqual(aEntries.sort(), bEntries.sort(), cache); // 排序后比较\r\n }\r\n\r\n // 8. 检查原型是否相同\r\n if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) {\r\n return false;\r\n }\r\n\r\n // 9. 通用对象属性比较\r\n const keysA = Reflect.ownKeys(a);\r\n const keysB = Reflect.ownKeys(b);\r\n\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n // 检查键名是否完全一致\r\n for (let i = 0; i < keysA.length; i++) {\r\n if (keysA[i] !== keysB[i]) return false;\r\n }\r\n\r\n // 递归比较所有属性值\r\n for (const key of keysA) {\r\n if (!isEqual((a as any)[key], (b as any)[key], cache)) {\r\n return false;\r\n }\r\n }\r\n\r\n // 如果所有检查都通过,则认为对象相等\r\n return true;\r\n}\r\n\r\nexport function deepClone<T>(target: T, hash = new WeakMap<object, any>()): T {\r\n // 基本类型、null 和函数直接返回\r\n if (target === null || typeof target !== 'object') {\r\n return target;\r\n }\r\n\r\n // 处理 Date 对象\r\n if (target instanceof Date) {\r\n return new Date(target.getTime()) as any;\r\n }\r\n\r\n // 处理 RegExp 对象\r\n if (target instanceof RegExp) {\r\n return new RegExp(target) as any;\r\n }\r\n\r\n // 检查缓存,防止循环引用\r\n if (hash.has(target)) {\r\n return hash.get(target);\r\n }\r\n\r\n // 处理 Set\r\n if (target instanceof Set) {\r\n const cloneSet = new Set<any>();\r\n hash.set(target, cloneSet); // 缓存 Set\r\n target.forEach((value) => {\r\n cloneSet.add(deepClone(value, hash));\r\n });\r\n return cloneSet as any;\r\n }\r\n\r\n // 处理 Map\r\n if (target instanceof Map) {\r\n const cloneMap = new Map<any, any>();\r\n hash.set(target, cloneMap); // 缓存 Map\r\n target.forEach((value, key) => {\r\n cloneMap.set(deepClone(key, hash), deepClone(value, hash));\r\n });\r\n return cloneMap as any;\r\n }\r\n\r\n // 创建一个新的容器(对象或数组)\r\n // 使用 Object.getPrototypeOf 获取原型,以支持更广泛的对象类型\r\n const cloneTarget: T = Array.isArray(target)\r\n ? ([] as T)\r\n : (Object.create(Object.getPrototypeOf(target)) as T);\r\n\r\n // 将新创建的克隆对象放入缓存\r\n hash.set(target, cloneTarget);\r\n\r\n // 递归拷贝对象的属性(包括 Symbol 属性)\r\n // 使用 Reflect.ownKeys 可以获取所有类型的键名\r\n for (const key of Reflect.ownKeys(target)) {\r\n // 使用类型断言来处理索引签名\r\n (cloneTarget as any)[key] = deepClone((target as any)[key], hash);\r\n }\r\n\r\n return cloneTarget;\r\n}\r\n","import type { ComputedRef } from '@vue/reactivity';\r\nimport type { DomainMultiInstanceAgg, DomainSingletonAgg } from './agg';\r\nimport { genId } from './common';\r\n\r\ntype DomainPluginType = 'Setup' | 'HotSwap';\r\n\r\ntype DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;\r\n\r\nexport type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;\r\n\r\nexport type DomainSetupPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'Setup'>;\r\n readonly mount: (util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) => void;\r\n};\r\n\r\ntype DomainSetupPluginOptions<AGG extends DomainAgg> = ReturnType<DomainSetupPluginOptionsFn<AGG>>;\r\n\r\ntype DomainSetupPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'HotSwap'>;\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n readonly unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPluginOptions<AGG extends DomainAgg> = ReturnType<\r\n DomainHotSwapPluginOptionsFn<AGG>\r\n>;\r\n\r\nexport type DomainHotSwapPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\ntype SingletonPluginHelperApi<AGG extends DomainSingletonAgg<any, any, any>> = Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n}>;\r\n\r\ntype MultiInstancePluginHelperApi<AGG extends DomainMultiInstanceAgg<any, any, any, any>> =\r\n Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n onDestroy: (cb: (agg: AGG) => void) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n }>;\r\n\r\ntype PluginHelperApi<AGG extends DomainAgg> = AGG extends DomainMultiInstanceAgg<any, any, any, any>\r\n ? MultiInstancePluginHelperApi<AGG>\r\n : AGG extends DomainSingletonAgg<any, any, any>\r\n ? SingletonPluginHelperApi<AGG>\r\n : never;\r\n\r\nfunction createPluginHelper<AGG extends DomainAgg>(\r\n onDestroyFn?: (agg: AGG) => void\r\n): PluginHelperApi<AGG> {\r\n const setupPlugins: Record<string, DomainSetupPlugin<AGG>> = {};\r\n const hotSwapPlugins: Record<string, DomainHotSwapPlugin<AGG>> = {};\r\n const hotSwapPluginsCheck = new WeakMap<AGG, string[]>();\r\n const aggRecords: Record<string, AGG> = {};\r\n const customDestroyedHandlers: ((agg: AGG) => void)[] = [];\r\n\r\n return Object.freeze({\r\n registerAgg(agg: AGG) {\r\n if (agg.isInitialized.value) {\r\n throw new Error('Agg must register before initialized');\r\n } else if (aggRecords[agg.__id]) {\r\n throw new Error('Agg already registered');\r\n } else if (agg.type === 'MultiInstance') {\r\n agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n });\r\n }\r\n aggRecords[agg.__id] = agg;\r\n const applyedHotSwapPlugins: string[] = [];\r\n for (const p of Object.values(setupPlugins)) {\r\n p.mount({\r\n api: agg.api,\r\n __aggId: agg.__id,\r\n isInitialized: agg.isInitialized,\r\n });\r\n }\r\n for (const p of Object.values(hotSwapPlugins)) {\r\n p.mount({ api: agg.api, __aggId: agg.__id });\r\n applyedHotSwapPlugins.push(p.__id);\r\n }\r\n hotSwapPluginsCheck.set(agg, applyedHotSwapPlugins);\r\n\r\n if (isMultiInstanceAgg(agg)) {\r\n const handler = agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n onDestroyFn?.(agg);\r\n for (const fn of customDestroyedHandlers) {\r\n fn(agg);\r\n }\r\n handler?.();\r\n });\r\n }\r\n },\r\n onDestroy(cb: (agg: AGG) => void) {\r\n customDestroyedHandlers.push(cb);\r\n },\r\n createSetupPlugin(\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ): DomainSetupPlugin<AGG> {\r\n let opts: undefined | DomainSetupPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'Setup',\r\n mount(util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) {\r\n if (util.isInitialized.value) {\r\n throw new Error('Can not setup after initialized');\r\n }\r\n opts!.mount({ api: util.api, __aggId: util.__aggId });\r\n },\r\n });\r\n },\r\n createHotSwapPlugin(\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ): DomainHotSwapPlugin<AGG> {\r\n let opts: undefined | DomainHotSwapPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'HotSwap',\r\n mount: opts!.mount,\r\n unmount: opts!.unmount,\r\n });\r\n },\r\n registerPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n if (setupPlugins[plugin.__id]) {\r\n throw new Error('Plugin already registered');\r\n }\r\n setupPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n isInitialized: aggRecords[k].isInitialized,\r\n });\r\n }\r\n } else if (plugin.type === 'HotSwap') {\r\n hotSwapPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n !hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n hotSwapPluginsCheck.get(aggRecords[k])!.push(plugin.__id);\r\n }\r\n }\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n unregisterPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n throw new Error('Can not unregister setup plugin');\r\n } else if (plugin.type === 'HotSwap') {\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.unmount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id];\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n }) as PluginHelperApi<AGG>;\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainSingletonAgg<any, any, any>\r\n>(_: FUN): SingletonPluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainMultiInstanceAgg<any, any, any, any>\r\n>(_: FUN, onDestroy: (agg: ReturnType<FUN>) => void): MultiInstancePluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(\r\n _: FUN,\r\n onDestroy?: (agg: ReturnType<FUN>) => void\r\n) {\r\n return createPluginHelper<ReturnType<FUN>>(onDestroy);\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainSingletonAgg<any, any, any>>(_: AGG) {\r\n return createPluginHelper<AGG>();\r\n}\r\n\r\nfunction isMultiInstanceAgg(agg: DomainAgg): agg is DomainMultiInstanceAgg<any, any, any, any> {\r\n return agg.type === 'MultiInstance';\r\n}\r\n","import {\r\n type ComputedRef,\r\n type DeepReadonly,\r\n type EffectScope,\r\n computed,\r\n effectScope,\r\n readonly,\r\n ref,\r\n shallowReadonly,\r\n onScopeDispose,\r\n} from '@vue/reactivity';\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n type DomainEvent,\r\n type DomainRequestEvent,\r\n createBroadcastEvent,\r\n} from './event';\r\nimport { genId } from './common';\r\nimport { Deferred } from 'ts-deferred';\r\n\r\ntype AddDestroyedEvent<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainBroadcastEvent<{}> }\r\n : {\r\n [P in keyof T as P extends K ? 'destroyed' : P]: P extends K\r\n ? DomainBroadcastEvent<{}>\r\n : T[P];\r\n } & { destroyed: DomainBroadcastEvent<{}> };\r\ntype AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainDestroyedEventApi }\r\n : {\r\n [P in keyof T as P]: P extends K ? DomainBroadcastEvent<{}> : T[P];\r\n } & { destroyed: DomainDestroyedEventApi };\r\n\r\ntype InferDomainEvent<EVENT extends DomainEvent<any, any>> = EVENT extends DomainBroadcastEvent<\r\n infer DATA\r\n>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer REPLY_DATA>\r\n ? DomainRequestEvent<DATA, REPLY_DATA>\r\n : never;\r\ntype InferDomainEventApi<EVENT extends DomainEvent<any, any>> = InferDomainEvent<EVENT>['api'];\r\n\r\ntype CustomerStateRecords<T> = keyof T extends never ? {} : Record<string, object>;\r\ntype CustomerCommandRecords<T> = keyof T extends never ? {} : Record<string, Function>;\r\ntype CustomerEventRecords<T> = keyof T extends never\r\n ? {}\r\n : {\r\n [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n ? T[K]\r\n : never;\r\n };\r\nexport type DomainDestroyFunction = (...args: any[]) => void;\r\n\r\nexport type DomainStatesApi<STATES extends CustomerStateRecords<any>> = Readonly<{\r\n [K in keyof STATES]: DeepReadonly<STATES[K]>;\r\n}>;\r\n\r\nexport type DomainCommandsApi<COMMANDS extends CustomerCommandRecords<any>> = Readonly<{\r\n [K in keyof COMMANDS]: COMMANDS[K] extends Function ? COMMANDS[K] : never;\r\n}>;\r\n\r\nexport type DomainEventsApi<EVENTS extends CustomerEventRecords<any>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\r\n ? Readonly<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n : EVENTS;\r\n\r\nexport type DomainMultiInstanceEventsApi<EVENTS extends CustomerEventRecords<EVENTS>> =\r\n EVENTS extends Record<string, DomainRequestEvent<any, any> | DomainBroadcastEvent<any>>\r\n ? Readonly<\r\n AddDestroyedEventApi<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n >\r\n : { destroyed: DomainDestroyedEventApi };\r\n\r\nexport type DomainMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainMultiInstanceEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n}>;\r\n\r\nexport type DomainSingletonAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n}>;\r\n\r\nexport function createMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS> {\r\n return createAggApiContent(option) as unknown as DomainMultiInstanceAggApi<\r\n STATES,\r\n COMMANDS,\r\n EVENTS\r\n >;\r\n}\r\n\r\nexport function createAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainSingletonAggApi<STATES, COMMANDS, EVENTS> {\r\n const apiContent = createAggApiContent(option);\r\n return shallowReadonly({\r\n states: apiContent.states,\r\n commands: apiContent.commands,\r\n events: apiContent.events,\r\n });\r\n}\r\n\r\nfunction createAggApiContent<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): {\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n} {\r\n const optionStates = option.states as Record<string, object>;\r\n for (const k of Object.keys(option.states)) {\r\n optionStates[k] = readonly(optionStates[k]);\r\n }\r\n const states = shallowReadonly(option.states) as DomainStatesApi<STATES>;\r\n const commands = readonly(option.commands) as DomainCommandsApi<COMMANDS>;\r\n const events = {} as DomainEventsApi<EVENTS>;\r\n const optionEvents = option.events as {\r\n [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any>;\r\n };\r\n for (const k in option.events) {\r\n (events as any)[k] = optionEvents[k].api;\r\n }\r\n return shallowReadonly({\r\n states,\r\n commands,\r\n events: shallowReadonly(events) as DomainEventsApi<EVENTS>,\r\n destroy: option.destroy,\r\n });\r\n}\r\n\r\nexport type DomainMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'MultiInstance';\r\n readonly id: ID;\r\n readonly api: DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport type DomainSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'Singleton';\r\n readonly api: DomainSingletonAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport function createMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n id: ID,\r\n init: (context: {\r\n getCurrentScope: () => EffectScope;\r\n onScopeDispose: (fn: () => void, failSilently?: boolean) => void;\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n destroy?: DomainDestroyFunction;\r\n }\r\n): DomainMultiInstanceAgg<ID, STATES, COMMANDS, EVENTS> {\r\n // 声明 生命周期 - init\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n setTimeout(() =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n throw e;\r\n })\r\n );\r\n const scope = effectScope();\r\n const result = scope.run(() =>\r\n init({\r\n getCurrentScope() {\r\n return scope;\r\n },\r\n onScopeDispose,\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n })\r\n )!;\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const eventsExt = (result.events || {}) as AddDestroyedEvent<EVENTS>;\r\n let destroyedEvent: DomainBroadcastEvent<{}> | undefined;\r\n if (!eventsExt.destroyed) {\r\n destroyedEvent = createBroadcastEvent<{}>();\r\n eventsExt.destroyed = destroyedEvent;\r\n } else {\r\n destroyedEvent = eventsExt.destroyed;\r\n }\r\n\r\n let destroy = result.destroy as DomainDestroyFunction;\r\n if (!destroy) {\r\n destroy = (() => {\r\n destroyedEvent?.publish({});\r\n for (const k in eventsExt) {\r\n const event = eventsExt[k];\r\n (event as DomainEvent<any, any>).listeners.length = 0;\r\n // for (const handle of (event as DomainEvent<any, any>).listeners) {\r\n // handle()\r\n // }\r\n }\r\n scope.stop();\r\n }) as DomainDestroyFunction;\r\n }\r\n return shallowReadonly({\r\n __id: genId(),\r\n type: 'MultiInstance',\r\n id,\r\n api: createMultiInstanceAggApi({\r\n states,\r\n commands,\r\n events: eventsExt as unknown as EVENTS,\r\n destroy,\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n });\r\n}\r\n\r\nexport function createSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n init: (context: {\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n }\r\n): DomainSingletonAgg<STATES, COMMANDS, EVENTS> {\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n\r\n const result = init({\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n });\r\n setTimeout(\r\n () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n }),\r\n 0\r\n );\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const events = (result.events || {}) as EVENTS;\r\n return {\r\n __id: genId(),\r\n type: 'Singleton',\r\n api: createAggApi({\r\n states,\r\n commands,\r\n events,\r\n destroy: () => {},\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n };\r\n}\r\n","import {\r\n type Reactive,\r\n type Ref,\r\n type ShallowRef,\r\n type ShallowReactive,\r\n type WatchCallback,\r\n type WatchOptions,\r\n isReactive,\r\n isRef,\r\n ref,\r\n unref,\r\n watch,\r\n} from '@vue/reactivity';\r\nimport { deepClone, isEqual } from './common';\r\n\r\ntype DomainAggState = DomainAggRefState | DomainAggReactiveState;\r\ntype DomainAggRefState = Readonly<Ref<any>> | Readonly<ShallowRef<any>>;\r\ntype DomainAggReactiveState = Readonly<Reactive<object>> | Readonly<ShallowReactive<object>>;\r\ntype SingleFieldRef = () => any;\r\ntype DeepMutable<T> = {\r\n -readonly [P in keyof T]: T[P] extends object ? DeepMutable<T[P]> : T[P];\r\n};\r\ntype InferValue<T> = T extends () => infer R\r\n ? R\r\n : T extends Readonly<Ref<any>> | Readonly<ShallowRef<any>> | Ref<any> | ShallowRef<any>\r\n ? DeepMutable<T['value']>\r\n : T extends Readonly<Reactive<infer R>> | Readonly<ShallowReactive<infer R>> | Reactive<infer R>\r\n ? DeepMutable<R>\r\n : never;\r\n\r\nexport function bindRef<STATE extends DomainAggState | SingleFieldRef, T extends InferValue<STATE>>(\r\n aggState: STATE,\r\n onChange: WatchCallback<T>,\r\n watchOptions?: WatchOptions & { forceSync?: boolean }\r\n): Ref<T> {\r\n const result = ref<T>(copyValue<T>(aggState));\r\n if (!watchOptions?.forceSync) {\r\n watch(result, onChange as any, watchOptions);\r\n return result as Ref<T>;\r\n }\r\n\r\n watchOptions.forceSync = undefined;\r\n let latestSyncValue: any;\r\n watch(\r\n aggState,\r\n (v) => {\r\n latestSyncValue = v;\r\n result.value = v;\r\n },\r\n watchOptions\r\n );\r\n watch(\r\n result,\r\n (n, o, onCleanup) => {\r\n if (isEqual(n, latestSyncValue)) {\r\n return;\r\n }\r\n onChange(n as T, o, onCleanup);\r\n },\r\n watchOptions\r\n );\r\n return result as Ref<T>;\r\n}\r\n\r\nfunction copyValue<T>(state: DomainAggState | SingleFieldRef): T {\r\n let t: T;\r\n if (typeof state === 'function') {\r\n t = state();\r\n } else if (isReactive(state) || isRef(state)) {\r\n t = unref(state) as any;\r\n } else {\r\n throw new Error('invalid state');\r\n }\r\n if (typeof t === 'object') {\r\n t = deepClone(t);\r\n }\r\n return t;\r\n}\r\n"],"names":["createRequestEvent","options","currentVersion","unconsumedEvent","listeners","updateEvent","data","resolve","reject","timerId","nextVer","largeNumberIncrease","emitEvent","event","version","context","listener","replyData","e","deferred","Deferred","replyFn","index","createBroadcastEvent","cb","num1","str1","str2","maxLength","carry","result","i","digit1","digit2","sum","genId","prefix","ts","rd","isEqual","a","b","cache","aValues","bValues","aEntries","bEntries","keysA","keysB","key","deepClone","target","hash","cloneSet","value","cloneMap","cloneTarget","createPluginHelper","onDestroyFn","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","customDestroyedHandlers","agg","applyedHotSwapPlugins","p","isMultiInstanceAgg","handler","fn","args","opts","util","plugin","k","createPluginHelperByAggCreator","_","onDestroy","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","readonly","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","ref","onBeforeInitialize","beforeInitializeTasks","scope","effectScope","onScopeDispose","computed","eventsExt","destroyedEvent","destroy","createSingletonAgg","bindRef","aggState","onChange","watchOptions","copyValue","watch","latestSyncValue","v","n","o","onCleanup","state","isReactive","isRef","unref"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { ComputedRef } from '@vue/reactivity';
2
- import type { DomainSingletonAgg, DomainMultiInstanceAgg } from './agg';
1
+ import type { ComputedRef } from '@vue/reactivity';
2
+ import type { DomainMultiInstanceAgg, DomainSingletonAgg } from './agg';
3
3
  type DomainPluginType = 'Setup' | 'HotSwap';
4
4
  type DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;
5
5
  export type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-fn",
3
- "version": "0.2.0-rc",
3
+ "version": "0.3.0-rc",
4
4
  "description": "一个 vue3 的响应式函数工具包",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1,4 +1,4 @@
1
- import { Ref } from 'vue';
1
+ import { type Ref } from 'vue';
2
2
  type InferSharedRefs<T extends Record<string, any>> = {
3
3
  [K in keyof T]: Ref<T[K]>;
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../libs/shared-domain/index.ts"],"sourcesContent":["import { customRef, Ref, shallowRef, ShallowRef, watch } from 'vue';\r\nimport { genId } from './common';\r\n\r\ntype InferSharedRefs<T extends Record<string, any>> = {\r\n [K in keyof T]: Ref<T[K]>;\r\n};\r\n\r\ntype SharedSyncMessage = {\r\n t: 'U';\r\n k: string;\r\n v: any;\r\n};\r\n\r\ntype RequireMessage = {\r\n t: 'R';\r\n k: string;\r\n};\r\n\r\nexport function createSharedFactory(channel: BroadcastChannel) {\r\n const map: Record<string, { data: ShallowRef<any>; trigger: () => void }> = {};\r\n channel.onmessage = (event) => {\r\n if (event.data.t === 'U') {\r\n const syncMessage = event.data as SharedSyncMessage;\r\n if (!map[syncMessage.k]) {\r\n map[syncMessage.k] = {\r\n data: shallowRef(syncMessage.v),\r\n trigger: () => {},\r\n };\r\n } else if (map[syncMessage.k].data.value !== syncMessage.v) {\r\n map[syncMessage.k].data.value = syncMessage.v;\r\n }\r\n }\r\n if (event.data.t === 'R') {\r\n const requireMessage = event.data as RequireMessage;\r\n if (map[requireMessage.k]) {\r\n channel.postMessage({\r\n t: 'U',\r\n k: requireMessage.k,\r\n v: map[requireMessage.k].data.value,\r\n });\r\n }\r\n }\r\n };\r\n\r\n function sharedRef<T>(name: string, value: T) {\r\n setTimeout(() => channel.postMessage({ t: 'R', k: name }), 0);\r\n const id = genId(name);\r\n map[id] = { data: shallowRef(value), trigger: () => {} };\r\n watch(map[id].data, (n: any, o: any) => {\r\n if (n !== o) {\r\n value = n;\r\n map[id].trigger();\r\n }\r\n });\r\n const r = customRef((track, trigger) => {\r\n return {\r\n get() {\r\n track();\r\n return value;\r\n },\r\n set(newValue: T) {\r\n map[id].trigger = trigger;\r\n if (value === newValue) {\r\n return;\r\n }\r\n map[id].data.value = newValue;\r\n value = newValue;\r\n channel.postMessage({ t: 'U', k: id, v: newValue });\r\n trigger();\r\n },\r\n };\r\n });\r\n r.value = value;\r\n return r;\r\n }\r\n\r\n return {\r\n // sharedRef,\r\n sharedRefs: <T extends Record<string, any>>(values: T): InferSharedRefs<T> => {\r\n const map: Record<string, Ref<any>> = {};\r\n for (const entry of Object.entries(values)) {\r\n map[entry[0]] = sharedRef(entry[0], entry[1]);\r\n }\r\n return map as InferSharedRefs<T>;\r\n },\r\n };\r\n}\r\n\r\nexport function createSharedSingletonAgg<\r\n STATES extends Record<string, Ref<any>>,\r\n COMMANDS extends Record<string, Function>\r\n>(\r\n channelName: string,\r\n init: (context: { sharedRefs: ReturnType<typeof createSharedFactory>['sharedRefs'] }) => {\r\n states: STATES;\r\n commands: COMMANDS;\r\n }\r\n): { api: { states: STATES; commands: COMMANDS } } {\r\n const channel = new BroadcastChannel(channelName);\r\n const sharedFactory = createSharedFactory(channel);\r\n const result = init({ sharedRefs: sharedFactory.sharedRefs });\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n return {\r\n api: { states, commands },\r\n };\r\n}\r\n"],"names":["createSharedFactory","channel","map","event","syncMessage","shallowRef","requireMessage","sharedRef","name","value","id","watch","o","r","customRef","track","trigger","newValue","values","entry","createSharedSingletonAgg","channelName","init","sharedFactory","result","states","commands"],"mappings":";AAkBO,SAASA,EAAoBC,GAA2B;AAC7D,QAAMC,IAAsE,CAAC;AACrE,EAAAD,EAAA,YAAY,CAACE,MAAU;AACzB,QAAAA,EAAM,KAAK,MAAM,KAAK;AACxB,YAAMC,IAAcD,EAAM;AAC1B,MAAKD,EAAIE,EAAY,CAAC,IAKXF,EAAIE,EAAY,CAAC,EAAE,KAAK,UAAUA,EAAY,MACvDF,EAAIE,EAAY,CAAC,EAAE,KAAK,QAAQA,EAAY,KALxCF,EAAAE,EAAY,CAAC,IAAI;AAAA,QACnB,MAAMC,EAAWD,EAAY,CAAC;AAAA,QAC9B,SAAS,MAAM;AAAA,QAAA;AAAA,MACjB;AAAA,IAGF;AAEE,QAAAD,EAAM,KAAK,MAAM,KAAK;AACxB,YAAMG,IAAiBH,EAAM;AACzB,MAAAD,EAAII,EAAe,CAAC,KACtBL,EAAQ,YAAY;AAAA,QAClB,GAAG;AAAA,QACH,GAAGK,EAAe;AAAA,QAClB,GAAGJ,EAAII,EAAe,CAAC,EAAE,KAAK;AAAA,MAAA,CAC/B;AAAA,IACH;AAAA,EAEJ;AAES,WAAAC,EAAaC,GAAcC,GAAU;AACjC,eAAA,MAAMR,EAAQ,YAAY,EAAE,GAAG,KAAK,GAAGO,GAAM,GAAG,CAAC;AACtD,UAAAE,IAAWF;AACb,IAAAN,EAAAQ,CAAE,IAAI,EAAE,MAAML,EAAWI,CAAK,GAAG,SAAS,MAAM;AAAA,IAAA,EAAG,GACvDE,EAAMT,EAAIQ,CAAE,EAAE,MAAM,CAAC,GAAQE,MAAW;AACtC,MAAI,MAAMA,MACAH,IAAA,GACJP,EAAAQ,CAAE,EAAE,QAAQ;AAAA,IAClB,CACD;AACD,UAAMG,IAAIC,EAAU,CAACC,GAAOC,OACnB;AAAA,MACL,MAAM;AACE,eAAAD,EAAA,GACCN;AAAA,MACT;AAAA,MACA,IAAIQ,GAAa;AAEf,QADIf,EAAAQ,CAAE,EAAE,UAAUM,GACdP,MAAUQ,MAGVf,EAAAQ,CAAE,EAAE,KAAK,QAAQO,GACbR,IAAAQ,GACAhB,EAAA,YAAY,EAAE,GAAG,KAAK,GAAGS,GAAI,GAAGO,GAAU,GAC1CD,EAAA;AAAA,MAAA;AAAA,IAEZ,EACD;AACD,WAAAH,EAAE,QAAQJ,GACHI;AAAA,EAAA;AAGF,SAAA;AAAA;AAAA,IAEL,YAAY,CAAgCK,MAAkC;AAC5E,YAAMhB,IAAgC,CAAC;AACvC,iBAAWiB,KAAS,OAAO,QAAQD,CAAM;AACvChB,QAAAA,EAAIiB,EAAM,CAAC,CAAC,IAAIZ,EAAUY,EAAM,CAAC,GAAGA,EAAM,CAAC,CAAC;AAEvCjB,aAAAA;AAAAA,IAAA;AAAA,EAEX;AACF;AAEgB,SAAAkB,EAIdC,GACAC,GAIiD;AAC3C,QAAArB,IAAU,IAAI,iBAAiBoB,CAAW,GAC1CE,IAAgBvB,EAAoBC,CAAO,GAC3CuB,IAASF,EAAK,EAAE,YAAYC,EAAc,YAAY,GAEtDE,IAAUD,EAAO,UAAU,CAAC,GAC5BE,IAAYF,EAAO,YAAY,CAAC;AAC/B,SAAA;AAAA,IACL,KAAK,EAAE,QAAAC,GAAQ,UAAAC,EAAS;AAAA,EAC1B;AACF;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../libs/shared-domain/index.ts"],"sourcesContent":["import { type Ref, type ShallowRef, customRef, shallowRef, watch } from 'vue';\r\nimport { genId } from './common';\r\n\r\ntype InferSharedRefs<T extends Record<string, any>> = {\r\n [K in keyof T]: Ref<T[K]>;\r\n};\r\n\r\ntype SharedSyncMessage = {\r\n t: 'U';\r\n k: string;\r\n v: any;\r\n};\r\n\r\ntype RequireMessage = {\r\n t: 'R';\r\n k: string;\r\n};\r\n\r\nexport function createSharedFactory(channel: BroadcastChannel) {\r\n const map: Record<string, { data: ShallowRef<any>; trigger: () => void }> = {};\r\n channel.onmessage = (event) => {\r\n if (event.data.t === 'U') {\r\n const syncMessage = event.data as SharedSyncMessage;\r\n if (!map[syncMessage.k]) {\r\n map[syncMessage.k] = {\r\n data: shallowRef(syncMessage.v),\r\n trigger: () => {},\r\n };\r\n } else if (map[syncMessage.k].data.value !== syncMessage.v) {\r\n map[syncMessage.k].data.value = syncMessage.v;\r\n }\r\n }\r\n if (event.data.t === 'R') {\r\n const requireMessage = event.data as RequireMessage;\r\n if (map[requireMessage.k]) {\r\n channel.postMessage({\r\n t: 'U',\r\n k: requireMessage.k,\r\n v: map[requireMessage.k].data.value,\r\n });\r\n }\r\n }\r\n };\r\n\r\n function sharedRef<T>(name: string, value: T) {\r\n setTimeout(() => channel.postMessage({ t: 'R', k: name }), 0);\r\n const id = genId(name);\r\n map[id] = { data: shallowRef(value), trigger: () => {} };\r\n watch(map[id].data, (n: any, o: any) => {\r\n if (n !== o) {\r\n value = n;\r\n map[id].trigger();\r\n }\r\n });\r\n const r = customRef((track, trigger) => {\r\n return {\r\n get() {\r\n track();\r\n return value;\r\n },\r\n set(newValue: T) {\r\n map[id].trigger = trigger;\r\n if (value === newValue) {\r\n return;\r\n }\r\n map[id].data.value = newValue;\r\n value = newValue;\r\n channel.postMessage({ t: 'U', k: id, v: newValue });\r\n trigger();\r\n },\r\n };\r\n });\r\n r.value = value;\r\n return r;\r\n }\r\n\r\n return {\r\n // sharedRef,\r\n sharedRefs: <T extends Record<string, any>>(values: T): InferSharedRefs<T> => {\r\n const map: Record<string, Ref<any>> = {};\r\n for (const entry of Object.entries(values)) {\r\n map[entry[0]] = sharedRef(entry[0], entry[1]);\r\n }\r\n return map as InferSharedRefs<T>;\r\n },\r\n };\r\n}\r\n\r\nexport function createSharedSingletonAgg<\r\n STATES extends Record<string, Ref<any>>,\r\n COMMANDS extends Record<string, Function>\r\n>(\r\n channelName: string,\r\n init: (context: { sharedRefs: ReturnType<typeof createSharedFactory>['sharedRefs'] }) => {\r\n states: STATES;\r\n commands: COMMANDS;\r\n }\r\n): { api: { states: STATES; commands: COMMANDS } } {\r\n const channel = new BroadcastChannel(channelName);\r\n const sharedFactory = createSharedFactory(channel);\r\n const result = init({ sharedRefs: sharedFactory.sharedRefs });\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n return {\r\n api: { states, commands },\r\n };\r\n}\r\n"],"names":["createSharedFactory","channel","map","event","syncMessage","shallowRef","requireMessage","sharedRef","name","value","id","watch","o","r","customRef","track","trigger","newValue","values","entry","createSharedSingletonAgg","channelName","init","sharedFactory","result","states","commands"],"mappings":";AAkBO,SAASA,EAAoBC,GAA2B;AAC7D,QAAMC,IAAsE,CAAC;AACrE,EAAAD,EAAA,YAAY,CAACE,MAAU;AACzB,QAAAA,EAAM,KAAK,MAAM,KAAK;AACxB,YAAMC,IAAcD,EAAM;AAC1B,MAAKD,EAAIE,EAAY,CAAC,IAKXF,EAAIE,EAAY,CAAC,EAAE,KAAK,UAAUA,EAAY,MACvDF,EAAIE,EAAY,CAAC,EAAE,KAAK,QAAQA,EAAY,KALxCF,EAAAE,EAAY,CAAC,IAAI;AAAA,QACnB,MAAMC,EAAWD,EAAY,CAAC;AAAA,QAC9B,SAAS,MAAM;AAAA,QAAA;AAAA,MACjB;AAAA,IAGF;AAEE,QAAAD,EAAM,KAAK,MAAM,KAAK;AACxB,YAAMG,IAAiBH,EAAM;AACzB,MAAAD,EAAII,EAAe,CAAC,KACtBL,EAAQ,YAAY;AAAA,QAClB,GAAG;AAAA,QACH,GAAGK,EAAe;AAAA,QAClB,GAAGJ,EAAII,EAAe,CAAC,EAAE,KAAK;AAAA,MAAA,CAC/B;AAAA,IACH;AAAA,EAEJ;AAES,WAAAC,EAAaC,GAAcC,GAAU;AACjC,eAAA,MAAMR,EAAQ,YAAY,EAAE,GAAG,KAAK,GAAGO,GAAM,GAAG,CAAC;AACtD,UAAAE,IAAWF;AACb,IAAAN,EAAAQ,CAAE,IAAI,EAAE,MAAML,EAAWI,CAAK,GAAG,SAAS,MAAM;AAAA,IAAA,EAAG,GACvDE,EAAMT,EAAIQ,CAAE,EAAE,MAAM,CAAC,GAAQE,MAAW;AACtC,MAAI,MAAMA,MACAH,IAAA,GACJP,EAAAQ,CAAE,EAAE,QAAQ;AAAA,IAClB,CACD;AACD,UAAMG,IAAIC,EAAU,CAACC,GAAOC,OACnB;AAAA,MACL,MAAM;AACE,eAAAD,EAAA,GACCN;AAAA,MACT;AAAA,MACA,IAAIQ,GAAa;AAEf,QADIf,EAAAQ,CAAE,EAAE,UAAUM,GACdP,MAAUQ,MAGVf,EAAAQ,CAAE,EAAE,KAAK,QAAQO,GACbR,IAAAQ,GACAhB,EAAA,YAAY,EAAE,GAAG,KAAK,GAAGS,GAAI,GAAGO,GAAU,GAC1CD,EAAA;AAAA,MAAA;AAAA,IAEZ,EACD;AACD,WAAAH,EAAE,QAAQJ,GACHI;AAAA,EAAA;AAGF,SAAA;AAAA;AAAA,IAEL,YAAY,CAAgCK,MAAkC;AAC5E,YAAMhB,IAAgC,CAAC;AACvC,iBAAWiB,KAAS,OAAO,QAAQD,CAAM;AACvChB,QAAAA,EAAIiB,EAAM,CAAC,CAAC,IAAIZ,EAAUY,EAAM,CAAC,GAAGA,EAAM,CAAC,CAAC;AAEvCjB,aAAAA;AAAAA,IAAA;AAAA,EAEX;AACF;AAEgB,SAAAkB,EAIdC,GACAC,GAIiD;AAC3C,QAAArB,IAAU,IAAI,iBAAiBoB,CAAW,GAC1CE,IAAgBvB,EAAoBC,CAAO,GAC3CuB,IAASF,EAAK,EAAE,YAAYC,EAAc,YAAY,GAEtDE,IAAUD,EAAO,UAAU,CAAC,GAC5BE,IAAYF,EAAO,YAAY,CAAC;AAC/B,SAAA;AAAA,IACL,KAAK,EAAE,QAAAC,GAAQ,UAAAC,EAAS;AAAA,EAC1B;AACF;"}
package/timer/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ShallowRef } from 'vue';
1
+ import { type DeepReadonly, type ShallowRef, type UnwrapNestedRefs } from 'vue';
2
2
  export type TimeoutApi = {
3
3
  resolve: () => void;
4
4
  reset: (ms?: number) => void;
@@ -6,3 +6,11 @@ export type TimeoutApi = {
6
6
  promise: Promise<void>;
7
7
  };
8
8
  export declare function createTimeout(timeoutMs: number, onTimeout?: Error | (() => void)): TimeoutApi;
9
+ type InferResolve<T> = undefined | void | unknown extends T ? () => void : (data: T | PromiseLike<T>) => void;
10
+ type InferData<T> = undefined | void | unknown extends T ? unknown : DeepReadonly<UnwrapNestedRefs<T>>;
11
+ export declare function createDeferred<T, E = Error>(): {
12
+ promise: Promise<InferData<T>>;
13
+ resolve: InferResolve<InferData<T>>;
14
+ reject: (cause?: E) => void;
15
+ };
16
+ export {};
package/timer/index.mjs CHANGED
@@ -1,18 +1,18 @@
1
- import { shallowRef as p } from "vue";
2
- function v(o, n = new Error("timeout!")) {
3
- let t;
4
- const i = p(!1);
5
- let u = () => {
6
- if (!t) {
7
- t = null;
1
+ import { shallowRef as m } from "vue";
2
+ function T(l, n = new Error("timeout!")) {
3
+ let r;
4
+ const i = m(!1);
5
+ let t = () => {
6
+ if (!r) {
7
+ r = null;
8
8
  return;
9
9
  }
10
- clearTimeout(t), t = null;
10
+ clearTimeout(r), r = null;
11
11
  };
12
- const a = new Proxy(() => {
12
+ const s = new Proxy(() => {
13
13
  }, {
14
- apply: function(e, l, r) {
15
- return u(...r);
14
+ apply: function(e, u, o) {
15
+ return t(...o);
16
16
  }
17
17
  });
18
18
  let c = (e) => {
@@ -22,35 +22,50 @@ function v(o, n = new Error("timeout!")) {
22
22
  };
23
23
  const f = new Proxy((e) => {
24
24
  }, {
25
- apply: function(e, l, r) {
26
- return c(...r);
25
+ apply: function(e, u, o) {
26
+ return c(...o);
27
27
  }
28
- }), s = (e = o) => {
29
- t && (clearTimeout(t), t = setTimeout(() => {
28
+ }), a = (e = l) => {
29
+ r && (clearTimeout(r), r = setTimeout(() => {
30
30
  f(n);
31
- }, e), o = e);
31
+ }, e), l = e);
32
32
  };
33
- let m = new Promise((e, l) => {
34
- if (t === null) {
33
+ let p = new Promise((e, u) => {
34
+ if (r === null) {
35
35
  e();
36
36
  return;
37
37
  }
38
- t = setTimeout(() => {
38
+ r = setTimeout(() => {
39
39
  f(n);
40
- }, o), u = () => {
41
- e(), clearTimeout(t), t = null;
42
- }, c = (r) => {
43
- i.value = !0, r instanceof Error ? l(r) : (r(), e());
40
+ }, l), t = () => {
41
+ e(), clearTimeout(r), r = null;
42
+ }, c = (o) => {
43
+ i.value = !0, o instanceof Error ? u(o) : (o(), e());
44
44
  };
45
45
  });
46
46
  return {
47
- resolve: a,
48
- reset: s,
49
- promise: m,
47
+ resolve: s,
48
+ reset: a,
49
+ promise: p,
50
50
  isTimeout: i
51
51
  };
52
52
  }
53
+ function x() {
54
+ let l, n;
55
+ return {
56
+ promise: new Promise((t, s) => {
57
+ l = t, n = s;
58
+ }),
59
+ resolve: (t) => {
60
+ l(t);
61
+ },
62
+ reject: (t) => {
63
+ n(t);
64
+ }
65
+ };
66
+ }
53
67
  export {
54
- v as createTimeout
68
+ x as createDeferred,
69
+ T as createTimeout
55
70
  };
56
71
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../libs/timer/index.ts"],"sourcesContent":["import { type ShallowRef, shallowRef } from 'vue';\r\n\r\nexport type TimeoutApi = {\r\n resolve: () => void;\r\n reset: (ms?: number) => void;\r\n isTimeout: ShallowRef<boolean>;\r\n promise: Promise<void>;\r\n};\r\n\r\nexport function createTimeout(\r\n timeoutMs: number,\r\n onTimeout: Error | (() => void) = new Error('timeout!')\r\n): TimeoutApi {\r\n let timeout: undefined | null | ReturnType<typeof setTimeout> = undefined;\r\n const isTimeout = shallowRef(false);\r\n let resolveEffect = () => {\r\n if (!timeout) {\r\n timeout = null;\r\n return;\r\n }\r\n clearTimeout(timeout!);\r\n timeout = null;\r\n };\r\n const resolve = new Proxy(() => void 0, {\r\n apply: function (_target: Function, _thisArg: any, argumentsList: any[]) {\r\n return (resolveEffect as any)(...argumentsList);\r\n },\r\n }) as typeof resolveEffect;\r\n let rejectEffect = (e: Error | (() => void)) => {\r\n isTimeout.value = true;\r\n if (e instanceof Error) {\r\n throw e;\r\n } else {\r\n e();\r\n }\r\n };\r\n const reject = new Proxy((_: Error | (() => void)) => void 0, {\r\n apply: function (_target: Function, _thisArg: any, argumentsList: any[]) {\r\n return (rejectEffect as any)(...argumentsList);\r\n },\r\n }) as typeof rejectEffect;\r\n const reset = (ms: number = timeoutMs) => {\r\n if (!timeout) {\r\n return;\r\n }\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n reject(onTimeout);\r\n }, ms);\r\n timeoutMs = ms;\r\n };\r\n let promise = new Promise<void>((innerResolve, innerReject) => {\r\n if (timeout === null) {\r\n innerResolve();\r\n return;\r\n }\r\n timeout = setTimeout(() => {\r\n reject(onTimeout);\r\n }, timeoutMs);\r\n resolveEffect = () => {\r\n innerResolve();\r\n clearTimeout(timeout!);\r\n timeout = null;\r\n };\r\n rejectEffect = (e: Error | (() => void)) => {\r\n isTimeout.value = true;\r\n if (e instanceof Error) {\r\n innerReject(e);\r\n } else {\r\n e();\r\n innerResolve();\r\n }\r\n };\r\n });\r\n const api: TimeoutApi = {\r\n resolve,\r\n reset,\r\n promise,\r\n isTimeout,\r\n };\r\n return api;\r\n}\r\n"],"names":["createTimeout","timeoutMs","onTimeout","timeout","isTimeout","shallowRef","resolveEffect","resolve","_target","_thisArg","argumentsList","rejectEffect","reject","_","reset","ms","promise","innerResolve","innerReject","e"],"mappings":";AASO,SAASA,EACdC,GACAC,IAAkC,IAAI,MAAM,UAAU,GAC1C;AACZ,MAAIC;AACE,QAAAC,IAAYC,EAAW,EAAK;AAClC,MAAIC,IAAgB,MAAM;AACxB,QAAI,CAACH,GAAS;AACF,MAAAA,IAAA;AACV;AAAA,IAAA;AAEF,iBAAaA,CAAQ,GACXA,IAAA;AAAA,EACZ;AACA,QAAMI,IAAU,IAAI,MAAM,MAAA;AAAA,KAAc;AAAA,IACtC,OAAO,SAAUC,GAAmBC,GAAeC,GAAsB;AAC/D,aAAAJ,EAAsB,GAAGI,CAAa;AAAA,IAAA;AAAA,EAChD,CACD;AACG,MAAAC,IAAe,CAAC,MAA4B;AAE9C,QADAP,EAAU,QAAQ,IACd,aAAa;AACT,YAAA;AAEJ,MAAA;AAAA,EAEN;AACA,QAAMQ,IAAS,IAAI,MAAM,CAACC,MAA4B;AAAA,KAAQ;AAAA,IAC5D,OAAO,SAAUL,GAAmBC,GAAeC,GAAsB;AAC/D,aAAAC,EAAqB,GAAGD,CAAa;AAAA,IAAA;AAAA,EAC/C,CACD,GACKI,IAAQ,CAACC,IAAad,MAAc;AACxC,IAAKE,MAGL,aAAaA,CAAO,GACpBA,IAAU,WAAW,MAAM;AACzB,MAAAS,EAAOV,CAAS;AAAA,OACfa,CAAE,GACOd,IAAAc;AAAA,EACd;AACA,MAAIC,IAAU,IAAI,QAAc,CAACC,GAAcC,MAAgB;AAC7D,QAAIf,MAAY,MAAM;AACP,MAAAc,EAAA;AACb;AAAA,IAAA;AAEF,IAAAd,IAAU,WAAW,MAAM;AACzB,MAAAS,EAAOV,CAAS;AAAA,OACfD,CAAS,GACZK,IAAgB,MAAM;AACP,MAAAW,EAAA,GACb,aAAad,CAAQ,GACXA,IAAA;AAAA,IACZ,GACAQ,IAAe,CAACQ,MAA4B;AAC1C,MAAAf,EAAU,QAAQ,IACde,aAAa,QACfD,EAAYC,CAAC,KAEXA,EAAA,GACWF,EAAA;AAAA,IAEjB;AAAA,EAAA,CACD;AAOM,SANiB;AAAA,IACtB,SAAAV;AAAA,IACA,OAAAO;AAAA,IACA,SAAAE;AAAA,IACA,WAAAZ;AAAA,EACF;AAEF;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../libs/timer/index.ts"],"sourcesContent":["import { type DeepReadonly, type ShallowRef, type UnwrapNestedRefs, shallowRef } from 'vue';\r\n\r\nexport type TimeoutApi = {\r\n resolve: () => void;\r\n reset: (ms?: number) => void;\r\n isTimeout: ShallowRef<boolean>;\r\n promise: Promise<void>;\r\n};\r\n\r\nexport function createTimeout(\r\n timeoutMs: number,\r\n onTimeout: Error | (() => void) = new Error('timeout!')\r\n): TimeoutApi {\r\n let timeout: undefined | null | ReturnType<typeof setTimeout> = undefined;\r\n const isTimeout = shallowRef(false);\r\n let resolveEffect = () => {\r\n if (!timeout) {\r\n timeout = null;\r\n return;\r\n }\r\n clearTimeout(timeout!);\r\n timeout = null;\r\n };\r\n const resolve = new Proxy(() => void 0, {\r\n apply: function (_target: Function, _thisArg: any, argumentsList: any[]) {\r\n return (resolveEffect as any)(...argumentsList);\r\n },\r\n }) as typeof resolveEffect;\r\n let rejectEffect = (e: Error | (() => void)) => {\r\n isTimeout.value = true;\r\n if (e instanceof Error) {\r\n throw e;\r\n } else {\r\n e();\r\n }\r\n };\r\n const reject = new Proxy((_: Error | (() => void)) => void 0, {\r\n apply: function (_target: Function, _thisArg: any, argumentsList: any[]) {\r\n return (rejectEffect as any)(...argumentsList);\r\n },\r\n }) as typeof rejectEffect;\r\n const reset = (ms: number = timeoutMs) => {\r\n if (!timeout) {\r\n return;\r\n }\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n reject(onTimeout);\r\n }, ms);\r\n timeoutMs = ms;\r\n };\r\n let promise = new Promise<void>((innerResolve, innerReject) => {\r\n if (timeout === null) {\r\n innerResolve();\r\n return;\r\n }\r\n timeout = setTimeout(() => {\r\n reject(onTimeout);\r\n }, timeoutMs);\r\n resolveEffect = () => {\r\n innerResolve();\r\n clearTimeout(timeout!);\r\n timeout = null;\r\n };\r\n rejectEffect = (e: Error | (() => void)) => {\r\n isTimeout.value = true;\r\n if (e instanceof Error) {\r\n innerReject(e);\r\n } else {\r\n e();\r\n innerResolve();\r\n }\r\n };\r\n });\r\n const api: TimeoutApi = {\r\n resolve,\r\n reset,\r\n promise,\r\n isTimeout,\r\n };\r\n return api;\r\n}\r\n\r\ntype InferResolve<T> = undefined | void | unknown extends T\r\n ? () => void\r\n : (data: T | PromiseLike<T>) => void;\r\ntype InferData<T> = undefined | void | unknown extends T\r\n ? unknown\r\n : DeepReadonly<UnwrapNestedRefs<T>>;\r\nexport function createDeferred<T, E = Error>() {\r\n type Data = InferData<T>;\r\n let resolve: InferResolve<Data>;\r\n let reject: (cause?: E) => void;\r\n const promise = new Promise<Data>((res, rej) => {\r\n resolve = res as any;\r\n reject = rej;\r\n });\r\n const exposeResolve = ((data?: Data): void => {\r\n resolve(data as any);\r\n }) as InferResolve<Data>;\r\n return {\r\n promise,\r\n resolve: exposeResolve,\r\n reject: (cause?: E) => {\r\n reject(cause);\r\n },\r\n };\r\n}\r\n"],"names":["createTimeout","timeoutMs","onTimeout","timeout","isTimeout","shallowRef","resolveEffect","resolve","_target","_thisArg","argumentsList","rejectEffect","reject","_","reset","ms","promise","innerResolve","innerReject","e","createDeferred","res","rej","data","cause"],"mappings":";AASO,SAASA,EACdC,GACAC,IAAkC,IAAI,MAAM,UAAU,GAC1C;AACZ,MAAIC;AACE,QAAAC,IAAYC,EAAW,EAAK;AAClC,MAAIC,IAAgB,MAAM;AACxB,QAAI,CAACH,GAAS;AACF,MAAAA,IAAA;AACV;AAAA,IAAA;AAEF,iBAAaA,CAAQ,GACXA,IAAA;AAAA,EACZ;AACA,QAAMI,IAAU,IAAI,MAAM,MAAA;AAAA,KAAc;AAAA,IACtC,OAAO,SAAUC,GAAmBC,GAAeC,GAAsB;AAC/D,aAAAJ,EAAsB,GAAGI,CAAa;AAAA,IAAA;AAAA,EAChD,CACD;AACG,MAAAC,IAAe,CAAC,MAA4B;AAE9C,QADAP,EAAU,QAAQ,IACd,aAAa;AACT,YAAA;AAEJ,MAAA;AAAA,EAEN;AACA,QAAMQ,IAAS,IAAI,MAAM,CAACC,MAA4B;AAAA,KAAQ;AAAA,IAC5D,OAAO,SAAUL,GAAmBC,GAAeC,GAAsB;AAC/D,aAAAC,EAAqB,GAAGD,CAAa;AAAA,IAAA;AAAA,EAC/C,CACD,GACKI,IAAQ,CAACC,IAAad,MAAc;AACxC,IAAKE,MAGL,aAAaA,CAAO,GACpBA,IAAU,WAAW,MAAM;AACzB,MAAAS,EAAOV,CAAS;AAAA,OACfa,CAAE,GACOd,IAAAc;AAAA,EACd;AACA,MAAIC,IAAU,IAAI,QAAc,CAACC,GAAcC,MAAgB;AAC7D,QAAIf,MAAY,MAAM;AACP,MAAAc,EAAA;AACb;AAAA,IAAA;AAEF,IAAAd,IAAU,WAAW,MAAM;AACzB,MAAAS,EAAOV,CAAS;AAAA,OACfD,CAAS,GACZK,IAAgB,MAAM;AACP,MAAAW,EAAA,GACb,aAAad,CAAQ,GACXA,IAAA;AAAA,IACZ,GACAQ,IAAe,CAACQ,MAA4B;AAC1C,MAAAf,EAAU,QAAQ,IACde,aAAa,QACfD,EAAYC,CAAC,KAEXA,EAAA,GACWF,EAAA;AAAA,IAEjB;AAAA,EAAA,CACD;AAOM,SANiB;AAAA,IACtB,SAAAV;AAAA,IACA,OAAAO;AAAA,IACA,SAAAE;AAAA,IACA,WAAAZ;AAAA,EACF;AAEF;AAQO,SAASgB,IAA+B;AAEzC,MAAAb,GACAK;AAQG,SAAA;AAAA,IACL,SARc,IAAI,QAAc,CAACS,GAAKC,MAAQ;AACpC,MAAAf,IAAAc,GACDT,IAAAU;AAAA,IAAA,CACV;AAAA,IAMC,SALqB,CAACC,MAAsB;AAC5C,MAAAhB,EAAQgB,CAAW;AAAA,IACrB;AAAA,IAIE,QAAQ,CAACC,MAAc;AACrB,MAAAZ,EAAOY,CAAK;AAAA,IAAA;AAAA,EAEhB;AACF;"}