Skip to content

Commit b59950a

Browse files
committed
refactor: improve file structure
Signed-off-by: seven <[email protected]>
1 parent 3dbe56b commit b59950a

File tree

4 files changed

+79
-75
lines changed

4 files changed

+79
-75
lines changed

src/context.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Context, Event } from './types';
2+
import ServerlessRequest from './serverlessRequest';
3+
import url from 'node:url';
4+
import ServerlessResponse from './serverlessResponse';
5+
6+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
7+
export const constructFrameworkContext = (event: Event, _: Context) => {
8+
const request = new ServerlessRequest({
9+
method: event.httpMethod,
10+
headers: event.headers,
11+
body: Buffer.from(event.body, event.isBase64Encoded ? 'base64' : 'utf8'),
12+
remoteAddress: '',
13+
url: url.format({
14+
pathname: event.path,
15+
query: event.queryParameters,
16+
}),
17+
isBase64Encoded: event.isBase64Encoded,
18+
});
19+
const response = new ServerlessResponse(request);
20+
return { request, response };
21+
};

src/index.ts

Lines changed: 7 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,22 @@
11
import { Express } from 'express';
2-
import { Writable } from 'stream';
3-
import { Context, Event, ServerlessAdapter } from './types';
2+
import { ServerlessAdapter } from './types';
43
import sendRequest from './sendRequest';
5-
import ServerlessRequest from './serverlessRequest';
6-
import ServerlessResponse from './serverlessResponse';
74
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';
737

748
const serverlessAdapter: ServerlessAdapter = (app: Express) => {
759
return async (event, context) => {
76-
const ctx = constructFrameworkContext(event, context);
10+
const { request, response } = constructFrameworkContext(event, context);
7711

7812
try {
7913
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
8014
// @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 });
8418
} catch (err) {
8519
const errorResponse = { statusCode: 500, body: (err as Error).message };
86-
console.log('Error occurred during request handling:', err);
8720
return errorResponse as unknown as {
8821
statusCode: number;
8922
body: string;

src/serverlessResponse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const getString = (data: unknown): string => {
2525
const addData = (stream: ServerlessResponse, data: Buffer | string | Uint8Array): void => {
2626
try {
2727
stream[BODY].push(Buffer.from(data));
28+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
2829
} catch (err) {
29-
console.log('Error adding data to stream', err);
3030
throw new Error(`response.write() of unexpected type: ${typeof data}`);
3131
}
3232
};

src/transport.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { Writable } from 'stream';
2+
import ServerlessRequest from './serverlessRequest';
3+
import ServerlessResponse from './serverlessResponse';
4+
5+
export const waitForStreamComplete = (stream: Writable): Promise<Writable> => {
6+
if (stream.writableFinished || stream.writableEnded) {
7+
return Promise.resolve(stream);
8+
}
9+
10+
return new Promise((resolve, reject) => {
11+
stream.once('error', complete);
12+
stream.once('end', complete);
13+
stream.once('finish', complete);
14+
15+
let isComplete = false;
16+
17+
function complete(err?: Error) {
18+
if (isComplete) {
19+
return;
20+
}
21+
22+
isComplete = true;
23+
24+
stream.removeListener('error', complete);
25+
stream.removeListener('end', complete);
26+
stream.removeListener('finish', complete);
27+
28+
if (err) {
29+
reject(err);
30+
} else {
31+
resolve(stream);
32+
}
33+
}
34+
});
35+
};
36+
37+
export const buildResponse = ({
38+
request,
39+
response,
40+
}: {
41+
request: ServerlessRequest;
42+
response: ServerlessResponse;
43+
}) => {
44+
return {
45+
statusCode: response.statusCode,
46+
body: ServerlessResponse.body(response).toString(request.isBase64Encoded ? 'base64' : 'utf8'),
47+
headers: response.headers,
48+
isBase64Encoded: request.isBase64Encoded,
49+
};
50+
};

0 commit comments

Comments
 (0)