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.
Files changed (77) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +57 -0
  3. package/dist/admin.cjs +88 -0
  4. package/dist/admin.cjs.map +1 -0
  5. package/dist/admin.d.cts +14 -0
  6. package/dist/admin.d.cts.map +1 -0
  7. package/dist/admin.d.mts +14 -0
  8. package/dist/admin.d.mts.map +1 -0
  9. package/dist/admin.mjs +85 -0
  10. package/dist/admin.mjs.map +1 -0
  11. package/dist/api-key.cjs +163 -0
  12. package/dist/api-key.cjs.map +1 -0
  13. package/dist/api-key.d.cts +42 -0
  14. package/dist/api-key.d.cts.map +1 -0
  15. package/dist/api-key.d.mts +42 -0
  16. package/dist/api-key.d.mts.map +1 -0
  17. package/dist/api-key.mjs +159 -0
  18. package/dist/api-key.mjs.map +1 -0
  19. package/dist/auth-contracts-BBA1C1gj.d.cts +1635 -0
  20. package/dist/auth-contracts-BBA1C1gj.d.cts.map +1 -0
  21. package/dist/auth-contracts-tqsfBZ8B.d.mts +1635 -0
  22. package/dist/auth-contracts-tqsfBZ8B.d.mts.map +1 -0
  23. package/dist/auth-decorators-CwW5JY4y.cjs +1274 -0
  24. package/dist/auth-decorators-CwW5JY4y.cjs.map +1 -0
  25. package/dist/auth-decorators-DfAJbHar.mjs +849 -0
  26. package/dist/auth-decorators-DfAJbHar.mjs.map +1 -0
  27. package/dist/auth-errors-CQjfgjaO.mjs +283 -0
  28. package/dist/auth-errors-CQjfgjaO.mjs.map +1 -0
  29. package/dist/auth-errors-CsERBNWI.cjs +348 -0
  30. package/dist/auth-errors-CsERBNWI.cjs.map +1 -0
  31. package/dist/express.cjs +247 -0
  32. package/dist/express.cjs.map +1 -0
  33. package/dist/express.d.cts +37 -0
  34. package/dist/express.d.cts.map +1 -0
  35. package/dist/express.d.mts +37 -0
  36. package/dist/express.d.mts.map +1 -0
  37. package/dist/express.mjs +245 -0
  38. package/dist/express.mjs.map +1 -0
  39. package/dist/fastify.cjs +215 -0
  40. package/dist/fastify.cjs.map +1 -0
  41. package/dist/fastify.d.cts +28 -0
  42. package/dist/fastify.d.cts.map +1 -0
  43. package/dist/fastify.d.mts +28 -0
  44. package/dist/fastify.d.mts.map +1 -0
  45. package/dist/fastify.mjs +213 -0
  46. package/dist/fastify.mjs.map +1 -0
  47. package/dist/index.cjs +2634 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +2 -0
  50. package/dist/index.d.mts +2 -0
  51. package/dist/index.mjs +2556 -0
  52. package/dist/index.mjs.map +1 -0
  53. package/dist/organization.cjs +191 -0
  54. package/dist/organization.cjs.map +1 -0
  55. package/dist/organization.d.cts +40 -0
  56. package/dist/organization.d.cts.map +1 -0
  57. package/dist/organization.d.mts +40 -0
  58. package/dist/organization.d.mts.map +1 -0
  59. package/dist/organization.mjs +177 -0
  60. package/dist/organization.mjs.map +1 -0
  61. package/dist/platform.cjs +393 -0
  62. package/dist/platform.cjs.map +1 -0
  63. package/dist/platform.d.cts +43 -0
  64. package/dist/platform.d.cts.map +1 -0
  65. package/dist/platform.d.mts +43 -0
  66. package/dist/platform.d.mts.map +1 -0
  67. package/dist/platform.mjs +385 -0
  68. package/dist/platform.mjs.map +1 -0
  69. package/dist/plugin.cjs +312 -0
  70. package/dist/plugin.cjs.map +1 -0
  71. package/dist/plugin.d.cts +26 -0
  72. package/dist/plugin.d.cts.map +1 -0
  73. package/dist/plugin.d.mts +26 -0
  74. package/dist/plugin.d.mts.map +1 -0
  75. package/dist/plugin.mjs +310 -0
  76. package/dist/plugin.mjs.map +1 -0
  77. 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"}
@@ -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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"}