nestjs-slightly-better-auth 1.0.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/LICENSE +7 -0
- package/README.md +57 -0
- package/dist/admin.cjs +88 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +14 -0
- package/dist/admin.d.cts.map +1 -0
- package/dist/admin.d.mts +14 -0
- package/dist/admin.d.mts.map +1 -0
- package/dist/admin.mjs +85 -0
- package/dist/admin.mjs.map +1 -0
- package/dist/api-key.cjs +163 -0
- package/dist/api-key.cjs.map +1 -0
- package/dist/api-key.d.cts +42 -0
- package/dist/api-key.d.cts.map +1 -0
- package/dist/api-key.d.mts +42 -0
- package/dist/api-key.d.mts.map +1 -0
- package/dist/api-key.mjs +159 -0
- package/dist/api-key.mjs.map +1 -0
- package/dist/auth-contracts-BBA1C1gj.d.cts +1635 -0
- package/dist/auth-contracts-BBA1C1gj.d.cts.map +1 -0
- package/dist/auth-contracts-tqsfBZ8B.d.mts +1635 -0
- package/dist/auth-contracts-tqsfBZ8B.d.mts.map +1 -0
- package/dist/auth-decorators-CwW5JY4y.cjs +1274 -0
- package/dist/auth-decorators-CwW5JY4y.cjs.map +1 -0
- package/dist/auth-decorators-DfAJbHar.mjs +849 -0
- package/dist/auth-decorators-DfAJbHar.mjs.map +1 -0
- package/dist/auth-errors-CQjfgjaO.mjs +283 -0
- package/dist/auth-errors-CQjfgjaO.mjs.map +1 -0
- package/dist/auth-errors-CsERBNWI.cjs +348 -0
- package/dist/auth-errors-CsERBNWI.cjs.map +1 -0
- package/dist/express.cjs +247 -0
- package/dist/express.cjs.map +1 -0
- package/dist/express.d.cts +37 -0
- package/dist/express.d.cts.map +1 -0
- package/dist/express.d.mts +37 -0
- package/dist/express.d.mts.map +1 -0
- package/dist/express.mjs +245 -0
- package/dist/express.mjs.map +1 -0
- package/dist/fastify.cjs +215 -0
- package/dist/fastify.cjs.map +1 -0
- package/dist/fastify.d.cts +28 -0
- package/dist/fastify.d.cts.map +1 -0
- package/dist/fastify.d.mts +28 -0
- package/dist/fastify.d.mts.map +1 -0
- package/dist/fastify.mjs +213 -0
- package/dist/fastify.mjs.map +1 -0
- package/dist/index.cjs +2634 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +2556 -0
- package/dist/index.mjs.map +1 -0
- package/dist/organization.cjs +191 -0
- package/dist/organization.cjs.map +1 -0
- package/dist/organization.d.cts +40 -0
- package/dist/organization.d.cts.map +1 -0
- package/dist/organization.d.mts +40 -0
- package/dist/organization.d.mts.map +1 -0
- package/dist/organization.mjs +177 -0
- package/dist/organization.mjs.map +1 -0
- package/dist/platform.cjs +393 -0
- package/dist/platform.cjs.map +1 -0
- package/dist/platform.d.cts +43 -0
- package/dist/platform.d.cts.map +1 -0
- package/dist/platform.d.mts +43 -0
- package/dist/platform.d.mts.map +1 -0
- package/dist/platform.mjs +385 -0
- package/dist/platform.mjs.map +1 -0
- package/dist/plugin.cjs +312 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +26 -0
- package/dist/plugin.d.cts.map +1 -0
- package/dist/plugin.d.mts +26 -0
- package/dist/plugin.d.mts.map +1 -0
- package/dist/plugin.mjs +310 -0
- package/dist/plugin.mjs.map +1 -0
- package/package.json +186 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.cjs","names":["toWebHeaders"],"sources":["../src/fastify-platform.ts"],"sourcesContent":["import type { IncomingHttpHeaders, IncomingMessage } from \"node:http\";\nimport type { AbstractHttpAdapter } from \"@nestjs/core\";\nimport type {\n CookieSink,\n ExtensionRef,\n FastifyPlatformOptions,\n HttpPlatform,\n HttpRequestAccessor,\n PlatformMountContext,\n PlatformPrepareContext,\n} from \"./auth-contracts.js\";\nimport { toWebHeaders } from \"./platform.js\";\n\ninterface RawReplyLike {\n headersSent?: boolean;\n destroyed?: boolean;\n writableEnded?: boolean;\n writableFinished?: boolean;\n once(event: \"close\", listener: () => void): unknown;\n once(event: \"error\", listener: (error: Error) => void): unknown;\n removeListener(event: \"close\", listener: () => void): unknown;\n removeListener(event: \"error\", listener: (error: Error) => void): unknown;\n}\n\ninterface FastifyReplyLike {\n readonly raw: RawReplyLike;\n readonly request: FastifyRequestLike;\n readonly sent: boolean;\n code(status: number): FastifyReplyLike;\n header(name: string, value: string | readonly string[]): FastifyReplyLike;\n getHeader(name: string): string | number | readonly string[] | undefined;\n removeHeader(name: string): FastifyReplyLike;\n send(payload?: unknown): unknown;\n}\n\ninterface FastifyRequestLike {\n readonly body?: unknown;\n readonly headers: IncomingHttpHeaders;\n readonly host: string;\n readonly ip?: string;\n readonly method: string;\n readonly originalUrl: string;\n readonly params?: unknown;\n readonly protocol: string;\n readonly raw: IncomingMessage;\n}\n\ninterface FastifyInstanceLike {\n readonly errorHandler: (\n this: FastifyInstanceLike,\n error: unknown,\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => unknown;\n readonly supportedMethods: readonly string[];\n addContentTypeParser(\n contentType: string,\n options: { readonly parseAs: \"buffer\"; readonly bodyLimit: number },\n parser: (\n request: FastifyRequestLike,\n body: Buffer,\n done: (error: Error | null, value?: Buffer) => void,\n ) => void,\n ): unknown;\n addHook(\n name: \"onRequest\",\n hook: (\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n done: (error?: Error) => void,\n ) => void,\n ): unknown;\n register(\n plugin: (scope: FastifyInstanceLike) => void | Promise<void>,\n options: { readonly prefix: string },\n ): PromiseLike<unknown>;\n removeAllContentTypeParsers(): unknown;\n route(options: {\n readonly method: readonly string[];\n readonly url: string;\n readonly exposeHeadRoute: false;\n readonly handler: (\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => Promise<unknown>;\n }): unknown;\n setErrorHandler(\n handler: (\n this: FastifyInstanceLike,\n error: unknown,\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => unknown,\n ): unknown;\n}\n\nfunction instanceOf(adapter: AbstractHttpAdapter): FastifyInstanceLike {\n return adapter.getInstance() as FastifyInstanceLike;\n}\n\nfunction asRequest(value: unknown): FastifyRequestLike | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const request = value as Partial<FastifyRequestLike>;\n return typeof request.raw === \"object\" && request.raw !== null\n ? (request as FastifyRequestLike)\n : undefined;\n}\n\nfunction varyParts(value: string | number | readonly string[] | undefined) {\n const values = Array.isArray(value)\n ? value\n : value === undefined\n ? []\n : [value];\n return values.flatMap((item) => String(item).split(\",\"));\n}\n\nfunction mergedVary(\n current: string | number | readonly string[] | undefined,\n added: string,\n): string {\n const values = [...varyParts(current), ...varyParts(added)]\n .map((item) => item.trim())\n .filter(Boolean);\n if (values.includes(\"*\")) {\n return \"*\";\n }\n const seen = new Set<string>();\n return values\n .filter((item) => {\n const key = item.toLowerCase();\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n })\n .join(\", \");\n}\n\nfunction abortOnDisconnect(\n request: IncomingMessage,\n response: RawReplyLike,\n): { readonly signal: AbortSignal; dispose(): void } {\n const controller = new AbortController();\n let disposed = false;\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n };\n const onRequestAborted = () => abort();\n const onRequestError = () => abort();\n const onResponseClose = () => {\n if (!response.writableFinished) {\n abort();\n }\n };\n const onResponseError = () => abort();\n const dispose = () => {\n if (disposed) {\n return;\n }\n disposed = true;\n request.removeListener(\"aborted\", onRequestAborted);\n request.removeListener(\"error\", onRequestError);\n response.removeListener(\"close\", onResponseClose);\n response.removeListener(\"error\", onResponseError);\n };\n\n request.once(\"aborted\", onRequestAborted);\n request.once(\"error\", onRequestError);\n response.once(\"close\", onResponseClose);\n response.once(\"error\", onResponseError);\n if (\n request.aborted ||\n response.destroyed ||\n (request.socket.destroyed && !response.writableFinished)\n ) {\n abort();\n }\n return { signal: controller.signal, dispose };\n}\n\nasync function sendWebResponse(\n reply: FastifyReplyLike,\n response: Response,\n head: boolean,\n): Promise<unknown> {\n reply.code(response.status);\n for (const [name, value] of response.headers) {\n if (name === \"set-cookie\") {\n continue;\n }\n reply.header(\n name,\n name === \"vary\" ? mergedVary(reply.getHeader(name), value) : value,\n );\n }\n for (const cookie of response.headers.getSetCookie()) {\n reply.header(\"set-cookie\", cookie);\n }\n if (reply.request.raw.httpVersionMajor === 2) {\n for (const name of [\n \"connection\",\n \"keep-alive\",\n \"proxy-connection\",\n \"transfer-encoding\",\n \"upgrade\",\n ]) {\n reply.removeHeader(name);\n }\n }\n if (head && response.body !== null) {\n await response.body.cancel().catch(() => undefined);\n }\n return reply.send(head ? undefined : (response.body ?? undefined));\n}\n\n/**\n * Fastify's encapsulated auth-route platform adapter.\n *\n * Fastify applies `trustProxy` to `request.ip`, but does not expose that option\n * through its public instance metadata. Proxy-trust reporting is therefore\n * intentionally unavailable instead of guessing a diagnostic mode.\n */\nexport class FastifyPlatform implements HttpPlatform {\n readonly id = \"fastify\";\n readonly capabilities = { http2: true, prepareAtInit: true } as const;\n readonly requests: HttpRequestAccessor;\n #replies = new WeakMap<object, FastifyReplyLike>();\n\n constructor(private readonly options: FastifyPlatformOptions = {}) {\n this.requests = {\n isRequest: (value) => {\n const request = asRequest(value);\n return request !== undefined && this.#replies.has(request.raw);\n },\n isLive: (value) => {\n const request = asRequest(value);\n const reply = request && this.#replies.get(request.raw);\n return reply !== undefined && !reply.sent;\n },\n key: (value) => {\n const request = asRequest(value);\n return request?.raw ?? (value as object);\n },\n headers: (value) => {\n const request = asRequest(value);\n return request ? toWebHeaders(request.raw.headers) : new Headers();\n },\n request: (value) => {\n const request = asRequest(value);\n if (!request) {\n return { method: \"GET\", url: \"\" };\n }\n return {\n method: request.method,\n url: `${request.protocol}://${request.host}${request.originalUrl}`,\n };\n },\n clientIp: (value) => {\n const request = asRequest(value);\n return request\n ? (this.options.clientIp?.(request) ?? request.ip ?? null)\n : null;\n },\n param: (value, name) => {\n const request = asRequest(value);\n if (\n !request ||\n typeof request.params !== \"object\" ||\n request.params === null\n ) {\n return undefined;\n }\n const parameter = Reflect.get(request.params, name);\n return typeof parameter === \"string\" ? parameter : undefined;\n },\n cookieSink: (value, response) => {\n const request = asRequest(value);\n if (!request) {\n return null;\n }\n const supplied = response as Partial<FastifyReplyLike> | null;\n const reply =\n supplied &&\n typeof supplied.header === \"function\" &&\n typeof supplied.sent === \"boolean\"\n ? (supplied as FastifyReplyLike)\n : this.#replies.get(request.raw);\n if (!reply) {\n return null;\n }\n const sink: CookieSink = {\n append: (cookies) => {\n if (reply.sent || reply.raw.headersSent) {\n return false;\n }\n for (const cookie of cookies) {\n reply.header(\"set-cookie\", cookie);\n }\n return true;\n },\n };\n return sink;\n },\n responseFor: (value) => {\n const request = asRequest(value);\n return request ? this.#replies.get(request.raw) : undefined;\n },\n };\n }\n\n supports(adapter: AbstractHttpAdapter): boolean {\n return adapter.getType() === \"fastify\";\n }\n\n prepare(context: PlatformPrepareContext): void {\n const root = instanceOf(context.adapter);\n this.#replies = new WeakMap<object, FastifyReplyLike>();\n root.addHook(\"onRequest\", (request, reply, done) => {\n this.#replies.set(request.raw, reply);\n done();\n });\n }\n\n async mount(context: PlatformMountContext): Promise<void> {\n const root = instanceOf(context.adapter);\n const { binding } = context;\n await root.register(\n async (scope) => {\n scope.removeAllContentTypeParsers();\n scope.addContentTypeParser(\n \"*\",\n { parseAs: \"buffer\", bodyLimit: binding.bodyLimit },\n (_request, body, done) => done(null, body),\n );\n scope.setErrorHandler(function (error, request, reply) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n Reflect.get(error, \"code\") === \"FST_ERR_CTP_BODY_TOO_LARGE\"\n ) {\n return sendWebResponse(reply, binding.payloadTooLarge(), false);\n }\n return root.errorHandler.call(this, error, request, reply);\n });\n const handler = async (\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => {\n const cancellation = abortOnDisconnect(request.raw, reply.raw);\n try {\n const response = await binding.handle({\n method: request.method,\n url: `${request.protocol}://${request.host}${request.originalUrl}`,\n headers: toWebHeaders(request.raw.headers),\n body: request.body instanceof Uint8Array ? request.body : null,\n clientIp: this.options.clientIp?.(request) ?? request.ip ?? null,\n platformRequest: request,\n signal: cancellation.signal,\n });\n if (cancellation.signal.aborted) {\n return undefined;\n }\n return await sendWebResponse(\n reply,\n response,\n request.method.toUpperCase() === \"HEAD\",\n );\n } catch (error) {\n if (cancellation.signal.aborted) {\n return undefined;\n }\n throw error;\n } finally {\n cancellation.dispose();\n }\n };\n const methods = [...scope.supportedMethods];\n scope.route({\n method: methods,\n url: \"/\",\n handler,\n exposeHeadRoute: false,\n });\n scope.route({\n method: methods,\n url: \"/*\",\n handler,\n exposeHeadRoute: false,\n });\n },\n { prefix: binding.basePath },\n );\n }\n}\n\nexport function fastifyPlatform(\n options?: FastifyPlatformOptions,\n): ExtensionRef<HttpPlatform> {\n return new FastifyPlatform(options);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { B as HttpRequestAccessor, G as PlatformPrepareContext, M as ExtensionRef, N as FastifyPlatformOptions, W as PlatformMountContext, z as HttpPlatform } from "./auth-contracts-BBA1C1gj.cjs";
|
|
2
|
+
import { AbstractHttpAdapter } from "@nestjs/core";
|
|
3
|
+
//#region src/fastify-platform.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Fastify's encapsulated auth-route platform adapter.
|
|
6
|
+
*
|
|
7
|
+
* Fastify applies `trustProxy` to `request.ip`, but does not expose that option
|
|
8
|
+
* through its public instance metadata. Proxy-trust reporting is therefore
|
|
9
|
+
* intentionally unavailable instead of guessing a diagnostic mode.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FastifyPlatform implements HttpPlatform {
|
|
12
|
+
#private;
|
|
13
|
+
private readonly options;
|
|
14
|
+
readonly id = "fastify";
|
|
15
|
+
readonly capabilities: {
|
|
16
|
+
readonly http2: true;
|
|
17
|
+
readonly prepareAtInit: true;
|
|
18
|
+
};
|
|
19
|
+
readonly requests: HttpRequestAccessor;
|
|
20
|
+
constructor(options?: FastifyPlatformOptions);
|
|
21
|
+
supports(adapter: AbstractHttpAdapter): boolean;
|
|
22
|
+
prepare(context: PlatformPrepareContext): void;
|
|
23
|
+
mount(context: PlatformMountContext): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare function fastifyPlatform(options?: FastifyPlatformOptions): ExtensionRef<HttpPlatform>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export type { FastifyPlatformOptions };
|
|
28
|
+
//# sourceMappingURL=fastify.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.cts","names":[],"sources":["../src/fastify-platform.ts"],"mappings":";;;;;;;;;;qBAoOa,2BAA2B;;mBAMT;WALpB;WACA;aAAiB;aAAa;;WAC9B,UAAU;EAGnB,YAA6B,UAAS;EAkFtC,SAAS,SAAS;EAIlB,QAAQ,SAAS;EASX,MAAM,SAAS,uBAAuB;;wBAwE9B,gBACd,UAAU,yBACT,aAAa"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { B as HttpRequestAccessor, G as PlatformPrepareContext, M as ExtensionRef, N as FastifyPlatformOptions, W as PlatformMountContext, z as HttpPlatform } from "./auth-contracts-tqsfBZ8B.mjs";
|
|
2
|
+
import { AbstractHttpAdapter } from "@nestjs/core";
|
|
3
|
+
//#region src/fastify-platform.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Fastify's encapsulated auth-route platform adapter.
|
|
6
|
+
*
|
|
7
|
+
* Fastify applies `trustProxy` to `request.ip`, but does not expose that option
|
|
8
|
+
* through its public instance metadata. Proxy-trust reporting is therefore
|
|
9
|
+
* intentionally unavailable instead of guessing a diagnostic mode.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FastifyPlatform implements HttpPlatform {
|
|
12
|
+
#private;
|
|
13
|
+
private readonly options;
|
|
14
|
+
readonly id = "fastify";
|
|
15
|
+
readonly capabilities: {
|
|
16
|
+
readonly http2: true;
|
|
17
|
+
readonly prepareAtInit: true;
|
|
18
|
+
};
|
|
19
|
+
readonly requests: HttpRequestAccessor;
|
|
20
|
+
constructor(options?: FastifyPlatformOptions);
|
|
21
|
+
supports(adapter: AbstractHttpAdapter): boolean;
|
|
22
|
+
prepare(context: PlatformPrepareContext): void;
|
|
23
|
+
mount(context: PlatformMountContext): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare function fastifyPlatform(options?: FastifyPlatformOptions): ExtensionRef<HttpPlatform>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export type { FastifyPlatformOptions };
|
|
28
|
+
//# sourceMappingURL=fastify.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.mts","names":[],"sources":["../src/fastify-platform.ts"],"mappings":";;;;;;;;;;qBAoOa,2BAA2B;;mBAMT;WALpB;WACA;aAAiB;aAAa;;WAC9B,UAAU;EAGnB,YAA6B,UAAS;EAkFtC,SAAS,SAAS;EAIlB,QAAQ,SAAS;EASX,MAAM,SAAS,uBAAuB;;wBAwE9B,gBACd,UAAU,yBACT,aAAa"}
|
package/dist/fastify.mjs
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { toWebHeaders } from "./platform.mjs";
|
|
2
|
+
//#region src/fastify-platform.ts
|
|
3
|
+
function instanceOf(adapter) {
|
|
4
|
+
return adapter.getInstance();
|
|
5
|
+
}
|
|
6
|
+
function asRequest(value) {
|
|
7
|
+
if (typeof value !== "object" || value === null) return;
|
|
8
|
+
const request = value;
|
|
9
|
+
return typeof request.raw === "object" && request.raw !== null ? request : void 0;
|
|
10
|
+
}
|
|
11
|
+
function varyParts(value) {
|
|
12
|
+
return (Array.isArray(value) ? value : value === void 0 ? [] : [value]).flatMap((item) => String(item).split(","));
|
|
13
|
+
}
|
|
14
|
+
function mergedVary(current, added) {
|
|
15
|
+
const values = [...varyParts(current), ...varyParts(added)].map((item) => item.trim()).filter(Boolean);
|
|
16
|
+
if (values.includes("*")) return "*";
|
|
17
|
+
const seen = /* @__PURE__ */ new Set();
|
|
18
|
+
return values.filter((item) => {
|
|
19
|
+
const key = item.toLowerCase();
|
|
20
|
+
if (seen.has(key)) return false;
|
|
21
|
+
seen.add(key);
|
|
22
|
+
return true;
|
|
23
|
+
}).join(", ");
|
|
24
|
+
}
|
|
25
|
+
function abortOnDisconnect(request, response) {
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
let disposed = false;
|
|
28
|
+
const abort = () => {
|
|
29
|
+
if (!controller.signal.aborted) controller.abort();
|
|
30
|
+
};
|
|
31
|
+
const onRequestAborted = () => abort();
|
|
32
|
+
const onRequestError = () => abort();
|
|
33
|
+
const onResponseClose = () => {
|
|
34
|
+
if (!response.writableFinished) abort();
|
|
35
|
+
};
|
|
36
|
+
const onResponseError = () => abort();
|
|
37
|
+
const dispose = () => {
|
|
38
|
+
if (disposed) return;
|
|
39
|
+
disposed = true;
|
|
40
|
+
request.removeListener("aborted", onRequestAborted);
|
|
41
|
+
request.removeListener("error", onRequestError);
|
|
42
|
+
response.removeListener("close", onResponseClose);
|
|
43
|
+
response.removeListener("error", onResponseError);
|
|
44
|
+
};
|
|
45
|
+
request.once("aborted", onRequestAborted);
|
|
46
|
+
request.once("error", onRequestError);
|
|
47
|
+
response.once("close", onResponseClose);
|
|
48
|
+
response.once("error", onResponseError);
|
|
49
|
+
if (request.aborted || response.destroyed || request.socket.destroyed && !response.writableFinished) abort();
|
|
50
|
+
return {
|
|
51
|
+
signal: controller.signal,
|
|
52
|
+
dispose
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function sendWebResponse(reply, response, head) {
|
|
56
|
+
reply.code(response.status);
|
|
57
|
+
for (const [name, value] of response.headers) {
|
|
58
|
+
if (name === "set-cookie") continue;
|
|
59
|
+
reply.header(name, name === "vary" ? mergedVary(reply.getHeader(name), value) : value);
|
|
60
|
+
}
|
|
61
|
+
for (const cookie of response.headers.getSetCookie()) reply.header("set-cookie", cookie);
|
|
62
|
+
if (reply.request.raw.httpVersionMajor === 2) for (const name of [
|
|
63
|
+
"connection",
|
|
64
|
+
"keep-alive",
|
|
65
|
+
"proxy-connection",
|
|
66
|
+
"transfer-encoding",
|
|
67
|
+
"upgrade"
|
|
68
|
+
]) reply.removeHeader(name);
|
|
69
|
+
if (head && response.body !== null) await response.body.cancel().catch(() => void 0);
|
|
70
|
+
return reply.send(head ? void 0 : response.body ?? void 0);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Fastify's encapsulated auth-route platform adapter.
|
|
74
|
+
*
|
|
75
|
+
* Fastify applies `trustProxy` to `request.ip`, but does not expose that option
|
|
76
|
+
* through its public instance metadata. Proxy-trust reporting is therefore
|
|
77
|
+
* intentionally unavailable instead of guessing a diagnostic mode.
|
|
78
|
+
*/
|
|
79
|
+
var FastifyPlatform = class {
|
|
80
|
+
options;
|
|
81
|
+
id = "fastify";
|
|
82
|
+
capabilities = {
|
|
83
|
+
http2: true,
|
|
84
|
+
prepareAtInit: true
|
|
85
|
+
};
|
|
86
|
+
requests;
|
|
87
|
+
#replies = /* @__PURE__ */ new WeakMap();
|
|
88
|
+
constructor(options = {}) {
|
|
89
|
+
this.options = options;
|
|
90
|
+
this.requests = {
|
|
91
|
+
isRequest: (value) => {
|
|
92
|
+
const request = asRequest(value);
|
|
93
|
+
return request !== void 0 && this.#replies.has(request.raw);
|
|
94
|
+
},
|
|
95
|
+
isLive: (value) => {
|
|
96
|
+
const request = asRequest(value);
|
|
97
|
+
const reply = request && this.#replies.get(request.raw);
|
|
98
|
+
return reply !== void 0 && !reply.sent;
|
|
99
|
+
},
|
|
100
|
+
key: (value) => {
|
|
101
|
+
return asRequest(value)?.raw ?? value;
|
|
102
|
+
},
|
|
103
|
+
headers: (value) => {
|
|
104
|
+
const request = asRequest(value);
|
|
105
|
+
return request ? toWebHeaders(request.raw.headers) : new Headers();
|
|
106
|
+
},
|
|
107
|
+
request: (value) => {
|
|
108
|
+
const request = asRequest(value);
|
|
109
|
+
if (!request) return {
|
|
110
|
+
method: "GET",
|
|
111
|
+
url: ""
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
method: request.method,
|
|
115
|
+
url: `${request.protocol}://${request.host}${request.originalUrl}`
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
clientIp: (value) => {
|
|
119
|
+
const request = asRequest(value);
|
|
120
|
+
return request ? this.options.clientIp?.(request) ?? request.ip ?? null : null;
|
|
121
|
+
},
|
|
122
|
+
param: (value, name) => {
|
|
123
|
+
const request = asRequest(value);
|
|
124
|
+
if (!request || typeof request.params !== "object" || request.params === null) return;
|
|
125
|
+
const parameter = Reflect.get(request.params, name);
|
|
126
|
+
return typeof parameter === "string" ? parameter : void 0;
|
|
127
|
+
},
|
|
128
|
+
cookieSink: (value, response) => {
|
|
129
|
+
const request = asRequest(value);
|
|
130
|
+
if (!request) return null;
|
|
131
|
+
const supplied = response;
|
|
132
|
+
const reply = supplied && typeof supplied.header === "function" && typeof supplied.sent === "boolean" ? supplied : this.#replies.get(request.raw);
|
|
133
|
+
if (!reply) return null;
|
|
134
|
+
return { append: (cookies) => {
|
|
135
|
+
if (reply.sent || reply.raw.headersSent) return false;
|
|
136
|
+
for (const cookie of cookies) reply.header("set-cookie", cookie);
|
|
137
|
+
return true;
|
|
138
|
+
} };
|
|
139
|
+
},
|
|
140
|
+
responseFor: (value) => {
|
|
141
|
+
const request = asRequest(value);
|
|
142
|
+
return request ? this.#replies.get(request.raw) : void 0;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
supports(adapter) {
|
|
147
|
+
return adapter.getType() === "fastify";
|
|
148
|
+
}
|
|
149
|
+
prepare(context) {
|
|
150
|
+
const root = instanceOf(context.adapter);
|
|
151
|
+
this.#replies = /* @__PURE__ */ new WeakMap();
|
|
152
|
+
root.addHook("onRequest", (request, reply, done) => {
|
|
153
|
+
this.#replies.set(request.raw, reply);
|
|
154
|
+
done();
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async mount(context) {
|
|
158
|
+
const root = instanceOf(context.adapter);
|
|
159
|
+
const { binding } = context;
|
|
160
|
+
await root.register(async (scope) => {
|
|
161
|
+
scope.removeAllContentTypeParsers();
|
|
162
|
+
scope.addContentTypeParser("*", {
|
|
163
|
+
parseAs: "buffer",
|
|
164
|
+
bodyLimit: binding.bodyLimit
|
|
165
|
+
}, (_request, body, done) => done(null, body));
|
|
166
|
+
scope.setErrorHandler(function(error, request, reply) {
|
|
167
|
+
if (typeof error === "object" && error !== null && Reflect.get(error, "code") === "FST_ERR_CTP_BODY_TOO_LARGE") return sendWebResponse(reply, binding.payloadTooLarge(), false);
|
|
168
|
+
return root.errorHandler.call(this, error, request, reply);
|
|
169
|
+
});
|
|
170
|
+
const handler = async (request, reply) => {
|
|
171
|
+
const cancellation = abortOnDisconnect(request.raw, reply.raw);
|
|
172
|
+
try {
|
|
173
|
+
const response = await binding.handle({
|
|
174
|
+
method: request.method,
|
|
175
|
+
url: `${request.protocol}://${request.host}${request.originalUrl}`,
|
|
176
|
+
headers: toWebHeaders(request.raw.headers),
|
|
177
|
+
body: request.body instanceof Uint8Array ? request.body : null,
|
|
178
|
+
clientIp: this.options.clientIp?.(request) ?? request.ip ?? null,
|
|
179
|
+
platformRequest: request,
|
|
180
|
+
signal: cancellation.signal
|
|
181
|
+
});
|
|
182
|
+
if (cancellation.signal.aborted) return;
|
|
183
|
+
return await sendWebResponse(reply, response, request.method.toUpperCase() === "HEAD");
|
|
184
|
+
} catch (error) {
|
|
185
|
+
if (cancellation.signal.aborted) return;
|
|
186
|
+
throw error;
|
|
187
|
+
} finally {
|
|
188
|
+
cancellation.dispose();
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
const methods = [...scope.supportedMethods];
|
|
192
|
+
scope.route({
|
|
193
|
+
method: methods,
|
|
194
|
+
url: "/",
|
|
195
|
+
handler,
|
|
196
|
+
exposeHeadRoute: false
|
|
197
|
+
});
|
|
198
|
+
scope.route({
|
|
199
|
+
method: methods,
|
|
200
|
+
url: "/*",
|
|
201
|
+
handler,
|
|
202
|
+
exposeHeadRoute: false
|
|
203
|
+
});
|
|
204
|
+
}, { prefix: binding.basePath });
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
function fastifyPlatform(options) {
|
|
208
|
+
return new FastifyPlatform(options);
|
|
209
|
+
}
|
|
210
|
+
//#endregion
|
|
211
|
+
export { FastifyPlatform, fastifyPlatform };
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=fastify.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.mjs","names":[],"sources":["../src/fastify-platform.ts"],"sourcesContent":["import type { IncomingHttpHeaders, IncomingMessage } from \"node:http\";\nimport type { AbstractHttpAdapter } from \"@nestjs/core\";\nimport type {\n CookieSink,\n ExtensionRef,\n FastifyPlatformOptions,\n HttpPlatform,\n HttpRequestAccessor,\n PlatformMountContext,\n PlatformPrepareContext,\n} from \"./auth-contracts.js\";\nimport { toWebHeaders } from \"./platform.js\";\n\ninterface RawReplyLike {\n headersSent?: boolean;\n destroyed?: boolean;\n writableEnded?: boolean;\n writableFinished?: boolean;\n once(event: \"close\", listener: () => void): unknown;\n once(event: \"error\", listener: (error: Error) => void): unknown;\n removeListener(event: \"close\", listener: () => void): unknown;\n removeListener(event: \"error\", listener: (error: Error) => void): unknown;\n}\n\ninterface FastifyReplyLike {\n readonly raw: RawReplyLike;\n readonly request: FastifyRequestLike;\n readonly sent: boolean;\n code(status: number): FastifyReplyLike;\n header(name: string, value: string | readonly string[]): FastifyReplyLike;\n getHeader(name: string): string | number | readonly string[] | undefined;\n removeHeader(name: string): FastifyReplyLike;\n send(payload?: unknown): unknown;\n}\n\ninterface FastifyRequestLike {\n readonly body?: unknown;\n readonly headers: IncomingHttpHeaders;\n readonly host: string;\n readonly ip?: string;\n readonly method: string;\n readonly originalUrl: string;\n readonly params?: unknown;\n readonly protocol: string;\n readonly raw: IncomingMessage;\n}\n\ninterface FastifyInstanceLike {\n readonly errorHandler: (\n this: FastifyInstanceLike,\n error: unknown,\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => unknown;\n readonly supportedMethods: readonly string[];\n addContentTypeParser(\n contentType: string,\n options: { readonly parseAs: \"buffer\"; readonly bodyLimit: number },\n parser: (\n request: FastifyRequestLike,\n body: Buffer,\n done: (error: Error | null, value?: Buffer) => void,\n ) => void,\n ): unknown;\n addHook(\n name: \"onRequest\",\n hook: (\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n done: (error?: Error) => void,\n ) => void,\n ): unknown;\n register(\n plugin: (scope: FastifyInstanceLike) => void | Promise<void>,\n options: { readonly prefix: string },\n ): PromiseLike<unknown>;\n removeAllContentTypeParsers(): unknown;\n route(options: {\n readonly method: readonly string[];\n readonly url: string;\n readonly exposeHeadRoute: false;\n readonly handler: (\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => Promise<unknown>;\n }): unknown;\n setErrorHandler(\n handler: (\n this: FastifyInstanceLike,\n error: unknown,\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => unknown,\n ): unknown;\n}\n\nfunction instanceOf(adapter: AbstractHttpAdapter): FastifyInstanceLike {\n return adapter.getInstance() as FastifyInstanceLike;\n}\n\nfunction asRequest(value: unknown): FastifyRequestLike | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const request = value as Partial<FastifyRequestLike>;\n return typeof request.raw === \"object\" && request.raw !== null\n ? (request as FastifyRequestLike)\n : undefined;\n}\n\nfunction varyParts(value: string | number | readonly string[] | undefined) {\n const values = Array.isArray(value)\n ? value\n : value === undefined\n ? []\n : [value];\n return values.flatMap((item) => String(item).split(\",\"));\n}\n\nfunction mergedVary(\n current: string | number | readonly string[] | undefined,\n added: string,\n): string {\n const values = [...varyParts(current), ...varyParts(added)]\n .map((item) => item.trim())\n .filter(Boolean);\n if (values.includes(\"*\")) {\n return \"*\";\n }\n const seen = new Set<string>();\n return values\n .filter((item) => {\n const key = item.toLowerCase();\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n })\n .join(\", \");\n}\n\nfunction abortOnDisconnect(\n request: IncomingMessage,\n response: RawReplyLike,\n): { readonly signal: AbortSignal; dispose(): void } {\n const controller = new AbortController();\n let disposed = false;\n const abort = () => {\n if (!controller.signal.aborted) {\n controller.abort();\n }\n };\n const onRequestAborted = () => abort();\n const onRequestError = () => abort();\n const onResponseClose = () => {\n if (!response.writableFinished) {\n abort();\n }\n };\n const onResponseError = () => abort();\n const dispose = () => {\n if (disposed) {\n return;\n }\n disposed = true;\n request.removeListener(\"aborted\", onRequestAborted);\n request.removeListener(\"error\", onRequestError);\n response.removeListener(\"close\", onResponseClose);\n response.removeListener(\"error\", onResponseError);\n };\n\n request.once(\"aborted\", onRequestAborted);\n request.once(\"error\", onRequestError);\n response.once(\"close\", onResponseClose);\n response.once(\"error\", onResponseError);\n if (\n request.aborted ||\n response.destroyed ||\n (request.socket.destroyed && !response.writableFinished)\n ) {\n abort();\n }\n return { signal: controller.signal, dispose };\n}\n\nasync function sendWebResponse(\n reply: FastifyReplyLike,\n response: Response,\n head: boolean,\n): Promise<unknown> {\n reply.code(response.status);\n for (const [name, value] of response.headers) {\n if (name === \"set-cookie\") {\n continue;\n }\n reply.header(\n name,\n name === \"vary\" ? mergedVary(reply.getHeader(name), value) : value,\n );\n }\n for (const cookie of response.headers.getSetCookie()) {\n reply.header(\"set-cookie\", cookie);\n }\n if (reply.request.raw.httpVersionMajor === 2) {\n for (const name of [\n \"connection\",\n \"keep-alive\",\n \"proxy-connection\",\n \"transfer-encoding\",\n \"upgrade\",\n ]) {\n reply.removeHeader(name);\n }\n }\n if (head && response.body !== null) {\n await response.body.cancel().catch(() => undefined);\n }\n return reply.send(head ? undefined : (response.body ?? undefined));\n}\n\n/**\n * Fastify's encapsulated auth-route platform adapter.\n *\n * Fastify applies `trustProxy` to `request.ip`, but does not expose that option\n * through its public instance metadata. Proxy-trust reporting is therefore\n * intentionally unavailable instead of guessing a diagnostic mode.\n */\nexport class FastifyPlatform implements HttpPlatform {\n readonly id = \"fastify\";\n readonly capabilities = { http2: true, prepareAtInit: true } as const;\n readonly requests: HttpRequestAccessor;\n #replies = new WeakMap<object, FastifyReplyLike>();\n\n constructor(private readonly options: FastifyPlatformOptions = {}) {\n this.requests = {\n isRequest: (value) => {\n const request = asRequest(value);\n return request !== undefined && this.#replies.has(request.raw);\n },\n isLive: (value) => {\n const request = asRequest(value);\n const reply = request && this.#replies.get(request.raw);\n return reply !== undefined && !reply.sent;\n },\n key: (value) => {\n const request = asRequest(value);\n return request?.raw ?? (value as object);\n },\n headers: (value) => {\n const request = asRequest(value);\n return request ? toWebHeaders(request.raw.headers) : new Headers();\n },\n request: (value) => {\n const request = asRequest(value);\n if (!request) {\n return { method: \"GET\", url: \"\" };\n }\n return {\n method: request.method,\n url: `${request.protocol}://${request.host}${request.originalUrl}`,\n };\n },\n clientIp: (value) => {\n const request = asRequest(value);\n return request\n ? (this.options.clientIp?.(request) ?? request.ip ?? null)\n : null;\n },\n param: (value, name) => {\n const request = asRequest(value);\n if (\n !request ||\n typeof request.params !== \"object\" ||\n request.params === null\n ) {\n return undefined;\n }\n const parameter = Reflect.get(request.params, name);\n return typeof parameter === \"string\" ? parameter : undefined;\n },\n cookieSink: (value, response) => {\n const request = asRequest(value);\n if (!request) {\n return null;\n }\n const supplied = response as Partial<FastifyReplyLike> | null;\n const reply =\n supplied &&\n typeof supplied.header === \"function\" &&\n typeof supplied.sent === \"boolean\"\n ? (supplied as FastifyReplyLike)\n : this.#replies.get(request.raw);\n if (!reply) {\n return null;\n }\n const sink: CookieSink = {\n append: (cookies) => {\n if (reply.sent || reply.raw.headersSent) {\n return false;\n }\n for (const cookie of cookies) {\n reply.header(\"set-cookie\", cookie);\n }\n return true;\n },\n };\n return sink;\n },\n responseFor: (value) => {\n const request = asRequest(value);\n return request ? this.#replies.get(request.raw) : undefined;\n },\n };\n }\n\n supports(adapter: AbstractHttpAdapter): boolean {\n return adapter.getType() === \"fastify\";\n }\n\n prepare(context: PlatformPrepareContext): void {\n const root = instanceOf(context.adapter);\n this.#replies = new WeakMap<object, FastifyReplyLike>();\n root.addHook(\"onRequest\", (request, reply, done) => {\n this.#replies.set(request.raw, reply);\n done();\n });\n }\n\n async mount(context: PlatformMountContext): Promise<void> {\n const root = instanceOf(context.adapter);\n const { binding } = context;\n await root.register(\n async (scope) => {\n scope.removeAllContentTypeParsers();\n scope.addContentTypeParser(\n \"*\",\n { parseAs: \"buffer\", bodyLimit: binding.bodyLimit },\n (_request, body, done) => done(null, body),\n );\n scope.setErrorHandler(function (error, request, reply) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n Reflect.get(error, \"code\") === \"FST_ERR_CTP_BODY_TOO_LARGE\"\n ) {\n return sendWebResponse(reply, binding.payloadTooLarge(), false);\n }\n return root.errorHandler.call(this, error, request, reply);\n });\n const handler = async (\n request: FastifyRequestLike,\n reply: FastifyReplyLike,\n ) => {\n const cancellation = abortOnDisconnect(request.raw, reply.raw);\n try {\n const response = await binding.handle({\n method: request.method,\n url: `${request.protocol}://${request.host}${request.originalUrl}`,\n headers: toWebHeaders(request.raw.headers),\n body: request.body instanceof Uint8Array ? request.body : null,\n clientIp: this.options.clientIp?.(request) ?? request.ip ?? null,\n platformRequest: request,\n signal: cancellation.signal,\n });\n if (cancellation.signal.aborted) {\n return undefined;\n }\n return await sendWebResponse(\n reply,\n response,\n request.method.toUpperCase() === \"HEAD\",\n );\n } catch (error) {\n if (cancellation.signal.aborted) {\n return undefined;\n }\n throw error;\n } finally {\n cancellation.dispose();\n }\n };\n const methods = [...scope.supportedMethods];\n scope.route({\n method: methods,\n url: \"/\",\n handler,\n exposeHeadRoute: false,\n });\n scope.route({\n method: methods,\n url: \"/*\",\n handler,\n exposeHeadRoute: false,\n });\n },\n { prefix: binding.basePath },\n );\n }\n}\n\nexport function fastifyPlatform(\n options?: FastifyPlatformOptions,\n): ExtensionRef<HttpPlatform> {\n return new FastifyPlatform(options);\n}\n"],"mappings":"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"}
|