Skip to content

Commit 205def8

Browse files
committed
fixes and tests
1 parent 12981dd commit 205def8

File tree

2 files changed

+71
-19
lines changed

2 files changed

+71
-19
lines changed

src/__tests__/use.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import fastify from 'fastify';
55
import Koa from 'koa';
66
import mount from 'koa-mount';
77
import { createServerAdapter } from '@whatwg-node/server';
8+
import uWS from 'uWebSockets.js';
89
import { startDisposableServer } from './utils/tserver';
910
import { serverAudits } from '../audits';
1011
import { schema } from './fixtures/simple';
@@ -14,6 +15,7 @@ import { createHandler as createExpressHandler } from '../use/express';
1415
import { createHandler as createFastifyHandler } from '../use/fastify';
1516
import { createHandler as createFetchHandler } from '../use/fetch';
1617
import { createHandler as createKoaHandler } from '../use/koa';
18+
import { createHandler as createUWSHandler } from '../use/uWebSockets';
1719

1820
describe('http', () => {
1921
const [url, , dispose] = startDisposableServer(
@@ -219,3 +221,39 @@ describe('koa', () => {
219221
await dispose();
220222
});
221223
});
224+
225+
describe('uWebSockets.js', () => {
226+
let url = '';
227+
beforeAll(async () => {
228+
// get available port by starting a temporary server
229+
const [availableUrl, availablePort, dispose] = startDisposableServer(
230+
http.createServer(),
231+
);
232+
await dispose();
233+
url = availableUrl;
234+
235+
new Promise<void>((resolve, reject) => {
236+
uWS
237+
.App()
238+
.any('/', createUWSHandler({ schema }))
239+
.listen(availablePort, (listenSocket) => {
240+
if (!listenSocket) {
241+
reject(new Error('Unavailable uWS listen socket'));
242+
} else {
243+
resolve();
244+
}
245+
});
246+
});
247+
});
248+
249+
// TODO: dispose of app afterAll
250+
251+
for (const audit of serverAudits({ url: () => url, fetchFn: fetch })) {
252+
it(audit.name, async () => {
253+
const result = await audit.fn();
254+
if (result.status !== 'ok') {
255+
throw result.reason;
256+
}
257+
});
258+
}
259+
});

src/use/uWebSockets.ts

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,33 +46,45 @@ export function createHandler<Context extends OperationContext = undefined>(
4646
): (res: HttpResponse, req: HttpRequest) => Promise<void> {
4747
const handle = createRawHandler(options);
4848
return async function requestListener(res, req) {
49+
let aborted = false;
50+
res.onAborted(() => (aborted = true));
4951
try {
52+
let url = req.getUrl();
53+
const query = req.getQuery();
54+
if (query) {
55+
url += '?' + query;
56+
}
5057
const [body, init] = await handle({
51-
url: req.getUrl(),
52-
method: req.getMethod(),
53-
headers: { get: req.getHeader },
58+
url,
59+
method: req.getMethod().toUpperCase(),
60+
headers: { get: (key) => req.getHeader(key) },
5461
body: () =>
5562
new Promise<string>((resolve) => {
5663
let body = '';
57-
res.onData((chunk, isLast) => {
58-
body += chunk;
59-
if (isLast) {
60-
resolve(body);
61-
}
62-
});
64+
if (aborted) {
65+
resolve(body);
66+
} else {
67+
res.onData((chunk, isLast) => {
68+
body += Buffer.from(chunk, 0, chunk.byteLength).toString();
69+
if (isLast) {
70+
resolve(body);
71+
}
72+
});
73+
}
6374
}),
6475
raw: req,
6576
context: { res },
6677
});
67-
68-
res.writeStatus(`${init.status} ${init.statusText}`);
69-
for (const [key, val] of Object.entries(init.headers || {})) {
70-
res.writeHeader(key, val);
71-
}
72-
if (body) {
73-
res.end(body);
74-
} else {
75-
res.endWithoutBody();
78+
if (!aborted) {
79+
res.writeStatus(`${init.status} ${init.statusText}`);
80+
for (const [key, val] of Object.entries(init.headers || {})) {
81+
res.writeHeader(key, val);
82+
}
83+
if (body) {
84+
res.end(body);
85+
} else {
86+
res.endWithoutBody();
87+
}
7688
}
7789
} catch (err) {
7890
// The handler shouldnt throw errors.
@@ -82,7 +94,9 @@ export function createHandler<Context extends OperationContext = undefined>(
8294
'Please check your implementation.',
8395
err,
8496
);
85-
res.writeStatus('500 Internal Server Error').endWithoutBody();
97+
if (!aborted) {
98+
res.writeStatus('500 Internal Server Error').endWithoutBody();
99+
}
86100
}
87101
};
88102
}

0 commit comments

Comments
 (0)