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,199 @@
|
|
|
1
|
+
// LocalStack lifecycle backend (docker container, managed/external). This is
|
|
2
|
+
// the code that used to live in services/localstack-manager.ts — that module
|
|
3
|
+
// is now a thin facade over EngineManager so existing call sites keep working
|
|
4
|
+
// regardless of the active engine.
|
|
5
|
+
import { spawn, exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { ConfigManager } from '../../services/config-manager.js';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
export class LocalStackBackend {
|
|
10
|
+
kind = 'localstack';
|
|
11
|
+
process = null;
|
|
12
|
+
_isRunning = false;
|
|
13
|
+
endpoint;
|
|
14
|
+
// Container name is scoped to the LocalStack port so multiple LSS instances
|
|
15
|
+
// (one per example/project) can launch their own container side by side.
|
|
16
|
+
// Falls back to "lss-localstack" when the default 4566 is in use to preserve
|
|
17
|
+
// existing teardown scripts that look for that name.
|
|
18
|
+
containerName;
|
|
19
|
+
configManager;
|
|
20
|
+
constructor() {
|
|
21
|
+
this.configManager = ConfigManager.getInstance();
|
|
22
|
+
this.endpoint = this.configManager.getLocalStackEndpoint();
|
|
23
|
+
const port = this.configManager.getLocalStackPort();
|
|
24
|
+
this.containerName = port === 4566 ? 'lss-localstack' : `lss-localstack-${port}`;
|
|
25
|
+
}
|
|
26
|
+
async start() {
|
|
27
|
+
if (this._isRunning) {
|
|
28
|
+
console.log('⚠️ LocalStack already running');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (this.configManager.isExternal()) {
|
|
32
|
+
console.log(`🔗 Using external LocalStack at ${this.endpoint}`);
|
|
33
|
+
await this.waitForReady(30);
|
|
34
|
+
this._isRunning = true;
|
|
35
|
+
console.log('✅ Connected to external LocalStack');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
// Check if docker is available
|
|
40
|
+
await execAsync('docker ps -q', { timeout: 5000 });
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error('Docker is not available or not running. Please start Docker first.');
|
|
44
|
+
}
|
|
45
|
+
const edition = this.configManager.getLocalStackEdition();
|
|
46
|
+
const image = this.configManager.getLocalStackImage();
|
|
47
|
+
const authToken = this.configManager.getLocalStackAuthToken();
|
|
48
|
+
if (edition === 'pro' && !authToken) {
|
|
49
|
+
throw new Error('LocalStack Pro requires LOCALSTACK_AUTH_TOKEN. Set the env var or "localstackAuthToken" in your config.');
|
|
50
|
+
}
|
|
51
|
+
if (edition === 'community' && !authToken) {
|
|
52
|
+
console.warn('⚠️ LOCALSTACK_AUTH_TOKEN not set. Recent localstack/localstack images (>= 2026.5) require a token even for the community edition.');
|
|
53
|
+
}
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
console.log(`🔄 Starting LocalStack (${image})...`);
|
|
56
|
+
const port = this.configManager.getLocalStackPort();
|
|
57
|
+
const services = this.configManager.getServices().join(',');
|
|
58
|
+
const persistence = this.configManager.isPersistence() ? '1' : '0';
|
|
59
|
+
const debug = this.configManager.isDebug() ? '1' : '0';
|
|
60
|
+
// Persistence volume is scoped to the container so two LSS instances
|
|
61
|
+
// don't share (and corrupt) the same on-disk state.
|
|
62
|
+
const volumeName = this.containerName === 'lss-localstack'
|
|
63
|
+
? 'lss-localstack-data'
|
|
64
|
+
: `${this.containerName}-data`;
|
|
65
|
+
const dockerArgs = [
|
|
66
|
+
'run',
|
|
67
|
+
'--rm',
|
|
68
|
+
'-p',
|
|
69
|
+
`${port}:4566`,
|
|
70
|
+
'-v',
|
|
71
|
+
`${volumeName}:/var/lib/localstack`,
|
|
72
|
+
'-v',
|
|
73
|
+
'/var/run/docker.sock:/var/run/docker.sock',
|
|
74
|
+
// host.docker.internal resolves natively on Docker Desktop but not on
|
|
75
|
+
// Linux; the generated Lambda proxies target it to reach the invoke
|
|
76
|
+
// listeners on the host, so map it explicitly (no-op elsewhere).
|
|
77
|
+
'--add-host',
|
|
78
|
+
'host.docker.internal:host-gateway',
|
|
79
|
+
'--name',
|
|
80
|
+
this.containerName,
|
|
81
|
+
'-e',
|
|
82
|
+
`SERVICES=${services}`,
|
|
83
|
+
'-e',
|
|
84
|
+
'LAMBDA_EXECUTOR=local',
|
|
85
|
+
// Lambda containers spawned BY LocalStack (which run the proxies) need
|
|
86
|
+
// the same host mapping.
|
|
87
|
+
'-e',
|
|
88
|
+
'LAMBDA_DOCKER_FLAGS=--add-host host.docker.internal:host-gateway',
|
|
89
|
+
'-e',
|
|
90
|
+
`PERSISTENCE=${persistence}`,
|
|
91
|
+
'-e',
|
|
92
|
+
`DEBUG=${debug}`,
|
|
93
|
+
];
|
|
94
|
+
if (authToken) {
|
|
95
|
+
dockerArgs.push('-e', `LOCALSTACK_AUTH_TOKEN=${authToken}`);
|
|
96
|
+
}
|
|
97
|
+
dockerArgs.push(image);
|
|
98
|
+
this.process = spawn('docker', dockerArgs);
|
|
99
|
+
let stderr = '';
|
|
100
|
+
let stdout = '';
|
|
101
|
+
this.process.stderr?.on('data', data => {
|
|
102
|
+
stderr += data.toString();
|
|
103
|
+
console.log(`[LocalStack stderr] ${data.toString().trim()}`);
|
|
104
|
+
});
|
|
105
|
+
this.process.stdout?.on('data', data => {
|
|
106
|
+
stdout += data.toString();
|
|
107
|
+
console.log(`[LocalStack stdout] ${data.toString().trim()}`);
|
|
108
|
+
});
|
|
109
|
+
this.process.on('error', error => {
|
|
110
|
+
console.error('❌ Failed to start LocalStack process:', error);
|
|
111
|
+
reject(error);
|
|
112
|
+
});
|
|
113
|
+
this.process.on('close', code => {
|
|
114
|
+
if (code !== 0) {
|
|
115
|
+
console.error(`Container exited with code ${code}`);
|
|
116
|
+
console.error('stderr:', stderr);
|
|
117
|
+
console.error('stdout:', stdout);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// Wait for LocalStack to be ready
|
|
121
|
+
this.waitForReady()
|
|
122
|
+
.then(() => {
|
|
123
|
+
this._isRunning = true;
|
|
124
|
+
console.log('✅ LocalStack ready');
|
|
125
|
+
resolve();
|
|
126
|
+
})
|
|
127
|
+
.catch(err => {
|
|
128
|
+
console.error('LocalStack startup error:', err.message);
|
|
129
|
+
this.process?.kill();
|
|
130
|
+
reject(err);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async stop() {
|
|
135
|
+
if (!this._isRunning) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (this.configManager.isExternal()) {
|
|
139
|
+
console.log('🔗 External LocalStack — leaving container untouched');
|
|
140
|
+
this._isRunning = false;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
console.log('🛑 Stopping LocalStack...');
|
|
144
|
+
try {
|
|
145
|
+
await execAsync(`docker stop ${this.containerName}`, { timeout: 10000 });
|
|
146
|
+
this._isRunning = false;
|
|
147
|
+
this.process = null;
|
|
148
|
+
console.log('✅ LocalStack stopped');
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error('⚠️ Error stopping LocalStack:', error instanceof Error ? error.message : 'Unknown error');
|
|
152
|
+
this._isRunning = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async waitForReady(maxAttempts = 120) {
|
|
156
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
157
|
+
try {
|
|
158
|
+
const response = await fetch(`${this.endpoint}/_localstack/health`);
|
|
159
|
+
if (response.ok) {
|
|
160
|
+
console.log(`✓ LocalStack is responsive (attempt ${i + 1}/${maxAttempts})`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Ignore fetch errors during startup
|
|
166
|
+
if (i % 20 === 0) {
|
|
167
|
+
console.log(`⏳ Waiting for LocalStack... (attempt ${i + 1}/${maxAttempts})`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
171
|
+
}
|
|
172
|
+
throw new Error('LocalStack failed to start in time (120s timeout). Check Docker and container logs.');
|
|
173
|
+
}
|
|
174
|
+
isRunning() {
|
|
175
|
+
return this._isRunning;
|
|
176
|
+
}
|
|
177
|
+
getEndpoint() {
|
|
178
|
+
return this.endpoint;
|
|
179
|
+
}
|
|
180
|
+
getConfig() {
|
|
181
|
+
return {
|
|
182
|
+
endpoint: this.endpoint,
|
|
183
|
+
region: this.configManager.getRegion(),
|
|
184
|
+
credentials: {
|
|
185
|
+
accessKeyId: process.env.LOCALSTACK_ACCESS_KEY_ID || 'test',
|
|
186
|
+
secretAccessKey: process.env.LOCALSTACK_SECRET_ACCESS_KEY || 'test',
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
healthDetail() {
|
|
191
|
+
return {
|
|
192
|
+
endpoint: this.endpoint,
|
|
193
|
+
running: this._isRunning,
|
|
194
|
+
mode: this.configManager.getMode(),
|
|
195
|
+
image: this.configManager.isExternal() ? undefined : this.configManager.getLocalStackImage(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=localstack-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localstack-backend.js","sourceRoot":"","sources":["../../../../src/server/engine/backends/localstack-backend.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,mCAAmC;AAEnC,OAAO,EAAE,KAAK,EAAgB,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAGjE,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,YAAqB,CAAC;IAC9B,OAAO,GAAwB,IAAI,CAAC;IACpC,UAAU,GAAG,KAAK,CAAC;IACnB,QAAQ,CAAS;IACzB,4EAA4E;IAC5E,yEAAyE;IACzE,6EAA6E;IAC7E,qDAAqD;IACpC,aAAa,CAAS;IACtB,aAAa,CAAgB;IAE9C;QACE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,SAAS,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE,CAAC;QAE9D,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,KAAK,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CACV,oIAAoI,CACrI,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,MAAM,CAAC,CAAC;YAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAEvD,qEAAqE;YACrE,oDAAoD;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,KAAK,gBAAgB;gBACxD,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,OAAO,CAAC;YAEjC,MAAM,UAAU,GAAG;gBACjB,KAAK;gBACL,MAAM;gBACN,IAAI;gBACJ,GAAG,IAAI,OAAO;gBACd,IAAI;gBACJ,GAAG,UAAU,sBAAsB;gBACnC,IAAI;gBACJ,2CAA2C;gBAC3C,sEAAsE;gBACtE,oEAAoE;gBACpE,iEAAiE;gBACjE,YAAY;gBACZ,mCAAmC;gBACnC,QAAQ;gBACR,IAAI,CAAC,aAAa;gBAClB,IAAI;gBACJ,YAAY,QAAQ,EAAE;gBACtB,IAAI;gBACJ,uBAAuB;gBACvB,uEAAuE;gBACvE,yBAAyB;gBACzB,IAAI;gBACJ,kEAAkE;gBAClE,IAAI;gBACJ,eAAe,WAAW,EAAE;gBAC5B,IAAI;gBACJ,SAAS,KAAK,EAAE;aACjB,CAAC;YAEF,IAAI,SAAS,EAAE,CAAC;gBACd,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,SAAS,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE3C,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACrC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACrC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;gBAC/B,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;gBAC9D,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;oBACpD,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBACjC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,IAAI,CAAC,YAAY,EAAE;iBAChB,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,eAAe,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAC1G,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,WAAW,GAAG,GAAG;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,qBAAqB,CAAC,CAAC;gBACpE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;oBAC5E,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS;QACP,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,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,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YAClC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE;SAC7F,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { EngineBackend } from '../engine-backend.js';
|
|
2
|
+
import { type ResolvedSelfEngineConfig } from '../../services/config-manager.js';
|
|
3
|
+
export declare class SelfEngineBackend implements EngineBackend {
|
|
4
|
+
readonly kind: "self";
|
|
5
|
+
private readonly overrides;
|
|
6
|
+
private config;
|
|
7
|
+
private store;
|
|
8
|
+
private sqs;
|
|
9
|
+
private dispatcher;
|
|
10
|
+
private scheduler;
|
|
11
|
+
private server;
|
|
12
|
+
private readonly sockets;
|
|
13
|
+
private boundPort;
|
|
14
|
+
private running;
|
|
15
|
+
constructor(overrides?: Partial<ResolvedSelfEngineConfig>);
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
isRunning(): boolean;
|
|
19
|
+
getEndpoint(): string;
|
|
20
|
+
getConfig(): {
|
|
21
|
+
endpoint: string;
|
|
22
|
+
region: string;
|
|
23
|
+
credentials: {
|
|
24
|
+
accessKeyId: string;
|
|
25
|
+
secretAccessKey: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
healthDetail(): Record<string, unknown>;
|
|
29
|
+
private resolveConfig;
|
|
30
|
+
private restoreSqsSnapshot;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=self-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-backend.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/backends/self-backend.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAiB,KAAK,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAmBhG,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAEhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAS;gBAIZ,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM;IAIvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAIrB,SAAS,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;IAQhH,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYvC,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,kBAAkB;CAU3B"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// In-process self engine backend: opens the JSONL store, constructs the
|
|
2
|
+
// emulators + dispatcher + scheduler over a shared EngineContext, rearms
|
|
3
|
+
// event delivery from persisted metadata (ESMs, schedule rules) and binds the
|
|
4
|
+
// AWS wire front door on config.port. Boot is file reads only — no Docker, no
|
|
5
|
+
// health polling, no sleeps (PRD RF1.2: well under 500 ms).
|
|
6
|
+
import http from 'http';
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { ConfigManager } from '../../services/config-manager.js';
|
|
10
|
+
import { EngineBus } from '../bus.js';
|
|
11
|
+
import { createEngineStore } from '../store/engine-store.js';
|
|
12
|
+
import { createEngineRequestHandler } from '../http/router.js';
|
|
13
|
+
import { DynamoDbEmulator } from '../emulators/dynamodb/index.js';
|
|
14
|
+
import { SqsEmulator } from '../emulators/sqs/index.js';
|
|
15
|
+
import { S3Emulator } from '../emulators/s3/index.js';
|
|
16
|
+
import { EventsEmulator } from '../emulators/events/index.js';
|
|
17
|
+
import { SnsEmulator } from '../emulators/sns/index.js';
|
|
18
|
+
import { StsEmulator } from '../emulators/sts.js';
|
|
19
|
+
import { LambdaCtlEmulator } from '../emulators/lambda-ctl/index.js';
|
|
20
|
+
import { EngineDispatcher } from '../dispatch/dispatcher.js';
|
|
21
|
+
import { EngineScheduler } from '../dispatch/scheduler.js';
|
|
22
|
+
const SERVICES = ['dynamodb', 'sqs', 'sns', 's3', 'events', 'lambda', 'sts'];
|
|
23
|
+
const SQS_SNAPSHOT_FILE = 'sqs-messages.snapshot.json';
|
|
24
|
+
export class SelfEngineBackend {
|
|
25
|
+
kind = 'self';
|
|
26
|
+
overrides;
|
|
27
|
+
config = null;
|
|
28
|
+
store = null;
|
|
29
|
+
sqs = null;
|
|
30
|
+
dispatcher = null;
|
|
31
|
+
scheduler = null;
|
|
32
|
+
server = null;
|
|
33
|
+
// Keep-alive sockets must be destroyed for server.close() not to hang.
|
|
34
|
+
sockets = new Set();
|
|
35
|
+
boundPort = null;
|
|
36
|
+
running = false;
|
|
37
|
+
// `overrides` merge over ConfigManager's resolved self-engine config —
|
|
38
|
+
// tests use it for ephemeral ports (0) and temp data dirs.
|
|
39
|
+
constructor(overrides = {}) {
|
|
40
|
+
this.overrides = overrides;
|
|
41
|
+
}
|
|
42
|
+
async start() {
|
|
43
|
+
if (this.running)
|
|
44
|
+
return;
|
|
45
|
+
const config = this.resolveConfig();
|
|
46
|
+
this.config = config;
|
|
47
|
+
const store = createEngineStore({
|
|
48
|
+
dataDir: config.dataDir,
|
|
49
|
+
idleUnloadMs: config.idleUnloadMs,
|
|
50
|
+
memoryBudgetMb: config.memoryBudgetMb,
|
|
51
|
+
fsync: config.fsync,
|
|
52
|
+
});
|
|
53
|
+
this.store = store;
|
|
54
|
+
const bus = new EngineBus();
|
|
55
|
+
const ctx = {
|
|
56
|
+
config,
|
|
57
|
+
store,
|
|
58
|
+
bus,
|
|
59
|
+
// Late-bound below; emulators only touch it while handling requests.
|
|
60
|
+
dispatcher: notReadyDispatcher(),
|
|
61
|
+
endpoint: () => this.getEndpoint(),
|
|
62
|
+
};
|
|
63
|
+
const dynamo = new DynamoDbEmulator(ctx);
|
|
64
|
+
const sqs = new SqsEmulator(ctx);
|
|
65
|
+
const s3 = new S3Emulator(ctx);
|
|
66
|
+
const events = new EventsEmulator(ctx);
|
|
67
|
+
const sns = new SnsEmulator(ctx);
|
|
68
|
+
const sts = new StsEmulator(ctx);
|
|
69
|
+
const lambdaCtl = new LambdaCtlEmulator(ctx);
|
|
70
|
+
this.sqs = sqs;
|
|
71
|
+
const dispatcher = new EngineDispatcher({ ctx, sqs, dynamo, s3, events, lambdaCtl });
|
|
72
|
+
ctx.dispatcher = dispatcher;
|
|
73
|
+
this.dispatcher = dispatcher;
|
|
74
|
+
const scheduler = new EngineScheduler({
|
|
75
|
+
ctx,
|
|
76
|
+
events,
|
|
77
|
+
invoke: dispatcher.invokeFunction.bind(dispatcher),
|
|
78
|
+
});
|
|
79
|
+
this.scheduler = scheduler;
|
|
80
|
+
// Restore the graceful-shutdown SQS message snapshot before the delivery
|
|
81
|
+
// loops start draining.
|
|
82
|
+
if (config.persistence)
|
|
83
|
+
this.restoreSqsSnapshot(config, sqs);
|
|
84
|
+
// Rearm delivery from persisted metadata: ESM loops + schedule rules
|
|
85
|
+
// survive engine restarts (PRD RF8.2).
|
|
86
|
+
await dispatcher.start(config.region);
|
|
87
|
+
await scheduler.resync(config.region);
|
|
88
|
+
store.startSweeper();
|
|
89
|
+
const handler = createEngineRequestHandler({
|
|
90
|
+
ctx,
|
|
91
|
+
emulators: [dynamo, sqs, s3, events, sns, sts, lambdaCtl],
|
|
92
|
+
});
|
|
93
|
+
const server = http.createServer(handler);
|
|
94
|
+
server.on('connection', socket => {
|
|
95
|
+
this.sockets.add(socket);
|
|
96
|
+
socket.on('close', () => this.sockets.delete(socket));
|
|
97
|
+
});
|
|
98
|
+
this.server = server;
|
|
99
|
+
await new Promise((resolve, reject) => {
|
|
100
|
+
const onError = (err) => {
|
|
101
|
+
server.removeListener('listening', onListening);
|
|
102
|
+
if (err.code === 'EADDRINUSE') {
|
|
103
|
+
reject(new Error(`Self engine could not bind port ${config.port}: address already in use. ` +
|
|
104
|
+
'Another process is listening there — a real LocalStack install intercepts ports ' +
|
|
105
|
+
'4566-4599 on some hosts. Stop the conflicting process or set selfEngine.port to a free port.'));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
reject(err);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const onListening = () => {
|
|
112
|
+
server.removeListener('error', onError);
|
|
113
|
+
resolve();
|
|
114
|
+
};
|
|
115
|
+
server.once('error', onError);
|
|
116
|
+
server.once('listening', onListening);
|
|
117
|
+
server.listen(config.port, '0.0.0.0');
|
|
118
|
+
});
|
|
119
|
+
this.boundPort = server.address().port;
|
|
120
|
+
this.running = true;
|
|
121
|
+
}
|
|
122
|
+
async stop() {
|
|
123
|
+
if (!this.running)
|
|
124
|
+
return;
|
|
125
|
+
this.running = false;
|
|
126
|
+
this.scheduler?.stop();
|
|
127
|
+
this.dispatcher?.stop();
|
|
128
|
+
const config = this.config;
|
|
129
|
+
if (config.persistence && this.sqs && this.store) {
|
|
130
|
+
try {
|
|
131
|
+
const snapshot = JSON.stringify(this.sqs.serializeMessages());
|
|
132
|
+
await fs.promises.writeFile(path.join(this.store.dir(), SQS_SNAPSHOT_FILE), snapshot);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
console.warn('[self-engine] failed to snapshot SQS messages:', err);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (this.store) {
|
|
139
|
+
await this.store.flushAll();
|
|
140
|
+
this.store.stopSweeper();
|
|
141
|
+
}
|
|
142
|
+
const server = this.server;
|
|
143
|
+
if (server) {
|
|
144
|
+
await new Promise(resolve => {
|
|
145
|
+
server.close(() => resolve());
|
|
146
|
+
for (const socket of this.sockets)
|
|
147
|
+
socket.destroy();
|
|
148
|
+
this.sockets.clear();
|
|
149
|
+
});
|
|
150
|
+
this.server = null;
|
|
151
|
+
}
|
|
152
|
+
this.boundPort = null;
|
|
153
|
+
}
|
|
154
|
+
isRunning() {
|
|
155
|
+
return this.running;
|
|
156
|
+
}
|
|
157
|
+
getEndpoint() {
|
|
158
|
+
return `http://localhost:${this.boundPort ?? this.resolveConfig().port}`;
|
|
159
|
+
}
|
|
160
|
+
getConfig() {
|
|
161
|
+
return {
|
|
162
|
+
endpoint: this.getEndpoint(),
|
|
163
|
+
region: this.resolveConfig().region,
|
|
164
|
+
credentials: { accessKeyId: 'test', secretAccessKey: 'test' },
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
healthDetail() {
|
|
168
|
+
const detail = {
|
|
169
|
+
port: this.boundPort ?? this.resolveConfig().port,
|
|
170
|
+
services: [...SERVICES],
|
|
171
|
+
};
|
|
172
|
+
if (this.running && this.dispatcher && this.scheduler) {
|
|
173
|
+
detail.eventSourceLoops = this.dispatcher.loopCounts();
|
|
174
|
+
detail.scheduleRules = this.scheduler.scheduleCount();
|
|
175
|
+
}
|
|
176
|
+
return detail;
|
|
177
|
+
}
|
|
178
|
+
resolveConfig() {
|
|
179
|
+
if (this.config)
|
|
180
|
+
return this.config;
|
|
181
|
+
return { ...ConfigManager.getInstance().getSelfEngineConfig(), ...this.overrides };
|
|
182
|
+
}
|
|
183
|
+
restoreSqsSnapshot(config, sqs) {
|
|
184
|
+
const file = path.join(config.dataDir, SQS_SNAPSHOT_FILE);
|
|
185
|
+
if (!fs.existsSync(file))
|
|
186
|
+
return;
|
|
187
|
+
try {
|
|
188
|
+
const snapshot = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
189
|
+
sqs.restoreMessages(snapshot);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
console.warn(`[self-engine] ignoring unreadable SQS snapshot ${file}:`, err);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function notReadyDispatcher() {
|
|
197
|
+
return {
|
|
198
|
+
invokeFunction: async () => ({
|
|
199
|
+
ok: false,
|
|
200
|
+
errorType: 'EngineNotReady',
|
|
201
|
+
errorMessage: 'The self engine dispatcher is not wired yet',
|
|
202
|
+
}),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=self-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-backend.js","sourceRoot":"","sources":["../../../../src/server/engine/backends/self-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EngineBusEvents } from './types.js';
|
|
2
|
+
export declare class EngineBus {
|
|
3
|
+
private emitter;
|
|
4
|
+
constructor();
|
|
5
|
+
emit<K extends keyof EngineBusEvents>(event: K, payload: EngineBusEvents[K]): void;
|
|
6
|
+
on<K extends keyof EngineBusEvents>(event: K, listener: (payload: EngineBusEvents[K]) => void): void;
|
|
7
|
+
off<K extends keyof EngineBusEvents>(event: K, listener: (payload: EngineBusEvents[K]) => void): void;
|
|
8
|
+
removeAll(): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../../src/server/engine/bus.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAsB;;IAOrC,IAAI,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAIlF,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAIpG,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAIrG,SAAS,IAAI,IAAI;CAGlB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Typed in-process event bus connecting emulators (producers) to the
|
|
2
|
+
// dispatcher (consumer). A thin wrapper over EventEmitter so payloads stay
|
|
3
|
+
// typed per event name and listeners never see `any`.
|
|
4
|
+
import { EventEmitter } from 'events';
|
|
5
|
+
export class EngineBus {
|
|
6
|
+
emitter = new EventEmitter();
|
|
7
|
+
constructor() {
|
|
8
|
+
// Delivery fan-out can register one listener per event source mapping.
|
|
9
|
+
this.emitter.setMaxListeners(1000);
|
|
10
|
+
}
|
|
11
|
+
emit(event, payload) {
|
|
12
|
+
this.emitter.emit(event, payload);
|
|
13
|
+
}
|
|
14
|
+
on(event, listener) {
|
|
15
|
+
this.emitter.on(event, listener);
|
|
16
|
+
}
|
|
17
|
+
off(event, listener) {
|
|
18
|
+
this.emitter.off(event, listener);
|
|
19
|
+
}
|
|
20
|
+
removeAll() {
|
|
21
|
+
this.emitter.removeAllListeners();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../../../src/server/engine/bus.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,2EAA2E;AAC3E,sDAAsD;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,MAAM,OAAO,SAAS;IACZ,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAErC;QACE,uEAAuE;QACvE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAkC,KAAQ,EAAE,OAA2B;QACzE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,EAAE,CAAkC,KAAQ,EAAE,QAA+C;QAC3F,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAsC,CAAC,CAAC;IACjE,CAAC;IAED,GAAG,CAAkC,KAAQ,EAAE,QAA+C;QAC5F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAsC,CAAC,CAAC;IAClE,CAAC;IAED,SAAS;QACP,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { DispatcherApi, EngineContext, EngineInvokeResult } from '../types.js';
|
|
2
|
+
import type { SqsEmulator } from '../emulators/sqs/index.js';
|
|
3
|
+
import type { DynamoDbEmulator } from '../emulators/dynamodb/index.js';
|
|
4
|
+
import type { S3Emulator } from '../emulators/s3/index.js';
|
|
5
|
+
import type { EventsEmulator } from '../emulators/events/index.js';
|
|
6
|
+
import type { LambdaCtlEmulator } from '../emulators/lambda-ctl/index.js';
|
|
7
|
+
export interface EngineDispatcherDeps {
|
|
8
|
+
ctx: EngineContext;
|
|
9
|
+
sqs: SqsEmulator;
|
|
10
|
+
dynamo: DynamoDbEmulator;
|
|
11
|
+
s3: S3Emulator;
|
|
12
|
+
events: EventsEmulator;
|
|
13
|
+
lambdaCtl: LambdaCtlEmulator;
|
|
14
|
+
tuning?: {
|
|
15
|
+
s3RetryDelaysMs?: number[];
|
|
16
|
+
sqsRuntimeRetryBackoffMs?: number[];
|
|
17
|
+
streamRetryBackoffMs?: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare class EngineDispatcher implements DispatcherApi {
|
|
21
|
+
private readonly deps;
|
|
22
|
+
private readonly sqsPollers;
|
|
23
|
+
private readonly streamTailers;
|
|
24
|
+
private readonly warnedUnresolvable;
|
|
25
|
+
private started;
|
|
26
|
+
private stopped;
|
|
27
|
+
private syncChain;
|
|
28
|
+
private readonly s3Listener;
|
|
29
|
+
private readonly ruleListener;
|
|
30
|
+
constructor(deps: EngineDispatcherDeps);
|
|
31
|
+
start(region: string): Promise<void>;
|
|
32
|
+
stop(): void;
|
|
33
|
+
loopCounts(): {
|
|
34
|
+
sqs: number;
|
|
35
|
+
streams: number;
|
|
36
|
+
};
|
|
37
|
+
private syncEventSourceMappings;
|
|
38
|
+
invokeFunction(ref: string, event: unknown, opts?: {
|
|
39
|
+
async?: boolean;
|
|
40
|
+
}): Promise<EngineInvokeResult>;
|
|
41
|
+
private runMaybeAsync;
|
|
42
|
+
private handleS3ObjectEvent;
|
|
43
|
+
private deliverS3Notification;
|
|
44
|
+
private handleRuleMatched;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/dispatch/dispatcher.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,EAGnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAA8B,MAAM,0BAA0B,CAAC;AACvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAO1E,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,aAAa,CAAC;IACnB,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;IAE7B,MAAM,CAAC,EAAE;QACP,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;QACpC,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;CACH;AAMD,qBAAa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IACF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAE3B;gBAEU,IAAI,EAAE,oBAAoB;IAsBhC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1C,IAAI,IAAI,IAAI;IAQZ,UAAU,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;YAIhC,uBAAuB;IAa/B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuC1G,OAAO,CAAC,aAAa;YAsBP,mBAAmB;YAcnB,qBAAqB;IAqBnC,OAAO,CAAC,iBAAiB;CAa1B"}
|