local-serverless-stack 0.6.0 → 0.9.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 +104 -0
- package/README.md +261 -583
- package/bin/cli.js +31 -3
- package/dist/client/types.d.ts +4 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/server/engine/aoss-sidecar.d.ts +13 -0
- package/dist/server/engine/aoss-sidecar.d.ts.map +1 -0
- package/dist/server/engine/aoss-sidecar.js +93 -0
- package/dist/server/engine/aoss-sidecar.js.map +1 -0
- 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 +207 -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/opensearch/index.d.ts +67 -0
- package/dist/server/engine/emulators/opensearch/index.d.ts.map +1 -0
- package/dist/server/engine/emulators/opensearch/index.js +811 -0
- package/dist/server/engine/emulators/opensearch/index.js.map +1 -0
- package/dist/server/engine/emulators/opensearch/search.d.ts +17 -0
- package/dist/server/engine/emulators/opensearch/search.d.ts.map +1 -0
- package/dist/server/engine/emulators/opensearch/search.js +434 -0
- package/dist/server/engine/emulators/opensearch/search.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 +402 -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 +43 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/config.d.ts.map +1 -1
- package/dist/server/routes/config.js +16 -0
- package/dist/server/routes/config.js.map +1 -1
- package/dist/server/routes/opensearch.d.ts +3 -0
- package/dist/server/routes/opensearch.d.ts.map +1 -0
- package/dist/server/routes/opensearch.js +69 -0
- package/dist/server/routes/opensearch.js.map +1 -0
- package/dist/server/routes/resources.d.ts.map +1 -1
- package/dist/server/routes/resources.js +4 -1
- package/dist/server/routes/resources.js.map +1 -1
- package/dist/server/routes/services.d.ts.map +1 -1
- package/dist/server/routes/services.js +3 -0
- package/dist/server/routes/services.js.map +1 -1
- package/dist/server/services/cache-manager.d.ts +2 -1
- package/dist/server/services/cache-manager.d.ts.map +1 -1
- package/dist/server/services/cache-manager.js +22 -2
- package/dist/server/services/cache-manager.js.map +1 -1
- package/dist/server/services/cloudformation-parser.d.ts +35 -2
- package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
- package/dist/server/services/cloudformation-parser.js +88 -3
- package/dist/server/services/cloudformation-parser.js.map +1 -1
- package/dist/server/services/config-manager.d.ts +82 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +151 -7
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/gateway-manager.d.ts +2 -0
- package/dist/server/services/gateway-manager.d.ts.map +1 -1
- package/dist/server/services/gateway-manager.js +44 -6
- package/dist/server/services/gateway-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/opensearch-explorer.d.ts +37 -0
- package/dist/server/services/opensearch-explorer.d.ts.map +1 -0
- package/dist/server/services/opensearch-explorer.js +124 -0
- package/dist/server/services/opensearch-explorer.js.map +1 -0
- package/dist/server/services/resource-provisioner.d.ts +13 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +257 -11
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/service-registrar.d.ts +1 -0
- package/dist/server/services/service-registrar.d.ts.map +1 -1
- package/dist/server/services/service-registrar.js +19 -4
- package/dist/server/services/service-registrar.js.map +1 -1
- package/dist/ui/assets/ApisPage-C0xaNFQW.js +1 -0
- package/dist/ui/assets/BucketDetailPage-Bnny8S04.js +1 -0
- package/dist/ui/assets/BucketsPage-Dd3Y4-gU.js +1 -0
- package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-JzSF-4VI.js} +1 -1
- package/dist/ui/assets/DynamoTablePage-uM0DXGCo.js +3 -0
- package/dist/ui/assets/LambdaDetailPage-CoR9ZXdb.js +4 -0
- package/dist/ui/assets/LambdasPage-CNMX_O5P.js +1 -0
- package/dist/ui/assets/OpenSearchCollectionPage-D5FaSCF1.js +1 -0
- package/dist/ui/assets/OpenSearchPage-FEzLxaej.js +1 -0
- package/dist/ui/assets/OverviewPage-0xvjT7Q0.js +1 -0
- package/dist/ui/assets/OverviewPage-qEl0a-0B.css +1 -0
- package/dist/ui/assets/QueueDetailPage-B2GaNLLe.js +1 -0
- package/dist/ui/assets/QueuesPage-Ch5kGwrp.js +1 -0
- package/dist/ui/assets/ServiceDetailPage-DKiz21oo.js +2 -0
- package/dist/ui/assets/ServicesPage-Cmi3UIfM.js +2 -0
- package/dist/ui/assets/index-DH7RTkRh.css +1 -0
- package/dist/ui/assets/index-MF9fVrsr.js +37 -0
- package/dist/ui/index.html +2 -2
- package/package.json +3 -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-6jDXV1jr.css +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,74 @@
|
|
|
1
|
+
// Selects and owns the active EngineBackend (LocalStack container vs the
|
|
2
|
+
// in-process self engine) based on `engine` in the config. Every consumer of
|
|
3
|
+
// the old LocalStackManager API goes through here (via the facade kept at
|
|
4
|
+
// services/localstack-manager.ts), so the provisioner/explorers/seeds are
|
|
5
|
+
// engine-agnostic: they always talk AWS wire against getConfig().endpoint.
|
|
6
|
+
import { ConfigManager } from '../services/config-manager.js';
|
|
7
|
+
import { LocalStackBackend } from './backends/localstack-backend.js';
|
|
8
|
+
export class EngineManager {
|
|
9
|
+
static instance;
|
|
10
|
+
backend = null;
|
|
11
|
+
configManager = ConfigManager.getInstance();
|
|
12
|
+
static getInstance() {
|
|
13
|
+
if (!EngineManager.instance) {
|
|
14
|
+
EngineManager.instance = new EngineManager();
|
|
15
|
+
}
|
|
16
|
+
return EngineManager.instance;
|
|
17
|
+
}
|
|
18
|
+
getKind() {
|
|
19
|
+
return this.configManager.getEngineKind();
|
|
20
|
+
}
|
|
21
|
+
async start() {
|
|
22
|
+
const backend = await this.resolveBackend();
|
|
23
|
+
await backend.start();
|
|
24
|
+
}
|
|
25
|
+
async stop() {
|
|
26
|
+
if (this.backend) {
|
|
27
|
+
await this.backend.stop();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
isRunning() {
|
|
31
|
+
return this.backend?.isRunning() ?? false;
|
|
32
|
+
}
|
|
33
|
+
getEndpoint() {
|
|
34
|
+
// Computable without the backend instance so callers can read it before
|
|
35
|
+
// start() (the self backend is loaded lazily inside start()).
|
|
36
|
+
return this.backend?.getEndpoint() ?? this.configManager.getEngineEndpoint();
|
|
37
|
+
}
|
|
38
|
+
getConfig() {
|
|
39
|
+
if (this.backend) {
|
|
40
|
+
return this.backend.getConfig();
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
endpoint: this.getEndpoint(),
|
|
44
|
+
region: this.configManager.getRegion(),
|
|
45
|
+
credentials: {
|
|
46
|
+
accessKeyId: process.env.LOCALSTACK_ACCESS_KEY_ID || 'test',
|
|
47
|
+
secretAccessKey: process.env.LOCALSTACK_SECRET_ACCESS_KEY || 'test',
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
healthDetail() {
|
|
52
|
+
return {
|
|
53
|
+
kind: this.getKind(),
|
|
54
|
+
running: this.isRunning(),
|
|
55
|
+
endpoint: this.getEndpoint(),
|
|
56
|
+
...(this.backend?.healthDetail() ?? {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// The self backend is loaded with a dynamic import so LocalStack-mode
|
|
60
|
+
// processes never pay for the engine's code (RSS provably unchanged).
|
|
61
|
+
async resolveBackend() {
|
|
62
|
+
if (!this.backend) {
|
|
63
|
+
if (this.configManager.isSelfEngine()) {
|
|
64
|
+
const { SelfEngineBackend } = await import('./backends/self-backend.js');
|
|
65
|
+
this.backend = new SelfEngineBackend();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.backend = new LocalStackBackend();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return this.backend;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=engine-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-manager.js","sourceRoot":"","sources":["../../../src/server/engine/engine-manager.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,0EAA0E;AAC1E,0EAA0E;AAC1E,2EAA2E;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,CAAgB;IAC/B,OAAO,GAAyB,IAAI,CAAC;IAC5B,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAE7D,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,KAAK,CAAC;IAC5C,CAAC;IAED,WAAW;QACT,wEAAwE;QACxE,8DAA8D;QAC9D,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;IAC/E,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAClC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;YACtC,WAAW,EAAE;gBACX,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,MAAM;gBAC3D,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,MAAM;aACpE;SACF,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YACpB,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;YACzB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE;YAC5B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IAC9D,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC;gBACtC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;gBACzE,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-chunked.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/http/aws-chunked.ts"],"names":[],"mappings":"AAcA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAKzE;AAMD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBzD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Decoder for the aws-chunked content encoding. @aws-sdk v3 >= 3.729 enables
|
|
2
|
+
// flexible checksums by default, so every S3 PutObject arrives as:
|
|
3
|
+
//
|
|
4
|
+
// <hex-size>[;chunk-signature=<sig>]\r\n<chunk bytes>\r\n ...
|
|
5
|
+
// 0[;chunk-signature=<sig>]\r\n[<trailer>:<value>\r\n ...]\r\n
|
|
6
|
+
//
|
|
7
|
+
// Without this decoder every upload from a current SDK would be persisted
|
|
8
|
+
// with the framing bytes baked in. Trailer checksums (x-amz-checksum-crc32
|
|
9
|
+
// etc.) are discarded, not verified — dev-tool fidelity bar.
|
|
10
|
+
import { AwsError } from './errors.js';
|
|
11
|
+
// Both the signed variant (content-encoding: aws-chunked) and the unsigned
|
|
12
|
+
// streaming variant advertise themselves via x-amz-content-sha256.
|
|
13
|
+
export function isAwsChunkedBody(headers) {
|
|
14
|
+
const encoding = headers['content-encoding'];
|
|
15
|
+
if (encoding && encoding.split(',').some(token => token.trim() === 'aws-chunked'))
|
|
16
|
+
return true;
|
|
17
|
+
const contentSha = headers['x-amz-content-sha256'];
|
|
18
|
+
return contentSha !== undefined && contentSha.startsWith('STREAMING-');
|
|
19
|
+
}
|
|
20
|
+
function malformed(reason) {
|
|
21
|
+
return new AwsError('IncompleteBody', `Malformed aws-chunked request body: ${reason}`, { status: 400 });
|
|
22
|
+
}
|
|
23
|
+
export function decodeAwsChunkedBody(body) {
|
|
24
|
+
const chunks = [];
|
|
25
|
+
let pos = 0;
|
|
26
|
+
for (;;) {
|
|
27
|
+
const lineEnd = body.indexOf('\r\n', pos);
|
|
28
|
+
if (lineEnd === -1)
|
|
29
|
+
throw malformed('missing chunk-size line terminator');
|
|
30
|
+
const sizeLine = body.subarray(pos, lineEnd).toString('latin1');
|
|
31
|
+
const sizeHex = sizeLine.split(';')[0].trim();
|
|
32
|
+
if (!/^[0-9a-fA-F]+$/.test(sizeHex))
|
|
33
|
+
throw malformed(`invalid chunk size "${sizeHex}"`);
|
|
34
|
+
const size = parseInt(sizeHex, 16);
|
|
35
|
+
pos = lineEnd + 2;
|
|
36
|
+
// Final chunk: whatever follows is trailer headers (checksums) — dropped.
|
|
37
|
+
if (size === 0)
|
|
38
|
+
break;
|
|
39
|
+
if (pos + size > body.length)
|
|
40
|
+
throw malformed('chunk data truncated');
|
|
41
|
+
chunks.push(body.subarray(pos, pos + size));
|
|
42
|
+
pos += size;
|
|
43
|
+
if (body.subarray(pos, pos + 2).toString('latin1') !== '\r\n') {
|
|
44
|
+
throw malformed('missing chunk data terminator');
|
|
45
|
+
}
|
|
46
|
+
pos += 2;
|
|
47
|
+
}
|
|
48
|
+
return Buffer.concat(chunks);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=aws-chunked.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-chunked.js","sourceRoot":"","sources":["../../../../src/server/engine/http/aws-chunked.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,mEAAmE;AACnE,EAAE;AACF,gEAAgE;AAChE,iEAAiE;AACjE,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,6DAA6D;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAAC,OAA+B;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7C,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,MAAM,UAAU,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnD,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,uCAAuC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,SAAS,CAAC;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,MAAM,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,SAAS,CAAC,uBAAuB,OAAO,GAAG,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC;QAClB,0EAA0E;QAC1E,IAAI,IAAI,KAAK,CAAC;YAAE,MAAM;QACtB,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM;YAAE,MAAM,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5C,GAAG,IAAI,IAAI,CAAC;QACZ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type AwsErrorFault = 'Sender' | 'Receiver';
|
|
2
|
+
export declare class AwsError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly status: number;
|
|
5
|
+
readonly fault: AwsErrorFault;
|
|
6
|
+
readonly typeName?: string;
|
|
7
|
+
readonly extra?: Record<string, unknown>;
|
|
8
|
+
constructor(code: string, message: string, options?: {
|
|
9
|
+
status?: number;
|
|
10
|
+
fault?: AwsErrorFault;
|
|
11
|
+
typeName?: string;
|
|
12
|
+
extra?: Record<string, unknown>;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export declare function dynamoError(code: string, message: string, status?: number): AwsError;
|
|
16
|
+
export declare function validationError(message: string): AwsError;
|
|
17
|
+
export declare function sqsError(code: string, message: string, status?: number): AwsError;
|
|
18
|
+
export declare function s3Error(code: string, message: string, status: number): AwsError;
|
|
19
|
+
export declare function notImplemented(service: string, operation: string): AwsError;
|
|
20
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/http/errors.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAElD,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAG9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAG3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE;CAU3G;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,QAAQ,CAEjF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAEzD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAM,GAAG,QAAQ,CAE9E;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAE/E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAO3E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// AWS-shaped error for every emulator. Thrown inside handlers and serialized
|
|
2
|
+
// by the router according to the protocol of the service that failed (JSON
|
|
3
|
+
// __type / Query XML ErrorResponse / S3 XML Error / Lambda REST). The `code`
|
|
4
|
+
// must be the exact AWS error name — the provisioner's idempotency and the
|
|
5
|
+
// SDK's error mapping depend on it (see docs/PRD_SELF_ENGINE.md §RF2.4).
|
|
6
|
+
export class AwsError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
status;
|
|
9
|
+
fault;
|
|
10
|
+
// Full namespaced __type for JSON protocols when it differs from `code`
|
|
11
|
+
// (e.g. "com.amazonaws.dynamodb.v20120810#ResourceNotFoundException").
|
|
12
|
+
typeName;
|
|
13
|
+
// Extra top-level fields serialized into the JSON error payload (e.g.
|
|
14
|
+
// DynamoDB's CancellationReasons).
|
|
15
|
+
extra;
|
|
16
|
+
constructor(code, message, options) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = 'AwsError';
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.status = options?.status ?? 400;
|
|
21
|
+
this.fault = options?.fault ?? 'Sender';
|
|
22
|
+
this.typeName = options?.typeName;
|
|
23
|
+
this.extra = options?.extra;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const DYNAMO_NS = 'com.amazonaws.dynamodb.v20120810';
|
|
27
|
+
export function dynamoError(code, message, status = 400) {
|
|
28
|
+
return new AwsError(code, message, { status, typeName: `${DYNAMO_NS}#${code}` });
|
|
29
|
+
}
|
|
30
|
+
export function validationError(message) {
|
|
31
|
+
return dynamoError('ValidationException', message);
|
|
32
|
+
}
|
|
33
|
+
export function sqsError(code, message, status = 400) {
|
|
34
|
+
return new AwsError(code, message, { status });
|
|
35
|
+
}
|
|
36
|
+
export function s3Error(code, message, status) {
|
|
37
|
+
return new AwsError(code, message, { status });
|
|
38
|
+
}
|
|
39
|
+
export function notImplemented(service, operation) {
|
|
40
|
+
return new AwsError('NotImplemented', `${service}.${operation} is not implemented by the LSS self engine — ` +
|
|
41
|
+
'see docs/SELF_ENGINE.md#coverage, or set selfEngine.fallbackEndpoint to forward it to a LocalStack instance', { status: 400 });
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/server/engine/http/errors.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,yEAAyE;AAIzE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAS;IACb,MAAM,CAAS;IACf,KAAK,CAAgB;IAC9B,wEAAwE;IACxE,uEAAuE;IAC9D,QAAQ,CAAU;IAC3B,sEAAsE;IACtE,mCAAmC;IAC1B,KAAK,CAA2B;IAEzC,YACE,IAAY,EACZ,OAAe,EACf,OAAwG;QAExG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,SAAS,GAAG,kCAAkC,CAAC;AAErD,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,MAAM,GAAG,GAAG;IACrE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,WAAW,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe,EAAE,MAAM,GAAG,GAAG;IAClE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc;IACnE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB;IAC/D,OAAO,IAAI,QAAQ,CACjB,gBAAgB,EAChB,GAAG,OAAO,IAAI,SAAS,+CAA+C;QACpE,6GAA6G,EAC/G,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AwsResponse, EngineServiceName } from '../../types.js';
|
|
2
|
+
import type { AwsError } from '../errors.js';
|
|
3
|
+
export type JsonVersion = '1.0' | '1.1';
|
|
4
|
+
export declare function jsonContentType(version: JsonVersion): string;
|
|
5
|
+
export declare function jsonSuccessResponse(payload: object, version: JsonVersion): AwsResponse;
|
|
6
|
+
export declare function jsonErrorResponse(err: AwsError, service: EngineServiceName | undefined, version: JsonVersion): AwsResponse;
|
|
7
|
+
export declare function lambdaErrorResponse(err: AwsError): AwsResponse;
|
|
8
|
+
//# sourceMappingURL=aws-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-json.d.ts","sourceRoot":"","sources":["../../../../../src/server/engine/http/protocols/aws-json.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,CAAC;AAExC,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,WAAW,CAMtF;AAOD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,OAAO,EAAE,WAAW,GACnB,WAAW,CAQb;AAID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CAS9D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// AWS JSON 1.0/1.1 protocol serialization (DynamoDB, SQS, EventBridge) plus
|
|
2
|
+
// the Lambda rest-json error shape. Success payloads come straight from the
|
|
3
|
+
// TargetEmulator; this module owns the wire framing and the error contracts
|
|
4
|
+
// the LSS provisioner branches on (docs/PRD_SELF_ENGINE.md §RF2.3/RF2.4).
|
|
5
|
+
export function jsonContentType(version) {
|
|
6
|
+
return `application/x-amz-json-${version}`;
|
|
7
|
+
}
|
|
8
|
+
export function jsonSuccessResponse(payload, version) {
|
|
9
|
+
return {
|
|
10
|
+
status: 200,
|
|
11
|
+
headers: { 'content-type': jsonContentType(version) },
|
|
12
|
+
body: JSON.stringify(payload),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
// JSON error: {"__type": "<namespaced type or code>", "message": "..."} plus
|
|
16
|
+
// any extra top-level fields (e.g. DynamoDB CancellationReasons). For SQS the
|
|
17
|
+
// x-amzn-query-error header carries the legacy Query error code — the SDK's
|
|
18
|
+
// awsQueryCompatible trait rewrites err.name from it, and the provisioner's
|
|
19
|
+
// idempotency matches those legacy names.
|
|
20
|
+
export function jsonErrorResponse(err, service, version) {
|
|
21
|
+
const headers = { 'content-type': jsonContentType(version) };
|
|
22
|
+
if (service === 'sqs')
|
|
23
|
+
headers['x-amzn-query-error'] = `${err.code};${err.fault}`;
|
|
24
|
+
return {
|
|
25
|
+
status: err.status,
|
|
26
|
+
headers,
|
|
27
|
+
body: JSON.stringify({ ...err.extra, __type: err.typeName ?? err.code, message: err.message }),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Lambda rest-json error: {"Type": "User"|"Service", "message": "..."} with
|
|
31
|
+
// the error code in x-amzn-ErrorType.
|
|
32
|
+
export function lambdaErrorResponse(err) {
|
|
33
|
+
return {
|
|
34
|
+
status: err.status,
|
|
35
|
+
headers: {
|
|
36
|
+
'content-type': 'application/json',
|
|
37
|
+
'x-amzn-ErrorType': err.code,
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({ Type: err.fault === 'Receiver' ? 'Service' : 'User', message: err.message }),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=aws-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-json.js","sourceRoot":"","sources":["../../../../../src/server/engine/http/protocols/aws-json.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAO1E,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,OAAO,0BAA0B,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,OAAoB;IACvE,OAAO;QACL,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE;QACrD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,4EAA4E;AAC5E,0CAA0C;AAC1C,MAAM,UAAU,iBAAiB,CAC/B,GAAa,EACb,OAAsC,EACtC,OAAoB;IAEpB,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IACrF,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;IAClF,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;KAC/F,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,sCAAsC;AACtC,MAAM,UAAU,mBAAmB,CAAC,GAAa;IAC/C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,kBAAkB,EAAE,GAAG,CAAC,IAAI;SAC7B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;KACpG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AwsResponse } from '../../types.js';
|
|
2
|
+
import type { AwsError } from '../errors.js';
|
|
3
|
+
export declare function parseFormBody(body: Buffer): Record<string, string>;
|
|
4
|
+
export declare function queryXmlSuccessResponse(xml: string): AwsResponse;
|
|
5
|
+
export declare function queryErrorResponse(err: AwsError, requestId: string): AwsResponse;
|
|
6
|
+
export declare function s3ErrorResponse(err: AwsError, requestId: string, method: string): AwsResponse;
|
|
7
|
+
//# sourceMappingURL=query-xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-xml.d.ts","sourceRoot":"","sources":["../../../../../src/server/engine/http/protocols/query-xml.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAMhE;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAUhF;AAID,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAQ7F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Query-protocol (SNS/STS) and S3 rest-xml wire shapes: form-body parsing,
|
|
2
|
+
// success framing and the two XML error documents. QueryEmulators return the
|
|
3
|
+
// complete <XxxResponse> document themselves — this module only frames it.
|
|
4
|
+
import { tag, xmlDocument } from '../xml.js';
|
|
5
|
+
export function parseFormBody(body) {
|
|
6
|
+
const params = {};
|
|
7
|
+
for (const [key, value] of new URLSearchParams(body.toString('utf8'))) {
|
|
8
|
+
params[key] = value;
|
|
9
|
+
}
|
|
10
|
+
return params;
|
|
11
|
+
}
|
|
12
|
+
export function queryXmlSuccessResponse(xml) {
|
|
13
|
+
return {
|
|
14
|
+
status: 200,
|
|
15
|
+
headers: { 'content-type': 'text/xml' },
|
|
16
|
+
body: xml.startsWith('<?xml') ? xml : xmlDocument(xml),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// <ErrorResponse><Error><Type/><Code/><Message/></Error><RequestId/></ErrorResponse>
|
|
20
|
+
export function queryErrorResponse(err, requestId) {
|
|
21
|
+
const xml = xmlDocument(tag('ErrorResponse', tag('Error', tag('Type', err.fault) + tag('Code', err.code) + tag('Message', err.message), { escape: false }) +
|
|
22
|
+
tag('RequestId', requestId), { escape: false }));
|
|
23
|
+
return { status: err.status, headers: { 'content-type': 'text/xml' }, body: xml };
|
|
24
|
+
}
|
|
25
|
+
// S3: <Error><Code/><Message/><RequestId/></Error> — except HEAD, which must
|
|
26
|
+
// carry the status alone with an empty body (the SDK maps it from the status).
|
|
27
|
+
export function s3ErrorResponse(err, requestId, method) {
|
|
28
|
+
if (method === 'HEAD')
|
|
29
|
+
return { status: err.status };
|
|
30
|
+
const xml = xmlDocument(tag('Error', tag('Code', err.code) + tag('Message', err.message) + tag('RequestId', requestId), {
|
|
31
|
+
escape: false,
|
|
32
|
+
}));
|
|
33
|
+
return { status: err.status, headers: { 'content-type': 'application/xml' }, body: xml };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=query-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-xml.js","sourceRoot":"","sources":["../../../../../src/server/engine/http/protocols/query-xml.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAI3E,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,OAAO;QACL,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;QACvC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,GAAa,EAAE,SAAiB;IACjE,MAAM,GAAG,GAAG,WAAW,CACrB,GAAG,CACD,eAAe,EACf,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3G,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,EAC7B,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CACF,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACpF,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,GAAa,EAAE,SAAiB,EAAE,MAAc;IAC9E,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACrD,MAAM,GAAG,GAAG,WAAW,CACrB,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE;QAC9F,MAAM,EAAE,KAAK;KACd,CAAC,CACH,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
import type { AnyEmulator, EngineContext } from '../types.js';
|
|
3
|
+
export interface EngineRouterDeps {
|
|
4
|
+
ctx: EngineContext;
|
|
5
|
+
emulators: AnyEmulator[];
|
|
6
|
+
}
|
|
7
|
+
export declare function createEngineRequestHandler(deps: EngineRouterDeps): (req: http.IncomingMessage, res: http.ServerResponse) => void;
|
|
8
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/http/router.ts"],"names":[],"mappings":"AAMA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,KAAK,EACV,WAAW,EAGX,aAAa,EAId,MAAM,aAAa,CAAC;AAiBrB,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,aAAa,CAAC;IACnB,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAqCD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,gBAAgB,GACrB,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,CAgB/D"}
|