Skip to content

Commit 81f52fc

Browse files
authored
feat: add luxify function for converting traditional middleware (#183)
1 parent 39ce152 commit 81f52fc

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ export { default as Logger } from './packages/logger';
33
export { default as Controller } from './packages/controller';
44
export { default as Serializer } from './packages/serializer';
55
export { default as Application } from './packages/application';
6+
7+
export { default as luxify } from './packages/luxify';

src/packages/luxify/index.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// @flow
2+
import createResponseProxy from './utils/create-response-proxy';
3+
import type { IncomingMessage, ServerResponse } from 'http';
4+
5+
/**
6+
* Convert traditional node HTTP server middleware into a lux compatible
7+
* function for use in Controller#beforeAction.
8+
*/
9+
export default function luxify(
10+
middleware: (
11+
req: IncomingMessage,
12+
res: ServerResponse,
13+
next: (err?: Error) => void
14+
) => void
15+
): (req: IncomingMessage, res: ServerResponse) => Promise<void|mixed> {
16+
const result = function (req, res) {
17+
return new Promise((resolve, reject) => {
18+
res = createResponseProxy(res, resolve);
19+
20+
middleware.call(null, req, res, (err) => {
21+
if (err && err instanceof Error) {
22+
reject(err);
23+
} else {
24+
resolve();
25+
}
26+
});
27+
});
28+
};
29+
30+
Object.defineProperty(result, 'name', {
31+
value: middleware.name
32+
});
33+
34+
return result;
35+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// @flow
2+
import type { ServerResponse } from 'http';
3+
4+
export default function createResponseProxy(
5+
res: ServerResponse,
6+
resolve: (result: mixed) => void
7+
): ServerResponse {
8+
return new Proxy(res, {
9+
get(target: ServerResponse, key: string, receiver: Proxy): ?mixed | void {
10+
switch (key) {
11+
case 'end':
12+
case 'send':
13+
case 'json':
14+
return resolve;
15+
16+
default:
17+
return target[key];
18+
}
19+
}
20+
});
21+
}

0 commit comments

Comments
 (0)