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.
- package/domain/common.d.ts +1 -1
- package/domain/index.mjs +107 -106
- package/domain/index.mjs.map +1 -1
- package/domain-server/common.d.ts +1 -1
- package/domain-server/index.mjs +107 -106
- package/domain-server/index.mjs.map +1 -1
- package/index-Dhhr_iXc.js +30 -0
- package/index-Dhhr_iXc.js.map +1 -0
- package/package.json +1 -2
- package/index.browser-DzRLzC85.js +0 -38
- package/index.browser-DzRLzC85.js.map +0 -1
package/domain/common.d.ts
CHANGED
|
@@ -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
|
|
2
|
-
import { ref as z, computed as
|
|
3
|
-
function
|
|
4
|
-
function
|
|
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(
|
|
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:
|
|
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
|
|
20
|
-
const { version: l, data: m, resolve: u, reject: f, timerId: _ } =
|
|
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
|
-
|
|
27
|
+
r.onReply(p), u(p), _ && clearTimeout(_);
|
|
28
28
|
} catch (p) {
|
|
29
|
-
if (
|
|
30
|
-
|
|
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(
|
|
39
|
+
async publishRequest(o) {
|
|
40
40
|
const l = new w.Deferred();
|
|
41
41
|
let m;
|
|
42
|
-
return
|
|
43
|
-
l.reject(new Error(`timeout: ${
|
|
44
|
-
},
|
|
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(
|
|
51
|
-
if (
|
|
52
|
-
throw new Error("too many listeners. max limit: " +
|
|
53
|
-
return a.push(
|
|
54
|
-
const l = a.indexOf(
|
|
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:
|
|
62
|
+
options: s
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
-
function
|
|
66
|
-
let
|
|
67
|
-
const
|
|
65
|
+
function P(i) {
|
|
66
|
+
let s = "0";
|
|
67
|
+
const r = [];
|
|
68
68
|
return {
|
|
69
|
-
listeners:
|
|
69
|
+
listeners: r,
|
|
70
70
|
publish(c) {
|
|
71
71
|
const t = {
|
|
72
72
|
data: c,
|
|
73
|
-
version: E(
|
|
73
|
+
version: E(s)
|
|
74
74
|
};
|
|
75
|
-
|
|
76
|
-
for (const a of
|
|
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
|
|
81
|
+
return s;
|
|
82
82
|
},
|
|
83
83
|
listen(c) {
|
|
84
|
-
return
|
|
85
|
-
const t =
|
|
86
|
-
t >= 0 &&
|
|
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(
|
|
93
|
-
if (+
|
|
94
|
-
return (parseInt(
|
|
95
|
-
let
|
|
96
|
-
const c = Math.max(
|
|
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 <
|
|
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
|
-
|
|
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(
|
|
112
|
-
const
|
|
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
|
|
124
|
-
|
|
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
|
|
130
|
-
|
|
131
|
-
if (c.set(e, n),
|
|
132
|
-
const
|
|
133
|
-
delete t[e.__id],
|
|
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
|
-
|
|
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(
|
|
149
|
-
if (
|
|
149
|
+
mount(o) {
|
|
150
|
+
if (o.isInitialized.value)
|
|
150
151
|
throw new Error("Can not setup after initialized");
|
|
151
|
-
n.mount({ api:
|
|
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 (
|
|
167
|
+
if (s[e.__id])
|
|
167
168
|
throw new Error("Plugin already registered");
|
|
168
|
-
|
|
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
|
-
|
|
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
|
|
195
|
+
delete r[e.__id];
|
|
195
196
|
} else
|
|
196
197
|
isNever(e);
|
|
197
198
|
}
|
|
198
199
|
});
|
|
199
200
|
}
|
|
200
|
-
function
|
|
201
|
-
return S(
|
|
201
|
+
function H(i, s) {
|
|
202
|
+
return S(s);
|
|
202
203
|
}
|
|
203
|
-
function
|
|
204
|
+
function $(i) {
|
|
204
205
|
return S();
|
|
205
206
|
}
|
|
206
|
-
function
|
|
207
|
-
return
|
|
207
|
+
function x(i) {
|
|
208
|
+
return i.type === "MultiInstance";
|
|
208
209
|
}
|
|
209
|
-
function
|
|
210
|
-
return A(
|
|
210
|
+
function j(i) {
|
|
211
|
+
return A(i);
|
|
211
212
|
}
|
|
212
|
-
function
|
|
213
|
-
const
|
|
213
|
+
function M(i) {
|
|
214
|
+
const s = A(i);
|
|
214
215
|
return v({
|
|
215
|
-
states:
|
|
216
|
-
commands:
|
|
217
|
-
events:
|
|
216
|
+
states: s.states,
|
|
217
|
+
commands: s.commands,
|
|
218
|
+
events: s.events
|
|
218
219
|
});
|
|
219
220
|
}
|
|
220
|
-
function A(
|
|
221
|
-
const
|
|
222
|
-
for (const e of Object.keys(
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
for (const e in
|
|
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:
|
|
229
|
+
states: r,
|
|
229
230
|
commands: c,
|
|
230
231
|
events: v(t),
|
|
231
|
-
destroy:
|
|
232
|
+
destroy: i.destroy
|
|
232
233
|
});
|
|
233
234
|
}
|
|
234
|
-
function
|
|
235
|
+
function R(i, s) {
|
|
235
236
|
const {
|
|
236
|
-
resolve:
|
|
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
|
-
|
|
250
|
+
r(), a.value = !0;
|
|
250
251
|
}).catch((d) => {
|
|
251
252
|
throw c(d), d;
|
|
252
253
|
})
|
|
253
254
|
);
|
|
254
|
-
const
|
|
255
|
-
() =>
|
|
255
|
+
const o = k(), l = o.run(
|
|
256
|
+
() => s({
|
|
256
257
|
getCurrentScope() {
|
|
257
|
-
return
|
|
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:
|
|
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 : (_ =
|
|
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
|
-
|
|
278
|
+
o.stop();
|
|
278
279
|
}), v({
|
|
279
280
|
__id: y(),
|
|
280
281
|
type: "MultiInstance",
|
|
281
|
-
id:
|
|
282
|
-
api:
|
|
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:
|
|
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
|
|
298
|
+
function B(i) {
|
|
298
299
|
const {
|
|
299
|
-
resolve:
|
|
300
|
-
reject:
|
|
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 =
|
|
310
|
+
const e = [], n = i({
|
|
310
311
|
onCreated(u) {
|
|
311
312
|
Promise.resolve().then(u);
|
|
312
313
|
},
|
|
313
314
|
onBeforeInitialize: a,
|
|
314
|
-
isInitialized:
|
|
315
|
+
isInitialized: g(() => t.value),
|
|
315
316
|
untilInitialized: c
|
|
316
317
|
});
|
|
317
318
|
setTimeout(
|
|
318
319
|
() => Promise.all(e).then(() => {
|
|
319
|
-
|
|
320
|
+
s(), t.value = !0;
|
|
320
321
|
}).catch((u) => {
|
|
321
|
-
|
|
322
|
+
r(u);
|
|
322
323
|
}),
|
|
323
324
|
0
|
|
324
325
|
);
|
|
325
|
-
const
|
|
326
|
+
const o = n.states || {}, l = n.commands || {}, m = n.events || {};
|
|
326
327
|
return {
|
|
327
328
|
__id: y(),
|
|
328
329
|
type: "Singleton",
|
|
329
|
-
api:
|
|
330
|
-
states:
|
|
330
|
+
api: M({
|
|
331
|
+
states: o,
|
|
331
332
|
commands: l,
|
|
332
333
|
events: m,
|
|
333
334
|
destroy: () => {
|
|
334
335
|
}
|
|
335
336
|
}),
|
|
336
|
-
isInitialized:
|
|
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
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
package/domain/index.mjs.map
CHANGED
|
@@ -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;
|