@daloyjs/core 0.1.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 +296 -0
- package/dist/adapters/bun.d.ts +16 -0
- package/dist/adapters/bun.d.ts.map +1 -0
- package/dist/adapters/bun.js +25 -0
- package/dist/adapters/bun.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +11 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +6 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/deno.d.ts +12 -0
- package/dist/adapters/deno.d.ts.map +1 -0
- package/dist/adapters/deno.js +13 -0
- package/dist/adapters/deno.js.map +1 -0
- package/dist/adapters/node.d.ts +25 -0
- package/dist/adapters/node.d.ts.map +1 -0
- package/dist/adapters/node.js +90 -0
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/vercel.d.ts +13 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +4 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/app.d.ts +104 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +487 -0
- package/dist/app.js.map +1 -0
- package/dist/client.d.ts +40 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +61 -0
- package/dist/client.js.map +1 -0
- package/dist/contract.d.ts +31 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +76 -0
- package/dist/contract.js.map +1 -0
- package/dist/docs.d.ts +16 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +51 -0
- package/dist/docs.js.map +1 -0
- package/dist/errors.d.ts +75 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +155 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +26 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +74 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware.d.ts +62 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +201 -0
- package/dist/middleware.js.map +1 -0
- package/dist/openapi.d.ts +28 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +178 -0
- package/dist/openapi.js.map +1 -0
- package/dist/router.d.ts +30 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +135 -0
- package/dist/router.js.map +1 -0
- package/dist/schema.d.ts +45 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +13 -0
- package/dist/schema.js.map +1 -0
- package/dist/security.d.ts +21 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +107 -0
- package/dist/security.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +108 -0
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { type Logger } from "./logger.js";
|
|
2
|
+
import type { HttpMethod, Hooks, PathString, RequestSchemas, ResponsesMap, RouteDefinition } from "./types.js";
|
|
3
|
+
export interface AppOptions {
|
|
4
|
+
/** OpenAPI document metadata */
|
|
5
|
+
title?: string;
|
|
6
|
+
version?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
/** Validate handler responses against declared response schemas. Default: true. */
|
|
9
|
+
validateResponses?: boolean;
|
|
10
|
+
/** Hard cap on request body size in bytes. Default: 1 MiB. */
|
|
11
|
+
bodyLimitBytes?: number;
|
|
12
|
+
/** Reject requests whose Content-Type isn't in this allowlist (when a body schema is declared). */
|
|
13
|
+
allowedContentTypes?: string[];
|
|
14
|
+
/** Per-request timeout in ms (handler + hooks). Default: 30000. Set 0 to disable. */
|
|
15
|
+
requestTimeoutMs?: number;
|
|
16
|
+
/** Production mode hides 5xx detail in error responses. Default: NODE_ENV === "production". */
|
|
17
|
+
production?: boolean;
|
|
18
|
+
/** Pluggable logger. Default: structured JSON logger at "info" (or noop in test). */
|
|
19
|
+
logger?: Logger | {
|
|
20
|
+
level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal";
|
|
21
|
+
} | false;
|
|
22
|
+
/**
|
|
23
|
+
* Mock mode: instead of running handlers, return the first declared response example
|
|
24
|
+
* (or an empty body matching the schema). Useful for frontend teams.
|
|
25
|
+
*/
|
|
26
|
+
mockMode?: boolean;
|
|
27
|
+
/** Global hooks applied to every route. */
|
|
28
|
+
hooks?: Hooks;
|
|
29
|
+
}
|
|
30
|
+
export interface IntrospectedRoute {
|
|
31
|
+
method: HttpMethod;
|
|
32
|
+
path: string;
|
|
33
|
+
operationId?: string;
|
|
34
|
+
tags?: string[];
|
|
35
|
+
summary?: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
deprecated?: boolean;
|
|
38
|
+
hasBody: boolean;
|
|
39
|
+
hasQuery: boolean;
|
|
40
|
+
hasParams: boolean;
|
|
41
|
+
hasHeaders: boolean;
|
|
42
|
+
responses: number[];
|
|
43
|
+
auth?: {
|
|
44
|
+
scheme: string;
|
|
45
|
+
scopes?: string[];
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export declare class App {
|
|
49
|
+
readonly options: Required<Pick<AppOptions, "validateResponses" | "bodyLimitBytes" | "requestTimeoutMs">> & AppOptions;
|
|
50
|
+
readonly log: Logger;
|
|
51
|
+
/** Public registry: enables OpenAPI gen, typed-client gen, dead-route detection. */
|
|
52
|
+
readonly routes: RouteDefinition<any, any, any, any>[];
|
|
53
|
+
private router;
|
|
54
|
+
private prefix;
|
|
55
|
+
private groupHooks;
|
|
56
|
+
private groupTags;
|
|
57
|
+
private groupAuth?;
|
|
58
|
+
/** Decorator bag merged into ctx.state on every request. */
|
|
59
|
+
private decorations;
|
|
60
|
+
private installedPlugins;
|
|
61
|
+
/** In-flight request count for graceful shutdown. */
|
|
62
|
+
private inflight;
|
|
63
|
+
private draining;
|
|
64
|
+
constructor(options?: AppOptions);
|
|
65
|
+
route<P extends PathString, M extends HttpMethod, Req extends RequestSchemas | undefined, Res extends ResponsesMap>(def: RouteDefinition<P, M, Req, Res>): this;
|
|
66
|
+
/** Group routes under a path prefix with shared tags/hooks/auth (encapsulated). */
|
|
67
|
+
group(prefix: PathString, config: {
|
|
68
|
+
tags?: string[];
|
|
69
|
+
hooks?: Hooks;
|
|
70
|
+
auth?: RouteDefinition["auth"];
|
|
71
|
+
}, register: (app: App) => void): this;
|
|
72
|
+
/** Attach a hook layer to all subsequently-registered routes. */
|
|
73
|
+
use(hooks: Hooks): this;
|
|
74
|
+
/**
|
|
75
|
+
* Decorate ctx.state with values available in every handler.
|
|
76
|
+
* Typed augmentation surface for plugins.
|
|
77
|
+
*/
|
|
78
|
+
decorate<K extends string, V>(key: K, value: V): this;
|
|
79
|
+
/**
|
|
80
|
+
* Encapsulated plugin registration (Fastify-style).
|
|
81
|
+
* The plugin function receives a child App; its routes/hooks are scoped.
|
|
82
|
+
*/
|
|
83
|
+
register(plugin: {
|
|
84
|
+
name?: string;
|
|
85
|
+
register: (app: App) => void | Promise<void>;
|
|
86
|
+
} | ((app: App) => void | Promise<void>), config?: {
|
|
87
|
+
prefix?: PathString;
|
|
88
|
+
tags?: string[];
|
|
89
|
+
hooks?: Hooks;
|
|
90
|
+
auth?: RouteDefinition["auth"];
|
|
91
|
+
}): this;
|
|
92
|
+
/** Wait for all async plugins to finish initializing. */
|
|
93
|
+
ready(): Promise<void>;
|
|
94
|
+
fetch: (request: Request) => Promise<Response>;
|
|
95
|
+
/** In-process test client. */
|
|
96
|
+
request(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
97
|
+
introspect(): IntrospectedRoute[];
|
|
98
|
+
/**
|
|
99
|
+
* Begin graceful shutdown: stop accepting new requests, wait for in-flight
|
|
100
|
+
* requests to drain (up to `timeoutMs`).
|
|
101
|
+
*/
|
|
102
|
+
shutdown(timeoutMs?: number): Promise<void>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { Router } from "./router.js";
|
|
2
|
+
import { HttpError, InternalError, MethodNotAllowedError, NotFoundError, RequestTimeoutError, UnsupportedMediaTypeError, ValidationError, } from "./errors.js";
|
|
3
|
+
import { validate } from "./schema.js";
|
|
4
|
+
import { readBodyLimited, safeJsonParse, randomId } from "./security.js";
|
|
5
|
+
import { createLogger, noopLogger } from "./logger.js";
|
|
6
|
+
const DEFAULTS = {
|
|
7
|
+
bodyLimitBytes: 1024 * 1024,
|
|
8
|
+
requestTimeoutMs: 30_000,
|
|
9
|
+
validateResponses: true,
|
|
10
|
+
};
|
|
11
|
+
export class App {
|
|
12
|
+
options;
|
|
13
|
+
log;
|
|
14
|
+
/** Public registry: enables OpenAPI gen, typed-client gen, dead-route detection. */
|
|
15
|
+
routes = [];
|
|
16
|
+
router = new Router();
|
|
17
|
+
prefix = "";
|
|
18
|
+
groupHooks = [];
|
|
19
|
+
groupTags = [];
|
|
20
|
+
groupAuth;
|
|
21
|
+
/** Decorator bag merged into ctx.state on every request. */
|
|
22
|
+
decorations = {};
|
|
23
|
+
installedPlugins = new Set();
|
|
24
|
+
/** In-flight request count for graceful shutdown. */
|
|
25
|
+
inflight = 0;
|
|
26
|
+
draining = false;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.options = {
|
|
29
|
+
validateResponses: options.validateResponses ?? DEFAULTS.validateResponses,
|
|
30
|
+
bodyLimitBytes: options.bodyLimitBytes ?? DEFAULTS.bodyLimitBytes,
|
|
31
|
+
requestTimeoutMs: options.requestTimeoutMs ?? DEFAULTS.requestTimeoutMs,
|
|
32
|
+
...options,
|
|
33
|
+
};
|
|
34
|
+
this.log =
|
|
35
|
+
options.logger === false
|
|
36
|
+
? noopLogger
|
|
37
|
+
: options.logger && typeof options.logger.info === "function"
|
|
38
|
+
? options.logger
|
|
39
|
+
: createLogger({ level: options.logger?.level ?? "info" });
|
|
40
|
+
}
|
|
41
|
+
// ---------- registration ----------
|
|
42
|
+
route(def) {
|
|
43
|
+
const fullPath = joinPath(this.prefix, def.path);
|
|
44
|
+
const merged = {
|
|
45
|
+
...def,
|
|
46
|
+
path: fullPath,
|
|
47
|
+
tags: [...(this.groupTags ?? []), ...(def.tags ?? [])],
|
|
48
|
+
auth: def.auth ?? this.groupAuth,
|
|
49
|
+
};
|
|
50
|
+
const hooks = mergeHooks([...this.groupHooks, def.hooks ?? {}]);
|
|
51
|
+
this.router.add(def.method, fullPath, { def: merged, hooks }, def.operationId);
|
|
52
|
+
this.routes.push(merged);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
/** Group routes under a path prefix with shared tags/hooks/auth (encapsulated). */
|
|
56
|
+
group(prefix, config, register) {
|
|
57
|
+
const child = new App(this.options);
|
|
58
|
+
child.router = this.router;
|
|
59
|
+
child.log = this.log;
|
|
60
|
+
child.prefix = joinPath(this.prefix, prefix);
|
|
61
|
+
child.groupHooks = [...this.groupHooks, ...(config.hooks ? [config.hooks] : [])];
|
|
62
|
+
child.groupTags = [...this.groupTags, ...(config.tags ?? [])];
|
|
63
|
+
child.groupAuth = config.auth ?? this.groupAuth;
|
|
64
|
+
child.decorations = this.decorations;
|
|
65
|
+
register(child);
|
|
66
|
+
this.routes.push(...child.routes);
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
/** Attach a hook layer to all subsequently-registered routes. */
|
|
70
|
+
use(hooks) {
|
|
71
|
+
this.groupHooks.push(hooks);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Decorate ctx.state with values available in every handler.
|
|
76
|
+
* Typed augmentation surface for plugins.
|
|
77
|
+
*/
|
|
78
|
+
decorate(key, value) {
|
|
79
|
+
this.decorations[key] = value;
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Encapsulated plugin registration (Fastify-style).
|
|
84
|
+
* The plugin function receives a child App; its routes/hooks are scoped.
|
|
85
|
+
*/
|
|
86
|
+
register(plugin, config = {}) {
|
|
87
|
+
const fn = typeof plugin === "function" ? plugin : plugin.register;
|
|
88
|
+
const name = typeof plugin === "function" ? undefined : plugin.name;
|
|
89
|
+
if (name) {
|
|
90
|
+
if (this.installedPlugins.has(name)) {
|
|
91
|
+
throw new Error(`Plugin "${name}" already registered`);
|
|
92
|
+
}
|
|
93
|
+
this.installedPlugins.add(name);
|
|
94
|
+
}
|
|
95
|
+
const prefix = config.prefix ?? "/";
|
|
96
|
+
this.group(prefix, config, (child) => {
|
|
97
|
+
const r = fn(child);
|
|
98
|
+
if (r && typeof r.then === "function") {
|
|
99
|
+
// Plugin is async — caller should await app.ready().
|
|
100
|
+
this.__pendingPlugins ??= [];
|
|
101
|
+
this.__pendingPlugins.push(r);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return this;
|
|
105
|
+
}
|
|
106
|
+
/** Wait for all async plugins to finish initializing. */
|
|
107
|
+
async ready() {
|
|
108
|
+
const pending = this.__pendingPlugins ?? [];
|
|
109
|
+
if (pending.length) {
|
|
110
|
+
await Promise.all(pending);
|
|
111
|
+
this.__pendingPlugins = [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// ---------- runtime ----------
|
|
115
|
+
fetch = async (request) => {
|
|
116
|
+
if (this.draining) {
|
|
117
|
+
return new Response(JSON.stringify({
|
|
118
|
+
type: "https://daloyjs.dev/errors/shutting-down",
|
|
119
|
+
title: "Service Unavailable",
|
|
120
|
+
status: 503,
|
|
121
|
+
}), { status: 503, headers: { "content-type": "application/problem+json", "retry-after": "5" } });
|
|
122
|
+
}
|
|
123
|
+
this.inflight++;
|
|
124
|
+
const requestId = randomId();
|
|
125
|
+
const log = this.log.child({ requestId, method: request.method, url: request.url });
|
|
126
|
+
let ctx;
|
|
127
|
+
const globalHooks = mergeHooks([this.options.hooks ?? {}]);
|
|
128
|
+
let activeErrorHook = globalHooks.onError;
|
|
129
|
+
let activeResponseHook = globalHooks.onResponse;
|
|
130
|
+
try {
|
|
131
|
+
await globalHooks.onRequest?.(request);
|
|
132
|
+
const url = new URL(request.url);
|
|
133
|
+
const method = request.method;
|
|
134
|
+
const headFallback = method === "HEAD";
|
|
135
|
+
const match = this.router.find(method, url.pathname) ?? (headFallback ? this.router.find("GET", url.pathname) : undefined);
|
|
136
|
+
if (!match) {
|
|
137
|
+
const allowed = this.router.allowedMethods(url.pathname);
|
|
138
|
+
if (allowed.length > 0) {
|
|
139
|
+
if (method === "OPTIONS") {
|
|
140
|
+
// Synthesize a preflight: let global hooks (e.g. CORS) intercept;
|
|
141
|
+
// otherwise return 204 with Allow header.
|
|
142
|
+
const synthCtx = {
|
|
143
|
+
request,
|
|
144
|
+
params: {},
|
|
145
|
+
query: {},
|
|
146
|
+
headers: headersToObject(request.headers),
|
|
147
|
+
body: undefined,
|
|
148
|
+
state: { ...this.decorations, requestId, log },
|
|
149
|
+
set: { headers: new Headers() },
|
|
150
|
+
};
|
|
151
|
+
const preflightHooks = mergeHooks([this.options.hooks ?? {}, ...this.groupHooks]);
|
|
152
|
+
const intercepted = await preflightHooks.beforeHandle?.(synthCtx);
|
|
153
|
+
if (intercepted instanceof Response) {
|
|
154
|
+
copyContextHeaders(synthCtx, intercepted);
|
|
155
|
+
await preflightHooks.onResponse?.(intercepted);
|
|
156
|
+
return intercepted;
|
|
157
|
+
}
|
|
158
|
+
const res = new Response(null, { status: 204, headers: { allow: allowed.join(", ") } });
|
|
159
|
+
copyContextHeaders(synthCtx, res);
|
|
160
|
+
res.headers.set("x-request-id", requestId);
|
|
161
|
+
await preflightHooks.onResponse?.(res);
|
|
162
|
+
return res;
|
|
163
|
+
}
|
|
164
|
+
throw new MethodNotAllowedError(allowed);
|
|
165
|
+
}
|
|
166
|
+
throw new NotFoundError(`No route for ${request.method} ${url.pathname}`);
|
|
167
|
+
}
|
|
168
|
+
const { def, hooks } = match.handler;
|
|
169
|
+
const allHooks = mergeHooks([globalHooks, hooks]);
|
|
170
|
+
activeErrorHook = allHooks.onError;
|
|
171
|
+
activeResponseHook = allHooks.onResponse;
|
|
172
|
+
await hooks.onRequest?.(request);
|
|
173
|
+
ctx = await buildContext(request, url, match.params, def, this.options);
|
|
174
|
+
Object.assign(ctx.state, this.decorations, { requestId, log });
|
|
175
|
+
ctx.set.headers.set("x-request-id", requestId);
|
|
176
|
+
const before = await allHooks.beforeHandle?.(ctx);
|
|
177
|
+
if (before instanceof Response) {
|
|
178
|
+
copyContextHeaders(ctx, before);
|
|
179
|
+
await allHooks.onResponse?.(before);
|
|
180
|
+
return before;
|
|
181
|
+
}
|
|
182
|
+
let result;
|
|
183
|
+
if (this.options.mockMode) {
|
|
184
|
+
result = mockResponseFor(def);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const handlerPromise = Promise.resolve(def.handler(ctx));
|
|
188
|
+
result = this.options.requestTimeoutMs > 0
|
|
189
|
+
? await withTimeout(handlerPromise, this.options.requestTimeoutMs)
|
|
190
|
+
: await handlerPromise;
|
|
191
|
+
}
|
|
192
|
+
const afterReturn = await allHooks.afterHandle?.(ctx, result);
|
|
193
|
+
if (afterReturn !== undefined)
|
|
194
|
+
result = afterReturn;
|
|
195
|
+
let response = await serializeResult(result, def, this.options.validateResponses ?? true);
|
|
196
|
+
if (method === "HEAD") {
|
|
197
|
+
response = new Response(null, { status: response.status, headers: response.headers });
|
|
198
|
+
}
|
|
199
|
+
copyContextHeaders(ctx, response);
|
|
200
|
+
await allHooks.onResponse?.(response);
|
|
201
|
+
return response;
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
const handled = await activeErrorHook?.(err, ctx);
|
|
205
|
+
if (handled instanceof Response) {
|
|
206
|
+
if (ctx)
|
|
207
|
+
copyContextHeaders(ctx, handled);
|
|
208
|
+
if (!handled.headers.has("x-request-id"))
|
|
209
|
+
handled.headers.set("x-request-id", requestId);
|
|
210
|
+
await activeResponseHook?.(handled);
|
|
211
|
+
return handled;
|
|
212
|
+
}
|
|
213
|
+
const httpErr = err instanceof HttpError
|
|
214
|
+
? err
|
|
215
|
+
: err instanceof Error
|
|
216
|
+
? new InternalError(err.message)
|
|
217
|
+
: new InternalError("Unexpected error");
|
|
218
|
+
if (httpErr.status >= 500) {
|
|
219
|
+
log.error({ err: serializeErr(err) }, httpErr.problem.title);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
log.warn({ status: httpErr.status }, httpErr.problem.title);
|
|
223
|
+
}
|
|
224
|
+
const res = httpErr.toResponse({
|
|
225
|
+
production: this.options.production,
|
|
226
|
+
requestId,
|
|
227
|
+
});
|
|
228
|
+
if (ctx)
|
|
229
|
+
copyContextHeaders(ctx, res);
|
|
230
|
+
if (!res.headers.has("x-request-id"))
|
|
231
|
+
res.headers.set("x-request-id", requestId);
|
|
232
|
+
await activeResponseHook?.(res);
|
|
233
|
+
return res;
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
this.inflight--;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
/** In-process test client. */
|
|
240
|
+
request(input, init) {
|
|
241
|
+
const url = typeof input === "string" && input.startsWith("/") ? `http://test.local${input}` : input;
|
|
242
|
+
const req = url instanceof Request ? url : new Request(url, init);
|
|
243
|
+
return this.fetch(req);
|
|
244
|
+
}
|
|
245
|
+
introspect() {
|
|
246
|
+
return this.routes.map((r) => ({
|
|
247
|
+
method: r.method,
|
|
248
|
+
path: r.path,
|
|
249
|
+
operationId: r.operationId,
|
|
250
|
+
tags: r.tags,
|
|
251
|
+
summary: r.summary,
|
|
252
|
+
description: r.description,
|
|
253
|
+
deprecated: r.deprecated,
|
|
254
|
+
hasBody: !!r.request?.body,
|
|
255
|
+
hasQuery: !!r.request?.query,
|
|
256
|
+
hasParams: !!r.request?.params,
|
|
257
|
+
hasHeaders: !!r.request?.headers,
|
|
258
|
+
responses: Object.keys(r.responses).map(Number),
|
|
259
|
+
auth: r.auth,
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Begin graceful shutdown: stop accepting new requests, wait for in-flight
|
|
264
|
+
* requests to drain (up to `timeoutMs`).
|
|
265
|
+
*/
|
|
266
|
+
async shutdown(timeoutMs = 10_000) {
|
|
267
|
+
this.draining = true;
|
|
268
|
+
const start = Date.now();
|
|
269
|
+
while (this.inflight > 0 && Date.now() - start < timeoutMs) {
|
|
270
|
+
await new Promise((r) => setTimeout(r, 25));
|
|
271
|
+
}
|
|
272
|
+
this.log.info({ inflight: this.inflight }, "DaloyJS shutdown complete");
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// ---------- helpers ----------
|
|
276
|
+
function joinPath(a, b) {
|
|
277
|
+
const left = a.replace(/\/+$/, "");
|
|
278
|
+
const right = b.startsWith("/") ? b : `/${b}`;
|
|
279
|
+
const joined = `${left}${right}`;
|
|
280
|
+
return joined === "" ? "/" : joined;
|
|
281
|
+
}
|
|
282
|
+
function mergeHooks(layers) {
|
|
283
|
+
const pick = (key) => layers
|
|
284
|
+
.map((h) => h[key])
|
|
285
|
+
.filter((f) => typeof f === "function");
|
|
286
|
+
return {
|
|
287
|
+
onRequest: chain(pick("onRequest")),
|
|
288
|
+
beforeHandle: firstResponse(pick("beforeHandle")),
|
|
289
|
+
afterHandle: pipeline(pick("afterHandle")),
|
|
290
|
+
onError: firstResponse(pick("onError")),
|
|
291
|
+
onResponse: chain(pick("onResponse")),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
function chain(fns) {
|
|
295
|
+
if (fns.length === 0)
|
|
296
|
+
return undefined;
|
|
297
|
+
return (async (...args) => {
|
|
298
|
+
for (const fn of fns)
|
|
299
|
+
await fn(...args);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function firstResponse(fns) {
|
|
303
|
+
if (fns.length === 0)
|
|
304
|
+
return undefined;
|
|
305
|
+
return (async (...args) => {
|
|
306
|
+
for (const fn of fns) {
|
|
307
|
+
const r = await fn(...args);
|
|
308
|
+
if (r instanceof Response)
|
|
309
|
+
return r;
|
|
310
|
+
}
|
|
311
|
+
return undefined;
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
function pipeline(fns) {
|
|
315
|
+
if (fns.length === 0)
|
|
316
|
+
return undefined;
|
|
317
|
+
return (async (ctx, value) => {
|
|
318
|
+
let v = value;
|
|
319
|
+
for (const fn of fns) {
|
|
320
|
+
const r = await fn(ctx, v);
|
|
321
|
+
if (r !== undefined)
|
|
322
|
+
v = r;
|
|
323
|
+
}
|
|
324
|
+
return v;
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
function copyContextHeaders(ctx, res) {
|
|
328
|
+
ctx.set.headers.forEach((v, k) => {
|
|
329
|
+
if (!res.headers.has(k))
|
|
330
|
+
res.headers.set(k, v);
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
async function buildContext(request, url, rawParams, def, opts) {
|
|
334
|
+
const set = { headers: new Headers() };
|
|
335
|
+
const headersObj = headersToObject(request.headers);
|
|
336
|
+
const queryObj = queryToObject(url.searchParams);
|
|
337
|
+
let params = rawParams;
|
|
338
|
+
let query = queryObj;
|
|
339
|
+
let headers = headersObj;
|
|
340
|
+
let body = undefined;
|
|
341
|
+
if (def.request?.params) {
|
|
342
|
+
const r = await validate(def.request.params, rawParams);
|
|
343
|
+
if (r.issues)
|
|
344
|
+
throw new ValidationError("params", toIssues(r.issues));
|
|
345
|
+
params = r.value;
|
|
346
|
+
}
|
|
347
|
+
if (def.request?.query) {
|
|
348
|
+
const r = await validate(def.request.query, queryObj);
|
|
349
|
+
if (r.issues)
|
|
350
|
+
throw new ValidationError("query", toIssues(r.issues));
|
|
351
|
+
query = r.value;
|
|
352
|
+
}
|
|
353
|
+
if (def.request?.headers) {
|
|
354
|
+
const r = await validate(def.request.headers, headersObj);
|
|
355
|
+
if (r.issues)
|
|
356
|
+
throw new ValidationError("headers", toIssues(r.issues));
|
|
357
|
+
headers = r.value;
|
|
358
|
+
}
|
|
359
|
+
if (def.request?.body) {
|
|
360
|
+
const ct = (request.headers.get("content-type") ?? "").toLowerCase();
|
|
361
|
+
const allowed = opts.allowedContentTypes ?? [
|
|
362
|
+
"application/json",
|
|
363
|
+
"application/x-www-form-urlencoded",
|
|
364
|
+
"multipart/form-data",
|
|
365
|
+
];
|
|
366
|
+
if (!allowed.some((a) => ct.includes(a))) {
|
|
367
|
+
throw new UnsupportedMediaTypeError(ct || "(none)", allowed);
|
|
368
|
+
}
|
|
369
|
+
const raw = await readBody(request, ct, opts.bodyLimitBytes);
|
|
370
|
+
const r = await validate(def.request.body, raw);
|
|
371
|
+
if (r.issues)
|
|
372
|
+
throw new ValidationError("body", toIssues(r.issues));
|
|
373
|
+
body = r.value;
|
|
374
|
+
}
|
|
375
|
+
return { request, params, query, headers, body, state: {}, set };
|
|
376
|
+
}
|
|
377
|
+
function headersToObject(h) {
|
|
378
|
+
const o = {};
|
|
379
|
+
h.forEach((v, k) => {
|
|
380
|
+
o[k] = v;
|
|
381
|
+
});
|
|
382
|
+
return o;
|
|
383
|
+
}
|
|
384
|
+
function queryToObject(s) {
|
|
385
|
+
const o = {};
|
|
386
|
+
for (const key of new Set(s.keys())) {
|
|
387
|
+
const all = s.getAll(key);
|
|
388
|
+
o[key] = all.length > 1 ? all : all[0];
|
|
389
|
+
}
|
|
390
|
+
return o;
|
|
391
|
+
}
|
|
392
|
+
function toIssues(issues) {
|
|
393
|
+
return issues.map((i) => ({
|
|
394
|
+
message: i.message,
|
|
395
|
+
path: (i.path ?? [])
|
|
396
|
+
.map((p) => (typeof p === "object" && p && "key" in p ? p.key : p))
|
|
397
|
+
.join("."),
|
|
398
|
+
}));
|
|
399
|
+
}
|
|
400
|
+
async function readBody(req, ct, limit) {
|
|
401
|
+
if (ct.includes("application/json")) {
|
|
402
|
+
const bytes = await readBodyLimited(req, limit);
|
|
403
|
+
if (bytes.byteLength === 0)
|
|
404
|
+
return undefined;
|
|
405
|
+
return safeJsonParse(new TextDecoder().decode(bytes));
|
|
406
|
+
}
|
|
407
|
+
if (ct.includes("application/x-www-form-urlencoded")) {
|
|
408
|
+
const bytes = await readBodyLimited(req, limit);
|
|
409
|
+
return Object.fromEntries(new URLSearchParams(new TextDecoder().decode(bytes)));
|
|
410
|
+
}
|
|
411
|
+
if (ct.includes("multipart/form-data")) {
|
|
412
|
+
// Multipart: rely on platform parser, but enforce content-length first.
|
|
413
|
+
const cl = req.headers.get("content-length");
|
|
414
|
+
if (cl && Number(cl) > limit) {
|
|
415
|
+
throw new (await import("./errors.js")).PayloadTooLargeError(limit);
|
|
416
|
+
}
|
|
417
|
+
const fd = await req.formData();
|
|
418
|
+
const out = {};
|
|
419
|
+
fd.forEach((v, k) => {
|
|
420
|
+
out[k] = v;
|
|
421
|
+
});
|
|
422
|
+
return out;
|
|
423
|
+
}
|
|
424
|
+
const bytes = await readBodyLimited(req, limit);
|
|
425
|
+
return new TextDecoder().decode(bytes);
|
|
426
|
+
}
|
|
427
|
+
async function serializeResult(result, def, validateResponses) {
|
|
428
|
+
const spec = def.responses[result.status];
|
|
429
|
+
if (!spec) {
|
|
430
|
+
throw new InternalError(`Handler returned status ${result.status} which is not declared in responses for ${def.method} ${def.path}`);
|
|
431
|
+
}
|
|
432
|
+
if (validateResponses && spec.body) {
|
|
433
|
+
const r = await validate(spec.body, result.body);
|
|
434
|
+
if (r.issues) {
|
|
435
|
+
throw new InternalError(`Response body for ${def.method} ${def.path} failed schema validation: ${r.issues.map((i) => i.message).join("; ")}`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const headers = new Headers(result.headers);
|
|
439
|
+
const explicitCt = headers.get("content-type");
|
|
440
|
+
const treatAsJson = !explicitCt || explicitCt.includes("application/json");
|
|
441
|
+
if (!explicitCt)
|
|
442
|
+
headers.set("content-type", "application/json");
|
|
443
|
+
let body;
|
|
444
|
+
if (result.body === undefined || result.body === null) {
|
|
445
|
+
body = null;
|
|
446
|
+
}
|
|
447
|
+
else if (!treatAsJson && (typeof result.body === "string" || result.body instanceof Uint8Array || result.body instanceof ArrayBuffer)) {
|
|
448
|
+
body = result.body;
|
|
449
|
+
}
|
|
450
|
+
else if (!treatAsJson && result.body instanceof ReadableStream) {
|
|
451
|
+
body = result.body;
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
body = JSON.stringify(result.body);
|
|
455
|
+
}
|
|
456
|
+
return new Response(body, { status: result.status, headers });
|
|
457
|
+
}
|
|
458
|
+
function mockResponseFor(def) {
|
|
459
|
+
const statuses = Object.keys(def.responses).map(Number).sort();
|
|
460
|
+
const status = statuses.find((s) => s >= 200 && s < 300) ?? statuses[0];
|
|
461
|
+
if (status === undefined)
|
|
462
|
+
throw new InternalError("Mock mode: no responses declared");
|
|
463
|
+
const spec = def.responses[status];
|
|
464
|
+
const example = spec.examples && Object.values(spec.examples)[0] !== undefined
|
|
465
|
+
? Object.values(spec.examples)[0]
|
|
466
|
+
: null;
|
|
467
|
+
return { status, body: example };
|
|
468
|
+
}
|
|
469
|
+
function withTimeout(p, ms) {
|
|
470
|
+
return new Promise((resolve, reject) => {
|
|
471
|
+
const t = setTimeout(() => reject(new RequestTimeoutError(ms)), ms);
|
|
472
|
+
p.then((v) => {
|
|
473
|
+
clearTimeout(t);
|
|
474
|
+
resolve(v);
|
|
475
|
+
}, (e) => {
|
|
476
|
+
clearTimeout(t);
|
|
477
|
+
reject(e);
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
function serializeErr(err) {
|
|
482
|
+
if (err instanceof Error) {
|
|
483
|
+
return { name: err.name, message: err.message, stack: err.stack };
|
|
484
|
+
}
|
|
485
|
+
return { value: String(err) };
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|