@empire-builder-kit/runtime 1.0.0-beta.8 → 1.0.0-rc.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 (218) hide show
  1. package/NOTICE +6 -0
  2. package/package.json +93 -3
  3. package/src/api-contract/artifacts.d.ts +67 -0
  4. package/src/api-contract/artifacts.js +349 -0
  5. package/src/api-contract/artifacts.js.map +1 -0
  6. package/src/api-contract/client.d.ts +79 -0
  7. package/src/api-contract/client.js +561 -0
  8. package/src/api-contract/client.js.map +1 -0
  9. package/src/api-contract/errors.d.ts +7 -0
  10. package/src/api-contract/errors.js +11 -0
  11. package/src/api-contract/errors.js.map +1 -0
  12. package/src/api-contract/index.d.ts +9 -0
  13. package/src/api-contract/index.js +10 -0
  14. package/src/api-contract/index.js.map +1 -0
  15. package/src/api-contract/operation.d.ts +118 -0
  16. package/src/api-contract/operation.js +609 -0
  17. package/src/api-contract/operation.js.map +1 -0
  18. package/src/api-contract/schema.d.ts +81 -0
  19. package/src/api-contract/schema.js +313 -0
  20. package/src/api-contract/schema.js.map +1 -0
  21. package/src/api-contract/server.d.ts +77 -0
  22. package/src/api-contract/server.js +466 -0
  23. package/src/api-contract/server.js.map +1 -0
  24. package/src/async-work/contract.d.ts +17 -0
  25. package/src/async-work/contract.js +105 -0
  26. package/src/async-work/contract.js.map +1 -0
  27. package/src/async-work/idempotency.d.ts +123 -0
  28. package/src/async-work/idempotency.js +167 -0
  29. package/src/async-work/idempotency.js.map +1 -0
  30. package/src/async-work/index.d.ts +8 -0
  31. package/src/async-work/index.js +9 -0
  32. package/src/async-work/index.js.map +1 -0
  33. package/src/async-work/provider.d.ts +90 -0
  34. package/src/async-work/provider.js +155 -0
  35. package/src/async-work/provider.js.map +1 -0
  36. package/src/async-work/recovery.d.ts +103 -0
  37. package/src/async-work/recovery.js +291 -0
  38. package/src/async-work/recovery.js.map +1 -0
  39. package/src/async-work/schedule.d.ts +117 -0
  40. package/src/async-work/schedule.js +279 -0
  41. package/src/async-work/schedule.js.map +1 -0
  42. package/src/async-work/sqs.d.ts +133 -0
  43. package/src/async-work/sqs.js +280 -0
  44. package/src/async-work/sqs.js.map +1 -0
  45. package/src/async-work/webhook.d.ts +60 -0
  46. package/src/async-work/webhook.js +178 -0
  47. package/src/async-work/webhook.js.map +1 -0
  48. package/src/async-work/workflow.d.ts +98 -0
  49. package/src/async-work/workflow.js +225 -0
  50. package/src/async-work/workflow.js.map +1 -0
  51. package/src/auth-backend.d.ts +12 -2
  52. package/src/auth-backend.js +30 -18
  53. package/src/auth-backend.js.map +1 -1
  54. package/src/authorization/admission.d.ts +30 -0
  55. package/src/authorization/admission.js +87 -0
  56. package/src/authorization/admission.js.map +1 -0
  57. package/src/authorization/approval.d.ts +99 -0
  58. package/src/authorization/approval.js +249 -0
  59. package/src/authorization/approval.js.map +1 -0
  60. package/src/authorization/audit.d.ts +35 -0
  61. package/src/authorization/audit.js +35 -0
  62. package/src/authorization/audit.js.map +1 -0
  63. package/src/authorization/delegation.d.ts +149 -0
  64. package/src/authorization/delegation.js +401 -0
  65. package/src/authorization/delegation.js.map +1 -0
  66. package/src/authorization/errors.d.ts +32 -0
  67. package/src/authorization/errors.js +153 -0
  68. package/src/authorization/errors.js.map +1 -0
  69. package/src/authorization/evaluator.d.ts +39 -0
  70. package/src/authorization/evaluator.js +199 -0
  71. package/src/authorization/evaluator.js.map +1 -0
  72. package/src/authorization/index.d.ts +14 -0
  73. package/src/authorization/index.js +15 -0
  74. package/src/authorization/index.js.map +1 -0
  75. package/src/authorization/machine-token.d.ts +87 -0
  76. package/src/authorization/machine-token.js +201 -0
  77. package/src/authorization/machine-token.js.map +1 -0
  78. package/src/authorization/machine.d.ts +32 -0
  79. package/src/authorization/machine.js +41 -0
  80. package/src/authorization/machine.js.map +1 -0
  81. package/src/authorization/model.d.ts +112 -0
  82. package/src/authorization/model.js +112 -0
  83. package/src/authorization/model.js.map +1 -0
  84. package/src/canonical-json.cjs +157 -0
  85. package/src/canonical-json.d.cts +26 -0
  86. package/src/canonical-json.d.ts +18 -0
  87. package/src/canonical-json.js +125 -0
  88. package/src/canonical-json.js.map +1 -0
  89. package/src/configuration/contract.d.ts +107 -0
  90. package/src/configuration/contract.js +461 -0
  91. package/src/configuration/contract.js.map +1 -0
  92. package/src/configuration/index.d.ts +3 -0
  93. package/src/configuration/index.js +4 -0
  94. package/src/configuration/index.js.map +1 -0
  95. package/src/configuration/provider.d.ts +59 -0
  96. package/src/configuration/provider.js +198 -0
  97. package/src/configuration/provider.js.map +1 -0
  98. package/src/configuration/rollout-evaluator.cjs +54 -0
  99. package/src/configuration/rollout-evaluator.d.cts +26 -0
  100. package/src/configuration/rollout-evaluator.d.ts +18 -0
  101. package/src/configuration/rollout-evaluator.js +38 -0
  102. package/src/configuration/rollout-evaluator.js.map +1 -0
  103. package/src/configuration/rollout-key.cjs +38 -0
  104. package/src/configuration/rollout-key.d.cts +14 -0
  105. package/src/configuration/rollout-key.d.ts +10 -0
  106. package/src/configuration/rollout-key.js +26 -0
  107. package/src/configuration/rollout-key.js.map +1 -0
  108. package/src/configuration/rollout.d.ts +60 -0
  109. package/src/configuration/rollout.js +42 -0
  110. package/src/configuration/rollout.js.map +1 -0
  111. package/src/data-lifecycle/contract.d.ts +33 -0
  112. package/src/data-lifecycle/contract.js +118 -0
  113. package/src/data-lifecycle/contract.js.map +1 -0
  114. package/src/data-lifecycle/event.d.ts +28 -0
  115. package/src/data-lifecycle/event.js +76 -0
  116. package/src/data-lifecycle/event.js.map +1 -0
  117. package/src/data-lifecycle/evidence.d.ts +65 -0
  118. package/src/data-lifecycle/evidence.js +162 -0
  119. package/src/data-lifecycle/evidence.js.map +1 -0
  120. package/src/data-lifecycle/holds.d.ts +29 -0
  121. package/src/data-lifecycle/holds.js +124 -0
  122. package/src/data-lifecycle/holds.js.map +1 -0
  123. package/src/data-lifecycle/index.d.ts +8 -0
  124. package/src/data-lifecycle/index.js +9 -0
  125. package/src/data-lifecycle/index.js.map +1 -0
  126. package/src/data-lifecycle/policy.d.ts +16 -0
  127. package/src/data-lifecycle/policy.js +79 -0
  128. package/src/data-lifecycle/policy.js.map +1 -0
  129. package/src/data-lifecycle/restore.d.ts +90 -0
  130. package/src/data-lifecycle/restore.js +336 -0
  131. package/src/data-lifecycle/restore.js.map +1 -0
  132. package/src/data-lifecycle/retention.d.ts +57 -0
  133. package/src/data-lifecycle/retention.js +232 -0
  134. package/src/data-lifecycle/retention.js.map +1 -0
  135. package/src/data-lifecycle/rights.d.ts +171 -0
  136. package/src/data-lifecycle/rights.js +533 -0
  137. package/src/data-lifecycle/rights.js.map +1 -0
  138. package/src/database.d.ts +36 -0
  139. package/src/database.js +119 -0
  140. package/src/database.js.map +1 -0
  141. package/src/deterministic-order.cjs +16 -0
  142. package/src/deterministic-order.d.cts +9 -0
  143. package/src/deterministic-order.d.ts +7 -0
  144. package/src/deterministic-order.js +10 -0
  145. package/src/deterministic-order.js.map +1 -0
  146. package/src/events.d.ts +28 -19
  147. package/src/events.js +171 -66
  148. package/src/events.js.map +1 -1
  149. package/src/index.d.ts +7 -1
  150. package/src/index.js +24 -0
  151. package/src/index.js.map +1 -1
  152. package/src/lambda.d.ts +8 -2
  153. package/src/lambda.js +100 -39
  154. package/src/lambda.js.map +1 -1
  155. package/src/logging.d.ts +95 -36
  156. package/src/logging.js +460 -62
  157. package/src/logging.js.map +1 -1
  158. package/src/observability.d.ts +80 -18
  159. package/src/observability.js +252 -61
  160. package/src/observability.js.map +1 -1
  161. package/src/performance/index.d.ts +1 -0
  162. package/src/performance/index.js +2 -0
  163. package/src/performance/index.js.map +1 -0
  164. package/src/performance/protected-load-endpoint.d.ts +140 -0
  165. package/src/performance/protected-load-endpoint.js +462 -0
  166. package/src/performance/protected-load-endpoint.js.map +1 -0
  167. package/src/rds-global-ca-bundle.d.ts +1 -0
  168. package/src/rds-global-ca-bundle.js +2742 -0
  169. package/src/rds-global-ca-bundle.js.map +1 -0
  170. package/src/reliability/burn.d.ts +39 -0
  171. package/src/reliability/burn.js +102 -0
  172. package/src/reliability/burn.js.map +1 -0
  173. package/src/reliability/contract.d.ts +5 -0
  174. package/src/reliability/contract.js +317 -0
  175. package/src/reliability/contract.js.map +1 -0
  176. package/src/reliability/incident.d.ts +16 -0
  177. package/src/reliability/incident.js +562 -0
  178. package/src/reliability/incident.js.map +1 -0
  179. package/src/reliability/index.d.ts +5 -0
  180. package/src/reliability/index.js +6 -0
  181. package/src/reliability/index.js.map +1 -0
  182. package/src/reliability/model.d.ts +191 -0
  183. package/src/reliability/model.fixtures.d.ts +2 -0
  184. package/src/reliability/model.fixtures.js +57 -0
  185. package/src/reliability/model.fixtures.js.map +1 -0
  186. package/src/reliability/model.js +2 -0
  187. package/src/reliability/model.js.map +1 -0
  188. package/src/reliability/slo.d.ts +9 -0
  189. package/src/reliability/slo.js +74 -0
  190. package/src/reliability/slo.js.map +1 -0
  191. package/src/request-context.d.ts +57 -15
  192. package/src/request-context.js +116 -36
  193. package/src/request-context.js.map +1 -1
  194. package/src/safe-reference.cjs +57 -0
  195. package/src/safe-reference.d.cts +25 -0
  196. package/src/safe-reference.d.ts +11 -0
  197. package/src/safe-reference.js +46 -0
  198. package/src/safe-reference.js.map +1 -0
  199. package/src/secrets/contract.d.ts +99 -0
  200. package/src/secrets/contract.js +238 -0
  201. package/src/secrets/contract.js.map +1 -0
  202. package/src/secrets/index.d.ts +4 -0
  203. package/src/secrets/index.js +5 -0
  204. package/src/secrets/index.js.map +1 -0
  205. package/src/secrets/observability.d.ts +14 -0
  206. package/src/secrets/observability.js +100 -0
  207. package/src/secrets/observability.js.map +1 -0
  208. package/src/secrets/personal.d.ts +48 -0
  209. package/src/secrets/personal.js +332 -0
  210. package/src/secrets/personal.js.map +1 -0
  211. package/src/secrets/resolver.d.ts +125 -0
  212. package/src/secrets/resolver.js +602 -0
  213. package/src/secrets/resolver.js.map +1 -0
  214. package/src/secrets/sensitive-patterns.cjs +84 -0
  215. package/src/secrets/sensitive-patterns.d.cts +62 -0
  216. package/src/secrets/sensitive-patterns.d.ts +40 -0
  217. package/src/secrets/sensitive-patterns.js +60 -0
  218. package/src/secrets/sensitive-patterns.js.map +1 -0
@@ -0,0 +1,280 @@
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { asyncWorkDigest, compareAsyncStrings, failAsyncWork, requireAsyncIdentifier, requireAsyncInteger, requireAsyncNumber, requireCanonicalAsyncTimestamp, } from './contract.js';
3
+ function normalizeRetryPolicy(policy) {
4
+ const normalized = {
5
+ attemptTimeoutMs: requireAsyncInteger(policy.attemptTimeoutMs, '/policy/attemptTimeoutMs', 1, 900000),
6
+ baseDelayMs: requireAsyncInteger(policy.baseDelayMs, '/policy/baseDelayMs', 1, 3600000),
7
+ maximumAttempts: requireAsyncInteger(policy.maximumAttempts, '/policy/maximumAttempts', 1, 100),
8
+ maximumDelayMs: requireAsyncInteger(policy.maximumDelayMs, '/policy/maximumDelayMs', 1, 3600000),
9
+ totalTimeoutMs: requireAsyncInteger(policy.totalTimeoutMs, '/policy/totalTimeoutMs', 1, 86400000),
10
+ };
11
+ if (normalized.attemptTimeoutMs >= normalized.totalTimeoutMs) {
12
+ failAsyncWork('async-input-invalid', '/policy/attemptTimeoutMs', 'must be shorter than the total retry budget');
13
+ }
14
+ if (normalized.baseDelayMs > normalized.maximumDelayMs) {
15
+ failAsyncWork('async-input-invalid', '/policy/baseDelayMs', 'must not exceed maximumDelayMs');
16
+ }
17
+ return normalized;
18
+ }
19
+ function timedAttempt(attempt, attemptNumber, timeoutMs) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ const controller = new AbortController();
22
+ let timeout;
23
+ try {
24
+ return yield Promise.race([
25
+ attempt({ attempt: attemptNumber, signal: controller.signal }),
26
+ new Promise((resolve) => {
27
+ timeout = setTimeout(() => {
28
+ resolve({ errorCode: 'attempt-timeout', outcome: 'retryable' });
29
+ controller.abort();
30
+ }, timeoutMs);
31
+ }),
32
+ ]);
33
+ }
34
+ catch (_a) {
35
+ return { errorCode: 'unhandled-attempt-error', outcome: 'retryable' };
36
+ }
37
+ finally {
38
+ if (timeout)
39
+ clearTimeout(timeout);
40
+ }
41
+ });
42
+ }
43
+ /**
44
+ * Applies a single bounded retry budget with full jitter. SDK retries should
45
+ * be disabled or included in this declared total attempt budget.
46
+ */
47
+ export function executeWithRetry(input) {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ var _a, _b, _c;
50
+ const policy = normalizeRetryPolicy(input.policy);
51
+ const now = (_a = input.now) !== null && _a !== void 0 ? _a : Date.now;
52
+ const random = (_b = input.random) !== null && _b !== void 0 ? _b : Math.random;
53
+ const sleep = (_c = input.sleep) !== null && _c !== void 0 ? _c : ((milliseconds) => new Promise((resolve) => {
54
+ setTimeout(resolve, milliseconds);
55
+ }));
56
+ const startedAt = now();
57
+ let lastErrorCode = 'retry-budget-exhausted';
58
+ let attempts = 0;
59
+ for (let attempt = 1; attempt <= policy.maximumAttempts; attempt += 1) {
60
+ const elapsed = Math.max(0, now() - startedAt);
61
+ const remaining = policy.totalTimeoutMs - elapsed;
62
+ if (remaining <= 0)
63
+ break;
64
+ attempts = attempt;
65
+ const result = yield timedAttempt(input.attempt, attempt, Math.min(policy.attemptTimeoutMs, remaining));
66
+ if (result.outcome === 'succeeded') {
67
+ return { attempts: attempt, outcome: 'succeeded', value: result.value };
68
+ }
69
+ lastErrorCode = requireAsyncIdentifier(result.errorCode, `/attempts/${attempt - 1}/errorCode`);
70
+ if (result.outcome === 'terminal') {
71
+ return {
72
+ attempts: attempt,
73
+ errorCode: lastErrorCode,
74
+ outcome: 'terminal',
75
+ };
76
+ }
77
+ if (attempt === policy.maximumAttempts)
78
+ break;
79
+ const cap = Math.min(policy.maximumDelayMs, policy.baseDelayMs * Math.pow(2, (attempt - 1)));
80
+ const randomValue = requireAsyncNumber(random(), '/random', 0, 1);
81
+ const delay = Math.floor(cap * randomValue);
82
+ const remainingAfterAttempt = policy.totalTimeoutMs - (now() - startedAt);
83
+ if (delay >= remainingAfterAttempt)
84
+ break;
85
+ yield sleep(delay);
86
+ }
87
+ return {
88
+ attempts,
89
+ errorCode: lastErrorCode,
90
+ outcome: 'retry-exhausted',
91
+ };
92
+ });
93
+ }
94
+ /**
95
+ * Produces AWS Lambda's partial-batch response without ever returning message
96
+ * bodies. Terminal records remain failed so SQS moves them through the
97
+ * declared receive count to the DLQ instead of silently dropping them.
98
+ */
99
+ export function processSqsBatch(input) {
100
+ return __awaiter(this, void 0, void 0, function* () {
101
+ if (!Array.isArray(input.records) || input.records.length > 10) {
102
+ failAsyncWork('async-input-invalid', '/records', 'must contain at most ten SQS records');
103
+ }
104
+ const seen = new Set();
105
+ const failures = [];
106
+ let succeeded = 0;
107
+ for (const [index, record] of input.records.entries()) {
108
+ const messageId = requireAsyncIdentifier(record === null || record === void 0 ? void 0 : record.messageId, `/records/${index}/messageId`);
109
+ if (seen.has(messageId)) {
110
+ failAsyncWork('async-input-invalid', `/records/${index}/messageId`, 'must be unique inside one Lambda batch');
111
+ }
112
+ seen.add(messageId);
113
+ let outcome;
114
+ try {
115
+ outcome = yield input.handler(record);
116
+ }
117
+ catch (_a) {
118
+ outcome = { errorCode: 'unhandled-handler-error', outcome: 'retry' };
119
+ }
120
+ if ((outcome === null || outcome === void 0 ? void 0 : outcome.outcome) === 'succeeded') {
121
+ succeeded += 1;
122
+ continue;
123
+ }
124
+ if (!outcome ||
125
+ !['retry', 'terminal'].includes(outcome.outcome) ||
126
+ typeof outcome.errorCode !== 'string') {
127
+ failAsyncWork('async-adapter-outcome-invalid', `/records/${index}/outcome`, 'handler must return succeeded, retry, or terminal');
128
+ }
129
+ failures.push({
130
+ errorCode: requireAsyncIdentifier(outcome.errorCode, `/records/${index}/outcome/errorCode`),
131
+ messageId,
132
+ outcome: outcome.outcome,
133
+ });
134
+ }
135
+ return {
136
+ failed: failures.length,
137
+ failureMetadata: failures,
138
+ response: {
139
+ batchItemFailures: failures.map(({ messageId }) => ({
140
+ itemIdentifier: messageId,
141
+ })),
142
+ },
143
+ succeeded,
144
+ total: input.records.length,
145
+ };
146
+ });
147
+ }
148
+ function normalizeDlqScope(scope) {
149
+ const receivedAfter = scope.receivedAfter === undefined
150
+ ? undefined
151
+ : requireCanonicalAsyncTimestamp(scope.receivedAfter, '/scope/receivedAfter');
152
+ const receivedBefore = scope.receivedBefore === undefined
153
+ ? undefined
154
+ : requireCanonicalAsyncTimestamp(scope.receivedBefore, '/scope/receivedBefore');
155
+ if (receivedAfter &&
156
+ receivedBefore &&
157
+ Date.parse(receivedAfter) >= Date.parse(receivedBefore)) {
158
+ failAsyncWork('async-input-invalid', '/scope', 'receivedAfter must precede receivedBefore');
159
+ }
160
+ if (!Array.isArray(scope.workTypes) || scope.workTypes.length === 0) {
161
+ failAsyncWork('async-input-invalid', '/scope/workTypes', 'must explicitly name at least one work type');
162
+ }
163
+ const workTypes = scope.workTypes
164
+ .map((value, index) => requireAsyncIdentifier(value, `/scope/workTypes/${index}`))
165
+ .sort(compareAsyncStrings);
166
+ if (new Set(workTypes).size !== workTypes.length) {
167
+ failAsyncWork('async-input-invalid', '/scope/workTypes', 'must not contain duplicates');
168
+ }
169
+ return Object.assign(Object.assign(Object.assign({ maximumMessages: requireAsyncInteger(scope.maximumMessages, '/scope/maximumMessages', 1, 10000) }, (receivedAfter ? { receivedAfter } : {})), (receivedBefore ? { receivedBefore } : {})), { workTypes });
170
+ }
171
+ export function createDlqRedriveReport(input) {
172
+ const preparedAt = requireCanonicalAsyncTimestamp(input.preparedAt, '/preparedAt');
173
+ const expiresAt = requireCanonicalAsyncTimestamp(input.expiresAt, '/expiresAt');
174
+ if (Date.parse(expiresAt) <= Date.parse(preparedAt)) {
175
+ failAsyncWork('async-input-invalid', '/expiresAt', 'must be later than preparedAt');
176
+ }
177
+ if (!['ordinary', 'protected'].includes(input.approvalClass)) {
178
+ failAsyncWork('async-input-invalid', '/approvalClass', 'must be ordinary or protected');
179
+ }
180
+ const scope = normalizeDlqScope(input.scope);
181
+ if (!Array.isArray(input.messages) || input.messages.length > 100000) {
182
+ failAsyncWork('async-input-invalid', '/messages', 'must contain at most 100000 metadata records');
183
+ }
184
+ const allowedTypes = new Set(scope.workTypes);
185
+ const selected = input.messages
186
+ .map((message, index) => ({
187
+ messageId: requireAsyncIdentifier(message.messageId, `/messages/${index}/messageId`),
188
+ receivedAt: requireCanonicalAsyncTimestamp(message.receivedAt, `/messages/${index}/receivedAt`),
189
+ receiveCount: requireAsyncInteger(message.receiveCount, `/messages/${index}/receiveCount`, 1, 1000000),
190
+ workType: requireAsyncIdentifier(message.workType, `/messages/${index}/workType`),
191
+ }))
192
+ .filter((message) => allowedTypes.has(message.workType) &&
193
+ (!scope.receivedAfter ||
194
+ Date.parse(message.receivedAt) >= Date.parse(scope.receivedAfter)) &&
195
+ (!scope.receivedBefore ||
196
+ Date.parse(message.receivedAt) < Date.parse(scope.receivedBefore)))
197
+ .sort((left, right) => {
198
+ const time = compareAsyncStrings(left.receivedAt, right.receivedAt);
199
+ return time || compareAsyncStrings(left.messageId, right.messageId);
200
+ })
201
+ .slice(0, scope.maximumMessages);
202
+ const messageIds = selected.map(({ messageId }) => messageId);
203
+ if (new Set(messageIds).size !== messageIds.length) {
204
+ failAsyncWork('async-input-invalid', '/messages', 'must not contain duplicate message IDs');
205
+ }
206
+ const material = {
207
+ approvalClass: input.approvalClass,
208
+ expiresAt,
209
+ messageIds,
210
+ preparedAt,
211
+ queue: requireAsyncIdentifier(input.queue, '/queue'),
212
+ ratePerSecond: requireAsyncNumber(input.ratePerSecond, '/ratePerSecond', 0.01, 10000),
213
+ scope,
214
+ selectedCount: selected.length,
215
+ version: 1,
216
+ };
217
+ const reportDigest = asyncWorkDigest(material);
218
+ return Object.assign(Object.assign({}, material), { reportDigest, reportId: asyncWorkDigest({
219
+ operation: 'dlq-redrive-v1',
220
+ reportDigest,
221
+ }) });
222
+ }
223
+ export function applyDlqRedrive(input) {
224
+ return __awaiter(this, void 0, void 0, function* () {
225
+ const now = requireCanonicalAsyncTimestamp(input.now, '/now');
226
+ const report = input.report;
227
+ const { reportDigest: ignoredDigest, reportId: ignoredId } = report, material = __rest(report, ["reportDigest", "reportId"]);
228
+ void ignoredDigest;
229
+ void ignoredId;
230
+ const expectedDigest = asyncWorkDigest(material);
231
+ if (report.version !== 1 ||
232
+ report.reportDigest !== expectedDigest ||
233
+ report.reportId !==
234
+ asyncWorkDigest({
235
+ operation: 'dlq-redrive-v1',
236
+ reportDigest: expectedDigest,
237
+ })) {
238
+ failAsyncWork('async-report-invalid', '/report', 'digest does not bind the exact redrive scope');
239
+ }
240
+ if (Date.parse(now) >= Date.parse(report.expiresAt)) {
241
+ failAsyncWork('async-report-expired', '/report/expiresAt', 'report expired');
242
+ }
243
+ if (report.approvalClass === 'protected' &&
244
+ (input.approvalId === undefined ||
245
+ !requireAsyncIdentifier(input.approvalId, '/approvalId'))) {
246
+ failAsyncWork('async-approval-required', '/approvalId', 'protected redrive requires an attributable approval');
247
+ }
248
+ const available = new Set(input.availableMessageIds.map((value, index) => requireAsyncIdentifier(value, `/availableMessageIds/${index}`)));
249
+ const pending = report.messageIds.filter((messageId) => available.has(messageId));
250
+ if (pending.length === 0) {
251
+ return {
252
+ acceptedCount: 0,
253
+ operationId: report.reportId,
254
+ outcome: 'converged',
255
+ remainingCount: 0,
256
+ };
257
+ }
258
+ const result = yield input.adapter.redrive({
259
+ messageIds: pending,
260
+ operationId: report.reportId,
261
+ ratePerSecond: report.ratePerSecond,
262
+ });
263
+ const accepted = new Set(result.acceptedMessageIds.map((value, index) => requireAsyncIdentifier(value, `/adapter/acceptedMessageIds/${index}`)));
264
+ if (accepted.size !== result.acceptedMessageIds.length) {
265
+ failAsyncWork('async-adapter-outcome-invalid', '/adapter/acceptedMessageIds', 'adapter returned duplicate accepted message IDs');
266
+ }
267
+ for (const messageId of accepted) {
268
+ if (!pending.includes(messageId)) {
269
+ failAsyncWork('async-adapter-outcome-invalid', '/adapter/acceptedMessageIds', 'adapter accepted a message outside the approved report');
270
+ }
271
+ }
272
+ return {
273
+ acceptedCount: accepted.size,
274
+ operationId: report.reportId,
275
+ outcome: 'applied',
276
+ remainingCount: pending.length - accepted.size,
277
+ };
278
+ });
279
+ }
280
+ //# sourceMappingURL=sqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqs.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/async-work/sqs.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,8BAA8B,GAC/B,MAAM,eAAe,CAAC;AAqCvB,SAAS,oBAAoB,CAAC,MAAqB;IACjD,MAAM,UAAU,GAAG;QACjB,gBAAgB,EAAE,mBAAmB,CACnC,MAAM,CAAC,gBAAgB,EACvB,0BAA0B,EAC1B,CAAC,EACD,MAAO,CACR;QACD,WAAW,EAAE,mBAAmB,CAC9B,MAAM,CAAC,WAAW,EAClB,qBAAqB,EACrB,CAAC,EACD,OAAS,CACV;QACD,eAAe,EAAE,mBAAmB,CAClC,MAAM,CAAC,eAAe,EACtB,yBAAyB,EACzB,CAAC,EACD,GAAG,CACJ;QACD,cAAc,EAAE,mBAAmB,CACjC,MAAM,CAAC,cAAc,EACrB,wBAAwB,EACxB,CAAC,EACD,OAAS,CACV;QACD,cAAc,EAAE,mBAAmB,CACjC,MAAM,CAAC,cAAc,EACrB,wBAAwB,EACxB,CAAC,EACD,QAAU,CACX;KACF,CAAC;IACF,IAAI,UAAU,CAAC,gBAAgB,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAC7D,aAAa,CACX,qBAAqB,EACrB,0BAA0B,EAC1B,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;QACvD,aAAa,CACX,qBAAqB,EACrB,qBAAqB,EACrB,gCAAgC,CACjC,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAe,YAAY,CACzB,OAAkD,EAClD,aAAqB,EACrB,SAAiB;;QAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;gBACxB,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC9D,IAAI,OAAO,CAA8B,CAAC,OAAO,EAAE,EAAE;oBACnD,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;wBACxB,OAAO,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;wBAChE,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC,EAAE,SAAS,CAAC,CAAC;gBAChB,CAAC,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO;gBAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CAAA;AAED;;;GAGG;AACH,MAAM,UAAgB,gBAAgB,CACpC,KAAqC;;;QAErC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAA,KAAK,CAAC,GAAG,mCAAI,IAAI,CAAC,GAAG,CAAC;QAClC,MAAM,MAAM,GAAG,MAAA,KAAK,CAAC,MAAM,mCAAI,IAAI,CAAC,MAAM,CAAC;QAC3C,MAAM,KAAK,GACT,MAAA,KAAK,CAAC,KAAK,mCACX,CAAC,CAAC,YAAoB,EAAE,EAAE,CACxB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,IAAI,aAAa,GAAG,wBAAwB,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC;YAClD,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM;YAC1B,QAAQ,GAAG,OAAO,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,KAAK,CAAC,OAAO,EACb,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAC7C,CAAC;YACF,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1E,CAAC;YACD,aAAa,GAAG,sBAAsB,CACpC,MAAM,CAAC,SAAS,EAChB,aAAa,OAAO,GAAG,CAAC,YAAY,CACrC,CAAC;YACF,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO;oBACL,QAAQ,EAAE,OAAO;oBACjB,SAAS,EAAE,aAAa;oBACxB,OAAO,EAAE,UAAU;iBACpB,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,KAAK,MAAM,CAAC,eAAe;gBAAE,MAAM;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,WAAW,GAAG,SAAA,CAAC,EAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA,CACxC,CAAC;YACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC;YAC5C,MAAM,qBAAqB,GAAG,MAAM,CAAC,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAC1E,IAAI,KAAK,IAAI,qBAAqB;gBAAE,MAAM;YAC1C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,aAAa;YACxB,OAAO,EAAE,iBAAiB;SAC3B,CAAC;IACJ,CAAC;CAAA;AA2BD;;;;GAIG;AACH,MAAM,UAAgB,eAAe,CAAC,KAGrC;;QACC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC/D,aAAa,CACX,qBAAqB,EACrB,UAAU,EACV,sCAAsC,CACvC,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,QAAQ,GAAwC,EAAE,CAAC;QACzD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,SAAS,GAAG,sBAAsB,CACtC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,EACjB,YAAY,KAAK,YAAY,CAC9B,CAAC;YACF,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxB,aAAa,CACX,qBAAqB,EACrB,YAAY,KAAK,YAAY,EAC7B,wCAAwC,CACzC,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpB,IAAI,OAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAAC,WAAM,CAAC;gBACP,OAAO,GAAG,EAAE,SAAS,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YACvE,CAAC;YACD,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,MAAK,WAAW,EAAE,CAAC;gBACrC,SAAS,IAAI,CAAC,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IACE,CAAC,OAAO;gBACR,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;gBAChD,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EACrC,CAAC;gBACD,aAAa,CACX,+BAA+B,EAC/B,YAAY,KAAK,UAAU,EAC3B,mDAAmD,CACpD,CAAC;YACJ,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,sBAAsB,CAC/B,OAAO,CAAC,SAAS,EACjB,YAAY,KAAK,oBAAoB,CACtC;gBACD,SAAS;gBACT,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,eAAe,EAAE,QAAQ;YACzB,QAAQ,EAAE;gBACR,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;oBAClD,cAAc,EAAE,SAAS;iBAC1B,CAAC,CAAC;aACJ;YACD,SAAS;YACT,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAC;IACJ,CAAC;CAAA;AAmCD,SAAS,iBAAiB,CACxB,KAAwB;IAExB,MAAM,aAAa,GACjB,KAAK,CAAC,aAAa,KAAK,SAAS;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,8BAA8B,CAC5B,KAAK,CAAC,aAAa,EACnB,sBAAsB,CACvB,CAAC;IACR,MAAM,cAAc,GAClB,KAAK,CAAC,cAAc,KAAK,SAAS;QAChC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,8BAA8B,CAC5B,KAAK,CAAC,cAAc,EACpB,uBAAuB,CACxB,CAAC;IACR,IACE,aAAa;QACb,cAAc;QACd,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EACvD,CAAC;QACD,aAAa,CACX,qBAAqB,EACrB,QAAQ,EACR,2CAA2C,CAC5C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,aAAa,CACX,qBAAqB,EACrB,kBAAkB,EAClB,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS;SAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACpB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,KAAK,EAAE,CAAC,CAC3D;SACA,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QACjD,aAAa,CACX,qBAAqB,EACrB,kBAAkB,EAClB,6BAA6B,CAC9B,CAAC;IACJ,CAAC;IACD,mDACE,eAAe,EAAE,mBAAmB,CAClC,KAAK,CAAC,eAAe,EACrB,wBAAwB,EACxB,CAAC,EACD,KAAM,CACP,IACE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACxC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAC7C,SAAS,IACT;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAQtC;IACC,MAAM,UAAU,GAAG,8BAA8B,CAC/C,KAAK,CAAC,UAAU,EAChB,aAAa,CACd,CAAC;IACF,MAAM,SAAS,GAAG,8BAA8B,CAC9C,KAAK,CAAC,SAAS,EACf,YAAY,CACb,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACpD,aAAa,CACX,qBAAqB,EACrB,YAAY,EACZ,+BAA+B,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7D,aAAa,CACX,qBAAqB,EACrB,gBAAgB,EAChB,+BAA+B,CAChC,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAO,EAAE,CAAC;QACtE,aAAa,CACX,qBAAqB,EACrB,WAAW,EACX,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;SAC5B,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACxB,SAAS,EAAE,sBAAsB,CAC/B,OAAO,CAAC,SAAS,EACjB,aAAa,KAAK,YAAY,CAC/B;QACD,UAAU,EAAE,8BAA8B,CACxC,OAAO,CAAC,UAAU,EAClB,aAAa,KAAK,aAAa,CAChC;QACD,YAAY,EAAE,mBAAmB,CAC/B,OAAO,CAAC,YAAY,EACpB,aAAa,KAAK,eAAe,EACjC,CAAC,EACD,OAAS,CACV;QACD,QAAQ,EAAE,sBAAsB,CAC9B,OAAO,CAAC,QAAQ,EAChB,aAAa,KAAK,WAAW,CAC9B;KACF,CAAC,CAAC;SACF,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;QAClC,CAAC,CAAC,KAAK,CAAC,aAAa;YACnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACpE,CAAC,CAAC,KAAK,CAAC,cAAc;YACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CACvE;SACA,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACpE,OAAO,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QACnD,aAAa,CACX,qBAAqB,EACrB,WAAW,EACX,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG;QACf,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS;QACT,UAAU;QACV,UAAU;QACV,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;QACpD,aAAa,EAAE,kBAAkB,CAC/B,KAAK,CAAC,aAAa,EACnB,gBAAgB,EAChB,IAAI,EACJ,KAAM,CACP;QACD,KAAK;QACL,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,OAAO,EAAE,CAAU;KACpB,CAAC;IACF,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/C,uCACK,QAAQ,KACX,YAAY,EACZ,QAAQ,EAAE,eAAe,CAAC;YACxB,SAAS,EAAE,gBAAgB;YAC3B,YAAY;SACb,CAAC,IACF;AACJ,CAAC;AAUD,MAAM,UAAgB,eAAe,CAAC,KAMrC;;QAMC,MAAM,GAAG,GAAG,8BAA8B,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,EACJ,YAAY,EAAE,aAAa,EAC3B,QAAQ,EAAE,SAAS,KAEjB,MAAM,EADL,QAAQ,UACT,MAAM,EAJJ,4BAIL,CAAS,CAAC;QACX,KAAK,aAAa,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACjD,IACE,MAAM,CAAC,OAAO,KAAK,CAAC;YACpB,MAAM,CAAC,YAAY,KAAK,cAAc;YACtC,MAAM,CAAC,QAAQ;gBACb,eAAe,CAAC;oBACd,SAAS,EAAE,gBAAgB;oBAC3B,YAAY,EAAE,cAAc;iBAC7B,CAAC,EACJ,CAAC;YACD,aAAa,CACX,sBAAsB,EACtB,SAAS,EACT,8CAA8C,CAC/C,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,aAAa,CACX,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,CACjB,CAAC;QACJ,CAAC;QACD,IACE,MAAM,CAAC,aAAa,KAAK,WAAW;YACpC,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;gBAC7B,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,EAC3D,CAAC;YACD,aAAa,CACX,yBAAyB,EACzB,aAAa,EACb,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7C,sBAAsB,CAAC,KAAK,EAAE,wBAAwB,KAAK,EAAE,CAAC,CAC/D,CACF,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CACrD,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CACzB,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,aAAa,EAAE,CAAC;gBAChB,WAAW,EAAE,MAAM,CAAC,QAAQ;gBAC5B,OAAO,EAAE,WAAW;gBACpB,cAAc,EAAE,CAAC;aAClB,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACzC,UAAU,EAAE,OAAO;YACnB,WAAW,EAAE,MAAM,CAAC,QAAQ;YAC5B,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAC7C,sBAAsB,CAAC,KAAK,EAAE,+BAA+B,KAAK,EAAE,CAAC,CACtE,CACF,CAAC;QACF,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YACvD,aAAa,CACX,+BAA+B,EAC/B,6BAA6B,EAC7B,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,aAAa,CACX,+BAA+B,EAC/B,6BAA6B,EAC7B,wDAAwD,CACzD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;YACL,aAAa,EAAE,QAAQ,CAAC,IAAI;YAC5B,WAAW,EAAE,MAAM,CAAC,QAAQ;YAC5B,OAAO,EAAE,SAAS;YAClB,cAAc,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI;SAC/C,CAAC;IACJ,CAAC;CAAA"}
@@ -0,0 +1,60 @@
1
+ export declare const ASYNC_WEBHOOK_RECEIPT_VERSION: 1;
2
+ export interface WebhookSigningKey {
3
+ keyId: string;
4
+ notAfter?: string;
5
+ notBefore: string;
6
+ secret: string | Uint8Array;
7
+ }
8
+ export interface VerifiedWebhookV1 {
9
+ account: string;
10
+ endpoint: string;
11
+ keyId: string;
12
+ payloadDigest: string;
13
+ provider: string;
14
+ signedAt: string;
15
+ version: 1;
16
+ }
17
+ /**
18
+ * Provider adapters can use this helper in fixtures and outbound webhook
19
+ * delivery. The signed material binds timestamp, endpoint, account, and the
20
+ * exact raw bytes.
21
+ */
22
+ export declare function signWebhookRequest(input: {
23
+ account: string;
24
+ endpoint: string;
25
+ keyId: string;
26
+ rawBody: Uint8Array;
27
+ secret: string | Uint8Array;
28
+ timestampSeconds: number;
29
+ }): string;
30
+ export declare function verifySignedWebhook(input: {
31
+ account: string;
32
+ endpoint: string;
33
+ keys: readonly WebhookSigningKey[];
34
+ maximumBodyBytes: number;
35
+ now: string;
36
+ provider: string;
37
+ rawBody: Uint8Array;
38
+ signatureHeader: string;
39
+ toleranceSeconds: number;
40
+ }): VerifiedWebhookV1;
41
+ export interface WebhookReceiptV1 {
42
+ account: string;
43
+ endpoint: string;
44
+ idempotencyKey: string;
45
+ payloadDigest: string;
46
+ provider: string;
47
+ providerEventId: string;
48
+ receivedAt: string;
49
+ version: typeof ASYNC_WEBHOOK_RECEIPT_VERSION;
50
+ }
51
+ /**
52
+ * The receipt intentionally contains no request body or parsed provider
53
+ * payload. The provider event ID plus payload digest makes a changed replay a
54
+ * conflict instead of silently treating it as a duplicate.
55
+ */
56
+ export declare function createWebhookReceipt(input: {
57
+ providerEventId: string;
58
+ receivedAt: string;
59
+ verified: VerifiedWebhookV1;
60
+ }): WebhookReceiptV1;
@@ -0,0 +1,178 @@
1
+ import { createHmac, timingSafeEqual } from 'node:crypto';
2
+ import { asyncWorkDigest, asyncWorkIdentity, failAsyncWork, requireAsyncIdentifier, requireAsyncInteger, requireCanonicalAsyncTimestamp, } from './contract.js';
3
+ export const ASYNC_WEBHOOK_RECEIPT_VERSION = 1;
4
+ function requireWebhookSecret(value, pointer) {
5
+ const length = typeof value === 'string'
6
+ ? Buffer.byteLength(value, 'utf8')
7
+ : value instanceof Uint8Array
8
+ ? value.byteLength
9
+ : 0;
10
+ if (length < 16 || length > 4096) {
11
+ failAsyncWork('async-input-invalid', pointer, 'must contain from 16 through 4096 secret bytes');
12
+ }
13
+ return value;
14
+ }
15
+ function signaturePayload(input) {
16
+ const prefix = Buffer.from(`${input.timestampSeconds}.${input.endpoint}.${input.account}.`, 'utf8');
17
+ return Buffer.concat([prefix, Buffer.from(input.rawBody)]);
18
+ }
19
+ function hmac(input) {
20
+ return createHmac('sha256', input.secret)
21
+ .update(signaturePayload(input))
22
+ .digest();
23
+ }
24
+ /**
25
+ * Provider adapters can use this helper in fixtures and outbound webhook
26
+ * delivery. The signed material binds timestamp, endpoint, account, and the
27
+ * exact raw bytes.
28
+ */
29
+ export function signWebhookRequest(input) {
30
+ const account = requireAsyncIdentifier(input.account, '/account');
31
+ const endpoint = requireAsyncIdentifier(input.endpoint, '/endpoint');
32
+ const keyId = requireAsyncIdentifier(input.keyId, '/keyId');
33
+ const timestampSeconds = requireAsyncInteger(input.timestampSeconds, '/timestampSeconds', 1, Number.MAX_SAFE_INTEGER);
34
+ if (!(input.rawBody instanceof Uint8Array)) {
35
+ failAsyncWork('async-input-invalid', '/rawBody', 'must be the exact request bytes');
36
+ }
37
+ const secret = requireWebhookSecret(input.secret, '/secret');
38
+ return `t=${timestampSeconds},k=${keyId},v1=${hmac({
39
+ account,
40
+ endpoint,
41
+ rawBody: input.rawBody,
42
+ secret,
43
+ timestampSeconds,
44
+ }).toString('hex')}`;
45
+ }
46
+ function parseSignatureHeader(value) {
47
+ if (typeof value !== 'string' ||
48
+ value.length === 0 ||
49
+ value.length > 1024 ||
50
+ /[\r\n]/.test(value)) {
51
+ failAsyncWork('async-webhook-signature-invalid', '/signatureHeader', 'must be a bounded single-line signature');
52
+ }
53
+ const fields = new Map();
54
+ for (const field of value.split(',')) {
55
+ const separator = field.indexOf('=');
56
+ if (separator < 1) {
57
+ failAsyncWork('async-webhook-signature-invalid', '/signatureHeader', 'contains a malformed field');
58
+ }
59
+ const name = field.slice(0, separator);
60
+ const item = field.slice(separator + 1);
61
+ if (fields.has(name) || !['k', 't', 'v1'].includes(name)) {
62
+ failAsyncWork('async-webhook-signature-invalid', '/signatureHeader', 'contains duplicate or unsupported fields');
63
+ }
64
+ fields.set(name, item);
65
+ }
66
+ const timestampText = fields.get('t');
67
+ const signatureText = fields.get('v1');
68
+ const keyId = fields.get('k');
69
+ if (!timestampText ||
70
+ !/^[1-9]\d{0,15}$/.test(timestampText) ||
71
+ !signatureText ||
72
+ !/^[a-f0-9]{64}$/.test(signatureText) ||
73
+ !keyId) {
74
+ failAsyncWork('async-webhook-signature-invalid', '/signatureHeader', 'must contain t, k, and one sha256 v1 signature');
75
+ }
76
+ return {
77
+ keyId: requireAsyncIdentifier(keyId, '/signatureHeader/k'),
78
+ signature: Buffer.from(signatureText, 'hex'),
79
+ timestampSeconds: Number(timestampText),
80
+ };
81
+ }
82
+ export function verifySignedWebhook(input) {
83
+ const now = requireCanonicalAsyncTimestamp(input.now, '/now');
84
+ const account = requireAsyncIdentifier(input.account, '/account');
85
+ const endpoint = requireAsyncIdentifier(input.endpoint, '/endpoint');
86
+ const provider = requireAsyncIdentifier(input.provider, '/provider');
87
+ const maximumBodyBytes = requireAsyncInteger(input.maximumBodyBytes, '/maximumBodyBytes', 1, 10 * 1024 * 1024);
88
+ const toleranceSeconds = requireAsyncInteger(input.toleranceSeconds, '/toleranceSeconds', 1, 86400);
89
+ if (!(input.rawBody instanceof Uint8Array) ||
90
+ input.rawBody.byteLength > maximumBodyBytes) {
91
+ failAsyncWork('async-input-invalid', '/rawBody', `must be exact request bytes no larger than ${maximumBodyBytes}`);
92
+ }
93
+ if (!Array.isArray(input.keys) ||
94
+ input.keys.length < 1 ||
95
+ input.keys.length > 2) {
96
+ failAsyncWork('async-input-invalid', '/keys', 'must contain the active key and at most one bounded overlap key');
97
+ }
98
+ const parsed = parseSignatureHeader(input.signatureHeader);
99
+ const signedAtMs = parsed.timestampSeconds * 1000;
100
+ if (Math.abs(Date.parse(now) - signedAtMs) > toleranceSeconds * 1000) {
101
+ failAsyncWork('async-webhook-timestamp-invalid', '/signatureHeader/t', 'is outside the accepted replay tolerance');
102
+ }
103
+ const keys = input.keys.map((candidate, index) => {
104
+ const notBefore = requireCanonicalAsyncTimestamp(candidate.notBefore, `/keys/${index}/notBefore`);
105
+ const notAfter = candidate.notAfter === undefined
106
+ ? undefined
107
+ : requireCanonicalAsyncTimestamp(candidate.notAfter, `/keys/${index}/notAfter`);
108
+ if (index > 0 && notAfter === undefined) {
109
+ failAsyncWork('async-input-invalid', `/keys/${index}/notAfter`, 'an overlap key must have a bounded revocation time');
110
+ }
111
+ if (notAfter !== undefined &&
112
+ Date.parse(notAfter) <= Date.parse(notBefore)) {
113
+ failAsyncWork('async-input-invalid', `/keys/${index}/notAfter`, 'must be later than notBefore');
114
+ }
115
+ return Object.assign(Object.assign({ keyId: requireAsyncIdentifier(candidate.keyId, `/keys/${index}/keyId`) }, (notAfter ? { notAfter } : {})), { notBefore, secret: requireWebhookSecret(candidate.secret, `/keys/${index}/secret`) });
116
+ });
117
+ if (new Set(keys.map(({ keyId }) => keyId)).size !== keys.length) {
118
+ failAsyncWork('async-input-invalid', '/keys', 'must not contain duplicate key IDs');
119
+ }
120
+ const keyIndex = keys.findIndex((candidate) => candidate.keyId === parsed.keyId);
121
+ if (keyIndex < 0) {
122
+ failAsyncWork('async-webhook-signature-invalid', '/signatureHeader/k', 'does not select an accepted key');
123
+ }
124
+ const key = keys[keyIndex];
125
+ const { notAfter, notBefore } = key;
126
+ if (signedAtMs < Date.parse(notBefore) ||
127
+ (notAfter !== undefined && signedAtMs >= Date.parse(notAfter))) {
128
+ failAsyncWork('async-webhook-signature-invalid', `/keys/${keyIndex}`, 'was not valid when the request was signed');
129
+ }
130
+ const expected = hmac({
131
+ account,
132
+ endpoint,
133
+ rawBody: input.rawBody,
134
+ secret: key.secret,
135
+ timestampSeconds: parsed.timestampSeconds,
136
+ });
137
+ if (expected.length !== parsed.signature.length ||
138
+ !timingSafeEqual(expected, parsed.signature)) {
139
+ failAsyncWork('async-webhook-signature-invalid', '/signatureHeader/v1', 'does not authenticate the exact raw request bytes and endpoint context');
140
+ }
141
+ return {
142
+ account,
143
+ endpoint,
144
+ keyId: parsed.keyId,
145
+ payloadDigest: asyncWorkDigest(Array.from(input.rawBody)),
146
+ provider,
147
+ signedAt: new Date(signedAtMs).toISOString(),
148
+ version: 1,
149
+ };
150
+ }
151
+ /**
152
+ * The receipt intentionally contains no request body or parsed provider
153
+ * payload. The provider event ID plus payload digest makes a changed replay a
154
+ * conflict instead of silently treating it as a duplicate.
155
+ */
156
+ export function createWebhookReceipt(input) {
157
+ var _a;
158
+ if (((_a = input.verified) === null || _a === void 0 ? void 0 : _a.version) !== 1) {
159
+ failAsyncWork('async-input-invalid', '/verified', 'must be a verified v1 webhook');
160
+ }
161
+ const providerEventId = requireAsyncIdentifier(input.providerEventId, '/providerEventId');
162
+ const receivedAt = requireCanonicalAsyncTimestamp(input.receivedAt, '/receivedAt');
163
+ return {
164
+ account: input.verified.account,
165
+ endpoint: input.verified.endpoint,
166
+ idempotencyKey: asyncWorkIdentity('webhook-receipt-v1', [
167
+ input.verified.provider,
168
+ input.verified.account,
169
+ providerEventId,
170
+ ]),
171
+ payloadDigest: input.verified.payloadDigest,
172
+ provider: input.verified.provider,
173
+ providerEventId,
174
+ receivedAt,
175
+ version: ASYNC_WEBHOOK_RECEIPT_VERSION,
176
+ };
177
+ }
178
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/async-work/webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ export declare const ASYNC_WORKFLOW_DEFINITION_VERSION: 1;
2
+ export declare const ASYNC_WORKFLOW_CALLBACK_VERSION: 1;
3
+ export interface WorkflowStepV1 {
4
+ compensationStepId?: string;
5
+ estimatedCostUsd: number;
6
+ maximumAttempts: number;
7
+ stepId: string;
8
+ timeoutSeconds: number;
9
+ }
10
+ export interface WorkflowDefinitionV1 {
11
+ dataClassification: string;
12
+ estimatedFailureCostUsd: number;
13
+ estimatedNormalCostUsd: number;
14
+ inputContract: string;
15
+ retentionDays: number;
16
+ steps: readonly WorkflowStepV1[];
17
+ version: typeof ASYNC_WORKFLOW_DEFINITION_VERSION;
18
+ workflow: string;
19
+ workflowVersion: number;
20
+ }
21
+ export declare function createWorkflowDefinition(input: Omit<WorkflowDefinitionV1, 'version'>): WorkflowDefinitionV1;
22
+ /**
23
+ * In-flight executions always resolve their recorded workflow version. A new
24
+ * deployment cannot silently reinterpret old state using the newest handler.
25
+ */
26
+ export declare function selectWorkflowVersion(input: {
27
+ definitions: readonly WorkflowDefinitionV1[];
28
+ execution: {
29
+ workflow: string;
30
+ workflowVersion: number;
31
+ };
32
+ }): WorkflowDefinitionV1;
33
+ export interface WorkflowCallbackClaimsV1 {
34
+ callbackId: string;
35
+ executionId: string;
36
+ expiresAt: string;
37
+ nonce: string;
38
+ version: typeof ASYNC_WORKFLOW_CALLBACK_VERSION;
39
+ workflow: string;
40
+ workflowVersion: number;
41
+ }
42
+ export declare function createWorkflowCallbackToken(input: {
43
+ claims: Omit<WorkflowCallbackClaimsV1, 'version'>;
44
+ secret: string | Uint8Array;
45
+ }): string;
46
+ export declare function verifyWorkflowCallbackToken(input: {
47
+ expected: {
48
+ callbackId: string;
49
+ executionId: string;
50
+ workflow: string;
51
+ workflowVersion: number;
52
+ };
53
+ now: string;
54
+ secret: string | Uint8Array;
55
+ token: string;
56
+ }): {
57
+ callbackClaimKey: string;
58
+ claims: WorkflowCallbackClaimsV1;
59
+ tokenDigest: string;
60
+ };
61
+ export type WorkflowExecutionStatus = 'cancelled' | 'cancellation-requested' | 'failed' | 'running' | 'succeeded' | 'waiting';
62
+ export interface WorkflowCancellationV1 {
63
+ actor: string;
64
+ executionId: string;
65
+ reason: string;
66
+ requestedAt: string;
67
+ status: 'cancellation-requested';
68
+ workflow: string;
69
+ }
70
+ export declare function requestWorkflowCancellation(input: {
71
+ actor: string;
72
+ executionId: string;
73
+ reason: string;
74
+ requestedAt: string;
75
+ status: WorkflowExecutionStatus;
76
+ workflow: string;
77
+ }): WorkflowCancellationV1;
78
+ export interface WorkflowCompensationActionV1 {
79
+ compensationStepId: string;
80
+ idempotencyKey: string;
81
+ originalStepId: string;
82
+ }
83
+ export declare function createCompensationPlan(input: {
84
+ authorizationId: string;
85
+ completedStepIds: readonly string[];
86
+ definition: WorkflowDefinitionV1;
87
+ executionId: string;
88
+ reason: string;
89
+ }): {
90
+ actions: readonly WorkflowCompensationActionV1[];
91
+ authorizationId: string;
92
+ executionId: string;
93
+ planDigest: string;
94
+ reason: string;
95
+ workflow: string;
96
+ workflowVersion: number;
97
+ };
98
+ export declare function workflowDefinitionDigest(definition: WorkflowDefinitionV1): string;