local-serverless-stack 0.4.0 → 0.6.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.
Files changed (112) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +8 -8
  3. package/bin/cli.js +38 -3
  4. package/dist/client/index.d.ts +7 -0
  5. package/dist/client/index.d.ts.map +1 -1
  6. package/dist/client/index.js +6 -0
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/client/namespaces/apis.d.ts +48 -0
  9. package/dist/client/namespaces/apis.d.ts.map +1 -0
  10. package/dist/client/namespaces/apis.js +12 -0
  11. package/dist/client/namespaces/apis.js.map +1 -0
  12. package/dist/client/namespaces/lambdas.d.ts +61 -0
  13. package/dist/client/namespaces/lambdas.d.ts.map +1 -0
  14. package/dist/client/namespaces/lambdas.js +13 -0
  15. package/dist/client/namespaces/lambdas.js.map +1 -0
  16. package/dist/client/namespaces/services.d.ts +40 -0
  17. package/dist/client/namespaces/services.d.ts.map +1 -1
  18. package/dist/client/namespaces/services.js +3 -0
  19. package/dist/client/namespaces/services.js.map +1 -1
  20. package/dist/client/types.d.ts +2 -0
  21. package/dist/client/types.d.ts.map +1 -1
  22. package/dist/server/index.js +25 -2
  23. package/dist/server/index.js.map +1 -1
  24. package/dist/server/routes/apis.d.ts +3 -0
  25. package/dist/server/routes/apis.d.ts.map +1 -0
  26. package/dist/server/routes/apis.js +54 -0
  27. package/dist/server/routes/apis.js.map +1 -0
  28. package/dist/server/routes/lambdas.d.ts +3 -0
  29. package/dist/server/routes/lambdas.d.ts.map +1 -0
  30. package/dist/server/routes/lambdas.js +85 -0
  31. package/dist/server/routes/lambdas.js.map +1 -0
  32. package/dist/server/routes/services.d.ts.map +1 -1
  33. package/dist/server/routes/services.js +91 -81
  34. package/dist/server/routes/services.js.map +1 -1
  35. package/dist/server/runtime/runtime-worker.d.ts +2 -0
  36. package/dist/server/runtime/runtime-worker.d.ts.map +1 -0
  37. package/dist/server/runtime/runtime-worker.js +230 -0
  38. package/dist/server/runtime/runtime-worker.js.map +1 -0
  39. package/dist/server/services/api-gateway-events.d.ts +44 -0
  40. package/dist/server/services/api-gateway-events.d.ts.map +1 -0
  41. package/dist/server/services/api-gateway-events.js +299 -0
  42. package/dist/server/services/api-gateway-events.js.map +1 -0
  43. package/dist/server/services/artifact-resolver.d.ts +2 -0
  44. package/dist/server/services/artifact-resolver.d.ts.map +1 -0
  45. package/dist/server/services/artifact-resolver.js +38 -0
  46. package/dist/server/services/artifact-resolver.js.map +1 -0
  47. package/dist/server/services/authorizer-service.d.ts +25 -0
  48. package/dist/server/services/authorizer-service.d.ts.map +1 -0
  49. package/dist/server/services/authorizer-service.js +0 -0
  50. package/dist/server/services/authorizer-service.js.map +1 -0
  51. package/dist/server/services/cache-manager.d.ts +6 -0
  52. package/dist/server/services/cache-manager.d.ts.map +1 -1
  53. package/dist/server/services/cache-manager.js.map +1 -1
  54. package/dist/server/services/cloudformation-parser.d.ts +15 -0
  55. package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
  56. package/dist/server/services/cloudformation-parser.js +36 -3
  57. package/dist/server/services/cloudformation-parser.js.map +1 -1
  58. package/dist/server/services/config-manager.d.ts +36 -0
  59. package/dist/server/services/config-manager.d.ts.map +1 -1
  60. package/dist/server/services/config-manager.js +57 -0
  61. package/dist/server/services/config-manager.js.map +1 -1
  62. package/dist/server/services/function-registry.d.ts +33 -0
  63. package/dist/server/services/function-registry.d.ts.map +1 -0
  64. package/dist/server/services/function-registry.js +100 -0
  65. package/dist/server/services/function-registry.js.map +1 -0
  66. package/dist/server/services/gateway-manager.d.ts +31 -0
  67. package/dist/server/services/gateway-manager.d.ts.map +1 -0
  68. package/dist/server/services/gateway-manager.js +292 -0
  69. package/dist/server/services/gateway-manager.js.map +1 -0
  70. package/dist/server/services/lambda-runtime-manager.d.ts +52 -0
  71. package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -0
  72. package/dist/server/services/lambda-runtime-manager.js +309 -0
  73. package/dist/server/services/lambda-runtime-manager.js.map +1 -0
  74. package/dist/server/services/localstack-manager.d.ts.map +1 -1
  75. package/dist/server/services/localstack-manager.js +9 -0
  76. package/dist/server/services/localstack-manager.js.map +1 -1
  77. package/dist/server/services/resource-provisioner.d.ts +1 -0
  78. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  79. package/dist/server/services/resource-provisioner.js +73 -11
  80. package/dist/server/services/resource-provisioner.js.map +1 -1
  81. package/dist/server/services/serverless-state-parser.d.ts +86 -0
  82. package/dist/server/services/serverless-state-parser.d.ts.map +1 -0
  83. package/dist/server/services/serverless-state-parser.js +245 -0
  84. package/dist/server/services/serverless-state-parser.js.map +1 -0
  85. package/dist/server/services/service-registrar.d.ts +34 -0
  86. package/dist/server/services/service-registrar.d.ts.map +1 -0
  87. package/dist/server/services/service-registrar.js +280 -0
  88. package/dist/server/services/service-registrar.js.map +1 -0
  89. package/dist/server/services/source-watcher.d.ts +24 -0
  90. package/dist/server/services/source-watcher.d.ts.map +1 -0
  91. package/dist/server/services/source-watcher.js +101 -0
  92. package/dist/server/services/source-watcher.js.map +1 -0
  93. package/dist/ui/assets/ApisPage-DdgKjEdS.js +1 -0
  94. package/dist/ui/assets/{BucketDetailPage-Hg4Gg3jC.js → BucketDetailPage-DZQGxm0y.js} +1 -1
  95. package/dist/ui/assets/{BucketsPage-BHkg7TQp.js → BucketsPage-xYXzxCvd.js} +1 -1
  96. package/dist/ui/assets/{DynamoPage-CH_TgPh_.js → DynamoPage-B1__Rjr2.js} +1 -1
  97. package/dist/ui/assets/{DynamoTablePage-BPvl5y6_.js → DynamoTablePage-BCoxPdXW.js} +1 -1
  98. package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +4 -0
  99. package/dist/ui/assets/LambdasPage-_TtxQMT_.js +1 -0
  100. package/dist/ui/assets/{OverviewPage-CwLnw4VW.css → OverviewPage-6jDXV1jr.css} +1 -1
  101. package/dist/ui/assets/OverviewPage-CqTKTY64.js +1 -0
  102. package/dist/ui/assets/{QueueDetailPage-DHDPgRDc.js → QueueDetailPage-BOr_sImA.js} +1 -1
  103. package/dist/ui/assets/{QueuesPage-D5YcEbUU.js → QueuesPage-DpByfcM5.js} +1 -1
  104. package/dist/ui/assets/{ServiceDetailPage-DxJ0t7HQ.js → ServiceDetailPage-DsWgV-ad.js} +1 -1
  105. package/dist/ui/assets/{ServicesPage-DWDaaOz9.js → ServicesPage-CGlpsj98.js} +1 -1
  106. package/dist/ui/assets/{index-D3WwZ4lY.js → index-BWlB542w.js} +11 -11
  107. package/dist/ui/index.html +1 -1
  108. package/package.json +1 -1
  109. package/packages/serverless-plugin/README.md +21 -3
  110. package/packages/serverless-plugin/dist/index.js +8 -3
  111. package/packages/serverless-plugin/dist/index.js.map +1 -1
  112. package/dist/ui/assets/OverviewPage-nhomNDqx.js +0 -1
@@ -0,0 +1,309 @@
1
+ // Manages one runtime worker per registered service: resolves where handler code
2
+ // lives (packaged artifact vs source tree), forks/restarts the worker, and
3
+ // brokers invocations over IPC with Lambda-shaped results. This is what replaces
4
+ // serverless-offline as the thing that actually runs handlers.
5
+ import { fork } from 'child_process';
6
+ import path from 'path';
7
+ import fs from 'fs';
8
+ import os from 'os';
9
+ import crypto from 'crypto';
10
+ import { fileURLToPath } from 'url';
11
+ import AdmZip from 'adm-zip';
12
+ import { ConfigManager } from './config-manager.js';
13
+ import { FunctionRegistry } from './function-registry.js';
14
+ import { resolveArtifacts } from './artifact-resolver.js';
15
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
16
+ const HISTORY_LIMIT = 50;
17
+ const MAX_RESTARTS = 3;
18
+ const RESTART_WINDOW_MS = 30000;
19
+ // Manager-side grace on top of the function timeout, so a hung worker still
20
+ // yields a response instead of a dangling request.
21
+ const IPC_GRACE_MS = 5000;
22
+ export class LambdaRuntimeManager {
23
+ static instance;
24
+ runtimes = new Map();
25
+ configManager = ConfigManager.getInstance();
26
+ static getInstance() {
27
+ if (!LambdaRuntimeManager.instance) {
28
+ LambdaRuntimeManager.instance = new LambdaRuntimeManager();
29
+ }
30
+ return LambdaRuntimeManager.instance;
31
+ }
32
+ // Bring the runtime for a service in line with its (re-)registration: restart
33
+ // the worker so new code/config is picked up.
34
+ async syncService(entry) {
35
+ const runtimeConfig = this.configManager.getRuntimeConfigForService(entry.root);
36
+ if (!runtimeConfig.enabled || entry.functions.length === 0) {
37
+ await this.stopRuntime(entry.name);
38
+ this.runtimes.delete(entry.name);
39
+ return;
40
+ }
41
+ await this.stopRuntime(entry.name);
42
+ const runtime = {
43
+ entry,
44
+ status: 'stopped',
45
+ executionMode: runtimeConfig.execution,
46
+ pending: new Map(),
47
+ queue: [],
48
+ invocations: this.runtimes.get(entry.name)?.invocations ?? 0,
49
+ errors: this.runtimes.get(entry.name)?.errors ?? 0,
50
+ restartCount: 0,
51
+ lastRestartAt: 0,
52
+ history: this.runtimes.get(entry.name)?.history ?? [],
53
+ };
54
+ this.runtimes.set(entry.name, runtime);
55
+ this.startWorker(runtime);
56
+ }
57
+ async startRuntime(serviceName) {
58
+ const entry = FunctionRegistry.getInstance().getService(serviceName);
59
+ if (!entry)
60
+ throw new Error(`Service ${serviceName} not registered`);
61
+ await this.syncService(entry);
62
+ return this.getRuntimeInfo(serviceName);
63
+ }
64
+ async stopRuntime(serviceName) {
65
+ const runtime = this.runtimes.get(serviceName);
66
+ if (!runtime)
67
+ return;
68
+ runtime.status = 'stopped';
69
+ runtime.error = undefined;
70
+ const worker = runtime.worker;
71
+ runtime.worker = undefined;
72
+ if (worker) {
73
+ worker.removeAllListeners();
74
+ worker.kill('SIGTERM');
75
+ }
76
+ for (const [, pending] of runtime.pending) {
77
+ clearTimeout(pending.timer);
78
+ pending.resolve(this.errorResult('RuntimeStopped', 'Lambda runtime was stopped', 0));
79
+ }
80
+ runtime.pending.clear();
81
+ runtime.queue = [];
82
+ }
83
+ async stopAll() {
84
+ for (const name of this.runtimes.keys()) {
85
+ await this.stopRuntime(name);
86
+ }
87
+ }
88
+ // Restart keeping the same registration (used by the source watcher — the
89
+ // worker's module cache is the only thing that needs flushing).
90
+ async restartRuntime(serviceName) {
91
+ const runtime = this.runtimes.get(serviceName);
92
+ if (!runtime)
93
+ return;
94
+ await this.syncService(runtime.entry);
95
+ }
96
+ getRuntimeInfo(serviceName) {
97
+ const runtime = this.runtimes.get(serviceName);
98
+ if (!runtime) {
99
+ return { status: 'stopped', invocations: 0, errors: 0 };
100
+ }
101
+ return {
102
+ status: runtime.status,
103
+ executionMode: runtime.executionMode,
104
+ resolvedMode: runtime.resolvedMode,
105
+ handlerRoot: runtime.handlerRoot,
106
+ pid: runtime.worker?.pid,
107
+ startedAt: runtime.startedAt,
108
+ error: runtime.error,
109
+ invocations: runtime.invocations,
110
+ errors: runtime.errors,
111
+ lastInvokedAt: runtime.lastInvokedAt,
112
+ };
113
+ }
114
+ getHistory(serviceName, functionName) {
115
+ const runtime = this.runtimes.get(serviceName);
116
+ if (!runtime)
117
+ return [];
118
+ return functionName
119
+ ? runtime.history.filter(h => h.functionName === functionName)
120
+ : runtime.history;
121
+ }
122
+ async invoke(serviceName, fn, event) {
123
+ const runtime = this.runtimes.get(serviceName);
124
+ if (!runtime || runtime.status === 'stopped' || runtime.status === 'error') {
125
+ return this.errorResult('RuntimeUnavailable', `Lambda runtime for service "${serviceName}" is not running${runtime?.error ? ` (${runtime.error})` : ''}`, 0);
126
+ }
127
+ if (runtime.status === 'starting') {
128
+ await new Promise(resolve => runtime.queue.push(resolve));
129
+ if (runtime.status !== 'online') {
130
+ return this.errorResult('RuntimeUnavailable', `Lambda runtime for service "${serviceName}" failed to start`, 0);
131
+ }
132
+ }
133
+ const worker = runtime.worker;
134
+ if (!worker) {
135
+ return this.errorResult('RuntimeUnavailable', `Lambda runtime worker for "${serviceName}" is gone`, 0);
136
+ }
137
+ const invokeId = crypto.randomUUID();
138
+ const timeoutSeconds = fn.timeout || 6;
139
+ const startedAt = Date.now();
140
+ const result = await new Promise(resolve => {
141
+ const timer = setTimeout(() => {
142
+ runtime.pending.delete(invokeId);
143
+ resolve(this.errorResult('TimeoutError', `Task timed out after ${timeoutSeconds.toFixed(2)} seconds (worker unresponsive)`, Date.now() - startedAt));
144
+ }, timeoutSeconds * 1000 + IPC_GRACE_MS);
145
+ runtime.pending.set(invokeId, { resolve, timer });
146
+ worker.send({
147
+ type: 'invoke',
148
+ invokeId,
149
+ functionName: fn.name,
150
+ fullName: fn.fullName,
151
+ handler: fn.handler,
152
+ handlerRoot: runtime.handlerRoot,
153
+ serviceRoot: runtime.entry.root,
154
+ timeoutSeconds,
155
+ memorySize: fn.memorySize,
156
+ region: runtime.entry.region || 'us-east-1',
157
+ env: fn.environment,
158
+ event: event ?? {},
159
+ });
160
+ });
161
+ runtime.invocations++;
162
+ runtime.lastInvokedAt = Date.now();
163
+ if (!result.ok)
164
+ runtime.errors++;
165
+ runtime.history.push({
166
+ at: startedAt,
167
+ functionName: fn.name,
168
+ ok: result.ok,
169
+ durationMs: result.durationMs,
170
+ logs: result.logs,
171
+ });
172
+ if (runtime.history.length > HISTORY_LIMIT) {
173
+ runtime.history.splice(0, runtime.history.length - HISTORY_LIMIT);
174
+ }
175
+ return result;
176
+ }
177
+ startWorker(runtime) {
178
+ let handlerRoot;
179
+ let resolvedMode;
180
+ try {
181
+ ({ handlerRoot, resolvedMode } = this.resolveHandlerRoot(runtime.entry, runtime.executionMode));
182
+ }
183
+ catch (err) {
184
+ runtime.status = 'error';
185
+ runtime.error = err instanceof Error ? err.message : String(err);
186
+ console.error(`❌ Lambda runtime for "${runtime.entry.name}": ${runtime.error}`);
187
+ return;
188
+ }
189
+ runtime.handlerRoot = handlerRoot;
190
+ runtime.resolvedMode = resolvedMode;
191
+ runtime.status = 'starting';
192
+ runtime.error = undefined;
193
+ const workerPath = path.join(__dirname, '../runtime/runtime-worker.js');
194
+ const worker = fork(workerPath, [], {
195
+ cwd: runtime.entry.root,
196
+ stdio: ['ignore', 'pipe', 'pipe', 'ipc'],
197
+ env: {
198
+ ...process.env,
199
+ // Bundled artifacts with externalized deps still resolve against the
200
+ // service's own node_modules.
201
+ NODE_PATH: [
202
+ path.join(runtime.entry.root, 'node_modules'),
203
+ process.env.NODE_PATH || '',
204
+ ].filter(Boolean).join(path.delimiter),
205
+ },
206
+ execArgv: [],
207
+ });
208
+ worker.stdout?.on('data', () => { });
209
+ worker.stderr?.on('data', (chunk) => {
210
+ const text = chunk.toString().trim();
211
+ if (text)
212
+ console.error(`[${runtime.entry.name}:worker] ${text}`);
213
+ });
214
+ worker.on('message', (msg) => {
215
+ if (msg?.type === 'ready') {
216
+ runtime.status = 'online';
217
+ runtime.startedAt = Date.now();
218
+ console.log(`✅ Lambda runtime online for "${runtime.entry.name}" (${resolvedMode} mode, ${runtime.entry.functions.length} functions)`);
219
+ const queued = runtime.queue;
220
+ runtime.queue = [];
221
+ queued.forEach(release => release());
222
+ return;
223
+ }
224
+ if (msg?.type === 'result' && msg.invokeId) {
225
+ const pending = runtime.pending.get(msg.invokeId);
226
+ if (!pending)
227
+ return;
228
+ runtime.pending.delete(msg.invokeId);
229
+ clearTimeout(pending.timer);
230
+ pending.resolve({
231
+ ok: Boolean(msg.ok),
232
+ payload: msg.payload,
233
+ errorType: msg.error?.errorType,
234
+ errorMessage: msg.error?.errorMessage,
235
+ trace: msg.error?.trace,
236
+ logs: msg.logs || [],
237
+ durationMs: msg.durationMs || 0,
238
+ });
239
+ }
240
+ });
241
+ worker.on('exit', (code) => {
242
+ if (runtime.worker !== worker)
243
+ return; // superseded by a restart/stop
244
+ runtime.worker = undefined;
245
+ for (const [, pending] of runtime.pending) {
246
+ clearTimeout(pending.timer);
247
+ pending.resolve(this.errorResult('RuntimeCrashed', `Lambda worker exited with code ${code}`, 0));
248
+ }
249
+ runtime.pending.clear();
250
+ const queued = runtime.queue;
251
+ runtime.queue = [];
252
+ const now = Date.now();
253
+ if (now - runtime.lastRestartAt > RESTART_WINDOW_MS)
254
+ runtime.restartCount = 0;
255
+ runtime.restartCount++;
256
+ runtime.lastRestartAt = now;
257
+ if (runtime.status !== 'stopped' && runtime.restartCount <= MAX_RESTARTS) {
258
+ console.warn(`⚠️ Lambda worker for "${runtime.entry.name}" exited (code ${code}) — restarting (${runtime.restartCount}/${MAX_RESTARTS})`);
259
+ this.startWorker(runtime);
260
+ }
261
+ else if (runtime.status !== 'stopped') {
262
+ runtime.status = 'error';
263
+ runtime.error = `Worker crashed ${MAX_RESTARTS} times in ${RESTART_WINDOW_MS / 1000}s (last exit code ${code})`;
264
+ console.error(`❌ Lambda runtime for "${runtime.entry.name}" gave up: ${runtime.error}`);
265
+ }
266
+ queued.forEach(release => release());
267
+ });
268
+ runtime.worker = worker;
269
+ }
270
+ resolveHandlerRoot(entry, mode) {
271
+ const artifacts = this.findArtifacts(entry);
272
+ if (mode === 'artifact' || (mode === 'auto' && artifacts.length > 0)) {
273
+ if (artifacts.length === 0) {
274
+ throw new Error(`execution mode is "artifact" but no packaged zip was found under ${entry.root}/.serverless — run 'serverless package' first`);
275
+ }
276
+ return { handlerRoot: this.extractArtifacts(entry.name, artifacts), resolvedMode: 'artifact' };
277
+ }
278
+ return { handlerRoot: entry.root, resolvedMode: 'source' };
279
+ }
280
+ findArtifacts(entry) {
281
+ return resolveArtifacts(entry.root, entry.functions.map(fn => fn.artifact));
282
+ }
283
+ // Extract artifact zips into a content-addressed dir under ~/.lss so repeated
284
+ // registrations with unchanged artifacts reuse the same extraction.
285
+ extractArtifacts(serviceName, artifacts) {
286
+ const stamp = artifacts
287
+ .map(p => {
288
+ const stat = fs.statSync(p);
289
+ return `${p}:${stat.size}:${stat.mtimeMs}`;
290
+ })
291
+ .join('|');
292
+ const hash = crypto.createHash('sha256').update(stamp).digest('hex').slice(0, 12);
293
+ const baseDir = path.join(os.homedir(), '.lss', 'orchestrator', 'runtime', serviceName);
294
+ const targetDir = path.join(baseDir, hash);
295
+ if (!fs.existsSync(targetDir)) {
296
+ // Drop stale extractions before writing the new one.
297
+ fs.rmSync(baseDir, { recursive: true, force: true });
298
+ fs.mkdirSync(targetDir, { recursive: true });
299
+ for (const artifact of artifacts) {
300
+ new AdmZip(artifact).extractAllTo(targetDir, true);
301
+ }
302
+ }
303
+ return targetDir;
304
+ }
305
+ errorResult(errorType, errorMessage, durationMs) {
306
+ return { ok: false, errorType, errorMessage, logs: [], durationMs };
307
+ }
308
+ }
309
+ //# sourceMappingURL=lambda-runtime-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lambda-runtime-manager.js","sourceRoot":"","sources":["../../../src/server/services/lambda-runtime-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;IAKzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO;IAOP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsHtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,YAAY;IAmB1B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAIrB,SAAS;;;;;;;;CAUV"}
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;IAKzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,OAAO;IAOP,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+HtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,YAAY;IAmB1B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAIrB,SAAS;;;;;;;;CAUV"}
@@ -73,12 +73,21 @@ export class LocalStackManager {
73
73
  `${volumeName}:/var/lib/localstack`,
74
74
  '-v',
75
75
  '/var/run/docker.sock:/var/run/docker.sock',
76
+ // host.docker.internal resolves natively on Docker Desktop but not on
77
+ // Linux; the generated Lambda proxies target it to reach the invoke
78
+ // listeners on the host, so map it explicitly (no-op elsewhere).
79
+ '--add-host',
80
+ 'host.docker.internal:host-gateway',
76
81
  '--name',
77
82
  this.containerName,
78
83
  '-e',
79
84
  `SERVICES=${services}`,
80
85
  '-e',
81
86
  'LAMBDA_EXECUTOR=local',
87
+ // Lambda containers spawned BY LocalStack (which run the proxies) need
88
+ // the same host mapping.
89
+ '-e',
90
+ 'LAMBDA_DOCKER_FLAGS=--add-host host.docker.internal:host-gateway',
82
91
  '-e',
83
92
  `PERSISTENCE=${persistence}`,
84
93
  '-e',
@@ -1 +1 @@
1
- {"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ export declare class ResourceProvisioner {
20
20
  region?: string;
21
21
  }): Promise<void>;
22
22
  private createDynamoDBTable;
23
+ private applyTimeToLive;
23
24
  private createSQSQueue;
24
25
  private createSNSTopic;
25
26
  private createS3Bucket;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-provisioner.d.ts","sourceRoot":"","sources":["../../../src/server/services/resource-provisioner.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,QAAQ,EAQT,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EACV,QAAQ,EAMT,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAuB;IAM5C,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,OAAO,CAAC,iBAAiB;IAezB,WAAW,IAAI,QAAQ;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;YAoFF,mBAAmB;YA4DnB,cAAc;YAiCd,cAAc;YAiBd,cAAc;YA4Bd,wBAAwB;IAiEtC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;YAoEjB,wBAAwB;YAkDxB,uBAAuB;IAoDrC,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAkH7B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;YAoBY,kBAAkB;YASlB,aAAa;YASb,aAAa;YAYb,aAAa;IASrB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAyCnE,mBAAmB;YAYnB,cAAc;YAiBd,cAAc;YAsBd,cAAc;YAkBd,wBAAwB;CA6BvC"}
1
+ {"version":3,"file":"resource-provisioner.d.ts","sourceRoot":"","sources":["../../../src/server/services/resource-provisioner.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,QAAQ,EAQT,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EACV,QAAQ,EAMT,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAuB;IAM5C,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,OAAO,CAAC,iBAAiB;IAezB,WAAW,IAAI,QAAQ;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;YAuFF,mBAAmB;YA+DnB,eAAe;YAqBf,cAAc;YAiCd,cAAc;YAiBd,cAAc;YA4Bd,wBAAwB;IAiEtC,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,uBAAuB;YAoEjB,wBAAwB;YAsExB,uBAAuB;IAqErC,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAkH7B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;YAoBY,kBAAkB;YASlB,aAAa;YASb,aAAa;YAYb,aAAa;IASrB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAyCnE,mBAAmB;YAYnB,cAAc;YAiBd,cAAc;YAsBd,cAAc;YAkBd,wBAAwB;CA6BvC"}
@@ -1,10 +1,11 @@
1
- import { DynamoDBClient, CreateTableCommand, ListTablesCommand, DeleteTableCommand, DescribeTableCommand } from '@aws-sdk/client-dynamodb';
1
+ import { DynamoDBClient, CreateTableCommand, ListTablesCommand, DeleteTableCommand, DescribeTableCommand, UpdateTimeToLiveCommand } from '@aws-sdk/client-dynamodb';
2
2
  import { SQSClient, CreateQueueCommand, ListQueuesCommand, GetQueueAttributesCommand, DeleteQueueCommand, GetQueueUrlCommand } from '@aws-sdk/client-sqs';
3
3
  import { SNSClient, CreateTopicCommand, ListTopicsCommand, DeleteTopicCommand } from '@aws-sdk/client-sns';
4
4
  import { S3Client, CreateBucketCommand, ListBucketsCommand, DeleteBucketCommand, PutBucketVersioningCommand, PutBucketNotificationConfigurationCommand, ListObjectsV2Command, DeleteObjectCommand, } from '@aws-sdk/client-s3';
5
- import { LambdaClient, CreateFunctionCommand, GetFunctionCommand, DeleteFunctionCommand, AddPermissionCommand } from '@aws-sdk/client-lambda';
5
+ import { LambdaClient, CreateFunctionCommand, GetFunctionCommand, DeleteFunctionCommand, AddPermissionCommand, UpdateFunctionConfigurationCommand } from '@aws-sdk/client-lambda';
6
6
  import { CreateEventSourceMappingCommand, ListEventSourceMappingsCommand, DeleteEventSourceMappingCommand } from '@aws-sdk/client-lambda';
7
7
  import { LocalStackManager } from './localstack-manager.js';
8
+ import { ConfigManager } from './config-manager.js';
8
9
  import { SeedManager } from './seed-manager.js';
9
10
  import AdmZip from 'adm-zip';
10
11
  export class ResourceProvisioner {
@@ -57,8 +58,11 @@ export class ResourceProvisioner {
57
58
  this.initializeClients(this.currentRegion);
58
59
  }
59
60
  SeedManager.getInstance().setRegion(this.currentRegion);
61
+ // The default callback host is overridable (lambdaRuntime.invokeHost /
62
+ // LSS_INVOKE_HOST) for setups where "host.docker.internal" doesn't reach
63
+ // the orchestrator — e.g. Docker-in-Docker devcontainers.
60
64
  const invokeUrl = metadata?.invokeUrl
61
- || (metadata?.invokePort ? `http://host.docker.internal:${metadata.invokePort}` : undefined);
65
+ || (metadata?.invokePort ? `http://${ConfigManager.getInstance().getInvokeHost()}:${metadata.invokePort}` : undefined);
62
66
  // Rebuild the logical id map for this service so resolveEventSourceArn can
63
67
  // jump straight from "OrderProcessingQueue" to the actual queue name.
64
68
  this.resourcesByLogicalId.clear();
@@ -169,7 +173,7 @@ export class ResourceProvisioner {
169
173
  StreamSpecification: resource.streamEnabled
170
174
  ? {
171
175
  StreamEnabled: true,
172
- StreamViewType: 'NEW_AND_OLD_IMAGES',
176
+ StreamViewType: resource.streamViewType || 'NEW_AND_OLD_IMAGES',
173
177
  }
174
178
  : undefined,
175
179
  }));
@@ -185,6 +189,29 @@ export class ResourceProvisioner {
185
189
  throw error;
186
190
  }
187
191
  }
192
+ // Applied to pre-existing tables too, so tables created before LSS knew
193
+ // about TTL pick it up on re-registration.
194
+ await this.applyTimeToLive(resource);
195
+ }
196
+ async applyTimeToLive(resource) {
197
+ if (!resource.ttl)
198
+ return;
199
+ try {
200
+ await this.dynamoClient.send(new UpdateTimeToLiveCommand({
201
+ TableName: resource.name,
202
+ TimeToLiveSpecification: { AttributeName: resource.ttl.attributeName, Enabled: resource.ttl.enabled },
203
+ }));
204
+ const state = resource.ttl.enabled ? 'Enabled' : 'Disabled';
205
+ console.log(` ✓ ${state} TTL on ${resource.name} (attribute: ${resource.ttl.attributeName})`);
206
+ }
207
+ catch (error) {
208
+ // Re-registering re-sends the same TTL state, which DynamoDB rejects with
209
+ // "TimeToLive is already enabled/disabled" — that's the steady state, not
210
+ // a failure.
211
+ if (!/already (enabled|disabled)/i.test(String(error?.message || ''))) {
212
+ console.warn(` ⚠ Failed to update TTL on ${resource.name}: ${error?.message || error}`);
213
+ }
214
+ }
188
215
  }
189
216
  async createSQSQueue(resource) {
190
217
  try {
@@ -416,24 +443,44 @@ export const handler = async (event, context) => {
416
443
  const eventSourceArn = await this.resolveEventSourceArn(mapping.eventSourceArn);
417
444
  // Create Lambda proxy function if it doesn't exist
418
445
  await this.ensureLambdaProxyExists(serviceName, actualFunctionName, actualFunctionName, invokeUrl);
419
- // Check if mapping already exists
446
+ // Check if mapping already exists — compare against the RESOLVED arn:
447
+ // `mapping.eventSourceArn` may still be a CFN ref ("IdentityTable::StreamArn")
448
+ // that no live mapping's EventSourceArn would ever contain.
420
449
  const existingMappings = await this.lambdaClient.send(new ListEventSourceMappingsCommand({
421
450
  FunctionName: actualFunctionName,
422
451
  }));
423
- if (existingMappings.EventSourceMappings?.some(m => m.EventSourceArn?.includes(mapping.eventSourceArn))) {
424
- console.log(` ⚠ Event source mapping already exists: ${actualFunctionName} <- ${mapping.eventSourceArn}`);
452
+ if (existingMappings.EventSourceMappings?.some(m => m.EventSourceArn === eventSourceArn)) {
453
+ console.log(` ⚠ Event source mapping already exists: ${actualFunctionName} <- ${eventSourceArn}`);
425
454
  return;
426
455
  }
427
456
  // Stream-based sources (DynamoDB Streams, Kinesis) require StartingPosition;
428
- // SQS forbids it. Detect from the resolved ARN service segment.
457
+ // SQS forbids it (as it does MaximumRetryAttempts/DestinationConfig).
458
+ // Detect from the resolved ARN service segment.
429
459
  const isStreamSource = eventSourceArn.startsWith('arn:aws:dynamodb:')
430
460
  || eventSourceArn.startsWith('arn:aws:kinesis:');
461
+ // The OnFailure destination may itself be a CFN ref to a DLQ/topic.
462
+ let destinationConfig;
463
+ if (isStreamSource && mapping.onFailureDestination) {
464
+ try {
465
+ destinationConfig = {
466
+ OnFailure: { Destination: await this.resolveEventSourceArn(mapping.onFailureDestination) },
467
+ };
468
+ }
469
+ catch (error) {
470
+ console.warn(` ⚠ Could not resolve OnFailure destination ${mapping.onFailureDestination}: ${error?.message || error}`);
471
+ }
472
+ }
431
473
  await this.lambdaClient.send(new CreateEventSourceMappingCommand({
432
474
  FunctionName: actualFunctionName,
433
475
  EventSourceArn: eventSourceArn,
434
476
  BatchSize: mapping.batchSize || 10,
435
477
  Enabled: mapping.enabled,
436
- StartingPosition: isStreamSource ? 'TRIM_HORIZON' : undefined,
478
+ StartingPosition: isStreamSource ? mapping.startingPosition || 'TRIM_HORIZON' : undefined,
479
+ MaximumRetryAttempts: isStreamSource ? mapping.maximumRetryAttempts : undefined,
480
+ DestinationConfig: destinationConfig,
481
+ MaximumBatchingWindowInSeconds: mapping.maximumBatchingWindowInSeconds,
482
+ FunctionResponseTypes: mapping.functionResponseTypes,
483
+ FilterCriteria: mapping.filterCriteria,
437
484
  }));
438
485
  console.log(` ✓ Created event source mapping: ${actualFunctionName} <- ${mapping.eventSourceArn}`);
439
486
  }
@@ -449,10 +496,25 @@ export const handler = async (event, context) => {
449
496
  async ensureLambdaProxyExists(serviceName, proxyName, invokeName, invokeUrl) {
450
497
  try {
451
498
  // Check if function already exists
452
- await this.lambdaClient.send(new GetFunctionCommand({
499
+ const existing = await this.lambdaClient.send(new GetFunctionCommand({
453
500
  FunctionName: proxyName,
454
501
  }));
455
- // Function exists, no need to create
502
+ // A proxy survives across registrations, but the orchestrator's ports may
503
+ // not (project port renumbering, invokeHost change). Re-point a stale
504
+ // proxy instead of leaving it calling the old URL forever.
505
+ const currentUrl = existing.Configuration?.Environment?.Variables?.INVOKE_URL;
506
+ if (invokeUrl && currentUrl !== invokeUrl) {
507
+ await this.lambdaClient.send(new UpdateFunctionConfigurationCommand({
508
+ FunctionName: proxyName,
509
+ Environment: {
510
+ Variables: {
511
+ INVOKE_URL: invokeUrl,
512
+ FUNCTION_NAME: invokeName,
513
+ },
514
+ },
515
+ }));
516
+ console.log(` ✓ Updated Lambda proxy INVOKE_URL: ${proxyName} -> ${invokeUrl}`);
517
+ }
456
518
  return;
457
519
  }
458
520
  catch (error) {