@jaypie/express 1.2.25 → 1.2.27
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/dist/cjs/index.cjs +10 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +458 -0
- package/dist/cjs/{constants.d.ts → src/constants.d.ts} +1 -1
- package/dist/esm/index.d.ts +458 -13
- package/dist/esm/index.js +10 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{constants.d.ts → src/constants.d.ts} +1 -1
- package/dist/esm/src/index.d.ts +13 -0
- package/package.json +18 -6
- /package/dist/cjs/{adapter → src/adapter}/LambdaRequest.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/LambdaResponseBuffered.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/LambdaResponseStreaming.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/__tests__/LambdaRequest.spec.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/__tests__/LambdaResponseBuffered.spec.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/__tests__/LambdaResponseStreaming.spec.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/__tests__/debug-harness.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/__tests__/integration.spec.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/index.d.ts +0 -0
- /package/dist/cjs/{adapter → src/adapter}/types.d.ts +0 -0
- /package/dist/cjs/{cors.helper.d.ts → src/cors.helper.d.ts} +0 -0
- /package/dist/cjs/{decorateResponse.helper.d.ts → src/decorateResponse.helper.d.ts} +0 -0
- /package/dist/cjs/{echo.handler.d.ts → src/echo.handler.d.ts} +0 -0
- /package/dist/cjs/{expressHandler.d.ts → src/expressHandler.d.ts} +0 -0
- /package/dist/cjs/{expressStreamHandler.d.ts → src/expressStreamHandler.d.ts} +0 -0
- /package/dist/cjs/{fabricApiResponse.d.ts → src/fabricApiResponse.d.ts} +0 -0
- /package/dist/cjs/{getCurrentInvokeUuid.adapter.d.ts → src/getCurrentInvokeUuid.adapter.d.ts} +0 -0
- /package/dist/cjs/{http.handler.d.ts → src/http.handler.d.ts} +0 -0
- /package/dist/cjs/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/cjs/{routes.d.ts → src/routes.d.ts} +0 -0
- /package/dist/cjs/{summarizeRequest.helper.d.ts → src/summarizeRequest.helper.d.ts} +0 -0
- /package/dist/cjs/{summarizeResponse.helper.d.ts → src/summarizeResponse.helper.d.ts} +0 -0
- /package/dist/esm/{adapter → src/adapter}/LambdaRequest.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/LambdaResponseBuffered.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/LambdaResponseStreaming.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/__tests__/LambdaRequest.spec.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/__tests__/LambdaResponseBuffered.spec.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/__tests__/LambdaResponseStreaming.spec.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/__tests__/debug-harness.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/__tests__/integration.spec.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/index.d.ts +0 -0
- /package/dist/esm/{adapter → src/adapter}/types.d.ts +0 -0
- /package/dist/esm/{cors.helper.d.ts → src/cors.helper.d.ts} +0 -0
- /package/dist/esm/{decorateResponse.helper.d.ts → src/decorateResponse.helper.d.ts} +0 -0
- /package/dist/esm/{echo.handler.d.ts → src/echo.handler.d.ts} +0 -0
- /package/dist/esm/{expressHandler.d.ts → src/expressHandler.d.ts} +0 -0
- /package/dist/esm/{expressStreamHandler.d.ts → src/expressStreamHandler.d.ts} +0 -0
- /package/dist/esm/{fabricApiResponse.d.ts → src/fabricApiResponse.d.ts} +0 -0
- /package/dist/esm/{getCurrentInvokeUuid.adapter.d.ts → src/getCurrentInvokeUuid.adapter.d.ts} +0 -0
- /package/dist/esm/{http.handler.d.ts → src/http.handler.d.ts} +0 -0
- /package/dist/esm/{routes.d.ts → src/routes.d.ts} +0 -0
- /package/dist/esm/{summarizeRequest.helper.d.ts → src/summarizeRequest.helper.d.ts} +0 -0
- /package/dist/esm/{summarizeResponse.helper.d.ts → src/summarizeResponse.helper.d.ts} +0 -0
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,13 +1,458 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import * as express from 'express';
|
|
2
|
+
import { Application, Request, Response, NextFunction } from 'express';
|
|
3
|
+
import { StreamFormat } from '@jaypie/aws';
|
|
4
|
+
import { IncomingHttpHeaders, OutgoingHttpHeaders } from 'node:http';
|
|
5
|
+
import { Readable, Writable } from 'node:stream';
|
|
6
|
+
|
|
7
|
+
interface LambdaContext {
|
|
8
|
+
awsRequestId: string;
|
|
9
|
+
callbackWaitsForEmptyEventLoop?: boolean;
|
|
10
|
+
functionName?: string;
|
|
11
|
+
functionVersion?: string;
|
|
12
|
+
invokedFunctionArn?: string;
|
|
13
|
+
logGroupName?: string;
|
|
14
|
+
logStreamName?: string;
|
|
15
|
+
memoryLimitInMB?: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface ApiGatewayV1Event {
|
|
19
|
+
body?: string | null;
|
|
20
|
+
headers: Record<string, string>;
|
|
21
|
+
httpMethod: string;
|
|
22
|
+
isBase64Encoded: boolean;
|
|
23
|
+
multiValueHeaders?: Record<string, string[]>;
|
|
24
|
+
multiValueQueryStringParameters?: Record<string, string[]> | null;
|
|
25
|
+
path: string;
|
|
26
|
+
pathParameters?: Record<string, string> | null;
|
|
27
|
+
queryStringParameters?: Record<string, string> | null;
|
|
28
|
+
requestContext: {
|
|
29
|
+
accountId: string;
|
|
30
|
+
apiId: string;
|
|
31
|
+
domainName?: string;
|
|
32
|
+
httpMethod: string;
|
|
33
|
+
identity: {
|
|
34
|
+
sourceIp: string;
|
|
35
|
+
userAgent?: string;
|
|
36
|
+
};
|
|
37
|
+
path: string;
|
|
38
|
+
protocol: string;
|
|
39
|
+
requestId: string;
|
|
40
|
+
requestTime?: string;
|
|
41
|
+
requestTimeEpoch?: number;
|
|
42
|
+
resourceId?: string;
|
|
43
|
+
resourcePath?: string;
|
|
44
|
+
stage: string;
|
|
45
|
+
};
|
|
46
|
+
resource?: string;
|
|
47
|
+
stageVariables?: Record<string, string> | null;
|
|
48
|
+
}
|
|
49
|
+
interface FunctionUrlEvent {
|
|
50
|
+
body?: string;
|
|
51
|
+
cookies?: string[];
|
|
52
|
+
headers: Record<string, string>;
|
|
53
|
+
isBase64Encoded: boolean;
|
|
54
|
+
rawPath: string;
|
|
55
|
+
rawQueryString: string;
|
|
56
|
+
requestContext: {
|
|
57
|
+
accountId: string;
|
|
58
|
+
apiId: string;
|
|
59
|
+
domainName: string;
|
|
60
|
+
domainPrefix: string;
|
|
61
|
+
http: {
|
|
62
|
+
method: string;
|
|
63
|
+
path: string;
|
|
64
|
+
protocol: string;
|
|
65
|
+
sourceIp: string;
|
|
66
|
+
userAgent: string;
|
|
67
|
+
};
|
|
68
|
+
requestId: string;
|
|
69
|
+
routeKey: string;
|
|
70
|
+
stage: string;
|
|
71
|
+
time: string;
|
|
72
|
+
timeEpoch: number;
|
|
73
|
+
};
|
|
74
|
+
routeKey: string;
|
|
75
|
+
version: "2.0";
|
|
76
|
+
}
|
|
77
|
+
type LambdaEvent = ApiGatewayV1Event | FunctionUrlEvent;
|
|
78
|
+
interface LambdaResponse {
|
|
79
|
+
body: string;
|
|
80
|
+
cookies?: string[];
|
|
81
|
+
headers: Record<string, string>;
|
|
82
|
+
isBase64Encoded: boolean;
|
|
83
|
+
statusCode: number;
|
|
84
|
+
}
|
|
85
|
+
interface ResponseStream {
|
|
86
|
+
end(): void;
|
|
87
|
+
write(chunk: string | Uint8Array): void;
|
|
88
|
+
}
|
|
89
|
+
type LambdaHandler = (event: LambdaEvent, context: LambdaContext) => Promise<LambdaResponse>;
|
|
90
|
+
type LambdaStreamHandler = (event: LambdaEvent, context: LambdaContext) => Promise<void>;
|
|
91
|
+
type CreateLambdaHandlerOptions = {
|
|
92
|
+
/**
|
|
93
|
+
* Optional name for logging and debugging
|
|
94
|
+
*/
|
|
95
|
+
name?: string;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
interface LambdaRequestOptions {
|
|
99
|
+
body?: Buffer | null;
|
|
100
|
+
headers: Record<string, string>;
|
|
101
|
+
lambdaContext: LambdaContext;
|
|
102
|
+
lambdaEvent: LambdaEvent;
|
|
103
|
+
method: string;
|
|
104
|
+
protocol: string;
|
|
105
|
+
query?: Record<string, string | string[]>;
|
|
106
|
+
remoteAddress: string;
|
|
107
|
+
url: string;
|
|
108
|
+
}
|
|
109
|
+
interface MockSocket {
|
|
110
|
+
destroy: () => void;
|
|
111
|
+
encrypted: boolean;
|
|
112
|
+
remoteAddress: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Mock IncomingMessage that extends Readable stream.
|
|
116
|
+
* Provides Express-compatible request interface from Lambda Function URL events.
|
|
117
|
+
*/
|
|
118
|
+
declare class LambdaRequest extends Readable {
|
|
119
|
+
readonly method: string;
|
|
120
|
+
readonly url: string;
|
|
121
|
+
readonly headers: IncomingHttpHeaders;
|
|
122
|
+
readonly httpVersion: string;
|
|
123
|
+
readonly httpVersionMajor: number;
|
|
124
|
+
readonly httpVersionMinor: number;
|
|
125
|
+
complete: boolean;
|
|
126
|
+
readonly socket: MockSocket;
|
|
127
|
+
readonly connection: MockSocket;
|
|
128
|
+
readonly originalUrl: string;
|
|
129
|
+
readonly path: string;
|
|
130
|
+
baseUrl: string;
|
|
131
|
+
body: unknown;
|
|
132
|
+
params: Record<string, string>;
|
|
133
|
+
query: Record<string, unknown>;
|
|
134
|
+
readonly rawBody: string | undefined;
|
|
135
|
+
readonly _lambdaContext: LambdaContext;
|
|
136
|
+
readonly _lambdaEvent: LambdaEvent;
|
|
137
|
+
private bodyBuffer;
|
|
138
|
+
private bodyPushed;
|
|
139
|
+
constructor(options: LambdaRequestOptions);
|
|
140
|
+
_read(): void;
|
|
141
|
+
get(headerName: string): string | undefined;
|
|
142
|
+
header(headerName: string): string | undefined;
|
|
143
|
+
private normalizeHeaders;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Mock ServerResponse that buffers the response.
|
|
148
|
+
* Collects status, headers, and body chunks, then returns a Lambda response.
|
|
149
|
+
*/
|
|
150
|
+
declare class LambdaResponseBuffered extends Writable {
|
|
151
|
+
statusCode: number;
|
|
152
|
+
statusMessage: string;
|
|
153
|
+
readonly socket: {
|
|
154
|
+
remoteAddress: string;
|
|
155
|
+
};
|
|
156
|
+
_chunks: Buffer[];
|
|
157
|
+
_ended: boolean;
|
|
158
|
+
_headers: Map<string, string | string[]>;
|
|
159
|
+
_headersSent: boolean;
|
|
160
|
+
_resolve: ((result: LambdaResponse) => void) | null;
|
|
161
|
+
constructor();
|
|
162
|
+
_internalGetHeader(name: string): string | undefined;
|
|
163
|
+
_internalSetHeader(name: string, value: string): void;
|
|
164
|
+
_internalHasHeader(name: string): boolean;
|
|
165
|
+
_internalRemoveHeader(name: string): void;
|
|
166
|
+
getResult(): Promise<LambdaResponse>;
|
|
167
|
+
setHeader(name: string, value: number | string | string[]): this;
|
|
168
|
+
getHeader(name: string): number | string | string[] | undefined;
|
|
169
|
+
removeHeader(name: string): void;
|
|
170
|
+
getHeaders(): OutgoingHttpHeaders;
|
|
171
|
+
hasHeader(name: string): boolean;
|
|
172
|
+
getHeaderNames(): string[];
|
|
173
|
+
/**
|
|
174
|
+
* Proxy for direct header access (e.g., res.headers['content-type']).
|
|
175
|
+
* Required for compatibility with middleware like helmet that access headers directly.
|
|
176
|
+
* Uses direct _headers access to bypass dd-trace interception.
|
|
177
|
+
*/
|
|
178
|
+
get headers(): Record<string, string | string[] | undefined>;
|
|
179
|
+
writeHead(statusCode: number, statusMessageOrHeaders?: OutgoingHttpHeaders | string, headers?: OutgoingHttpHeaders): this;
|
|
180
|
+
get headersSent(): boolean;
|
|
181
|
+
/**
|
|
182
|
+
* Express-style alias for getHeader().
|
|
183
|
+
* Used by middleware like decorateResponse that use res.get().
|
|
184
|
+
* Note: Directly accesses _headers to avoid prototype chain issues with bundled code.
|
|
185
|
+
*/
|
|
186
|
+
get(name: string): number | string | string[] | undefined;
|
|
187
|
+
/**
|
|
188
|
+
* Express-style alias for setHeader().
|
|
189
|
+
* Used by middleware like decorateResponse that use res.set().
|
|
190
|
+
* Note: Directly accesses _headers to avoid prototype chain issues with bundled code.
|
|
191
|
+
*/
|
|
192
|
+
set(name: string, value: number | string | string[]): this;
|
|
193
|
+
status(code: number): this;
|
|
194
|
+
json(data: unknown): this;
|
|
195
|
+
send(body?: Buffer | object | string): this;
|
|
196
|
+
/**
|
|
197
|
+
* Add a field to the Vary response header.
|
|
198
|
+
* Used by CORS middleware to indicate response varies by Origin.
|
|
199
|
+
* Uses direct _headers access to bypass dd-trace interception.
|
|
200
|
+
*/
|
|
201
|
+
vary(field: string): this;
|
|
202
|
+
_write(chunk: Buffer | string, encoding: BufferEncoding, // eslint-disable-line no-undef
|
|
203
|
+
callback: (error?: Error | null) => void): void;
|
|
204
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
205
|
+
buildResult(): LambdaResponse;
|
|
206
|
+
private isBinaryContentType;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Mock ServerResponse that streams directly to Lambda responseStream.
|
|
211
|
+
* Uses awslambda.HttpResponseStream.from() to set status and headers.
|
|
212
|
+
*/
|
|
213
|
+
declare class LambdaResponseStreaming extends Writable {
|
|
214
|
+
statusCode: number;
|
|
215
|
+
statusMessage: string;
|
|
216
|
+
readonly socket: {
|
|
217
|
+
remoteAddress: string;
|
|
218
|
+
};
|
|
219
|
+
_headers: Map<string, string | string[]>;
|
|
220
|
+
_headersSent: boolean;
|
|
221
|
+
private _convertedFrom204;
|
|
222
|
+
private _pendingWrites;
|
|
223
|
+
private _responseStream;
|
|
224
|
+
private _wrappedStream;
|
|
225
|
+
constructor(responseStream: ResponseStream);
|
|
226
|
+
_internalGetHeader(name: string): string | undefined;
|
|
227
|
+
_internalSetHeader(name: string, value: string): void;
|
|
228
|
+
_internalHasHeader(name: string): boolean;
|
|
229
|
+
_internalRemoveHeader(name: string): void;
|
|
230
|
+
setHeader(name: string, value: number | string | string[]): this;
|
|
231
|
+
getHeader(name: string): number | string | string[] | undefined;
|
|
232
|
+
removeHeader(name: string): void;
|
|
233
|
+
getHeaders(): OutgoingHttpHeaders;
|
|
234
|
+
hasHeader(name: string): boolean;
|
|
235
|
+
getHeaderNames(): string[];
|
|
236
|
+
/**
|
|
237
|
+
* Proxy for direct header access (e.g., res.headers['content-type']).
|
|
238
|
+
* Required for compatibility with middleware like helmet that access headers directly.
|
|
239
|
+
* Uses direct _headers access to bypass dd-trace interception.
|
|
240
|
+
*/
|
|
241
|
+
get headers(): Record<string, string | string[] | undefined>;
|
|
242
|
+
writeHead(statusCode: number, statusMessageOrHeaders?: OutgoingHttpHeaders | string, headers?: OutgoingHttpHeaders): this;
|
|
243
|
+
get headersSent(): boolean;
|
|
244
|
+
flushHeaders(): void;
|
|
245
|
+
/**
|
|
246
|
+
* Express-style alias for getHeader().
|
|
247
|
+
* Used by middleware like decorateResponse that use res.get().
|
|
248
|
+
* Note: Directly accesses _headers to avoid prototype chain issues with bundled code.
|
|
249
|
+
*/
|
|
250
|
+
get(name: string): number | string | string[] | undefined;
|
|
251
|
+
/**
|
|
252
|
+
* Express-style alias for setHeader().
|
|
253
|
+
* Used by middleware like decorateResponse that use res.set().
|
|
254
|
+
* Note: Directly accesses _headers to avoid prototype chain issues with bundled code.
|
|
255
|
+
*/
|
|
256
|
+
set(name: string, value: number | string | string[]): this;
|
|
257
|
+
status(code: number): this;
|
|
258
|
+
json(data: unknown): this;
|
|
259
|
+
send(body?: Buffer | object | string): this;
|
|
260
|
+
/**
|
|
261
|
+
* Add a field to the Vary response header.
|
|
262
|
+
* Used by CORS middleware to indicate response varies by Origin.
|
|
263
|
+
* Uses direct _headers access to bypass dd-trace interception.
|
|
264
|
+
*/
|
|
265
|
+
vary(field: string): this;
|
|
266
|
+
_write(chunk: Buffer | string, encoding: BufferEncoding, // eslint-disable-line no-undef
|
|
267
|
+
callback: (error?: Error | null) => void): void;
|
|
268
|
+
_final(callback: (error?: Error | null) => void): void;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Get the current Lambda invoke context.
|
|
273
|
+
* Used by getCurrentInvokeUuid adapter to get the request ID.
|
|
274
|
+
*/
|
|
275
|
+
declare function getCurrentInvoke(): {
|
|
276
|
+
context: LambdaContext;
|
|
277
|
+
event: LambdaEvent;
|
|
278
|
+
} | null;
|
|
279
|
+
/**
|
|
280
|
+
* Create a Lambda handler that buffers the Express response.
|
|
281
|
+
* Returns the complete response as a Lambda response object.
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```typescript
|
|
285
|
+
* import express from "express";
|
|
286
|
+
* import { createLambdaHandler } from "@jaypie/express";
|
|
287
|
+
*
|
|
288
|
+
* const app = express();
|
|
289
|
+
* app.get("/", (req, res) => res.json({ message: "Hello" }));
|
|
290
|
+
*
|
|
291
|
+
* export const handler = createLambdaHandler(app);
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
declare function createLambdaHandler(app: Application, _options?: CreateLambdaHandlerOptions): LambdaHandler;
|
|
295
|
+
/**
|
|
296
|
+
* Create a Lambda handler that streams the Express response.
|
|
297
|
+
* Uses awslambda.streamifyResponse() for Lambda response streaming.
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* ```typescript
|
|
301
|
+
* import express from "express";
|
|
302
|
+
* import { createLambdaStreamHandler } from "@jaypie/express";
|
|
303
|
+
*
|
|
304
|
+
* const app = express();
|
|
305
|
+
* app.get("/stream", (req, res) => {
|
|
306
|
+
* res.setHeader("Content-Type", "text/event-stream");
|
|
307
|
+
* res.write("data: Hello\n\n");
|
|
308
|
+
* res.end();
|
|
309
|
+
* });
|
|
310
|
+
*
|
|
311
|
+
* export const handler = createLambdaStreamHandler(app);
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
declare function createLambdaStreamHandler(app: Application, _options?: CreateLambdaHandlerOptions): LambdaStreamHandler;
|
|
315
|
+
|
|
316
|
+
declare const EXPRESS: {
|
|
317
|
+
readonly PATH: {
|
|
318
|
+
readonly ANY: RegExp;
|
|
319
|
+
readonly ID: "/:id";
|
|
320
|
+
readonly ROOT: RegExp;
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
interface CorsConfig {
|
|
325
|
+
origin?: string | string[];
|
|
326
|
+
overrides?: Record<string, unknown>;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* CORS middleware with Lambda streaming support.
|
|
330
|
+
*
|
|
331
|
+
* For OPTIONS preflight requests, this middleware handles them early and
|
|
332
|
+
* terminates the response immediately. This is critical for Lambda streaming
|
|
333
|
+
* handlers where the response stream would otherwise stay open waiting for
|
|
334
|
+
* streaming data that never comes.
|
|
335
|
+
*
|
|
336
|
+
* For regular requests, delegates to the standard cors package behavior.
|
|
337
|
+
*/
|
|
338
|
+
declare const _default: (config?: CorsConfig) => ((req: Request, res: Response, next: NextFunction) => void);
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Wrap a service return value in the canonical Jaypie API envelope.
|
|
342
|
+
*
|
|
343
|
+
* Rules:
|
|
344
|
+
* - `null` / `undefined` → `{ data: null }`
|
|
345
|
+
* - `{ data }` with exactly one key → passthrough
|
|
346
|
+
* - `{ errors }` with exactly one key → passthrough
|
|
347
|
+
* - everything else (including `{ data, other }`) → `{ data: value }`
|
|
348
|
+
*
|
|
349
|
+
* The "only one key, and that key is `data` or `errors`" check prevents
|
|
350
|
+
* false positives where a domain object happens to contain a `data` field.
|
|
351
|
+
*/
|
|
352
|
+
declare function fabricApiResponse(result: unknown): unknown;
|
|
353
|
+
|
|
354
|
+
type JaypieHandlerSetup = (req: Request, res: Response) => Promise<void> | void;
|
|
355
|
+
type JaypieHandlerTeardown = (req: Request, res: Response) => Promise<void> | void;
|
|
356
|
+
type JaypieHandlerValidate = (req: Request, res: Response) => Promise<boolean | void> | boolean | void;
|
|
357
|
+
type ExpressHandlerLocals = (req: Request, res: Response) => Promise<unknown> | unknown;
|
|
358
|
+
interface ExpressHandlerOptions {
|
|
359
|
+
chaos?: string;
|
|
360
|
+
/**
|
|
361
|
+
* When true, the handler's return value is wrapped with
|
|
362
|
+
* `fabricApiResponse` before `res.json()`. Plain objects become
|
|
363
|
+
* `{ data: value }`; pre-wrapped `{ data }` or `{ errors }` payloads
|
|
364
|
+
* pass through unchanged. `null` / `undefined` become `{ data: null }`.
|
|
365
|
+
*/
|
|
366
|
+
fabric?: boolean;
|
|
367
|
+
locals?: Record<string, unknown | ExpressHandlerLocals>;
|
|
368
|
+
name?: string;
|
|
369
|
+
secrets?: string[];
|
|
370
|
+
setup?: JaypieHandlerSetup[] | JaypieHandlerSetup;
|
|
371
|
+
teardown?: JaypieHandlerTeardown[] | JaypieHandlerTeardown;
|
|
372
|
+
unavailable?: boolean;
|
|
373
|
+
validate?: JaypieHandlerValidate[] | JaypieHandlerValidate;
|
|
374
|
+
}
|
|
375
|
+
type ExpressHandler<T> = (req: Request, res: Response, ...params: unknown[]) => Promise<T>;
|
|
376
|
+
declare function expressHandler<T>(handler: ExpressHandler<T>, options?: ExpressHandlerOptions): ExpressHandler<T>;
|
|
377
|
+
declare function expressHandler<T>(options: ExpressHandlerOptions, handler: ExpressHandler<T>): ExpressHandler<T>;
|
|
378
|
+
|
|
379
|
+
declare const httpHandler: (statusCode?: number, context?: ExpressHandlerOptions) => ((req: Request, res: Response) => Promise<Record<string, unknown> | null>);
|
|
380
|
+
|
|
381
|
+
type JaypieStreamHandlerSetup = (req: Request, res: Response) => Promise<void> | void;
|
|
382
|
+
type JaypieStreamHandlerTeardown = (req: Request, res: Response) => Promise<void> | void;
|
|
383
|
+
type JaypieStreamHandlerValidate = (req: Request, res: Response) => Promise<boolean | void> | boolean | void;
|
|
384
|
+
type ExpressStreamHandlerLocals = (req: Request, res: Response) => Promise<unknown> | unknown;
|
|
385
|
+
interface ExpressStreamHandlerOptions {
|
|
386
|
+
chaos?: string;
|
|
387
|
+
contentType?: string;
|
|
388
|
+
format?: StreamFormat;
|
|
389
|
+
locals?: Record<string, unknown | ExpressStreamHandlerLocals>;
|
|
390
|
+
name?: string;
|
|
391
|
+
secrets?: string[];
|
|
392
|
+
setup?: JaypieStreamHandlerSetup[] | JaypieStreamHandlerSetup;
|
|
393
|
+
teardown?: JaypieStreamHandlerTeardown[] | JaypieStreamHandlerTeardown;
|
|
394
|
+
unavailable?: boolean;
|
|
395
|
+
validate?: JaypieStreamHandlerValidate[] | JaypieStreamHandlerValidate;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Streaming Express handler function signature.
|
|
399
|
+
* Handler should write to the response stream and not return a value.
|
|
400
|
+
*/
|
|
401
|
+
type ExpressStreamHandler = (req: Request, res: Response, ...params: unknown[]) => Promise<void>;
|
|
402
|
+
/**
|
|
403
|
+
* Creates a streaming Express handler that sets up SSE headers and allows
|
|
404
|
+
* streaming responses. The handler receives the standard req/res and should
|
|
405
|
+
* write to res.write() directly.
|
|
406
|
+
*
|
|
407
|
+
* Usage:
|
|
408
|
+
* ```ts
|
|
409
|
+
* app.get('/stream', expressStreamHandler(async (req, res) => {
|
|
410
|
+
* const llmStream = llm.stream("Hello");
|
|
411
|
+
* await createExpressStream(llmStream, res);
|
|
412
|
+
* }));
|
|
413
|
+
* ```
|
|
414
|
+
*
|
|
415
|
+
* The handler sets appropriate SSE headers automatically:
|
|
416
|
+
* - Content-Type: text/event-stream
|
|
417
|
+
* - Cache-Control: no-cache
|
|
418
|
+
* - Connection: keep-alive
|
|
419
|
+
* - X-Accel-Buffering: no (disables nginx buffering)
|
|
420
|
+
*/
|
|
421
|
+
declare function expressStreamHandler(handler: ExpressStreamHandler, options?: ExpressStreamHandlerOptions): ExpressStreamHandler;
|
|
422
|
+
declare function expressStreamHandler(options: ExpressStreamHandlerOptions, handler: ExpressStreamHandler): ExpressStreamHandler;
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Get the current invoke UUID from Lambda context.
|
|
426
|
+
* Works with Jaypie Lambda adapter (createLambdaHandler/createLambdaStreamHandler).
|
|
427
|
+
*
|
|
428
|
+
* @param req - Optional Express request object. Used to extract context
|
|
429
|
+
* from Jaypie adapter's _lambdaContext.
|
|
430
|
+
* @returns The AWS request ID or undefined if not in Lambda context
|
|
431
|
+
*/
|
|
432
|
+
declare function getCurrentInvokeUuid(req?: Request): string | undefined;
|
|
433
|
+
|
|
434
|
+
interface RequestSummary {
|
|
435
|
+
baseUrl: string;
|
|
436
|
+
body: unknown;
|
|
437
|
+
headers: Record<string, string | string[] | undefined>;
|
|
438
|
+
method: string;
|
|
439
|
+
query: Request["query"];
|
|
440
|
+
url: string;
|
|
441
|
+
}
|
|
442
|
+
declare function summarizeRequest(req: Request): RequestSummary;
|
|
443
|
+
|
|
444
|
+
interface EchoResponse {
|
|
445
|
+
req: ReturnType<typeof summarizeRequest>;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
declare const badRequestRoute: (req: express.Request, res: express.Response) => Promise<Record<string, unknown> | null>;
|
|
449
|
+
declare const echoRoute: (req: express.Request, res: express.Response) => Promise<EchoResponse>;
|
|
450
|
+
declare const forbiddenRoute: (req: express.Request, res: express.Response) => Promise<Record<string, unknown> | null>;
|
|
451
|
+
declare const goneRoute: (req: express.Request, res: express.Response) => Promise<Record<string, unknown> | null>;
|
|
452
|
+
declare const methodNotAllowedRoute: (req: express.Request, res: express.Response) => Promise<Record<string, unknown> | null>;
|
|
453
|
+
declare const noContentRoute: (req: express.Request, res: express.Response) => Promise<Record<string, unknown> | null>;
|
|
454
|
+
declare const notFoundRoute: (req: express.Request, res: express.Response) => Promise<Record<string, unknown> | null>;
|
|
455
|
+
declare const notImplementedRoute: (req: express.Request, res: express.Response, ...params: unknown[]) => Promise<unknown>;
|
|
456
|
+
|
|
457
|
+
export { EXPRESS, LambdaRequest, LambdaResponseBuffered, LambdaResponseStreaming, badRequestRoute, _default as cors, createLambdaHandler, createLambdaStreamHandler, echoRoute, expressHandler, httpHandler as expressHttpCodeHandler, expressStreamHandler, fabricApiResponse, forbiddenRoute, getCurrentInvoke, getCurrentInvokeUuid, goneRoute, methodNotAllowedRoute, noContentRoute, notFoundRoute, notImplementedRoute };
|
|
458
|
+
export type { ApiGatewayV1Event, CorsConfig, CreateLambdaHandlerOptions, ExpressHandlerLocals, ExpressHandlerOptions, ExpressStreamHandler, ExpressStreamHandlerLocals, ExpressStreamHandlerOptions, FunctionUrlEvent, JaypieHandlerSetup, JaypieHandlerTeardown, JaypieHandlerValidate, JaypieStreamHandlerSetup, JaypieStreamHandlerTeardown, JaypieStreamHandlerValidate, LambdaContext, LambdaEvent, LambdaHandler, LambdaResponse, LambdaStreamHandler, ResponseStream };
|
package/dist/esm/index.js
CHANGED
|
@@ -1073,9 +1073,11 @@ function createLambdaHandler(app, _options) {
|
|
|
1073
1073
|
return result;
|
|
1074
1074
|
}
|
|
1075
1075
|
catch (error) {
|
|
1076
|
-
//
|
|
1076
|
+
// console, not log: must reach CloudWatch even if the logger itself is broken
|
|
1077
|
+
// eslint-disable-next-line no-console
|
|
1077
1078
|
console.error("[createLambdaHandler] Unhandled error:", error);
|
|
1078
1079
|
if (error instanceof Error) {
|
|
1080
|
+
// eslint-disable-next-line no-console
|
|
1079
1081
|
console.error("[createLambdaHandler] Stack:", error.stack);
|
|
1080
1082
|
}
|
|
1081
1083
|
// Return a proper error response instead of throwing
|
|
@@ -1158,7 +1160,8 @@ function createLambdaStreamHandler(app, _options) {
|
|
|
1158
1160
|
//
|
|
1159
1161
|
const EXPRESS = {
|
|
1160
1162
|
PATH: {
|
|
1161
|
-
|
|
1163
|
+
// RegExp matches all paths in Express 4 and 5; "*" throws in 5, "/{*splat}" throws in 4
|
|
1164
|
+
ANY: /(.*)/,
|
|
1162
1165
|
ID: "/:id",
|
|
1163
1166
|
ROOT: /^\/?$/,
|
|
1164
1167
|
},
|
|
@@ -1454,6 +1457,10 @@ function getCurrentInvokeUuid(req) {
|
|
|
1454
1457
|
return getJaypieAdapterUuid();
|
|
1455
1458
|
}
|
|
1456
1459
|
|
|
1460
|
+
//
|
|
1461
|
+
//
|
|
1462
|
+
// Helpers
|
|
1463
|
+
//
|
|
1457
1464
|
/**
|
|
1458
1465
|
* Safely set a header value on response.
|
|
1459
1466
|
* Handles both Express Response and Lambda adapter responses.
|
|
@@ -2020,6 +2027,7 @@ function expressHandler(handlerOrOptions, optionsOrHandler) {
|
|
|
2020
2027
|
const errorStack = error instanceof Error
|
|
2021
2028
|
? error.stack
|
|
2022
2029
|
: new Error("Stack trace").stack?.replace("Error: Stack trace", `Error: ${errorMessage}`);
|
|
2030
|
+
// eslint-disable-next-line no-console -- raw stack must reach CloudWatch even if the logger is broken
|
|
2023
2031
|
console.error("Express response error stack trace:", errorStack);
|
|
2024
2032
|
log.fatal(`Express encountered an error while sending the response: ${errorMessage}`);
|
|
2025
2033
|
log.var({ responseError: error });
|