@beignet/core 0.0.33 → 0.0.35

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 (142) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +207 -30
  3. package/dist/agent-capabilities/index.d.ts +167 -0
  4. package/dist/agent-capabilities/index.d.ts.map +1 -0
  5. package/dist/agent-capabilities/index.js +275 -0
  6. package/dist/agent-capabilities/index.js.map +1 -0
  7. package/dist/application/index.d.ts +2 -2
  8. package/dist/application/index.d.ts.map +1 -1
  9. package/dist/application/index.js +13 -3
  10. package/dist/application/index.js.map +1 -1
  11. package/dist/client/client.d.ts +2 -0
  12. package/dist/client/client.d.ts.map +1 -1
  13. package/dist/client/client.js +33 -16
  14. package/dist/client/client.js.map +1 -1
  15. package/dist/contracts/contract-builder.d.ts +5 -7
  16. package/dist/contracts/contract-builder.d.ts.map +1 -1
  17. package/dist/contracts/contract-builder.js +3 -18
  18. package/dist/contracts/contract-builder.js.map +1 -1
  19. package/dist/contracts/contract-group.d.ts +2 -2
  20. package/dist/contracts/contract-group.d.ts.map +1 -1
  21. package/dist/contracts/contract-group.js +2 -1
  22. package/dist/contracts/contract-group.js.map +1 -1
  23. package/dist/contracts/metadata.d.ts +3 -0
  24. package/dist/contracts/metadata.d.ts.map +1 -0
  25. package/dist/contracts/metadata.js +14 -0
  26. package/dist/contracts/metadata.js.map +1 -0
  27. package/dist/contracts/types.d.ts +20 -0
  28. package/dist/contracts/types.d.ts.map +1 -1
  29. package/dist/contracts/types.js.map +1 -1
  30. package/dist/events/index.d.ts +4 -4
  31. package/dist/events/index.d.ts.map +1 -1
  32. package/dist/events/index.js +5 -5
  33. package/dist/events/index.js.map +1 -1
  34. package/dist/flags/index.d.ts +0 -4
  35. package/dist/flags/index.d.ts.map +1 -1
  36. package/dist/flags/index.js +0 -4
  37. package/dist/flags/index.js.map +1 -1
  38. package/dist/idempotency/index.d.ts.map +1 -1
  39. package/dist/idempotency/index.js +14 -9
  40. package/dist/idempotency/index.js.map +1 -1
  41. package/dist/jobs/index.d.ts.map +1 -1
  42. package/dist/jobs/index.js +10 -4
  43. package/dist/jobs/index.js.map +1 -1
  44. package/dist/notifications/index.d.ts +194 -10
  45. package/dist/notifications/index.d.ts.map +1 -1
  46. package/dist/notifications/index.js +397 -59
  47. package/dist/notifications/index.js.map +1 -1
  48. package/dist/openapi/index.js +15 -8
  49. package/dist/openapi/index.js.map +1 -1
  50. package/dist/ports/auth.d.ts +2 -0
  51. package/dist/ports/auth.d.ts.map +1 -1
  52. package/dist/ports/auth.js +2 -0
  53. package/dist/ports/auth.js.map +1 -1
  54. package/dist/ports/events.d.ts +2 -2
  55. package/dist/ports/index.d.ts +1 -1
  56. package/dist/ports/index.d.ts.map +1 -1
  57. package/dist/ports/index.js +1 -1
  58. package/dist/ports/index.js.map +1 -1
  59. package/dist/providers/index.d.ts +1 -1
  60. package/dist/providers/index.d.ts.map +1 -1
  61. package/dist/providers/index.js.map +1 -1
  62. package/dist/providers/provider.d.ts +10 -2
  63. package/dist/providers/provider.d.ts.map +1 -1
  64. package/dist/providers/provider.js.map +1 -1
  65. package/dist/schedules/index.d.ts +6 -13
  66. package/dist/schedules/index.d.ts.map +1 -1
  67. package/dist/schedules/index.js +24 -44
  68. package/dist/schedules/index.js.map +1 -1
  69. package/dist/server/index.d.ts +2 -2
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +1 -1
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/server/request-executor.d.ts +72 -0
  74. package/dist/server/request-executor.d.ts.map +1 -0
  75. package/dist/server/request-executor.js +781 -0
  76. package/dist/server/request-executor.js.map +1 -0
  77. package/dist/server/request-preparation.d.ts +39 -0
  78. package/dist/server/request-preparation.d.ts.map +1 -0
  79. package/dist/server/request-preparation.js +248 -0
  80. package/dist/server/request-preparation.js.map +1 -0
  81. package/dist/server/response-finalization.d.ts +34 -0
  82. package/dist/server/response-finalization.d.ts.map +1 -0
  83. package/dist/server/response-finalization.js +279 -0
  84. package/dist/server/response-finalization.js.map +1 -0
  85. package/dist/server/route-definitions.d.ts +139 -0
  86. package/dist/server/route-definitions.d.ts.map +1 -0
  87. package/dist/server/route-definitions.js +94 -0
  88. package/dist/server/route-definitions.js.map +1 -0
  89. package/dist/server/route-matching.d.ts +15 -0
  90. package/dist/server/route-matching.d.ts.map +1 -0
  91. package/dist/server/route-matching.js +46 -0
  92. package/dist/server/route-matching.js.map +1 -0
  93. package/dist/server/server.d.ts +6 -157
  94. package/dist/server/server.d.ts.map +1 -1
  95. package/dist/server/server.js +29 -1340
  96. package/dist/server/server.js.map +1 -1
  97. package/dist/server/use-case-route.d.ts +1 -1
  98. package/dist/testing/index.d.ts +1 -1
  99. package/dist/testing/index.d.ts.map +1 -1
  100. package/dist/testing/index.js +1 -0
  101. package/dist/testing/index.js.map +1 -1
  102. package/dist/tracing/index.d.ts +1 -1
  103. package/dist/tracing/index.d.ts.map +1 -1
  104. package/dist/tracing/index.js.map +1 -1
  105. package/dist/uploads/client.js +4 -7
  106. package/dist/uploads/client.js.map +1 -1
  107. package/dist/uploads/index.d.ts.map +1 -1
  108. package/dist/uploads/index.js +59 -12
  109. package/dist/uploads/index.js.map +1 -1
  110. package/package.json +5 -5
  111. package/skills/app-architecture/SKILL.md +31 -1
  112. package/src/agent-capabilities/index.ts +578 -0
  113. package/src/application/index.ts +19 -5
  114. package/src/client/client.ts +41 -17
  115. package/src/contracts/contract-builder.ts +8 -23
  116. package/src/contracts/contract-group.ts +4 -6
  117. package/src/contracts/metadata.ts +20 -0
  118. package/src/contracts/types.ts +39 -0
  119. package/src/events/index.ts +16 -20
  120. package/src/flags/index.ts +0 -5
  121. package/src/idempotency/index.ts +17 -9
  122. package/src/jobs/index.ts +8 -3
  123. package/src/notifications/index.ts +678 -70
  124. package/src/openapi/index.ts +24 -12
  125. package/src/ports/auth.ts +2 -0
  126. package/src/ports/events.ts +2 -2
  127. package/src/ports/index.ts +0 -1
  128. package/src/providers/index.ts +1 -0
  129. package/src/providers/provider.ts +18 -3
  130. package/src/schedules/index.ts +57 -63
  131. package/src/server/index.ts +4 -2
  132. package/src/server/request-executor.ts +1170 -0
  133. package/src/server/request-preparation.ts +409 -0
  134. package/src/server/response-finalization.ts +385 -0
  135. package/src/server/route-definitions.ts +338 -0
  136. package/src/server/route-matching.ts +64 -0
  137. package/src/server/server.ts +63 -2171
  138. package/src/server/use-case-route.ts +1 -1
  139. package/src/testing/index.ts +2 -0
  140. package/src/tracing/index.ts +1 -0
  141. package/src/uploads/client.ts +4 -7
  142. package/src/uploads/index.ts +70 -12
@@ -1,3 +1,4 @@
1
+ import { createJobs, retry, } from "../jobs/index.js";
1
2
  import { createProvider, createProviderInstrumentation, } from "../providers/index.js";
2
3
  /**
3
4
  * Error thrown when notification payload validation fails.
@@ -22,19 +23,46 @@ export class NotificationDeliveryError extends Error {
22
23
  */
23
24
  notificationName;
24
25
  /**
25
- * Channel that failed.
26
+ * First channel that failed, retained for concise error handling.
26
27
  */
27
28
  channel;
28
29
  /**
29
- * Original channel error.
30
+ * Original error for the first failed channel when available.
30
31
  */
31
32
  cause;
33
+ /**
34
+ * Complete notification result after every selected channel ran.
35
+ */
36
+ result;
37
+ /**
38
+ * Failed channel results.
39
+ */
40
+ failures;
41
+ /**
42
+ * Original channel errors in delivery order.
43
+ */
44
+ errors;
32
45
  constructor(args) {
33
- super(`Notification "${args.notificationName}" failed on channel "${args.channel}": ${args.cause instanceof Error ? args.cause.message : String(args.cause)}`);
46
+ const failures = args.result.results.filter((result) => result.status === "failed");
47
+ const firstFailure = failures[0];
48
+ const errors = args.errors ?? [];
49
+ super(`Notification "${args.result.notificationName}" failed on ${failures.length} channel${failures.length === 1 ? "" : "s"}: ${failures.map((failure) => failure.channel).join(", ")}.`);
34
50
  this.name = "NotificationDeliveryError";
35
- this.notificationName = args.notificationName;
36
- this.channel = args.channel;
37
- this.cause = args.cause;
51
+ this.notificationName = args.result.notificationName;
52
+ this.channel = firstFailure?.channel ?? "unknown";
53
+ this.cause = errors.find((entry) => entry.channel === firstFailure?.channel)?.error;
54
+ this.result = args.result;
55
+ this.failures = failures;
56
+ this.errors = errors;
57
+ }
58
+ }
59
+ /**
60
+ * Error thrown when a notification registry cannot safely resolve a delivery.
61
+ */
62
+ export class NotificationRegistryError extends Error {
63
+ constructor(message) {
64
+ super(message);
65
+ this.name = "NotificationRegistryError";
38
66
  }
39
67
  }
40
68
  function formatPath(path) {
@@ -77,17 +105,67 @@ function resolveChannelNames(notification, options) {
77
105
  const available = Object.keys(notification.channels);
78
106
  const selected = options?.channels ?? available;
79
107
  for (const channel of selected) {
80
- if (!notification.channels[channel]) {
108
+ if (typeof notification.channels[channel] !== "function") {
81
109
  throw new Error(`Notification "${notification.name}" does not define channel "${channel}".`);
82
110
  }
83
111
  }
84
112
  return selected;
85
113
  }
86
114
  function summarizeResults(results) {
115
+ const queued = results.filter((result) => result.status === "queued").length;
87
116
  const sent = results.filter((result) => result.status === "sent").length;
88
117
  const skipped = results.filter((result) => result.status === "skipped").length;
89
118
  const failed = results.filter((result) => result.status === "failed").length;
90
- return { sent, skipped, failed };
119
+ return { queued, sent, skipped, failed };
120
+ }
121
+ function resultSummary(results) {
122
+ const summary = summarizeResults(results);
123
+ const parts = [
124
+ summary.queued ? `${summary.queued} queued` : undefined,
125
+ `${summary.sent} sent`,
126
+ `${summary.skipped} skipped`,
127
+ `${summary.failed} failed`,
128
+ ].filter((part) => Boolean(part));
129
+ return parts.join(", ");
130
+ }
131
+ function recordChannelResult(instrumentation, notificationName, result, options) {
132
+ instrumentation.custom({
133
+ name: `notification.channel.${result.status}`,
134
+ label: `Notification channel ${result.status}`,
135
+ summary: `${notificationName} (${result.channel})`,
136
+ requestId: options.requestId,
137
+ traceId: options.traceId,
138
+ spanId: options.spanId,
139
+ parentSpanId: options.parentSpanId,
140
+ traceparent: options.traceparent,
141
+ details: {
142
+ notificationName,
143
+ channel: result.channel,
144
+ status: result.status,
145
+ id: result.id,
146
+ provider: result.provider,
147
+ reason: result.reason,
148
+ resultDetails: result.details,
149
+ metadata: options.metadata,
150
+ },
151
+ });
152
+ }
153
+ async function failedChannelResult(error, args, onError) {
154
+ if (onError) {
155
+ try {
156
+ const handled = await onError(error, args);
157
+ if (handled)
158
+ return { ...handled, channel: args.channel };
159
+ }
160
+ catch {
161
+ // Error observers cannot interrupt delivery of the remaining channels.
162
+ }
163
+ }
164
+ return {
165
+ channel: args.channel,
166
+ status: "failed",
167
+ reason: error instanceof Error ? error.message : String(error),
168
+ };
91
169
  }
92
170
  function defineNotificationImpl(name, options) {
93
171
  return {
@@ -98,6 +176,136 @@ function defineNotificationImpl(name, options) {
98
176
  channels: options.channels,
99
177
  };
100
178
  }
179
+ function isRecord(value) {
180
+ return typeof value === "object" && value !== null && !Array.isArray(value);
181
+ }
182
+ function contextInstrumentationTarget(ctx) {
183
+ if (!isRecord(ctx))
184
+ return undefined;
185
+ return isRecord(ctx.ports) ? ctx.ports : ctx;
186
+ }
187
+ const notificationDeliveryPayloadSchema = {
188
+ "~standard": {
189
+ version: 1,
190
+ vendor: "beignet",
191
+ validate(value) {
192
+ if (!isRecord(value)) {
193
+ return { issues: [{ message: "Expected an object." }] };
194
+ }
195
+ const issues = [];
196
+ if (typeof value.notificationName !== "string" ||
197
+ value.notificationName.length === 0) {
198
+ issues.push({
199
+ message: "Expected a non-empty string.",
200
+ path: ["notificationName"],
201
+ });
202
+ }
203
+ if (typeof value.channel !== "string" || value.channel.length === 0) {
204
+ issues.push({
205
+ message: "Expected a non-empty string.",
206
+ path: ["channel"],
207
+ });
208
+ }
209
+ if (!("payload" in value)) {
210
+ issues.push({ message: "Required.", path: ["payload"] });
211
+ }
212
+ if (!isRecord(value.options)) {
213
+ issues.push({ message: "Expected an object.", path: ["options"] });
214
+ }
215
+ const deliveryOptions = isRecord(value.options) ? value.options : {};
216
+ const correlationFields = [
217
+ "requestId",
218
+ "traceId",
219
+ "spanId",
220
+ "parentSpanId",
221
+ "traceparent",
222
+ ];
223
+ for (const field of correlationFields) {
224
+ if (deliveryOptions[field] !== undefined &&
225
+ typeof deliveryOptions[field] !== "string") {
226
+ issues.push({
227
+ message: "Expected a string.",
228
+ path: ["options", field],
229
+ });
230
+ }
231
+ }
232
+ if (deliveryOptions.metadata !== undefined &&
233
+ !isRecord(deliveryOptions.metadata)) {
234
+ issues.push({
235
+ message: "Expected an object.",
236
+ path: ["options", "metadata"],
237
+ });
238
+ }
239
+ if (issues.length > 0)
240
+ return { issues };
241
+ return {
242
+ value: {
243
+ notificationName: value.notificationName,
244
+ channel: value.channel,
245
+ payload: value.payload,
246
+ options: queuedSendOptions(deliveryOptions),
247
+ },
248
+ };
249
+ },
250
+ },
251
+ };
252
+ /**
253
+ * Define the notification catalog available to durable delivery workers.
254
+ * Duplicate names throw because queued delivery resolves definitions by name.
255
+ */
256
+ export function defineNotificationRegistry(definitions) {
257
+ const byName = new Map();
258
+ for (const notification of definitions) {
259
+ if (byName.has(notification.name)) {
260
+ throw new NotificationRegistryError(`Duplicate notification definition "${notification.name}" in notification registry.`);
261
+ }
262
+ byName.set(notification.name, notification);
263
+ }
264
+ return {
265
+ definitions: [...definitions],
266
+ get(name) {
267
+ return byName.get(name);
268
+ },
269
+ };
270
+ }
271
+ /**
272
+ * Define the generic job that resolves and delivers one notification channel.
273
+ * Register the returned job with every worker or outbox registry that can
274
+ * receive queued notifications.
275
+ */
276
+ export function defineNotificationDeliveryJob(options) {
277
+ const name = (options.name ?? "notifications.deliver");
278
+ const { defineJob } = createJobs();
279
+ const job = defineJob(name, {
280
+ payload: notificationDeliveryPayloadSchema,
281
+ description: "Deliver one notification channel.",
282
+ retry: options.retry ?? retry.exponential({ attempts: 3 }),
283
+ timeout: options.timeout,
284
+ hooks: options.hooks,
285
+ async handle({ payload, ctx }) {
286
+ const notification = options.registry.get(payload.notificationName);
287
+ if (!notification) {
288
+ throw new NotificationRegistryError(`Notification "${payload.notificationName}" is not registered for queued delivery.`);
289
+ }
290
+ if (!notification.channels[payload.channel]) {
291
+ throw new NotificationRegistryError(`Notification "${payload.notificationName}" does not define queued channel "${payload.channel}".`);
292
+ }
293
+ const dispatcher = createInlineNotificationDispatcher({
294
+ ctx,
295
+ preferences: options.preferences,
296
+ failureMode: "throw",
297
+ instrumentation: contextInstrumentationTarget(ctx),
298
+ });
299
+ await dispatcher.send(notification, payload.payload, {
300
+ ...payload.options,
301
+ channels: [payload.channel],
302
+ });
303
+ },
304
+ });
305
+ return Object.assign(job, {
306
+ registry: options.registry,
307
+ });
308
+ }
101
309
  /**
102
310
  * Validate and parse a notification payload with the notification's Standard
103
311
  * Schema.
@@ -111,8 +319,9 @@ export async function parseNotificationPayload(notification, payload) {
111
319
  * Create an inline notification dispatcher.
112
320
  *
113
321
  * The dispatcher validates payloads and runs selected channel handlers
114
- * immediately. Use this directly in tests and local apps, or wrap it in jobs
115
- * and outbox delivery for production background execution.
322
+ * immediately. Channel failures are isolated and reported after every selected
323
+ * channel runs. Use this directly in tests and local apps, or use
324
+ * `createQueuedNotificationDispatcher(...)` for background execution.
116
325
  */
117
326
  export function createInlineNotificationDispatcher(options = {}) {
118
327
  const instrumentation = createProviderInstrumentation(options.instrumentation, {
@@ -125,6 +334,7 @@ export function createInlineNotificationDispatcher(options = {}) {
125
334
  const channels = resolveChannelNames(notification, sendOptions);
126
335
  const ctx = await resolveCtx(options.ctx);
127
336
  const results = [];
337
+ const errors = [];
128
338
  instrumentation.custom({
129
339
  name: "notification.send.started",
130
340
  label: "Notification started",
@@ -142,58 +352,57 @@ export function createInlineNotificationDispatcher(options = {}) {
142
352
  });
143
353
  for (const channel of channels) {
144
354
  const handler = notification.channels[channel];
355
+ const args = {
356
+ notification,
357
+ payload: parsed,
358
+ ctx,
359
+ channel,
360
+ };
145
361
  try {
146
- const result = await handler({
147
- notification,
148
- payload: parsed,
149
- ctx,
150
- channel,
151
- });
152
- results.push(result ?? {
153
- channel,
154
- status: "sent",
362
+ const preference = await options.preferences?.evaluate({
363
+ ...args,
364
+ metadata: sendOptions.metadata,
155
365
  });
156
- }
157
- catch (error) {
158
- const args = {
159
- notification,
160
- payload: parsed,
161
- ctx,
162
- channel,
163
- };
164
- const handled = await options.onError?.(error, args);
165
- if (handled) {
166
- results.push(handled);
366
+ if (preference && !preference.deliver) {
367
+ const result = {
368
+ channel,
369
+ status: "skipped",
370
+ reason: preference.reason ?? "Disabled by notification preferences.",
371
+ details: {
372
+ source: "preferences",
373
+ },
374
+ };
375
+ results.push(result);
376
+ recordChannelResult(instrumentation, notification.name, result, sendOptions);
167
377
  continue;
168
378
  }
169
- instrumentation.custom({
170
- name: "notification.send.failed",
171
- label: "Notification failed",
172
- summary: `${notification.name} (${channel})`,
173
- requestId: sendOptions.requestId,
174
- traceId: sendOptions.traceId,
175
- spanId: sendOptions.spanId,
176
- parentSpanId: sendOptions.parentSpanId,
177
- traceparent: sendOptions.traceparent,
178
- details: {
179
- notificationName: notification.name,
379
+ const handled = await handler(args);
380
+ const result = handled
381
+ ? { ...handled, channel }
382
+ : {
180
383
  channel,
181
- error: error instanceof Error ? error.message : String(error),
182
- metadata: sendOptions.metadata,
183
- },
184
- });
185
- throw new NotificationDeliveryError({
186
- notificationName: notification.name,
187
- channel,
188
- cause: error,
189
- });
384
+ status: "sent",
385
+ };
386
+ results.push(result);
387
+ recordChannelResult(instrumentation, notification.name, result, sendOptions);
388
+ }
389
+ catch (error) {
390
+ errors.push({ channel, error });
391
+ const result = await failedChannelResult(error, args, options.onError);
392
+ results.push(result);
393
+ recordChannelResult(instrumentation, notification.name, result, sendOptions);
190
394
  }
191
395
  }
192
- const summary = summarizeResults(results);
396
+ const result = {
397
+ notificationName: notification.name,
398
+ payload: parsed,
399
+ channels,
400
+ results,
401
+ };
193
402
  instrumentation.custom({
194
403
  name: "notification.send.completed",
195
- label: "Notification sent",
196
- summary: `${notification.name} (${summary.sent} sent, ${summary.skipped} skipped, ${summary.failed} failed)`,
404
+ label: "Notification completed",
405
+ summary: `${notification.name} (${resultSummary(results)})`,
197
406
  requestId: sendOptions.requestId,
198
407
  traceId: sendOptions.traceId,
199
408
  spanId: sendOptions.spanId,
@@ -206,12 +415,11 @@ export function createInlineNotificationDispatcher(options = {}) {
206
415
  metadata: sendOptions.metadata,
207
416
  },
208
417
  });
209
- return {
210
- notificationName: notification.name,
211
- payload: parsed,
212
- channels,
213
- results,
214
- };
418
+ if (options.failureMode === "throw" &&
419
+ results.some((channelResult) => channelResult.status === "failed")) {
420
+ throw new NotificationDeliveryError({ result, errors });
421
+ }
422
+ return result;
215
423
  },
216
424
  };
217
425
  }
@@ -243,6 +451,136 @@ export function createInlineNotificationsProvider(options = {}) {
243
451
  },
244
452
  });
245
453
  }
454
+ function queuedSendOptions(options) {
455
+ const queued = {};
456
+ if (isRecord(options.metadata))
457
+ queued.metadata = options.metadata;
458
+ if (typeof options.requestId === "string")
459
+ queued.requestId = options.requestId;
460
+ if (typeof options.traceId === "string")
461
+ queued.traceId = options.traceId;
462
+ if (typeof options.spanId === "string")
463
+ queued.spanId = options.spanId;
464
+ if (typeof options.parentSpanId === "string") {
465
+ queued.parentSpanId = options.parentSpanId;
466
+ }
467
+ if (typeof options.traceparent === "string")
468
+ queued.traceparent = options.traceparent;
469
+ return queued;
470
+ }
471
+ /**
472
+ * Create a notification dispatcher that enqueues one delivery job per channel.
473
+ * Separate jobs keep provider retries from resending channels that already
474
+ * completed successfully.
475
+ */
476
+ export function createQueuedNotificationDispatcher(options) {
477
+ const instrumentation = createProviderInstrumentation(options.instrumentation, {
478
+ providerName: "queued-notifications",
479
+ watcher: "notifications",
480
+ });
481
+ return {
482
+ async send(notification, payload, sendOptions = {}) {
483
+ const registered = options.deliveryJob.registry.get(notification.name);
484
+ if (!registered) {
485
+ throw new NotificationRegistryError(`Notification "${notification.name}" is not registered for queued delivery.`);
486
+ }
487
+ const parsed = await parseNotificationPayload(registered, payload);
488
+ const channels = resolveChannelNames(registered, sendOptions);
489
+ const results = [];
490
+ instrumentation.custom({
491
+ name: "notification.enqueue.started",
492
+ label: "Notification enqueue started",
493
+ summary: notification.name,
494
+ requestId: sendOptions.requestId,
495
+ traceId: sendOptions.traceId,
496
+ spanId: sendOptions.spanId,
497
+ parentSpanId: sendOptions.parentSpanId,
498
+ traceparent: sendOptions.traceparent,
499
+ details: {
500
+ notificationName: notification.name,
501
+ channels,
502
+ metadata: sendOptions.metadata,
503
+ jobName: options.deliveryJob.name,
504
+ },
505
+ });
506
+ for (const channel of channels) {
507
+ let result;
508
+ try {
509
+ await options.jobs.dispatch(options.deliveryJob, {
510
+ notificationName: notification.name,
511
+ channel,
512
+ payload: parsed,
513
+ options: queuedSendOptions(sendOptions),
514
+ });
515
+ result = {
516
+ channel,
517
+ status: "queued",
518
+ provider: "jobs",
519
+ details: {
520
+ jobName: options.deliveryJob.name,
521
+ },
522
+ };
523
+ }
524
+ catch (error) {
525
+ result = {
526
+ channel,
527
+ status: "failed",
528
+ reason: error instanceof Error ? error.message : String(error),
529
+ details: {
530
+ phase: "enqueue",
531
+ jobName: options.deliveryJob.name,
532
+ },
533
+ };
534
+ }
535
+ results.push(result);
536
+ recordChannelResult(instrumentation, notification.name, result, sendOptions);
537
+ }
538
+ const result = {
539
+ notificationName: notification.name,
540
+ payload: parsed,
541
+ channels,
542
+ results,
543
+ };
544
+ instrumentation.custom({
545
+ name: "notification.enqueue.completed",
546
+ label: "Notification enqueue completed",
547
+ summary: `${notification.name} (${resultSummary(results)})`,
548
+ requestId: sendOptions.requestId,
549
+ traceId: sendOptions.traceId,
550
+ spanId: sendOptions.spanId,
551
+ parentSpanId: sendOptions.parentSpanId,
552
+ traceparent: sendOptions.traceparent,
553
+ details: {
554
+ notificationName: notification.name,
555
+ channels,
556
+ results,
557
+ metadata: sendOptions.metadata,
558
+ jobName: options.deliveryJob.name,
559
+ },
560
+ });
561
+ return result;
562
+ },
563
+ };
564
+ }
565
+ /**
566
+ * Create a provider that contributes a job-backed notification dispatcher.
567
+ */
568
+ export function createQueuedNotificationsProvider(options) {
569
+ return createProvider()({
570
+ name: options.name ?? "queued-notifications",
571
+ setup({ ports }) {
572
+ return {
573
+ ports: {
574
+ notifications: createQueuedNotificationDispatcher({
575
+ jobs: ports.jobs,
576
+ deliveryJob: options.deliveryJob,
577
+ instrumentation: ports,
578
+ }),
579
+ },
580
+ };
581
+ },
582
+ });
583
+ }
246
584
  /**
247
585
  * Define a mail-backed notification channel.
248
586
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/notifications/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAMV,KAAK,GACN,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAkf/B;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD;;OAEG;IACM,MAAM,CAAoC;IAEnD,YAAY,IAGX;QACC,KAAK,CACH,iBAAiB,IAAI,CAAC,IAAI,gCAAgC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACtF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD;;OAEG;IACM,gBAAgB,CAAS;IAClC;;OAEG;IACM,OAAO,CAAS;IACzB;;OAEG;IACM,KAAK,CAAU;IACxB;;OAEG;IACM,MAAM,CAAyB;IACxC;;OAEG;IACM,QAAQ,CAAuC;IACxD;;OAEG;IACM,MAAM,CAAsC;IAErD,YAAY,IAGX;QACC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CACzC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CACvC,CAAC;QACF,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,KAAK,CACH,iBAAiB,IAAI,CAAC,MAAM,CAAC,gBAAgB,eAAe,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpL,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,SAAS,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CACtB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,YAAY,EAAE,OAAO,CACnD,EAAE,KAAK,CAAC;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,SAAS,UAAU,CAAC,IAAoC;IACtD,IAAI,CAAC,IAAI,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAE7B,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACf,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO;QACjE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACpB;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAAyC;IAC7D,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,KAAc,EACd,IAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEzD,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,2BAA2B,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,KAAkC,CAAC;IACnD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,GAAgD;IAEhD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAQ,GAA+B,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,GAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAGC,EACD,OAIa;IAEb,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,iBAAiB,YAAY,CAAC,IAAI,8BAA8B,OAAO,IAAI,CAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA6C;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CACxC,CAAC,MAAM,CAAC;IACT,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IAE7E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,aAAa,CAAC,OAA6C;IAClE,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG;QACZ,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,SAAS;QACvD,GAAG,OAAO,CAAC,IAAI,OAAO;QACtB,GAAG,OAAO,CAAC,OAAO,UAAU;QAC5B,GAAG,OAAO,CAAC,MAAM,SAAS;KAC3B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,mBAAmB,CAC1B,eAAiE,EACjE,gBAAwB,EACxB,MAAiC,EACjC,OAAgC;IAEhC,eAAe,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,wBAAwB,MAAM,CAAC,MAAM,EAAE;QAC7C,KAAK,EAAE,wBAAwB,MAAM,CAAC,MAAM,EAAE;QAC9C,OAAO,EAAE,GAAG,gBAAgB,KAAK,MAAM,CAAC,OAAO,GAAG;QAClD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE;YACP,gBAAgB;YAChB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAc,EACd,IAAwD,EACxD,OAA4D;IAE5D,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3C,IAAI,OAAO;gBAAE,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAK7B,IAAU,EACV,OAAgD;IAEhD,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,4BAA4B,CACnC,GAAY;IAEZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,MAAM,iCAAiC,GAAsC;IAC3E,WAAW,EAAE;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,SAAS;QACjB,QAAQ,CAAC,KAAc;YACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;YAC1D,CAAC;YAED,MAAM,MAAM,GAA6B,EAAE,CAAC;YAC5C,IACE,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ;gBAC1C,KAAK,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EACnC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,8BAA8B;oBACvC,IAAI,EAAE,CAAC,kBAAkB,CAAC;iBAC3B,CAAC,CAAC;YACL,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,8BAA8B;oBACvC,IAAI,EAAE,CAAC,SAAS,CAAC;iBAClB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,iBAAiB,GAAG;gBACxB,WAAW;gBACX,SAAS;gBACT,QAAQ;gBACR,cAAc;gBACd,aAAa;aACL,CAAC;YACX,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;gBACtC,IACE,eAAe,CAAC,KAAK,CAAC,KAAK,SAAS;oBACpC,OAAO,eAAe,CAAC,KAAK,CAAC,KAAK,QAAQ,EAC1C,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,oBAAoB;wBAC7B,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC;qBACzB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IACE,eAAe,CAAC,QAAQ,KAAK,SAAS;gBACtC,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,EACnC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,qBAAqB;oBAC9B,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;iBAC9B,CAAC,CAAC;YACL,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAEzC,OAAO;gBACL,KAAK,EAAE;oBACL,gBAAgB,EAAE,KAAK,CAAC,gBAA0B;oBAClD,OAAO,EAAE,KAAK,CAAC,OAAiB;oBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC;iBAC5C;aACF,CAAC;QACJ,CAAC;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAoE;IAEpE,MAAM,MAAM,GAAG,IAAI,GAAG,EAGnB,CAAC;IAEJ,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,yBAAyB,CACjC,sCAAsC,YAAY,CAAC,IAAI,6BAA6B,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC;QAC7B,GAAG,CAAC,IAAI;YACN,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAI3C,OAAwD;IAExD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,uBAAuB,CAAS,CAAC;IAC/D,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,EAAO,CAAC;IACxC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE;QAC1B,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EAAE,mCAAmC;QAChD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE;YAC3B,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACpE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,yBAAyB,CACjC,iBAAiB,OAAO,CAAC,gBAAgB,0CAA0C,CACpF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,yBAAyB,CACjC,iBAAiB,OAAO,CAAC,gBAAgB,qCAAqC,OAAO,CAAC,OAAO,IAAI,CAClG,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,kCAAkC,CAAM;gBACzD,GAAG;gBACH,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAE,OAAO;gBACpB,eAAe,EAAE,4BAA4B,CAAC,GAAG,CAAC;aACnD,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,YAA+B,EAAE,OAAO,CAAC,OAAO,EAAE;gBACtE,GAAG,OAAO,CAAC,OAAO;gBAClB,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;aAC5B,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAE5C,YAAe,EAAE,OAAgB;IACjC,OAAO,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE;QACxD,IAAI,EAAE,YAAY,CAAC,IAAI;KACxB,CAAC,CAAgC,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kCAAkC,CAChD,UAAoD,EAAE;IAEtD,MAAM,eAAe,GAAG,6BAA6B,CACnD,OAAO,CAAC,eAAe,EACvB;QACE,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,eAAe;KACzB,CACF,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,IAAI,CACR,YAAe,EACf,OAAoC,EACpC,cAAuC,EAAE;YAEzC,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAChE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAgC,EAAE,CAAC;YAChD,MAAM,MAAM,GAA+B,EAAE,CAAC;YAE9C,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,2BAA2B;gBACjC,KAAK,EAAE,sBAAsB;gBAC7B,OAAO,EAAE,YAAY,CAAC,IAAI;gBAC1B,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,WAAW;gBACpC,OAAO,EAAE;oBACP,gBAAgB,EAAE,YAAY,CAAC,IAAI;oBACnC,QAAQ;oBACR,QAAQ,EAAE,WAAW,CAAC,QAAQ;iBAC/B;aACF,CAAC,CAAC;YAEH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,IAAI,GAAG;oBACX,YAAY;oBACZ,OAAO,EAAE,MAAM;oBACf,GAAG;oBACH,OAAO;iBACqD,CAAC;gBAE/D,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;wBACrD,GAAG,IAAI;wBACP,QAAQ,EAAE,WAAW,CAAC,QAAQ;qBAC/B,CAAC,CAAC;oBACH,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;wBACtC,MAAM,MAAM,GAAG;4BACb,OAAO;4BACP,MAAM,EAAE,SAAS;4BACjB,MAAM,EACJ,UAAU,CAAC,MAAM,IAAI,uCAAuC;4BAC9D,OAAO,EAAE;gCACP,MAAM,EAAE,aAAa;6BACtB;yBACkC,CAAC;wBACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACrB,mBAAmB,CACjB,eAAe,EACf,YAAY,CAAC,IAAI,EACjB,MAAM,EACN,WAAW,CACZ,CAAC;wBACF,SAAS;oBACX,CAAC;oBAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;oBACpC,MAAM,MAAM,GAAG,OAAO;wBACpB,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;wBACzB,CAAC,CAAE;4BACC,OAAO;4BACP,MAAM,EAAE,MAAM;yBACsB,CAAC;oBAE3C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,mBAAmB,CACjB,eAAe,EACf,YAAY,CAAC,IAAI,EACjB,MAAM,EACN,WAAW,CACZ,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,KAAK,EACL,IAAI,EACJ,OAAO,CAAC,OAAO,CAChB,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,mBAAmB,CACjB,eAAe,EACf,YAAY,CAAC,IAAI,EACjB,MAAM,EACN,WAAW,CACZ,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG;gBACb,gBAAgB,EAAE,YAAY,CAAC,IAAI;gBACnC,OAAO,EAAE,MAAM;gBACf,QAAQ;gBACR,OAAO;aACyB,CAAC;YACnC,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,6BAA6B;gBACnC,KAAK,EAAE,wBAAwB;gBAC/B,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,OAAO,CAAC,GAAG;gBAC3D,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,WAAW;gBACpC,OAAO,EAAE;oBACP,gBAAgB,EAAE,YAAY,CAAC,IAAI;oBACnC,QAAQ;oBACR,OAAO;oBACP,QAAQ,EAAE,WAAW,CAAC,QAAQ;iBAC/B;aACF,CAAC,CAAC;YAEH,IACE,OAAO,CAAC,WAAW,KAAK,OAAO;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,KAAK,QAAQ,CAAC,EAClE,CAAC;gBACD,MAAM,IAAI,yBAAyB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AA0BD;;;;;;;;;GASG;AACH,MAAM,UAAU,iCAAiC,CAC/C,UAA8C,EAAE;IAEhD,MAAM,EAAE,IAAI,GAAG,sBAAsB,EAAE,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAExE,OAAO,cAAc,CAAC;QACpB,IAAI;QACJ,KAAK,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE;YACnC,MAAM,aAAa,GAAG,kCAAkC,CAAC;gBACvD,GAAG,iBAAiB;gBACpB,GAAG,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE;gBACjC,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;YAEH,OAAO;gBACL,KAAK,EAAE;oBACL,aAAa;iBAC6B;aAC7C,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAgE;IAEhE,MAAM,MAAM,GAA8C,EAAE,CAAC;IAC7D,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnE,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;QACvC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACvC,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC1E,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACvE,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC7C,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ;QACzC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kCAAkC,CAChD,OAAuD;IAEvD,MAAM,eAAe,GAAG,6BAA6B,CACnD,OAAO,CAAC,eAAe,EACvB;QACE,YAAY,EAAE,sBAAsB;QACpC,OAAO,EAAE,eAAe;KACzB,CACF,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,IAAI,CACR,YAAe,EACf,OAAoC,EACpC,cAAuC,EAAE;YAEzC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,yBAAyB,CACjC,iBAAiB,YAAY,CAAC,IAAI,0CAA0C,CAC7E,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAgC,EAAE,CAAC;YAEhD,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,8BAA8B;gBACpC,KAAK,EAAE,8BAA8B;gBACrC,OAAO,EAAE,YAAY,CAAC,IAAI;gBAC1B,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,WAAW;gBACpC,OAAO,EAAE;oBACP,gBAAgB,EAAE,YAAY,CAAC,IAAI;oBACnC,QAAQ;oBACR,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC9B,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI;iBAClC;aACF,CAAC,CAAC;YAEH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,MAAiC,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC/C,gBAAgB,EAAE,YAAY,CAAC,IAAI;wBACnC,OAAO;wBACP,OAAO,EAAE,MAAM;wBACf,OAAO,EAAE,iBAAiB,CAAC,WAAW,CAAC;qBACxC,CAAC,CAAC;oBACH,MAAM,GAAG;wBACP,OAAO;wBACP,MAAM,EAAE,QAAQ;wBAChB,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE;4BACP,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI;yBAClC;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,GAAG;wBACP,OAAO;wBACP,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC9D,OAAO,EAAE;4BACP,KAAK,EAAE,SAAS;4BAChB,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI;yBAClC;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,mBAAmB,CACjB,eAAe,EACf,YAAY,CAAC,IAAI,EACjB,MAAM,EACN,WAAW,CACZ,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG;gBACb,gBAAgB,EAAE,YAAY,CAAC,IAAI;gBACnC,OAAO,EAAE,MAAM;gBACf,QAAQ;gBACR,OAAO;aACyB,CAAC;YACnC,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,gCAAgC;gBACtC,KAAK,EAAE,gCAAgC;gBACvC,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,OAAO,CAAC,GAAG;gBAC3D,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,WAAW,EAAE,WAAW,CAAC,WAAW;gBACpC,OAAO,EAAE;oBACP,gBAAgB,EAAE,YAAY,CAAC,IAAI;oBACnC,QAAQ;oBACR,OAAO;oBACP,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC9B,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI;iBAClC;aACF,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAgBD;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAC/C,OAAsD;IAEtD,OAAO,cAAc,EAA2B,CAAC;QAC/C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,sBAAsB;QAC5C,KAAK,CAAC,EAAE,KAAK,EAAE;YACb,OAAO;gBACL,KAAK,EAAE;oBACL,aAAa,EAAE,kCAAkC,CAAC;wBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,eAAe,EAAE,KAAK;qBACvB,CAAC;iBACwC;aAC7C,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAI3C,MAA8C;IAE9C,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,+BAA+B;aACxC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAC1C,UAA+C,EAAE;IAEjD,MAAM,UAAU,GAAiC,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAErD,OAAO;QACL,IAAI,UAAU;YACZ,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,IAAI,CACR,YAAe,EACf,OAAoC,EACpC,cAAuC,EAAE;YAEzC,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAChE,MAAM,QAAQ,GAA+B;gBAC3C,EAAE,EAAE,EAAE,EAAE;gBACR,gBAAgB,EAAE,YAAY,CAAC,IAAI;gBACnC,OAAO,EAAE,MAAM;gBACf,QAAQ;gBACR,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,MAAM,EAAE,GAAG,EAAE;aACd,CAAC;YAEF,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC;YAEjC,OAAO;gBACL,gBAAgB,EAAE,YAAY,CAAC,IAAI;gBACnC,OAAO,EAAE,MAAM;gBACf,QAAQ;gBACR,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAClC,OAAO;oBACP,MAAM,EAAE,MAAM;oBACd,EAAE,EAAE,QAAQ,CAAC,EAAE;oBACf,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;qBACf;iBACF,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,KAAK;YACH,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,kBAAkB,CAChB,IAAU,EACV,OAAgD;YAEhD,OAAO,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -145,8 +145,13 @@ function addPathParams(contract, operation, state) {
145
145
  }
146
146
  const shape = state.introspector.getShape(contract.pathParams);
147
147
  if (!shape) {
148
- if (pathKeys.length > 0) {
149
- throw new Error(`Unable to introspect pathParams for contract "${contract.name}" at "${contract.path}". OpenAPI path parameters must match the path template.`);
148
+ for (const key of pathKeys) {
149
+ addParameter(operation, {
150
+ name: key,
151
+ in: "path",
152
+ required: true,
153
+ schema: { type: "string" },
154
+ });
150
155
  }
151
156
  return;
152
157
  }
@@ -184,12 +189,8 @@ function addQueryParams(contract, operation, state) {
184
189
  for (const key of Object.keys(shape)) {
185
190
  const originalField = shape[key];
186
191
  const optional = state.introspector.isOptional(originalField);
187
- let description = state.introspector.getDescription(originalField);
188
192
  const field = originalField;
189
- // If outer optional didn't have description, check inner type
190
- if (!description && optional) {
191
- description = state.introspector.getDescription(field);
192
- }
193
+ const description = parameterDescription(field, optional, state);
193
194
  const paramSchemaRef = schemaToConvertedSchemaRef(field, `${contract.name}_query_${key}`, state, "input");
194
195
  const param = {
195
196
  name: key,
@@ -213,7 +214,7 @@ function addHeaderParams(contract, operation, state) {
213
214
  for (const key of Object.keys(shape)) {
214
215
  const originalField = shape[key];
215
216
  const optional = state.introspector.isOptional(originalField);
216
- const description = state.introspector.getDescription(originalField);
217
+ const description = parameterDescription(originalField, optional, state);
217
218
  const paramSchemaRef = schemaToConvertedSchemaRef(originalField, `${contract.name}_header_${key}`, state, "input");
218
219
  addParameter(operation, {
219
220
  name: key,
@@ -225,6 +226,12 @@ function addHeaderParams(contract, operation, state) {
225
226
  }
226
227
  }
227
228
  }
229
+ function parameterDescription(field, optional, state) {
230
+ return (state.introspector.getDescription(field) ??
231
+ (optional
232
+ ? state.introspector.getDescription(state.introspector.unwrapOptional(field))
233
+ : undefined));
234
+ }
228
235
  /**
229
236
  * Add request body from contract to operation
230
237
  */