|
1 | 1 | import { Express } from 'express'; |
2 | | -import { Writable } from 'stream'; |
3 | | -import { Context, Event, ServerlessAdapter } from './types'; |
| 2 | +import { ServerlessAdapter } from './types'; |
4 | 3 | import sendRequest from './sendRequest'; |
5 | | -import ServerlessRequest from './serverlessRequest'; |
6 | | -import ServerlessResponse from './serverlessResponse'; |
7 | 4 | import { IncomingHttpHeaders } from 'http'; |
8 | | -import * as url from 'node:url'; |
9 | | - |
10 | | -const constructFrameworkContext = (event: Event, context: Context) => { |
11 | | - console.log('constructFrameworkContext', event, context); |
12 | | - const request = new ServerlessRequest({ |
13 | | - method: event.httpMethod, |
14 | | - headers: event.headers, |
15 | | - body: Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8'), |
16 | | - remoteAddress: '', |
17 | | - url: url.format({ |
18 | | - pathname: event.path, |
19 | | - query: event.queryParameters, |
20 | | - }), |
21 | | - isBase64Encoded: event.isBase64Encoded, |
22 | | - }); |
23 | | - const response = new ServerlessResponse(request); |
24 | | - return { request, response }; |
25 | | -}; |
26 | | - |
27 | | -const waitForStreamComplete = (stream: Writable): Promise<Writable> => { |
28 | | - if (stream.writableFinished || stream.writableEnded) { |
29 | | - return Promise.resolve(stream); |
30 | | - } |
31 | | - |
32 | | - return new Promise((resolve, reject) => { |
33 | | - stream.once('error', complete); |
34 | | - stream.once('end', complete); |
35 | | - stream.once('finish', complete); |
36 | | - |
37 | | - let isComplete = false; |
38 | | - |
39 | | - function complete(err?: Error) { |
40 | | - if (isComplete) { |
41 | | - return; |
42 | | - } |
43 | | - |
44 | | - isComplete = true; |
45 | | - |
46 | | - stream.removeListener('error', complete); |
47 | | - stream.removeListener('end', complete); |
48 | | - stream.removeListener('finish', complete); |
49 | | - |
50 | | - if (err) { |
51 | | - reject(err); |
52 | | - } else { |
53 | | - resolve(stream); |
54 | | - } |
55 | | - } |
56 | | - }); |
57 | | -}; |
58 | | - |
59 | | -const buildResponse = ({ |
60 | | - request, |
61 | | - response, |
62 | | -}: { |
63 | | - request: ServerlessRequest; |
64 | | - response: ServerlessResponse; |
65 | | -}) => { |
66 | | - return { |
67 | | - statusCode: response.statusCode, |
68 | | - body: ServerlessResponse.body(response).toString(request.isBase64Encoded ? 'base64' : 'utf8'), |
69 | | - headers: response.headers, |
70 | | - isBase64Encoded: request.isBase64Encoded, |
71 | | - }; |
72 | | -}; |
| 5 | +import { constructFrameworkContext } from './context'; |
| 6 | +import { buildResponse, waitForStreamComplete } from './transport'; |
73 | 7 |
|
74 | 8 | const serverlessAdapter: ServerlessAdapter = (app: Express) => { |
75 | 9 | return async (event, context) => { |
76 | | - const ctx = constructFrameworkContext(event, context); |
| 10 | + const { request, response } = constructFrameworkContext(event, context); |
77 | 11 |
|
78 | 12 | try { |
79 | 13 | // eslint-disable-next-line @typescript-eslint/ban-ts-comment |
80 | 14 | // @ts-expect-error |
81 | | - await sendRequest(app, ctx.request, ctx.response); |
82 | | - await waitForStreamComplete(ctx.response); |
83 | | - return buildResponse(ctx); |
| 15 | + await sendRequest(app, request, response); |
| 16 | + await waitForStreamComplete(response); |
| 17 | + return buildResponse({ request, response }); |
84 | 18 | } catch (err) { |
85 | 19 | const errorResponse = { statusCode: 500, body: (err as Error).message }; |
86 | | - console.log('Error occurred during request handling:', err); |
87 | 20 | return errorResponse as unknown as { |
88 | 21 | statusCode: number; |
89 | 22 | body: string; |
|
0 commit comments