@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 @@
1
+ export * from './protected-load-endpoint.js';
@@ -0,0 +1,2 @@
1
+ export * from './protected-load-endpoint.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/performance/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,140 @@
1
+ export declare const PROTECTED_LOAD_ENDPOINT_ADAPTERS: readonly [{
2
+ readonly capacityBound: "rate";
3
+ readonly cleanupPath: null;
4
+ readonly id: "ebk-api-lambda-v1";
5
+ readonly mutation: false;
6
+ readonly requestMethod: "GET";
7
+ readonly requestPath: "/__ebk/performance/api-lambda";
8
+ readonly scenarioId: "api-peak";
9
+ readonly saturationSignalRef: "runtime:nodejs-heap-utilization-percent";
10
+ readonly version: "1.0.0";
11
+ readonly workload: "api-lambda";
12
+ }, {
13
+ readonly capacityBound: "rate";
14
+ readonly cleanupPath: "/__ebk/performance/async-worker/cleanup";
15
+ readonly id: "ebk-async-worker-v1";
16
+ readonly mutation: true;
17
+ readonly requestMethod: "POST";
18
+ readonly requestPath: "/__ebk/performance/async-worker";
19
+ readonly scenarioId: "async-burst";
20
+ readonly saturationSignalRef: "database:protected-async-backlog-utilization-percent";
21
+ readonly version: "1.0.0";
22
+ readonly workload: "async-worker";
23
+ }, {
24
+ readonly capacityBound: "concurrency";
25
+ readonly cleanupPath: "/__ebk/performance/database/cleanup";
26
+ readonly id: "ebk-database-v1";
27
+ readonly mutation: true;
28
+ readonly requestMethod: "POST";
29
+ readonly requestPath: "/__ebk/performance/database";
30
+ readonly scenarioId: "database-cold-resume";
31
+ readonly saturationSignalRef: "database:connection-utilization-percent";
32
+ readonly version: "1.0.0";
33
+ readonly workload: "database";
34
+ }, {
35
+ readonly capacityBound: "concurrency";
36
+ readonly cleanupPath: "/__ebk/performance/service/cleanup";
37
+ readonly id: "ebk-service-v1";
38
+ readonly mutation: false;
39
+ readonly requestMethod: "GET";
40
+ readonly requestPath: "/__ebk/performance/service";
41
+ readonly scenarioId: "service-extension";
42
+ readonly saturationSignalRef: null;
43
+ readonly version: "1.0.0";
44
+ readonly workload: "service";
45
+ }];
46
+ export type ProtectedLoadEndpointAdapterId = (typeof PROTECTED_LOAD_ENDPOINT_ADAPTERS)[number]['id'];
47
+ export type ProtectedLoadEndpointStage = 'production' | 'staging';
48
+ export interface ProtectedLoadEndpointReleaseV1 {
49
+ candidateDigest: string;
50
+ releaseId: string;
51
+ releaseMaterialDigest: string;
52
+ sourceCommit: string;
53
+ }
54
+ export interface ProtectedLoadEndpointHmacKeyV1 {
55
+ id: string;
56
+ secret: string;
57
+ }
58
+ export interface ProtectedLoadEndpointTargetV1 {
59
+ accountFingerprint: string;
60
+ endpoint: string;
61
+ region: string;
62
+ slice: string;
63
+ }
64
+ export interface ProtectedLoadEndpointBindingV1 {
65
+ adapterId: ProtectedLoadEndpointAdapterId;
66
+ deployedCandidateDigest: string;
67
+ deployedReleaseId: string;
68
+ deployedReleaseMaterialDigest: string;
69
+ deployedSourceCommit: string;
70
+ hmacKeys: {
71
+ current: ProtectedLoadEndpointHmacKeyV1;
72
+ previous?: ProtectedLoadEndpointHmacKeyV1;
73
+ };
74
+ stage: ProtectedLoadEndpointStage;
75
+ target: Omit<ProtectedLoadEndpointTargetV1, 'endpoint'> & {
76
+ origin: string;
77
+ };
78
+ }
79
+ export interface ProtectedLoadRequestAuthorizationV1 {
80
+ adapterId: ProtectedLoadEndpointAdapterId;
81
+ configuredMaximum: number;
82
+ createdAt: string;
83
+ durationSeconds: number;
84
+ effectId: string | null;
85
+ expiresAt: string;
86
+ maximumRequests: number;
87
+ hmacKeyId: string;
88
+ operation: 'cleanup' | 'execute';
89
+ planMaterialDigest: string;
90
+ release: ProtectedLoadEndpointReleaseV1;
91
+ requestOrdinal: number;
92
+ runId: string;
93
+ saturationSignalRef: string;
94
+ scenarioId: string;
95
+ stage: ProtectedLoadEndpointStage;
96
+ target: ProtectedLoadEndpointTargetV1;
97
+ workload: 'api-lambda' | 'async-worker' | 'database' | 'service';
98
+ }
99
+ export interface ProtectedLoadEndpointRequestV1 {
100
+ body?: unknown;
101
+ headers: Readonly<Record<string, string | undefined>>;
102
+ method: 'GET' | 'POST';
103
+ url: string;
104
+ }
105
+ export interface ProtectedLoadEndpointResponseV1 {
106
+ body: unknown;
107
+ status: number;
108
+ }
109
+ export declare class ProtectedLoadEndpointError extends Error {
110
+ readonly pointer: string;
111
+ readonly classification = "performance-load-authorization-invalid";
112
+ constructor(pointer: string, message: string);
113
+ }
114
+ export declare function createProtectedLoadRequestSignature(input: {
115
+ authorization: ProtectedLoadRequestAuthorizationV1;
116
+ hmacKey: ProtectedLoadEndpointHmacKeyV1;
117
+ }): string;
118
+ export declare function handleProtectedLoadScenarioEndpoint(input: {
119
+ binding: ProtectedLoadEndpointBindingV1;
120
+ execute(request: {
121
+ authorization: ProtectedLoadRequestAuthorizationV1;
122
+ effectId?: string;
123
+ requestOrdinal: number;
124
+ }): Promise<{
125
+ effectState?: 'already-existed' | 'created';
126
+ saturationPercent: number;
127
+ }>;
128
+ now?: () => Date;
129
+ request: ProtectedLoadEndpointRequestV1;
130
+ reserve(authorization: ProtectedLoadRequestAuthorizationV1): Promise<'claimed'>;
131
+ }): Promise<ProtectedLoadEndpointResponseV1>;
132
+ export declare function handleProtectedLoadCleanupEndpoint(input: {
133
+ binding: ProtectedLoadEndpointBindingV1;
134
+ cleanup(authorization: ProtectedLoadRequestAuthorizationV1): Promise<{
135
+ remainingEffectCount: number;
136
+ removedEffectCount: number;
137
+ }>;
138
+ now?: () => Date;
139
+ request: ProtectedLoadEndpointRequestV1;
140
+ }): Promise<ProtectedLoadEndpointResponseV1>;
@@ -0,0 +1,462 @@
1
+ import { __awaiter } from "tslib";
2
+ import { createHmac, timingSafeEqual } from 'node:crypto';
3
+ import { isBoundedSafeReference } from '../safe-reference.js';
4
+ export const PROTECTED_LOAD_ENDPOINT_ADAPTERS = [
5
+ {
6
+ capacityBound: 'rate',
7
+ cleanupPath: null,
8
+ id: 'ebk-api-lambda-v1',
9
+ mutation: false,
10
+ requestMethod: 'GET',
11
+ requestPath: '/__ebk/performance/api-lambda',
12
+ scenarioId: 'api-peak',
13
+ saturationSignalRef: 'runtime:nodejs-heap-utilization-percent',
14
+ version: '1.0.0',
15
+ workload: 'api-lambda',
16
+ },
17
+ {
18
+ capacityBound: 'rate',
19
+ cleanupPath: '/__ebk/performance/async-worker/cleanup',
20
+ id: 'ebk-async-worker-v1',
21
+ mutation: true,
22
+ requestMethod: 'POST',
23
+ requestPath: '/__ebk/performance/async-worker',
24
+ scenarioId: 'async-burst',
25
+ saturationSignalRef: 'database:protected-async-backlog-utilization-percent',
26
+ version: '1.0.0',
27
+ workload: 'async-worker',
28
+ },
29
+ {
30
+ capacityBound: 'concurrency',
31
+ cleanupPath: '/__ebk/performance/database/cleanup',
32
+ id: 'ebk-database-v1',
33
+ mutation: true,
34
+ requestMethod: 'POST',
35
+ requestPath: '/__ebk/performance/database',
36
+ scenarioId: 'database-cold-resume',
37
+ saturationSignalRef: 'database:connection-utilization-percent',
38
+ version: '1.0.0',
39
+ workload: 'database',
40
+ },
41
+ {
42
+ capacityBound: 'concurrency',
43
+ cleanupPath: '/__ebk/performance/service/cleanup',
44
+ id: 'ebk-service-v1',
45
+ mutation: false,
46
+ requestMethod: 'GET',
47
+ requestPath: '/__ebk/performance/service',
48
+ scenarioId: 'service-extension',
49
+ saturationSignalRef: null,
50
+ version: '1.0.0',
51
+ workload: 'service',
52
+ },
53
+ ];
54
+ export class ProtectedLoadEndpointError extends Error {
55
+ constructor(pointer, message) {
56
+ super(`${pointer}: ${message}`);
57
+ this.pointer = pointer;
58
+ this.classification = 'performance-load-authorization-invalid';
59
+ this.name = 'ProtectedLoadEndpointError';
60
+ }
61
+ }
62
+ const DIGEST = /^[a-f0-9]{64}$/;
63
+ const FULL_COMMIT = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/;
64
+ const ACCOUNT_FINGERPRINT = /^sha256:[a-f0-9]{64}$/;
65
+ const AWS_REGION = /^(?:(?:af|ap|ca|cn|eu|il|me|mx|sa|us)(?:-(?:gov|iso|isob|isoe|isof))?|eusc-[a-z]{2})-[a-z]+-\d$/;
66
+ const HMAC_KEY_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
67
+ const SLICE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
68
+ const MAXIMUM_AUTHORIZATION_SECONDS = 24 * 60 * 60;
69
+ const MAXIMUM_CLEANUP_GRACE_SECONDS = 24 * 60 * 60;
70
+ const MAXIMUM_REQUESTS = 100000;
71
+ function invalid(pointer, message) {
72
+ return new ProtectedLoadEndpointError(pointer, message);
73
+ }
74
+ function record(value) {
75
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
76
+ }
77
+ function exactKeys(value, expected, pointer) {
78
+ if (!record(value))
79
+ throw invalid(pointer, 'must be an object');
80
+ const actual = Object.keys(value).sort();
81
+ const wanted = [...expected].sort();
82
+ if (JSON.stringify(actual) !== JSON.stringify(wanted)) {
83
+ throw invalid(pointer, 'must contain only the exact v1 fields');
84
+ }
85
+ }
86
+ function reference(value, pointer) {
87
+ if (!isBoundedSafeReference(value, 'performance-evidence')) {
88
+ throw invalid(pointer, 'must be one bounded opaque reference');
89
+ }
90
+ return value;
91
+ }
92
+ function digest(value, pointer) {
93
+ if (typeof value !== 'string' || !DIGEST.test(value)) {
94
+ throw invalid(pointer, 'must be a lowercase SHA-256 digest');
95
+ }
96
+ return value;
97
+ }
98
+ function canonicalInstant(value, pointer) {
99
+ if (typeof value !== 'string' ||
100
+ !Number.isFinite(Date.parse(value)) ||
101
+ new Date(Date.parse(value)).toISOString() !== value) {
102
+ throw invalid(pointer, 'must be a canonical ISO-8601 instant');
103
+ }
104
+ return value;
105
+ }
106
+ function positiveInteger(value, pointer, maximum) {
107
+ const parsed = typeof value === 'number' ? value : Number(value);
108
+ if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed > maximum) {
109
+ throw invalid(pointer, `must be between 1 and ${maximum}`);
110
+ }
111
+ return parsed;
112
+ }
113
+ function positiveNumber(value, pointer) {
114
+ const parsed = typeof value === 'number' ? value : Number(value);
115
+ if (!Number.isFinite(parsed) || parsed <= 0) {
116
+ throw invalid(pointer, 'must be a finite number greater than zero');
117
+ }
118
+ return parsed;
119
+ }
120
+ function validateRelease(value, pointer) {
121
+ exactKeys(value, ['candidateDigest', 'releaseId', 'releaseMaterialDigest', 'sourceCommit'], pointer);
122
+ const sourceCommit = value['sourceCommit'];
123
+ if (typeof sourceCommit !== 'string' || !FULL_COMMIT.test(sourceCommit)) {
124
+ throw invalid(`${pointer}/sourceCommit`, 'must be one full Git object ID');
125
+ }
126
+ return {
127
+ candidateDigest: digest(value['candidateDigest'], `${pointer}/candidateDigest`),
128
+ releaseId: reference(value['releaseId'], `${pointer}/releaseId`),
129
+ releaseMaterialDigest: digest(value['releaseMaterialDigest'], `${pointer}/releaseMaterialDigest`),
130
+ sourceCommit,
131
+ };
132
+ }
133
+ function adapter(id) {
134
+ const value = PROTECTED_LOAD_ENDPOINT_ADAPTERS.find((candidate) => candidate.id === id);
135
+ if (!value)
136
+ throw invalid('binding/adapterId', 'is not supported');
137
+ return value;
138
+ }
139
+ function materialBytes(value) {
140
+ return JSON.stringify({
141
+ adapterId: value.adapterId,
142
+ configuredMaximum: value.configuredMaximum,
143
+ createdAt: value.createdAt,
144
+ durationSeconds: value.durationSeconds,
145
+ effectId: value.effectId,
146
+ expiresAt: value.expiresAt,
147
+ hmacKeyId: value.hmacKeyId,
148
+ maximumRequests: value.maximumRequests,
149
+ operation: value.operation,
150
+ planMaterialDigest: value.planMaterialDigest,
151
+ release: {
152
+ candidateDigest: value.release.candidateDigest,
153
+ releaseId: value.release.releaseId,
154
+ releaseMaterialDigest: value.release.releaseMaterialDigest,
155
+ sourceCommit: value.release.sourceCommit,
156
+ },
157
+ requestOrdinal: value.requestOrdinal,
158
+ runId: value.runId,
159
+ saturationSignalRef: value.saturationSignalRef,
160
+ scenarioId: value.scenarioId,
161
+ stage: value.stage,
162
+ target: {
163
+ accountFingerprint: value.target.accountFingerprint,
164
+ endpoint: value.target.endpoint,
165
+ region: value.target.region,
166
+ slice: value.target.slice,
167
+ },
168
+ workload: value.workload,
169
+ });
170
+ }
171
+ function validateHmacKey(value, pointer) {
172
+ const secret = record(value) && typeof value['secret'] === 'string' ? value['secret'] : '';
173
+ const decoded = /^[A-Za-z0-9_-]{43}$/.test(secret)
174
+ ? Buffer.from(secret, 'base64url')
175
+ : Buffer.alloc(0);
176
+ if (!record(value) ||
177
+ Object.keys(value).length !== 2 ||
178
+ !Object.prototype.hasOwnProperty.call(value, 'id') ||
179
+ !Object.prototype.hasOwnProperty.call(value, 'secret') ||
180
+ typeof value['id'] !== 'string' ||
181
+ !HMAC_KEY_ID.test(value['id']) ||
182
+ decoded.length !== 32 ||
183
+ decoded.toString('base64url') !== secret) {
184
+ throw invalid(pointer, 'must contain one bounded key ID and a canonical base64url 256-bit secret');
185
+ }
186
+ return value;
187
+ }
188
+ export function createProtectedLoadRequestSignature(input) {
189
+ const key = validateHmacKey(input.hmacKey, 'hmacKey');
190
+ if (input.authorization.hmacKeyId !== key.id) {
191
+ throw invalid('authorization/hmacKeyId', 'must equal the selected HMAC key identity');
192
+ }
193
+ return createHmac('sha256', Buffer.from(key.secret, 'base64url'))
194
+ .update(materialBytes(input.authorization), 'utf8')
195
+ .digest('hex');
196
+ }
197
+ function canonicalEndpoint(value, pointer) {
198
+ if (typeof value !== 'string') {
199
+ throw invalid(pointer, 'must be one exact canonical HTTPS endpoint');
200
+ }
201
+ let endpoint;
202
+ try {
203
+ endpoint = new URL(value);
204
+ }
205
+ catch (_a) {
206
+ throw invalid(pointer, 'must be one exact canonical HTTPS endpoint');
207
+ }
208
+ if (endpoint.protocol !== 'https:' ||
209
+ endpoint.username ||
210
+ endpoint.password ||
211
+ endpoint.search ||
212
+ endpoint.hash ||
213
+ endpoint.href !== value ||
214
+ ['localhost', '127.0.0.1', '::1'].includes(endpoint.hostname) ||
215
+ endpoint.hostname.endsWith('.localhost')) {
216
+ throw invalid(pointer, 'must be one exact canonical remote HTTPS endpoint');
217
+ }
218
+ return endpoint.href;
219
+ }
220
+ function expectedEndpoint(binding, operation) {
221
+ const definition = adapter(binding.adapterId);
222
+ const path = operation === 'cleanup' ? definition.cleanupPath : definition.requestPath;
223
+ if (path === null) {
224
+ throw invalid('binding/adapterId', 'does not provide cleanup');
225
+ }
226
+ const origin = canonicalEndpoint(`${binding.target.origin}/`, 'binding/target/origin');
227
+ if (new URL(origin).origin !== binding.target.origin) {
228
+ throw invalid('binding/target/origin', 'must be one exact canonical HTTPS origin without a trailing slash');
229
+ }
230
+ return new URL(`/${binding.target.slice}${path}`, origin).href;
231
+ }
232
+ function requestAuthorization(request, binding, operation, now) {
233
+ var _a, _b, _c, _d, _e, _f;
234
+ const definition = adapter(binding.adapterId);
235
+ const currentHmacKey = validateHmacKey((_a = binding.hmacKeys) === null || _a === void 0 ? void 0 : _a.current, 'binding/hmacKeys/current');
236
+ const previousHmacKey = ((_b = binding.hmacKeys) === null || _b === void 0 ? void 0 : _b.previous) === undefined
237
+ ? undefined
238
+ : validateHmacKey(binding.hmacKeys.previous, 'binding/hmacKeys/previous');
239
+ if (!DIGEST.test(binding.deployedCandidateDigest) ||
240
+ !isBoundedSafeReference(binding.deployedReleaseId, 'performance-evidence') ||
241
+ !DIGEST.test(binding.deployedReleaseMaterialDigest) ||
242
+ !FULL_COMMIT.test(binding.deployedSourceCommit) ||
243
+ !['production', 'staging'].includes(binding.stage) ||
244
+ !ACCOUNT_FINGERPRINT.test((_c = binding.target) === null || _c === void 0 ? void 0 : _c.accountFingerprint) ||
245
+ !AWS_REGION.test((_d = binding.target) === null || _d === void 0 ? void 0 : _d.region) ||
246
+ !SLICE.test((_e = binding.target) === null || _e === void 0 ? void 0 : _e.slice) ||
247
+ (previousHmacKey === null || previousHmacKey === void 0 ? void 0 : previousHmacKey.id) === currentHmacKey.id ||
248
+ (previousHmacKey === null || previousHmacKey === void 0 ? void 0 : previousHmacKey.secret) === currentHmacKey.secret) {
249
+ throw invalid('binding', 'must bind one exact deployed release, target, stage, and HMAC key generation');
250
+ }
251
+ const deployedEndpoint = expectedEndpoint(binding, operation);
252
+ const body = request.body === undefined ? {} : request.body;
253
+ if (!record(body))
254
+ throw invalid('request/body', 'must be an object');
255
+ const release = validateRelease({
256
+ candidateDigest: request.headers['x-ebk-performance-candidate'],
257
+ releaseId: request.headers['x-ebk-performance-release-id'],
258
+ releaseMaterialDigest: request.headers['x-ebk-performance-release-material'],
259
+ sourceCommit: request.headers['x-ebk-performance-source'],
260
+ }, 'request/release');
261
+ const createdAt = canonicalInstant(request.headers['x-ebk-performance-created-at'], 'request/createdAt');
262
+ const expiresAt = canonicalInstant(request.headers['x-ebk-performance-expires-at'], 'request/expiresAt');
263
+ const durationSeconds = positiveInteger(request.headers['x-ebk-performance-duration-seconds'], 'request/durationSeconds', MAXIMUM_AUTHORIZATION_SECONDS);
264
+ const configuredMaximum = positiveNumber(request.headers['x-ebk-performance-configured-maximum'], 'request/configuredMaximum');
265
+ const maximumRequests = positiveInteger(request.headers['x-ebk-performance-maximum-requests'], 'request/maximumRequests', MAXIMUM_REQUESTS);
266
+ const requestOrdinal = positiveInteger(request.headers['x-ebk-performance-request'], 'request/requestOrdinal', maximumRequests);
267
+ const stage = request.headers['x-ebk-performance-stage'];
268
+ if (stage !== 'production' && stage !== 'staging') {
269
+ throw invalid('request/stage', 'must equal production or staging');
270
+ }
271
+ const hmacKeyId = request.headers['x-ebk-performance-hmac-key-id'];
272
+ if (typeof hmacKeyId !== 'string' || !HMAC_KEY_ID.test(hmacKeyId)) {
273
+ throw invalid('request/hmacKeyId', 'must select one bounded deployed HMAC key generation');
274
+ }
275
+ const accountFingerprint = request.headers['x-ebk-performance-account-fingerprint'];
276
+ const region = request.headers['x-ebk-performance-region'];
277
+ const slice = request.headers['x-ebk-performance-slice'];
278
+ if (typeof accountFingerprint !== 'string' ||
279
+ !ACCOUNT_FINGERPRINT.test(accountFingerprint) ||
280
+ typeof region !== 'string' ||
281
+ !AWS_REGION.test(region) ||
282
+ typeof slice !== 'string' ||
283
+ !SLICE.test(slice)) {
284
+ throw invalid('request/target', 'must contain the exact account fingerprint, Region, and Slice');
285
+ }
286
+ const target = {
287
+ accountFingerprint,
288
+ endpoint: canonicalEndpoint(request.url, 'request/url'),
289
+ region,
290
+ slice,
291
+ };
292
+ const effectId = typeof body['effectId'] === 'string' ? body['effectId'] : null;
293
+ const authorization = {
294
+ adapterId: binding.adapterId,
295
+ configuredMaximum,
296
+ createdAt,
297
+ durationSeconds,
298
+ effectId,
299
+ expiresAt,
300
+ hmacKeyId,
301
+ maximumRequests,
302
+ operation,
303
+ planMaterialDigest: digest(request.headers['x-ebk-performance-plan'], 'request/planMaterialDigest'),
304
+ release,
305
+ requestOrdinal,
306
+ runId: reference(request.headers['x-ebk-performance-run'], 'request/runId'),
307
+ saturationSignalRef: reference(request.headers['x-ebk-performance-saturation-signal'], 'request/saturationSignalRef'),
308
+ scenarioId: reference(request.headers['x-ebk-performance-scenario'], 'request/scenarioId'),
309
+ stage,
310
+ target,
311
+ workload: definition.workload,
312
+ };
313
+ if (binding.stage !== stage ||
314
+ definition.scenarioId !== authorization.scenarioId ||
315
+ (definition.saturationSignalRef !== null &&
316
+ definition.saturationSignalRef !== authorization.saturationSignalRef) ||
317
+ binding.deployedCandidateDigest !== release.candidateDigest ||
318
+ binding.deployedReleaseId !== release.releaseId ||
319
+ binding.deployedReleaseMaterialDigest !== release.releaseMaterialDigest ||
320
+ binding.deployedSourceCommit !== release.sourceCommit ||
321
+ binding.target.accountFingerprint !== target.accountFingerprint ||
322
+ binding.target.region !== target.region ||
323
+ binding.target.slice !== target.slice ||
324
+ deployedEndpoint !== target.endpoint ||
325
+ request.method !==
326
+ (operation === 'cleanup' ? 'POST' : definition.requestMethod)) {
327
+ throw invalid('request', 'does not match the deployed release, target, adapter, signal, method, and stage');
328
+ }
329
+ const created = Date.parse(createdAt);
330
+ const expires = Date.parse(expiresAt);
331
+ const nowMilliseconds = now.getTime();
332
+ if (expires <= created ||
333
+ expires - created > MAXIMUM_AUTHORIZATION_SECONDS * 1000 ||
334
+ durationSeconds * 1000 > expires - created ||
335
+ nowMilliseconds < created ||
336
+ nowMilliseconds >
337
+ expires +
338
+ (operation === 'cleanup' ? MAXIMUM_CLEANUP_GRACE_SECONDS * 1000 : 0)) {
339
+ throw invalid('request/authorizationWindow', 'is not active inside the bounded execution or cleanup window');
340
+ }
341
+ const selectedHmacKey = currentHmacKey.id === hmacKeyId
342
+ ? currentHmacKey
343
+ : (previousHmacKey === null || previousHmacKey === void 0 ? void 0 : previousHmacKey.id) === hmacKeyId
344
+ ? previousHmacKey
345
+ : undefined;
346
+ if (!selectedHmacKey ||
347
+ (operation === 'execute' && selectedHmacKey !== currentHmacKey)) {
348
+ throw invalid('request/hmacKeyId', operation === 'execute'
349
+ ? 'execution requires the current deployed HMAC key generation'
350
+ : 'cleanup requires the current or immediately previous deployed HMAC key generation');
351
+ }
352
+ const signature = (_f = request.headers['x-ebk-performance-signature']) !== null && _f !== void 0 ? _f : '';
353
+ const actual = Buffer.from(signature, 'hex');
354
+ const expected = createHmac('sha256', Buffer.from(selectedHmacKey.secret, 'base64url'))
355
+ .update(materialBytes(authorization), 'utf8')
356
+ .digest();
357
+ if (!DIGEST.test(signature) ||
358
+ actual.length !== expected.length ||
359
+ !timingSafeEqual(actual, expected)) {
360
+ throw invalid('request/signature', 'does not authorize the exact request');
361
+ }
362
+ const expectedBodyKeys = [
363
+ ...(definition.mutation && operation === 'execute' ? ['effectId'] : []),
364
+ 'planMaterialDigest',
365
+ 'release',
366
+ 'requestOrdinal',
367
+ 'runId',
368
+ 'scenarioId',
369
+ 'workload',
370
+ ];
371
+ if (request.method === 'POST') {
372
+ exactKeys(body, expectedBodyKeys, 'request/body');
373
+ const bodyRelease = validateRelease(body['release'], 'request/body/release');
374
+ if (body['planMaterialDigest'] !== authorization.planMaterialDigest ||
375
+ body['requestOrdinal'] !== requestOrdinal ||
376
+ body['runId'] !== authorization.runId ||
377
+ body['scenarioId'] !== authorization.scenarioId ||
378
+ body['workload'] !== definition.workload ||
379
+ JSON.stringify(bodyRelease) !== JSON.stringify(release)) {
380
+ throw invalid('request/body', 'does not match the signed authorization');
381
+ }
382
+ }
383
+ else if (Object.keys(body).length !== 0) {
384
+ throw invalid('request/body', 'GET authorization cannot carry a body');
385
+ }
386
+ if ((definition.mutation &&
387
+ operation === 'execute' &&
388
+ !DIGEST.test(effectId !== null && effectId !== void 0 ? effectId : '')) ||
389
+ (operation === 'cleanup' && effectId !== null) ||
390
+ (!definition.mutation && effectId !== null)) {
391
+ throw invalid('request/body/effectId', 'must match the fixed execute-effect or run-cleanup contract');
392
+ }
393
+ return { authorization, body };
394
+ }
395
+ export function handleProtectedLoadScenarioEndpoint(input) {
396
+ return __awaiter(this, void 0, void 0, function* () {
397
+ var _a;
398
+ const definition = adapter(input.binding.adapterId);
399
+ const { authorization } = requestAuthorization(input.request, input.binding, 'execute', ((_a = input.now) !== null && _a !== void 0 ? _a : (() => new Date()))());
400
+ if ((yield input.reserve(authorization)) !== 'claimed') {
401
+ throw invalid('request/reservation', 'was not atomically claimed');
402
+ }
403
+ const result = yield input.execute(Object.assign(Object.assign({ authorization }, (authorization.effectId ? { effectId: authorization.effectId } : {})), { requestOrdinal: authorization.requestOrdinal }));
404
+ if (typeof result.saturationPercent !== 'number' ||
405
+ !Number.isFinite(result.saturationPercent) ||
406
+ result.saturationPercent < 0 ||
407
+ result.saturationPercent > 100 ||
408
+ (definition.mutation &&
409
+ !['already-existed', 'created'].includes(String(result.effectState))) ||
410
+ (!definition.mutation && result.effectState !== undefined)) {
411
+ throw invalid('execution', 'must return bounded saturation and the exact effect outcome');
412
+ }
413
+ return {
414
+ body: Object.assign(Object.assign({}, (authorization.effectId
415
+ ? {
416
+ effect: {
417
+ id: authorization.effectId,
418
+ state: result.effectState,
419
+ },
420
+ }
421
+ : {})), { kind: 'ebk-protected-load-telemetry', hmacKeyId: authorization.hmacKeyId, planMaterialDigest: authorization.planMaterialDigest, release: authorization.release, requestOrdinal: authorization.requestOrdinal, runId: authorization.runId, saturation: {
422
+ percent: result.saturationPercent,
423
+ signalRef: authorization.saturationSignalRef,
424
+ }, scenarioId: authorization.scenarioId, schemaVersion: 1, target: authorization.target, workload: authorization.workload }),
425
+ status: 200,
426
+ };
427
+ });
428
+ }
429
+ export function handleProtectedLoadCleanupEndpoint(input) {
430
+ return __awaiter(this, void 0, void 0, function* () {
431
+ var _a;
432
+ const definition = adapter(input.binding.adapterId);
433
+ if (definition.cleanupPath === null) {
434
+ throw invalid('cleanup', 'is unavailable for this adapter');
435
+ }
436
+ const { authorization } = requestAuthorization(input.request, input.binding, 'cleanup', ((_a = input.now) !== null && _a !== void 0 ? _a : (() => new Date()))());
437
+ const cleanup = yield input.cleanup(authorization);
438
+ if (!Number.isSafeInteger(cleanup.remainingEffectCount) ||
439
+ cleanup.remainingEffectCount !== 0 ||
440
+ !Number.isSafeInteger(cleanup.removedEffectCount) ||
441
+ cleanup.removedEffectCount < 0) {
442
+ throw invalid('cleanup', 'must prove the exact protected run absent');
443
+ }
444
+ return {
445
+ body: {
446
+ kind: 'ebk-protected-load-cleanup-result',
447
+ hmacKeyId: authorization.hmacKeyId,
448
+ planMaterialDigest: authorization.planMaterialDigest,
449
+ release: authorization.release,
450
+ remainingEffectCount: cleanup.remainingEffectCount,
451
+ removedEffectCount: cleanup.removedEffectCount,
452
+ runId: authorization.runId,
453
+ scenarioId: authorization.scenarioId,
454
+ schemaVersion: 1,
455
+ status: 'run-absent',
456
+ target: authorization.target,
457
+ },
458
+ status: 200,
459
+ };
460
+ });
461
+ }
462
+ //# sourceMappingURL=protected-load-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protected-load-endpoint.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/performance/protected-load-endpoint.ts"],"names":[],"mappings":"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"}