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,230 @@
1
+ // Lambda runtime worker — one forked process per registered service. Loads
2
+ // handlers (compiled artifact or source, JS or TS) on demand, executes them with
3
+ // a Lambda-shaped context/timeout, and reports results over IPC. Keeping this in
4
+ // a child process isolates handler env vars and crashes from the orchestrator,
5
+ // while module caching between invocations gives "warm start" behavior.
6
+ import path from 'path';
7
+ import fs from 'fs';
8
+ import util from 'util';
9
+ import { createRequire } from 'module';
10
+ import { pathToFileURL } from 'url';
11
+ import { AsyncLocalStorage } from 'async_hooks';
12
+ import crypto from 'crypto';
13
+ const handlerCache = new Map();
14
+ const logStorage = new AsyncLocalStorage();
15
+ let tsLoaderRegistered = false;
16
+ // Capture console output per invocation without breaking interleaved async
17
+ // handlers — AsyncLocalStorage routes each log line to the invocation that
18
+ // emitted it.
19
+ for (const level of ['log', 'info', 'warn', 'error', 'debug']) {
20
+ const original = console[level].bind(console);
21
+ console[level] = (...args) => {
22
+ const sink = logStorage.getStore();
23
+ if (sink) {
24
+ sink.push(`${level.toUpperCase()} ${util.format(...args)}`);
25
+ }
26
+ original(...args);
27
+ };
28
+ }
29
+ function resolveHandlerFile(root, filePart) {
30
+ const base = path.resolve(root, filePart);
31
+ const extensions = ['.js', '.cjs', '.mjs', '.ts', '.cts', '.mts'];
32
+ for (const ext of extensions) {
33
+ if (fs.existsSync(base + ext))
34
+ return base + ext;
35
+ }
36
+ // Handler may point at a directory with an index file.
37
+ for (const ext of extensions) {
38
+ const indexFile = path.join(base, `index${ext}`);
39
+ if (fs.existsSync(indexFile))
40
+ return indexFile;
41
+ }
42
+ return null;
43
+ }
44
+ function hasNativeTypeScriptSupport() {
45
+ return Boolean(process.features.typescript);
46
+ }
47
+ async function tryNativeTypeScriptImport(file) {
48
+ if (!hasNativeTypeScriptSupport())
49
+ return null;
50
+ try {
51
+ return (await import(pathToFileURL(file).href));
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ // Register a TypeScript require hook, resolving the loader from the service's
58
+ // own node_modules first (its version wins), then from LSS's dependencies.
59
+ function ensureTsLoader(serviceRoot) {
60
+ if (tsLoaderRegistered)
61
+ return;
62
+ const resolvers = [
63
+ createRequire(path.join(serviceRoot, 'noop.js')),
64
+ createRequire(import.meta.url),
65
+ ];
66
+ const candidates = [
67
+ { id: 'esbuild-register/dist/node', register: true },
68
+ { id: 'tsx/cjs', register: false },
69
+ { id: 'ts-node/register/transpile-only', register: false },
70
+ ];
71
+ for (const resolver of resolvers) {
72
+ for (const candidate of candidates) {
73
+ try {
74
+ const mod = resolver(candidate.id);
75
+ if (candidate.register && typeof mod.register === 'function') {
76
+ mod.register();
77
+ }
78
+ tsLoaderRegistered = true;
79
+ return;
80
+ }
81
+ catch {
82
+ // Try the next loader/resolver.
83
+ }
84
+ }
85
+ }
86
+ throw new Error('TypeScript handler found but no TS loader is available. Install "esbuild-register" (or tsx/ts-node) ' +
87
+ 'in the service, or use execution mode "artifact" so LSS loads the compiled bundle instead.');
88
+ }
89
+ async function loadHandler(msg) {
90
+ const cacheKey = `${msg.handlerRoot}::${msg.handler}`;
91
+ const cached = handlerCache.get(cacheKey);
92
+ if (cached)
93
+ return cached;
94
+ const lastDot = msg.handler.lastIndexOf('.');
95
+ if (lastDot <= 0) {
96
+ throw new Error(`Invalid handler reference "${msg.handler}" (expected "path/to/file.exportName")`);
97
+ }
98
+ const filePart = msg.handler.slice(0, lastDot);
99
+ const exportName = msg.handler.slice(lastDot + 1);
100
+ const file = resolveHandlerFile(msg.handlerRoot, filePart);
101
+ if (!file) {
102
+ throw new Error(`Handler file not found for "${msg.handler}" under ${msg.handlerRoot}`);
103
+ }
104
+ let mod = null;
105
+ if (/\.(ts|cts|mts)$/.test(file)) {
106
+ // Node 22.6+/24 can strip TS types natively when process.features.typescript
107
+ // is enabled. Prefer that path before requiring service-side loader deps.
108
+ mod = await tryNativeTypeScriptImport(file);
109
+ if (!mod) {
110
+ ensureTsLoader(msg.serviceRoot);
111
+ }
112
+ }
113
+ // Resolve like a module sitting inside the service, so relative requires and
114
+ // the service's node_modules work; fall back to dynamic import for ESM files.
115
+ const serviceRequire = createRequire(path.join(msg.handlerRoot, 'noop.js'));
116
+ if (!mod) {
117
+ try {
118
+ mod = serviceRequire(file);
119
+ }
120
+ catch (err) {
121
+ const code = err?.code;
122
+ if (code === 'ERR_REQUIRE_ESM' || /\.mjs$/.test(file)) {
123
+ mod = (await import(pathToFileURL(file).href));
124
+ }
125
+ else {
126
+ throw err;
127
+ }
128
+ }
129
+ }
130
+ if (!mod) {
131
+ throw new Error(`Handler module failed to load from ${file}`);
132
+ }
133
+ const candidate = mod[exportName]
134
+ ?? mod.default?.[exportName];
135
+ if (typeof candidate !== 'function') {
136
+ throw new Error(`Export "${exportName}" not found (or not a function) in ${file}`);
137
+ }
138
+ const handler = candidate;
139
+ handlerCache.set(cacheKey, handler);
140
+ return handler;
141
+ }
142
+ function buildContext(msg, deadline, requestId) {
143
+ return {
144
+ functionName: msg.fullName,
145
+ functionVersion: '$LATEST',
146
+ invokedFunctionArn: `arn:aws:lambda:${msg.region}:000000000000:function:${msg.fullName}`,
147
+ memoryLimitInMB: String(msg.memorySize),
148
+ awsRequestId: requestId,
149
+ logGroupName: `/aws/lambda/${msg.fullName}`,
150
+ logStreamName: `${new Date().toISOString().slice(0, 10)}/[$LATEST]${requestId}`,
151
+ callbackWaitsForEmptyEventLoop: true,
152
+ getRemainingTimeInMillis: () => Math.max(0, deadline - Date.now()),
153
+ };
154
+ }
155
+ async function runHandler(handler, event, context) {
156
+ if (handler.length >= 3) {
157
+ return new Promise((resolve, reject) => {
158
+ const maybe = handler(event, context, (err, res) => (err ? reject(err) : resolve(res)));
159
+ if (maybe && typeof maybe.then === 'function') {
160
+ maybe.then(resolve, reject);
161
+ }
162
+ });
163
+ }
164
+ return handler(event, context);
165
+ }
166
+ async function handleInvoke(msg) {
167
+ const logs = [];
168
+ const startedAt = Date.now();
169
+ const requestId = crypto.randomUUID();
170
+ const deadline = startedAt + msg.timeoutSeconds * 1000;
171
+ // Function env is applied to the shared process env (functions of one service
172
+ // share a worker, mirroring how serverless-offline behaves).
173
+ Object.assign(process.env, msg.env, {
174
+ AWS_REGION: msg.region,
175
+ AWS_DEFAULT_REGION: msg.region,
176
+ AWS_LAMBDA_FUNCTION_NAME: msg.fullName,
177
+ AWS_LAMBDA_FUNCTION_MEMORY_SIZE: String(msg.memorySize),
178
+ });
179
+ if (!process.env.AWS_ACCESS_KEY_ID)
180
+ process.env.AWS_ACCESS_KEY_ID = 'test';
181
+ if (!process.env.AWS_SECRET_ACCESS_KEY)
182
+ process.env.AWS_SECRET_ACCESS_KEY = 'test';
183
+ const reply = (result) => {
184
+ const message = {
185
+ type: 'result',
186
+ invokeId: msg.invokeId,
187
+ logs,
188
+ durationMs: Date.now() - startedAt,
189
+ ...result,
190
+ };
191
+ process.send?.(message);
192
+ };
193
+ try {
194
+ const handler = await loadHandler(msg);
195
+ const context = buildContext(msg, deadline, requestId);
196
+ const timeout = new Promise((_, reject) => {
197
+ const timer = setTimeout(() => {
198
+ reject(Object.assign(new Error(`${new Date().toISOString()} ${requestId} Task timed out after ${msg.timeoutSeconds.toFixed(2)} seconds`), {
199
+ name: 'TimeoutError',
200
+ }));
201
+ }, deadline - Date.now());
202
+ timer.unref();
203
+ });
204
+ const payload = await logStorage.run(logs, () => Promise.race([runHandler(handler, msg.event, context), timeout]));
205
+ reply({ ok: true, payload: payload === undefined ? null : payload });
206
+ }
207
+ catch (err) {
208
+ const error = err instanceof Error ? err : new Error(String(err));
209
+ reply({
210
+ ok: false,
211
+ error: {
212
+ errorType: error.name || 'Error',
213
+ errorMessage: error.message,
214
+ trace: error.stack ? error.stack.split('\n') : undefined,
215
+ },
216
+ });
217
+ }
218
+ }
219
+ process.on('message', (msg) => {
220
+ if (msg && msg.type === 'invoke') {
221
+ void handleInvoke(msg);
222
+ }
223
+ });
224
+ // A handler's stray rejection must not kill the worker (and every in-flight
225
+ // invocation with it).
226
+ process.on('unhandledRejection', (reason) => {
227
+ console.error('Unhandled rejection in lambda worker:', reason);
228
+ });
229
+ process.send?.({ type: 'ready' });
230
+ //# sourceMappingURL=runtime-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-worker.js","sourceRoot":"","sources":["../../../src/server/runtime/runtime-worker.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,iFAAiF;AACjF,iFAAiF;AACjF,+EAA+E;AAC/E,wEAAwE;AAExE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,MAAM,MAAM,QAAQ,CAAC;AA6B5B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;AAClD,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAY,CAAC;AACrD,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,2EAA2E;AAC3E,2EAA2E;AAC3E,cAAc;AACd,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,GAAG,GAAG,CAAC;IACnD,CAAC;IACD,uDAAuD;IACvD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,0BAA0B;IACjC,OAAO,OAAO,CAAE,OAAO,CAAC,QAA8D,CAAC,UAAU,CAAC,CAAC;AACrG,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,IAAY;IACnD,IAAI,CAAC,0BAA0B,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,SAAS,cAAc,CAAC,WAAmB;IACzC,IAAI,kBAAkB;QAAE,OAAO;IAC/B,MAAM,SAAS,GAAG;QAChB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAChD,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;KAC/B,CAAC;IACF,MAAM,UAAU,GAAG;QACjB,EAAE,EAAE,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;QACpD,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;QAClC,EAAE,EAAE,EAAE,iCAAiC,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC3D,CAAC;IACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,SAAS,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;oBAC7D,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,CAAC;gBACD,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,OAAO;YACT,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,sGAAsG;QACtG,4FAA4F,CAC7F,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAkB;IAC3C,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,wCAAwC,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAElD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,WAAW,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,GAAG,GAAmC,IAAI,CAAC;IAC/C,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,6EAA6E;QAC7E,0EAA0E;QAC1E,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC;YACH,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAA6B,EAAE,IAAI,CAAC;YAClD,IAAI,IAAI,KAAK,iBAAiB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC;WAC3B,GAAG,CAAC,OAA+C,EAAE,CAAC,UAAU,CAAC,CAAC;IACxE,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,sCAAsC,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,OAAO,GAAG,SAAsB,CAAC;IACvC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,GAAkB,EAAE,QAAgB,EAAE,SAAiB;IAC3E,OAAO;QACL,YAAY,EAAE,GAAG,CAAC,QAAQ;QAC1B,eAAe,EAAE,SAAS;QAC1B,kBAAkB,EAAE,kBAAkB,GAAG,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE;QACxF,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;QACvC,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,eAAe,GAAG,CAAC,QAAQ,EAAE;QAC3C,aAAa,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,SAAS,EAAE;QAC/E,8BAA8B,EAAE,IAAI;QACpC,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAkB,EAAE,KAAc,EAAE,OAAgB;IAC5E,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxF,IAAI,KAAK,IAAI,OAAQ,KAA0B,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACnE,KAA0B,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAkB;IAC5C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;IAEvD,8EAA8E;IAC9E,6DAA6D;IAC7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;QAClC,UAAU,EAAE,GAAG,CAAC,MAAM;QACtB,kBAAkB,EAAE,GAAG,CAAC,MAAM;QAC9B,wBAAwB,EAAE,GAAG,CAAC,QAAQ;QACtC,+BAA+B,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KACxD,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;IAC3E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB;QAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,MAAM,CAAC;IAEnF,MAAM,KAAK,GAAG,CAAC,MAAwE,EAAE,EAAE;QACzF,MAAM,OAAO,GAAkB;YAC7B,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,GAAG,MAAM;SACV,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,SAAS,yBAAyB,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;oBACxI,IAAI,EAAE,cAAc;iBACrB,CAAC,CAAC,CAAC;YACN,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACnH,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC;YACJ,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;gBAChC,YAAY,EAAE,KAAK,CAAC,OAAO;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aACzD;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAkB,EAAE,EAAE;IAC3C,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,4EAA4E;AAC5E,uBAAuB;AACvB,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { HttpRoute } from './serverless-state-parser.js';
2
+ export interface IncomingRequest {
3
+ method: string;
4
+ path: string;
5
+ rawQueryString: string;
6
+ headers: Record<string, string | string[] | undefined>;
7
+ body: Buffer | null;
8
+ sourceIp: string;
9
+ }
10
+ export interface RouteMatch {
11
+ route: HttpRoute;
12
+ pathParameters: Record<string, string> | null;
13
+ }
14
+ export declare function matchRoute(routes: HttpRoute[], method: string, requestPath: string): RouteMatch | null;
15
+ interface BodyInfo {
16
+ body: string | null;
17
+ isBase64Encoded: boolean;
18
+ }
19
+ export declare function encodeBody(body: Buffer | null, contentType: string | undefined): BodyInfo;
20
+ export interface AuthorizerOutput {
21
+ principalId?: string;
22
+ context?: Record<string, unknown>;
23
+ }
24
+ export interface EventOptions {
25
+ request: IncomingRequest;
26
+ route: HttpRoute;
27
+ pathParameters: Record<string, string> | null;
28
+ stage: string;
29
+ authorizer?: AuthorizerOutput;
30
+ requestId?: string;
31
+ }
32
+ export declare function buildV1Event(options: EventOptions): Record<string, unknown>;
33
+ export declare function buildV2Event(options: EventOptions): Record<string, unknown>;
34
+ export interface MappedResponse {
35
+ statusCode: number;
36
+ headers: Record<string, string>;
37
+ cookies: string[];
38
+ body: Buffer;
39
+ }
40
+ export declare function mapV1Response(payload: unknown): MappedResponse;
41
+ export declare function mapV2Response(payload: unknown): MappedResponse;
42
+ export declare function errorResponse(statusCode: number, message: string): MappedResponse;
43
+ export {};
44
+ //# sourceMappingURL=api-gateway-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-gateway-events.d.ts","sourceRoot":"","sources":["../../../src/server/services/api-gateway-events.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC/C;AAQD,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA+BtG;AA6CD,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAOzF;AA8CD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8C3E;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8C3E;AAgBD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAcD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAe9D;AAID,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAyB9D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAOjF"}
@@ -0,0 +1,299 @@
1
+ // Pure helpers for the gateway proxy: route matching, API Gateway event
2
+ // construction (REST v1.0 and HTTP API v2.0 payloads) and Lambda-result →
3
+ // HTTP-response mapping. No I/O here so every AWS-semantics edge case is
4
+ // unit-testable against real captured payloads.
5
+ import crypto from 'crypto';
6
+ // ---------------------------------------------------------------------------
7
+ // Route matching
8
+ // ---------------------------------------------------------------------------
9
+ // Literal segments beat {param} segments, which beat {proxy+}; the httpApi
10
+ // $default route is the catch-all of last resort. An exact method beats ANY.
11
+ export function matchRoute(routes, method, requestPath) {
12
+ const upperMethod = method.toUpperCase();
13
+ const requestSegments = splitPath(requestPath);
14
+ let best = null;
15
+ for (const route of routes) {
16
+ if (route.method !== 'ANY' && route.method !== upperMethod)
17
+ continue;
18
+ let score;
19
+ let pathParameters;
20
+ if (route.path === '$default') {
21
+ score = 0;
22
+ pathParameters = null;
23
+ }
24
+ else {
25
+ const result = matchSegments(splitPath(route.path), requestSegments);
26
+ if (!result)
27
+ continue;
28
+ score = result.score;
29
+ pathParameters = Object.keys(result.params).length ? result.params : null;
30
+ }
31
+ // Method specificity is the tie-breaker between equally specific paths.
32
+ if (route.method !== 'ANY')
33
+ score += 1;
34
+ if (!best || score > best.score) {
35
+ best = { match: { route, pathParameters }, score };
36
+ }
37
+ }
38
+ return best?.match ?? null;
39
+ }
40
+ function splitPath(p) {
41
+ return p.split('/').filter(Boolean);
42
+ }
43
+ function matchSegments(routeSegments, requestSegments) {
44
+ const params = {};
45
+ let score = 0;
46
+ for (let i = 0; i < routeSegments.length; i++) {
47
+ const routeSeg = routeSegments[i];
48
+ const greedy = /^\{(.+)\+\}$/.exec(routeSeg);
49
+ if (greedy) {
50
+ const rest = requestSegments.slice(i);
51
+ if (rest.length === 0)
52
+ return null;
53
+ params[greedy[1]] = rest.join('/');
54
+ return { score: score + 1, params };
55
+ }
56
+ const reqSeg = requestSegments[i];
57
+ if (reqSeg === undefined)
58
+ return null;
59
+ const param = /^\{(.+)\}$/.exec(routeSeg);
60
+ if (param) {
61
+ params[param[1]] = decodeURIComponent(reqSeg);
62
+ score += 10;
63
+ }
64
+ else if (routeSeg === reqSeg) {
65
+ score += 100;
66
+ }
67
+ else {
68
+ return null;
69
+ }
70
+ }
71
+ if (requestSegments.length !== routeSegments.length)
72
+ return null;
73
+ return { score, params };
74
+ }
75
+ const TEXTUAL_CONTENT = /^(text\/|application\/(json|xml|javascript|x-www-form-urlencoded)|.*\+(json|xml)$)/i;
76
+ export function encodeBody(body, contentType) {
77
+ if (!body || body.length === 0)
78
+ return { body: null, isBase64Encoded: false };
79
+ const type = (contentType || '').split(';')[0].trim();
80
+ if (!type || TEXTUAL_CONTENT.test(type)) {
81
+ return { body: body.toString('utf-8'), isBase64Encoded: false };
82
+ }
83
+ return { body: body.toString('base64'), isBase64Encoded: true };
84
+ }
85
+ function headerValue(headers, name) {
86
+ const value = headers[name.toLowerCase()];
87
+ if (Array.isArray(value))
88
+ return value.join(',');
89
+ return value;
90
+ }
91
+ function singleValueHeaders(headers) {
92
+ const out = {};
93
+ for (const [key, value] of Object.entries(headers)) {
94
+ if (value === undefined)
95
+ continue;
96
+ out[key] = Array.isArray(value) ? value.join(',') : value;
97
+ }
98
+ return out;
99
+ }
100
+ function multiValueHeaders(headers) {
101
+ const out = {};
102
+ for (const [key, value] of Object.entries(headers)) {
103
+ if (value === undefined)
104
+ continue;
105
+ out[key] = Array.isArray(value) ? value : [value];
106
+ }
107
+ return out;
108
+ }
109
+ function parseQuery(rawQueryString) {
110
+ if (!rawQueryString)
111
+ return { single: null, multi: null };
112
+ const params = new URLSearchParams(rawQueryString);
113
+ const single = {};
114
+ const multi = {};
115
+ for (const key of new Set(params.keys())) {
116
+ const all = params.getAll(key);
117
+ single[key] = all[all.length - 1];
118
+ multi[key] = all;
119
+ }
120
+ return { single, multi };
121
+ }
122
+ // REST API (Lambda proxy integration, payload format 1.0).
123
+ export function buildV1Event(options) {
124
+ const { request, route, pathParameters, stage, authorizer } = options;
125
+ const requestId = options.requestId || crypto.randomUUID();
126
+ const { single, multi } = parseQuery(request.rawQueryString);
127
+ const { body, isBase64Encoded } = encodeBody(request.body, headerValue(request.headers, 'content-type'));
128
+ return {
129
+ resource: route.path,
130
+ path: request.path,
131
+ httpMethod: request.method.toUpperCase(),
132
+ headers: singleValueHeaders(request.headers),
133
+ multiValueHeaders: multiValueHeaders(request.headers),
134
+ queryStringParameters: single,
135
+ multiValueQueryStringParameters: multi,
136
+ pathParameters,
137
+ stageVariables: null,
138
+ requestContext: {
139
+ accountId: '000000000000',
140
+ apiId: 'lss-local',
141
+ protocol: 'HTTP/1.1',
142
+ httpMethod: request.method.toUpperCase(),
143
+ path: request.path,
144
+ resourcePath: route.path,
145
+ stage,
146
+ requestId,
147
+ requestTimeEpoch: Date.now(),
148
+ identity: {
149
+ sourceIp: request.sourceIp,
150
+ userAgent: headerValue(request.headers, 'user-agent') || null,
151
+ accountId: null,
152
+ apiKey: null,
153
+ caller: null,
154
+ cognitoAuthenticationProvider: null,
155
+ cognitoAuthenticationType: null,
156
+ cognitoIdentityId: null,
157
+ cognitoIdentityPoolId: null,
158
+ user: null,
159
+ userArn: null,
160
+ },
161
+ ...(authorizer
162
+ ? { authorizer: { principalId: authorizer.principalId, ...stringifyContext(authorizer.context) } }
163
+ : {}),
164
+ },
165
+ body,
166
+ isBase64Encoded,
167
+ };
168
+ }
169
+ // HTTP API (payload format 2.0).
170
+ export function buildV2Event(options) {
171
+ const { request, route, pathParameters, stage, authorizer } = options;
172
+ const requestId = options.requestId || crypto.randomUUID();
173
+ const { single } = parseQuery(request.rawQueryString);
174
+ const { body, isBase64Encoded } = encodeBody(request.body, headerValue(request.headers, 'content-type'));
175
+ const headers = singleValueHeaders(request.headers);
176
+ const cookies = multiValueHeaders(request.headers)['cookie']?.flatMap(c => c.split(/;\s*/)) ?? undefined;
177
+ delete headers['cookie'];
178
+ const routeKey = route.path === '$default' ? '$default' : `${route.method} ${route.path}`;
179
+ return {
180
+ version: '2.0',
181
+ routeKey,
182
+ rawPath: request.path,
183
+ rawQueryString: request.rawQueryString,
184
+ ...(cookies && cookies.length ? { cookies } : {}),
185
+ headers,
186
+ queryStringParameters: single ?? undefined,
187
+ pathParameters: pathParameters ?? undefined,
188
+ stageVariables: undefined,
189
+ requestContext: {
190
+ accountId: '000000000000',
191
+ apiId: 'lss-local',
192
+ domainName: headerValue(request.headers, 'host') || 'localhost',
193
+ domainPrefix: 'lss',
194
+ http: {
195
+ method: request.method.toUpperCase(),
196
+ path: request.path,
197
+ protocol: 'HTTP/1.1',
198
+ sourceIp: request.sourceIp,
199
+ userAgent: headerValue(request.headers, 'user-agent') || '',
200
+ },
201
+ requestId,
202
+ routeKey,
203
+ stage,
204
+ time: new Date().toISOString(),
205
+ timeEpoch: Date.now(),
206
+ ...(authorizer
207
+ ? { authorizer: { lambda: { principalId: authorizer.principalId, ...(authorizer.context || {}) } } }
208
+ : {}),
209
+ },
210
+ body: body ?? undefined,
211
+ isBase64Encoded,
212
+ };
213
+ }
214
+ // REST API authorizer context values are stringified by API Gateway.
215
+ function stringifyContext(context) {
216
+ const out = {};
217
+ for (const [key, value] of Object.entries(context || {})) {
218
+ if (value === undefined || value === null)
219
+ continue;
220
+ out[key] = typeof value === 'string' ? value : JSON.stringify(value);
221
+ }
222
+ return out;
223
+ }
224
+ // REST API: the handler must return a well-formed {statusCode,...}; anything
225
+ // else is a 502, matching API Gateway's "Internal server error" for malformed
226
+ // proxy responses.
227
+ export function mapV1Response(payload) {
228
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
229
+ return malformed();
230
+ }
231
+ const response = payload;
232
+ const statusCode = Number(response.statusCode);
233
+ if (!Number.isInteger(statusCode) || statusCode < 100 || statusCode > 599) {
234
+ return malformed();
235
+ }
236
+ return {
237
+ statusCode,
238
+ headers: collectHeaders(response),
239
+ cookies: [],
240
+ body: decodeHandlerBody(response),
241
+ };
242
+ }
243
+ // HTTP API: same shape accepted, but a bare return value is inferred as a 200
244
+ // JSON response.
245
+ export function mapV2Response(payload) {
246
+ if (payload && typeof payload === 'object' && !Array.isArray(payload) && 'statusCode' in payload) {
247
+ const response = payload;
248
+ const statusCode = Number(response.statusCode);
249
+ if (!Number.isInteger(statusCode) || statusCode < 100 || statusCode > 599) {
250
+ return malformed();
251
+ }
252
+ return {
253
+ statusCode,
254
+ headers: collectHeaders(response),
255
+ cookies: (response.cookies || []).map(String),
256
+ body: decodeHandlerBody(response),
257
+ };
258
+ }
259
+ // Inferred response.
260
+ const body = payload === undefined || payload === null
261
+ ? ''
262
+ : typeof payload === 'string' ? payload : JSON.stringify(payload);
263
+ return {
264
+ statusCode: 200,
265
+ headers: { 'content-type': 'application/json' },
266
+ cookies: [],
267
+ body: Buffer.from(body, 'utf-8'),
268
+ };
269
+ }
270
+ export function errorResponse(statusCode, message) {
271
+ return {
272
+ statusCode,
273
+ headers: { 'content-type': 'application/json' },
274
+ cookies: [],
275
+ body: Buffer.from(JSON.stringify({ message }), 'utf-8'),
276
+ };
277
+ }
278
+ function malformed() {
279
+ return errorResponse(502, 'Internal server error');
280
+ }
281
+ function collectHeaders(response) {
282
+ const headers = {};
283
+ for (const [key, value] of Object.entries(response.multiValueHeaders || {})) {
284
+ headers[key.toLowerCase()] = value.map(String).join(',');
285
+ }
286
+ for (const [key, value] of Object.entries(response.headers || {})) {
287
+ if (value === undefined || value === null)
288
+ continue;
289
+ headers[key.toLowerCase()] = String(value);
290
+ }
291
+ return headers;
292
+ }
293
+ function decodeHandlerBody(response) {
294
+ if (response.body === undefined || response.body === null)
295
+ return Buffer.alloc(0);
296
+ const text = typeof response.body === 'string' ? response.body : JSON.stringify(response.body);
297
+ return response.isBase64Encoded === true ? Buffer.from(text, 'base64') : Buffer.from(text, 'utf-8');
298
+ }
299
+ //# sourceMappingURL=api-gateway-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-gateway-events.js","sourceRoot":"","sources":["../../../src/server/services/api-gateway-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveArtifacts(root: string, declared: Array<string | undefined>): string[];
2
+ //# sourceMappingURL=artifact-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-resolver.d.ts","sourceRoot":"","sources":["../../../src/server/services/artifact-resolver.ts"],"names":[],"mappings":"AAaA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAsB5F"}
@@ -0,0 +1,38 @@
1
+ // Resolves which packaged artifact zips a service registration points at.
2
+ // Split out of LambdaRuntimeManager so the path-resolution rules are unit-testable
3
+ // (the manager itself is integration-only: it forks workers and uses import.meta).
4
+ import path from 'path';
5
+ import fs from 'fs';
6
+ // `package.artifact` in serverless-state.json arrives in three shapes:
7
+ // absolute, relative to `.serverless/` (what serverless v3 / osls v4 write —
8
+ // e.g. "my-service.zip" for a zip at `<root>/.serverless/my-service.zip`), or
9
+ // relative to the service root (legacy). For each declared artifact keep the
10
+ // first interpretation that exists on disk; when none of the declared artifacts
11
+ // resolve, fall back to scanning `.serverless/*.zip`.
12
+ export function resolveArtifacts(root, declared) {
13
+ const existing = new Set();
14
+ for (const artifact of declared) {
15
+ if (!artifact)
16
+ continue;
17
+ const interpretations = path.isAbsolute(artifact)
18
+ ? [artifact]
19
+ : [path.resolve(root, '.serverless', artifact), path.resolve(root, artifact)];
20
+ const found = interpretations.find(p => fs.existsSync(p));
21
+ if (found)
22
+ existing.add(found);
23
+ }
24
+ if (existing.size > 0)
25
+ return [...existing];
26
+ const serverlessDir = path.join(root, '.serverless');
27
+ try {
28
+ return fs
29
+ .readdirSync(serverlessDir)
30
+ .filter(file => file.endsWith('.zip'))
31
+ .map(file => path.join(serverlessDir, file));
32
+ }
33
+ catch {
34
+ // No .serverless dir — the caller falls back to source mode.
35
+ return [];
36
+ }
37
+ }
38
+ //# sourceMappingURL=artifact-resolver.js.map