vue-fn 0.1.0-beta.0 → 0.1.0-beta.1
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/index.mjs
CHANGED
|
@@ -259,7 +259,8 @@ function W(r, o) {
|
|
|
259
259
|
a();
|
|
260
260
|
}).catch((p) => {
|
|
261
261
|
n(p);
|
|
262
|
-
})
|
|
262
|
+
}),
|
|
263
|
+
0
|
|
263
264
|
);
|
|
264
265
|
const f = F(), v = f.run(
|
|
265
266
|
() => o({
|
|
@@ -331,7 +332,8 @@ function X(r) {
|
|
|
331
332
|
o();
|
|
332
333
|
}).catch((c) => {
|
|
333
334
|
a(c);
|
|
334
|
-
})
|
|
335
|
+
}),
|
|
336
|
+
0
|
|
335
337
|
);
|
|
336
338
|
const f = u.states || {}, v = u.commands || {}, h = u.events || {};
|
|
337
339
|
return {
|
package/domain/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../libs/domain/common.ts","../../libs/domain/event.ts","../../libs/domain/plugin.ts","../../libs/domain/agg.ts"],"sourcesContent":["import { ComputedRef, ref, computed } from 'vue'\r\nimport { nanoid } from 'nanoid'\r\n\r\nexport function createPromiseCallback<CALLBACK extends (...args: any[]) => Error | void>(\r\n callback: CALLBACK,\r\n finishOnError: boolean = true,\r\n timeoutMs: number | false = false\r\n): {\r\n promise: Promise<void>\r\n callback: CALLBACK\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n} {\r\n const errorRef = ref<Error>()\r\n let result: Error | true\r\n const resolvedRef = ref(false)\r\n let resolveEffect: Function = () => {}\r\n const resolve = new Proxy(callback, {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: any[]) {\r\n let r: Error | void = undefined\r\n try {\r\n r = target(...argumentsList)\r\n } catch (e: any) {\r\n r = e\r\n }\r\n if (r instanceof Error) {\r\n errorRef.value = r\r\n result = r\r\n if (finishOnError) {\r\n resolveEffect()\r\n throw r\r\n }\r\n } else {\r\n resolvedRef.value = true\r\n errorRef.value = undefined\r\n result = true\r\n resolveEffect()\r\n }\r\n },\r\n }) as CALLBACK\r\n const rejectEffect: (e: Error) => void = () => {}\r\n const reject = new Proxy(\r\n (e: Error) => {\r\n errorRef.value = e\r\n },\r\n {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: [Error]) {\r\n target(...argumentsList)\r\n rejectEffect(...argumentsList)\r\n },\r\n }\r\n )\r\n const promise = new Promise<void>((res, rej) => {\r\n if (finishOnError && result instanceof Error) {\r\n rej(result)\r\n return\r\n } else if (result === true) {\r\n res()\r\n return\r\n }\r\n let timeout: undefined | ReturnType<typeof setTimeout> = undefined\r\n if (timeoutMs) {\r\n timeout = setTimeout(() => {\r\n const e = new Error('timeout!')\r\n errorRef.value = e\r\n if (finishOnError) {\r\n rej(e)\r\n }\r\n }, timeoutMs)\r\n }\r\n resolveEffect = () => {\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n timeout = undefined\r\n }\r\n res()\r\n }\r\n })\r\n return {\r\n promise,\r\n callback: resolve,\r\n onError: reject,\r\n resolved: computed(() => resolvedRef.value),\r\n error: computed(() => errorRef.value),\r\n }\r\n}\r\n\r\nexport function genId(): string {\r\n return nanoid()\r\n}\r\n","import {\r\n type DeepReadonly,\r\n type UnwrapNestedRefs,\r\n WatchHandle,\r\n readonly,\r\n watch,\r\n shallowRef,\r\n computed,\r\n shallowReactive,\r\n triggerRef,\r\n ComputedRef,\r\n ShallowRef,\r\n} from 'vue'\r\nimport { createPromiseCallback } from './common'\r\n\r\nexport type DomainEventData = { [key: string]: any }\r\n\r\nexport type DomainRequestEventReply = (...args: any[]) => void | Error\r\n\r\nexport type DomainEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> =\r\n | DomainRequestEvent<DATA, REPLY>\r\n | DomainBroadcastEvent<DATA>\r\n\r\nexport type DomainDestroyedEventApi = ReturnType<typeof createBroadcastEvent<{}>>['api']\r\n\r\nexport type DomainRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> = {\r\n watchHandles: WatchHandle[]\r\n publishRequest: (data: UnwrapNestedRefs<DATA>) => Promise<void>\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublishRequest: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => WatchHandle\r\n }\r\n}\r\n\r\nexport type DomainBroadcastEvent<DATA extends DomainEventData> = {\r\n watchHandles: WatchHandle[]\r\n publish: (data: UnwrapNestedRefs<DATA>) => void\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublish: (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => WatchHandle\r\n }\r\n}\r\n\r\nexport function createRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply>(\r\n _: DATA,\r\n reply: REPLY,\r\n stopOnError = false,\r\n timeoutMs: number | false = false\r\n): DomainRequestEvent<DATA, REPLY> {\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n reply: REPLY\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n function updateEvent(\r\n data: UnwrapNestedRefs<DATA>,\r\n rep: REPLY,\r\n onError: (e: Error) => void,\r\n resolved: ComputedRef<boolean>,\r\n error: ComputedRef<Error | undefined>\r\n ) {\r\n const newVer = largeNumberIncrease(version.value)\r\n const handle = watch([resolved, error], ([r, e]) => {\r\n if (!map[newVer] || r || (stopOnError && e)) {\r\n handle()\r\n delete map[newVer]\r\n }\r\n })\r\n map[newVer] = {\r\n data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>>,\r\n reply: rep,\r\n onError,\r\n resolved,\r\n error,\r\n }\r\n version.value = newVer\r\n }\r\n\r\n const watchFn = (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => {\r\n const handle = watch(version, (newVersion) => {\r\n if (!map[newVersion] || map[newVersion].resolved.value || (stopOnError && map[newVersion].error.value)) {\r\n return\r\n }\r\n try {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n reply: map[newVersion].reply,\r\n })\r\n } catch (e) {\r\n if (!map[newVersion].error.value) {\r\n map[newVersion].onError(e as Error)\r\n }\r\n }\r\n })\r\n watchHandles.push(handle)\r\n if (map[version.value]) {\r\n triggerRef(version)\r\n }\r\n return handle\r\n }\r\n\r\n const publishFn = async (data: UnwrapNestedRefs<DATA>) => {\r\n const { promise, callback: rep, resolved, error, onError } = createPromiseCallback(reply, stopOnError, timeoutMs)\r\n updateEvent(data, rep, onError, resolved, error)\r\n await promise\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublishRequest: watchFn,\r\n }\r\n\r\n return {\r\n watchHandles,\r\n publishRequest: publishFn,\r\n api,\r\n }\r\n}\r\n\r\nexport function createBroadcastEvent<DATA extends DomainEventData = never>(): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_: DATA): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_?: DATA): DomainBroadcastEvent<DATA> {\r\n const eventLifetime: number = 5\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n const alifeEvents: string[] = []\r\n function updateEvent(data: UnwrapNestedRefs<DATA>) {\r\n const newVer = largeNumberIncrease(version.value)\r\n map[newVer] = { data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>> }\r\n const x = alifeEvents.length - eventLifetime\r\n if (x > 0) {\r\n alifeEvents.splice(0, x)\r\n }\r\n version.value = newVer\r\n alifeEvents.push(newVer)\r\n }\r\n\r\n const watchFn = (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => {\r\n return watch(version, (newVersion) => {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n })\r\n })\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublish: watchFn,\r\n }\r\n return {\r\n watchHandles,\r\n publish: async (data: UnwrapNestedRefs<DATA>) => {\r\n updateEvent(data)\r\n },\r\n api,\r\n }\r\n}\r\n\r\nfunction 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 { 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) => 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<DomainHotSwapPluginOptionsFn<AGG>>\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\nfunction createPluginHelper<AGG extends DomainAgg>() {\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\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.watchPublish(() => {\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({ api: agg.api, __aggId: agg.__id, isInitialized: agg.isInitialized })\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 createSetupPlugin(args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>): 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) {\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({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\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 (hotSwapPluginsCheck.has(aggRecords[k]) && hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)) {\r\n plugin.unmount({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id]\r\n } else {\r\n isNever(plugin)\r\n }\r\n },\r\n })\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(_: FUN) {\r\n return createPluginHelper<ReturnType<FUN>>()\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainAgg>(_: AGG) {\r\n return createPluginHelper<AGG>()\r\n}\r\n","import {\r\n type UnwrapNestedRefs,\r\n type DeepReadonly,\r\n readonly,\r\n shallowReadonly,\r\n EffectScope,\r\n effectScope,\r\n onScopeDispose,\r\n ComputedRef,\r\n computed,\r\n} from 'vue'\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n createBroadcastEvent,\r\n DomainEvent,\r\n DomainRequestEvent,\r\n} from './event'\r\nimport { createPromiseCallback, genId } from './common'\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 ? DomainBroadcastEvent<{}> : 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<infer DATA>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer CALLBACK>\r\n ? DomainRequestEvent<DATA, CALLBACK>\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 : { [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any> ? T[K] : never }\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<UnwrapNestedRefs<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>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\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<STATES, COMMANDS, EVENTS>\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 { [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any> }\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 })\r\n .catch((e: Error) => {\r\n onInitializeError(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 for (const handle of (event as DomainEvent<any, any>).watchHandles) {\r\n handle.stop()\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,\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize()\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e)\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 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,\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"],"names":["createPromiseCallback","callback","finishOnError","timeoutMs","errorRef","ref","result","resolvedRef","resolveEffect","resolve","target","_thisArg","argumentsList","r","e","rejectEffect","reject","res","rej","timeout","computed","genId","nanoid","createRequestEvent","_","reply","stopOnError","version","shallowRef","map","watchHandles","shallowReactive","updateEvent","data","rep","onError","resolved","error","newVer","largeNumberIncrease","handle","watch","readonly","watchFn","cb","newVersion","triggerRef","publishFn","promise","api","createBroadcastEvent","num1","str1","str2","maxLength","carry","digit1","digit2","sum","createPluginHelper","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","agg","applyedHotSwapPlugins","p","args","opts","util","plugin","k","createPluginHelperByAggCreator","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","onBeforeInitialize","fn","beforeInitializeTasks","scope","effectScope","onScopeDispose","eventsExt","destroyedEvent","destroy","event","createSingletonAgg"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../libs/domain/common.ts","../../libs/domain/event.ts","../../libs/domain/plugin.ts","../../libs/domain/agg.ts"],"sourcesContent":["import { ComputedRef, ref, computed } from 'vue'\r\nimport { nanoid } from 'nanoid'\r\n\r\nexport function createPromiseCallback<CALLBACK extends (...args: any[]) => Error | void>(\r\n callback: CALLBACK,\r\n finishOnError: boolean = true,\r\n timeoutMs: number | false = false\r\n): {\r\n promise: Promise<void>\r\n callback: CALLBACK\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n} {\r\n const errorRef = ref<Error>()\r\n let result: Error | true\r\n const resolvedRef = ref(false)\r\n let resolveEffect: Function = () => {}\r\n const resolve = new Proxy(callback, {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: any[]) {\r\n let r: Error | void = undefined\r\n try {\r\n r = target(...argumentsList)\r\n } catch (e: any) {\r\n r = e\r\n }\r\n if (r instanceof Error) {\r\n errorRef.value = r\r\n result = r\r\n if (finishOnError) {\r\n resolveEffect()\r\n throw r\r\n }\r\n } else {\r\n resolvedRef.value = true\r\n errorRef.value = undefined\r\n result = true\r\n resolveEffect()\r\n }\r\n },\r\n }) as CALLBACK\r\n const rejectEffect: (e: Error) => void = () => {}\r\n const reject = new Proxy(\r\n (e: Error) => {\r\n errorRef.value = e\r\n },\r\n {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: [Error]) {\r\n target(...argumentsList)\r\n rejectEffect(...argumentsList)\r\n },\r\n }\r\n )\r\n const promise = new Promise<void>((res, rej) => {\r\n if (finishOnError && result instanceof Error) {\r\n rej(result)\r\n return\r\n } else if (result === true) {\r\n res()\r\n return\r\n }\r\n let timeout: undefined | ReturnType<typeof setTimeout> = undefined\r\n if (timeoutMs) {\r\n timeout = setTimeout(() => {\r\n const e = new Error('timeout!')\r\n errorRef.value = e\r\n if (finishOnError) {\r\n rej(e)\r\n }\r\n }, timeoutMs)\r\n }\r\n resolveEffect = () => {\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n timeout = undefined\r\n }\r\n res()\r\n }\r\n })\r\n return {\r\n promise,\r\n callback: resolve,\r\n onError: reject,\r\n resolved: computed(() => resolvedRef.value),\r\n error: computed(() => errorRef.value),\r\n }\r\n}\r\n\r\nexport function genId(): string {\r\n return nanoid()\r\n}\r\n","import {\r\n type DeepReadonly,\r\n type UnwrapNestedRefs,\r\n WatchHandle,\r\n readonly,\r\n watch,\r\n shallowRef,\r\n computed,\r\n shallowReactive,\r\n triggerRef,\r\n ComputedRef,\r\n ShallowRef,\r\n} from 'vue'\r\nimport { createPromiseCallback } from './common'\r\n\r\nexport type DomainEventData = { [key: string]: any }\r\n\r\nexport type DomainRequestEventReply = (...args: any[]) => void | Error\r\n\r\nexport type DomainEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> =\r\n | DomainRequestEvent<DATA, REPLY>\r\n | DomainBroadcastEvent<DATA>\r\n\r\nexport type DomainDestroyedEventApi = ReturnType<typeof createBroadcastEvent<{}>>['api']\r\n\r\nexport type DomainRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> = {\r\n watchHandles: WatchHandle[]\r\n publishRequest: (data: UnwrapNestedRefs<DATA>) => Promise<void>\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublishRequest: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => WatchHandle\r\n }\r\n}\r\n\r\nexport type DomainBroadcastEvent<DATA extends DomainEventData> = {\r\n watchHandles: WatchHandle[]\r\n publish: (data: UnwrapNestedRefs<DATA>) => void\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublish: (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => WatchHandle\r\n }\r\n}\r\n\r\nexport function createRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply>(\r\n _: DATA,\r\n reply: REPLY,\r\n stopOnError = false,\r\n timeoutMs: number | false = false\r\n): DomainRequestEvent<DATA, REPLY> {\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n reply: REPLY\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n function updateEvent(\r\n data: UnwrapNestedRefs<DATA>,\r\n rep: REPLY,\r\n onError: (e: Error) => void,\r\n resolved: ComputedRef<boolean>,\r\n error: ComputedRef<Error | undefined>\r\n ) {\r\n const newVer = largeNumberIncrease(version.value)\r\n const handle = watch([resolved, error], ([r, e]) => {\r\n if (!map[newVer] || r || (stopOnError && e)) {\r\n handle()\r\n delete map[newVer]\r\n }\r\n })\r\n map[newVer] = {\r\n data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>>,\r\n reply: rep,\r\n onError,\r\n resolved,\r\n error,\r\n }\r\n version.value = newVer\r\n }\r\n\r\n const watchFn = (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => {\r\n const handle = watch(version, (newVersion) => {\r\n if (!map[newVersion] || map[newVersion].resolved.value || (stopOnError && map[newVersion].error.value)) {\r\n return\r\n }\r\n try {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n reply: map[newVersion].reply,\r\n })\r\n } catch (e) {\r\n if (!map[newVersion].error.value) {\r\n map[newVersion].onError(e as Error)\r\n }\r\n }\r\n })\r\n watchHandles.push(handle)\r\n if (map[version.value]) {\r\n triggerRef(version)\r\n }\r\n return handle\r\n }\r\n\r\n const publishFn = async (data: UnwrapNestedRefs<DATA>) => {\r\n const { promise, callback: rep, resolved, error, onError } = createPromiseCallback(reply, stopOnError, timeoutMs)\r\n updateEvent(data, rep, onError, resolved, error)\r\n await promise\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublishRequest: watchFn,\r\n }\r\n\r\n return {\r\n watchHandles,\r\n publishRequest: publishFn,\r\n api,\r\n }\r\n}\r\n\r\nexport function createBroadcastEvent<DATA extends DomainEventData = never>(): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_: DATA): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_?: DATA): DomainBroadcastEvent<DATA> {\r\n const eventLifetime: number = 5\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n const alifeEvents: string[] = []\r\n function updateEvent(data: UnwrapNestedRefs<DATA>) {\r\n const newVer = largeNumberIncrease(version.value)\r\n map[newVer] = { data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>> }\r\n const x = alifeEvents.length - eventLifetime\r\n if (x > 0) {\r\n alifeEvents.splice(0, x)\r\n }\r\n version.value = newVer\r\n alifeEvents.push(newVer)\r\n }\r\n\r\n const watchFn = (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => {\r\n return watch(version, (newVersion) => {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n })\r\n })\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublish: watchFn,\r\n }\r\n return {\r\n watchHandles,\r\n publish: async (data: UnwrapNestedRefs<DATA>) => {\r\n updateEvent(data)\r\n },\r\n api,\r\n }\r\n}\r\n\r\nfunction 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 { 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) => 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<DomainHotSwapPluginOptionsFn<AGG>>\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\nfunction createPluginHelper<AGG extends DomainAgg>() {\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\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.watchPublish(() => {\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({ api: agg.api, __aggId: agg.__id, isInitialized: agg.isInitialized })\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 createSetupPlugin(args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>): 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) {\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({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\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 (hotSwapPluginsCheck.has(aggRecords[k]) && hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)) {\r\n plugin.unmount({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id]\r\n } else {\r\n isNever(plugin)\r\n }\r\n },\r\n })\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(_: FUN) {\r\n return createPluginHelper<ReturnType<FUN>>()\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainAgg>(_: AGG) {\r\n return createPluginHelper<AGG>()\r\n}\r\n","import {\r\n type UnwrapNestedRefs,\r\n type DeepReadonly,\r\n readonly,\r\n shallowReadonly,\r\n EffectScope,\r\n effectScope,\r\n onScopeDispose,\r\n ComputedRef,\r\n computed,\r\n} from 'vue'\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n createBroadcastEvent,\r\n DomainEvent,\r\n DomainRequestEvent,\r\n} from './event'\r\nimport { createPromiseCallback, genId } from './common'\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 ? DomainBroadcastEvent<{}> : 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<infer DATA>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer CALLBACK>\r\n ? DomainRequestEvent<DATA, CALLBACK>\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 : { [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any> ? T[K] : never }\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<UnwrapNestedRefs<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>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\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<STATES, COMMANDS, EVENTS>\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 { [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any> }\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize()\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e)\r\n }),\r\n 0\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 for (const handle of (event as DomainEvent<any, any>).watchHandles) {\r\n handle.stop()\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,\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 })\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,\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"],"names":["createPromiseCallback","callback","finishOnError","timeoutMs","errorRef","ref","result","resolvedRef","resolveEffect","resolve","target","_thisArg","argumentsList","r","e","rejectEffect","reject","res","rej","timeout","computed","genId","nanoid","createRequestEvent","_","reply","stopOnError","version","shallowRef","map","watchHandles","shallowReactive","updateEvent","data","rep","onError","resolved","error","newVer","largeNumberIncrease","handle","watch","readonly","watchFn","cb","newVersion","triggerRef","publishFn","promise","api","createBroadcastEvent","num1","str1","str2","maxLength","carry","digit1","digit2","sum","createPluginHelper","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","agg","applyedHotSwapPlugins","p","args","opts","util","plugin","k","createPluginHelperByAggCreator","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","onBeforeInitialize","fn","beforeInitializeTasks","scope","effectScope","onScopeDispose","eventsExt","destroyedEvent","destroy","event","createSingletonAgg"],"mappings":"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"}
|
package/domain-server/index.mjs
CHANGED
|
@@ -259,7 +259,8 @@ function W(r, o) {
|
|
|
259
259
|
a();
|
|
260
260
|
}).catch((p) => {
|
|
261
261
|
n(p);
|
|
262
|
-
})
|
|
262
|
+
}),
|
|
263
|
+
0
|
|
263
264
|
);
|
|
264
265
|
const f = F(), v = f.run(
|
|
265
266
|
() => o({
|
|
@@ -331,7 +332,8 @@ function X(r) {
|
|
|
331
332
|
o();
|
|
332
333
|
}).catch((c) => {
|
|
333
334
|
a(c);
|
|
334
|
-
})
|
|
335
|
+
}),
|
|
336
|
+
0
|
|
335
337
|
);
|
|
336
338
|
const f = u.states || {}, v = u.commands || {}, h = u.events || {};
|
|
337
339
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../libs/domain-server/common.ts","../../libs/domain-server/event.ts","../../libs/domain-server/plugin.ts","../../libs/domain-server/agg.ts"],"sourcesContent":["import { ComputedRef, ref, computed } from '@vue/reactivity'\r\nimport { nanoid } from 'nanoid'\r\n\r\nexport function createPromiseCallback<CALLBACK extends (...args: any[]) => Error | void>(\r\n callback: CALLBACK,\r\n finishOnError: boolean = true,\r\n timeoutMs: number | false = false\r\n): {\r\n promise: Promise<void>\r\n callback: CALLBACK\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n} {\r\n const errorRef = ref<Error>()\r\n let result: Error | true\r\n const resolvedRef = ref(false)\r\n let resolveEffect: Function = () => {}\r\n const resolve = new Proxy(callback, {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: any[]) {\r\n let r: Error | void = undefined\r\n try {\r\n r = target(...argumentsList)\r\n } catch (e: any) {\r\n r = e\r\n }\r\n if (r instanceof Error) {\r\n errorRef.value = r\r\n result = r\r\n if (finishOnError) {\r\n resolveEffect()\r\n throw r\r\n }\r\n } else {\r\n resolvedRef.value = true\r\n errorRef.value = undefined\r\n result = true\r\n resolveEffect()\r\n }\r\n },\r\n }) as CALLBACK\r\n const rejectEffect: (e: Error) => void = () => {}\r\n const reject = new Proxy(\r\n (e: Error) => {\r\n errorRef.value = e\r\n },\r\n {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: [Error]) {\r\n target(...argumentsList)\r\n rejectEffect(...argumentsList)\r\n },\r\n }\r\n )\r\n const promise = new Promise<void>((res, rej) => {\r\n if (finishOnError && result instanceof Error) {\r\n rej(result)\r\n return\r\n } else if (result === true) {\r\n res()\r\n return\r\n }\r\n let timeout: undefined | ReturnType<typeof setTimeout> = undefined\r\n if (timeoutMs) {\r\n timeout = setTimeout(() => {\r\n const e = new Error('timeout!')\r\n errorRef.value = e\r\n if (finishOnError) {\r\n rej(e)\r\n }\r\n }, timeoutMs)\r\n }\r\n resolveEffect = () => {\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n timeout = undefined\r\n }\r\n res()\r\n }\r\n })\r\n return {\r\n promise,\r\n callback: resolve,\r\n onError: reject,\r\n resolved: computed(() => resolvedRef.value),\r\n error: computed(() => errorRef.value),\r\n }\r\n}\r\n\r\nexport function genId(): string {\r\n return nanoid()\r\n}\r\n","import {\r\n type DeepReadonly,\r\n type UnwrapNestedRefs,\r\n WatchHandle,\r\n readonly,\r\n watch,\r\n shallowRef,\r\n computed,\r\n shallowReactive,\r\n triggerRef,\r\n ComputedRef,\r\n ShallowRef,\r\n} from '@vue/reactivity'\r\nimport { createPromiseCallback } from './common'\r\n\r\nexport type DomainEventData = { [key: string]: any }\r\n\r\nexport type DomainRequestEventReply = (...args: any[]) => void | Error\r\n\r\nexport type DomainEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> =\r\n | DomainRequestEvent<DATA, REPLY>\r\n | DomainBroadcastEvent<DATA>\r\n\r\nexport type DomainDestroyedEventApi = ReturnType<typeof createBroadcastEvent<{}>>['api']\r\n\r\nexport type DomainRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> = {\r\n watchHandles: WatchHandle[]\r\n publishRequest: (data: UnwrapNestedRefs<DATA>) => Promise<void>\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublishRequest: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => WatchHandle\r\n }\r\n}\r\n\r\nexport type DomainBroadcastEvent<DATA extends DomainEventData> = {\r\n watchHandles: WatchHandle[]\r\n publish: (data: UnwrapNestedRefs<DATA>) => void\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublish: (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => WatchHandle\r\n }\r\n}\r\n\r\nexport function createRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply>(\r\n _: DATA,\r\n reply: REPLY,\r\n stopOnError = false,\r\n timeoutMs: number | false = false\r\n): DomainRequestEvent<DATA, REPLY> {\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n reply: REPLY\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n function updateEvent(\r\n data: UnwrapNestedRefs<DATA>,\r\n rep: REPLY,\r\n onError: (e: Error) => void,\r\n resolved: ComputedRef<boolean>,\r\n error: ComputedRef<Error | undefined>\r\n ) {\r\n const newVer = largeNumberIncrease(version.value)\r\n const handle = watch([resolved, error], ([r, e]) => {\r\n if (!map[newVer] || r || (stopOnError && e)) {\r\n handle()\r\n delete map[newVer]\r\n }\r\n })\r\n map[newVer] = {\r\n data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>>,\r\n reply: rep,\r\n onError,\r\n resolved,\r\n error,\r\n }\r\n version.value = newVer\r\n }\r\n\r\n const watchFn = (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => {\r\n const handle = watch(version, (newVersion) => {\r\n if (!map[newVersion] || map[newVersion].resolved.value || (stopOnError && map[newVersion].error.value)) {\r\n return\r\n }\r\n try {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n reply: map[newVersion].reply,\r\n })\r\n } catch (e) {\r\n if (!map[newVersion].error.value) {\r\n map[newVersion].onError(e as Error)\r\n }\r\n }\r\n })\r\n watchHandles.push(handle)\r\n if (map[version.value]) {\r\n triggerRef(version)\r\n }\r\n return handle\r\n }\r\n\r\n const publishFn = async (data: UnwrapNestedRefs<DATA>) => {\r\n const { promise, callback: rep, resolved, error, onError } = createPromiseCallback(reply, stopOnError, timeoutMs)\r\n updateEvent(data, rep, onError, resolved, error)\r\n await promise\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublishRequest: watchFn,\r\n }\r\n\r\n return {\r\n watchHandles,\r\n publishRequest: publishFn,\r\n api,\r\n }\r\n}\r\n\r\nexport function createBroadcastEvent<DATA extends DomainEventData = never>(): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_: DATA): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_?: DATA): DomainBroadcastEvent<DATA> {\r\n const eventLifetime: number = 5\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n const alifeEvents: string[] = []\r\n function updateEvent(data: UnwrapNestedRefs<DATA>) {\r\n const newVer = largeNumberIncrease(version.value)\r\n map[newVer] = { data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>> }\r\n const x = alifeEvents.length - eventLifetime\r\n if (x > 0) {\r\n alifeEvents.splice(0, x)\r\n }\r\n version.value = newVer\r\n alifeEvents.push(newVer)\r\n }\r\n\r\n const watchFn = (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => {\r\n return watch(version, (newVersion) => {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n })\r\n })\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublish: watchFn,\r\n }\r\n return {\r\n watchHandles,\r\n publish: async (data: UnwrapNestedRefs<DATA>) => {\r\n updateEvent(data)\r\n },\r\n api,\r\n }\r\n}\r\n\r\nfunction 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 { 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) => 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<DomainHotSwapPluginOptionsFn<AGG>>\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\nfunction createPluginHelper<AGG extends DomainAgg>() {\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\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.watchPublish(() => {\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({ api: agg.api, __aggId: agg.__id, isInitialized: agg.isInitialized })\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 createSetupPlugin(args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>): 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) {\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({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\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 (hotSwapPluginsCheck.has(aggRecords[k]) && hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)) {\r\n plugin.unmount({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id]\r\n } else {\r\n isNever(plugin)\r\n }\r\n },\r\n })\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(_: FUN) {\r\n return createPluginHelper<ReturnType<FUN>>()\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainAgg>(_: AGG) {\r\n return createPluginHelper<AGG>()\r\n}\r\n","import {\r\n type UnwrapNestedRefs,\r\n type DeepReadonly,\r\n readonly,\r\n shallowReadonly,\r\n EffectScope,\r\n effectScope,\r\n onScopeDispose,\r\n ComputedRef,\r\n computed,\r\n} from '@vue/reactivity'\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n createBroadcastEvent,\r\n DomainEvent,\r\n DomainRequestEvent,\r\n} from './event'\r\nimport { createPromiseCallback, genId } from './common'\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 ? DomainBroadcastEvent<{}> : 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<infer DATA>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer CALLBACK>\r\n ? DomainRequestEvent<DATA, CALLBACK>\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 : { [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any> ? T[K] : never }\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<UnwrapNestedRefs<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>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\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<STATES, COMMANDS, EVENTS>\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 { [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any> }\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 })\r\n .catch((e: Error) => {\r\n onInitializeError(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 for (const handle of (event as DomainEvent<any, any>).watchHandles) {\r\n handle.stop()\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,\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize()\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e)\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 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,\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"],"names":["createPromiseCallback","callback","finishOnError","timeoutMs","errorRef","ref","result","resolvedRef","resolveEffect","resolve","target","_thisArg","argumentsList","r","e","rejectEffect","reject","res","rej","timeout","computed","genId","nanoid","createRequestEvent","_","reply","stopOnError","version","shallowRef","map","watchHandles","shallowReactive","updateEvent","data","rep","onError","resolved","error","newVer","largeNumberIncrease","handle","watch","readonly","watchFn","cb","newVersion","triggerRef","publishFn","promise","api","createBroadcastEvent","num1","str1","str2","maxLength","carry","digit1","digit2","sum","createPluginHelper","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","agg","applyedHotSwapPlugins","p","args","opts","util","plugin","k","createPluginHelperByAggCreator","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","onBeforeInitialize","fn","beforeInitializeTasks","scope","effectScope","onScopeDispose","eventsExt","destroyedEvent","destroy","event","createSingletonAgg"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../libs/domain-server/common.ts","../../libs/domain-server/event.ts","../../libs/domain-server/plugin.ts","../../libs/domain-server/agg.ts"],"sourcesContent":["import { ComputedRef, ref, computed } from '@vue/reactivity'\r\nimport { nanoid } from 'nanoid'\r\n\r\nexport function createPromiseCallback<CALLBACK extends (...args: any[]) => Error | void>(\r\n callback: CALLBACK,\r\n finishOnError: boolean = true,\r\n timeoutMs: number | false = false\r\n): {\r\n promise: Promise<void>\r\n callback: CALLBACK\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n} {\r\n const errorRef = ref<Error>()\r\n let result: Error | true\r\n const resolvedRef = ref(false)\r\n let resolveEffect: Function = () => {}\r\n const resolve = new Proxy(callback, {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: any[]) {\r\n let r: Error | void = undefined\r\n try {\r\n r = target(...argumentsList)\r\n } catch (e: any) {\r\n r = e\r\n }\r\n if (r instanceof Error) {\r\n errorRef.value = r\r\n result = r\r\n if (finishOnError) {\r\n resolveEffect()\r\n throw r\r\n }\r\n } else {\r\n resolvedRef.value = true\r\n errorRef.value = undefined\r\n result = true\r\n resolveEffect()\r\n }\r\n },\r\n }) as CALLBACK\r\n const rejectEffect: (e: Error) => void = () => {}\r\n const reject = new Proxy(\r\n (e: Error) => {\r\n errorRef.value = e\r\n },\r\n {\r\n apply: function (target: CALLBACK, _thisArg: any, argumentsList: [Error]) {\r\n target(...argumentsList)\r\n rejectEffect(...argumentsList)\r\n },\r\n }\r\n )\r\n const promise = new Promise<void>((res, rej) => {\r\n if (finishOnError && result instanceof Error) {\r\n rej(result)\r\n return\r\n } else if (result === true) {\r\n res()\r\n return\r\n }\r\n let timeout: undefined | ReturnType<typeof setTimeout> = undefined\r\n if (timeoutMs) {\r\n timeout = setTimeout(() => {\r\n const e = new Error('timeout!')\r\n errorRef.value = e\r\n if (finishOnError) {\r\n rej(e)\r\n }\r\n }, timeoutMs)\r\n }\r\n resolveEffect = () => {\r\n if (timeout) {\r\n clearTimeout(timeout)\r\n timeout = undefined\r\n }\r\n res()\r\n }\r\n })\r\n return {\r\n promise,\r\n callback: resolve,\r\n onError: reject,\r\n resolved: computed(() => resolvedRef.value),\r\n error: computed(() => errorRef.value),\r\n }\r\n}\r\n\r\nexport function genId(): string {\r\n return nanoid()\r\n}\r\n","import {\r\n type DeepReadonly,\r\n type UnwrapNestedRefs,\r\n WatchHandle,\r\n readonly,\r\n watch,\r\n shallowRef,\r\n computed,\r\n shallowReactive,\r\n triggerRef,\r\n ComputedRef,\r\n ShallowRef,\r\n} from '@vue/reactivity'\r\nimport { createPromiseCallback } from './common'\r\n\r\nexport type DomainEventData = { [key: string]: any }\r\n\r\nexport type DomainRequestEventReply = (...args: any[]) => void | Error\r\n\r\nexport type DomainEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> =\r\n | DomainRequestEvent<DATA, REPLY>\r\n | DomainBroadcastEvent<DATA>\r\n\r\nexport type DomainDestroyedEventApi = ReturnType<typeof createBroadcastEvent<{}>>['api']\r\n\r\nexport type DomainRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply> = {\r\n watchHandles: WatchHandle[]\r\n publishRequest: (data: UnwrapNestedRefs<DATA>) => Promise<void>\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublishRequest: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => WatchHandle\r\n }\r\n}\r\n\r\nexport type DomainBroadcastEvent<DATA extends DomainEventData> = {\r\n watchHandles: WatchHandle[]\r\n publish: (data: UnwrapNestedRefs<DATA>) => void\r\n api: {\r\n latestVersion: ComputedRef<ShallowRef<string>>\r\n watchPublish: (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => WatchHandle\r\n }\r\n}\r\n\r\nexport function createRequestEvent<DATA extends DomainEventData, REPLY extends DomainRequestEventReply>(\r\n _: DATA,\r\n reply: REPLY,\r\n stopOnError = false,\r\n timeoutMs: number | false = false\r\n): DomainRequestEvent<DATA, REPLY> {\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n reply: REPLY\r\n onError: (e: Error) => void\r\n resolved: ComputedRef<boolean>\r\n error: ComputedRef<Error | undefined>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n function updateEvent(\r\n data: UnwrapNestedRefs<DATA>,\r\n rep: REPLY,\r\n onError: (e: Error) => void,\r\n resolved: ComputedRef<boolean>,\r\n error: ComputedRef<Error | undefined>\r\n ) {\r\n const newVer = largeNumberIncrease(version.value)\r\n const handle = watch([resolved, error], ([r, e]) => {\r\n if (!map[newVer] || r || (stopOnError && e)) {\r\n handle()\r\n delete map[newVer]\r\n }\r\n })\r\n map[newVer] = {\r\n data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>>,\r\n reply: rep,\r\n onError,\r\n resolved,\r\n error,\r\n }\r\n version.value = newVer\r\n }\r\n\r\n const watchFn = (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string; reply: REPLY }) => void\r\n ) => {\r\n const handle = watch(version, (newVersion) => {\r\n if (!map[newVersion] || map[newVersion].resolved.value || (stopOnError && map[newVersion].error.value)) {\r\n return\r\n }\r\n try {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n reply: map[newVersion].reply,\r\n })\r\n } catch (e) {\r\n if (!map[newVersion].error.value) {\r\n map[newVersion].onError(e as Error)\r\n }\r\n }\r\n })\r\n watchHandles.push(handle)\r\n if (map[version.value]) {\r\n triggerRef(version)\r\n }\r\n return handle\r\n }\r\n\r\n const publishFn = async (data: UnwrapNestedRefs<DATA>) => {\r\n const { promise, callback: rep, resolved, error, onError } = createPromiseCallback(reply, stopOnError, timeoutMs)\r\n updateEvent(data, rep, onError, resolved, error)\r\n await promise\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublishRequest: watchFn,\r\n }\r\n\r\n return {\r\n watchHandles,\r\n publishRequest: publishFn,\r\n api,\r\n }\r\n}\r\n\r\nexport function createBroadcastEvent<DATA extends DomainEventData = never>(): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_: DATA): DomainBroadcastEvent<DATA>\r\nexport function createBroadcastEvent<DATA extends DomainEventData>(_?: DATA): DomainBroadcastEvent<DATA> {\r\n const eventLifetime: number = 5\r\n let version = shallowRef('0')\r\n const map: Record<\r\n string,\r\n {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>\r\n }\r\n > = {}\r\n const watchHandles = shallowReactive<WatchHandle[]>([])\r\n const alifeEvents: string[] = []\r\n function updateEvent(data: UnwrapNestedRefs<DATA>) {\r\n const newVer = largeNumberIncrease(version.value)\r\n map[newVer] = { data: readonly(data) as DeepReadonly<UnwrapNestedRefs<DATA>> }\r\n const x = alifeEvents.length - eventLifetime\r\n if (x > 0) {\r\n alifeEvents.splice(0, x)\r\n }\r\n version.value = newVer\r\n alifeEvents.push(newVer)\r\n }\r\n\r\n const watchFn = (cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void) => {\r\n return watch(version, (newVersion) => {\r\n cb({\r\n data: map[newVersion].data,\r\n version: newVersion,\r\n })\r\n })\r\n }\r\n\r\n const api = {\r\n latestVersion: computed(() => version),\r\n watchPublish: watchFn,\r\n }\r\n return {\r\n watchHandles,\r\n publish: async (data: UnwrapNestedRefs<DATA>) => {\r\n updateEvent(data)\r\n },\r\n api,\r\n }\r\n}\r\n\r\nfunction 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 { 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) => 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<DomainHotSwapPluginOptionsFn<AGG>>\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\nfunction createPluginHelper<AGG extends DomainAgg>() {\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\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.watchPublish(() => {\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({ api: agg.api, __aggId: agg.__id, isInitialized: agg.isInitialized })\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 createSetupPlugin(args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>): 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: { api: NonNullable<AGG>['api']; __aggId: string; isInitialized: ComputedRef<boolean> }) {\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({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\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 (hotSwapPluginsCheck.has(aggRecords[k]) && hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)) {\r\n plugin.unmount({ api: aggRecords[k].api, __aggId: aggRecords[k].__id })\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id]\r\n } else {\r\n isNever(plugin)\r\n }\r\n },\r\n })\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(_: FUN) {\r\n return createPluginHelper<ReturnType<FUN>>()\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainAgg>(_: AGG) {\r\n return createPluginHelper<AGG>()\r\n}\r\n","import {\r\n type UnwrapNestedRefs,\r\n type DeepReadonly,\r\n readonly,\r\n shallowReadonly,\r\n EffectScope,\r\n effectScope,\r\n onScopeDispose,\r\n ComputedRef,\r\n computed,\r\n} from '@vue/reactivity'\r\nimport {\r\n type DomainBroadcastEvent,\r\n type DomainDestroyedEventApi,\r\n createBroadcastEvent,\r\n DomainEvent,\r\n DomainRequestEvent,\r\n} from './event'\r\nimport { createPromiseCallback, genId } from './common'\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 ? DomainBroadcastEvent<{}> : 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<infer DATA>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer CALLBACK>\r\n ? DomainRequestEvent<DATA, CALLBACK>\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 : { [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any> ? T[K] : never }\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<UnwrapNestedRefs<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>> = EVENTS extends Record<\r\n string,\r\n DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n>\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<STATES, COMMANDS, EVENTS>\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 { [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any> }\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize()\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e)\r\n }),\r\n 0\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 for (const handle of (event as DomainEvent<any, any>).watchHandles) {\r\n handle.stop()\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,\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 callback: initialize,\r\n onError: onInitializeError,\r\n promise: untilInitialized,\r\n resolved: isInitialized,\r\n } = createPromiseCallback(() => {}, false, 5000)\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 })\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,\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"],"names":["createPromiseCallback","callback","finishOnError","timeoutMs","errorRef","ref","result","resolvedRef","resolveEffect","resolve","target","_thisArg","argumentsList","r","e","rejectEffect","reject","res","rej","timeout","computed","genId","nanoid","createRequestEvent","_","reply","stopOnError","version","shallowRef","map","watchHandles","shallowReactive","updateEvent","data","rep","onError","resolved","error","newVer","largeNumberIncrease","handle","watch","readonly","watchFn","cb","newVersion","triggerRef","publishFn","promise","api","createBroadcastEvent","num1","str1","str2","maxLength","carry","digit1","digit2","sum","createPluginHelper","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","agg","applyedHotSwapPlugins","p","args","opts","util","plugin","k","createPluginHelperByAggCreator","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","onBeforeInitialize","fn","beforeInitializeTasks","scope","effectScope","onScopeDispose","eventsExt","destroyedEvent","destroy","event","createSingletonAgg"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser-CWCjzKuA.js","sources":["../node_modules/.pnpm/nanoid@5.1.
|
|
1
|
+
{"version":3,"file":"index.browser-CWCjzKuA.js","sources":["../node_modules/.pnpm/nanoid@5.1.5/node_modules/nanoid/url-alphabet/index.js","../node_modules/.pnpm/nanoid@5.1.5/node_modules/nanoid/index.browser.js"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n"],"names":["urlAlphabet","nanoid","size","id","bytes","scopedUrlAlphabet"],"mappings":"AAAO,MAAMA,IACX;ACoBQ,IAACC,IAAS,CAACC,IAAO,OAAO;AACjC,MAAIC,IAAK,IACLC,IAAQ,OAAO,gBAAgB,IAAI,WAAYF,KAAQ,CAAG,CAAA;AAC9D,SAAOA;AACL,IAAAC,KAAME,EAAkBD,EAAMF,CAAI,IAAI,EAAE;AAE1C,SAAOC;AACT;","x_google_ignoreList":[0,1]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vue-fn",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
4
|
"description": "一个 vue3 的响应式函数工具包",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"url": "git+https://github.com/AlphaFoxz/vue-fn.git"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"nanoid": "^5.1.
|
|
22
|
+
"nanoid": "^5.1.5"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"@vue/reactivity": ">=3.5.0",
|
package/shared-domain/index.mjs
CHANGED
|
@@ -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] = { data: shallowRef(syncMessage.v), trigger: () => {} }\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({ t: 'U', k: requireMessage.k, v: map[requireMessage.k].data.value })\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 }))\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,IAEXF,EAAIE,EAAY,CAAC,EAAE,KAAK,UAAUA,EAAY,MACvDF,EAAIE,EAAY,CAAC,EAAE,KAAK,QAAQA,EAAY,KAFxCF,EAAAE,EAAY,CAAC,IAAI,EAAE,MAAMC,EAAWD,EAAY,CAAC,GAAG,SAAS,MAAM;AAAA,MAAA,EAAG;AAAA,IAG5E;AAEE,QAAAD,EAAM,KAAK,MAAM,KAAK;AACxB,YAAMG,IAAiBH,EAAM;AACzB,MAAAD,EAAII,EAAe,CAAC,KACtBL,EAAQ,YAAY,EAAE,GAAG,KAAK,GAAGK,EAAe,GAAG,GAAGJ,EAAII,EAAe,CAAC,EAAE,KAAK,OAAO;AAAA,IAC1F;AAAA,EAEJ;AAES,WAAAC,EAAaC,GAAcC,GAAU;AACjC,eAAA,MAAMR,EAAQ,YAAY,EAAE,GAAG,KAAK,GAAGO,
|
|
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] = { data: shallowRef(syncMessage.v), trigger: () => {} }\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({ t: 'U', k: requireMessage.k, v: map[requireMessage.k].data.value })\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,IAEXF,EAAIE,EAAY,CAAC,EAAE,KAAK,UAAUA,EAAY,MACvDF,EAAIE,EAAY,CAAC,EAAE,KAAK,QAAQA,EAAY,KAFxCF,EAAAE,EAAY,CAAC,IAAI,EAAE,MAAMC,EAAWD,EAAY,CAAC,GAAG,SAAS,MAAM;AAAA,MAAA,EAAG;AAAA,IAG5E;AAEE,QAAAD,EAAM,KAAK,MAAM,KAAK;AACxB,YAAMG,IAAiBH,EAAM;AACzB,MAAAD,EAAII,EAAe,CAAC,KACtBL,EAAQ,YAAY,EAAE,GAAG,KAAK,GAAGK,EAAe,GAAG,GAAGJ,EAAII,EAAe,CAAC,EAAE,KAAK,OAAO;AAAA,IAC1F;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;"}
|