@zmdb/app 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +27 -0
  3. package/dist/application.d.ts +45 -0
  4. package/dist/application.d.ts.map +1 -0
  5. package/dist/application.js +186 -0
  6. package/dist/application.js.map +1 -0
  7. package/dist/commands/index.d.ts +31 -0
  8. package/dist/commands/index.d.ts.map +1 -0
  9. package/dist/commands/index.js +338 -0
  10. package/dist/commands/index.js.map +1 -0
  11. package/dist/cqrs/index.d.ts +47 -0
  12. package/dist/cqrs/index.d.ts.map +1 -0
  13. package/dist/cqrs/index.js +76 -0
  14. package/dist/cqrs/index.js.map +1 -0
  15. package/dist/data/index.d.ts +12 -0
  16. package/dist/data/index.d.ts.map +1 -0
  17. package/dist/data/index.js +25 -0
  18. package/dist/data/index.js.map +1 -0
  19. package/dist/di/index.d.ts +44 -0
  20. package/dist/di/index.d.ts.map +1 -0
  21. package/dist/di/index.js +136 -0
  22. package/dist/di/index.js.map +1 -0
  23. package/dist/events/index.d.ts +46 -0
  24. package/dist/events/index.d.ts.map +1 -0
  25. package/dist/events/index.js +181 -0
  26. package/dist/events/index.js.map +1 -0
  27. package/dist/health/index.d.ts +35 -0
  28. package/dist/health/index.d.ts.map +1 -0
  29. package/dist/health/index.js +14 -0
  30. package/dist/health/index.js.map +1 -0
  31. package/dist/index.d.ts +11 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +22 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lifecycle.d.ts +21 -0
  36. package/dist/lifecycle.d.ts.map +1 -0
  37. package/dist/lifecycle.js +52 -0
  38. package/dist/lifecycle.js.map +1 -0
  39. package/dist/messaging/index.d.ts +176 -0
  40. package/dist/messaging/index.d.ts.map +1 -0
  41. package/dist/messaging/index.js +442 -0
  42. package/dist/messaging/index.js.map +1 -0
  43. package/dist/messaging/transport-kit.d.ts +22 -0
  44. package/dist/messaging/transport-kit.d.ts.map +1 -0
  45. package/dist/messaging/transport-kit.js +174 -0
  46. package/dist/messaging/transport-kit.js.map +1 -0
  47. package/dist/modules/index.d.ts +52 -0
  48. package/dist/modules/index.d.ts.map +1 -0
  49. package/dist/modules/index.js +351 -0
  50. package/dist/modules/index.js.map +1 -0
  51. package/dist/modules/lifecycle-instances.d.ts +4 -0
  52. package/dist/modules/lifecycle-instances.d.ts.map +1 -0
  53. package/dist/modules/lifecycle-instances.js +19 -0
  54. package/dist/modules/lifecycle-instances.js.map +1 -0
  55. package/dist/modules/runtime.d.ts +18 -0
  56. package/dist/modules/runtime.d.ts.map +1 -0
  57. package/dist/modules/runtime.js +8 -0
  58. package/dist/modules/runtime.js.map +1 -0
  59. package/dist/observability/index.d.ts +27 -0
  60. package/dist/observability/index.d.ts.map +1 -0
  61. package/dist/observability/index.js +145 -0
  62. package/dist/observability/index.js.map +1 -0
  63. package/dist/observability/propagation.d.ts +10 -0
  64. package/dist/observability/propagation.d.ts.map +1 -0
  65. package/dist/observability/propagation.js +96 -0
  66. package/dist/observability/propagation.js.map +1 -0
  67. package/dist/observability/types.d.ts +66 -0
  68. package/dist/observability/types.d.ts.map +1 -0
  69. package/dist/observability/types.js +10 -0
  70. package/dist/observability/types.js.map +1 -0
  71. package/dist/polyfill.d.ts +2 -0
  72. package/dist/polyfill.d.ts.map +1 -0
  73. package/dist/polyfill.js +21 -0
  74. package/dist/polyfill.js.map +1 -0
  75. package/dist/state/fixtures.d.ts +10 -0
  76. package/dist/state/fixtures.d.ts.map +1 -0
  77. package/dist/state/fixtures.js +14 -0
  78. package/dist/state/fixtures.js.map +1 -0
  79. package/dist/state/index.d.ts +26 -0
  80. package/dist/state/index.d.ts.map +1 -0
  81. package/dist/state/index.js +37 -0
  82. package/dist/state/index.js.map +1 -0
  83. package/dist/state-transitions.d.ts +57 -0
  84. package/dist/state-transitions.d.ts.map +1 -0
  85. package/dist/state-transitions.js +31 -0
  86. package/dist/state-transitions.js.map +1 -0
  87. package/package.json +99 -0
  88. package/src/application.ts +243 -0
  89. package/src/commands/index.ts +447 -0
  90. package/src/cqrs/index.ts +124 -0
  91. package/src/data/index.ts +33 -0
  92. package/src/di/index.ts +179 -0
  93. package/src/events/index.ts +248 -0
  94. package/src/health/index.ts +54 -0
  95. package/src/index.ts +68 -0
  96. package/src/lifecycle.ts +62 -0
  97. package/src/messaging/index.ts +668 -0
  98. package/src/messaging/transport-kit.ts +234 -0
  99. package/src/modules/index.ts +476 -0
  100. package/src/modules/lifecycle-instances.ts +23 -0
  101. package/src/modules/runtime.ts +26 -0
  102. package/src/observability/index.ts +204 -0
  103. package/src/observability/propagation.ts +107 -0
  104. package/src/observability/types.ts +68 -0
  105. package/src/polyfill.ts +24 -0
  106. package/src/state/fixtures.ts +20 -0
  107. package/src/state/index.ts +57 -0
  108. package/src/state-transitions.ts +150 -0
@@ -0,0 +1,442 @@
1
+ // @zmdb/app — transport-neutral message dispatch and application-extension
2
+ // contracts. Strategies own broker framing and settlement; the framework owns
3
+ // validation, handler dispatch, request correlation and bounded client waits.
4
+ import { applicationExtensionControllersOf } from '../application.js';
5
+ import { consumerSpan, toTraceHeaders } from '../observability/index.js';
6
+ export { abortError, decodeDelivery, decodeReply, encodeDelivery, encodeReply, InFlight, reportTransportError, withinGrace, } from './transport-kit.js';
7
+ /** A request was made against a strategy without request/reply support. */
8
+ export class TransportUnsupportedError extends Error {
9
+ transport;
10
+ operation;
11
+ constructor(transport) {
12
+ super(`transport "${transport}" does not support request/response`);
13
+ this.name = 'TransportUnsupportedError';
14
+ this.transport = transport;
15
+ this.operation = 'send';
16
+ }
17
+ }
18
+ /** A request did not settle before its required deadline. */
19
+ export class MessageTimeoutError extends Error {
20
+ pattern;
21
+ timeoutMs;
22
+ correlationId;
23
+ constructor(pattern, timeoutMs, correlationId) {
24
+ super(`message request "${pattern}" timed out after ${String(timeoutMs)}ms`);
25
+ this.name = 'MessageTimeoutError';
26
+ this.pattern = pattern;
27
+ this.timeoutMs = timeoutMs;
28
+ this.correlationId = correlationId;
29
+ }
30
+ }
31
+ /** A remote handler failed without exposing its private error detail. */
32
+ export class MessageRemoteError extends Error {
33
+ pattern;
34
+ correlationId;
35
+ constructor(pattern, correlationId, message) {
36
+ super(message);
37
+ this.name = 'MessageRemoteError';
38
+ this.pattern = pattern;
39
+ this.correlationId = correlationId;
40
+ }
41
+ }
42
+ /** A transport returned a reply for a different outstanding request. */
43
+ export class MessageCorrelationError extends Error {
44
+ pattern;
45
+ expected;
46
+ received;
47
+ constructor(pattern, expected, received) {
48
+ super(`message request "${pattern}" received correlation "${received}", expected "${expected}"`);
49
+ this.name = 'MessageCorrelationError';
50
+ this.pattern = pattern;
51
+ this.expected = expected;
52
+ this.received = received;
53
+ }
54
+ }
55
+ const MESSAGE_PATTERNS = Symbol('zmdb.app.messaging.patterns');
56
+ const DEFAULT_MAX_ATTEMPTS = 5;
57
+ const MAX_RETRY_MS = 30_000;
58
+ // boundary: MessagePattern and EventPattern are the only writers of this
59
+ // private metadata slot, so the typed view is sound.
60
+ function messageMetadata(metadata) {
61
+ return metadata;
62
+ }
63
+ function pushPattern(metadata, pattern) {
64
+ const view = messageMetadata(metadata);
65
+ const own = Object.hasOwn(metadata, MESSAGE_PATTERNS) ? view[MESSAGE_PATTERNS] : undefined;
66
+ if (own === undefined) {
67
+ view[MESSAGE_PATTERNS] = [pattern];
68
+ }
69
+ else {
70
+ own.push(pattern);
71
+ }
72
+ }
73
+ function ownPatterns(metadata) {
74
+ if (!Object.hasOwn(metadata, MESSAGE_PATTERNS)) {
75
+ return [];
76
+ }
77
+ return messageMetadata(metadata)[MESSAGE_PATTERNS] ?? [];
78
+ }
79
+ function storedPatterns(cls) {
80
+ const metadata = cls[Symbol.metadata];
81
+ if (metadata === undefined || metadata === null) {
82
+ return [];
83
+ }
84
+ const baseFirst = [];
85
+ for (let record = metadata; record !== null; record = Object.getPrototypeOf(record)) {
86
+ baseFirst.unshift(record);
87
+ }
88
+ let composed = [];
89
+ for (const record of baseFirst) {
90
+ const own = ownPatterns(record);
91
+ if (own.length === 0) {
92
+ continue;
93
+ }
94
+ const overridden = new Set(own.map(pattern => pattern.handlerName));
95
+ composed = [...composed.filter(pattern => !overridden.has(pattern.handlerName)), ...own];
96
+ }
97
+ return composed;
98
+ }
99
+ function patternDecorator(pattern, validate, semantics) {
100
+ return function (_target, context) {
101
+ const handlerName = String(context.name);
102
+ pushPattern(context.metadata, { pattern, handlerName, semantics, validate });
103
+ };
104
+ }
105
+ /** Declare a request/reply handler with its consume-boundary validator. */
106
+ export function MessagePattern(pattern, validate) {
107
+ return patternDecorator(pattern, validate, 'request');
108
+ }
109
+ /** Declare a one-way event handler. Returning a value is a compile error. */
110
+ export function EventPattern(pattern, validate) {
111
+ return patternDecorator(pattern, validate, 'event');
112
+ }
113
+ /** Read declarations from one class without constructing or discovering it. */
114
+ export function getMessagePatterns(cls) {
115
+ return storedPatterns(cls).map(({ pattern, handlerName, semantics }) => ({ pattern, handlerName, semantics }));
116
+ }
117
+ function constructorOf(instance) {
118
+ const ctor = instance.constructor;
119
+ if (typeof ctor !== 'function') {
120
+ throw new Error('@zmdb/app: message consumer has no constructor');
121
+ }
122
+ return ctor;
123
+ }
124
+ function boundPatterns(instance) {
125
+ return storedPatterns(constructorOf(instance)).map(pattern => {
126
+ const value = Reflect.get(instance, pattern.handlerName);
127
+ if (typeof value !== 'function') {
128
+ throw new Error(`@zmdb/app: message handler "${pattern.handlerName}" is not callable`);
129
+ }
130
+ return {
131
+ ...pattern,
132
+ async invoke(ctx) {
133
+ return Reflect.apply(value, instance, [ctx]);
134
+ },
135
+ };
136
+ });
137
+ }
138
+ function positiveInteger(value, name) {
139
+ if (!Number.isInteger(value) || value <= 0) {
140
+ throw new RangeError(`@zmdb/app: ${name} must be a positive integer`);
141
+ }
142
+ return value;
143
+ }
144
+ function defaultRetryAfter(attempt) {
145
+ return Math.min(MAX_RETRY_MS, 1_000 * 2 ** Math.max(0, attempt - 1));
146
+ }
147
+ function observe(action) {
148
+ try {
149
+ void Promise.resolve(action()).catch(() => undefined);
150
+ }
151
+ catch {
152
+ // Observation cannot replace dispatch or settlement.
153
+ }
154
+ }
155
+ function withReply(settlement, reply) {
156
+ return reply === undefined ? { settlement } : { settlement, reply };
157
+ }
158
+ function errorReply(message, detail) {
159
+ if (message.replyTo === undefined || message.correlationId === undefined) {
160
+ return undefined;
161
+ }
162
+ return { kind: 'error', correlationId: message.correlationId, message: detail };
163
+ }
164
+ function isRequestEnvelope(message) {
165
+ return message.replyTo !== undefined && message.correlationId !== undefined;
166
+ }
167
+ /** Build one exact-pattern map for the supplied application-owned consumers. */
168
+ export function createMessageDispatcher(consumers, options) {
169
+ const maxAttempts = positiveInteger(options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, 'maxAttempts');
170
+ const byPattern = new Map();
171
+ for (const consumer of consumers) {
172
+ for (const pattern of boundPatterns(consumer)) {
173
+ if (pattern.pattern.length === 0) {
174
+ throw new RangeError('@zmdb/app: a message pattern cannot be empty');
175
+ }
176
+ if (byPattern.has(pattern.pattern)) {
177
+ throw new Error(`@zmdb/app: duplicate message pattern "${pattern.pattern}"`);
178
+ }
179
+ byPattern.set(pattern.pattern, pattern);
180
+ }
181
+ }
182
+ const failureSettlement = (message, error) => {
183
+ observe(() => options.onHandlerError(message, error));
184
+ if (message.deliveryAttempt >= maxAttempts) {
185
+ return { kind: 'dead', reason: 'attempts-exhausted' };
186
+ }
187
+ const retryAfter = options.retryAfterMs ?? defaultRetryAfter;
188
+ let afterMs;
189
+ try {
190
+ afterMs = positiveInteger(retryAfter(message.deliveryAttempt), 'retryAfterMs result');
191
+ }
192
+ catch (policyError) {
193
+ observe(() => options.onHandlerError(message, policyError));
194
+ return { kind: 'dead', reason: 'invalid-retry-policy' };
195
+ }
196
+ return { kind: 'retry', afterMs };
197
+ };
198
+ return {
199
+ patterns: [...byPattern.keys()],
200
+ async dispatch(message, transport) {
201
+ const binding = byPattern.get(message.pattern);
202
+ if (binding === undefined) {
203
+ observe(() => options.onUnhandled(message));
204
+ return withReply({ kind: 'ack' }, errorReply(message, 'message pattern is not handled'));
205
+ }
206
+ if (message.parseError !== undefined) {
207
+ observe(() => options.onInvalidPayload(message, message.parseError));
208
+ return withReply({ kind: 'dead', reason: 'invalid-payload' }, errorReply(message, 'invalid message payload'));
209
+ }
210
+ let payload;
211
+ try {
212
+ payload = binding.validate(message.payload);
213
+ }
214
+ catch (error) {
215
+ observe(() => options.onInvalidPayload(message, error));
216
+ return withReply({ kind: 'dead', reason: 'invalid-payload' }, errorReply(message, 'invalid message payload'));
217
+ }
218
+ if (binding.semantics === 'request' && !isRequestEnvelope(message)) {
219
+ const error = new Error(`request pattern "${message.pattern}" requires correlationId and replyTo`);
220
+ observe(() => options.onHandlerError(message, error));
221
+ return { settlement: { kind: 'dead', reason: 'invalid-request-envelope' } };
222
+ }
223
+ const context = {
224
+ kind: 'message',
225
+ pattern: message.pattern,
226
+ payload,
227
+ headers: message.headers,
228
+ correlationId: message.correlationId ?? globalThis.crypto.randomUUID(),
229
+ deliveryAttempt: message.deliveryAttempt,
230
+ transport,
231
+ ...(options.observability?.tracer === undefined
232
+ ? {}
233
+ : {
234
+ span: consumerSpan(options.observability, message, binding.semantics === 'request' ? 'request-reply' : 'queued'),
235
+ }),
236
+ };
237
+ try {
238
+ const result = await binding.invoke(context);
239
+ if (binding.semantics === 'request' && message.correlationId !== undefined) {
240
+ return {
241
+ settlement: { kind: 'ack' },
242
+ reply: { kind: 'result', correlationId: message.correlationId, payload: result },
243
+ };
244
+ }
245
+ return { settlement: { kind: 'ack' } };
246
+ }
247
+ catch (error) {
248
+ context.span?.recordException(error instanceof Error ? error : new Error(String(error)));
249
+ context.span?.setStatus({ error: true });
250
+ if (binding.semantics === 'request') {
251
+ observe(() => options.onHandlerError(message, error));
252
+ return withReply({ kind: 'ack' }, errorReply(message, 'message handler failed'));
253
+ }
254
+ return { settlement: failureSettlement(message, error) };
255
+ }
256
+ finally {
257
+ context.span?.end();
258
+ }
259
+ },
260
+ };
261
+ }
262
+ /**
263
+ * Attach transport strategies to the protocol-neutral application lifecycle.
264
+ *
265
+ * The strategy snapshot and exact-pattern dispatcher are application-owned;
266
+ * concrete broker clients remain outside this package.
267
+ */
268
+ export function transportExtension(options) {
269
+ const transports = Object.freeze([...options.transports]);
270
+ const dispatcherOptions = options.dispatcher;
271
+ let entered = [];
272
+ return {
273
+ name: '@zmdb/app:messaging',
274
+ async start(context) {
275
+ validateTransportNames(transports);
276
+ validateLazyConsumers(applicationExtensionControllersOf(context));
277
+ for (const transport of transports) {
278
+ validateUndeliverableSink(transport, dispatcherOptions);
279
+ }
280
+ const dispatcher = createMessageDispatcher(context.controllers, {
281
+ ...dispatcherOptions,
282
+ observability: context.observability,
283
+ });
284
+ for (const transport of transports) {
285
+ entered.push(transport);
286
+ await transport.listen(async (message) => {
287
+ const outcome = await dispatcher.dispatch(message, transport.name);
288
+ reportUndeliverable(transport, dispatcherOptions, message, outcome.settlement);
289
+ return outcome;
290
+ });
291
+ }
292
+ },
293
+ async stop({ graceMs }) {
294
+ const errors = [];
295
+ const deadline = Date.now() + graceMs;
296
+ for (let index = entered.length - 1; index >= 0; index -= 1) {
297
+ const transport = entered[index];
298
+ if (transport === undefined)
299
+ continue;
300
+ try {
301
+ await transport.close(Math.max(0, deadline - Date.now()));
302
+ }
303
+ catch (error) {
304
+ errors.push(error);
305
+ }
306
+ }
307
+ entered = [];
308
+ throwTransportErrors(errors);
309
+ },
310
+ };
311
+ }
312
+ function validateTransportNames(transports) {
313
+ const names = new Set();
314
+ for (const transport of transports) {
315
+ if (transport.name.length === 0) {
316
+ throw new RangeError('@zmdb/app: a transport name cannot be empty');
317
+ }
318
+ if (names.has(transport.name)) {
319
+ throw new Error(`@zmdb/app: duplicate transport name "${transport.name}"`);
320
+ }
321
+ names.add(transport.name);
322
+ }
323
+ }
324
+ function validateLazyConsumers(controllers) {
325
+ for (const binding of controllers) {
326
+ if (binding.kind === 'deferred' && getMessagePatterns(binding.controller).length > 0) {
327
+ throw new Error(`@zmdb/app: lazy controller "${binding.controller.name}" declares message patterns; ` +
328
+ 'message consumers must be eager');
329
+ }
330
+ }
331
+ }
332
+ function validateUndeliverableSink(transport, options) {
333
+ if ((!transport.capabilities.redelivery || !transport.capabilities.deadLetter) &&
334
+ options.onUndeliverable === undefined) {
335
+ throw new Error(`@zmdb/app: transport "${transport.name}" requires onUndeliverable`);
336
+ }
337
+ }
338
+ function reportUndeliverable(transport, options, message, settlement) {
339
+ const dropped = (settlement.kind === 'retry' && !transport.capabilities.redelivery) ||
340
+ (settlement.kind === 'dead' && !transport.capabilities.deadLetter);
341
+ if (!dropped || options.onUndeliverable === undefined) {
342
+ return;
343
+ }
344
+ observe(() => options.onUndeliverable?.(message, settlement));
345
+ }
346
+ function throwTransportErrors(errors) {
347
+ if (errors.length === 0)
348
+ return;
349
+ const first = errors[0];
350
+ if (errors.length === 1 && first !== undefined)
351
+ throw first;
352
+ throw new AggregateError(errors, '@zmdb/app: transport shutdown failed');
353
+ }
354
+ function requestMethod(transport, pattern, timeoutMs, validate) {
355
+ return async (payload, span) => {
356
+ if (!transport.capabilities.requestResponse) {
357
+ throw new TransportUnsupportedError(transport.name);
358
+ }
359
+ const correlationId = globalThis.crypto.randomUUID();
360
+ const controller = new AbortController();
361
+ const timeoutError = new MessageTimeoutError(pattern, timeoutMs, correlationId);
362
+ let timer;
363
+ const timeout = new Promise((_resolve, reject) => {
364
+ timer = setTimeout(() => {
365
+ controller.abort(timeoutError);
366
+ reject(timeoutError);
367
+ }, timeoutMs);
368
+ });
369
+ const request = {
370
+ pattern,
371
+ payload,
372
+ correlationId,
373
+ timeoutMs,
374
+ signal: controller.signal,
375
+ ...(span === undefined ? {} : toTraceHeaders(span)),
376
+ };
377
+ try {
378
+ const reply = await Promise.race([Promise.resolve().then(() => transport.send(request)), timeout]);
379
+ if (reply.correlationId !== correlationId) {
380
+ throw new MessageCorrelationError(pattern, correlationId, reply.correlationId);
381
+ }
382
+ if (reply.kind === 'error') {
383
+ throw new MessageRemoteError(pattern, correlationId, reply.message);
384
+ }
385
+ return Reflect.apply(validate, undefined, [reply.payload]);
386
+ }
387
+ finally {
388
+ if (timer !== undefined) {
389
+ clearTimeout(timer);
390
+ }
391
+ }
392
+ };
393
+ }
394
+ /** Build a typed request client from a total response-validator map. */
395
+ export function createMessageClient(transport, options) {
396
+ const timeoutMs = positiveInteger(options.timeoutMs, 'timeoutMs');
397
+ // boundary: the mapped type and total validator map have the same key set;
398
+ // every own validator key is installed before the client is returned.
399
+ const client = Object.create(null);
400
+ for (const pattern of Object.keys(options.validate)) {
401
+ const validator = Reflect.get(options.validate, pattern);
402
+ if (typeof validator !== 'function') {
403
+ throw new Error(`@zmdb/app: message pattern "${pattern}" has no response validator`);
404
+ }
405
+ const installed = Reflect.set(client, pattern, requestMethod(transport, pattern, timeoutMs, validator));
406
+ if (!installed) {
407
+ throw new Error(`@zmdb/app: could not install message client pattern "${pattern}"`);
408
+ }
409
+ }
410
+ return client;
411
+ }
412
+ /** Build a typed one-way publisher. Methods are cached on first property access. */
413
+ export function createEventPublisher(transport) {
414
+ const methods = new Map();
415
+ // boundary: the mapped return type limits consumer-visible properties to
416
+ // keyof E; the proxy only turns those string properties into emit calls.
417
+ const target = Object.create(null);
418
+ return new Proxy(target, {
419
+ get(_target, property, receiver) {
420
+ if (typeof property !== 'string') {
421
+ return Reflect.get(target, property, receiver);
422
+ }
423
+ if (property === 'then') {
424
+ // A synthesized `then` makes the publisher a never-settling thenable.
425
+ return undefined;
426
+ }
427
+ const existing = methods.get(property);
428
+ if (existing !== undefined) {
429
+ return existing;
430
+ }
431
+ const method = (payload, span) => {
432
+ if (span === undefined) {
433
+ return transport.emit(property, payload);
434
+ }
435
+ return transport.emit(property, payload, toTraceHeaders(span));
436
+ };
437
+ methods.set(property, method);
438
+ return method;
439
+ },
440
+ });
441
+ }
442
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { TraceCarrier } from '../observability/index.js';
2
+ import type { MessageReply, RawMessage } from './index.js';
3
+ export interface DeliveryMetadata {
4
+ readonly correlationId?: string;
5
+ readonly replyTo?: string;
6
+ }
7
+ export declare function encodeDelivery(payload: unknown, carrier: TraceCarrier | undefined, metadata?: DeliveryMetadata): string;
8
+ export declare function decodeDelivery(pattern: string, text: string, deliveryAttempt: number, metadata?: DeliveryMetadata): RawMessage;
9
+ export declare function encodeReply(reply: MessageReply): string;
10
+ export declare function decodeReply(text: string): MessageReply;
11
+ export type TransportErrorSink = (error: unknown) => void;
12
+ export declare function reportTransportError(sink: TransportErrorSink, error: unknown): void;
13
+ export declare class InFlight {
14
+ #private;
15
+ constructor(onError: TransportErrorSink);
16
+ run(action: () => Promise<void>): Promise<void>;
17
+ stop(): void;
18
+ settled(): Promise<void>;
19
+ }
20
+ export declare function withinGrace(action: Promise<void>, graceMs: number): Promise<boolean>;
21
+ export declare function abortError(signal: AbortSignal): unknown;
22
+ //# sourceMappingURL=transport-kit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-kit.d.ts","sourceRoot":"","sources":["../../src/messaging/transport-kit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAqCD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,QAAQ,GAAE,gBAAqB,GAC9B,MAAM,CAcR;AAoBD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,QAAQ,GAAE,gBAAqB,GAC9B,UAAU,CAmDZ;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAiBtD;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAMnF;AAED,qBAAa,QAAQ;;IAKnB,YAAY,OAAO,EAAE,kBAAkB,EAEtC;IAED,GAAG,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9C;IAED,IAAI,IAAI,IAAI,CAEX;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;CACF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc1F;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,174 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ function stringRecord(value) {
5
+ if (!isRecord(value)) {
6
+ return undefined;
7
+ }
8
+ const result = {};
9
+ for (const [key, entry] of Object.entries(value)) {
10
+ if (typeof entry !== 'string') {
11
+ return undefined;
12
+ }
13
+ result[key] = entry;
14
+ }
15
+ return result;
16
+ }
17
+ function optionalString(value) {
18
+ return value === undefined || typeof value === 'string' ? value : false;
19
+ }
20
+ function encode(value, description) {
21
+ let encoded;
22
+ try {
23
+ encoded = JSON.stringify(value);
24
+ }
25
+ catch (error) {
26
+ throw new TypeError(`@zmdb/app: ${description} is not JSON-serializable`, { cause: error });
27
+ }
28
+ if (encoded === undefined) {
29
+ throw new TypeError(`@zmdb/app: ${description} is not JSON-serializable`);
30
+ }
31
+ return encoded;
32
+ }
33
+ export function encodeDelivery(payload, carrier, metadata = {}) {
34
+ if (payload === undefined) {
35
+ throw new TypeError('@zmdb/app: broker payloads cannot be undefined');
36
+ }
37
+ const envelope = {
38
+ version: 1,
39
+ payload,
40
+ headers: {},
41
+ ...(metadata.correlationId === undefined ? {} : { correlationId: metadata.correlationId }),
42
+ ...(metadata.replyTo === undefined ? {} : { replyTo: metadata.replyTo }),
43
+ ...(carrier?.traceparent === undefined ? {} : { traceparent: carrier.traceparent }),
44
+ ...(carrier?.tracestate === undefined ? {} : { tracestate: carrier.tracestate }),
45
+ };
46
+ return encode(envelope, 'broker payload');
47
+ }
48
+ function invalidDelivery(pattern, payload, deliveryAttempt, error, metadata) {
49
+ return {
50
+ pattern,
51
+ payload,
52
+ headers: {},
53
+ correlationId: metadata.correlationId,
54
+ replyTo: metadata.replyTo,
55
+ deliveryAttempt,
56
+ parseError: error,
57
+ };
58
+ }
59
+ export function decodeDelivery(pattern, text, deliveryAttempt, metadata = {}) {
60
+ let parsed;
61
+ try {
62
+ parsed = JSON.parse(text);
63
+ }
64
+ catch (error) {
65
+ return invalidDelivery(pattern, text, deliveryAttempt, error, metadata);
66
+ }
67
+ if (!isRecord(parsed)) {
68
+ return invalidDelivery(pattern, parsed, deliveryAttempt, new TypeError('@zmdb/app: broker envelope must be an object'), metadata);
69
+ }
70
+ const headers = stringRecord(parsed.headers);
71
+ const correlationId = optionalString(parsed.correlationId);
72
+ const replyTo = optionalString(parsed.replyTo);
73
+ const traceparent = optionalString(parsed.traceparent);
74
+ const tracestate = optionalString(parsed.tracestate);
75
+ if (parsed.version !== 1 ||
76
+ !Object.hasOwn(parsed, 'payload') ||
77
+ headers === undefined ||
78
+ correlationId === false ||
79
+ replyTo === false ||
80
+ traceparent === false ||
81
+ tracestate === false) {
82
+ return invalidDelivery(pattern, Object.hasOwn(parsed, 'payload') ? parsed.payload : parsed, deliveryAttempt, new TypeError('@zmdb/app: invalid broker envelope'), metadata);
83
+ }
84
+ return {
85
+ pattern,
86
+ payload: parsed.payload,
87
+ headers,
88
+ correlationId: metadata.correlationId ?? correlationId,
89
+ replyTo: metadata.replyTo ?? replyTo,
90
+ deliveryAttempt,
91
+ ...(traceparent === undefined ? {} : { traceparent }),
92
+ ...(tracestate === undefined ? {} : { tracestate }),
93
+ };
94
+ }
95
+ export function encodeReply(reply) {
96
+ return encode(reply, 'broker reply');
97
+ }
98
+ export function decodeReply(text) {
99
+ let parsed;
100
+ try {
101
+ parsed = JSON.parse(text);
102
+ }
103
+ catch (error) {
104
+ throw new TypeError('@zmdb/app: broker reply is not valid JSON', { cause: error });
105
+ }
106
+ if (!isRecord(parsed) || typeof parsed.correlationId !== 'string') {
107
+ throw new TypeError('@zmdb/app: invalid broker reply envelope');
108
+ }
109
+ if (parsed.kind === 'result' && Object.hasOwn(parsed, 'payload')) {
110
+ return { kind: 'result', correlationId: parsed.correlationId, payload: parsed.payload };
111
+ }
112
+ if (parsed.kind === 'error' && typeof parsed.message === 'string') {
113
+ return { kind: 'error', correlationId: parsed.correlationId, message: parsed.message };
114
+ }
115
+ throw new TypeError('@zmdb/app: invalid broker reply envelope');
116
+ }
117
+ export function reportTransportError(sink, error) {
118
+ try {
119
+ sink(error);
120
+ }
121
+ catch {
122
+ // A diagnostic sink cannot replace transport settlement or shutdown.
123
+ }
124
+ }
125
+ export class InFlight {
126
+ #tasks = new Set();
127
+ #onError;
128
+ #accepting = true;
129
+ constructor(onError) {
130
+ this.#onError = onError;
131
+ }
132
+ run(action) {
133
+ if (!this.#accepting) {
134
+ return Promise.resolve();
135
+ }
136
+ let task;
137
+ task = Promise.resolve()
138
+ .then(action)
139
+ .catch(error => {
140
+ reportTransportError(this.#onError, error);
141
+ })
142
+ .finally(() => {
143
+ this.#tasks.delete(task);
144
+ });
145
+ this.#tasks.add(task);
146
+ return task;
147
+ }
148
+ stop() {
149
+ this.#accepting = false;
150
+ }
151
+ async settled() {
152
+ await Promise.all(this.#tasks);
153
+ }
154
+ }
155
+ export async function withinGrace(action, graceMs) {
156
+ let timer;
157
+ try {
158
+ return await Promise.race([
159
+ action.then(() => true),
160
+ new Promise(resolve => {
161
+ timer = setTimeout(() => resolve(false), graceMs);
162
+ }),
163
+ ]);
164
+ }
165
+ finally {
166
+ if (timer !== undefined) {
167
+ clearTimeout(timer);
168
+ }
169
+ }
170
+ }
171
+ export function abortError(signal) {
172
+ return signal.reason ?? new Error('@zmdb/app: broker request aborted');
173
+ }
174
+ //# sourceMappingURL=transport-kit.js.map