@furystack/cross-node-bus 1.0.0
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/CHANGELOG.md +78 -0
- package/README.md +49 -0
- package/esm/cross-node-bus-telemetry.d.ts +74 -0
- package/esm/cross-node-bus-telemetry.d.ts.map +1 -0
- package/esm/cross-node-bus-telemetry.js +28 -0
- package/esm/cross-node-bus-telemetry.js.map +1 -0
- package/esm/cross-node-bus-telemetry.spec.d.ts +2 -0
- package/esm/cross-node-bus-telemetry.spec.d.ts.map +1 -0
- package/esm/cross-node-bus-telemetry.spec.js +115 -0
- package/esm/cross-node-bus-telemetry.spec.js.map +1 -0
- package/esm/cross-node-bus.d.ts +78 -0
- package/esm/cross-node-bus.d.ts.map +1 -0
- package/esm/cross-node-bus.js +18 -0
- package/esm/cross-node-bus.js.map +1 -0
- package/esm/cross-node-bus.spec.d.ts +2 -0
- package/esm/cross-node-bus.spec.d.ts.map +1 -0
- package/esm/cross-node-bus.spec.js +123 -0
- package/esm/cross-node-bus.spec.js.map +1 -0
- package/esm/define-in-process-cross-node-bus.d.ts +26 -0
- package/esm/define-in-process-cross-node-bus.d.ts.map +1 -0
- package/esm/define-in-process-cross-node-bus.js +27 -0
- package/esm/define-in-process-cross-node-bus.js.map +1 -0
- package/esm/errors.d.ts +21 -0
- package/esm/errors.d.ts.map +1 -0
- package/esm/errors.js +30 -0
- package/esm/errors.js.map +1 -0
- package/esm/errors.spec.d.ts +2 -0
- package/esm/errors.spec.d.ts.map +1 -0
- package/esm/errors.spec.js +30 -0
- package/esm/errors.spec.js.map +1 -0
- package/esm/in-process-cross-node-bus.d.ts +58 -0
- package/esm/in-process-cross-node-bus.d.ts.map +1 -0
- package/esm/in-process-cross-node-bus.js +196 -0
- package/esm/in-process-cross-node-bus.js.map +1 -0
- package/esm/in-process-cross-node-bus.spec.d.ts +2 -0
- package/esm/in-process-cross-node-bus.spec.d.ts.map +1 -0
- package/esm/in-process-cross-node-bus.spec.js +737 -0
- package/esm/in-process-cross-node-bus.spec.js.map +1 -0
- package/esm/index.d.ts +8 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +7 -0
- package/esm/index.js.map +1 -0
- package/esm/memory-broker.d.ts +74 -0
- package/esm/memory-broker.d.ts.map +1 -0
- package/esm/memory-broker.js +156 -0
- package/esm/memory-broker.js.map +1 -0
- package/esm/memory-broker.spec.d.ts +2 -0
- package/esm/memory-broker.spec.d.ts.map +1 -0
- package/esm/memory-broker.spec.js +497 -0
- package/esm/memory-broker.spec.js.map +1 -0
- package/esm/testing/create-in-process-bus-network.d.ts +49 -0
- package/esm/testing/create-in-process-bus-network.d.ts.map +1 -0
- package/esm/testing/create-in-process-bus-network.js +54 -0
- package/esm/testing/create-in-process-bus-network.js.map +1 -0
- package/esm/testing/create-in-process-bus-network.spec.d.ts +2 -0
- package/esm/testing/create-in-process-bus-network.spec.d.ts.map +1 -0
- package/esm/testing/create-in-process-bus-network.spec.js +142 -0
- package/esm/testing/create-in-process-bus-network.spec.js.map +1 -0
- package/esm/testing/index.d.ts +2 -0
- package/esm/testing/index.d.ts.map +1 -0
- package/esm/testing/index.js +2 -0
- package/esm/testing/index.js.map +1 -0
- package/esm/types.d.ts +35 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/package.json +56 -0
- package/src/cross-node-bus-telemetry.spec.ts +44 -0
- package/src/cross-node-bus-telemetry.ts +69 -0
- package/src/cross-node-bus.spec.ts +41 -0
- package/src/cross-node-bus.ts +92 -0
- package/src/define-in-process-cross-node-bus.ts +38 -0
- package/src/errors.spec.ts +32 -0
- package/src/errors.ts +38 -0
- package/src/in-process-cross-node-bus.spec.ts +428 -0
- package/src/in-process-cross-node-bus.ts +248 -0
- package/src/index.ts +7 -0
- package/src/memory-broker.spec.ts +282 -0
- package/src/memory-broker.ts +199 -0
- package/src/testing/create-in-process-bus-network.spec.ts +73 -0
- package/src/testing/create-in-process-bus-network.ts +87 -0
- package/src/testing/index.ts +1 -0
- package/src/types.ts +35 -0
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
54
|
+
import { ReplayWindowExceededError } from './errors.js';
|
|
55
|
+
import { MemoryBroker } from './memory-broker.js';
|
|
56
|
+
const collect = async (iterable) => {
|
|
57
|
+
const out = [];
|
|
58
|
+
for await (const message of iterable)
|
|
59
|
+
out.push(message);
|
|
60
|
+
return out;
|
|
61
|
+
};
|
|
62
|
+
describe('MemoryBroker', () => {
|
|
63
|
+
describe('constructor', () => {
|
|
64
|
+
it('rejects non-positive replayWindow', () => {
|
|
65
|
+
expect(() => new MemoryBroker({ replayWindow: 0 })).toThrow(RangeError);
|
|
66
|
+
expect(() => new MemoryBroker({ replayWindow: -1 })).toThrow(RangeError);
|
|
67
|
+
expect(() => new MemoryBroker({ replayWindow: 1.5 })).toThrow(RangeError);
|
|
68
|
+
});
|
|
69
|
+
it('exposes the configured replayWindow', () => {
|
|
70
|
+
const broker = new MemoryBroker({ replayWindow: 42 });
|
|
71
|
+
expect(broker.replayWindow).toBe(42);
|
|
72
|
+
});
|
|
73
|
+
it('defaults replayWindow to 1000', () => {
|
|
74
|
+
const broker = new MemoryBroker();
|
|
75
|
+
expect(broker.replayWindow).toBe(1000);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('publish + subscribe', () => {
|
|
79
|
+
it('delivers messages to every subscriber on the topic', () => {
|
|
80
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
81
|
+
try {
|
|
82
|
+
const broker = __addDisposableResource(env_1, new MemoryBroker(), false);
|
|
83
|
+
const a = vi.fn();
|
|
84
|
+
const b = vi.fn();
|
|
85
|
+
const _subA = __addDisposableResource(env_1, broker.subscribe('topic', a), false);
|
|
86
|
+
const _subB = __addDisposableResource(env_1, broker.subscribe('topic', b), false);
|
|
87
|
+
const message = broker.publish('topic', 'origin-1', { x: 1 });
|
|
88
|
+
expect(a).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect(b).toHaveBeenCalledTimes(1);
|
|
90
|
+
expect(a.mock.calls[0]?.[0]).toBe(message);
|
|
91
|
+
}
|
|
92
|
+
catch (e_1) {
|
|
93
|
+
env_1.error = e_1;
|
|
94
|
+
env_1.hasError = true;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
__disposeResources(env_1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
it('does not deliver across topics', () => {
|
|
101
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
102
|
+
try {
|
|
103
|
+
const broker = __addDisposableResource(env_2, new MemoryBroker(), false);
|
|
104
|
+
const handler = vi.fn();
|
|
105
|
+
const _sub = __addDisposableResource(env_2, broker.subscribe('topic-a', handler), false);
|
|
106
|
+
broker.publish('topic-b', 'origin-1', null);
|
|
107
|
+
expect(handler).not.toHaveBeenCalled();
|
|
108
|
+
}
|
|
109
|
+
catch (e_2) {
|
|
110
|
+
env_2.error = e_2;
|
|
111
|
+
env_2.hasError = true;
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
__disposeResources(env_2);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it('stamps version, originId, payload, ISO emittedAt and monotonic seq', () => {
|
|
118
|
+
const env_3 = { stack: [], error: void 0, hasError: false };
|
|
119
|
+
try {
|
|
120
|
+
const broker = __addDisposableResource(env_3, new MemoryBroker(), false);
|
|
121
|
+
const m1 = broker.publish('topic', 'origin-1', { n: 1 });
|
|
122
|
+
const m2 = broker.publish('topic', 'origin-2', { n: 2 });
|
|
123
|
+
expect(m1.v).toBe(1);
|
|
124
|
+
expect(m1.originId).toBe('origin-1');
|
|
125
|
+
expect(m1.payload).toEqual({ n: 1 });
|
|
126
|
+
expect(m1.seq).toBe('1');
|
|
127
|
+
expect(m2.seq).toBe('2');
|
|
128
|
+
expect(Number.isFinite(Date.parse(m1.emittedAt))).toBe(true);
|
|
129
|
+
}
|
|
130
|
+
catch (e_3) {
|
|
131
|
+
env_3.error = e_3;
|
|
132
|
+
env_3.hasError = true;
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
__disposeResources(env_3);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
it('keeps sequence counters per-topic', () => {
|
|
139
|
+
const env_4 = { stack: [], error: void 0, hasError: false };
|
|
140
|
+
try {
|
|
141
|
+
const broker = __addDisposableResource(env_4, new MemoryBroker(), false);
|
|
142
|
+
const a1 = broker.publish('a', 'o', null);
|
|
143
|
+
const b1 = broker.publish('b', 'o', null);
|
|
144
|
+
const a2 = broker.publish('a', 'o', null);
|
|
145
|
+
expect(a1.seq).toBe('1');
|
|
146
|
+
expect(b1.seq).toBe('1');
|
|
147
|
+
expect(a2.seq).toBe('2');
|
|
148
|
+
}
|
|
149
|
+
catch (e_4) {
|
|
150
|
+
env_4.error = e_4;
|
|
151
|
+
env_4.hasError = true;
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
__disposeResources(env_4);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
it('removes the subscriber on dispose', () => {
|
|
158
|
+
const env_5 = { stack: [], error: void 0, hasError: false };
|
|
159
|
+
try {
|
|
160
|
+
const broker = __addDisposableResource(env_5, new MemoryBroker(), false);
|
|
161
|
+
const handler = vi.fn();
|
|
162
|
+
const sub = broker.subscribe('topic', handler);
|
|
163
|
+
sub[Symbol.dispose]();
|
|
164
|
+
broker.publish('topic', 'origin-1', null);
|
|
165
|
+
expect(handler).not.toHaveBeenCalled();
|
|
166
|
+
}
|
|
167
|
+
catch (e_5) {
|
|
168
|
+
env_5.error = e_5;
|
|
169
|
+
env_5.hasError = true;
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
__disposeResources(env_5);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
it('isolates one subscriber from another that throws', () => {
|
|
176
|
+
const env_6 = { stack: [], error: void 0, hasError: false };
|
|
177
|
+
try {
|
|
178
|
+
const broker = __addDisposableResource(env_6, new MemoryBroker(), false);
|
|
179
|
+
const ok = vi.fn();
|
|
180
|
+
const onError = vi.fn();
|
|
181
|
+
const failing = vi.fn(() => {
|
|
182
|
+
throw new Error('boom');
|
|
183
|
+
});
|
|
184
|
+
const _subA = __addDisposableResource(env_6, broker.subscribe('topic', failing), false);
|
|
185
|
+
const _subB = __addDisposableResource(env_6, broker.subscribe('topic', ok), false);
|
|
186
|
+
broker.publish('topic', 'origin-1', null, onError);
|
|
187
|
+
expect(ok).toHaveBeenCalledTimes(1);
|
|
188
|
+
expect(onError).toHaveBeenCalledTimes(1);
|
|
189
|
+
expect(onError.mock.calls[0]?.[0]).toBeInstanceOf(Error);
|
|
190
|
+
expect(onError.mock.calls[0]?.[1]).toBe(failing);
|
|
191
|
+
}
|
|
192
|
+
catch (e_6) {
|
|
193
|
+
env_6.error = e_6;
|
|
194
|
+
env_6.hasError = true;
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
__disposeResources(env_6);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
it('falls back to console.error when no error sink is provided', () => {
|
|
201
|
+
const env_7 = { stack: [], error: void 0, hasError: false };
|
|
202
|
+
try {
|
|
203
|
+
const broker = __addDisposableResource(env_7, new MemoryBroker(), false);
|
|
204
|
+
const error = vi.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
205
|
+
try {
|
|
206
|
+
const env_8 = { stack: [], error: void 0, hasError: false };
|
|
207
|
+
try {
|
|
208
|
+
const _sub = __addDisposableResource(env_8, broker.subscribe('topic', () => {
|
|
209
|
+
throw new Error('boom');
|
|
210
|
+
}), false);
|
|
211
|
+
broker.publish('topic', 'origin-1', null);
|
|
212
|
+
expect(error).toHaveBeenCalledTimes(1);
|
|
213
|
+
}
|
|
214
|
+
catch (e_7) {
|
|
215
|
+
env_8.error = e_7;
|
|
216
|
+
env_8.hasError = true;
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
__disposeResources(env_8);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
error.mockRestore();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (e_8) {
|
|
227
|
+
env_7.error = e_8;
|
|
228
|
+
env_7.hasError = true;
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
__disposeResources(env_7);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('replay', () => {
|
|
236
|
+
it('yields messages with seq greater than fromSeq', async () => {
|
|
237
|
+
const env_9 = { stack: [], error: void 0, hasError: false };
|
|
238
|
+
try {
|
|
239
|
+
const broker = __addDisposableResource(env_9, new MemoryBroker(), false);
|
|
240
|
+
broker.publish('topic', 'origin-1', { n: 1 });
|
|
241
|
+
broker.publish('topic', 'origin-1', { n: 2 });
|
|
242
|
+
broker.publish('topic', 'origin-1', { n: 3 });
|
|
243
|
+
const yielded = await collect(broker.replay('topic', '1'));
|
|
244
|
+
expect(yielded.map((m) => m.seq)).toEqual(['2', '3']);
|
|
245
|
+
}
|
|
246
|
+
catch (e_9) {
|
|
247
|
+
env_9.error = e_9;
|
|
248
|
+
env_9.hasError = true;
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
__disposeResources(env_9);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
it('returns an empty stream when nothing has been published', async () => {
|
|
255
|
+
const env_10 = { stack: [], error: void 0, hasError: false };
|
|
256
|
+
try {
|
|
257
|
+
const broker = __addDisposableResource(env_10, new MemoryBroker(), false);
|
|
258
|
+
const yielded = await collect(broker.replay('topic', '0'));
|
|
259
|
+
expect(yielded).toEqual([]);
|
|
260
|
+
}
|
|
261
|
+
catch (e_10) {
|
|
262
|
+
env_10.error = e_10;
|
|
263
|
+
env_10.hasError = true;
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
__disposeResources(env_10);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
it('returns an empty stream when fromSeq matches the latest seq', async () => {
|
|
270
|
+
const env_11 = { stack: [], error: void 0, hasError: false };
|
|
271
|
+
try {
|
|
272
|
+
const broker = __addDisposableResource(env_11, new MemoryBroker(), false);
|
|
273
|
+
broker.publish('topic', 'origin-1', null);
|
|
274
|
+
const yielded = await collect(broker.replay('topic', '1'));
|
|
275
|
+
expect(yielded).toEqual([]);
|
|
276
|
+
}
|
|
277
|
+
catch (e_11) {
|
|
278
|
+
env_11.error = e_11;
|
|
279
|
+
env_11.hasError = true;
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
__disposeResources(env_11);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
it('throws synchronously when fromSeq falls outside the retained window', () => {
|
|
286
|
+
const broker = new MemoryBroker({ replayWindow: 2 });
|
|
287
|
+
try {
|
|
288
|
+
broker.publish('topic', 'origin-1', null); // seq 1
|
|
289
|
+
broker.publish('topic', 'origin-1', null); // seq 2
|
|
290
|
+
broker.publish('topic', 'origin-1', null); // seq 3 — drops seq 1
|
|
291
|
+
// window now retains seqs 2, 3. Asking from seq 0 lost seq 1.
|
|
292
|
+
expect(() => broker.replay('topic', '0')).toThrow(ReplayWindowExceededError);
|
|
293
|
+
}
|
|
294
|
+
finally {
|
|
295
|
+
broker[Symbol.dispose]();
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
it('does not throw when fromSeq+1 equals the oldest retained seq', async () => {
|
|
299
|
+
const env_12 = { stack: [], error: void 0, hasError: false };
|
|
300
|
+
try {
|
|
301
|
+
const broker = __addDisposableResource(env_12, new MemoryBroker({ replayWindow: 2 }), false);
|
|
302
|
+
broker.publish('topic', 'origin-1', null); // seq 1
|
|
303
|
+
broker.publish('topic', 'origin-1', null); // seq 2
|
|
304
|
+
broker.publish('topic', 'origin-1', null); // seq 3 — retains 2, 3
|
|
305
|
+
const yielded = await collect(broker.replay('topic', '1'));
|
|
306
|
+
expect(yielded.map((m) => m.seq)).toEqual(['2', '3']);
|
|
307
|
+
}
|
|
308
|
+
catch (e_12) {
|
|
309
|
+
env_12.error = e_12;
|
|
310
|
+
env_12.hasError = true;
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
__disposeResources(env_12);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
it('rejects malformed fromSeq values', () => {
|
|
317
|
+
const env_13 = { stack: [], error: void 0, hasError: false };
|
|
318
|
+
try {
|
|
319
|
+
const broker = __addDisposableResource(env_13, new MemoryBroker(), false);
|
|
320
|
+
expect(() => broker.replay('topic', 'abc')).toThrow(RangeError);
|
|
321
|
+
expect(() => broker.replay('topic', '-1')).toThrow(RangeError);
|
|
322
|
+
}
|
|
323
|
+
catch (e_13) {
|
|
324
|
+
env_13.error = e_13;
|
|
325
|
+
env_13.hasError = true;
|
|
326
|
+
}
|
|
327
|
+
finally {
|
|
328
|
+
__disposeResources(env_13);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
it('snapshots the buffer at call time', async () => {
|
|
332
|
+
const env_14 = { stack: [], error: void 0, hasError: false };
|
|
333
|
+
try {
|
|
334
|
+
const broker = __addDisposableResource(env_14, new MemoryBroker(), false);
|
|
335
|
+
broker.publish('topic', 'origin-1', { n: 1 });
|
|
336
|
+
const iterable = broker.replay('topic', '0');
|
|
337
|
+
broker.publish('topic', 'origin-1', { n: 2 });
|
|
338
|
+
const yielded = await collect(iterable);
|
|
339
|
+
expect(yielded.map((m) => m.payload.n)).toEqual([1]);
|
|
340
|
+
}
|
|
341
|
+
catch (e_14) {
|
|
342
|
+
env_14.error = e_14;
|
|
343
|
+
env_14.hasError = true;
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
__disposeResources(env_14);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
describe('oldestSeq', () => {
|
|
351
|
+
it('returns undefined when nothing has been published', () => {
|
|
352
|
+
const env_15 = { stack: [], error: void 0, hasError: false };
|
|
353
|
+
try {
|
|
354
|
+
const broker = __addDisposableResource(env_15, new MemoryBroker(), false);
|
|
355
|
+
expect(broker.oldestSeq('topic')).toBeUndefined();
|
|
356
|
+
}
|
|
357
|
+
catch (e_15) {
|
|
358
|
+
env_15.error = e_15;
|
|
359
|
+
env_15.hasError = true;
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
__disposeResources(env_15);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
it('returns the seq of the first retained message', () => {
|
|
366
|
+
const env_16 = { stack: [], error: void 0, hasError: false };
|
|
367
|
+
try {
|
|
368
|
+
const broker = __addDisposableResource(env_16, new MemoryBroker(), false);
|
|
369
|
+
broker.publish('topic', 'origin-1', null);
|
|
370
|
+
broker.publish('topic', 'origin-1', null);
|
|
371
|
+
expect(broker.oldestSeq('topic')).toBe('1');
|
|
372
|
+
}
|
|
373
|
+
catch (e_16) {
|
|
374
|
+
env_16.error = e_16;
|
|
375
|
+
env_16.hasError = true;
|
|
376
|
+
}
|
|
377
|
+
finally {
|
|
378
|
+
__disposeResources(env_16);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
it('advances after the ring buffer evicts older entries', () => {
|
|
382
|
+
const env_17 = { stack: [], error: void 0, hasError: false };
|
|
383
|
+
try {
|
|
384
|
+
const broker = __addDisposableResource(env_17, new MemoryBroker({ replayWindow: 2 }), false);
|
|
385
|
+
broker.publish('topic', 'origin-1', null); // seq 1, evicted
|
|
386
|
+
broker.publish('topic', 'origin-1', null); // seq 2
|
|
387
|
+
broker.publish('topic', 'origin-1', null); // seq 3
|
|
388
|
+
expect(broker.oldestSeq('topic')).toBe('2');
|
|
389
|
+
}
|
|
390
|
+
catch (e_17) {
|
|
391
|
+
env_17.error = e_17;
|
|
392
|
+
env_17.hasError = true;
|
|
393
|
+
}
|
|
394
|
+
finally {
|
|
395
|
+
__disposeResources(env_17);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
describe('onEviction', () => {
|
|
400
|
+
it('fires once per shifted message with topic, evictedSeq, and retainedCount', () => {
|
|
401
|
+
const env_18 = { stack: [], error: void 0, hasError: false };
|
|
402
|
+
try {
|
|
403
|
+
const evictions = [];
|
|
404
|
+
const broker = __addDisposableResource(env_18, new MemoryBroker({
|
|
405
|
+
replayWindow: 2,
|
|
406
|
+
onEviction: (topic, evictedSeq, retainedCount) => {
|
|
407
|
+
evictions.push({ topic, evictedSeq, retainedCount });
|
|
408
|
+
},
|
|
409
|
+
}), false);
|
|
410
|
+
broker.publish('topic', 'origin-1', null); // seq 1
|
|
411
|
+
broker.publish('topic', 'origin-1', null); // seq 2
|
|
412
|
+
expect(evictions).toEqual([]);
|
|
413
|
+
broker.publish('topic', 'origin-1', null); // seq 3 → evicts seq 1
|
|
414
|
+
broker.publish('topic', 'origin-1', null); // seq 4 → evicts seq 2
|
|
415
|
+
expect(evictions).toEqual([
|
|
416
|
+
{ topic: 'topic', evictedSeq: '1', retainedCount: 2 },
|
|
417
|
+
{ topic: 'topic', evictedSeq: '2', retainedCount: 2 },
|
|
418
|
+
]);
|
|
419
|
+
}
|
|
420
|
+
catch (e_18) {
|
|
421
|
+
env_18.error = e_18;
|
|
422
|
+
env_18.hasError = true;
|
|
423
|
+
}
|
|
424
|
+
finally {
|
|
425
|
+
__disposeResources(env_18);
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
it('does not fire while the buffer is below replayWindow', () => {
|
|
429
|
+
const env_19 = { stack: [], error: void 0, hasError: false };
|
|
430
|
+
try {
|
|
431
|
+
const onEviction = vi.fn();
|
|
432
|
+
const broker = __addDisposableResource(env_19, new MemoryBroker({ replayWindow: 5, onEviction }), false);
|
|
433
|
+
for (let i = 0; i < 5; i += 1)
|
|
434
|
+
broker.publish('topic', 'origin-1', null);
|
|
435
|
+
expect(onEviction).not.toHaveBeenCalled();
|
|
436
|
+
}
|
|
437
|
+
catch (e_19) {
|
|
438
|
+
env_19.error = e_19;
|
|
439
|
+
env_19.hasError = true;
|
|
440
|
+
}
|
|
441
|
+
finally {
|
|
442
|
+
__disposeResources(env_19);
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
it('attributes evictions to the right topic when several are active', () => {
|
|
446
|
+
const env_20 = { stack: [], error: void 0, hasError: false };
|
|
447
|
+
try {
|
|
448
|
+
const evictions = [];
|
|
449
|
+
const broker = __addDisposableResource(env_20, new MemoryBroker({
|
|
450
|
+
replayWindow: 1,
|
|
451
|
+
onEviction: (topic, evictedSeq) => {
|
|
452
|
+
evictions.push({ topic, evictedSeq });
|
|
453
|
+
},
|
|
454
|
+
}), false);
|
|
455
|
+
broker.publish('a', 'origin-1', null); // seq a/1
|
|
456
|
+
broker.publish('b', 'origin-1', null); // seq b/1
|
|
457
|
+
broker.publish('a', 'origin-1', null); // evicts a/1
|
|
458
|
+
broker.publish('b', 'origin-1', null); // evicts b/1
|
|
459
|
+
expect(evictions).toEqual([
|
|
460
|
+
{ topic: 'a', evictedSeq: '1' },
|
|
461
|
+
{ topic: 'b', evictedSeq: '1' },
|
|
462
|
+
]);
|
|
463
|
+
}
|
|
464
|
+
catch (e_20) {
|
|
465
|
+
env_20.error = e_20;
|
|
466
|
+
env_20.hasError = true;
|
|
467
|
+
}
|
|
468
|
+
finally {
|
|
469
|
+
__disposeResources(env_20);
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
describe('disposal', () => {
|
|
474
|
+
it('clears subscribers and rejects further calls', () => {
|
|
475
|
+
const broker = new MemoryBroker();
|
|
476
|
+
const handler = vi.fn();
|
|
477
|
+
broker.subscribe('topic', handler);
|
|
478
|
+
broker[Symbol.dispose]();
|
|
479
|
+
expect(() => broker.publish('topic', 'origin-1', null)).toThrow(/disposed/);
|
|
480
|
+
expect(() => broker.subscribe('topic', handler)).toThrow(/disposed/);
|
|
481
|
+
expect(() => broker.replay('topic', '0')).toThrow(/disposed/);
|
|
482
|
+
expect(() => broker.oldestSeq('topic')).toThrow(/disposed/);
|
|
483
|
+
});
|
|
484
|
+
it('is idempotent', () => {
|
|
485
|
+
const broker = new MemoryBroker();
|
|
486
|
+
broker[Symbol.dispose]();
|
|
487
|
+
expect(() => broker[Symbol.dispose]()).not.toThrow();
|
|
488
|
+
});
|
|
489
|
+
it('disposing a subscription after broker disposal is a no-op', () => {
|
|
490
|
+
const broker = new MemoryBroker();
|
|
491
|
+
const sub = broker.subscribe('topic', () => undefined);
|
|
492
|
+
broker[Symbol.dispose]();
|
|
493
|
+
expect(() => sub[Symbol.dispose]()).not.toThrow();
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
//# sourceMappingURL=memory-broker.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-broker.spec.js","sourceRoot":"","sources":["../src/memory-broker.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,MAAM,OAAO,GAAG,KAAK,EAAE,QAAmC,EAAyB,EAAE;IACnF,MAAM,GAAG,GAAiB,EAAE,CAAA;IAC5B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,QAAQ;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACvE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACxE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;YACrD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAA;YACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;;;gBAC5D,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACjB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACjB,MAAM,KAAK,kCAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,QAAA,CAAA;gBAC1C,MAAM,KAAK,kCAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,QAAA,CAAA;gBAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAE7D,MAAM,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBAClC,MAAM,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBAClC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;;;;;;;;SAC3C,CAAC,CAAA;QAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;;;gBACxC,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACvB,MAAM,IAAI,kCAAG,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,QAAA,CAAA;gBAEjD,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;gBAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;;;;;;;;;SACvC,CAAC,CAAA;QAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;;;gBAC5E,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBACxD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAExD,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACpC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBACpC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;;;;;;;;SAC7D,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;;;gBAC3C,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACzC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACzC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBAEzC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;;;;;;;;;SACzB,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;;;gBAC3C,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACvB,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC9C,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;gBAErB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;gBACzC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;;;;;;;;;SACvC,CAAC,CAAA;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;;;gBAC1D,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBAClB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBACvB,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;oBACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;gBACzB,CAAC,CAAC,CAAA;gBACF,MAAM,KAAK,kCAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,QAAA,CAAA;gBAChD,MAAM,KAAK,kCAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,QAAA,CAAA;gBAE3C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;gBAElD,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;gBACxC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBACxD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;;;;;;;;SACjD,CAAC,CAAA;QAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;;;gBACpE,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBAC5E,IAAI,CAAC;;;wBACH,MAAM,IAAI,kCAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE;4BAC1C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;wBACzB,CAAC,CAAC,QAAA,CAAA;wBACF,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;wBACzC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;;;;;;;;;iBACvC;wBAAS,CAAC;oBACT,KAAK,CAAC,WAAW,EAAE,CAAA;gBACrB,CAAC;;;;;;;;;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;;;gBAC7D,MAAM,MAAM,kCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC7C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC7C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC1D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;;;;;;;;;SACtD,CAAC,CAAA;QAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;;;gBACvE,MAAM,MAAM,mCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;;;;;;;;;SAC5B,CAAC,CAAA;QAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;;;gBAC3E,MAAM,MAAM,mCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;gBACzC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;;;;;;;;;SAC5B,CAAC,CAAA;QAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAA;YACpD,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,sBAAsB;gBAEhE,8DAA8D;gBAC9D,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;YAC9E,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YAC1B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;;;gBAC5E,MAAM,MAAM,mCAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,QAAA,CAAA;gBACpD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,uBAAuB;gBAEjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC1D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;;;;;;;;;SACtD,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;;;gBAC1C,MAAM,MAAM,mCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;gBAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;;;;;;;;;SAC/D,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;;;gBACjD,MAAM,MAAM,mCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;gBAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACvC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,OAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;;;;;;;;;SACxE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;;;gBAC3D,MAAM,MAAM,mCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;;;;;;;;;SAClD,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;;;gBACvD,MAAM,MAAM,mCAAG,IAAI,YAAY,EAAE,QAAA,CAAA;gBACjC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;gBACzC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;gBACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;;;;;;;;;SAC5C,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;;;gBAC7D,MAAM,MAAM,mCAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,QAAA,CAAA;gBACpD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,iBAAiB;gBAC3D,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;;;;;;;;;SAC5C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;;;gBAClF,MAAM,SAAS,GAAwE,EAAE,CAAA;gBACzF,MAAM,MAAM,mCAAG,IAAI,YAAY,CAAC;oBAC9B,YAAY,EAAE,CAAC;oBACf,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE;wBAC/C,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAA;oBACtD,CAAC;iBACF,CAAC,QAAA,CAAA;gBACF,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,QAAQ;gBAClD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;gBAC7B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,uBAAuB;gBACjE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,uBAAuB;gBACjE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;oBACxB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE;oBACrD,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE;iBACtD,CAAC,CAAA;;;;;;;;;SACH,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;;;gBAC9D,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;gBAC1B,MAAM,MAAM,mCAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,QAAA,CAAA;gBAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;gBACxE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;;;;;;;;;SAC1C,CAAC,CAAA;QAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;;;gBACzE,MAAM,SAAS,GAAiD,EAAE,CAAA;gBAClE,MAAM,MAAM,mCAAG,IAAI,YAAY,CAAC;oBAC9B,YAAY,EAAE,CAAC;oBACf,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;wBAChC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;oBACvC,CAAC;iBACF,CAAC,QAAA,CAAA;gBACF,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,UAAU;gBAChD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,UAAU;gBAChD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,aAAa;gBACnD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA,CAAC,aAAa;gBACnD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;oBACxB,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;oBAC/B,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;iBAChC,CAAC,CAAA;;;;;;;;;SACH,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAA;YACjC,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YACvB,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAElC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YAExB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YAC3E,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACpE,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YAC7D,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACvB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAA;YACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACxB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAA;YACjC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACxB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { InProcessCrossNodeBus } from '../in-process-cross-node-bus.js';
|
|
2
|
+
import { MemoryBroker } from '../memory-broker.js';
|
|
3
|
+
import type { CrossNodeBusTelemetry } from '../cross-node-bus-telemetry.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options accepted by {@link createInProcessBusNetwork}.
|
|
6
|
+
*/
|
|
7
|
+
export type CreateInProcessBusNetworkOptions = {
|
|
8
|
+
/** Number of buses to mint. Must be a positive integer. */
|
|
9
|
+
count: number;
|
|
10
|
+
/** Forwarded to the shared {@link MemoryBroker}. Defaults to 1000. */
|
|
11
|
+
replayWindow?: number;
|
|
12
|
+
/**
|
|
13
|
+
* Per-bus topic prefixes. When provided, length must equal `count`. Useful
|
|
14
|
+
* for simulating an N-services × M-nodes deployment against a single
|
|
15
|
+
* shared broker so cross-service eavesdrop can be exercised without an
|
|
16
|
+
* external transport.
|
|
17
|
+
*/
|
|
18
|
+
topicPrefixes?: readonly string[];
|
|
19
|
+
/** Per-bus stable node ids. When provided, length must equal `count`. */
|
|
20
|
+
nodeIds?: readonly string[];
|
|
21
|
+
/** Per-bus telemetry sinks. When provided, length must equal `count`. */
|
|
22
|
+
telemetries?: readonly CrossNodeBusTelemetry[];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Disposable handle returned by {@link createInProcessBusNetwork}. Disposing
|
|
26
|
+
* it tears down every bus and the shared broker in reverse order.
|
|
27
|
+
*/
|
|
28
|
+
export type InProcessBusNetwork = Disposable & {
|
|
29
|
+
readonly buses: readonly InProcessCrossNodeBus[];
|
|
30
|
+
readonly broker: MemoryBroker;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Mints `count` {@link InProcessCrossNodeBus} instances backed by a single
|
|
34
|
+
* {@link MemoryBroker}. Publishes from any bus reach the others' subscribers
|
|
35
|
+
* exactly as they would over a real transport.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* using network = createInProcessBusNetwork({ count: 2 })
|
|
40
|
+
* const [a, b] = network.buses
|
|
41
|
+
*
|
|
42
|
+
* using sub = b.subscribe('topic', (message) => {
|
|
43
|
+
* // …
|
|
44
|
+
* })
|
|
45
|
+
* await a.publish('topic', { hello: 'world' })
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare const createInProcessBusNetwork: (options: CreateInProcessBusNetworkOptions) => InProcessBusNetwork;
|
|
49
|
+
//# sourceMappingURL=create-in-process-bus-network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-in-process-bus-network.d.ts","sourceRoot":"","sources":["../../src/testing/create-in-process-bus-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAE3E;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC7C,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,yEAAyE;IACzE,WAAW,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;CAC/C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG;IAC7C,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAChD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC9B,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,yBAAyB,GAAI,SAAS,gCAAgC,KAAG,mBAoCrF,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { InProcessCrossNodeBus } from '../in-process-cross-node-bus.js';
|
|
2
|
+
import { MemoryBroker } from '../memory-broker.js';
|
|
3
|
+
/**
|
|
4
|
+
* Mints `count` {@link InProcessCrossNodeBus} instances backed by a single
|
|
5
|
+
* {@link MemoryBroker}. Publishes from any bus reach the others' subscribers
|
|
6
|
+
* exactly as they would over a real transport.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* using network = createInProcessBusNetwork({ count: 2 })
|
|
11
|
+
* const [a, b] = network.buses
|
|
12
|
+
*
|
|
13
|
+
* using sub = b.subscribe('topic', (message) => {
|
|
14
|
+
* // …
|
|
15
|
+
* })
|
|
16
|
+
* await a.publish('topic', { hello: 'world' })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const createInProcessBusNetwork = (options) => {
|
|
20
|
+
const { count, replayWindow, topicPrefixes, nodeIds, telemetries } = options;
|
|
21
|
+
if (!Number.isInteger(count) || count <= 0) {
|
|
22
|
+
throw new RangeError(`createInProcessBusNetwork.count must be a positive integer, got ${String(count)}`);
|
|
23
|
+
}
|
|
24
|
+
for (const [name, list] of [
|
|
25
|
+
['topicPrefixes', topicPrefixes],
|
|
26
|
+
['nodeIds', nodeIds],
|
|
27
|
+
['telemetries', telemetries],
|
|
28
|
+
]) {
|
|
29
|
+
if (list !== undefined && list.length !== count) {
|
|
30
|
+
throw new RangeError(`createInProcessBusNetwork.${name} length must equal count (${count}), got ${list.length}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const broker = new MemoryBroker({ replayWindow });
|
|
34
|
+
const buses = [];
|
|
35
|
+
for (let index = 0; index < count; index += 1) {
|
|
36
|
+
buses.push(new InProcessCrossNodeBus({
|
|
37
|
+
broker,
|
|
38
|
+
nodeId: nodeIds?.[index],
|
|
39
|
+
topicPrefix: topicPrefixes?.[index] ?? '',
|
|
40
|
+
telemetry: telemetries?.[index],
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
buses,
|
|
45
|
+
broker,
|
|
46
|
+
[Symbol.dispose]: () => {
|
|
47
|
+
for (let index = buses.length - 1; index >= 0; index -= 1) {
|
|
48
|
+
buses[index][Symbol.dispose]();
|
|
49
|
+
}
|
|
50
|
+
broker[Symbol.dispose]();
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=create-in-process-bus-network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-in-process-bus-network.js","sourceRoot":"","sources":["../../src/testing/create-in-process-bus-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAiClD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,OAAyC,EAAuB,EAAE;IAC1G,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC5E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,UAAU,CAAC,mEAAmE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC1G,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI;QACzB,CAAC,eAAe,EAAE,aAAa,CAAC;QAChC,CAAC,SAAS,EAAE,OAAO,CAAC;QACpB,CAAC,aAAa,EAAE,WAAW,CAAC;KACpB,EAAE,CAAC;QACX,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAChD,MAAM,IAAI,UAAU,CAAC,6BAA6B,IAAI,6BAA6B,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAClH,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;IACjD,MAAM,KAAK,GAA4B,EAAE,CAAA;IACzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CACR,IAAI,qBAAqB,CAAC;YACxB,MAAM;YACN,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC;YACxB,WAAW,EAAE,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;YACzC,SAAS,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC;SAChC,CAAC,CACH,CAAA;IACH,CAAC;IACD,OAAO;QACL,KAAK;QACL,MAAM;QACN,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE;YACrB,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC1D,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YAChC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-in-process-bus-network.spec.d.ts","sourceRoot":"","sources":["../../src/testing/create-in-process-bus-network.spec.ts"],"names":[],"mappings":""}
|