local-serverless-stack 0.5.0 → 0.8.0
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.
- package/CHANGELOG.md +76 -0
- package/README.md +105 -17
- package/bin/cli.js +68 -5
- package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
- package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
- package/dist/server/engine/backends/localstack-backend.js +199 -0
- package/dist/server/engine/backends/localstack-backend.js.map +1 -0
- package/dist/server/engine/backends/self-backend.d.ts +32 -0
- package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
- package/dist/server/engine/backends/self-backend.js +205 -0
- package/dist/server/engine/backends/self-backend.js.map +1 -0
- package/dist/server/engine/bus.d.ts +10 -0
- package/dist/server/engine/bus.d.ts.map +1 -0
- package/dist/server/engine/bus.js +24 -0
- package/dist/server/engine/bus.js.map +1 -0
- package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
- package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
- package/dist/server/engine/dispatch/dispatcher.js +312 -0
- package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
- package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
- package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
- package/dist/server/engine/dispatch/scheduler.js +328 -0
- package/dist/server/engine/dispatch/scheduler.js.map +1 -0
- package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
- package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
- package/dist/server/engine/dispatch/sqs-poller.js +242 -0
- package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
- package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
- package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
- package/dist/server/engine/dispatch/stream-tailer.js +205 -0
- package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
- package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
- package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
- package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
- package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
- package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
- package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
- package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/index.js +572 -0
- package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
- package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/query.js +237 -0
- package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
- package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
- package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
- package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
- package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
- package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
- package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
- package/dist/server/engine/emulators/events/index.d.ts +53 -0
- package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/events/index.js +417 -0
- package/dist/server/engine/emulators/events/index.js.map +1 -0
- package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
- package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
- package/dist/server/engine/emulators/events/pattern.js +125 -0
- package/dist/server/engine/emulators/events/pattern.js.map +1 -0
- package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
- package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
- package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
- package/dist/server/engine/emulators/s3/index.d.ts +45 -0
- package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/s3/index.js +591 -0
- package/dist/server/engine/emulators/s3/index.js.map +1 -0
- package/dist/server/engine/emulators/sns/index.d.ts +22 -0
- package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/sns/index.js +135 -0
- package/dist/server/engine/emulators/sns/index.js.map +1 -0
- package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
- package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/index.js +552 -0
- package/dist/server/engine/emulators/sqs/index.js.map +1 -0
- package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
- package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/md5.js +36 -0
- package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
- package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
- package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
- package/dist/server/engine/emulators/sqs/queue.js +371 -0
- package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
- package/dist/server/engine/emulators/sts.d.ts +8 -0
- package/dist/server/engine/emulators/sts.d.ts.map +1 -0
- package/dist/server/engine/emulators/sts.js +23 -0
- package/dist/server/engine/emulators/sts.js.map +1 -0
- package/dist/server/engine/engine-backend.d.ts +17 -0
- package/dist/server/engine/engine-backend.d.ts.map +1 -0
- package/dist/server/engine/engine-backend.js +7 -0
- package/dist/server/engine/engine-backend.js.map +1 -0
- package/dist/server/engine/engine-manager.d.ts +22 -0
- package/dist/server/engine/engine-manager.d.ts.map +1 -0
- package/dist/server/engine/engine-manager.js +74 -0
- package/dist/server/engine/engine-manager.js.map +1 -0
- package/dist/server/engine/http/aws-chunked.d.ts +3 -0
- package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
- package/dist/server/engine/http/aws-chunked.js +50 -0
- package/dist/server/engine/http/aws-chunked.js.map +1 -0
- package/dist/server/engine/http/errors.d.ts +20 -0
- package/dist/server/engine/http/errors.d.ts.map +1 -0
- package/dist/server/engine/http/errors.js +43 -0
- package/dist/server/engine/http/errors.js.map +1 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
- package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
- package/dist/server/engine/http/protocols/aws-json.js +42 -0
- package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
- package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
- package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
- package/dist/server/engine/http/protocols/query-xml.js +35 -0
- package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
- package/dist/server/engine/http/router.d.ts +8 -0
- package/dist/server/engine/http/router.d.ts.map +1 -0
- package/dist/server/engine/http/router.js +391 -0
- package/dist/server/engine/http/router.js.map +1 -0
- package/dist/server/engine/http/sigv4.d.ts +9 -0
- package/dist/server/engine/http/sigv4.d.ts.map +1 -0
- package/dist/server/engine/http/sigv4.js +33 -0
- package/dist/server/engine/http/sigv4.js.map +1 -0
- package/dist/server/engine/http/xml.d.ts +16 -0
- package/dist/server/engine/http/xml.d.ts.map +1 -0
- package/dist/server/engine/http/xml.js +92 -0
- package/dist/server/engine/http/xml.js.map +1 -0
- package/dist/server/engine/store/atomic.d.ts +4 -0
- package/dist/server/engine/store/atomic.d.ts.map +1 -0
- package/dist/server/engine/store/atomic.js +35 -0
- package/dist/server/engine/store/atomic.js.map +1 -0
- package/dist/server/engine/store/engine-store.d.ts +9 -0
- package/dist/server/engine/store/engine-store.d.ts.map +1 -0
- package/dist/server/engine/store/engine-store.js +218 -0
- package/dist/server/engine/store/engine-store.js.map +1 -0
- package/dist/server/engine/store/store-types.d.ts +37 -0
- package/dist/server/engine/store/store-types.d.ts.map +1 -0
- package/dist/server/engine/store/store-types.js +17 -0
- package/dist/server/engine/store/store-types.js.map +1 -0
- package/dist/server/engine/store/wal.d.ts +49 -0
- package/dist/server/engine/store/wal.d.ts.map +1 -0
- package/dist/server/engine/store/wal.js +328 -0
- package/dist/server/engine/store/wal.js.map +1 -0
- package/dist/server/engine/types.d.ts +137 -0
- package/dist/server/engine/types.d.ts.map +1 -0
- package/dist/server/engine/types.js +8 -0
- package/dist/server/engine/types.js.map +1 -0
- package/dist/server/index.js +12 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/services.d.ts.map +1 -1
- package/dist/server/routes/services.js +2 -0
- package/dist/server/routes/services.js.map +1 -1
- package/dist/server/runtime/runtime-worker.js +34 -11
- package/dist/server/runtime/runtime-worker.js.map +1 -1
- package/dist/server/services/artifact-resolver.d.ts +2 -0
- package/dist/server/services/artifact-resolver.d.ts.map +1 -0
- package/dist/server/services/artifact-resolver.js +38 -0
- package/dist/server/services/artifact-resolver.js.map +1 -0
- package/dist/server/services/cloudformation-parser.d.ts +41 -2
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
- package/dist/server/services/cloudformation-parser.js +96 -6
- package/dist/server/services/cloudformation-parser.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +29 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +75 -6
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -1
- package/dist/server/services/lambda-runtime-manager.js +2 -19
- package/dist/server/services/lambda-runtime-manager.js.map +1 -1
- package/dist/server/services/localstack-manager.d.ts +0 -7
- package/dist/server/services/localstack-manager.d.ts.map +1 -1
- package/dist/server/services/localstack-manager.js +11 -173
- package/dist/server/services/localstack-manager.js.map +1 -1
- package/dist/server/services/resource-provisioner.d.ts +7 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +244 -18
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/service-registrar.d.ts.map +1 -1
- package/dist/server/services/service-registrar.js +22 -4
- package/dist/server/services/service-registrar.js.map +1 -1
- package/dist/ui/assets/ApisPage-a9i2qD0Z.js +1 -0
- package/dist/ui/assets/BucketDetailPage-Cz27N0KV.js +1 -0
- package/dist/ui/assets/BucketsPage-CZ7wGmUN.js +1 -0
- package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-BZMs1iW8.js} +1 -1
- package/dist/ui/assets/DynamoTablePage-BQsGkhtO.js +3 -0
- package/dist/ui/assets/LambdaDetailPage-DJb7xqRB.js +4 -0
- package/dist/ui/assets/LambdasPage-Ctg1l-Lg.js +1 -0
- package/dist/ui/assets/OverviewPage-DiijblCA.js +1 -0
- package/dist/ui/assets/QueueDetailPage-DRpSqost.js +1 -0
- package/dist/ui/assets/QueuesPage-CY0bDGwV.js +1 -0
- package/dist/ui/assets/ServiceDetailPage-CYTEdtts.js +2 -0
- package/dist/ui/assets/ServicesPage-OlV_rr-q.js +2 -0
- package/dist/ui/assets/index-C1KdKPDS.css +1 -0
- package/dist/ui/assets/index-DA_C1HOg.js +36 -0
- package/dist/ui/index.html +2 -2
- package/package.json +2 -1
- package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
- package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
- package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
- package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
- package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
- package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
- package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
- package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
- package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
- package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
- package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
- package/dist/ui/assets/index-BWlB542w.js +0 -36
- package/dist/ui/assets/index-EYnsoJOq.css +0 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// DynamoDB Streams → Lambda tailers (PRD RF5.3). One serial tailer per
|
|
2
|
+
// ENABLED ESM on a table stream ARN; wakes on the engine bus
|
|
3
|
+
// 'dynamo:stream-appended' event — no polling. Failure semantics follow AWS:
|
|
4
|
+
// the same batch retries up to min(maximumRetryAttempts, 5) times, then (when
|
|
5
|
+
// configured) the OnFailure SQS destination receives the DDBStreamBatchInfo
|
|
6
|
+
// envelope and the tailer advances past the poisoned batch.
|
|
7
|
+
import { randomUUID } from 'crypto';
|
|
8
|
+
import { queueNameFromArn } from '../emulators/sqs/index.js';
|
|
9
|
+
const DEFAULT_RETRY_BACKOFF_MS = 200;
|
|
10
|
+
const MAX_RETRY_ATTEMPTS = 5;
|
|
11
|
+
// The stream ring keeps at most 1000 records, so one read sees them all.
|
|
12
|
+
const LATEST_PROBE_LIMIT = 1000;
|
|
13
|
+
const STREAM_ARN_TABLE = /:table\/([^/]+)\/stream\//;
|
|
14
|
+
class StreamTailer {
|
|
15
|
+
region;
|
|
16
|
+
tableName;
|
|
17
|
+
esm;
|
|
18
|
+
deps;
|
|
19
|
+
afterSeq;
|
|
20
|
+
stopped = false;
|
|
21
|
+
delivering = false;
|
|
22
|
+
pending = false;
|
|
23
|
+
busListener;
|
|
24
|
+
constructor(deps, esm, region, tableName) {
|
|
25
|
+
this.deps = deps;
|
|
26
|
+
this.esm = esm;
|
|
27
|
+
this.region = region;
|
|
28
|
+
this.tableName = tableName;
|
|
29
|
+
// LATEST starts after whatever the ring holds right now; TRIM_HORIZON
|
|
30
|
+
// (and an omitted position) starts at the oldest retained record.
|
|
31
|
+
if (esm.startingPosition === 'LATEST') {
|
|
32
|
+
this.afterSeq = deps.dynamo.readStream(region, tableName, undefined, LATEST_PROBE_LIMIT).lastSeq;
|
|
33
|
+
}
|
|
34
|
+
this.busListener = payload => {
|
|
35
|
+
if (payload.region === this.region && payload.tableName === this.tableName)
|
|
36
|
+
this.wake();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
start() {
|
|
40
|
+
this.deps.ctx.bus.on('dynamo:stream-appended', this.busListener);
|
|
41
|
+
this.wake();
|
|
42
|
+
}
|
|
43
|
+
update(esm) {
|
|
44
|
+
this.esm = esm;
|
|
45
|
+
this.wake();
|
|
46
|
+
}
|
|
47
|
+
stop() {
|
|
48
|
+
this.stopped = true;
|
|
49
|
+
this.deps.ctx.bus.off('dynamo:stream-appended', this.busListener);
|
|
50
|
+
}
|
|
51
|
+
wake() {
|
|
52
|
+
if (this.stopped || !this.esm.enabled)
|
|
53
|
+
return;
|
|
54
|
+
if (this.delivering) {
|
|
55
|
+
this.pending = true;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.delivering = true;
|
|
59
|
+
void this.run().catch(err => {
|
|
60
|
+
console.warn(`[engine-stream-tailer] tailer for ${this.tableName} crashed:`, err);
|
|
61
|
+
this.delivering = false;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async run() {
|
|
65
|
+
do {
|
|
66
|
+
this.pending = false;
|
|
67
|
+
for (;;) {
|
|
68
|
+
if (this.stopped || !this.esm.enabled)
|
|
69
|
+
break;
|
|
70
|
+
const { records, lastSeq } = this.deps.dynamo.readStream(this.region, this.tableName, this.afterSeq, this.esm.batchSize);
|
|
71
|
+
if (records.length === 0 || lastSeq === undefined)
|
|
72
|
+
break;
|
|
73
|
+
await this.deliverBatch(records);
|
|
74
|
+
if (this.stopped)
|
|
75
|
+
break;
|
|
76
|
+
// Advance in every outcome: success, or retries exhausted (with the
|
|
77
|
+
// OnFailure envelope already sent) — a poisoned batch never wedges.
|
|
78
|
+
this.afterSeq = lastSeq;
|
|
79
|
+
}
|
|
80
|
+
} while (this.pending && !this.stopped && this.esm.enabled);
|
|
81
|
+
this.delivering = false;
|
|
82
|
+
}
|
|
83
|
+
async deliverBatch(records) {
|
|
84
|
+
const event = { Records: records };
|
|
85
|
+
const maxRetries = Math.min(this.esm.maximumRetryAttempts ?? MAX_RETRY_ATTEMPTS, MAX_RETRY_ATTEMPTS);
|
|
86
|
+
let lastErrorType;
|
|
87
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
88
|
+
if (attempt > 0)
|
|
89
|
+
await sleep(this.deps.retryBackoffMs ?? DEFAULT_RETRY_BACKOFF_MS);
|
|
90
|
+
if (this.stopped)
|
|
91
|
+
return;
|
|
92
|
+
const result = await this.deps.invoke(this.esm.functionName, event);
|
|
93
|
+
if (result.ok)
|
|
94
|
+
return;
|
|
95
|
+
lastErrorType = result.errorType;
|
|
96
|
+
}
|
|
97
|
+
console.warn(`[engine-stream-tailer] ${this.tableName}: batch of ${records.length} record(s) failed after ` +
|
|
98
|
+
`${maxRetries + 1} attempt(s) (${lastErrorType ?? 'Error'}) — advancing past it`);
|
|
99
|
+
if (this.esm.onFailureDestinationArn) {
|
|
100
|
+
await this.sendOnFailure(records, maxRetries + 1, lastErrorType);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// AWS's OnFailure destination envelope for stream batches.
|
|
104
|
+
async sendOnFailure(records, invokeCount, errorType) {
|
|
105
|
+
const destinationArn = this.esm.onFailureDestinationArn;
|
|
106
|
+
const first = records[0];
|
|
107
|
+
const last = records[records.length - 1];
|
|
108
|
+
const { account } = this.deps.ctx.config;
|
|
109
|
+
const envelope = {
|
|
110
|
+
requestContext: {
|
|
111
|
+
requestId: randomUUID(),
|
|
112
|
+
functionArn: `arn:aws:lambda:${this.region}:${account}:function:${this.esm.functionName}`,
|
|
113
|
+
condition: 'RetryAttemptsExhausted',
|
|
114
|
+
approximateInvokeCount: invokeCount,
|
|
115
|
+
},
|
|
116
|
+
responseContext: {
|
|
117
|
+
statusCode: 200,
|
|
118
|
+
functionError: errorType ?? 'Unhandled',
|
|
119
|
+
},
|
|
120
|
+
version: '1.0',
|
|
121
|
+
timestamp: new Date().toISOString(),
|
|
122
|
+
DDBStreamBatchInfo: {
|
|
123
|
+
shardId: 'shardId-000000000000',
|
|
124
|
+
startSequenceNumber: first.dynamodb?.SequenceNumber,
|
|
125
|
+
endSequenceNumber: last.dynamodb?.SequenceNumber,
|
|
126
|
+
approximateArrivalOfFirstRecord: arrivalIso(first),
|
|
127
|
+
approximateArrivalOfLastRecord: arrivalIso(last),
|
|
128
|
+
batchSize: records.length,
|
|
129
|
+
streamArn: first.eventSourceARN ?? this.esm.eventSourceArn,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
const queueName = queueNameFromArn(destinationArn);
|
|
133
|
+
const syntheticRequest = {
|
|
134
|
+
method: 'POST',
|
|
135
|
+
rawPath: '/',
|
|
136
|
+
query: {},
|
|
137
|
+
headers: {},
|
|
138
|
+
body: Buffer.alloc(0),
|
|
139
|
+
service: 'sqs',
|
|
140
|
+
region: this.region,
|
|
141
|
+
requestId: randomUUID(),
|
|
142
|
+
};
|
|
143
|
+
try {
|
|
144
|
+
await this.deps.sqs.handle('SendMessage', {
|
|
145
|
+
QueueUrl: `${this.deps.ctx.endpoint()}/${account}/${queueName}`,
|
|
146
|
+
MessageBody: JSON.stringify(envelope),
|
|
147
|
+
}, syntheticRequest);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.warn(`[engine-stream-tailer] OnFailure destination ${destinationArn} rejected the failure envelope:`, err instanceof Error ? err.message : err);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export class StreamTailerSet {
|
|
155
|
+
deps;
|
|
156
|
+
tailers = new Map();
|
|
157
|
+
constructor(deps) {
|
|
158
|
+
this.deps = deps;
|
|
159
|
+
}
|
|
160
|
+
sync(region) {
|
|
161
|
+
const alive = new Set();
|
|
162
|
+
for (const esm of this.deps.lambdaCtl.listEventSourceMappings(region)) {
|
|
163
|
+
const match = STREAM_ARN_TABLE.exec(esm.eventSourceArn);
|
|
164
|
+
if (!match)
|
|
165
|
+
continue;
|
|
166
|
+
if (!esm.enabled)
|
|
167
|
+
continue;
|
|
168
|
+
alive.add(esm.uuid);
|
|
169
|
+
const existing = this.tailers.get(esm.uuid);
|
|
170
|
+
if (existing) {
|
|
171
|
+
existing.update(esm);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const tailer = new StreamTailer(this.deps, esm, region, match[1]);
|
|
175
|
+
this.tailers.set(esm.uuid, tailer);
|
|
176
|
+
tailer.start();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
for (const [uuid, tailer] of this.tailers) {
|
|
180
|
+
if (tailer.region === region && !alive.has(uuid)) {
|
|
181
|
+
tailer.stop();
|
|
182
|
+
this.tailers.delete(uuid);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
stopAll() {
|
|
187
|
+
for (const tailer of this.tailers.values())
|
|
188
|
+
tailer.stop();
|
|
189
|
+
this.tailers.clear();
|
|
190
|
+
}
|
|
191
|
+
tailerCount() {
|
|
192
|
+
return this.tailers.size;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function arrivalIso(record) {
|
|
196
|
+
const seconds = record.dynamodb?.ApproximateCreationDateTime;
|
|
197
|
+
return seconds === undefined ? undefined : new Date(seconds * 1000).toISOString();
|
|
198
|
+
}
|
|
199
|
+
function sleep(ms) {
|
|
200
|
+
return new Promise(resolve => {
|
|
201
|
+
const timer = setTimeout(resolve, ms);
|
|
202
|
+
timer.unref();
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=stream-tailer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-tailer.js","sourceRoot":"","sources":["../../../../src/server/engine/dispatch/stream-tailer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function addDecimals(a: string, b: string): string;
|
|
2
|
+
export declare function subtractDecimals(a: string, b: string): string;
|
|
3
|
+
export declare function compareDecimals(a: string, b: string): number;
|
|
4
|
+
export declare function normalizeDecimal(text: string): string;
|
|
5
|
+
//# sourceMappingURL=decimal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decimal.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/decimal.ts"],"names":[],"mappings":"AA+EA,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5D;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Exact decimal-string arithmetic for DynamoDB N values. Numbers travel the
|
|
2
|
+
// wire as strings and must stay strings end-to-end: `ADD` / `SET a = a + :v`
|
|
3
|
+
// and sort-key comparisons operate on the decimal text directly (BigInt
|
|
4
|
+
// coefficient + scale), so 0.1 + 0.2 is exactly "0.3" and integers beyond
|
|
5
|
+
// 2^53 never lose precision.
|
|
6
|
+
import { validationError } from '../../../http/errors.js';
|
|
7
|
+
const NUMBER_PATTERN = /^([+-]?)(\d*)(?:\.(\d*))?(?:[eE]([+-]?\d+))?$/;
|
|
8
|
+
// DynamoDB supports magnitudes up to 1E+126 and down to 1E-130; anything the
|
|
9
|
+
// wire should never carry is rejected instead of allocating huge BigInts.
|
|
10
|
+
const MAX_EXPONENT = 130;
|
|
11
|
+
function parseDecimal(text) {
|
|
12
|
+
const match = NUMBER_PATTERN.exec(text.trim());
|
|
13
|
+
const intPart = match?.[2] ?? '';
|
|
14
|
+
const fracPart = match?.[3] ?? '';
|
|
15
|
+
if (!match || intPart.length + fracPart.length === 0) {
|
|
16
|
+
throw validationError(`The parameter cannot be converted to a numeric value: ${text}`);
|
|
17
|
+
}
|
|
18
|
+
let coefficient = BigInt(intPart + fracPart);
|
|
19
|
+
let scale = fracPart.length;
|
|
20
|
+
const exponent = match[4] ? parseInt(match[4], 10) : 0;
|
|
21
|
+
if (coefficient !== 0n && Math.abs(exponent) > MAX_EXPONENT) {
|
|
22
|
+
const bound = exponent > 0 ? 'larger' : 'smaller';
|
|
23
|
+
throw validationError(`Number ${exponent > 0 ? 'overflow' : 'underflow'}. Attempting to store a number with magnitude ${bound} than supported range`);
|
|
24
|
+
}
|
|
25
|
+
if (exponent > 0) {
|
|
26
|
+
if (exponent >= scale) {
|
|
27
|
+
coefficient *= 10n ** BigInt(exponent - scale);
|
|
28
|
+
scale = 0;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
scale -= exponent;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else if (exponent < 0) {
|
|
35
|
+
scale += -exponent;
|
|
36
|
+
}
|
|
37
|
+
return { negative: match[1] === '-' && coefficient !== 0n, coefficient, scale };
|
|
38
|
+
}
|
|
39
|
+
function renderDecimal(dec) {
|
|
40
|
+
let { coefficient, scale } = dec;
|
|
41
|
+
if (coefficient === 0n)
|
|
42
|
+
return '0';
|
|
43
|
+
while (scale > 0 && coefficient % 10n === 0n) {
|
|
44
|
+
coefficient /= 10n;
|
|
45
|
+
scale -= 1;
|
|
46
|
+
}
|
|
47
|
+
const digits = coefficient.toString();
|
|
48
|
+
let text;
|
|
49
|
+
if (scale === 0) {
|
|
50
|
+
text = digits;
|
|
51
|
+
}
|
|
52
|
+
else if (digits.length <= scale) {
|
|
53
|
+
text = `0.${digits.padStart(scale, '0')}`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
text = `${digits.slice(0, digits.length - scale)}.${digits.slice(digits.length - scale)}`;
|
|
57
|
+
}
|
|
58
|
+
return dec.negative ? `-${text}` : text;
|
|
59
|
+
}
|
|
60
|
+
// Signed coefficients of both operands brought to a common scale.
|
|
61
|
+
function aligned(a, b) {
|
|
62
|
+
const da = parseDecimal(a);
|
|
63
|
+
const db = parseDecimal(b);
|
|
64
|
+
const scale = Math.max(da.scale, db.scale);
|
|
65
|
+
const left = (da.negative ? -da.coefficient : da.coefficient) * 10n ** BigInt(scale - da.scale);
|
|
66
|
+
const right = (db.negative ? -db.coefficient : db.coefficient) * 10n ** BigInt(scale - db.scale);
|
|
67
|
+
return { left, right, scale };
|
|
68
|
+
}
|
|
69
|
+
function fromSigned(value, scale) {
|
|
70
|
+
return renderDecimal({ negative: value < 0n, coefficient: value < 0n ? -value : value, scale });
|
|
71
|
+
}
|
|
72
|
+
export function addDecimals(a, b) {
|
|
73
|
+
const { left, right, scale } = aligned(a, b);
|
|
74
|
+
return fromSigned(left + right, scale);
|
|
75
|
+
}
|
|
76
|
+
export function subtractDecimals(a, b) {
|
|
77
|
+
const { left, right, scale } = aligned(a, b);
|
|
78
|
+
return fromSigned(left - right, scale);
|
|
79
|
+
}
|
|
80
|
+
export function compareDecimals(a, b) {
|
|
81
|
+
const { left, right } = aligned(a, b);
|
|
82
|
+
if (left === right)
|
|
83
|
+
return 0;
|
|
84
|
+
return left < right ? -1 : 1;
|
|
85
|
+
}
|
|
86
|
+
// Canonical form ("01.10" → "1.1") — used to normalize N values and NS
|
|
87
|
+
// members so equality matches DynamoDB's numeric semantics.
|
|
88
|
+
export function normalizeDecimal(text) {
|
|
89
|
+
return renderDecimal(parseDecimal(text));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=decimal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decimal.js","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/decimal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AttributeMap, AttributeValue } from '../../../types.js';
|
|
2
|
+
import { normalizeDecimal } from './decimal.js';
|
|
3
|
+
export type PathSegment = {
|
|
4
|
+
attr: string;
|
|
5
|
+
} | {
|
|
6
|
+
index: number;
|
|
7
|
+
};
|
|
8
|
+
export type DocumentPath = PathSegment[];
|
|
9
|
+
export type AttributeTypeName = 'S' | 'N' | 'B' | 'BOOL' | 'NULL' | 'L' | 'M' | 'SS' | 'NS' | 'BS';
|
|
10
|
+
export declare function typeOf(value: AttributeValue): AttributeTypeName;
|
|
11
|
+
export declare function formatPath(path: DocumentPath): string;
|
|
12
|
+
export declare function resolvePath(item: AttributeMap, path: DocumentPath): AttributeValue | undefined;
|
|
13
|
+
export declare function pathsOverlap(a: DocumentPath, b: DocumentPath): boolean;
|
|
14
|
+
export declare function attributeValuesEqual(a: AttributeValue, b: AttributeValue): boolean;
|
|
15
|
+
export declare function compareAttributeValues(a: AttributeValue, b: AttributeValue): number;
|
|
16
|
+
export declare function isOrderable(value: AttributeValue): boolean;
|
|
17
|
+
export declare function orderedCompare(a: AttributeValue, b: AttributeValue, op: '<' | '<=' | '>' | '>='): boolean;
|
|
18
|
+
export declare function beginsWith(target: AttributeValue, prefix: AttributeValue): boolean;
|
|
19
|
+
export declare function containsValue(target: AttributeValue, operand: AttributeValue): boolean;
|
|
20
|
+
export declare function sizeOf(value: AttributeValue): AttributeValue | undefined;
|
|
21
|
+
export declare function setUnion(tag: 'SS' | 'NS' | 'BS', existing: string[], added: string[]): string[];
|
|
22
|
+
export declare function setDifference(tag: 'SS' | 'NS' | 'BS', existing: string[], removed: string[]): string[];
|
|
23
|
+
export { normalizeDecimal };
|
|
24
|
+
//# sourceMappingURL=evaluate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/evaluate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAmB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAInG,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAM/D;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,SAAS,CAO9F;AAID,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CActE;AAWD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,CA4BlF;AAMD,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CASnF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAG1D;AAID,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,CASzG;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAQlF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAStF;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CASxE;AAGD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAM/F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEtG;AAQD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Value semantics of the expression language: document-path resolution,
|
|
2
|
+
// wire-format equality/ordering and the per-function predicates. Pure over
|
|
3
|
+
// AttributeValue JSON — nothing here mutates an item.
|
|
4
|
+
import { compareDecimals, normalizeDecimal } from './decimal.js';
|
|
5
|
+
const TYPE_TAGS = ['S', 'N', 'B', 'BOOL', 'NULL', 'L', 'M', 'SS', 'NS', 'BS'];
|
|
6
|
+
export function typeOf(value) {
|
|
7
|
+
for (const tag of TYPE_TAGS) {
|
|
8
|
+
if (value[tag] !== undefined)
|
|
9
|
+
return tag;
|
|
10
|
+
}
|
|
11
|
+
// Unreachable for wire-valid items; treat a degenerate {} as NULL.
|
|
12
|
+
return 'NULL';
|
|
13
|
+
}
|
|
14
|
+
// Human-readable form used by the "Two document paths overlap" error:
|
|
15
|
+
// [a, b, [0]].
|
|
16
|
+
export function formatPath(path) {
|
|
17
|
+
return path.map((seg) => ('attr' in seg ? seg.attr : `[${seg.index}]`)).join(', ');
|
|
18
|
+
}
|
|
19
|
+
export function resolvePath(item, path) {
|
|
20
|
+
let current = { M: item };
|
|
21
|
+
for (const seg of path) {
|
|
22
|
+
if (current === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
current = 'attr' in seg ? current.M?.[seg.attr] : current.L?.[seg.index];
|
|
25
|
+
}
|
|
26
|
+
return current;
|
|
27
|
+
}
|
|
28
|
+
// One path is a prefix of the other (or they are identical). Distinct list
|
|
29
|
+
// indexes at the fork point do not overlap.
|
|
30
|
+
export function pathsOverlap(a, b) {
|
|
31
|
+
const len = Math.min(a.length, b.length);
|
|
32
|
+
for (let i = 0; i < len; i++) {
|
|
33
|
+
const sa = a[i];
|
|
34
|
+
const sb = b[i];
|
|
35
|
+
if ('attr' in sa && 'attr' in sb) {
|
|
36
|
+
if (sa.attr !== sb.attr)
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
else if ('index' in sa && 'index' in sb) {
|
|
40
|
+
if (sa.index !== sb.index)
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
function base64Bytes(value) {
|
|
50
|
+
return Buffer.from(value, 'base64');
|
|
51
|
+
}
|
|
52
|
+
function setEquals(a, b, memberEquals) {
|
|
53
|
+
if (a.length !== b.length)
|
|
54
|
+
return false;
|
|
55
|
+
return a.every((x) => b.some((y) => memberEquals(x, y)));
|
|
56
|
+
}
|
|
57
|
+
export function attributeValuesEqual(a, b) {
|
|
58
|
+
const type = typeOf(a);
|
|
59
|
+
if (type !== typeOf(b))
|
|
60
|
+
return false;
|
|
61
|
+
switch (type) {
|
|
62
|
+
case 'S':
|
|
63
|
+
return a.S === b.S;
|
|
64
|
+
case 'N':
|
|
65
|
+
return compareDecimals(a.N, b.N) === 0;
|
|
66
|
+
case 'B':
|
|
67
|
+
return base64Bytes(a.B).equals(base64Bytes(b.B));
|
|
68
|
+
case 'BOOL':
|
|
69
|
+
return a.BOOL === b.BOOL;
|
|
70
|
+
case 'NULL':
|
|
71
|
+
return true;
|
|
72
|
+
case 'L':
|
|
73
|
+
return a.L.length === b.L.length && a.L.every((v, i) => attributeValuesEqual(v, b.L[i]));
|
|
74
|
+
case 'M': {
|
|
75
|
+
const keysA = Object.keys(a.M);
|
|
76
|
+
return keysA.length === Object.keys(b.M).length &&
|
|
77
|
+
keysA.every((k) => b.M[k] !== undefined && attributeValuesEqual(a.M[k], b.M[k]));
|
|
78
|
+
}
|
|
79
|
+
case 'SS':
|
|
80
|
+
return setEquals(a.SS, b.SS, (x, y) => x === y);
|
|
81
|
+
case 'NS':
|
|
82
|
+
return setEquals(a.NS, b.NS, (x, y) => compareDecimals(x, y) === 0);
|
|
83
|
+
case 'BS':
|
|
84
|
+
return setEquals(a.BS, b.BS, (x, y) => base64Bytes(x).equals(base64Bytes(y)));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Total ordering for same-type scalars (sort keys, BETWEEN, comparators).
|
|
88
|
+
// Non-orderable or cross-type pairs still get a stable deterministic order so
|
|
89
|
+
// the function stays total, but condition evaluation never relies on it —
|
|
90
|
+
// orderedCompare() guards the orderable types first.
|
|
91
|
+
export function compareAttributeValues(a, b) {
|
|
92
|
+
const type = typeOf(a);
|
|
93
|
+
if (type === typeOf(b)) {
|
|
94
|
+
if (type === 'S')
|
|
95
|
+
return a.S < b.S ? -1 : a.S > b.S ? 1 : 0;
|
|
96
|
+
if (type === 'N')
|
|
97
|
+
return compareDecimals(a.N, b.N);
|
|
98
|
+
if (type === 'B')
|
|
99
|
+
return base64Bytes(a.B).compare(base64Bytes(b.B));
|
|
100
|
+
}
|
|
101
|
+
if (attributeValuesEqual(a, b))
|
|
102
|
+
return 0;
|
|
103
|
+
return JSON.stringify(a) < JSON.stringify(b) ? -1 : 1;
|
|
104
|
+
}
|
|
105
|
+
export function isOrderable(value) {
|
|
106
|
+
const type = typeOf(value);
|
|
107
|
+
return type === 'S' || type === 'N' || type === 'B';
|
|
108
|
+
}
|
|
109
|
+
// Ordering comparison usable inside condition evaluation: false whenever the
|
|
110
|
+
// operands are not the same orderable type (AWS semantics — never an error).
|
|
111
|
+
export function orderedCompare(a, b, op) {
|
|
112
|
+
if (typeOf(a) !== typeOf(b) || !isOrderable(a))
|
|
113
|
+
return false;
|
|
114
|
+
const cmp = compareAttributeValues(a, b);
|
|
115
|
+
switch (op) {
|
|
116
|
+
case '<': return cmp < 0;
|
|
117
|
+
case '<=': return cmp <= 0;
|
|
118
|
+
case '>': return cmp > 0;
|
|
119
|
+
case '>=': return cmp >= 0;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function beginsWith(target, prefix) {
|
|
123
|
+
if (target.S !== undefined && prefix.S !== undefined)
|
|
124
|
+
return target.S.startsWith(prefix.S);
|
|
125
|
+
if (target.B !== undefined && prefix.B !== undefined) {
|
|
126
|
+
const t = base64Bytes(target.B);
|
|
127
|
+
const p = base64Bytes(prefix.B);
|
|
128
|
+
return t.length >= p.length && t.subarray(0, p.length).equals(p);
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
export function containsValue(target, operand) {
|
|
133
|
+
if (target.S !== undefined)
|
|
134
|
+
return operand.S !== undefined && target.S.includes(operand.S);
|
|
135
|
+
if (target.SS !== undefined)
|
|
136
|
+
return operand.S !== undefined && target.SS.includes(operand.S);
|
|
137
|
+
if (target.NS !== undefined)
|
|
138
|
+
return operand.N !== undefined && target.NS.some((n) => compareDecimals(n, operand.N) === 0);
|
|
139
|
+
if (target.BS !== undefined) {
|
|
140
|
+
return operand.B !== undefined && target.BS.some((b) => base64Bytes(b).equals(base64Bytes(operand.B)));
|
|
141
|
+
}
|
|
142
|
+
if (target.L !== undefined)
|
|
143
|
+
return target.L.some((v) => attributeValuesEqual(v, operand));
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
export function sizeOf(value) {
|
|
147
|
+
if (value.S !== undefined)
|
|
148
|
+
return { N: String(value.S.length) };
|
|
149
|
+
if (value.B !== undefined)
|
|
150
|
+
return { N: String(base64Bytes(value.B).length) };
|
|
151
|
+
if (value.L !== undefined)
|
|
152
|
+
return { N: String(value.L.length) };
|
|
153
|
+
if (value.M !== undefined)
|
|
154
|
+
return { N: String(Object.keys(value.M).length) };
|
|
155
|
+
if (value.SS !== undefined)
|
|
156
|
+
return { N: String(value.SS.length) };
|
|
157
|
+
if (value.NS !== undefined)
|
|
158
|
+
return { N: String(value.NS.length) };
|
|
159
|
+
if (value.BS !== undefined)
|
|
160
|
+
return { N: String(value.BS.length) };
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
// Set union / difference for ADD and DELETE. `tag` picks the member equality.
|
|
164
|
+
export function setUnion(tag, existing, added) {
|
|
165
|
+
const result = [...existing];
|
|
166
|
+
for (const member of added) {
|
|
167
|
+
if (!setContains(tag, result, member))
|
|
168
|
+
result.push(member);
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
export function setDifference(tag, existing, removed) {
|
|
173
|
+
return existing.filter((member) => !setContains(tag, removed, member));
|
|
174
|
+
}
|
|
175
|
+
function setContains(tag, members, candidate) {
|
|
176
|
+
if (tag === 'NS')
|
|
177
|
+
return members.some((m) => compareDecimals(m, candidate) === 0);
|
|
178
|
+
if (tag === 'BS')
|
|
179
|
+
return members.some((m) => base64Bytes(m).equals(base64Bytes(candidate)));
|
|
180
|
+
return members.includes(candidate);
|
|
181
|
+
}
|
|
182
|
+
export { normalizeDecimal };
|
|
183
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AttributeMap, AttributeValue } from '../../../types.js';
|
|
2
|
+
export interface ExpressionContext {
|
|
3
|
+
names?: Record<string, string>;
|
|
4
|
+
values?: AttributeMap;
|
|
5
|
+
}
|
|
6
|
+
export type SortKeyOperator = '=' | '<' | '<=' | '>' | '>=' | 'BETWEEN' | 'begins_with';
|
|
7
|
+
export interface ParsedKeyCondition {
|
|
8
|
+
partition: {
|
|
9
|
+
name: string;
|
|
10
|
+
value: AttributeValue;
|
|
11
|
+
};
|
|
12
|
+
sort?: {
|
|
13
|
+
name: string;
|
|
14
|
+
operator: SortKeyOperator;
|
|
15
|
+
values: AttributeValue[];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface CompiledCondition {
|
|
19
|
+
evaluate(item: AttributeMap): boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ExpressionEngine {
|
|
22
|
+
parseKeyCondition(expression: string, ctx: ExpressionContext): ParsedKeyCondition;
|
|
23
|
+
compileCondition(expression: string, ctx: ExpressionContext): CompiledCondition;
|
|
24
|
+
applyUpdate(expression: string, item: AttributeMap, ctx: ExpressionContext): AttributeMap;
|
|
25
|
+
applyProjection(expression: string, item: AttributeMap, ctx: ExpressionContext): AttributeMap;
|
|
26
|
+
compareAttributeValues(a: AttributeValue, b: AttributeValue): number;
|
|
27
|
+
attributeValuesEqual(a: AttributeValue, b: AttributeValue): boolean;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=expression-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-types.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/expression-types.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAAC;AAExF,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,CAAA;KAAE,CAAC;IACnD,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;CAC9E;AAMD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,kBAAkB,CAAC;IAElF,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;IAKhF,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAAC;IAG1F,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAAC;IAK9F,sBAAsB,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;IAGrE,oBAAoB,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;CACrE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Public API contract of the DynamoDB expression engine (lexer + parser +
|
|
2
|
+
// evaluators). ./index.ts implements and exports concrete functions matching
|
|
3
|
+
// `ExpressionEngine`; the DynamoDB emulator core imports them from there.
|
|
4
|
+
// All item data is wire-format AttributeValue JSON.
|
|
5
|
+
//
|
|
6
|
+
// Errors: every syntax/semantic problem must throw AwsError with code
|
|
7
|
+
// "ValidationException" and an AWS-worded message (unused
|
|
8
|
+
// ExpressionAttributeNames/Values, undefined placeholders; reserved-word
|
|
9
|
+
// misuse is NOT enforced in v1). ConditionalCheckFailedException is raised by
|
|
10
|
+
// the emulator core, not here — condition evaluation just returns boolean.
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=expression-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression-types.js","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/expression-types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,0EAA0E;AAC1E,oDAAoD;AACpD,EAAE;AACF,sEAAsE;AACtE,0DAA0D;AAC1D,yEAAyE;AACzE,8EAA8E;AAC9E,2EAA2E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AttributeMap } from '../../../types.js';
|
|
2
|
+
import type { CompiledCondition, ExpressionContext, ExpressionEngine, ParsedKeyCondition } from './expression-types.js';
|
|
3
|
+
import { attributeValuesEqual, compareAttributeValues } from './evaluate.js';
|
|
4
|
+
export type { DocumentPath, PathSegment } from './evaluate.js';
|
|
5
|
+
export { compareDecimals, addDecimals, subtractDecimals, normalizeDecimal } from './decimal.js';
|
|
6
|
+
export { attributeValuesEqual, compareAttributeValues };
|
|
7
|
+
export declare function parseKeyCondition(expression: string, ctx: ExpressionContext): ParsedKeyCondition;
|
|
8
|
+
export declare function compileCondition(expression: string, ctx: ExpressionContext, label?: 'ConditionExpression' | 'FilterExpression'): CompiledCondition;
|
|
9
|
+
export declare function applyUpdate(expression: string, item: AttributeMap, ctx: ExpressionContext): AttributeMap;
|
|
10
|
+
export declare function applyProjection(expression: string, item: AttributeMap, ctx: ExpressionContext): AttributeMap;
|
|
11
|
+
export declare function assertPlaceholdersUsed(expressions: Array<string | null | undefined>, ctx: ExpressionContext): void;
|
|
12
|
+
export declare const expressionEngine: ExpressionEngine;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/server/engine/emulators/dynamodb/expressions/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EACV,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAC3E,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,oBAAoB,EAAE,sBAAsB,EAE7C,MAAM,eAAe,CAAC;AAIvB,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,CAAC;AAKxD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,kBAAkB,CAEhG;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,iBAAiB,EACtB,KAAK,GAAE,qBAAqB,GAAG,kBAA0C,GACxE,iBAAiB,CAGnB;AAqED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAsDxG;AAuDD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAY5G;AAQD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAC7C,GAAG,EAAE,iBAAiB,GACrB,IAAI,CAaN;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAO9B,CAAC"}
|