@daloyjs/core 0.9.0 → 0.11.0
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/README.md +50 -36
- package/dist/adapters/bun.d.ts.map +1 -1
- package/dist/adapters/bun.js +178 -2
- package/dist/adapters/bun.js.map +1 -1
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +272 -10
- package/dist/adapters/node.js.map +1 -1
- package/dist/app.d.ts +13 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +76 -19
- package/dist/app.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +39 -4
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/websocket.d.ts +275 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +505 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +7 -2
package/dist/adapters/node.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* Node adapter: translates IncomingMessage/ServerResponse to web-standard
|
|
3
3
|
* Request/Response. Includes graceful shutdown wired to SIGTERM/SIGINT.
|
|
4
4
|
*/
|
|
5
|
-
import { createServer } from "node:http";
|
|
5
|
+
import { createServer, } from "node:http";
|
|
6
6
|
import { Readable } from "node:stream";
|
|
7
|
+
import { FrameSink, encodeFrame, encodeClosePayload, encodeSendPayload, validateUpgrade, validateSelectedSubprotocol, WS_OPCODE, WS_CLOSE_CODE, WS_READY_STATE, WS_MAX_CONTROL_PAYLOAD, WebSocketProtocolError, } from "../websocket.js";
|
|
7
8
|
export function serve(app, opts = {}) {
|
|
8
9
|
const trustProxy = opts.trustProxy === true;
|
|
9
10
|
const server = createServer({ maxHeaderSize: opts.maxHeaderBytes ?? 16 * 1024 }, async (req, res) => {
|
|
@@ -30,32 +31,44 @@ export function serve(app, opts = {}) {
|
|
|
30
31
|
server.requestTimeout = opts.connectionTimeoutMs ?? 30_000;
|
|
31
32
|
server.headersTimeout = opts.connectionTimeoutMs ?? 30_000;
|
|
32
33
|
server.keepAliveTimeout = 5_000;
|
|
34
|
+
const wsSockets = new Set();
|
|
35
|
+
if (app.webSocketRoutes.size > 0) {
|
|
36
|
+
server.on("upgrade", (req, socket, head) => {
|
|
37
|
+
wsSockets.add(socket);
|
|
38
|
+
socket.on("close", () => wsSockets.delete(socket));
|
|
39
|
+
void handleUpgrade(app, req, socket, head, trustProxy);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
33
42
|
const port = opts.port ?? 3000;
|
|
34
|
-
|
|
35
|
-
server.listen(port, hostname);
|
|
43
|
+
server.listen(port, opts.hostname ?? "0.0.0.0");
|
|
36
44
|
let closed = false;
|
|
37
45
|
const close = async () => {
|
|
38
46
|
if (closed)
|
|
39
47
|
return;
|
|
40
48
|
closed = true;
|
|
41
49
|
await app.shutdown(opts.shutdownTimeoutMs ?? 10_000);
|
|
50
|
+
for (const sock of wsSockets)
|
|
51
|
+
sock.destroy();
|
|
52
|
+
wsSockets.clear();
|
|
42
53
|
await new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve())));
|
|
43
54
|
};
|
|
44
55
|
if (opts.handleSignals !== false) {
|
|
45
|
-
const onSignal = (sig) => {
|
|
46
|
-
app.log.info({ sig }, "DaloyJS received signal, shutting down");
|
|
47
|
-
void close().then(() => process.exit(0));
|
|
48
|
-
};
|
|
56
|
+
const onSignal = (sig) => { app.log.info({ sig }, "DaloyJS received signal, shutting down"); void close().then(() => process.exit(0)); };
|
|
49
57
|
process.once("SIGTERM", () => onSignal("SIGTERM"));
|
|
50
58
|
process.once("SIGINT", () => onSignal("SIGINT"));
|
|
51
59
|
}
|
|
52
60
|
return { server, port, close };
|
|
53
61
|
}
|
|
54
62
|
async function toWebRequest(req, trustProxy) {
|
|
55
|
-
const forwardedHost = trustProxy
|
|
63
|
+
const forwardedHost = trustProxy
|
|
64
|
+
? firstHeader(req.headers["x-forwarded-host"])
|
|
65
|
+
: undefined;
|
|
56
66
|
const host = forwardedHost ?? req.headers.host ?? "localhost";
|
|
57
|
-
const forwardedProto = trustProxy
|
|
58
|
-
|
|
67
|
+
const forwardedProto = trustProxy
|
|
68
|
+
? firstHeader(req.headers["x-forwarded-proto"])
|
|
69
|
+
: undefined;
|
|
70
|
+
const proto = forwardedProto ??
|
|
71
|
+
(req.socket.encrypted ? "https" : "http");
|
|
59
72
|
const url = `${proto}://${host}${req.url ?? "/"}`;
|
|
60
73
|
const headers = new Headers();
|
|
61
74
|
for (const [k, v] of Object.entries(req.headers)) {
|
|
@@ -100,4 +113,253 @@ async function sendWebResponse(res, out) {
|
|
|
100
113
|
}
|
|
101
114
|
out.end();
|
|
102
115
|
}
|
|
116
|
+
// ---------- WebSocket upgrade ----------
|
|
117
|
+
async function handleUpgrade(app, req, socket, head, trustProxy) {
|
|
118
|
+
const forwardedHost = trustProxy
|
|
119
|
+
? firstHeader(req.headers["x-forwarded-host"])
|
|
120
|
+
: undefined;
|
|
121
|
+
const host = forwardedHost ?? req.headers.host ?? "localhost";
|
|
122
|
+
const forwardedProto = trustProxy
|
|
123
|
+
? firstHeader(req.headers["x-forwarded-proto"])
|
|
124
|
+
: undefined;
|
|
125
|
+
const proto = forwardedProto ??
|
|
126
|
+
(req.socket.encrypted ? "https" : "http");
|
|
127
|
+
const url = new URL(`${proto}://${host}${req.url ?? "/"}`);
|
|
128
|
+
const match = app.webSocketRoutes.find(url.pathname);
|
|
129
|
+
if (!match) {
|
|
130
|
+
writeUpgradeError(socket, 404, "Not Found");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const headers = new Headers();
|
|
134
|
+
for (const [k, v] of Object.entries(req.headers)) {
|
|
135
|
+
if (v === undefined)
|
|
136
|
+
continue;
|
|
137
|
+
headers.set(k, Array.isArray(v) ? v.join(", ") : String(v));
|
|
138
|
+
}
|
|
139
|
+
const result = await validateUpgrade(headers);
|
|
140
|
+
if (!result.ok) {
|
|
141
|
+
writeUpgradeError(socket, result.status, result.reason);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const request = new Request(`${proto}://${host}${req.url ?? "/"}`, {
|
|
145
|
+
method: "GET",
|
|
146
|
+
headers,
|
|
147
|
+
});
|
|
148
|
+
const ctx = {
|
|
149
|
+
request,
|
|
150
|
+
params: match.params,
|
|
151
|
+
query: Object.fromEntries(url.searchParams.entries()),
|
|
152
|
+
headers: Object.fromEntries(headers.entries()),
|
|
153
|
+
state: match.handler.createState(),
|
|
154
|
+
protocols: result.protocols,
|
|
155
|
+
};
|
|
156
|
+
const handler = match.handler.handler;
|
|
157
|
+
let chosenProtocol = "";
|
|
158
|
+
try {
|
|
159
|
+
const decision = await handler.beforeUpgrade?.(request, ctx);
|
|
160
|
+
if (decision instanceof Response) {
|
|
161
|
+
writeRejection(socket, decision);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (typeof decision === "string")
|
|
165
|
+
chosenProtocol = validateSelectedSubprotocol(decision, result.protocols);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (err instanceof WebSocketProtocolError) {
|
|
169
|
+
writeUpgradeError(socket, 400, err.message);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
app.log.error({ err }, "WebSocket beforeUpgrade hook failed");
|
|
173
|
+
writeUpgradeError(socket, 500, "Internal Server Error");
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Send the 101 response.
|
|
177
|
+
const responseLines = [
|
|
178
|
+
"HTTP/1.1 101 Switching Protocols",
|
|
179
|
+
"Upgrade: websocket",
|
|
180
|
+
"Connection: Upgrade",
|
|
181
|
+
`Sec-WebSocket-Accept: ${result.acceptKey}`,
|
|
182
|
+
];
|
|
183
|
+
if (chosenProtocol)
|
|
184
|
+
responseLines.push(`Sec-WebSocket-Protocol: ${chosenProtocol}`);
|
|
185
|
+
socket.write(responseLines.join("\r\n") + "\r\n\r\n");
|
|
186
|
+
// Disable Node's idle timeout on the raw socket — WS connections are long-lived.
|
|
187
|
+
socket.setTimeout(0);
|
|
188
|
+
socket.setNoDelay(true);
|
|
189
|
+
const conn = new NodeWebSocketConnection(socket, handler, chosenProtocol, app);
|
|
190
|
+
// If the upgrade arrived with extra bytes already in the buffer, feed them first.
|
|
191
|
+
if (head.length > 0)
|
|
192
|
+
conn._ingest(head);
|
|
193
|
+
socket.on("data", (chunk) => conn._ingest(chunk));
|
|
194
|
+
socket.on("close", () => conn._handleSocketClose());
|
|
195
|
+
socket.on("error", (err) => conn._handleSocketError(err));
|
|
196
|
+
try {
|
|
197
|
+
await handler.open?.(conn, ctx);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
app.log.error({ err }, "WebSocket open() handler failed");
|
|
201
|
+
conn._invokeError(err);
|
|
202
|
+
conn.terminate();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function writeUpgradeError(socket, status, reason) {
|
|
206
|
+
const body = `${status} ${reason}`;
|
|
207
|
+
socket.end(`HTTP/1.1 ${status} ${reason}\r\n` +
|
|
208
|
+
"Connection: close\r\n" +
|
|
209
|
+
`Content-Length: ${Buffer.byteLength(body)}\r\n` +
|
|
210
|
+
"Content-Type: text/plain; charset=utf-8\r\n\r\n" +
|
|
211
|
+
body);
|
|
212
|
+
}
|
|
213
|
+
function writeRejection(socket, res) {
|
|
214
|
+
const lines = [
|
|
215
|
+
`HTTP/1.1 ${res.status} ${res.statusText || "Error"}`,
|
|
216
|
+
"Connection: close",
|
|
217
|
+
"Content-Length: 0",
|
|
218
|
+
];
|
|
219
|
+
res.headers.forEach((v, k) => lines.push(`${k}: ${v}`));
|
|
220
|
+
socket.end(lines.join("\r\n") + "\r\n\r\n");
|
|
221
|
+
}
|
|
222
|
+
class NodeWebSocketConnection {
|
|
223
|
+
socket;
|
|
224
|
+
handler;
|
|
225
|
+
protocol;
|
|
226
|
+
app;
|
|
227
|
+
readyState = WS_READY_STATE.OPEN;
|
|
228
|
+
extensions = "";
|
|
229
|
+
binaryType = "nodebuffer";
|
|
230
|
+
data = undefined;
|
|
231
|
+
sink;
|
|
232
|
+
closeHandled = false;
|
|
233
|
+
constructor(socket, handler, protocol, app) {
|
|
234
|
+
this.socket = socket;
|
|
235
|
+
this.handler = handler;
|
|
236
|
+
this.protocol = protocol;
|
|
237
|
+
this.app = app;
|
|
238
|
+
this.sink = new FrameSink({
|
|
239
|
+
requireMask: true,
|
|
240
|
+
onMessage: (ev) => {
|
|
241
|
+
if (ev.isBinary && this.binaryType === "arraybuffer") {
|
|
242
|
+
const buf = ev.data;
|
|
243
|
+
const ab = buf.buffer instanceof ArrayBuffer
|
|
244
|
+
? buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)
|
|
245
|
+
: new Uint8Array(buf).buffer;
|
|
246
|
+
void this._invokeMessage(ab, true);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
void this._invokeMessage(ev.data, ev.isBinary);
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
onPing: (payload) => {
|
|
253
|
+
// Auto-pong per RFC 6455 §5.5.2.
|
|
254
|
+
this._writeFrame(WS_OPCODE.PONG, payload);
|
|
255
|
+
},
|
|
256
|
+
onPong: () => {
|
|
257
|
+
/* application-level latency tracking is out of scope */
|
|
258
|
+
},
|
|
259
|
+
onClose: (code, reason) => {
|
|
260
|
+
if (this.readyState === WS_READY_STATE.OPEN) {
|
|
261
|
+
// Echo close per RFC 6455 §5.5.1.
|
|
262
|
+
this.readyState = WS_READY_STATE.CLOSING;
|
|
263
|
+
this._writeFrame(WS_OPCODE.CLOSE, encodeClosePayload(code, reason));
|
|
264
|
+
}
|
|
265
|
+
this.readyState = WS_READY_STATE.CLOSED;
|
|
266
|
+
this._fireClose(code, reason);
|
|
267
|
+
this.socket.end();
|
|
268
|
+
},
|
|
269
|
+
onProtocolError: (err) => {
|
|
270
|
+
this._invokeError(err);
|
|
271
|
+
this.close(WS_CLOSE_CODE.PROTOCOL_ERROR, err.message);
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
get bufferedAmount() {
|
|
276
|
+
return this.socket.writableLength ?? 0;
|
|
277
|
+
}
|
|
278
|
+
send(data) {
|
|
279
|
+
if (this.readyState !== WS_READY_STATE.OPEN)
|
|
280
|
+
return;
|
|
281
|
+
const { opcode, payload } = encodeSendPayload(data);
|
|
282
|
+
this._writeFrame(opcode, payload);
|
|
283
|
+
}
|
|
284
|
+
close(code = WS_CLOSE_CODE.NORMAL_CLOSURE, reason = "") {
|
|
285
|
+
if (this.readyState >= WS_READY_STATE.CLOSING)
|
|
286
|
+
return;
|
|
287
|
+
this.readyState = WS_READY_STATE.CLOSING;
|
|
288
|
+
this._writeFrame(WS_OPCODE.CLOSE, encodeClosePayload(code, reason));
|
|
289
|
+
this._fireClose(code, reason);
|
|
290
|
+
this.socket.end();
|
|
291
|
+
}
|
|
292
|
+
ping(data) {
|
|
293
|
+
this._controlFrame(WS_OPCODE.PING, data);
|
|
294
|
+
}
|
|
295
|
+
pong(data) {
|
|
296
|
+
this._controlFrame(WS_OPCODE.PONG, data);
|
|
297
|
+
}
|
|
298
|
+
terminate() {
|
|
299
|
+
this.readyState = WS_READY_STATE.CLOSED;
|
|
300
|
+
this.socket.destroy();
|
|
301
|
+
}
|
|
302
|
+
// --- internals ---
|
|
303
|
+
_ingest(chunk) {
|
|
304
|
+
if (this.readyState === WS_READY_STATE.CLOSED)
|
|
305
|
+
return;
|
|
306
|
+
this.sink.push(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
|
|
307
|
+
}
|
|
308
|
+
_handleSocketClose() {
|
|
309
|
+
this.readyState = WS_READY_STATE.CLOSED;
|
|
310
|
+
this._fireClose(WS_CLOSE_CODE.ABNORMAL_CLOSURE, "");
|
|
311
|
+
}
|
|
312
|
+
_handleSocketError(err) {
|
|
313
|
+
this._invokeError(err);
|
|
314
|
+
this.readyState = WS_READY_STATE.CLOSED;
|
|
315
|
+
this.socket.destroy();
|
|
316
|
+
}
|
|
317
|
+
_controlFrame(opcode, data) {
|
|
318
|
+
if (this.readyState !== WS_READY_STATE.OPEN)
|
|
319
|
+
return;
|
|
320
|
+
let payload = new Uint8Array(0);
|
|
321
|
+
if (data !== undefined) {
|
|
322
|
+
payload = encodeSendPayload(data).payload;
|
|
323
|
+
if (payload.length > WS_MAX_CONTROL_PAYLOAD) {
|
|
324
|
+
throw new WebSocketProtocolError("Control frame payload exceeds 125 bytes");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
this._writeFrame(opcode, payload);
|
|
328
|
+
}
|
|
329
|
+
_writeFrame(opcode, payload) {
|
|
330
|
+
const frame = encodeFrame({ opcode, payload });
|
|
331
|
+
this.socket.write(Buffer.from(frame.buffer, frame.byteOffset, frame.byteLength));
|
|
332
|
+
}
|
|
333
|
+
_invokeError(err) {
|
|
334
|
+
this._invokeHandler("WebSocket error() handler threw", () => this.handler.error?.(this, err));
|
|
335
|
+
}
|
|
336
|
+
async _invokeMessage(data, isBinary) {
|
|
337
|
+
try {
|
|
338
|
+
await this.handler.message?.(this, data, isBinary);
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
this.app.log.error({ err }, "WebSocket message() handler failed");
|
|
342
|
+
this._invokeError(err);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
_fireClose(code, reason) {
|
|
346
|
+
if (this.closeHandled)
|
|
347
|
+
return;
|
|
348
|
+
this.closeHandled = true;
|
|
349
|
+
this._invokeHandler("WebSocket close() handler threw", () => this.handler.close?.(this, code, reason));
|
|
350
|
+
}
|
|
351
|
+
_invokeHandler(label, run) {
|
|
352
|
+
try {
|
|
353
|
+
const result = run();
|
|
354
|
+
if (result && typeof result.then === "function") {
|
|
355
|
+
void result.catch((err) => {
|
|
356
|
+
this.app.log.error({ err }, label);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
this.app.log.error({ err }, label);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
103
365
|
//# sourceMappingURL=node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { WebSocketRegistry, type WebSocketHandler } from "./websocket.js";
|
|
1
2
|
import { type Logger } from "./logger.js";
|
|
2
3
|
import type { HttpMethod, Hooks, PathString, RequestSchemas, ResponsesMap, RouteDefinition } from "./types.js";
|
|
3
4
|
/**
|
|
@@ -141,6 +142,8 @@ export declare class App {
|
|
|
141
142
|
/** Public registry: enables OpenAPI gen, typed-client gen, dead-route detection. */
|
|
142
143
|
readonly routes: RouteDefinition<any, any, any, any>[];
|
|
143
144
|
private router;
|
|
145
|
+
/** WebSocket route registry. Adapters look up handlers via `app.webSocketRoutes.find()`. */
|
|
146
|
+
readonly webSocketRoutes: WebSocketRegistry;
|
|
144
147
|
private prefix;
|
|
145
148
|
private groupHooks;
|
|
146
149
|
private groupTags;
|
|
@@ -183,6 +186,14 @@ export declare class App {
|
|
|
183
186
|
* @returns This `App` instance for chaining.
|
|
184
187
|
*/
|
|
185
188
|
route<P extends PathString, M extends HttpMethod, Req extends RequestSchemas | undefined, Res extends ResponsesMap>(def: RouteDefinition<P, M, Req, Res>): this;
|
|
189
|
+
/**
|
|
190
|
+
* Register a WebSocket route. The handler runs when an HTTP client sends an
|
|
191
|
+
* `Upgrade: websocket` request to `path`; the adapter performs the RFC 6455
|
|
192
|
+
* handshake and invokes the lifecycle callbacks. Path params (`/chat/:room`)
|
|
193
|
+
* land on `ctx.params`. The handler shape matches Bun's WebSocket API.
|
|
194
|
+
* @example `app.ws("/echo", { message(c, d) { c.send(d); } });`
|
|
195
|
+
*/
|
|
196
|
+
ws<P extends PathString, TData = unknown>(path: P, handler: WebSocketHandler<P, any, TData>): this;
|
|
186
197
|
/**
|
|
187
198
|
* Mount a group of routes under a shared prefix with shared tags, hooks,
|
|
188
199
|
* and authentication. The `register` callback receives an encapsulated
|
|
@@ -268,7 +279,7 @@ export declare class App {
|
|
|
268
279
|
*/
|
|
269
280
|
onClose(hook: () => void | Promise<void>): this;
|
|
270
281
|
/**
|
|
271
|
-
|
|
282
|
+
* Subscribe to plugin install events. The listener fires once per registered
|
|
272
283
|
* plugin, after `register()` (or its returned promise) completes. Useful
|
|
273
284
|
* for observability plugins that want to enumerate everything else that
|
|
274
285
|
* was installed without polluting the route registry.
|
|
@@ -282,8 +293,7 @@ export declare class App {
|
|
|
282
293
|
*/
|
|
283
294
|
onShutdown(listener: (info: ShutdownEvent) => void | Promise<void>): this;
|
|
284
295
|
/**
|
|
285
|
-
* Encapsulated plugin registration (Fastify-style).
|
|
286
|
-
* The plugin function receives a child App; its routes/hooks are scoped.
|
|
296
|
+
* Encapsulated plugin registration (Fastify-style). Receives a child App; routes/hooks are scoped.
|
|
287
297
|
*/
|
|
288
298
|
register(plugin: {
|
|
289
299
|
name?: string;
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/app.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from "./router.js";
|
|
2
|
+
import { WebSocketRegistry } from "./websocket.js";
|
|
2
3
|
import { BadRequestError, HttpError, InternalError, MethodNotAllowedError, NotFoundError, PayloadTooLargeError, RequestTimeoutError, UnsupportedMediaTypeError, ValidationError, } from "./errors.js";
|
|
3
4
|
import { validate } from "./schema.js";
|
|
4
5
|
import { readBodyLimited, safeJsonParse, randomId } from "./security.js";
|
|
@@ -63,6 +64,8 @@ export class App {
|
|
|
63
64
|
/** Public registry: enables OpenAPI gen, typed-client gen, dead-route detection. */
|
|
64
65
|
routes = [];
|
|
65
66
|
router = new Router();
|
|
67
|
+
/** WebSocket route registry. Adapters look up handlers via `app.webSocketRoutes.find()`. */
|
|
68
|
+
webSocketRoutes = new WebSocketRegistry();
|
|
66
69
|
prefix = "";
|
|
67
70
|
groupHooks = [];
|
|
68
71
|
groupTags = [];
|
|
@@ -89,7 +92,8 @@ export class App {
|
|
|
89
92
|
this.log =
|
|
90
93
|
options.logger === false
|
|
91
94
|
? noopLogger
|
|
92
|
-
: options.logger &&
|
|
95
|
+
: options.logger &&
|
|
96
|
+
typeof options.logger.info === "function"
|
|
93
97
|
? options.logger
|
|
94
98
|
: createLogger({ level: options.logger?.level ?? "info" });
|
|
95
99
|
}
|
|
@@ -131,6 +135,18 @@ export class App {
|
|
|
131
135
|
this.routes.push(merged);
|
|
132
136
|
return this;
|
|
133
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Register a WebSocket route. The handler runs when an HTTP client sends an
|
|
140
|
+
* `Upgrade: websocket` request to `path`; the adapter performs the RFC 6455
|
|
141
|
+
* handshake and invokes the lifecycle callbacks. Path params (`/chat/:room`)
|
|
142
|
+
* land on `ctx.params`. The handler shape matches Bun's WebSocket API.
|
|
143
|
+
* @example `app.ws("/echo", { message(c, d) { c.send(d); } });`
|
|
144
|
+
*/
|
|
145
|
+
ws(path, handler) {
|
|
146
|
+
const fullPath = joinPath(this.prefix, path);
|
|
147
|
+
this.webSocketRoutes.add(fullPath, handler, () => ({ ...this.decorations }));
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
134
150
|
/**
|
|
135
151
|
* Mount a group of routes under a shared prefix with shared tags, hooks,
|
|
136
152
|
* and authentication. The `register` callback receives an encapsulated
|
|
@@ -159,9 +175,13 @@ export class App {
|
|
|
159
175
|
const child = new App(this.options);
|
|
160
176
|
child.router = this.router;
|
|
161
177
|
child.routes = this.routes;
|
|
178
|
+
child.webSocketRoutes = this.webSocketRoutes;
|
|
162
179
|
child.log = this.log;
|
|
163
180
|
child.prefix = joinPath(this.prefix, prefix);
|
|
164
|
-
child.groupHooks = [
|
|
181
|
+
child.groupHooks = [
|
|
182
|
+
...this.groupHooks,
|
|
183
|
+
...(config.hooks ? [config.hooks] : []),
|
|
184
|
+
];
|
|
165
185
|
child.groupTags = [...this.groupTags, ...(config.tags ?? [])];
|
|
166
186
|
child.groupAuth = config.auth ?? this.groupAuth;
|
|
167
187
|
child.decorations = this.decorations;
|
|
@@ -238,7 +258,7 @@ export class App {
|
|
|
238
258
|
return this;
|
|
239
259
|
}
|
|
240
260
|
/**
|
|
241
|
-
|
|
261
|
+
* Subscribe to plugin install events. The listener fires once per registered
|
|
242
262
|
* plugin, after `register()` (or its returned promise) completes. Useful
|
|
243
263
|
* for observability plugins that want to enumerate everything else that
|
|
244
264
|
* was installed without polluting the route registry.
|
|
@@ -258,8 +278,7 @@ export class App {
|
|
|
258
278
|
return this;
|
|
259
279
|
}
|
|
260
280
|
/**
|
|
261
|
-
* Encapsulated plugin registration (Fastify-style).
|
|
262
|
-
* The plugin function receives a child App; its routes/hooks are scoped.
|
|
281
|
+
* Encapsulated plugin registration (Fastify-style). Receives a child App; routes/hooks are scoped.
|
|
263
282
|
*/
|
|
264
283
|
register(plugin, config = {}) {
|
|
265
284
|
const fn = typeof plugin === "function" ? plugin : plugin.register;
|
|
@@ -271,7 +290,10 @@ export class App {
|
|
|
271
290
|
this.installedPlugins.add(name);
|
|
272
291
|
}
|
|
273
292
|
const prefix = config.prefix ?? "/";
|
|
274
|
-
const event = {
|
|
293
|
+
const event = {
|
|
294
|
+
name,
|
|
295
|
+
prefix: joinPath(this.prefix, prefix),
|
|
296
|
+
};
|
|
275
297
|
this.group(prefix, config, (child) => {
|
|
276
298
|
const r = fn(child);
|
|
277
299
|
if (r && typeof r.then === "function") {
|
|
@@ -306,7 +328,9 @@ export class App {
|
|
|
306
328
|
this.log.error({ err, plugin: event.name }, "onPluginInstalled listener failed");
|
|
307
329
|
}
|
|
308
330
|
}
|
|
309
|
-
return promises.length > 0
|
|
331
|
+
return promises.length > 0
|
|
332
|
+
? Promise.all(promises).then(() => undefined)
|
|
333
|
+
: undefined;
|
|
310
334
|
}
|
|
311
335
|
/**
|
|
312
336
|
* Wait until every async plugin registered with {@link App.register} has
|
|
@@ -356,11 +380,21 @@ export class App {
|
|
|
356
380
|
type: "https://daloyjs.dev/errors/shutting-down",
|
|
357
381
|
title: "Service Unavailable",
|
|
358
382
|
status: 503,
|
|
359
|
-
}), {
|
|
383
|
+
}), {
|
|
384
|
+
status: 503,
|
|
385
|
+
headers: {
|
|
386
|
+
"content-type": "application/problem+json",
|
|
387
|
+
"retry-after": "5",
|
|
388
|
+
},
|
|
389
|
+
});
|
|
360
390
|
}
|
|
361
391
|
this.inflight++;
|
|
362
392
|
const requestId = randomId();
|
|
363
|
-
const log = this.log.child({
|
|
393
|
+
const log = this.log.child({
|
|
394
|
+
requestId,
|
|
395
|
+
method: request.method,
|
|
396
|
+
url: request.url,
|
|
397
|
+
});
|
|
364
398
|
let ctx;
|
|
365
399
|
const globalHooks = mergeHooks([this.options.hooks ?? {}]);
|
|
366
400
|
let activeErrorHook = globalHooks.onError;
|
|
@@ -371,7 +405,8 @@ export class App {
|
|
|
371
405
|
const url = new URL(request.url);
|
|
372
406
|
const method = request.method;
|
|
373
407
|
const headFallback = method === "HEAD";
|
|
374
|
-
const match = this.router.find(method, url.pathname) ??
|
|
408
|
+
const match = this.router.find(method, url.pathname) ??
|
|
409
|
+
(headFallback ? this.router.find("GET", url.pathname) : undefined);
|
|
375
410
|
if (!match) {
|
|
376
411
|
const allowed = this.router.allowedMethods(url.pathname);
|
|
377
412
|
ctx = {
|
|
@@ -397,13 +432,19 @@ export class App {
|
|
|
397
432
|
state: { ...this.decorations, requestId, log },
|
|
398
433
|
set: { headers: new Headers() },
|
|
399
434
|
};
|
|
400
|
-
const preflightHooks = mergeHooks([
|
|
435
|
+
const preflightHooks = mergeHooks([
|
|
436
|
+
this.options.hooks ?? {},
|
|
437
|
+
...this.groupHooks,
|
|
438
|
+
]);
|
|
401
439
|
const intercepted = await preflightHooks.beforeHandle?.(synthCtx);
|
|
402
440
|
if (intercepted instanceof Response) {
|
|
403
441
|
copyContextHeaders(synthCtx, intercepted);
|
|
404
442
|
return await finalizeResponse(intercepted, synthCtx, preflightHooks);
|
|
405
443
|
}
|
|
406
|
-
const res = new Response(null, {
|
|
444
|
+
const res = new Response(null, {
|
|
445
|
+
status: 204,
|
|
446
|
+
headers: { allow: allowed.join(", ") },
|
|
447
|
+
});
|
|
407
448
|
copyContextHeaders(synthCtx, res);
|
|
408
449
|
res.headers.set("x-request-id", requestId);
|
|
409
450
|
return await finalizeResponse(res, synthCtx, preflightHooks);
|
|
@@ -434,7 +475,10 @@ export class App {
|
|
|
434
475
|
result = afterReturn;
|
|
435
476
|
let response = await serializeResult(result, def, this.options.validateResponses ?? true);
|
|
436
477
|
if (method === "HEAD") {
|
|
437
|
-
response = new Response(null, {
|
|
478
|
+
response = new Response(null, {
|
|
479
|
+
status: response.status,
|
|
480
|
+
headers: response.headers,
|
|
481
|
+
});
|
|
438
482
|
}
|
|
439
483
|
copyContextHeaders(ctx, response);
|
|
440
484
|
return await finalizeResponse(response, ctx, allHooks);
|
|
@@ -446,7 +490,10 @@ export class App {
|
|
|
446
490
|
copyContextHeaders(ctx, handled);
|
|
447
491
|
if (!handled.headers.has("x-request-id"))
|
|
448
492
|
handled.headers.set("x-request-id", requestId);
|
|
449
|
-
return finalizeResponse(handled, ctx, {
|
|
493
|
+
return finalizeResponse(handled, ctx, {
|
|
494
|
+
onSend: activeSendHook,
|
|
495
|
+
onResponse: activeResponseHook,
|
|
496
|
+
});
|
|
450
497
|
}
|
|
451
498
|
const httpErr = err instanceof HttpError
|
|
452
499
|
? err
|
|
@@ -463,7 +510,10 @@ export class App {
|
|
|
463
510
|
copyContextHeaders(ctx, res);
|
|
464
511
|
if (!res.headers.has("x-request-id"))
|
|
465
512
|
res.headers.set("x-request-id", requestId);
|
|
466
|
-
return finalizeResponse(res, ctx, {
|
|
513
|
+
return finalizeResponse(res, ctx, {
|
|
514
|
+
onSend: activeSendHook,
|
|
515
|
+
onResponse: activeResponseHook,
|
|
516
|
+
});
|
|
467
517
|
}
|
|
468
518
|
finally {
|
|
469
519
|
this.inflight--;
|
|
@@ -486,7 +536,9 @@ export class App {
|
|
|
486
536
|
* @returns Fulfills with the `Response` produced by the matching handler.
|
|
487
537
|
*/
|
|
488
538
|
request(input, init) {
|
|
489
|
-
const url = typeof input === "string" && input.startsWith("/")
|
|
539
|
+
const url = typeof input === "string" && input.startsWith("/")
|
|
540
|
+
? `http://test.local${input}`
|
|
541
|
+
: input;
|
|
490
542
|
const req = url instanceof Request ? url : new Request(url, init);
|
|
491
543
|
return this.fetch(req);
|
|
492
544
|
}
|
|
@@ -710,7 +762,7 @@ function toIssues(issues) {
|
|
|
710
762
|
return issues.map((i) => ({
|
|
711
763
|
message: i.message,
|
|
712
764
|
path: (i.path ?? [])
|
|
713
|
-
.map((p) =>
|
|
765
|
+
.map((p) => typeof p === "object" && p && "key" in p ? p.key : p)
|
|
714
766
|
.join("."),
|
|
715
767
|
}));
|
|
716
768
|
}
|
|
@@ -769,7 +821,9 @@ async function serializeResult(result, def, validateResponses) {
|
|
|
769
821
|
if (validateResponses && spec.body) {
|
|
770
822
|
const r = await validate(spec.body, result.body);
|
|
771
823
|
if (r.issues) {
|
|
772
|
-
throw new InternalError(`Response body for ${def.method} ${def.path} failed schema validation: ${r.issues
|
|
824
|
+
throw new InternalError(`Response body for ${def.method} ${def.path} failed schema validation: ${r.issues
|
|
825
|
+
.map((i) => i.message)
|
|
826
|
+
.join("; ")}`);
|
|
773
827
|
}
|
|
774
828
|
}
|
|
775
829
|
const headers = new Headers(result.headers);
|
|
@@ -781,7 +835,10 @@ async function serializeResult(result, def, validateResponses) {
|
|
|
781
835
|
if (result.body === undefined || result.body === null) {
|
|
782
836
|
body = null;
|
|
783
837
|
}
|
|
784
|
-
else if (!treatAsJson &&
|
|
838
|
+
else if (!treatAsJson &&
|
|
839
|
+
(typeof result.body === "string" ||
|
|
840
|
+
result.body instanceof Uint8Array ||
|
|
841
|
+
result.body instanceof ArrayBuffer)) {
|
|
785
842
|
body = result.body;
|
|
786
843
|
}
|
|
787
844
|
else if (!treatAsJson && result.body instanceof ReadableStream) {
|