local-serverless-stack 0.0.5 → 0.0.6
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 +12 -0
- package/README.md +20 -0
- package/bin/cli.js +58 -9
- package/dist/server/services/config-manager.d.ts +13 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +51 -2
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/localstack-manager.d.ts.map +1 -1
- package/dist/server/services/localstack-manager.js +29 -5
- package/dist/server/services/localstack-manager.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.0.6] - 2026-05-17
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **LocalStack operation modes**: new `mode` config (`managed` or `external`). In `external`, LSS only health-checks the configured endpoint and never touches Docker. CLI flag `--external`.
|
|
12
|
+
- **LocalStack edition selection**: new `localstackEdition` config (`community` or `pro`). CLI flag `--pro` selects the Pro image.
|
|
13
|
+
- **LocalStack image control**: new `localstackVersion` (image tag, default `latest`) and `localstackImage` (full override). Resolved image is shown in startup logs.
|
|
14
|
+
- **Auth token forwarding**: new `localstackAuthToken` config and `LOCALSTACK_AUTH_TOKEN` env var are forwarded into the container. Required for `pro` and for community images `>= 2026.5`. CLI flag `--localstack-token <value>`.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- `ConfigManager` now layers environment variables on top of the config file (instead of only when no file is found), so secrets can be injected without committing them.
|
|
18
|
+
- Startup summary surfaces mode, edition, image, and whether an auth token is set.
|
|
19
|
+
|
|
8
20
|
## [0.0.5] - 2026-05-17
|
|
9
21
|
|
|
10
22
|
### Changed
|
package/README.md
CHANGED
|
@@ -223,6 +223,26 @@ LocalStack is configured with:
|
|
|
223
223
|
- Lambda executor: `local` (no Docker-in-Docker required)
|
|
224
224
|
- Docker socket: Mounted from host
|
|
225
225
|
|
|
226
|
+
#### Managed vs external mode
|
|
227
|
+
|
|
228
|
+
By default LSS spins up its own LocalStack container. To point at an already-running instance (e.g. one you're sharing across projects) set `mode: "external"` in `lss.config.json` or pass `--external`:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
npx lss start --external # connect to whatever is on localstackEndpoint
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
#### Edition and auth token
|
|
235
|
+
|
|
236
|
+
Recent LocalStack images (`>= 2026.5` for community, all `pro` builds) require `LOCALSTACK_AUTH_TOKEN`. Provide it via env var (preferred) or `--localstack-token`:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
export LOCALSTACK_AUTH_TOKEN=ls-xxxxxxxx
|
|
240
|
+
npx lss start # community image with token
|
|
241
|
+
npx lss start --pro # pro image (token required)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
See [docs/CONFIGURATION.md](docs/CONFIGURATION.md) for the full reference (`mode`, `localstackEdition`, `localstackVersion`, `localstackImage`, `localstackAuthToken`).
|
|
245
|
+
|
|
226
246
|
## Development
|
|
227
247
|
|
|
228
248
|
### Build All Packages
|
package/bin/cli.js
CHANGED
|
@@ -42,9 +42,24 @@ function getConfig(config) {
|
|
|
42
42
|
localstackPort: config.localstackPort || 4566,
|
|
43
43
|
enableDynamoProxy: config.enableDynamoProxy || false,
|
|
44
44
|
dynamoProxyPort: config.dynamoProxyPort || 8000,
|
|
45
|
+
mode: config.mode || 'managed',
|
|
46
|
+
localstackEdition: config.localstackEdition || 'community',
|
|
47
|
+
localstackVersion: config.localstackVersion || 'latest',
|
|
48
|
+
localstackImage: config.localstackImage,
|
|
49
|
+
localstackAuthToken: config.localstackAuthToken,
|
|
45
50
|
};
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
function getArgValue(name) {
|
|
54
|
+
const idx = process.argv.indexOf(name);
|
|
55
|
+
if (idx >= 0 && idx + 1 < process.argv.length) {
|
|
56
|
+
return process.argv[idx + 1];
|
|
57
|
+
}
|
|
58
|
+
const prefix = `${name}=`;
|
|
59
|
+
const inline = process.argv.find(a => a.startsWith(prefix));
|
|
60
|
+
return inline ? inline.slice(prefix.length) : undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
48
63
|
// Resolve orchestrator path - works both in development and when installed via npm
|
|
49
64
|
function getOrchestratorPath() {
|
|
50
65
|
// Try to find the orchestrator relative to this script
|
|
@@ -105,7 +120,14 @@ function startOrchestrator() {
|
|
|
105
120
|
|
|
106
121
|
// Check for flags
|
|
107
122
|
const enableDynamoProxy = process.argv.includes('--enable-dynamo-proxy') || cfg.enableDynamoProxy;
|
|
108
|
-
|
|
123
|
+
const useExternal = process.argv.includes('--external');
|
|
124
|
+
const usePro = process.argv.includes('--pro');
|
|
125
|
+
const cliToken = getArgValue('--localstack-token');
|
|
126
|
+
|
|
127
|
+
const mode = useExternal ? 'external' : cfg.mode;
|
|
128
|
+
const edition = usePro ? 'pro' : cfg.localstackEdition;
|
|
129
|
+
const authToken = cliToken || cfg.localstackAuthToken || process.env.LOCALSTACK_AUTH_TOKEN;
|
|
130
|
+
|
|
109
131
|
// Build environment variables from config
|
|
110
132
|
const env = { ...process.env };
|
|
111
133
|
if (cfg.serverPort) {
|
|
@@ -120,6 +142,21 @@ function startOrchestrator() {
|
|
|
120
142
|
if (cfg.dynamoProxyPort) {
|
|
121
143
|
env.LSS_DYNAMO_PROXY_PORT = cfg.dynamoProxyPort;
|
|
122
144
|
}
|
|
145
|
+
if (mode) {
|
|
146
|
+
env.LSS_LOCALSTACK_MODE = mode;
|
|
147
|
+
}
|
|
148
|
+
if (edition) {
|
|
149
|
+
env.LSS_LOCALSTACK_EDITION = edition;
|
|
150
|
+
}
|
|
151
|
+
if (cfg.localstackVersion) {
|
|
152
|
+
env.LSS_LOCALSTACK_VERSION = cfg.localstackVersion;
|
|
153
|
+
}
|
|
154
|
+
if (cfg.localstackImage) {
|
|
155
|
+
env.LSS_LOCALSTACK_IMAGE = cfg.localstackImage;
|
|
156
|
+
}
|
|
157
|
+
if (authToken) {
|
|
158
|
+
env.LOCALSTACK_AUTH_TOKEN = authToken;
|
|
159
|
+
}
|
|
123
160
|
|
|
124
161
|
const child = spawn('node', [orchestratorPath], {
|
|
125
162
|
detached: true,
|
|
@@ -134,7 +171,7 @@ function startOrchestrator() {
|
|
|
134
171
|
|
|
135
172
|
console.log('🚀 LSS Orchestrator started (PID:', child.pid + ')');
|
|
136
173
|
console.log(`📊 Server: http://localhost:${cfg.serverPort}`);
|
|
137
|
-
console.log(`🔧 LocalStack: http://localhost:${cfg.localstackPort}`);
|
|
174
|
+
console.log(`🔧 LocalStack: http://localhost:${cfg.localstackPort} (mode: ${mode}, edition: ${edition})`);
|
|
138
175
|
if (enableDynamoProxy) {
|
|
139
176
|
console.log(`🔄 DynamoDB Proxy: http://localhost:${cfg.dynamoProxyPort} (enabled)`);
|
|
140
177
|
}
|
|
@@ -212,15 +249,24 @@ Commands:
|
|
|
212
249
|
help Show this help message
|
|
213
250
|
|
|
214
251
|
Options:
|
|
215
|
-
--enable-dynamo-proxy
|
|
252
|
+
--enable-dynamo-proxy Enable DynamoDB proxy on port 8000 (for start command)
|
|
253
|
+
--external Connect to a LocalStack already running, do not spawn a container
|
|
254
|
+
--pro Use the LocalStack Pro image (requires LOCALSTACK_AUTH_TOKEN)
|
|
255
|
+
--localstack-token <token> Pass a LOCALSTACK_AUTH_TOKEN to the container
|
|
256
|
+
|
|
257
|
+
Environment:
|
|
258
|
+
LOCALSTACK_AUTH_TOKEN Token forwarded to LocalStack (Pro and >=2026.5 community)
|
|
216
259
|
|
|
217
260
|
Configuration:
|
|
218
261
|
Create a lss.config.json or .lssrc file in your project root to customize:
|
|
219
|
-
|
|
262
|
+
|
|
220
263
|
Example lss.config.json:
|
|
221
264
|
{
|
|
222
265
|
"serverPort": 3100,
|
|
223
266
|
"localstackPort": 4566,
|
|
267
|
+
"mode": "managed",
|
|
268
|
+
"localstackEdition": "community",
|
|
269
|
+
"localstackVersion": "latest",
|
|
224
270
|
"enableDynamoProxy": false,
|
|
225
271
|
"dynamoProxyPort": 8000,
|
|
226
272
|
"region": "us-east-1",
|
|
@@ -236,11 +282,14 @@ Configuration:
|
|
|
236
282
|
orchestratorUrl: http://localhost:3100
|
|
237
283
|
|
|
238
284
|
Examples:
|
|
239
|
-
npx lss start
|
|
240
|
-
npx lss start --enable-dynamo-proxy
|
|
241
|
-
npx lss
|
|
242
|
-
npx lss
|
|
243
|
-
npx lss
|
|
285
|
+
npx lss start # Start the orchestrator (managed LocalStack)
|
|
286
|
+
npx lss start --enable-dynamo-proxy # Start with DynamoDB proxy enabled
|
|
287
|
+
npx lss start --external # Connect to an external LocalStack
|
|
288
|
+
npx lss start --pro # Use LocalStack Pro (token required)
|
|
289
|
+
LOCALSTACK_AUTH_TOKEN=xxx npx lss start # Inject a token via env var
|
|
290
|
+
npx lss stop # Stop the orchestrator
|
|
291
|
+
npx lss status # Check status
|
|
292
|
+
npx lss logs # View logs
|
|
244
293
|
`);
|
|
245
294
|
}
|
|
246
295
|
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
export type LocalStackMode = 'managed' | 'external';
|
|
2
|
+
export type LocalStackEdition = 'community' | 'pro';
|
|
1
3
|
export interface LSSConfig {
|
|
2
4
|
serverPort?: number;
|
|
3
5
|
localstackPort?: number;
|
|
4
6
|
localstackEndpoint?: string;
|
|
7
|
+
mode?: LocalStackMode;
|
|
8
|
+
localstackEdition?: LocalStackEdition;
|
|
9
|
+
localstackVersion?: string;
|
|
10
|
+
localstackImage?: string;
|
|
11
|
+
localstackAuthToken?: string;
|
|
5
12
|
enableDynamoProxy?: boolean;
|
|
6
13
|
dynamoProxyPort?: number;
|
|
7
14
|
region?: string;
|
|
@@ -22,6 +29,12 @@ export declare class ConfigManager {
|
|
|
22
29
|
getDashboardPort(): number;
|
|
23
30
|
getLocalStackPort(): number;
|
|
24
31
|
getLocalStackEndpoint(): string;
|
|
32
|
+
getMode(): LocalStackMode;
|
|
33
|
+
isExternal(): boolean;
|
|
34
|
+
getLocalStackEdition(): LocalStackEdition;
|
|
35
|
+
getLocalStackVersion(): string;
|
|
36
|
+
getLocalStackImage(): string;
|
|
37
|
+
getLocalStackAuthToken(): string | undefined;
|
|
25
38
|
isEnableDynamoProxy(): boolean;
|
|
26
39
|
getDynamoProxyPort(): number;
|
|
27
40
|
getRegion(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,SAAS;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAK5B,IAAI,CAAC,EAAE,cAAc,CAAC;IAGtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAGtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,UAAU;IAiClB,OAAO,CAAC,WAAW;IAoDnB,SAAS,IAAI,SAAS;IAItB,aAAa,IAAI,MAAM;IAKvB,gBAAgB,IAAI,MAAM;IAI1B,iBAAiB,IAAI,MAAM;IAI3B,qBAAqB,IAAI,MAAM;IAQ/B,OAAO,IAAI,cAAc;IAIzB,UAAU,IAAI,OAAO;IAIrB,oBAAoB,IAAI,iBAAiB;IAIzC,oBAAoB,IAAI,MAAM;IAI9B,kBAAkB,IAAI,MAAM;IAQ5B,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAI5C,mBAAmB,IAAI,OAAO;IAQ9B,kBAAkB,IAAI,MAAM;IAI5B,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM,EAAE;IAIvB,aAAa,IAAI,OAAO;IAOxB,OAAO,IAAI,OAAO;IAOlB,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,IAAI,IAAI;IAsBpB,kBAAkB,IAAI,MAAM;CAI7B"}
|
|
@@ -32,14 +32,15 @@ export class ConfigManager {
|
|
|
32
32
|
this.config = JSON.parse(content);
|
|
33
33
|
this.configPath = candidate;
|
|
34
34
|
console.log(`✅ Configuration loaded from ${candidate}`);
|
|
35
|
-
|
|
35
|
+
break;
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
console.warn(`⚠️ Failed to parse config file ${candidate}:`, error instanceof Error ? error.message : 'Unknown error');
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
//
|
|
42
|
+
// Environment variables override file values so secrets like LOCALSTACK_AUTH_TOKEN
|
|
43
|
+
// can be injected without committing them to disk.
|
|
43
44
|
this.loadFromEnv();
|
|
44
45
|
}
|
|
45
46
|
loadFromEnv() {
|
|
@@ -53,6 +54,27 @@ export class ConfigManager {
|
|
|
53
54
|
if (process.env.LSS_LOCALSTACK_ENDPOINT) {
|
|
54
55
|
this.config.localstackEndpoint = process.env.LSS_LOCALSTACK_ENDPOINT;
|
|
55
56
|
}
|
|
57
|
+
if (process.env.LSS_LOCALSTACK_MODE) {
|
|
58
|
+
const mode = process.env.LSS_LOCALSTACK_MODE.toLowerCase();
|
|
59
|
+
if (mode === 'managed' || mode === 'external') {
|
|
60
|
+
this.config.mode = mode;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (process.env.LSS_LOCALSTACK_EDITION) {
|
|
64
|
+
const edition = process.env.LSS_LOCALSTACK_EDITION.toLowerCase();
|
|
65
|
+
if (edition === 'community' || edition === 'pro') {
|
|
66
|
+
this.config.localstackEdition = edition;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (process.env.LSS_LOCALSTACK_VERSION) {
|
|
70
|
+
this.config.localstackVersion = process.env.LSS_LOCALSTACK_VERSION;
|
|
71
|
+
}
|
|
72
|
+
if (process.env.LSS_LOCALSTACK_IMAGE) {
|
|
73
|
+
this.config.localstackImage = process.env.LSS_LOCALSTACK_IMAGE;
|
|
74
|
+
}
|
|
75
|
+
if (process.env.LOCALSTACK_AUTH_TOKEN) {
|
|
76
|
+
this.config.localstackAuthToken = process.env.LOCALSTACK_AUTH_TOKEN;
|
|
77
|
+
}
|
|
56
78
|
if (process.env.LSS_ENABLE_DYNAMO_PROXY) {
|
|
57
79
|
this.config.enableDynamoProxy = process.env.LSS_ENABLE_DYNAMO_PROXY === 'true' || process.env.LSS_ENABLE_DYNAMO_PROXY === '1';
|
|
58
80
|
}
|
|
@@ -92,6 +114,28 @@ export class ConfigManager {
|
|
|
92
114
|
const port = this.getLocalStackPort();
|
|
93
115
|
return `http://localhost:${port}`;
|
|
94
116
|
}
|
|
117
|
+
getMode() {
|
|
118
|
+
return this.config.mode ?? 'managed';
|
|
119
|
+
}
|
|
120
|
+
isExternal() {
|
|
121
|
+
return this.getMode() === 'external';
|
|
122
|
+
}
|
|
123
|
+
getLocalStackEdition() {
|
|
124
|
+
return this.config.localstackEdition ?? 'community';
|
|
125
|
+
}
|
|
126
|
+
getLocalStackVersion() {
|
|
127
|
+
return this.config.localstackVersion ?? 'latest';
|
|
128
|
+
}
|
|
129
|
+
getLocalStackImage() {
|
|
130
|
+
if (this.config.localstackImage) {
|
|
131
|
+
return this.config.localstackImage;
|
|
132
|
+
}
|
|
133
|
+
const repo = this.getLocalStackEdition() === 'pro' ? 'localstack/localstack-pro' : 'localstack/localstack';
|
|
134
|
+
return `${repo}:${this.getLocalStackVersion()}`;
|
|
135
|
+
}
|
|
136
|
+
getLocalStackAuthToken() {
|
|
137
|
+
return this.config.localstackAuthToken;
|
|
138
|
+
}
|
|
95
139
|
isEnableDynamoProxy() {
|
|
96
140
|
if (this.config.enableDynamoProxy !== undefined) {
|
|
97
141
|
return this.config.enableDynamoProxy;
|
|
@@ -129,7 +173,12 @@ export class ConfigManager {
|
|
|
129
173
|
printSummary() {
|
|
130
174
|
console.log('\n📋 Configuration Summary:');
|
|
131
175
|
console.log(` Server Port: ${this.getServerPort()} (http://localhost:${this.getServerPort()})`);
|
|
176
|
+
console.log(` LocalStack Mode: ${this.getMode()}`);
|
|
132
177
|
console.log(` LocalStack Port: ${this.getLocalStackPort()} (${this.getLocalStackEndpoint()})`);
|
|
178
|
+
if (!this.isExternal()) {
|
|
179
|
+
console.log(` LocalStack Image: ${this.getLocalStackImage()} (${this.getLocalStackEdition()})`);
|
|
180
|
+
console.log(` LocalStack Auth Token: ${this.getLocalStackAuthToken() ? 'set' : 'not set'}`);
|
|
181
|
+
}
|
|
133
182
|
console.log(` DynamoDB Proxy Enabled: ${this.isEnableDynamoProxy()}`);
|
|
134
183
|
if (this.isEnableDynamoProxy()) {
|
|
135
184
|
console.log(` DynamoDB Proxy Port: ${this.getDynamoProxyPort()}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localstack-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAMA,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"localstack-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAMA,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkHtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,YAAY;IAmB1B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAIrB,SAAS;;;;;;;;CAUV"}
|
|
@@ -24,6 +24,13 @@ export class LocalStackManager {
|
|
|
24
24
|
console.log('⚠️ LocalStack already running');
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
+
if (this.configManager.isExternal()) {
|
|
28
|
+
console.log(`🔗 Using external LocalStack at ${this.endpoint}`);
|
|
29
|
+
await this.waitForReady(30);
|
|
30
|
+
this._isRunning = true;
|
|
31
|
+
console.log('✅ Connected to external LocalStack');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
27
34
|
try {
|
|
28
35
|
// Check if docker is available
|
|
29
36
|
await execAsync('docker ps -q', { timeout: 5000 });
|
|
@@ -31,14 +38,22 @@ export class LocalStackManager {
|
|
|
31
38
|
catch {
|
|
32
39
|
throw new Error('Docker is not available or not running. Please start Docker first.');
|
|
33
40
|
}
|
|
41
|
+
const edition = this.configManager.getLocalStackEdition();
|
|
42
|
+
const image = this.configManager.getLocalStackImage();
|
|
43
|
+
const authToken = this.configManager.getLocalStackAuthToken();
|
|
44
|
+
if (edition === 'pro' && !authToken) {
|
|
45
|
+
throw new Error('LocalStack Pro requires LOCALSTACK_AUTH_TOKEN. Set the env var or "localstackAuthToken" in your config.');
|
|
46
|
+
}
|
|
47
|
+
if (edition === 'community' && !authToken) {
|
|
48
|
+
console.warn('⚠️ LOCALSTACK_AUTH_TOKEN not set. Recent localstack/localstack images (>= 2026.5) require a token even for the community edition.');
|
|
49
|
+
}
|
|
34
50
|
return new Promise((resolve, reject) => {
|
|
35
|
-
console.log(
|
|
51
|
+
console.log(`🔄 Starting LocalStack (${image})...`);
|
|
36
52
|
const port = this.configManager.getLocalStackPort();
|
|
37
53
|
const services = this.configManager.getServices().join(',');
|
|
38
54
|
const persistence = this.configManager.isPersistence() ? '1' : '0';
|
|
39
55
|
const debug = this.configManager.isDebug() ? '1' : '0';
|
|
40
|
-
|
|
41
|
-
this.process = spawn('docker', [
|
|
56
|
+
const dockerArgs = [
|
|
42
57
|
'run',
|
|
43
58
|
'--rm',
|
|
44
59
|
'-p',
|
|
@@ -59,8 +74,12 @@ export class LocalStackManager {
|
|
|
59
74
|
`PERSISTENCE=${persistence}`,
|
|
60
75
|
'-e',
|
|
61
76
|
`DEBUG=${debug}`,
|
|
62
|
-
|
|
63
|
-
|
|
77
|
+
];
|
|
78
|
+
if (authToken) {
|
|
79
|
+
dockerArgs.push('-e', `LOCALSTACK_AUTH_TOKEN=${authToken}`);
|
|
80
|
+
}
|
|
81
|
+
dockerArgs.push(image);
|
|
82
|
+
this.process = spawn('docker', dockerArgs);
|
|
64
83
|
let stderr = '';
|
|
65
84
|
let stdout = '';
|
|
66
85
|
this.process.stderr?.on('data', data => {
|
|
@@ -100,6 +119,11 @@ export class LocalStackManager {
|
|
|
100
119
|
if (!this._isRunning) {
|
|
101
120
|
return;
|
|
102
121
|
}
|
|
122
|
+
if (this.configManager.isExternal()) {
|
|
123
|
+
console.log('🔗 External LocalStack — leaving container untouched');
|
|
124
|
+
this._isRunning = false;
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
103
127
|
console.log('🛑 Stopping LocalStack...');
|
|
104
128
|
try {
|
|
105
129
|
await execAsync(`docker stop ${this.containerName}`, { timeout: 10000 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAC,QAAQ,CAAoB;IACnC,OAAO,GAAwB,IAAI,CAAC;IACpC,UAAU,GAAG,KAAK,CAAC;IACnB,QAAQ,CAAS;IACR,aAAa,GAAG,gBAAgB,CAAC;IACjC,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;IAC7D,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,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,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,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"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"}
|