vue-fn 0.1.0-rc.1 → 0.1.0-rc.2

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.
@@ -1 +1 @@
1
- export declare function genId(): string;
1
+ export declare function genId(prefix?: string): string;
package/domain/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
- import { t as w, n as k } from "../index.browser-DzRLzC85.js";
2
- import { ref as z, computed as I, effectScope as P, onScopeDispose as b, shallowReadonly as v, readonly as g } from "vue";
3
- function H(r) {
4
- function o(i) {
1
+ import { t as w } from "../index-Dhhr_iXc.js";
2
+ import { ref as z, computed as g, effectScope as k, onScopeDispose as b, shallowReadonly as v, readonly as I } from "vue";
3
+ function T(i) {
4
+ function s(r) {
5
5
  let c = "0", t = [];
6
6
  const a = [];
7
- function e(s, l, m, u) {
7
+ function e(o, l, m, u) {
8
8
  const f = E(c);
9
9
  c = f, t.push({
10
10
  version: f,
11
- data: s,
11
+ data: o,
12
12
  resolve: l,
13
13
  reject: m,
14
14
  timerId: u
@@ -16,18 +16,18 @@ function H(r) {
16
16
  }
17
17
  function n() {
18
18
  if (!(t.length === 0 || a.length === 0))
19
- for (const s of t) {
20
- const { version: l, data: m, resolve: u, reject: f, timerId: _ } = s, h = {
19
+ for (const o of t) {
20
+ const { version: l, data: m, resolve: u, reject: f, timerId: _ } = o, h = {
21
21
  data: m,
22
22
  version: l
23
23
  };
24
24
  for (const d of a)
25
25
  try {
26
26
  const p = d(h);
27
- i.onReply(p), u(p), _ && clearTimeout(_);
27
+ r.onReply(p), u(p), _ && clearTimeout(_);
28
28
  } catch (p) {
29
- if (i.onError && p instanceof Error)
30
- i.onError(p), i.isTerminateOnError && (f(p), _ && clearTimeout(_));
29
+ if (r.onError && p instanceof Error)
30
+ r.onError(p), r.isTerminateOnError && (f(p), _ && clearTimeout(_));
31
31
  else
32
32
  throw new Error("caught a unknown error" + (p?.toString() || p));
33
33
  }
@@ -36,22 +36,22 @@ function H(r) {
36
36
  }
37
37
  return {
38
38
  listeners: a,
39
- async publishRequest(s) {
39
+ async publishRequest(o) {
40
40
  const l = new w.Deferred();
41
41
  let m;
42
- return i.timeoutMs && (m = setTimeout(() => {
43
- l.reject(new Error(`timeout: ${i.timeoutMs} ms`));
44
- }, i.timeoutMs)), e(s, l.resolve, l.reject, m), await l.promise;
42
+ return r.timeoutMs && (m = setTimeout(() => {
43
+ l.reject(new Error(`timeout: ${r.timeoutMs} ms`));
44
+ }, r.timeoutMs)), e(o, l.resolve, l.reject, m), await l.promise;
45
45
  },
46
46
  api: {
47
47
  get latestVersion() {
48
48
  return c;
49
49
  },
50
- listenAndReply(s) {
51
- if (i.maxListenerCount && a.length >= i.maxListenerCount)
52
- throw new Error("too many listeners. max limit: " + i.maxListenerCount);
53
- return a.push(s), n(), () => {
54
- const l = a.indexOf(s);
50
+ listenAndReply(o) {
51
+ if (r.maxListenerCount && a.length >= r.maxListenerCount)
52
+ throw new Error("too many listeners. max limit: " + r.maxListenerCount);
53
+ return a.push(o), n(), () => {
54
+ const l = a.indexOf(o);
55
55
  l !== -1 && a.splice(l, 1);
56
56
  };
57
57
  }
@@ -59,57 +59,58 @@ function H(r) {
59
59
  };
60
60
  }
61
61
  return {
62
- options: o
62
+ options: s
63
63
  };
64
64
  }
65
- function x(r) {
66
- let o = "0";
67
- const i = [];
65
+ function P(i) {
66
+ let s = "0";
67
+ const r = [];
68
68
  return {
69
- listeners: i,
69
+ listeners: r,
70
70
  publish(c) {
71
71
  const t = {
72
72
  data: c,
73
- version: E(o)
73
+ version: E(s)
74
74
  };
75
- o = t.version;
76
- for (const a of i)
75
+ s = t.version;
76
+ for (const a of r)
77
77
  a(t);
78
78
  },
79
79
  api: {
80
80
  get latestVersion() {
81
- return o;
81
+ return s;
82
82
  },
83
83
  listen(c) {
84
- return i.push(c), () => {
85
- const t = i.indexOf(c);
86
- t >= 0 && i.splice(t, 1);
84
+ return r.push(c), () => {
85
+ const t = r.indexOf(c);
86
+ t >= 0 && r.splice(t, 1);
87
87
  };
88
88
  }
89
89
  }
90
90
  };
91
91
  }
92
- function E(r) {
93
- if (+r < Number.MAX_SAFE_INTEGER)
94
- return (parseInt(r) + 1).toString();
95
- let o = r.split("").reverse().join(""), i = "1";
96
- const c = Math.max(o.length, i.length);
92
+ function E(i) {
93
+ if (+i < Number.MAX_SAFE_INTEGER)
94
+ return (parseInt(i) + 1).toString();
95
+ let s = i.split("").reverse().join(""), r = "1";
96
+ const c = Math.max(s.length, r.length);
97
97
  let t = 0, a = [];
98
98
  for (let e = 0; e < c; e++) {
99
- const n = e < o.length ? parseInt(o[e], 10) : 0, s = e < i.length ? parseInt(i[e], 10) : 0, l = n + s + t;
99
+ const n = e < s.length ? parseInt(s[e], 10) : 0, o = e < r.length ? parseInt(r[e], 10) : 0, l = n + o + t;
100
100
  a.push(l % 10), t = Math.floor(l / 10);
101
101
  }
102
102
  return t > 0 && a.push(t), a.reverse().join("");
103
103
  }
104
- function y() {
105
- return k();
104
+ function y(i = "") {
105
+ const s = Date.now().toString(36), r = Math.random().toString(36).substring(2, 10);
106
+ return `${i}${s}${r}`;
106
107
  }
107
108
  const D = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
108
109
  __proto__: null,
109
110
  genId: y
110
111
  }, Symbol.toStringTag, { value: "Module" }));
111
- function S(r) {
112
- const o = {}, i = {}, c = /* @__PURE__ */ new WeakMap(), t = {}, a = [];
112
+ function S(i) {
113
+ const s = {}, r = {}, c = /* @__PURE__ */ new WeakMap(), t = {}, a = [];
113
114
  return Object.freeze({
114
115
  registerAgg(e) {
115
116
  if (e.isInitialized.value)
@@ -120,20 +121,20 @@ function S(r) {
120
121
  delete t[e.__id];
121
122
  }), t[e.__id] = e;
122
123
  const n = [];
123
- for (const s of Object.values(o))
124
- s.mount({
124
+ for (const o of Object.values(s))
125
+ o.mount({
125
126
  api: e.api,
126
127
  __aggId: e.__id,
127
128
  isInitialized: e.isInitialized
128
129
  });
129
- for (const s of Object.values(i))
130
- s.mount({ api: e.api, __aggId: e.__id }), n.push(s.__id);
131
- if (c.set(e, n), j(e)) {
132
- const s = e.api.events.destroyed.listen(() => {
133
- delete t[e.__id], r?.(e);
130
+ for (const o of Object.values(r))
131
+ o.mount({ api: e.api, __aggId: e.__id }), n.push(o.__id);
132
+ if (c.set(e, n), x(e)) {
133
+ const o = e.api.events.destroyed.listen(() => {
134
+ delete t[e.__id], i?.(e);
134
135
  for (const l of a)
135
136
  l(e);
136
- s?.();
137
+ o?.();
137
138
  });
138
139
  }
139
140
  },
@@ -145,10 +146,10 @@ function S(r) {
145
146
  return e instanceof Function ? n = e() : n = e, Object.freeze({
146
147
  __id: y(),
147
148
  type: "Setup",
148
- mount(s) {
149
- if (s.isInitialized.value)
149
+ mount(o) {
150
+ if (o.isInitialized.value)
150
151
  throw new Error("Can not setup after initialized");
151
- n.mount({ api: s.api, __aggId: s.__aggId });
152
+ n.mount({ api: o.api, __aggId: o.__aggId });
152
153
  }
153
154
  });
154
155
  },
@@ -163,9 +164,9 @@ function S(r) {
163
164
  },
164
165
  registerPlugin(e) {
165
166
  if (e.type === "Setup") {
166
- if (o[e.__id])
167
+ if (s[e.__id])
167
168
  throw new Error("Plugin already registered");
168
- o[e.__id] = e;
169
+ s[e.__id] = e;
169
170
  for (const n in t)
170
171
  e.mount({
171
172
  api: t[n].api,
@@ -173,7 +174,7 @@ function S(r) {
173
174
  isInitialized: t[n].isInitialized
174
175
  });
175
176
  } else if (e.type === "HotSwap") {
176
- i[e.__id] = e;
177
+ r[e.__id] = e;
177
178
  for (const n in t)
178
179
  c.has(t[n]) && !c.get(t[n]).includes(e.__id) && (e.mount({
179
180
  api: t[n].api,
@@ -191,49 +192,49 @@ function S(r) {
191
192
  api: t[n].api,
192
193
  __aggId: t[n].__id
193
194
  });
194
- delete i[e.__id];
195
+ delete r[e.__id];
195
196
  } else
196
197
  isNever(e);
197
198
  }
198
199
  });
199
200
  }
200
- function R(r, o) {
201
- return S(o);
201
+ function H(i, s) {
202
+ return S(s);
202
203
  }
203
- function B(r) {
204
+ function $(i) {
204
205
  return S();
205
206
  }
206
- function j(r) {
207
- return r.type === "MultiInstance";
207
+ function x(i) {
208
+ return i.type === "MultiInstance";
208
209
  }
209
- function M(r) {
210
- return A(r);
210
+ function j(i) {
211
+ return A(i);
211
212
  }
212
- function C(r) {
213
- const o = A(r);
213
+ function M(i) {
214
+ const s = A(i);
214
215
  return v({
215
- states: o.states,
216
- commands: o.commands,
217
- events: o.events
216
+ states: s.states,
217
+ commands: s.commands,
218
+ events: s.events
218
219
  });
219
220
  }
220
- function A(r) {
221
- const o = r.states;
222
- for (const e of Object.keys(r.states))
223
- o[e] = g(o[e]);
224
- const i = v(r.states), c = g(r.commands), t = {}, a = r.events;
225
- for (const e in r.events)
221
+ function A(i) {
222
+ const s = i.states;
223
+ for (const e of Object.keys(i.states))
224
+ s[e] = I(s[e]);
225
+ const r = v(i.states), c = I(i.commands), t = {}, a = i.events;
226
+ for (const e in i.events)
226
227
  t[e] = a[e].api;
227
228
  return v({
228
- states: i,
229
+ states: r,
229
230
  commands: c,
230
231
  events: v(t),
231
- destroy: r.destroy
232
+ destroy: i.destroy
232
233
  });
233
234
  }
234
- function N(r, o) {
235
+ function R(i, s) {
235
236
  const {
236
- resolve: i,
237
+ resolve: r,
237
238
  reject: c,
238
239
  promise: t
239
240
  } = new w.Deferred();
@@ -246,27 +247,27 @@ function N(r, o) {
246
247
  const n = [];
247
248
  setTimeout(
248
249
  () => Promise.all(n).then(() => {
249
- i(), a.value = !0;
250
+ r(), a.value = !0;
250
251
  }).catch((d) => {
251
252
  throw c(d), d;
252
253
  })
253
254
  );
254
- const s = P(), l = s.run(
255
- () => o({
255
+ const o = k(), l = o.run(
256
+ () => s({
256
257
  getCurrentScope() {
257
- return s;
258
+ return o;
258
259
  },
259
260
  onScopeDispose: b,
260
261
  onCreated(d) {
261
262
  Promise.resolve().then(d);
262
263
  },
263
264
  onBeforeInitialize: e,
264
- isInitialized: I(() => a.value),
265
+ isInitialized: g(() => a.value),
265
266
  untilInitialized: t
266
267
  })
267
268
  ), m = l.states || {}, u = l.commands || {}, f = l.events || {};
268
269
  let _;
269
- f.destroyed ? _ = f.destroyed : (_ = x(), f.destroyed = _);
270
+ f.destroyed ? _ = f.destroyed : (_ = P(), f.destroyed = _);
270
271
  let h = l.destroy;
271
272
  return h || (h = () => {
272
273
  _?.publish({});
@@ -274,18 +275,18 @@ function N(r, o) {
274
275
  const p = f[d];
275
276
  p.listeners.length = 0;
276
277
  }
277
- s.stop();
278
+ o.stop();
278
279
  }), v({
279
280
  __id: y(),
280
281
  type: "MultiInstance",
281
- id: r,
282
- api: M({
282
+ id: i,
283
+ api: j({
283
284
  states: m,
284
285
  commands: u,
285
286
  events: f,
286
287
  destroy: h
287
288
  }),
288
- isInitialized: I(() => a.value),
289
+ isInitialized: g(() => a.value),
289
290
  async untilInitialized() {
290
291
  return await t.catch((d) => {
291
292
  throw new Error(`Failed to initialize Agg: ${d.message}
@@ -294,10 +295,10 @@ Stack : ${d.stack || "unkown"}`);
294
295
  }
295
296
  });
296
297
  }
297
- function V(r) {
298
+ function B(i) {
298
299
  const {
299
- resolve: o,
300
- reject: i,
300
+ resolve: s,
301
+ reject: r,
301
302
  promise: c
302
303
  } = new w.Deferred();
303
304
  let t = z(!1);
@@ -306,34 +307,34 @@ function V(r) {
306
307
  throw new Error("Agg already initialized");
307
308
  e.push(u());
308
309
  }
309
- const e = [], n = r({
310
+ const e = [], n = i({
310
311
  onCreated(u) {
311
312
  Promise.resolve().then(u);
312
313
  },
313
314
  onBeforeInitialize: a,
314
- isInitialized: I(() => t.value),
315
+ isInitialized: g(() => t.value),
315
316
  untilInitialized: c
316
317
  });
317
318
  setTimeout(
318
319
  () => Promise.all(e).then(() => {
319
- o(), t.value = !0;
320
+ s(), t.value = !0;
320
321
  }).catch((u) => {
321
- i(u);
322
+ r(u);
322
323
  }),
323
324
  0
324
325
  );
325
- const s = n.states || {}, l = n.commands || {}, m = n.events || {};
326
+ const o = n.states || {}, l = n.commands || {}, m = n.events || {};
326
327
  return {
327
328
  __id: y(),
328
329
  type: "Singleton",
329
- api: C({
330
- states: s,
330
+ api: M({
331
+ states: o,
331
332
  commands: l,
332
333
  events: m,
333
334
  destroy: () => {
334
335
  }
335
336
  }),
336
- isInitialized: I(() => t.value),
337
+ isInitialized: g(() => t.value),
337
338
  async untilInitialized() {
338
339
  return await c.catch((u) => {
339
340
  throw new Error(`Failed to initialize Agg: ${u.message}
@@ -344,11 +345,11 @@ Stack : ${u.stack || "unkown"}`);
344
345
  }
345
346
  export {
346
347
  D as Utils,
347
- x as createBroadcastEvent,
348
- N as createMultiInstanceAgg,
349
- B as createPluginHelperByAgg,
350
- R as createPluginHelperByAggCreator,
351
- H as createRequestEvent,
352
- V as createSingletonAgg
348
+ P as createBroadcastEvent,
349
+ R as createMultiInstanceAgg,
350
+ $ as createPluginHelperByAgg,
351
+ H as createPluginHelperByAggCreator,
352
+ T as createRequestEvent,
353
+ B as createSingletonAgg
353
354
  };
354
355
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../libs/domain/event.ts","../../libs/domain/common.ts","../../libs/domain/plugin.ts","../../libs/domain/agg.ts"],"sourcesContent":["import { Deferred } from 'ts-deferred';\r\nimport { DeepReadonly, UnwrapNestedRefs } from 'vue';\r\n\r\nexport type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {\r\n dataType?: DATA;\r\n onReply: ON_REPLY;\r\n onError?: (e: Error) => void;\r\n maxListenerCount?: number;\r\n isTerminateOnError?: boolean;\r\n timeoutMs?: number | false;\r\n};\r\nexport type DomainRequestEvent<DATA, REPLY_DATA> = {\r\n listeners: DomainRequestEventListener<DATA, REPLY_DATA>[];\r\n publishRequest: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => Promise<REPLY_DATA>;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listenAndReply: (replyFn: DomainRequestEventListener<DATA, REPLY_DATA>) => () => void;\r\n };\r\n};\r\nexport type DomainRequestEventListener<DATA, REPLY_DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => REPLY_DATA;\r\n\r\nexport type DomainBroadcastEvent<DATA> = {\r\n listeners: DomainBroadcastEventListener<DATA>[];\r\n publish: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => void;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listen: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ) => () => void;\r\n };\r\n};\r\nexport type DomainBroadcastEventListener<DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => void;\r\n\r\nexport type DomainDestroyedEventApi = DomainBroadcastEvent<{}>['api'];\r\n\r\nexport type DomainEvent<DATA, REPLY_DATA> =\r\n | DomainRequestEvent<DATA, REPLY_DATA>\r\n | DomainBroadcastEvent<DATA>;\r\n\r\nexport function createRequestEvent<DATA extends object = {}>(_dataType?: DATA) {\r\n function options<ON_REPLY extends (replyData: any) => void, REPLY_DATA = Parameters<ON_REPLY>[0]>(\r\n options: DomainRequestEventOptions<DATA, ON_REPLY>\r\n ): DomainRequestEvent<DATA, REPLY_DATA> {\r\n let currentVersion = '0';\r\n let unconsumedEvent: {\r\n version: string;\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n resolve: (data: REPLY_DATA) => void;\r\n reject: (e: Error) => void;\r\n timerId: NodeJS.Timeout | undefined;\r\n }[] = [];\r\n const listeners: DomainRequestEventListener<DATA, REPLY_DATA>[] = [];\r\n function updateEvent(\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>,\r\n resolve: (data: REPLY_DATA) => void,\r\n reject: (e: Error) => void,\r\n timerId: NodeJS.Timeout | undefined\r\n ) {\r\n const nextVer = largeNumberIncrease(currentVersion);\r\n currentVersion = nextVer;\r\n unconsumedEvent.push({\r\n version: nextVer,\r\n data,\r\n resolve,\r\n reject,\r\n timerId,\r\n });\r\n emitEvent();\r\n }\r\n function emitEvent() {\r\n if (unconsumedEvent.length === 0 || listeners.length === 0) {\r\n return;\r\n }\r\n for (const event of unconsumedEvent) {\r\n const { version, data, resolve, reject, timerId } = event;\r\n const context = {\r\n data,\r\n version,\r\n };\r\n for (const listener of listeners) {\r\n try {\r\n const replyData = listener(context);\r\n options.onReply(replyData);\r\n resolve(replyData);\r\n timerId && clearTimeout(timerId);\r\n // return await deferred.promise\r\n } catch (e: unknown) {\r\n if (options.onError && e instanceof Error) {\r\n options.onError(e);\r\n if (options.isTerminateOnError) {\r\n reject(e);\r\n timerId && clearTimeout(timerId);\r\n }\r\n } else {\r\n throw new Error('caught a unknown error' + (e?.toString() || e));\r\n }\r\n }\r\n }\r\n unconsumedEvent.shift();\r\n }\r\n }\r\n return {\r\n listeners,\r\n async publishRequest(data: DeepReadonly<UnwrapNestedRefs<DATA>>) {\r\n const deferred = new Deferred<REPLY_DATA>();\r\n let timerId: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs) {\r\n timerId = setTimeout(() => {\r\n deferred.reject(new Error(`timeout: ${options.timeoutMs} ms`));\r\n }, options.timeoutMs);\r\n }\r\n updateEvent(data, deferred.resolve, deferred.reject, timerId);\r\n return await deferred.promise;\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listenAndReply(replyFn: DomainRequestEventListener<DATA, REPLY_DATA>): () => void {\r\n if (options.maxListenerCount && listeners.length >= options.maxListenerCount) {\r\n throw new Error('too many listeners. max limit: ' + options.maxListenerCount);\r\n }\r\n listeners.push(replyFn);\r\n emitEvent();\r\n return () => {\r\n const index = listeners.indexOf(replyFn);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n options,\r\n };\r\n}\r\n\r\nexport function createBroadcastEvent<DATA extends object = {}>(\r\n _?: DATA\r\n): DomainBroadcastEvent<DATA> {\r\n let currentVersion = '0';\r\n const listeners: DomainBroadcastEventListener<DATA>[] = [];\r\n return {\r\n listeners,\r\n publish(data: DeepReadonly<UnwrapNestedRefs<DATA>>) {\r\n const context = {\r\n data,\r\n version: largeNumberIncrease(currentVersion),\r\n };\r\n currentVersion = context.version;\r\n for (const listener of listeners) {\r\n listener(context);\r\n }\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listen(\r\n cb: (options: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ): () => void {\r\n listeners.push(cb);\r\n return () => {\r\n const index = listeners.indexOf(cb);\r\n if (index >= 0) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function largeNumberIncrease(num1: string): string {\r\n if (+num1 < Number.MAX_SAFE_INTEGER) {\r\n return (parseInt(num1) + 1).toString();\r\n }\r\n\r\n // 反转字符串以便从最低位开始相加\r\n let str1 = num1.split('').reverse().join('');\r\n let str2 = '1';\r\n\r\n const maxLength = Math.max(str1.length, str2.length);\r\n let carry = 0;\r\n let result = [];\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n const digit1 = i < str1.length ? parseInt(str1[i], 10) : 0;\r\n const digit2 = i < str2.length ? parseInt(str2[i], 10) : 0;\r\n\r\n const sum = digit1 + digit2 + carry;\r\n result.push(sum % 10); // 当前位的结果\r\n carry = Math.floor(sum / 10); // 计算进位\r\n }\r\n\r\n if (carry > 0) {\r\n result.push(carry);\r\n }\r\n\r\n // 反转结果并转换为字符串\r\n return result.reverse().join('');\r\n}\r\n","import { nanoid } from 'nanoid';\r\n\r\nexport function genId(): string {\r\n return nanoid();\r\n}\r\n","import { ComputedRef } from 'vue';\r\nimport type { DomainSingletonAgg, DomainMultiInstanceAgg } from './agg';\r\nimport { genId } from './common';\r\n\r\ntype DomainPluginType = 'Setup' | 'HotSwap';\r\n\r\ntype DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;\r\n\r\nexport type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;\r\n\r\nexport type DomainSetupPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'Setup'>;\r\n readonly mount: (util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) => void;\r\n};\r\n\r\ntype DomainSetupPluginOptions<AGG extends DomainAgg> = ReturnType<DomainSetupPluginOptionsFn<AGG>>;\r\n\r\ntype DomainSetupPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'HotSwap'>;\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n readonly unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPluginOptions<AGG extends DomainAgg> = ReturnType<\r\n DomainHotSwapPluginOptionsFn<AGG>\r\n>;\r\n\r\nexport type DomainHotSwapPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\ntype SingletonPluginHelperApi<AGG extends DomainSingletonAgg<any, any, any>> = Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n}>;\r\n\r\ntype MultiInstancePluginHelperApi<AGG extends DomainMultiInstanceAgg<any, any, any, any>> =\r\n Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n onDestroy: (cb: (agg: AGG) => void) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n }>;\r\n\r\ntype PluginHelperApi<AGG extends DomainAgg> = AGG extends DomainMultiInstanceAgg<any, any, any, any>\r\n ? MultiInstancePluginHelperApi<AGG>\r\n : AGG extends DomainSingletonAgg<any, any, any>\r\n ? SingletonPluginHelperApi<AGG>\r\n : never;\r\n\r\nfunction createPluginHelper<AGG extends DomainAgg>(\r\n onDestroyFn?: (agg: AGG) => void\r\n): PluginHelperApi<AGG> {\r\n const setupPlugins: Record<string, DomainSetupPlugin<AGG>> = {};\r\n const hotSwapPlugins: Record<string, DomainHotSwapPlugin<AGG>> = {};\r\n const hotSwapPluginsCheck = new WeakMap<AGG, string[]>();\r\n const aggRecords: Record<string, AGG> = {};\r\n const customDestroyedHandlers: ((agg: AGG) => void)[] = [];\r\n\r\n return Object.freeze({\r\n registerAgg(agg: AGG) {\r\n if (agg.isInitialized.value) {\r\n throw new Error('Agg must register before initialized');\r\n } else if (aggRecords[agg.__id]) {\r\n throw new Error('Agg already registered');\r\n } else if (agg.type === 'MultiInstance') {\r\n agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n });\r\n }\r\n aggRecords[agg.__id] = agg;\r\n const applyedHotSwapPlugins: string[] = [];\r\n for (const p of Object.values(setupPlugins)) {\r\n p.mount({\r\n api: agg.api,\r\n __aggId: agg.__id,\r\n isInitialized: agg.isInitialized,\r\n });\r\n }\r\n for (const p of Object.values(hotSwapPlugins)) {\r\n p.mount({ api: agg.api, __aggId: agg.__id });\r\n applyedHotSwapPlugins.push(p.__id);\r\n }\r\n hotSwapPluginsCheck.set(agg, applyedHotSwapPlugins);\r\n\r\n if (isMultiInstanceAgg(agg)) {\r\n const handler = agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n onDestroyFn?.(agg);\r\n for (const fn of customDestroyedHandlers) {\r\n fn(agg);\r\n }\r\n handler?.();\r\n });\r\n }\r\n },\r\n onDestroy(cb: (agg: AGG) => void) {\r\n customDestroyedHandlers.push(cb);\r\n },\r\n createSetupPlugin(\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ): DomainSetupPlugin<AGG> {\r\n let opts: undefined | DomainSetupPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'Setup',\r\n mount(util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) {\r\n if (util.isInitialized.value) {\r\n throw new Error('Can not setup after initialized');\r\n }\r\n opts!.mount({ api: util.api, __aggId: util.__aggId });\r\n },\r\n });\r\n },\r\n createHotSwapPlugin(\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ): DomainHotSwapPlugin<AGG> {\r\n let opts: undefined | DomainHotSwapPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'HotSwap',\r\n mount: opts!.mount,\r\n unmount: opts!.unmount,\r\n });\r\n },\r\n registerPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n if (setupPlugins[plugin.__id]) {\r\n throw new Error('Plugin already registered');\r\n }\r\n setupPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n isInitialized: aggRecords[k].isInitialized,\r\n });\r\n }\r\n } else if (plugin.type === 'HotSwap') {\r\n hotSwapPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n !hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n hotSwapPluginsCheck.get(aggRecords[k])!.push(plugin.__id);\r\n }\r\n }\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n unregisterPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n throw new Error('Can not unregister setup plugin');\r\n } else if (plugin.type === 'HotSwap') {\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.unmount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id];\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n }) as PluginHelperApi<AGG>;\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainSingletonAgg<any, any, any>\r\n>(_: FUN): SingletonPluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainMultiInstanceAgg<any, any, any, any>\r\n>(_: FUN, onDestroy: (agg: ReturnType<FUN>) => void): MultiInstancePluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(\r\n _: FUN,\r\n onDestroy?: (agg: ReturnType<FUN>) => void\r\n) {\r\n return createPluginHelper<ReturnType<FUN>>(onDestroy);\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainSingletonAgg<any, any, any>>(_: AGG) {\r\n return createPluginHelper<AGG>();\r\n}\r\n\r\nfunction isMultiInstanceAgg(agg: DomainAgg): agg is DomainMultiInstanceAgg<any, any, any, any> {\r\n return agg.type === 'MultiInstance';\r\n}\r\n","import {\r\n type 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 ref,\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 { genId } from './common';\r\nimport { Deferred } from 'ts-deferred';\r\n\r\ntype AddDestroyedEvent<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainBroadcastEvent<{}> }\r\n : {\r\n [P in keyof T as P extends K ? 'destroyed' : P]: P extends K\r\n ? DomainBroadcastEvent<{}>\r\n : T[P];\r\n } & { destroyed: DomainBroadcastEvent<{}> };\r\ntype AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainDestroyedEventApi }\r\n : {\r\n [P in keyof T as P]: P extends K ? DomainBroadcastEvent<{}> : T[P];\r\n } & { destroyed: DomainDestroyedEventApi };\r\n\r\ntype InferDomainEvent<EVENT extends DomainEvent<any, any>> = EVENT extends DomainBroadcastEvent<\r\n infer DATA\r\n>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer REPLY_DATA>\r\n ? DomainRequestEvent<DATA, REPLY_DATA>\r\n : never;\r\ntype InferDomainEventApi<EVENT extends DomainEvent<any, any>> = InferDomainEvent<EVENT>['api'];\r\n\r\ntype CustomerStateRecords<T> = keyof T extends never ? {} : Record<string, object>;\r\ntype CustomerCommandRecords<T> = keyof T extends never ? {} : Record<string, Function>;\r\ntype CustomerEventRecords<T> = keyof T extends never\r\n ? {}\r\n : {\r\n [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n ? T[K]\r\n : never;\r\n };\r\nexport type DomainDestroyFunction = (...args: any[]) => void;\r\n\r\nexport type DomainStatesApi<STATES extends CustomerStateRecords<any>> = Readonly<{\r\n [K in keyof STATES]: DeepReadonly<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>> =\r\n EVENTS extends Record<string, DomainRequestEvent<any, any> | DomainBroadcastEvent<any>>\r\n ? Readonly<\r\n AddDestroyedEventApi<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n >\r\n : { destroyed: DomainDestroyedEventApi };\r\n\r\nexport type DomainMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainMultiInstanceEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n}>;\r\n\r\nexport type DomainSingletonAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n}>;\r\n\r\nexport function createMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS> {\r\n return createAggApiContent(option) as unknown as DomainMultiInstanceAggApi<\r\n STATES,\r\n COMMANDS,\r\n EVENTS\r\n >;\r\n}\r\n\r\nexport function createAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainSingletonAggApi<STATES, COMMANDS, EVENTS> {\r\n const apiContent = createAggApiContent(option);\r\n return shallowReadonly({\r\n states: apiContent.states,\r\n commands: apiContent.commands,\r\n events: apiContent.events,\r\n });\r\n}\r\n\r\nfunction createAggApiContent<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): {\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n} {\r\n const optionStates = option.states as Record<string, object>;\r\n for (const k of Object.keys(option.states)) {\r\n optionStates[k] = readonly(optionStates[k]);\r\n }\r\n const states = shallowReadonly(option.states) as DomainStatesApi<STATES>;\r\n const commands = readonly(option.commands) as DomainCommandsApi<COMMANDS>;\r\n const events = {} as DomainEventsApi<EVENTS>;\r\n const optionEvents = option.events as {\r\n [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any>;\r\n };\r\n for (const k in option.events) {\r\n (events as any)[k] = optionEvents[k].api;\r\n }\r\n return shallowReadonly({\r\n states,\r\n commands,\r\n events: shallowReadonly(events) as DomainEventsApi<EVENTS>,\r\n destroy: option.destroy,\r\n });\r\n}\r\n\r\nexport type DomainMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'MultiInstance';\r\n readonly id: ID;\r\n readonly api: DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport type DomainSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'Singleton';\r\n readonly api: DomainSingletonAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport function createMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n id: ID,\r\n init: (context: {\r\n getCurrentScope: () => EffectScope;\r\n onScopeDispose: (fn: () => void, failSilently?: boolean) => void;\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n destroy?: DomainDestroyFunction;\r\n }\r\n): DomainMultiInstanceAgg<ID, STATES, COMMANDS, EVENTS> {\r\n // 声明 生命周期 - init\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n setTimeout(() =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n throw e;\r\n })\r\n );\r\n const scope = effectScope();\r\n const result = scope.run(() =>\r\n init({\r\n getCurrentScope() {\r\n return scope;\r\n },\r\n onScopeDispose,\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n })\r\n )!;\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const eventsExt = (result.events || {}) as AddDestroyedEvent<EVENTS>;\r\n let destroyedEvent: DomainBroadcastEvent<{}> | undefined;\r\n if (!eventsExt.destroyed) {\r\n destroyedEvent = createBroadcastEvent({});\r\n eventsExt.destroyed = destroyedEvent;\r\n } else {\r\n destroyedEvent = eventsExt.destroyed;\r\n }\r\n\r\n let destroy = result.destroy as DomainDestroyFunction;\r\n if (!destroy) {\r\n destroy = (() => {\r\n destroyedEvent?.publish({});\r\n for (const k in eventsExt) {\r\n const event = eventsExt[k];\r\n (event as DomainEvent<any, any>).listeners.length = 0;\r\n // for (const handle of (event as DomainEvent<any, any>).listeners) {\r\n // handle()\r\n // }\r\n }\r\n scope.stop();\r\n }) as DomainDestroyFunction;\r\n }\r\n return shallowReadonly({\r\n __id: genId(),\r\n type: 'MultiInstance',\r\n id,\r\n api: createMultiInstanceAggApi({\r\n states,\r\n commands,\r\n events: eventsExt as unknown as EVENTS,\r\n destroy,\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n });\r\n}\r\n\r\nexport function createSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n init: (context: {\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n }\r\n): DomainSingletonAgg<STATES, COMMANDS, EVENTS> {\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n\r\n const result = init({\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n });\r\n setTimeout(\r\n () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n }),\r\n 0\r\n );\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const events = (result.events || {}) as EVENTS;\r\n return {\r\n __id: genId(),\r\n type: 'Singleton',\r\n api: createAggApi({\r\n states,\r\n commands,\r\n events,\r\n destroy: () => {},\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n };\r\n}\r\n"],"names":["createRequestEvent","_dataType","options","currentVersion","unconsumedEvent","listeners","updateEvent","data","resolve","reject","timerId","nextVer","largeNumberIncrease","emitEvent","event","version","context","listener","replyData","e","deferred","Deferred","replyFn","index","createBroadcastEvent","_","cb","num1","str1","str2","maxLength","carry","result","i","digit1","digit2","sum","genId","nanoid","createPluginHelper","onDestroyFn","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","customDestroyedHandlers","agg","applyedHotSwapPlugins","p","isMultiInstanceAgg","handler","fn","args","opts","util","plugin","k","createPluginHelperByAggCreator","onDestroy","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","readonly","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","ref","onBeforeInitialize","beforeInitializeTasks","scope","effectScope","onScopeDispose","computed","eventsExt","destroyedEvent","destroy","createSingletonAgg"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../libs/domain/event.ts","../../libs/domain/common.ts","../../libs/domain/plugin.ts","../../libs/domain/agg.ts"],"sourcesContent":["import { Deferred } from 'ts-deferred';\r\nimport { DeepReadonly, UnwrapNestedRefs } from 'vue';\r\n\r\nexport type DomainRequestEventOptions<DATA, ON_REPLY extends (data: any) => void> = {\r\n dataType?: DATA;\r\n onReply: ON_REPLY;\r\n onError?: (e: Error) => void;\r\n maxListenerCount?: number;\r\n isTerminateOnError?: boolean;\r\n timeoutMs?: number | false;\r\n};\r\nexport type DomainRequestEvent<DATA, REPLY_DATA> = {\r\n listeners: DomainRequestEventListener<DATA, REPLY_DATA>[];\r\n publishRequest: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => Promise<REPLY_DATA>;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listenAndReply: (replyFn: DomainRequestEventListener<DATA, REPLY_DATA>) => () => void;\r\n };\r\n};\r\nexport type DomainRequestEventListener<DATA, REPLY_DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => REPLY_DATA;\r\n\r\nexport type DomainBroadcastEvent<DATA> = {\r\n listeners: DomainBroadcastEventListener<DATA>[];\r\n publish: (data: DeepReadonly<UnwrapNestedRefs<DATA>>) => void;\r\n api: {\r\n latestVersion: Readonly<string>;\r\n listen: (\r\n cb: (event: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ) => () => void;\r\n };\r\n};\r\nexport type DomainBroadcastEventListener<DATA> = (param: {\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n version: string;\r\n}) => void;\r\n\r\nexport type DomainDestroyedEventApi = DomainBroadcastEvent<{}>['api'];\r\n\r\nexport type DomainEvent<DATA, REPLY_DATA> =\r\n | DomainRequestEvent<DATA, REPLY_DATA>\r\n | DomainBroadcastEvent<DATA>;\r\n\r\nexport function createRequestEvent<DATA extends object = {}>(_dataType?: DATA) {\r\n function options<ON_REPLY extends (replyData: any) => void, REPLY_DATA = Parameters<ON_REPLY>[0]>(\r\n options: DomainRequestEventOptions<DATA, ON_REPLY>\r\n ): DomainRequestEvent<DATA, REPLY_DATA> {\r\n let currentVersion = '0';\r\n let unconsumedEvent: {\r\n version: string;\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>;\r\n resolve: (data: REPLY_DATA) => void;\r\n reject: (e: Error) => void;\r\n timerId: NodeJS.Timeout | undefined;\r\n }[] = [];\r\n const listeners: DomainRequestEventListener<DATA, REPLY_DATA>[] = [];\r\n function updateEvent(\r\n data: DeepReadonly<UnwrapNestedRefs<DATA>>,\r\n resolve: (data: REPLY_DATA) => void,\r\n reject: (e: Error) => void,\r\n timerId: NodeJS.Timeout | undefined\r\n ) {\r\n const nextVer = largeNumberIncrease(currentVersion);\r\n currentVersion = nextVer;\r\n unconsumedEvent.push({\r\n version: nextVer,\r\n data,\r\n resolve,\r\n reject,\r\n timerId,\r\n });\r\n emitEvent();\r\n }\r\n function emitEvent() {\r\n if (unconsumedEvent.length === 0 || listeners.length === 0) {\r\n return;\r\n }\r\n for (const event of unconsumedEvent) {\r\n const { version, data, resolve, reject, timerId } = event;\r\n const context = {\r\n data,\r\n version,\r\n };\r\n for (const listener of listeners) {\r\n try {\r\n const replyData = listener(context);\r\n options.onReply(replyData);\r\n resolve(replyData);\r\n timerId && clearTimeout(timerId);\r\n // return await deferred.promise\r\n } catch (e: unknown) {\r\n if (options.onError && e instanceof Error) {\r\n options.onError(e);\r\n if (options.isTerminateOnError) {\r\n reject(e);\r\n timerId && clearTimeout(timerId);\r\n }\r\n } else {\r\n throw new Error('caught a unknown error' + (e?.toString() || e));\r\n }\r\n }\r\n }\r\n unconsumedEvent.shift();\r\n }\r\n }\r\n return {\r\n listeners,\r\n async publishRequest(data: DeepReadonly<UnwrapNestedRefs<DATA>>) {\r\n const deferred = new Deferred<REPLY_DATA>();\r\n let timerId: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs) {\r\n timerId = setTimeout(() => {\r\n deferred.reject(new Error(`timeout: ${options.timeoutMs} ms`));\r\n }, options.timeoutMs);\r\n }\r\n updateEvent(data, deferred.resolve, deferred.reject, timerId);\r\n return await deferred.promise;\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listenAndReply(replyFn: DomainRequestEventListener<DATA, REPLY_DATA>): () => void {\r\n if (options.maxListenerCount && listeners.length >= options.maxListenerCount) {\r\n throw new Error('too many listeners. max limit: ' + options.maxListenerCount);\r\n }\r\n listeners.push(replyFn);\r\n emitEvent();\r\n return () => {\r\n const index = listeners.indexOf(replyFn);\r\n if (index !== -1) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n options,\r\n };\r\n}\r\n\r\nexport function createBroadcastEvent<DATA extends object = {}>(\r\n _?: DATA\r\n): DomainBroadcastEvent<DATA> {\r\n let currentVersion = '0';\r\n const listeners: DomainBroadcastEventListener<DATA>[] = [];\r\n return {\r\n listeners,\r\n publish(data: DeepReadonly<UnwrapNestedRefs<DATA>>) {\r\n const context = {\r\n data,\r\n version: largeNumberIncrease(currentVersion),\r\n };\r\n currentVersion = context.version;\r\n for (const listener of listeners) {\r\n listener(context);\r\n }\r\n },\r\n api: {\r\n get latestVersion() {\r\n return currentVersion;\r\n },\r\n listen(\r\n cb: (options: { data: DeepReadonly<UnwrapNestedRefs<DATA>>; version: string }) => void\r\n ): () => void {\r\n listeners.push(cb);\r\n return () => {\r\n const index = listeners.indexOf(cb);\r\n if (index >= 0) {\r\n listeners.splice(index, 1);\r\n }\r\n };\r\n },\r\n },\r\n };\r\n}\r\n\r\nexport function largeNumberIncrease(num1: string): string {\r\n if (+num1 < Number.MAX_SAFE_INTEGER) {\r\n return (parseInt(num1) + 1).toString();\r\n }\r\n\r\n // 反转字符串以便从最低位开始相加\r\n let str1 = num1.split('').reverse().join('');\r\n let str2 = '1';\r\n\r\n const maxLength = Math.max(str1.length, str2.length);\r\n let carry = 0;\r\n let result = [];\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n const digit1 = i < str1.length ? parseInt(str1[i], 10) : 0;\r\n const digit2 = i < str2.length ? parseInt(str2[i], 10) : 0;\r\n\r\n const sum = digit1 + digit2 + carry;\r\n result.push(sum % 10); // 当前位的结果\r\n carry = Math.floor(sum / 10); // 计算进位\r\n }\r\n\r\n if (carry > 0) {\r\n result.push(carry);\r\n }\r\n\r\n // 反转结果并转换为字符串\r\n return result.reverse().join('');\r\n}\r\n","// import { nanoid } from 'nanoid';\r\n\r\nexport function genId(prefix = ''): string {\r\n // return nanoid();\r\n const ts = Date.now().toString(36);\r\n const rd = Math.random().toString(36).substring(2, 10);\r\n return `${prefix}${ts}${rd}`;\r\n}\r\n","import { ComputedRef } from 'vue';\r\nimport type { DomainSingletonAgg, DomainMultiInstanceAgg } from './agg';\r\nimport { genId } from './common';\r\n\r\ntype DomainPluginType = 'Setup' | 'HotSwap';\r\n\r\ntype DomainAgg = DomainSingletonAgg<any, any, any> | DomainMultiInstanceAgg<any, any, any, any>;\r\n\r\nexport type DomainPlugin<T extends DomainAgg> = DomainSetupPlugin<T> | DomainHotSwapPlugin<T>;\r\n\r\nexport type DomainSetupPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'Setup'>;\r\n readonly mount: (util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) => void;\r\n};\r\n\r\ntype DomainSetupPluginOptions<AGG extends DomainAgg> = ReturnType<DomainSetupPluginOptionsFn<AGG>>;\r\n\r\ntype DomainSetupPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPlugin<AGG extends DomainAgg> = {\r\n readonly __id: string;\r\n readonly type: Extract<DomainPluginType, 'HotSwap'>;\r\n readonly mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n readonly unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\nexport type DomainHotSwapPluginOptions<AGG extends DomainAgg> = ReturnType<\r\n DomainHotSwapPluginOptionsFn<AGG>\r\n>;\r\n\r\nexport type DomainHotSwapPluginOptionsFn<AGG extends DomainAgg> = () => {\r\n mount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n unmount: (util: { api: NonNullable<AGG>['api']; __aggId: string }) => void;\r\n};\r\n\r\ntype SingletonPluginHelperApi<AGG extends DomainSingletonAgg<any, any, any>> = Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n}>;\r\n\r\ntype MultiInstancePluginHelperApi<AGG extends DomainMultiInstanceAgg<any, any, any, any>> =\r\n Readonly<{\r\n registerAgg: (agg: AGG) => void;\r\n onDestroy: (cb: (agg: AGG) => void) => void;\r\n createSetupPlugin: (\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ) => DomainSetupPlugin<AGG>;\r\n createHotSwapPlugin: (\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ) => DomainHotSwapPlugin<AGG>;\r\n registerPlugin(plugin: DomainPlugin<AGG>): void;\r\n unregisterPlugin(plugin: DomainPlugin<AGG>): void;\r\n }>;\r\n\r\ntype PluginHelperApi<AGG extends DomainAgg> = AGG extends DomainMultiInstanceAgg<any, any, any, any>\r\n ? MultiInstancePluginHelperApi<AGG>\r\n : AGG extends DomainSingletonAgg<any, any, any>\r\n ? SingletonPluginHelperApi<AGG>\r\n : never;\r\n\r\nfunction createPluginHelper<AGG extends DomainAgg>(\r\n onDestroyFn?: (agg: AGG) => void\r\n): PluginHelperApi<AGG> {\r\n const setupPlugins: Record<string, DomainSetupPlugin<AGG>> = {};\r\n const hotSwapPlugins: Record<string, DomainHotSwapPlugin<AGG>> = {};\r\n const hotSwapPluginsCheck = new WeakMap<AGG, string[]>();\r\n const aggRecords: Record<string, AGG> = {};\r\n const customDestroyedHandlers: ((agg: AGG) => void)[] = [];\r\n\r\n return Object.freeze({\r\n registerAgg(agg: AGG) {\r\n if (agg.isInitialized.value) {\r\n throw new Error('Agg must register before initialized');\r\n } else if (aggRecords[agg.__id]) {\r\n throw new Error('Agg already registered');\r\n } else if (agg.type === 'MultiInstance') {\r\n agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n });\r\n }\r\n aggRecords[agg.__id] = agg;\r\n const applyedHotSwapPlugins: string[] = [];\r\n for (const p of Object.values(setupPlugins)) {\r\n p.mount({\r\n api: agg.api,\r\n __aggId: agg.__id,\r\n isInitialized: agg.isInitialized,\r\n });\r\n }\r\n for (const p of Object.values(hotSwapPlugins)) {\r\n p.mount({ api: agg.api, __aggId: agg.__id });\r\n applyedHotSwapPlugins.push(p.__id);\r\n }\r\n hotSwapPluginsCheck.set(agg, applyedHotSwapPlugins);\r\n\r\n if (isMultiInstanceAgg(agg)) {\r\n const handler = agg.api.events.destroyed.listen(() => {\r\n delete aggRecords[agg.__id];\r\n onDestroyFn?.(agg);\r\n for (const fn of customDestroyedHandlers) {\r\n fn(agg);\r\n }\r\n handler?.();\r\n });\r\n }\r\n },\r\n onDestroy(cb: (agg: AGG) => void) {\r\n customDestroyedHandlers.push(cb);\r\n },\r\n createSetupPlugin(\r\n args: DomainSetupPluginOptions<AGG> | DomainSetupPluginOptionsFn<AGG>\r\n ): DomainSetupPlugin<AGG> {\r\n let opts: undefined | DomainSetupPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'Setup',\r\n mount(util: {\r\n api: NonNullable<AGG>['api'];\r\n __aggId: string;\r\n isInitialized: ComputedRef<boolean>;\r\n }) {\r\n if (util.isInitialized.value) {\r\n throw new Error('Can not setup after initialized');\r\n }\r\n opts!.mount({ api: util.api, __aggId: util.__aggId });\r\n },\r\n });\r\n },\r\n createHotSwapPlugin(\r\n args: DomainHotSwapPluginOptions<AGG> | DomainHotSwapPluginOptionsFn<AGG>\r\n ): DomainHotSwapPlugin<AGG> {\r\n let opts: undefined | DomainHotSwapPluginOptions<AGG> = undefined;\r\n if (args instanceof Function) {\r\n opts = args();\r\n } else {\r\n opts = args;\r\n }\r\n return Object.freeze({\r\n __id: genId(),\r\n type: 'HotSwap',\r\n mount: opts!.mount,\r\n unmount: opts!.unmount,\r\n });\r\n },\r\n registerPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n if (setupPlugins[plugin.__id]) {\r\n throw new Error('Plugin already registered');\r\n }\r\n setupPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n isInitialized: aggRecords[k].isInitialized,\r\n });\r\n }\r\n } else if (plugin.type === 'HotSwap') {\r\n hotSwapPlugins[plugin.__id] = plugin;\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n !hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.mount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n hotSwapPluginsCheck.get(aggRecords[k])!.push(plugin.__id);\r\n }\r\n }\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n unregisterPlugin(plugin: DomainPlugin<AGG>) {\r\n if (plugin.type === 'Setup') {\r\n throw new Error('Can not unregister setup plugin');\r\n } else if (plugin.type === 'HotSwap') {\r\n for (const k in aggRecords) {\r\n if (\r\n hotSwapPluginsCheck.has(aggRecords[k]) &&\r\n hotSwapPluginsCheck.get(aggRecords[k])!.includes(plugin.__id)\r\n ) {\r\n plugin.unmount({\r\n api: aggRecords[k].api,\r\n __aggId: aggRecords[k].__id,\r\n });\r\n }\r\n }\r\n delete hotSwapPlugins[plugin.__id];\r\n } else {\r\n isNever(plugin);\r\n }\r\n },\r\n }) as PluginHelperApi<AGG>;\r\n}\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainSingletonAgg<any, any, any>\r\n>(_: FUN): SingletonPluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<\r\n FUN extends (...args: any[]) => DomainMultiInstanceAgg<any, any, any, any>\r\n>(_: FUN, onDestroy: (agg: ReturnType<FUN>) => void): MultiInstancePluginHelperApi<ReturnType<FUN>>;\r\n\r\nexport function createPluginHelperByAggCreator<FUN extends (...args: any[]) => DomainAgg>(\r\n _: FUN,\r\n onDestroy?: (agg: ReturnType<FUN>) => void\r\n) {\r\n return createPluginHelper<ReturnType<FUN>>(onDestroy);\r\n}\r\n\r\nexport function createPluginHelperByAgg<AGG extends DomainSingletonAgg<any, any, any>>(_: AGG) {\r\n return createPluginHelper<AGG>();\r\n}\r\n\r\nfunction isMultiInstanceAgg(agg: DomainAgg): agg is DomainMultiInstanceAgg<any, any, any, any> {\r\n return agg.type === 'MultiInstance';\r\n}\r\n","import {\r\n type 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 ref,\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 { genId } from './common';\r\nimport { Deferred } from 'ts-deferred';\r\n\r\ntype AddDestroyedEvent<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainBroadcastEvent<{}> }\r\n : {\r\n [P in keyof T as P extends K ? 'destroyed' : P]: P extends K\r\n ? DomainBroadcastEvent<{}>\r\n : T[P];\r\n } & { destroyed: DomainBroadcastEvent<{}> };\r\ntype AddDestroyedEventApi<T extends object, K = 'destroyed'> = keyof T extends never\r\n ? { destroyed: DomainDestroyedEventApi }\r\n : {\r\n [P in keyof T as P]: P extends K ? DomainBroadcastEvent<{}> : T[P];\r\n } & { destroyed: DomainDestroyedEventApi };\r\n\r\ntype InferDomainEvent<EVENT extends DomainEvent<any, any>> = EVENT extends DomainBroadcastEvent<\r\n infer DATA\r\n>\r\n ? DomainBroadcastEvent<DATA>\r\n : EVENT extends DomainRequestEvent<infer DATA, infer REPLY_DATA>\r\n ? DomainRequestEvent<DATA, REPLY_DATA>\r\n : never;\r\ntype InferDomainEventApi<EVENT extends DomainEvent<any, any>> = InferDomainEvent<EVENT>['api'];\r\n\r\ntype CustomerStateRecords<T> = keyof T extends never ? {} : Record<string, object>;\r\ntype CustomerCommandRecords<T> = keyof T extends never ? {} : Record<string, Function>;\r\ntype CustomerEventRecords<T> = keyof T extends never\r\n ? {}\r\n : {\r\n [K in keyof T]: T[K] extends DomainRequestEvent<any, any> | DomainBroadcastEvent<any>\r\n ? T[K]\r\n : never;\r\n };\r\nexport type DomainDestroyFunction = (...args: any[]) => void;\r\n\r\nexport type DomainStatesApi<STATES extends CustomerStateRecords<any>> = Readonly<{\r\n [K in keyof STATES]: DeepReadonly<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>> =\r\n EVENTS extends Record<string, DomainRequestEvent<any, any> | DomainBroadcastEvent<any>>\r\n ? Readonly<\r\n AddDestroyedEventApi<{\r\n [K in keyof EVENTS as K]: InferDomainEventApi<EVENTS[K]>;\r\n }>\r\n >\r\n : { destroyed: DomainDestroyedEventApi };\r\n\r\nexport type DomainMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainMultiInstanceEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n}>;\r\n\r\nexport type DomainSingletonAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = Readonly<{\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n}>;\r\n\r\nexport function createMultiInstanceAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS> {\r\n return createAggApiContent(option) as unknown as DomainMultiInstanceAggApi<\r\n STATES,\r\n COMMANDS,\r\n EVENTS\r\n >;\r\n}\r\n\r\nexport function createAggApi<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): DomainSingletonAggApi<STATES, COMMANDS, EVENTS> {\r\n const apiContent = createAggApiContent(option);\r\n return shallowReadonly({\r\n states: apiContent.states,\r\n commands: apiContent.commands,\r\n events: apiContent.events,\r\n });\r\n}\r\n\r\nfunction createAggApiContent<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(option: {\r\n states: STATES;\r\n commands: COMMANDS;\r\n events: EVENTS;\r\n destroy: DomainDestroyFunction;\r\n}): {\r\n states: DomainStatesApi<STATES>;\r\n commands: DomainCommandsApi<COMMANDS>;\r\n events: DomainEventsApi<EVENTS>;\r\n destroy: DomainDestroyFunction;\r\n} {\r\n const optionStates = option.states as Record<string, object>;\r\n for (const k of Object.keys(option.states)) {\r\n optionStates[k] = readonly(optionStates[k]);\r\n }\r\n const states = shallowReadonly(option.states) as DomainStatesApi<STATES>;\r\n const commands = readonly(option.commands) as DomainCommandsApi<COMMANDS>;\r\n const events = {} as DomainEventsApi<EVENTS>;\r\n const optionEvents = option.events as {\r\n [k: string]: DomainRequestEvent<any, any> | DomainBroadcastEvent<any>;\r\n };\r\n for (const k in option.events) {\r\n (events as any)[k] = optionEvents[k].api;\r\n }\r\n return shallowReadonly({\r\n states,\r\n commands,\r\n events: shallowReadonly(events) as DomainEventsApi<EVENTS>,\r\n destroy: option.destroy,\r\n });\r\n}\r\n\r\nexport type DomainMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'MultiInstance';\r\n readonly id: ID;\r\n readonly api: DomainMultiInstanceAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport type DomainSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n> = {\r\n readonly __id: string;\r\n readonly type: 'Singleton';\r\n readonly api: DomainSingletonAggApi<STATES, COMMANDS, EVENTS>;\r\n readonly isInitialized: ComputedRef<boolean>;\r\n readonly untilInitialized: () => Promise<void>;\r\n};\r\n\r\nexport function createMultiInstanceAgg<\r\n ID,\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n id: ID,\r\n init: (context: {\r\n getCurrentScope: () => EffectScope;\r\n onScopeDispose: (fn: () => void, failSilently?: boolean) => void;\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n destroy?: DomainDestroyFunction;\r\n }\r\n): DomainMultiInstanceAgg<ID, STATES, COMMANDS, EVENTS> {\r\n // 声明 生命周期 - init\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n setTimeout(() =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n throw e;\r\n })\r\n );\r\n const scope = effectScope();\r\n const result = scope.run(() =>\r\n init({\r\n getCurrentScope() {\r\n return scope;\r\n },\r\n onScopeDispose,\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n })\r\n )!;\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const eventsExt = (result.events || {}) as AddDestroyedEvent<EVENTS>;\r\n let destroyedEvent: DomainBroadcastEvent<{}> | undefined;\r\n if (!eventsExt.destroyed) {\r\n destroyedEvent = createBroadcastEvent({});\r\n eventsExt.destroyed = destroyedEvent;\r\n } else {\r\n destroyedEvent = eventsExt.destroyed;\r\n }\r\n\r\n let destroy = result.destroy as DomainDestroyFunction;\r\n if (!destroy) {\r\n destroy = (() => {\r\n destroyedEvent?.publish({});\r\n for (const k in eventsExt) {\r\n const event = eventsExt[k];\r\n (event as DomainEvent<any, any>).listeners.length = 0;\r\n // for (const handle of (event as DomainEvent<any, any>).listeners) {\r\n // handle()\r\n // }\r\n }\r\n scope.stop();\r\n }) as DomainDestroyFunction;\r\n }\r\n return shallowReadonly({\r\n __id: genId(),\r\n type: 'MultiInstance',\r\n id,\r\n api: createMultiInstanceAggApi({\r\n states,\r\n commands,\r\n events: eventsExt as unknown as EVENTS,\r\n destroy,\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n });\r\n}\r\n\r\nexport function createSingletonAgg<\r\n STATES extends CustomerStateRecords<STATES>,\r\n COMMANDS extends CustomerCommandRecords<COMMANDS>,\r\n EVENTS extends CustomerEventRecords<EVENTS>\r\n>(\r\n init: (context: {\r\n onCreated: (fn: () => void) => void;\r\n onBeforeInitialize: (fn: () => void) => void;\r\n isInitialized: ComputedRef<boolean>;\r\n untilInitialized: Promise<void>;\r\n }) => {\r\n states?: STATES;\r\n commands?: COMMANDS;\r\n events?: EVENTS;\r\n }\r\n): DomainSingletonAgg<STATES, COMMANDS, EVENTS> {\r\n const {\r\n resolve: initialize,\r\n reject: onInitializeError,\r\n promise: untilInitialized,\r\n } = new Deferred<void>();\r\n let isInitialized = ref(false);\r\n function onBeforeInitialize(fn: () => void) {\r\n if (isInitialized.value === true) {\r\n throw new Error('Agg already initialized');\r\n }\r\n beforeInitializeTasks.push(fn());\r\n }\r\n const beforeInitializeTasks: (void | Promise<void>)[] = [];\r\n\r\n const result = init({\r\n onCreated(fn: () => void) {\r\n Promise.resolve().then(fn);\r\n },\r\n onBeforeInitialize,\r\n isInitialized: computed(() => isInitialized.value),\r\n untilInitialized,\r\n });\r\n setTimeout(\r\n () =>\r\n Promise.all(beforeInitializeTasks)\r\n .then(() => {\r\n initialize();\r\n isInitialized.value = true;\r\n })\r\n .catch((e: Error) => {\r\n onInitializeError(e);\r\n }),\r\n 0\r\n );\r\n\r\n const states = (result.states || {}) as STATES;\r\n const commands = (result.commands || {}) as COMMANDS;\r\n const events = (result.events || {}) as EVENTS;\r\n return {\r\n __id: genId(),\r\n type: 'Singleton',\r\n api: createAggApi({\r\n states,\r\n commands,\r\n events,\r\n destroy: () => {},\r\n }),\r\n isInitialized: computed(() => isInitialized.value),\r\n async untilInitialized() {\r\n return await untilInitialized.catch((e: Error) => {\r\n throw new Error(`Failed to initialize Agg: ${e.message}\\nStack : ${e.stack || 'unkown'}`);\r\n });\r\n },\r\n };\r\n}\r\n"],"names":["createRequestEvent","_dataType","options","currentVersion","unconsumedEvent","listeners","updateEvent","data","resolve","reject","timerId","nextVer","largeNumberIncrease","emitEvent","event","version","context","listener","replyData","e","deferred","Deferred","replyFn","index","createBroadcastEvent","_","cb","num1","str1","str2","maxLength","carry","result","i","digit1","digit2","sum","genId","prefix","ts","rd","createPluginHelper","onDestroyFn","setupPlugins","hotSwapPlugins","hotSwapPluginsCheck","aggRecords","customDestroyedHandlers","agg","applyedHotSwapPlugins","p","isMultiInstanceAgg","handler","fn","args","opts","util","plugin","k","createPluginHelperByAggCreator","onDestroy","createPluginHelperByAgg","createMultiInstanceAggApi","option","createAggApiContent","createAggApi","apiContent","shallowReadonly","optionStates","readonly","states","commands","events","optionEvents","createMultiInstanceAgg","id","init","initialize","onInitializeError","untilInitialized","isInitialized","ref","onBeforeInitialize","beforeInitializeTasks","scope","effectScope","onScopeDispose","computed","eventsExt","destroyedEvent","destroy","createSingletonAgg"],"mappings":"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"}
@@ -1 +1 @@
1
- export declare function genId(): string;
1
+ export declare function genId(prefix?: string): string;