@empire-builder-kit/runtime 1.0.0-beta.9 → 1.0.0-rc.11

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 +94 -4
  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,103 @@
1
+ export declare const ASYNC_BOUNDED_REDRIVE_REPORT_VERSION: 1;
2
+ export interface BoundedRedriveScopeV1 {
3
+ maximumMessages: number;
4
+ maximumRatePerSecond: number;
5
+ maximumScannedMessages: number;
6
+ sentAfter: string;
7
+ sentBefore: string;
8
+ tenantReferenceDigests: readonly string[];
9
+ workTypes: readonly string[];
10
+ }
11
+ export interface BoundedRedriveReportV1 {
12
+ accountReferenceDigest: string;
13
+ destinationReferenceDigest: string;
14
+ expiresAt: string;
15
+ preparedAt: string;
16
+ region: string;
17
+ reportDigest: string;
18
+ scope: BoundedRedriveScopeV1;
19
+ slice: string;
20
+ sourceReferenceDigest: string;
21
+ stage: string;
22
+ version: typeof ASYNC_BOUNDED_REDRIVE_REPORT_VERSION;
23
+ }
24
+ export interface BoundedRedriveItem<TValue> {
25
+ messageReference: string;
26
+ sentAt: string;
27
+ tenantReference: string;
28
+ value: TValue;
29
+ workType: string;
30
+ }
31
+ export interface BoundedRedriveConvergence {
32
+ acknowledged: number;
33
+ completedLineageDigests: readonly string[];
34
+ failed: number;
35
+ lineageDigests: readonly string[];
36
+ operationHandle: string;
37
+ reportDigest: string;
38
+ scanned: number;
39
+ selected: number;
40
+ status: 'completed' | 'failed' | 'started';
41
+ }
42
+ export declare function validateRecoveryQueueContext(input: {
43
+ accountId: string;
44
+ allowedStages: readonly string[];
45
+ callerStage?: string;
46
+ expectedBinding: 'destination' | 'source';
47
+ expectedKind: string;
48
+ queueArn: string;
49
+ region: string;
50
+ slice: string;
51
+ tags: Readonly<Record<string, string | undefined>>;
52
+ }): {
53
+ kind: string;
54
+ stage: string;
55
+ };
56
+ export interface BoundedRedriveAdapter<TValue> {
57
+ acknowledge(item: BoundedRedriveItem<TValue>): Promise<boolean>;
58
+ converge(convergence: BoundedRedriveConvergence): Promise<BoundedRedriveConvergence>;
59
+ forward(item: BoundedRedriveItem<TValue>): Promise<boolean>;
60
+ read(reportDigest: string): Promise<BoundedRedriveConvergence | undefined>;
61
+ receive(limit: number): Promise<readonly BoundedRedriveItem<TValue>[]>;
62
+ reserve(input: {
63
+ reportDigest: string;
64
+ }): Promise<{
65
+ operationHandle: string;
66
+ outcome: 'reserved';
67
+ } | {
68
+ convergence: BoundedRedriveConvergence;
69
+ outcome: 'existing';
70
+ }>;
71
+ }
72
+ export declare function classifyRecoveryLease(input: {
73
+ leaseExpiresAt: string;
74
+ now: string;
75
+ status: 'completed' | 'failed' | 'started';
76
+ }): 'active' | 'stale-takeover' | 'terminal';
77
+ export type RecoveryReservationOutcome = 'reserved' | 'stale-resumed' | 'terminal-completed' | 'terminal-failed';
78
+ export declare function recoveryReservationAction(outcome: RecoveryReservationOutcome): 'duplicate' | 'execute';
79
+ export declare function boundedRedriveTenantDigest(tenantReference: string): string;
80
+ export declare function createBoundedRedriveReport(input: {
81
+ accountReferenceDigest: string;
82
+ destinationReferenceDigest: string;
83
+ expiresAt: string;
84
+ preparedAt: string;
85
+ region: string;
86
+ scope: BoundedRedriveScopeV1;
87
+ slice: string;
88
+ sourceReferenceDigest: string;
89
+ stage: string;
90
+ }): BoundedRedriveReportV1;
91
+ export declare function runBoundedRedrive<TValue>(input: {
92
+ adapter: BoundedRedriveAdapter<TValue>;
93
+ now: string;
94
+ sleep?: (milliseconds: number) => Promise<void>;
95
+ report: BoundedRedriveReportV1;
96
+ }): Promise<BoundedRedriveConvergence & {
97
+ outcome: 'applied' | 'duplicate';
98
+ }>;
99
+ export declare function readBoundedRedriveStatus<TValue>(input: {
100
+ adapter: BoundedRedriveAdapter<TValue>;
101
+ operationHandle: string;
102
+ reportDigest: string;
103
+ }): Promise<BoundedRedriveConvergence | undefined>;
@@ -0,0 +1,291 @@
1
+ import { __awaiter } from "tslib";
2
+ import { asyncWorkDigest, failAsyncWork, requireAsyncIdentifier, requireAsyncInteger, requireCanonicalAsyncTimestamp, } from './contract.js';
3
+ export const ASYNC_BOUNDED_REDRIVE_REPORT_VERSION = 1;
4
+ export function validateRecoveryQueueContext(input) {
5
+ const accountId = requireAsyncIdentifier(input.accountId, '/accountId');
6
+ const region = requireAsyncIdentifier(input.region, '/region');
7
+ const slice = requireAsyncIdentifier(input.slice, '/slice');
8
+ const queueArn = requireAsyncIdentifier(input.queueArn, '/queueArn');
9
+ const match = queueArn.match(/^arn:(?:aws|aws-cn|aws-us-gov):sqs:([a-z0-9-]+):(\d{12}):[^:]+$/);
10
+ const bindingTag = input.expectedBinding === 'source'
11
+ ? 'ebk:async-recovery-source'
12
+ : 'ebk:async-recovery-destination';
13
+ const stage = input.tags['ebk:stage'];
14
+ if (!match ||
15
+ match[1] !== region ||
16
+ match[2] !== accountId ||
17
+ input.tags['ebk:slice'] !== slice ||
18
+ input.tags[bindingTag] !== input.expectedKind ||
19
+ typeof stage !== 'string' ||
20
+ !input.allowedStages.includes(stage) ||
21
+ (input.callerStage !== undefined && input.callerStage !== stage)) {
22
+ failAsyncWork('async-input-invalid', '/queueContext', 'queue ARN and generated account, region, Slice, stage, and recovery tags must match');
23
+ }
24
+ return { kind: input.expectedKind, stage };
25
+ }
26
+ export function classifyRecoveryLease(input) {
27
+ const now = requireCanonicalAsyncTimestamp(input.now, '/lease/now');
28
+ const leaseExpiresAt = requireCanonicalAsyncTimestamp(input.leaseExpiresAt, '/lease/expiresAt');
29
+ if (!['completed', 'failed', 'started'].includes(input.status)) {
30
+ failAsyncWork('async-input-invalid', '/lease/status', 'must be completed, failed, or started');
31
+ }
32
+ if (input.status !== 'started')
33
+ return 'terminal';
34
+ return Date.parse(now) < Date.parse(leaseExpiresAt)
35
+ ? 'active'
36
+ : 'stale-takeover';
37
+ }
38
+ export function recoveryReservationAction(outcome) {
39
+ if (outcome === 'terminal-completed')
40
+ return 'duplicate';
41
+ if (outcome === 'terminal-failed') {
42
+ throw new Error('async-recovery-terminal-failed');
43
+ }
44
+ if (outcome === 'reserved' || outcome === 'stale-resumed')
45
+ return 'execute';
46
+ failAsyncWork('async-input-invalid', '/reservation/outcome', 'must be reserved, stale-resumed, terminal-completed, or terminal-failed');
47
+ }
48
+ function requireDigest(value, path) {
49
+ if (!/^sha256:[a-f0-9]{64}$/.test(value)) {
50
+ failAsyncWork('async-input-invalid', path, 'must be one sha256 digest');
51
+ }
52
+ return value;
53
+ }
54
+ function normalizeScope(scope) {
55
+ const sentAfter = requireCanonicalAsyncTimestamp(scope.sentAfter, '/scope/sentAfter');
56
+ const sentBefore = requireCanonicalAsyncTimestamp(scope.sentBefore, '/scope/sentBefore');
57
+ if (Date.parse(sentAfter) >= Date.parse(sentBefore)) {
58
+ failAsyncWork('async-input-invalid', '/scope', 'sentAfter must precede sentBefore');
59
+ }
60
+ const maximumMessages = requireAsyncInteger(scope.maximumMessages, '/scope/maximumMessages', 1, 1000);
61
+ const maximumRatePerSecond = requireAsyncInteger(scope.maximumRatePerSecond, '/scope/maximumRatePerSecond', 1, 10);
62
+ const maximumScannedMessages = requireAsyncInteger(scope.maximumScannedMessages, '/scope/maximumScannedMessages', maximumMessages, 10000);
63
+ if (!Array.isArray(scope.tenantReferenceDigests) ||
64
+ scope.tenantReferenceDigests.length < 1 ||
65
+ scope.tenantReferenceDigests.length > 1000) {
66
+ failAsyncWork('async-input-invalid', '/scope/tenantReferenceDigests', 'must select one through 1000 tenant digests');
67
+ }
68
+ const tenantReferenceDigests = [
69
+ ...new Set(scope.tenantReferenceDigests.map((value, index) => requireDigest(value, `/scope/tenantReferenceDigests/${index}`))),
70
+ ].sort();
71
+ if (tenantReferenceDigests.length !== scope.tenantReferenceDigests.length) {
72
+ failAsyncWork('async-input-invalid', '/scope/tenantReferenceDigests', 'must not contain duplicates');
73
+ }
74
+ if (!Array.isArray(scope.workTypes) ||
75
+ scope.workTypes.length < 1 ||
76
+ scope.workTypes.length > 100) {
77
+ failAsyncWork('async-input-invalid', '/scope/workTypes', 'must select one through 100 work types');
78
+ }
79
+ const workTypes = [
80
+ ...new Set(scope.workTypes.map((value, index) => requireAsyncIdentifier(value, `/scope/workTypes/${index}`))),
81
+ ].sort();
82
+ if (workTypes.length !== scope.workTypes.length) {
83
+ failAsyncWork('async-input-invalid', '/scope/workTypes', 'must not contain duplicates');
84
+ }
85
+ return {
86
+ maximumMessages,
87
+ maximumRatePerSecond,
88
+ maximumScannedMessages,
89
+ sentAfter,
90
+ sentBefore,
91
+ tenantReferenceDigests,
92
+ workTypes,
93
+ };
94
+ }
95
+ export function boundedRedriveTenantDigest(tenantReference) {
96
+ return asyncWorkDigest({
97
+ kind: 'bounded-redrive-tenant-v1',
98
+ value: requireAsyncIdentifier(tenantReference, '/tenantReference'),
99
+ });
100
+ }
101
+ export function createBoundedRedriveReport(input) {
102
+ const preparedAt = requireCanonicalAsyncTimestamp(input.preparedAt, '/preparedAt');
103
+ const expiresAt = requireCanonicalAsyncTimestamp(input.expiresAt, '/expiresAt');
104
+ if (Date.parse(expiresAt) <= Date.parse(preparedAt) ||
105
+ Date.parse(expiresAt) - Date.parse(preparedAt) > 30 * 60000) {
106
+ failAsyncWork('async-input-invalid', '/expiresAt', 'must be after preparedAt by no more than 30 minutes');
107
+ }
108
+ const material = {
109
+ accountReferenceDigest: requireDigest(input.accountReferenceDigest, '/accountReferenceDigest'),
110
+ destinationReferenceDigest: requireDigest(input.destinationReferenceDigest, '/destinationReferenceDigest'),
111
+ expiresAt,
112
+ preparedAt,
113
+ region: requireAsyncIdentifier(input.region, '/region'),
114
+ scope: normalizeScope(input.scope),
115
+ slice: requireAsyncIdentifier(input.slice, '/slice'),
116
+ sourceReferenceDigest: requireDigest(input.sourceReferenceDigest, '/sourceReferenceDigest'),
117
+ stage: requireAsyncIdentifier(input.stage, '/stage'),
118
+ version: ASYNC_BOUNDED_REDRIVE_REPORT_VERSION,
119
+ };
120
+ return Object.assign(Object.assign({}, material), { reportDigest: asyncWorkDigest(material) });
121
+ }
122
+ function validateReport(report, checkExpiry, now) {
123
+ const normalized = createBoundedRedriveReport(report);
124
+ if (report.version !== ASYNC_BOUNDED_REDRIVE_REPORT_VERSION ||
125
+ normalized.reportDigest !== report.reportDigest) {
126
+ failAsyncWork('async-report-invalid', '/report', 'digest must bind the exact bounded redrive report');
127
+ }
128
+ if (checkExpiry && Date.parse(now) >= Date.parse(normalized.expiresAt)) {
129
+ failAsyncWork('async-report-expired', '/report/expiresAt', 'report expired');
130
+ }
131
+ return normalized;
132
+ }
133
+ function selected(item, scope) {
134
+ const sentAt = requireCanonicalAsyncTimestamp(item.sentAt, '/item/sentAt');
135
+ return (Date.parse(sentAt) >= Date.parse(scope.sentAfter) &&
136
+ Date.parse(sentAt) < Date.parse(scope.sentBefore) &&
137
+ scope.workTypes.includes(requireAsyncIdentifier(item.workType, '/item/workType')) &&
138
+ scope.tenantReferenceDigests.includes(boundedRedriveTenantDigest(item.tenantReference)));
139
+ }
140
+ function validatePriorConvergence(convergence, report) {
141
+ const lineageDigests = convergence.lineageDigests.map((value, index) => requireDigest(value, `/convergence/lineageDigests/${index}`));
142
+ const completedLineageDigests = convergence.completedLineageDigests.map((value, index) => requireDigest(value, `/convergence/completedLineageDigests/${index}`));
143
+ const lineage = new Set(lineageDigests);
144
+ const completed = new Set(completedLineageDigests);
145
+ const acknowledged = requireAsyncInteger(convergence.acknowledged, '/convergence/acknowledged', 0, report.scope.maximumMessages);
146
+ const failed = requireAsyncInteger(convergence.failed, '/convergence/failed', 0, report.scope.maximumScannedMessages);
147
+ const scanned = requireAsyncInteger(convergence.scanned, '/convergence/scanned', 0, report.scope.maximumScannedMessages);
148
+ const selectedCount = requireAsyncInteger(convergence.selected, '/convergence/selected', 0, report.scope.maximumMessages);
149
+ if (convergence.reportDigest !== report.reportDigest ||
150
+ !['completed', 'failed', 'started'].includes(convergence.status) ||
151
+ lineage.size !== lineageDigests.length ||
152
+ completed.size !== completedLineageDigests.length ||
153
+ completedLineageDigests.some((digest) => !lineage.has(digest)) ||
154
+ selectedCount !== lineageDigests.length ||
155
+ acknowledged !== completedLineageDigests.length ||
156
+ selectedCount > scanned ||
157
+ failed > scanned) {
158
+ failAsyncWork('async-report-invalid', '/convergence', 'retained convergence exceeds the report or has inconsistent counters and lineage');
159
+ }
160
+ requireAsyncIdentifier(convergence.operationHandle, '/convergence/operationHandle');
161
+ return Object.assign(Object.assign({}, convergence), { acknowledged,
162
+ completedLineageDigests,
163
+ failed,
164
+ lineageDigests,
165
+ scanned, selected: selectedCount });
166
+ }
167
+ export function runBoundedRedrive(input) {
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ var _a, _b, _c, _d, _e;
170
+ const now = requireCanonicalAsyncTimestamp(input.now, '/now');
171
+ const report = validateReport(input.report, true, now);
172
+ const reservation = yield input.adapter.reserve({
173
+ reportDigest: report.reportDigest,
174
+ });
175
+ const existingConvergence = reservation.outcome === 'existing'
176
+ ? validatePriorConvergence(reservation.convergence, report)
177
+ : undefined;
178
+ if ((existingConvergence === null || existingConvergence === void 0 ? void 0 : existingConvergence.status) === 'failed') {
179
+ throw new Error('async-recovery-terminal-failed');
180
+ }
181
+ if ((existingConvergence === null || existingConvergence === void 0 ? void 0 : existingConvergence.status) === 'completed') {
182
+ return Object.assign(Object.assign({}, existingConvergence), { outcome: 'duplicate' });
183
+ }
184
+ const previous = existingConvergence;
185
+ const operationHandle = reservation.outcome === 'existing'
186
+ ? reservation.convergence.operationHandle
187
+ : reservation.operationHandle;
188
+ const lineageDigests = [...((_a = previous === null || previous === void 0 ? void 0 : previous.lineageDigests) !== null && _a !== void 0 ? _a : [])];
189
+ const completedLineageDigests = [
190
+ ...((_b = previous === null || previous === void 0 ? void 0 : previous.completedLineageDigests) !== null && _b !== void 0 ? _b : []),
191
+ ];
192
+ let acknowledged = (_c = previous === null || previous === void 0 ? void 0 : previous.acknowledged) !== null && _c !== void 0 ? _c : 0;
193
+ let failed = 0;
194
+ let scanned = (_d = previous === null || previous === void 0 ? void 0 : previous.scanned) !== null && _d !== void 0 ? _d : 0;
195
+ let selectedCount = lineageDigests.length;
196
+ const seen = new Set();
197
+ const sleep = (_e = input.sleep) !== null && _e !== void 0 ? _e : ((milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)));
198
+ const minimumIntervalMilliseconds = Math.ceil(1000 / report.scope.maximumRatePerSecond);
199
+ let forwarded = 0;
200
+ const checkpoint = (status) => __awaiter(this, void 0, void 0, function* () {
201
+ return input.adapter.converge({
202
+ acknowledged,
203
+ completedLineageDigests,
204
+ failed,
205
+ lineageDigests,
206
+ operationHandle,
207
+ reportDigest: report.reportDigest,
208
+ scanned,
209
+ selected: selectedCount,
210
+ status,
211
+ });
212
+ });
213
+ try {
214
+ while (scanned < report.scope.maximumScannedMessages &&
215
+ (selectedCount < report.scope.maximumMessages ||
216
+ completedLineageDigests.length < lineageDigests.length)) {
217
+ const limit = Math.min(10, report.scope.maximumScannedMessages - scanned);
218
+ const items = yield input.adapter.receive(limit);
219
+ if (items.length === 0)
220
+ break;
221
+ for (const item of items) {
222
+ if (scanned >= report.scope.maximumScannedMessages)
223
+ break;
224
+ scanned += 1;
225
+ const messageReference = requireAsyncIdentifier(item.messageReference, '/item/messageReference');
226
+ if (seen.has(messageReference))
227
+ continue;
228
+ seen.add(messageReference);
229
+ const lineageDigest = asyncWorkDigest({
230
+ kind: 'bounded-redrive-message-v1',
231
+ value: messageReference,
232
+ });
233
+ if (completedLineageDigests.includes(lineageDigest))
234
+ continue;
235
+ if (!selected(item, report.scope)) {
236
+ continue;
237
+ }
238
+ if (!lineageDigests.includes(lineageDigest)) {
239
+ if (selectedCount >= report.scope.maximumMessages)
240
+ continue;
241
+ selectedCount += 1;
242
+ lineageDigests.push(lineageDigest);
243
+ }
244
+ if (forwarded > 0)
245
+ yield sleep(minimumIntervalMilliseconds);
246
+ forwarded += 1;
247
+ if (!(yield input.adapter.forward(item))) {
248
+ failed += 1;
249
+ yield checkpoint('started');
250
+ continue;
251
+ }
252
+ if (yield input.adapter.acknowledge(item)) {
253
+ acknowledged += 1;
254
+ completedLineageDigests.push(lineageDigest);
255
+ }
256
+ else {
257
+ failed += 1;
258
+ }
259
+ yield checkpoint('started');
260
+ }
261
+ }
262
+ const pendingLineage = lineageDigests.length - completedLineageDigests.length;
263
+ const convergence = yield checkpoint(failed === 0 && pendingLineage === 0 ? 'completed' : 'started');
264
+ if (failed > 0) {
265
+ throw new Error('async-bounded-redrive-retry-required');
266
+ }
267
+ if (pendingLineage > 0) {
268
+ throw new Error('async-bounded-redrive-reconciliation-required');
269
+ }
270
+ return Object.assign(Object.assign({}, convergence), { outcome: 'applied' });
271
+ }
272
+ catch (error) {
273
+ yield checkpoint('started');
274
+ throw error;
275
+ }
276
+ });
277
+ }
278
+ export function readBoundedRedriveStatus(input) {
279
+ return __awaiter(this, void 0, void 0, function* () {
280
+ const operationHandle = requireAsyncIdentifier(input.operationHandle, '/operationHandle');
281
+ requireDigest(input.reportDigest, '/reportDigest');
282
+ const convergence = yield input.adapter.read(input.reportDigest);
283
+ if (convergence &&
284
+ (convergence.reportDigest !== input.reportDigest ||
285
+ convergence.operationHandle !== operationHandle)) {
286
+ failAsyncWork('async-report-invalid', '/operationHandle', 'status must belong to the exact report and operation handle');
287
+ }
288
+ return convergence;
289
+ });
290
+ }
291
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/async-work/recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ export declare const ASYNC_SCHEDULE_VERSION: 1;
2
+ export declare const ASYNC_BACKFILL_REPORT_VERSION: 1;
3
+ export declare const ASYNC_BACKFILL_CHECKPOINT_VERSION: 1;
4
+ export type MissedRunBehavior = 'backfill-every-interval' | 'catch-up-once' | 'skip';
5
+ export type ScheduleCadenceV1 = {
6
+ at: string;
7
+ kind: 'one-time';
8
+ } | {
9
+ intervalSeconds: number;
10
+ kind: 'interval';
11
+ };
12
+ export interface ScheduleDefinitionV1 {
13
+ cadence: ScheduleCadenceV1;
14
+ dlq: string;
15
+ enabled: boolean;
16
+ maximumCatchUpRuns: number;
17
+ missedRunBehavior: MissedRunBehavior;
18
+ owner: string;
19
+ retryAttempts: number;
20
+ scheduleId: string;
21
+ targetCommand: string;
22
+ targetVersion: number;
23
+ timeZone: string;
24
+ version: typeof ASYNC_SCHEDULE_VERSION;
25
+ }
26
+ export declare function createScheduleDefinition(input: Omit<ScheduleDefinitionV1, 'version'>): ScheduleDefinitionV1;
27
+ export interface PlannedScheduleRunsV1 {
28
+ latestMissedAt?: string;
29
+ outcome: 'caught-up' | 'disabled' | 'none' | 'skipped';
30
+ runAt: readonly string[];
31
+ scheduleId: string;
32
+ skippedCount: number;
33
+ }
34
+ /**
35
+ * Computes bounded catch-up intent. The generated AWS adapter owns the
36
+ * Scheduler expression; handlers receive stable scheduled timestamps and
37
+ * remain idempotent if Scheduler invokes them more than once.
38
+ */
39
+ export declare function planMissedScheduleRuns(input: {
40
+ lastCompletedAt?: string;
41
+ now: string;
42
+ schedule: ScheduleDefinitionV1;
43
+ }): PlannedScheduleRunsV1;
44
+ export interface BackfillScopeV1 {
45
+ from: string;
46
+ partitions: readonly string[];
47
+ to: string;
48
+ }
49
+ export interface BackfillReportV1 {
50
+ approvalClass: 'ordinary' | 'protected';
51
+ concurrency: number;
52
+ estimatedCostUsd: number;
53
+ expiresAt: string;
54
+ job: string;
55
+ maximumItems: number;
56
+ preparedAt: string;
57
+ reportDigest: string;
58
+ reportId: string;
59
+ scope: {
60
+ from: string;
61
+ partitions: readonly string[];
62
+ to: string;
63
+ };
64
+ version: typeof ASYNC_BACKFILL_REPORT_VERSION;
65
+ }
66
+ export declare function createBackfillReport(input: {
67
+ approvalClass: 'ordinary' | 'protected';
68
+ concurrency: number;
69
+ estimatedCostUsd: number;
70
+ expiresAt: string;
71
+ job: string;
72
+ maximumItems: number;
73
+ preparedAt: string;
74
+ scope: BackfillScopeV1;
75
+ }): BackfillReportV1;
76
+ export interface BackfillCheckpointV1 {
77
+ complete: boolean;
78
+ cursor?: string;
79
+ processed: number;
80
+ reportDigest: string;
81
+ version: typeof ASYNC_BACKFILL_CHECKPOINT_VERSION;
82
+ }
83
+ export interface BackfillItem<TValue> {
84
+ itemId: string;
85
+ value: TValue;
86
+ }
87
+ export interface BackfillAdapter<TValue> {
88
+ process(input: {
89
+ idempotencyKey: string;
90
+ item: BackfillItem<TValue>;
91
+ reportId: string;
92
+ }): Promise<'already-applied' | 'failed' | 'succeeded'>;
93
+ scan(input: {
94
+ cursor?: string;
95
+ limit: number;
96
+ scope: BackfillReportV1['scope'];
97
+ }): Promise<{
98
+ items: readonly BackfillItem<TValue>[];
99
+ nextCursor?: string;
100
+ }>;
101
+ }
102
+ export declare function runBackfillPage<TValue>(input: {
103
+ adapter: BackfillAdapter<TValue>;
104
+ approvalId?: string;
105
+ cancelled?: boolean;
106
+ checkpoint?: BackfillCheckpointV1;
107
+ limit: number;
108
+ now: string;
109
+ report: BackfillReportV1;
110
+ }): Promise<{
111
+ alreadyApplied: number;
112
+ checkpoint: BackfillCheckpointV1;
113
+ failed: number;
114
+ outcome: 'cancelled' | 'complete' | 'more' | 'retry-required';
115
+ processed: number;
116
+ succeeded: number;
117
+ }>;