equipped 5.3.0-alpha.0 → 5.3.1
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/CHANGELOG.md +14 -0
- package/dist/cjs/server/adapters/express/index.cjs +312 -4
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +315 -4
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +261 -4
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +7 -7
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +2 -2
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +3 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-AUKXL4EA.min.mjs → chunk-2GGMLKRP.min.mjs} +2 -2
- package/dist/esm/{chunk-TWKHVLLT.mjs → chunk-3TP7NINX.mjs} +2 -2
- package/dist/esm/{chunk-RIRBNBTC.mjs → chunk-5PZACGPI.mjs} +3 -3
- package/dist/esm/{chunk-OXI6IKAM.min.mjs → chunk-676VIABN.min.mjs} +2 -2
- package/dist/esm/{chunk-I4BB436E.mjs → chunk-7CP7ZE2O.mjs} +2 -2
- package/dist/esm/{chunk-YTM6ZURZ.min.mjs → chunk-7NF7PV6S.min.mjs} +2 -2
- package/dist/esm/{chunk-WHIWTP2Z.min.mjs → chunk-7SQ5JQYR.min.mjs} +2 -2
- package/dist/esm/{chunk-2TCFNKRZ.mjs → chunk-A4P7P6BU.mjs} +262 -5
- package/dist/esm/chunk-A4P7P6BU.mjs.map +1 -0
- package/dist/esm/{chunk-KW3PBDFD.mjs → chunk-BWUFPMVG.mjs} +2 -2
- package/dist/esm/{chunk-YTHRK2PO.mjs → chunk-HXFNN6RI.mjs} +3 -3
- package/dist/esm/chunk-IN5YKIJ7.min.mjs +32 -0
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +1 -0
- package/dist/esm/{chunk-ECBJ3NT3.min.mjs → chunk-IRYCN6PI.min.mjs} +2 -2
- package/dist/esm/{chunk-IEBC3OWN.mjs → chunk-LKS5ZE45.mjs} +2 -2
- package/dist/esm/{chunk-6DW4GW3R.min.mjs → chunk-MQXTTWPS.min.mjs} +2 -2
- package/dist/esm/{chunk-MYGAF2AC.min.mjs → chunk-P4PRHHIY.min.mjs} +2 -2
- package/dist/esm/{chunk-6SB5M4XH.mjs → chunk-TSVHZZE4.mjs} +3 -3
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +3 -3
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +3 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +2 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.mjs +1 -1
- package/dist/esm/introspection-THKMXV5V.min.mjs +2 -0
- package/dist/esm/{introspection-Y7EXSYPD.mjs → introspection-YJF3QAUK.mjs} +3 -3
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +3 -3
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +3 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +3 -3
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.mjs +3 -3
- package/dist/esm/orm/index.min.mjs +1 -1
- package/dist/esm/orm/index.mjs +3 -3
- package/dist/esm/server/adapters/express/index.min.mjs +1 -1
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/express/index.mjs +52 -1
- package/dist/esm/server/adapters/express/index.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +55 -1
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.mjs +1 -1
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-3PpBAx1K.d.ts → base-BDTBLZ9a.d.ts} +26 -2
- package/dist/types/cache/adapters/in-memory/index.js +2 -2
- package/dist/types/cache/adapters/redis/index.js +3 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/{chunk-H6JBLKX5.js → chunk-4DH3POYM.js} +2 -2
- package/dist/types/{chunk-XOU2A2Y6.js → chunk-55CTVK7R.js} +1 -1
- package/dist/types/{chunk-A2MRYMCA.js → chunk-5Z26ZURE.js} +1 -1
- package/dist/types/{chunk-JZ2JTENY.js → chunk-IZDJDGOV.js} +2 -2
- package/dist/types/{chunk-IAHTILKJ.js → chunk-J3TGB5YQ.js} +1 -1
- package/dist/types/{chunk-LWUMIHL4.js → chunk-LPB5LS7A.js} +1 -1
- package/dist/types/{chunk-32DMHN3G.js → chunk-TT5EORDK.js} +261 -4
- package/dist/types/{chunk-4LRJJSGG.js → chunk-YLJNBL6J.js} +2 -2
- package/dist/types/dbs/adapters/mongodb/index.js +3 -3
- package/dist/types/dbs/index.js +3 -3
- package/dist/types/errors/index.js +1 -1
- package/dist/types/events/adapters/kafka/index.js +2 -2
- package/dist/types/events/adapters/rabbitmq/index.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-ZQCAW254.js → introspection-EHGM4RMO.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +3 -3
- package/dist/types/orm/adapters/in-memory/index.js +3 -3
- package/dist/types/orm/adapters/json/index.js +3 -3
- package/dist/types/orm/adapters/mongodb/index.js +2 -2
- package/dist/types/orm/adapters/postgresql/index.js +3 -3
- package/dist/types/orm/index.js +3 -3
- package/dist/types/server/adapters/express/index.d.ts +3 -1
- package/dist/types/server/adapters/express/index.js +52 -1
- package/dist/types/server/adapters/fastify/index.d.ts +3 -1
- package/dist/types/server/adapters/fastify/index.js +55 -1
- package/dist/types/server/index.d.ts +2 -2
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.js +1 -1
- package/dist/types/validations/index.js +1 -1
- package/package.json +2 -4
- package/dist/esm/chunk-2TCFNKRZ.mjs.map +0 -1
- package/dist/esm/chunk-LTDVZJYJ.min.mjs +0 -32
- package/dist/esm/chunk-LTDVZJYJ.min.mjs.map +0 -1
- package/dist/esm/introspection-GP3G26B6.min.mjs +0 -2
- /package/dist/esm/{chunk-AUKXL4EA.min.mjs.map → chunk-2GGMLKRP.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-TWKHVLLT.mjs.map → chunk-3TP7NINX.mjs.map} +0 -0
- /package/dist/esm/{chunk-RIRBNBTC.mjs.map → chunk-5PZACGPI.mjs.map} +0 -0
- /package/dist/esm/{chunk-OXI6IKAM.min.mjs.map → chunk-676VIABN.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-I4BB436E.mjs.map → chunk-7CP7ZE2O.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTM6ZURZ.min.mjs.map → chunk-7NF7PV6S.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-WHIWTP2Z.min.mjs.map → chunk-7SQ5JQYR.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-KW3PBDFD.mjs.map → chunk-BWUFPMVG.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTHRK2PO.mjs.map → chunk-HXFNN6RI.mjs.map} +0 -0
- /package/dist/esm/{chunk-ECBJ3NT3.min.mjs.map → chunk-IRYCN6PI.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-IEBC3OWN.mjs.map → chunk-LKS5ZE45.mjs.map} +0 -0
- /package/dist/esm/{chunk-6DW4GW3R.min.mjs.map → chunk-MQXTTWPS.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-MYGAF2AC.min.mjs.map → chunk-P4PRHHIY.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-6SB5M4XH.mjs.map → chunk-TSVHZZE4.mjs.map} +0 -0
- /package/dist/esm/{introspection-GP3G26B6.min.mjs.map → introspection-THKMXV5V.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-Y7EXSYPD.mjs.map → introspection-YJF3QAUK.mjs.map} +0 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
configurable,
|
|
7
7
|
getMediaDuration,
|
|
8
8
|
serverConfigPipe
|
|
9
|
-
} from "../../../chunk-
|
|
9
|
+
} from "../../../chunk-A4P7P6BU.mjs";
|
|
10
10
|
import "../../../chunk-VCCS7CAI.mjs";
|
|
11
11
|
import "../../../chunk-J5LGTIGS.mjs";
|
|
12
12
|
|
|
@@ -100,6 +100,9 @@ var ExpressServer = class extends configurable(serverConfigPipe, Server) {
|
|
|
100
100
|
response.body.pipe(res);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
|
+
createRawResponder(req, res) {
|
|
104
|
+
return this.createNodeRawResponder({ request: req, response: res });
|
|
105
|
+
}
|
|
103
106
|
registerRoute(method, path, cb) {
|
|
104
107
|
this.#app[method]?.(path, async (req, res) => cb(req, res));
|
|
105
108
|
}
|
|
@@ -120,6 +123,54 @@ var ExpressServer = class extends configurable(serverConfigPipe, Server) {
|
|
|
120
123
|
});
|
|
121
124
|
}
|
|
122
125
|
};
|
|
126
|
+
if (void 0) {
|
|
127
|
+
let ensureTestInstance = function() {
|
|
128
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
129
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
130
|
+
instance.alias("equipped-test");
|
|
131
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
132
|
+
}
|
|
133
|
+
}, createExpressResponse = function() {
|
|
134
|
+
return {
|
|
135
|
+
statusCode: 200,
|
|
136
|
+
headersSent: false,
|
|
137
|
+
writableEnded: false,
|
|
138
|
+
setHeader: vi.fn(),
|
|
139
|
+
end(chunk) {
|
|
140
|
+
void chunk;
|
|
141
|
+
this.headersSent = true;
|
|
142
|
+
this.writableEnded = true;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
ensureTestInstance2 = ensureTestInstance, createExpressResponse2 = createExpressResponse;
|
|
147
|
+
const { describe, expect, test, vi } = void 0;
|
|
148
|
+
const testInstanceState = globalThis;
|
|
149
|
+
class TestExpressServer extends ExpressServer {
|
|
150
|
+
exposeRawResponder(req, res) {
|
|
151
|
+
return this.createRawResponder(req, res);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
describe("ExpressServer raw responder", () => {
|
|
155
|
+
test("passes the Express request and response to the raw Node handler", async () => {
|
|
156
|
+
ensureTestInstance();
|
|
157
|
+
const server = TestExpressServer.create({ port: 0, requests: { log: false } });
|
|
158
|
+
const req = { marker: "request" };
|
|
159
|
+
const res = createExpressResponse();
|
|
160
|
+
let received = null;
|
|
161
|
+
await server.exposeRawResponder(
|
|
162
|
+
req,
|
|
163
|
+
res
|
|
164
|
+
)(async (request, response) => {
|
|
165
|
+
received = { request, response };
|
|
166
|
+
response.end("ok");
|
|
167
|
+
});
|
|
168
|
+
expect(received).toEqual({ request: req, response: res });
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
var ensureTestInstance2;
|
|
173
|
+
var createExpressResponse2;
|
|
123
174
|
export {
|
|
124
175
|
ExpressServer
|
|
125
176
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/express/index.ts"],"sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { Server, serverConfigPipe } from '../base'\n\nexport class ExpressServer extends configurable(serverConfigPipe, Server) {\n\t#app: express.Express\n\t#httpServer: http.Server\n\n\tprotected constructor(config: typeof ExpressServer.Config) {\n\t\tsuper(config)\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tconst httpServer = http.createServer(app)\n\t\tthis.#app = app\n\t\tthis.#httpServer = httpServer\n\n\t\tthis.setup(httpServer, config)\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t\t})) */\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst files = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\tuploads.map(async (f: any) => ({\n\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t})),\n\t\t\t\t\t)\n\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\treturn new Request<any>({\n\t\t\tip: req.ip,\n\t\t\tbody: req.body ?? {},\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? {},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.path,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tif (!response.piped) {\n\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\tres.status(response.status)[type](response.body).end()\n\t\t} else {\n\t\t\tresponse.body.pipe(res)\n\t\t}\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app[method]?.(path, async (req: any, res: any) => cb(req, res))\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (err: any, req: any, res: any, _next: any) => cb(err, req, res))\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (req: any, res: any, _next: any) => cb(req, res))\n\t}\n\n\tprotected startServer(port: number) {\n\t\treturn new Promise<boolean>((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\ttry {\n\t\t\t\tconst server = this.#httpServer.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\tInstance.on('close', server.close)\n\t\t\t} catch (err) {\n\t\t\t\treject(<Error>err)\n\t\t\t}\n\t\t})\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,OAAO,UAAU;AAEjB,OAAO,YAAY;AACnB,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,OAAO,gBAAgB;AACvB,SAAS,iBAAiB;AAE1B,OAAO,YAAY;AACnB,SAAS,gBAAgB;AAQlB,IAAM,gBAAN,cAA4B,aAAa,kBAAkB,MAAM,EAAE;AAAA,EACzE;AAAA,EACA;AAAA,EAEU,YAAY,QAAqC;AAC1D,UAAM,MAAM;AACZ,UAAM,MAAM,QAAQ;AACpB,UAAM,WAAW,SAAS,IAAI;AAC9B,UAAM,aAAa,KAAK,aAAa,GAAG;AACxC,SAAK,OAAO;AACZ,SAAK,cAAc;AAEnB,SAAK,MAAM,YAAY,MAAM;AAE7B,QAAI,QAAQ,cAAc;AAC1B,QAAI,OAAO,SAAS,IAAK,KAAI,IAAI,SAAS,EAAE,QAAQ,SAAS,IAAI,CAAC,CAAC;AACnE,QAAI,IAAI,QAAQ,KAAK,CAAC;AACtB,QAAI,IAAI,QAAQ,KAAK,CAAC;AACtB,QAAI,IAAI,OAAO,CAAC;AAChB,QAAI;AAAA,MACH,OAAO;AAAA,QACN,2BAA2B,EAAE,QAAQ,eAAe;AAAA,QACpD,uBAAuB;AAAA,MACxB,CAAC;AAAA,IACF;AACA,QAAI,IAAI,KAAK,KAAK,IAAI,CAAC;AACvB,QAAI,IAAI,QAAQ,WAAW,EAAE,UAAU,MAAM,CAAC,CAAC;AAC/C,QAAI,OAAO,WAAY,KAAI,IAAI,QAAQ,OAAO,OAAO,UAAU,CAAC;AAChE,QAAI;AAAA,MACH,WAAW;AAAA,QACV,QAAQ,EAAE,UAAU,SAAS,SAAS,MAAM,wBAAwB,OAAO,KAAK;AAAA,QAChF,cAAc;AAAA,MACf,CAAC;AAAA,IACF;AACA,QAAI,OAAO,SAAS,UAAU;AAC7B,UAAI;AAAA,QACH,UAAU;AAAA,UACT,UAAU,OAAO,SAAS,UAAU;AAAA,UACpC,OAAO,OAAO,SAAS,UAAU;AAAA,UACjC,SAAS,CAAC,GAAoB,QAC7B,IAAI,OAAO,YAAY,eAAe,EAAE,KAAK,CAAC,EAAE,SAAS,oBAAoB,CAAC,CAAC;AAAA,QACjF,CAAC;AAAA,MACF;AAAA,EAMF;AAAA,EAEA,MAAgB,aAAa,KAAU;AACtC,UAAM,QAAQ,OAAO;AAAA,MACpB,MAAM,QAAQ;AAAA,QACb,OAAO,QAAQ,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM;AAC1D,gBAAM,UAAU,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAClD,gBAAM,YAA4B,MAAM,QAAQ;AAAA,YAC/C,QAAQ,IAAI,OAAO,OAAY;AAAA,cAC9B,MAAM,EAAE;AAAA,cACR,MAAM,EAAE;AAAA,cACR,MAAM,EAAE;AAAA,cACR,aAAa,EAAE;AAAA,cACf,MAAM,EAAE;AAAA,cACR,UAAU,MAAM,iBAAiB,EAAE,IAAI;AAAA,YACxC,EAAE;AAAA,UACH;AACA,iBAAc,CAAC,KAAK,SAAS;AAAA,QAC9B,CAAC;AAAA,MACF;AAAA,IACD;AAEA,WAAO,IAAI,QAAa;AAAA,MACvB,IAAI,IAAI;AAAA,MACR,MAAM,IAAI,QAAQ,CAAC;AAAA,MACnB,SAAS,IAAI,WAAW,CAAC;AAAA,MACzB,QAAQ,IAAI,UAAU,CAAC;AAAA,MACvB,OAAO,IAAI,SAAS,CAAC;AAAA,MACrB,QAAa,IAAI;AAAA,MACjB,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAgB,eAAe,KAAU,UAAyB;AACjE,QAAI,CAAC,SAAS,OAAO;AACpB,aAAO,QAAQ,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,KAAe,CAAC;AAC3F,aAAO,QAAQ,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC;AACpG,YAAM,OAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,SAAY,SAAS;AAC9E,UAAI,OAAO,SAAS,MAAM,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,IAAI;AAAA,IACtD,OAAO;AACN,eAAS,KAAK,KAAK,GAAG;AAAA,IACvB;AAAA,EACD;AAAA,EAEU,cAAc,QAAqB,MAAc,IAA2C;AACrG,SAAK,KAAK,MAAM,IAAI,MAAM,OAAO,KAAU,QAAa,GAAG,KAAK,GAAG,CAAC;AAAA,EACrE;AAAA,EAEU,qBAAqB,IAAyD;AACvF,SAAK,KAAK,IAAI,OAAO,KAAU,KAAU,KAAU,UAAe,GAAG,KAAK,KAAK,GAAG,CAAC;AAAA,EACpF;AAAA,EAEU,wBAAwB,IAA2C;AAC5E,SAAK,KAAK,IAAI,OAAO,KAAU,KAAU,UAAe,GAAG,KAAK,GAAG,CAAC;AAAA,EACrE;AAAA,EAEU,YAAY,MAAc;AACnC,WAAO,IAAI,QAAiB,CAAC,SAA+B,WAA+B;AAC1F,UAAI;AACH,cAAM,SAAS,KAAK,YAAY,OAAO,EAAE,MAAM,WAAW,KAAK,GAAG,YAAY,QAAQ,IAAI,CAAC;AAC3F,iBAAS,GAAG,SAAS,OAAO,KAAK;AAAA,MAClC,SAAS,KAAK;AACb,eAAc,GAAG;AAAA,MAClB;AAAA,IACD,CAAC;AAAA,EACF;AACD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/express/index.ts"],"sourcesContent":["import http from 'http'\n\nimport cookie from 'cookie-parser'\nimport cors from 'cors'\nimport express from 'express'\nimport fileUpload from 'express-fileupload'\nimport { rateLimit } from 'express-rate-limit'\n// import slowDown from 'express-slow-down'\nimport helmet from 'helmet'\nimport { pinoHttp } from 'pino-http'\n\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class ExpressServer extends configurable(serverConfigPipe, Server) {\n\t#app: express.Express\n\t#httpServer: http.Server\n\n\tprotected constructor(config: typeof ExpressServer.Config) {\n\t\tsuper(config)\n\t\tconst app = express()\n\t\tconst instance = Instance.get()\n\t\tconst httpServer = http.createServer(app)\n\t\tthis.#app = app\n\t\tthis.#httpServer = httpServer\n\n\t\tthis.setup(httpServer, config)\n\n\t\tapp.disable('x-powered-by')\n\t\tif (config.requests.log) app.use(pinoHttp({ logger: instance.log }))\n\t\tapp.use(express.json())\n\t\tapp.use(express.text())\n\t\tapp.use(cookie())\n\t\tapp.use(\n\t\t\thelmet({\n\t\t\t\tcrossOriginResourcePolicy: { policy: 'cross-origin' },\n\t\t\t\tcontentSecurityPolicy: false,\n\t\t\t}),\n\t\t)\n\t\tapp.use(cors(this.cors))\n\t\tapp.use(express.urlencoded({ extended: false }))\n\t\tif (config.publicPath) app.use(express.static(config.publicPath))\n\t\tapp.use(\n\t\t\tfileUpload({\n\t\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\t\tuseTempFiles: false,\n\t\t\t}),\n\t\t)\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.use(\n\t\t\t\trateLimit({\n\t\t\t\t\twindowMs: config.requests.rateLimit.periodInMs,\n\t\t\t\t\tlimit: config.requests.rateLimit.limit,\n\t\t\t\t\thandler: (_: express.Request, res: express.Response) =>\n\t\t\t\t\t\tres.status(StatusCodes.TooManyRequests).json([{ message: 'Too Many Requests' }]),\n\t\t\t\t}),\n\t\t\t)\n\t\t/* if (this.settings.slowdown.enabled) app.use(slowDown({\n\t\t\t\twindowMs: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelayMs: this.settings.slowdown.delayInMs\n\t\t\t})) */\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst files = Object.fromEntries(\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(req.files ?? {}).map(async ([key, file]) => {\n\t\t\t\t\tconst uploads = Array.isArray(file) ? file : [file]\n\t\t\t\t\tconst fileArray: IncomingFile[] = await Promise.all(\n\t\t\t\t\t\tuploads.map(async (f: any) => ({\n\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\t\t\tsize: f.size,\n\t\t\t\t\t\t\tisTruncated: f.truncated,\n\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\tduration: await getMediaDuration(f.data),\n\t\t\t\t\t\t})),\n\t\t\t\t\t)\n\t\t\t\t\treturn <const>[key, fileArray]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\n\t\treturn new Request<any>({\n\t\t\tip: req.ip,\n\t\t\tbody: req.body ?? {},\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? {},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.path,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tif (!response.piped) {\n\t\t\tObject.entries(response.headers).forEach(([key, value]) => res.header(key, value as string))\n\t\t\tObject.entries(response.cookies).forEach(([key, { value, ...opts }]) => res.cookie(key, value, opts))\n\t\t\tconst type = response.body === null || response.body === undefined ? 'json' : 'send'\n\t\t\tres.status(response.status)[type](response.body).end()\n\t\t} else {\n\t\t\tresponse.body.pipe(res)\n\t\t}\n\t}\n\n\tprotected createRawResponder(req: express.Request, res: express.Response): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req, response: res })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app[method]?.(path, async (req: any, res: any) => cb(req, res))\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (err: any, req: any, res: any, _next: any) => cb(err, req, res))\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.use(async (req: any, res: any, _next: any) => cb(req, res))\n\t}\n\n\tprotected startServer(port: number) {\n\t\treturn new Promise<boolean>((resolve: (s: boolean) => void, reject: (e: Error) => void) => {\n\t\t\ttry {\n\t\t\t\tconst server = this.#httpServer.listen({ host: '0.0.0.0', port }, async () => resolve(true))\n\t\t\t\tInstance.on('close', server.close)\n\t\t\t} catch (err) {\n\t\t\t\treject(<Error>err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createExpressResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestExpressServer extends ExpressServer {\n\t\texposeRawResponder(req: express.Request, res: express.Response) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('ExpressServer raw responder', () => {\n\t\ttest('passes the Express request and response to the raw Node handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestExpressServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst req = { marker: 'request' } as unknown as express.Request\n\t\t\tconst res = createExpressResponse() as unknown as express.Response\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\treq,\n\t\t\t\tres,\n\t\t\t)(async (request, response) => {\n\t\t\t\treceived = { request, response }\n\t\t\t\tresponse.end('ok')\n\t\t\t})\n\n\t\t\texpect(received).toEqual({ request: req, response: res })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["ensureTestInstance","createExpressResponse"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{B as
|
|
1
|
+
import{B as d,C as y,J as f,K as o,g as p,m as c,q as l,u}from "../../../chunk-IN5YKIJ7.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import R from"@fastify/cookie";import h from"@fastify/cors";import g from"@fastify/formbody";import w from"@fastify/helmet";import q from"@fastify/multipart";import F from"@fastify/rate-limit";import b from"@fastify/static";import v from"fastify";import S from"qs";var m=class extends c(d,y){#e;constructor(e){super(e);let s=o.get(),t=v({disableRequestLogging:!e.requests.log,loggerInstance:e.requests.log?s.log:void 0,ajv:{customOptions:{coerceTypes:!1}},routerOptions:{ignoreTrailingSlash:!0,caseSensitive:!1},schemaErrorFormatter:(r,a)=>new f(r.map(i=>({messages:[i.message??""],field:`${a}${i.instancePath}`.replaceAll("/",".")})))});this.#e=t,this.setup(t.server,e),t.decorateRequest("savedReq",null),t.setValidatorCompiler(()=>()=>!0),t.setSerializerCompiler(()=>r=>JSON.stringify(r)),e.publicPath&&t.register(b,{root:e.publicPath}),t.register(R,{}),t.register(h,this.cors),t.register(g,{parser:r=>S.parse(r)}),t.register(w,{crossOriginResourcePolicy:{policy:"cross-origin"},contentSecurityPolicy:!1}),t.register(q,{attachFieldsToBody:"keyValues",throwFileSizeLimit:!1,limits:{fileSize:s.settings.utils.maxFileUploadSizeInMb*1024*1024},onFile:async r=>{let a=await r.toBuffer(),i={name:r.filename,type:r.mimetype,size:a.byteLength,isTruncated:r.file.truncated,data:a,duration:await l(a)};r.value=i}}),e.requests.rateLimit.enabled&&t.register(F,{max:e.requests.rateLimit.limit,timeWindow:e.requests.rateLimit.periodInMs,errorResponseBuilder:(r,a)=>({statusCode:p.TooManyRequests,message:JSON.stringify([{message:`Too Many Requests. Retry in ${a.after}`}])})})}async parseRequest(e){let{body:s,files:t}=k(e.body??{});return new u({ip:e.ip,body:s,cookies:e.cookies??{},params:e.params??{},query:e.query??{},method:e.method,path:e.url,headers:e.headers,files:t})}async handleResponse(e,s){for(let[t,{value:r,...a}]of Object.entries(s.cookies))e=e.setCookie(t,r,a);await e.status(s.status).headers(s.headers).send(s.body)}createRawResponder(e,s){return this.createNodeRawResponder({request:e.raw,response:s.raw,beforeHandle:()=>s.hijack()})}registerRoute(e,s,t){this.#e.register(async r=>{r.route({url:s,method:e,handler:t})})}registerErrorHandler(e){this.#e.setErrorHandler(e)}registerNotFoundHandler(e){this.#e.setNotFoundHandler(e)}async startServer(e){return await this.#e.ready(),await this.#e.listen({port:e,host:"0.0.0.0"}),o.on("close",this.#e.close),!0}};function k(n){if(typeof n!="object")return{body:n,files:{}};let e=Object.entries(n??{}),s=a=>Array.isArray(a)?s(a.at(0)):Buffer.isBuffer(a?.data),t=e.filter(([a,i])=>s(i)).map(([a,i])=>[a,Array.isArray(i)?i:[i]]),r=e.filter(([a,i])=>!s(i));return{body:Object.fromEntries(r),files:Object.fromEntries(t)}}export{m as FastifyServer};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n"],"mappings":"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","names":["fastifyCookie","fastifyCors","fastifyFormBody","fastifyHelmet","fastifyMultipart","fastifyRateLimit","fastifyStatic","Fastify","qs","FastifyServer","configurable","serverConfigPipe","Server","#app","config","instance","Instance","app","Fastify","errors","data","ValidationError","error","fastifyStatic","fastifyCookie","fastifyCors","fastifyFormBody","str","qs","fastifyHelmet","fastifyMultipart","f","buffer","parsed","getMediaDuration","fastifyRateLimit","_","context","StatusCodes","req","body","files","excludeBufferKeys","Request","res","response","key","value","opts","method","path","cb","inst","port","entries","isFile","val","fileEntries","nonFileEntries"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify, { type FastifyReply, type FastifyRequest } from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected createRawResponder(req: FastifyRequest, res: FastifyReply): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestFastifyServer extends FastifyServer {\n\t\texposeRawResponder(req: FastifyRequest, res: FastifyReply) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('FastifyServer raw responder', () => {\n\t\ttest('hijacks the Fastify reply before passing Node raw request and response to the handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestFastifyServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst rawRequest = { marker: 'request' }\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tconst reply = { raw: rawResponse, hijack: vi.fn() } as unknown as FastifyReply\n\t\t\tconst request = { raw: rawRequest } as unknown as FastifyRequest\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\trequest,\n\t\t\t\treply,\n\t\t\t)(async (req, res) => {\n\t\t\t\treceived = { request: req, response: res }\n\t\t\t\tres.end('ok')\n\t\t\t})\n\n\t\t\texpect(reply.hijack).toHaveBeenCalledOnce()\n\t\t\texpect(received).toEqual({ request: rawRequest, response: rawResponse })\n\t\t})\n\t})\n}\n"],"mappings":"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","names":["fastifyCookie","fastifyCors","fastifyFormBody","fastifyHelmet","fastifyMultipart","fastifyRateLimit","fastifyStatic","Fastify","qs","FastifyServer","configurable","serverConfigPipe","Server","#app","config","instance","Instance","app","Fastify","errors","data","ValidationError","error","fastifyStatic","fastifyCookie","fastifyCors","fastifyFormBody","str","qs","fastifyHelmet","fastifyMultipart","f","buffer","parsed","getMediaDuration","fastifyRateLimit","_","context","StatusCodes","req","body","files","excludeBufferKeys","Request","res","response","key","value","opts","method","path","cb","inst","port","entries","isFile","val","fileEntries","nonFileEntries"]}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
configurable,
|
|
8
8
|
getMediaDuration,
|
|
9
9
|
serverConfigPipe
|
|
10
|
-
} from "../../../chunk-
|
|
10
|
+
} from "../../../chunk-A4P7P6BU.mjs";
|
|
11
11
|
import "../../../chunk-VCCS7CAI.mjs";
|
|
12
12
|
import "../../../chunk-J5LGTIGS.mjs";
|
|
13
13
|
|
|
@@ -96,6 +96,9 @@ var FastifyServer = class extends configurable(serverConfigPipe, Server) {
|
|
|
96
96
|
for (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts);
|
|
97
97
|
await res.status(response.status).headers(response.headers).send(response.body);
|
|
98
98
|
}
|
|
99
|
+
createRawResponder(req, res) {
|
|
100
|
+
return this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() });
|
|
101
|
+
}
|
|
99
102
|
registerRoute(method, path, cb) {
|
|
100
103
|
this.#app.register(async (inst) => {
|
|
101
104
|
inst.route({ url: path, method, handler: cb });
|
|
@@ -125,6 +128,57 @@ function excludeBufferKeys(body) {
|
|
|
125
128
|
files: Object.fromEntries(fileEntries)
|
|
126
129
|
};
|
|
127
130
|
}
|
|
131
|
+
if (void 0) {
|
|
132
|
+
let ensureTestInstance = function() {
|
|
133
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
134
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
135
|
+
instance.alias("equipped-test");
|
|
136
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
137
|
+
}
|
|
138
|
+
}, createRawResponse = function() {
|
|
139
|
+
return {
|
|
140
|
+
statusCode: 200,
|
|
141
|
+
headersSent: false,
|
|
142
|
+
writableEnded: false,
|
|
143
|
+
setHeader: vi.fn(),
|
|
144
|
+
end(chunk) {
|
|
145
|
+
void chunk;
|
|
146
|
+
this.headersSent = true;
|
|
147
|
+
this.writableEnded = true;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
|
|
152
|
+
const { describe, expect, test, vi } = void 0;
|
|
153
|
+
const testInstanceState = globalThis;
|
|
154
|
+
class TestFastifyServer extends FastifyServer {
|
|
155
|
+
exposeRawResponder(req, res) {
|
|
156
|
+
return this.createRawResponder(req, res);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
describe("FastifyServer raw responder", () => {
|
|
160
|
+
test("hijacks the Fastify reply before passing Node raw request and response to the handler", async () => {
|
|
161
|
+
ensureTestInstance();
|
|
162
|
+
const server = TestFastifyServer.create({ port: 0, requests: { log: false } });
|
|
163
|
+
const rawRequest = { marker: "request" };
|
|
164
|
+
const rawResponse = createRawResponse();
|
|
165
|
+
const reply = { raw: rawResponse, hijack: vi.fn() };
|
|
166
|
+
const request = { raw: rawRequest };
|
|
167
|
+
let received = null;
|
|
168
|
+
await server.exposeRawResponder(
|
|
169
|
+
request,
|
|
170
|
+
reply
|
|
171
|
+
)(async (req, res) => {
|
|
172
|
+
received = { request: req, response: res };
|
|
173
|
+
res.end("ok");
|
|
174
|
+
});
|
|
175
|
+
expect(reply.hijack).toHaveBeenCalledOnce();
|
|
176
|
+
expect(received).toEqual({ request: rawRequest, response: rawResponse });
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
var ensureTestInstance2;
|
|
181
|
+
var createRawResponse2;
|
|
128
182
|
export {
|
|
129
183
|
FastifyServer
|
|
130
184
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/server/adapters/fastify/index.ts"],"sourcesContent":["import fastifyCookie from '@fastify/cookie'\nimport fastifyCors from '@fastify/cors'\nimport fastifyFormBody from '@fastify/formbody'\nimport fastifyHelmet from '@fastify/helmet'\nimport fastifyMultipart from '@fastify/multipart'\nimport fastifyRateLimit from '@fastify/rate-limit'\nimport fastifyStatic from '@fastify/static'\nimport Fastify, { type FastifyReply, type FastifyRequest } from 'fastify'\n// import fastifySlowDown from 'fastify-slow-down'\nimport qs from 'qs'\n\nimport { ValidationError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable, getMediaDuration } from '../../../utilities'\nimport { Request, Response } from '../../requests'\nimport { StatusCodes, type IncomingFile, type MethodsEnum } from '../../types'\nimport { type RawResponder, Server, serverConfigPipe } from '../base'\n\nexport class FastifyServer extends configurable(serverConfigPipe, Server) {\n\t#app: ReturnType<typeof Fastify>\n\n\tprotected constructor(config: typeof FastifyServer.Config) {\n\t\tsuper(config)\n\t\tconst instance = Instance.get()\n\t\tconst app = Fastify({\n\t\t\tdisableRequestLogging: !config.requests.log,\n\t\t\tloggerInstance: config.requests.log ? instance.log : undefined,\n\t\t\tajv: { customOptions: { coerceTypes: false } },\n\t\t\trouterOptions: {\n\t\t\t\tignoreTrailingSlash: true,\n\t\t\t\tcaseSensitive: false,\n\t\t\t},\n\t\t\tschemaErrorFormatter: (errors, data) =>\n\t\t\t\tnew ValidationError(\n\t\t\t\t\terrors.map((error) => ({\n\t\t\t\t\t\tmessages: [error.message ?? ''],\n\t\t\t\t\t\tfield: `${data}${error.instancePath}`.replaceAll('/', '.'),\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t})\n\t\tthis.#app = app\n\n\t\tthis.setup(app.server, config)\n\n\t\tapp.decorateRequest('savedReq', null)\n\t\tapp.setValidatorCompiler(() => () => true)\n\t\tapp.setSerializerCompiler(() => (data) => JSON.stringify(data))\n\t\tif (config.publicPath) app.register(fastifyStatic, { root: config.publicPath })\n\t\tapp.register(fastifyCookie, {})\n\t\tapp.register(fastifyCors, this.cors)\n\t\tapp.register(fastifyFormBody, { parser: (str) => qs.parse(str) })\n\t\tapp.register(fastifyHelmet, { crossOriginResourcePolicy: { policy: 'cross-origin' }, contentSecurityPolicy: false })\n\t\tapp.register(fastifyMultipart, {\n\t\t\tattachFieldsToBody: 'keyValues',\n\t\t\tthrowFileSizeLimit: false,\n\t\t\tlimits: { fileSize: instance.settings.utils.maxFileUploadSizeInMb * 1024 * 1024 },\n\t\t\tonFile: async (f) => {\n\t\t\t\tconst buffer = await f.toBuffer()\n\t\t\t\tconst parsed: IncomingFile = {\n\t\t\t\t\tname: f.filename,\n\t\t\t\t\ttype: f.mimetype,\n\t\t\t\t\tsize: buffer.byteLength,\n\t\t\t\t\tisTruncated: f.file.truncated,\n\t\t\t\t\tdata: buffer,\n\t\t\t\t\tduration: await getMediaDuration(buffer),\n\t\t\t\t}\n\t\t\t\t// @ts-ignore\n\t\t\t\tf.value = parsed\n\t\t\t},\n\t\t})\n\t\t/* if (this.settings.slowdown.enabled) app.register(fastifySlowDown, {\n\t\t\t\ttimeWindow: this.settings.slowdown.periodInMs,\n\t\t\t\tdelayAfter: this.settings.slowdown.delayAfter,\n\t\t\t\tdelay: this.settings.slowdown.delayInMs\n\t\t\t}) */\n\t\tif (config.requests.rateLimit.enabled)\n\t\t\tapp.register(fastifyRateLimit, {\n\t\t\t\tmax: config.requests.rateLimit.limit,\n\t\t\t\ttimeWindow: config.requests.rateLimit.periodInMs,\n\t\t\t\terrorResponseBuilder: (_, context) => ({\n\t\t\t\t\tstatusCode: StatusCodes.TooManyRequests,\n\t\t\t\t\tmessage: JSON.stringify([{ message: `Too Many Requests. Retry in ${context.after}` }]),\n\t\t\t\t}),\n\t\t\t})\n\t}\n\n\tprotected async parseRequest(req: any) {\n\t\tconst { body, files } = excludeBufferKeys(req.body ?? {})\n\n\t\treturn new Request({\n\t\t\tip: req.ip,\n\t\t\tbody,\n\t\t\tcookies: req.cookies ?? {},\n\t\t\tparams: req.params ?? <any>{},\n\t\t\tquery: req.query ?? {},\n\t\t\tmethod: <any>req.method,\n\t\t\tpath: req.url,\n\t\t\theaders: req.headers,\n\t\t\tfiles,\n\t\t})\n\t}\n\n\tprotected async handleResponse(res: any, response: Response<any>) {\n\t\tfor (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts)\n\t\tawait res.status(response.status).headers(response.headers).send(response.body)\n\t}\n\n\tprotected createRawResponder(req: FastifyRequest, res: FastifyReply): RawResponder {\n\t\treturn this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() })\n\t}\n\n\tprotected registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.register(async (inst) => {\n\t\t\tinst.route({ url: path, method, handler: cb })\n\t\t})\n\t}\n\n\tprotected registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setErrorHandler(cb)\n\t}\n\n\tprotected registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>) {\n\t\tthis.#app.setNotFoundHandler(cb)\n\t}\n\n\tprotected async startServer(port: number) {\n\t\tawait this.#app.ready()\n\t\tawait this.#app.listen({ port, host: '0.0.0.0' })\n\t\tInstance.on('close', this.#app.close)\n\t\treturn true\n\t}\n}\n\nfunction excludeBufferKeys<T>(body: T) {\n\tif (typeof body !== 'object') return { body, files: {} }\n\tconst entries = Object.entries(body ?? {})\n\tconst isFile = (val: any) => (Array.isArray(val) ? isFile(val.at(0)) : Buffer.isBuffer(val?.data))\n\tconst fileEntries = entries.filter(([_, value]) => isFile(value)).map(([key, value]) => [key, Array.isArray(value) ? value : [value]])\n\tconst nonFileEntries = entries.filter(([_, value]) => !isFile(value))\n\treturn {\n\t\tbody: <T>Object.fromEntries(nonFileEntries),\n\t\tfiles: <Record<string, IncomingFile[]>>Object.fromEntries(fileEntries),\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, expect, test, vi } = import.meta.vitest\n\n\tconst testInstanceState = globalThis as typeof globalThis & { __equippedTestInstanceAliased?: boolean }\n\n\tfunction ensureTestInstance() {\n\t\tconst instance = Instance.maybeGet() ?? Instance.create({ app: { name: 'equipped-test' }, log: { level: 'silent' } })\n\t\tif (!testInstanceState.__equippedTestInstanceAliased) {\n\t\t\tinstance.alias('equipped-test')\n\t\t\ttestInstanceState.__equippedTestInstanceAliased = true\n\t\t}\n\t}\n\n\tfunction createRawResponse() {\n\t\treturn {\n\t\t\tstatusCode: 200,\n\t\t\theadersSent: false,\n\t\t\twritableEnded: false,\n\t\t\tsetHeader: vi.fn(),\n\t\t\tend(chunk?: unknown) {\n\t\t\t\tvoid chunk\n\t\t\t\tthis.headersSent = true\n\t\t\t\tthis.writableEnded = true\n\t\t\t},\n\t\t}\n\t}\n\n\tclass TestFastifyServer extends FastifyServer {\n\t\texposeRawResponder(req: FastifyRequest, res: FastifyReply) {\n\t\t\treturn this.createRawResponder(req, res)\n\t\t}\n\t}\n\n\tdescribe('FastifyServer raw responder', () => {\n\t\ttest('hijacks the Fastify reply before passing Node raw request and response to the handler', async () => {\n\t\t\tensureTestInstance()\n\t\t\tconst server = TestFastifyServer.create({ port: 0, requests: { log: false } })\n\t\t\tconst rawRequest = { marker: 'request' }\n\t\t\tconst rawResponse = createRawResponse()\n\t\t\tconst reply = { raw: rawResponse, hijack: vi.fn() } as unknown as FastifyReply\n\t\t\tconst request = { raw: rawRequest } as unknown as FastifyRequest\n\t\t\tlet received: { request: unknown; response: unknown } | null = null\n\n\t\t\tawait server.exposeRawResponder(\n\t\t\t\trequest,\n\t\t\t\treply,\n\t\t\t)(async (req, res) => {\n\t\t\t\treceived = { request: req, response: res }\n\t\t\t\tres.end('ok')\n\t\t\t})\n\n\t\t\texpect(reply.hijack).toHaveBeenCalledOnce()\n\t\t\texpect(received).toEqual({ request: rawRequest, response: rawResponse })\n\t\t})\n\t})\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,mBAAmB;AAC1B,OAAO,iBAAiB;AACxB,OAAO,qBAAqB;AAC5B,OAAO,mBAAmB;AAC1B,OAAO,sBAAsB;AAC7B,OAAO,sBAAsB;AAC7B,OAAO,mBAAmB;AAC1B,OAAO,aAAyD;AAEhE,OAAO,QAAQ;AASR,IAAM,gBAAN,cAA4B,aAAa,kBAAkB,MAAM,EAAE;AAAA,EACzE;AAAA,EAEU,YAAY,QAAqC;AAC1D,UAAM,MAAM;AACZ,UAAM,WAAW,SAAS,IAAI;AAC9B,UAAM,MAAM,QAAQ;AAAA,MACnB,uBAAuB,CAAC,OAAO,SAAS;AAAA,MACxC,gBAAgB,OAAO,SAAS,MAAM,SAAS,MAAM;AAAA,MACrD,KAAK,EAAE,eAAe,EAAE,aAAa,MAAM,EAAE;AAAA,MAC7C,eAAe;AAAA,QACd,qBAAqB;AAAA,QACrB,eAAe;AAAA,MAChB;AAAA,MACA,sBAAsB,CAAC,QAAQ,SAC9B,IAAI;AAAA,QACH,OAAO,IAAI,CAAC,WAAW;AAAA,UACtB,UAAU,CAAC,MAAM,WAAW,EAAE;AAAA,UAC9B,OAAO,GAAG,IAAI,GAAG,MAAM,YAAY,GAAG,WAAW,KAAK,GAAG;AAAA,QAC1D,EAAE;AAAA,MACH;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AAEZ,SAAK,MAAM,IAAI,QAAQ,MAAM;AAE7B,QAAI,gBAAgB,YAAY,IAAI;AACpC,QAAI,qBAAqB,MAAM,MAAM,IAAI;AACzC,QAAI,sBAAsB,MAAM,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC;AAC9D,QAAI,OAAO,WAAY,KAAI,SAAS,eAAe,EAAE,MAAM,OAAO,WAAW,CAAC;AAC9E,QAAI,SAAS,eAAe,CAAC,CAAC;AAC9B,QAAI,SAAS,aAAa,KAAK,IAAI;AACnC,QAAI,SAAS,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;AAChE,QAAI,SAAS,eAAe,EAAE,2BAA2B,EAAE,QAAQ,eAAe,GAAG,uBAAuB,MAAM,CAAC;AACnH,QAAI,SAAS,kBAAkB;AAAA,MAC9B,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,QAAQ,EAAE,UAAU,SAAS,SAAS,MAAM,wBAAwB,OAAO,KAAK;AAAA,MAChF,QAAQ,OAAO,MAAM;AACpB,cAAM,SAAS,MAAM,EAAE,SAAS;AAChC,cAAM,SAAuB;AAAA,UAC5B,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,MAAM,OAAO;AAAA,UACb,aAAa,EAAE,KAAK;AAAA,UACpB,MAAM;AAAA,UACN,UAAU,MAAM,iBAAiB,MAAM;AAAA,QACxC;AAEA,UAAE,QAAQ;AAAA,MACX;AAAA,IACD,CAAC;AAMD,QAAI,OAAO,SAAS,UAAU;AAC7B,UAAI,SAAS,kBAAkB;AAAA,QAC9B,KAAK,OAAO,SAAS,UAAU;AAAA,QAC/B,YAAY,OAAO,SAAS,UAAU;AAAA,QACtC,sBAAsB,CAAC,GAAG,aAAa;AAAA,UACtC,YAAY,YAAY;AAAA,UACxB,SAAS,KAAK,UAAU,CAAC,EAAE,SAAS,+BAA+B,QAAQ,KAAK,GAAG,CAAC,CAAC;AAAA,QACtF;AAAA,MACD,CAAC;AAAA,EACH;AAAA,EAEA,MAAgB,aAAa,KAAU;AACtC,UAAM,EAAE,MAAM,MAAM,IAAI,kBAAkB,IAAI,QAAQ,CAAC,CAAC;AAExD,WAAO,IAAI,QAAQ;AAAA,MAClB,IAAI,IAAI;AAAA,MACR;AAAA,MACA,SAAS,IAAI,WAAW,CAAC;AAAA,MACzB,QAAQ,IAAI,UAAe,CAAC;AAAA,MAC5B,OAAO,IAAI,SAAS,CAAC;AAAA,MACrB,QAAa,IAAI;AAAA,MACjB,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEA,MAAgB,eAAe,KAAU,UAAyB;AACjE,eAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK,OAAO,QAAQ,SAAS,OAAO,EAAG,OAAM,IAAI,UAAU,KAAK,OAAO,IAAI;AAC9G,UAAM,IAAI,OAAO,SAAS,MAAM,EAAE,QAAQ,SAAS,OAAO,EAAE,KAAK,SAAS,IAAI;AAAA,EAC/E;AAAA,EAEU,mBAAmB,KAAqB,KAAiC;AAClF,WAAO,KAAK,uBAAuB,EAAE,SAAS,IAAI,KAAK,UAAU,IAAI,KAAK,cAAc,MAAM,IAAI,OAAO,EAAE,CAAC;AAAA,EAC7G;AAAA,EAEU,cAAc,QAAqB,MAAc,IAA2C;AACrG,SAAK,KAAK,SAAS,OAAO,SAAS;AAClC,WAAK,MAAM,EAAE,KAAK,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IAC9C,CAAC;AAAA,EACF;AAAA,EAEU,qBAAqB,IAAyD;AACvF,SAAK,KAAK,gBAAgB,EAAE;AAAA,EAC7B;AAAA,EAEU,wBAAwB,IAA2C;AAC5E,SAAK,KAAK,mBAAmB,EAAE;AAAA,EAChC;AAAA,EAEA,MAAgB,YAAY,MAAc;AACzC,UAAM,KAAK,KAAK,MAAM;AACtB,UAAM,KAAK,KAAK,OAAO,EAAE,MAAM,MAAM,UAAU,CAAC;AAChD,aAAS,GAAG,SAAS,KAAK,KAAK,KAAK;AACpC,WAAO;AAAA,EACR;AACD;AAEA,SAAS,kBAAqB,MAAS;AACtC,MAAI,OAAO,SAAS,SAAU,QAAO,EAAE,MAAM,OAAO,CAAC,EAAE;AACvD,QAAM,UAAU,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACzC,QAAM,SAAS,CAAC,QAAc,MAAM,QAAQ,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,OAAO,SAAS,KAAK,IAAI;AAChG,QAAM,cAAc,QAAQ,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,OAAO,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrI,QAAM,iBAAiB,QAAQ,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,OAAO,KAAK,CAAC;AACpE,SAAO;AAAA,IACN,MAAS,OAAO,YAAY,cAAc;AAAA,IAC1C,OAAuC,OAAO,YAAY,WAAW;AAAA,EACtE;AACD;AAEA,IAAI,QAAoB;AAKvB,MAAS,qBAAT,WAA8B;AAC7B,UAAM,WAAW,SAAS,SAAS,KAAK,SAAS,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAO,SAAS,EAAE,CAAC;AACpH,QAAI,CAAC,kBAAkB,+BAA+B;AACrD,eAAS,MAAM,eAAe;AAC9B,wBAAkB,gCAAgC;AAAA,IACnD;AAAA,EACD,GAES,oBAAT,WAA6B;AAC5B,WAAO;AAAA,MACN,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,eAAe;AAAA,MACf,WAAW,GAAG,GAAG;AAAA,MACjB,IAAI,OAAiB;AACpB,aAAK;AACL,aAAK,cAAc;AACnB,aAAK,gBAAgB;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AApBS,EAAAA,sBAAA,oBAQAC,qBAAA;AAZT,QAAM,EAAE,UAAU,QAAQ,MAAM,GAAG,IAAI;AAEvC,QAAM,oBAAoB;AAAA,EAwB1B,MAAM,0BAA0B,cAAc;AAAA,IAC7C,mBAAmB,KAAqB,KAAmB;AAC1D,aAAO,KAAK,mBAAmB,KAAK,GAAG;AAAA,IACxC;AAAA,EACD;AAEA,WAAS,+BAA+B,MAAM;AAC7C,SAAK,yFAAyF,YAAY;AACzG,yBAAmB;AACnB,YAAM,SAAS,kBAAkB,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;AAC7E,YAAM,aAAa,EAAE,QAAQ,UAAU;AACvC,YAAM,cAAc,kBAAkB;AACtC,YAAM,QAAQ,EAAE,KAAK,aAAa,QAAQ,GAAG,GAAG,EAAE;AAClD,YAAM,UAAU,EAAE,KAAK,WAAW;AAClC,UAAI,WAA2D;AAE/D,YAAM,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,MACD,EAAE,OAAO,KAAK,QAAQ;AACrB,mBAAW,EAAE,SAAS,KAAK,UAAU,IAAI;AACzC,YAAI,IAAI,IAAI;AAAA,MACb,CAAC;AAED,aAAO,MAAM,MAAM,EAAE,qBAAqB;AAC1C,aAAO,QAAQ,EAAE,QAAQ,EAAE,SAAS,YAAY,UAAU,YAAY,CAAC;AAAA,IACxE,CAAC;AAAA,EACF,CAAC;AACF;AAlDU,IAAAD;AAQA,IAAAC;","names":["ensureTestInstance","createRawResponse"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as m,B as n,C as o,D as p,f as a,g as b,h as c,i as d,j as e,k as f,u as g,v as h,w as i,x as j,y as k,z as l}from "../chunk-
|
|
1
|
+
import{A as m,B as n,C as o,D as p,f as a,g as b,h as c,i as d,j as e,k as f,u as g,v as h,w as i,x as j,y as k,z as l}from "../chunk-IN5YKIJ7.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";export{j as BaseApiKeyRequestAuthMethod,m as BaseJwtCookieRequestAuthMethod,l as BaseJwtHeaderRequestAuthMethod,k as BaseJwtRequestAuthMethod,i as BaseRequestAuthMethod,a as Methods,g as Request,h as Response,f as Router,o as Server,b as StatusCodes,e as makeErrorMiddleware,c as makeMiddleware,d as makeResponseMiddleware,p as requireAuthUser,n as serverConfigPipe};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{l as a,m as b,n as c,o as d,p as e,q as f,r as g,s as h,t as i}from "../chunk-
|
|
1
|
+
import{l as a,m as b,n as c,o as d,p as e,q as f,r as g,s as h,t as i}from "../chunk-IN5YKIJ7.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";export{a as AuthProviders,c as Hash,g as Random,b as configurable,f as getMediaDuration,e as parseJSONObject,d as parseJSONValue,i as retry,h as sleep};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as a,d as b,e as c}from "../chunk-
|
|
1
|
+
import{c as a,d as b,e as c}from "../chunk-IN5YKIJ7.min.mjs";import"../chunk-DSUJ5FUL.min.mjs";import"../chunk-AQY7QVYI.min.mjs";export{b as pipeErrorToValidationError,c as validate,a as ve};
|
|
2
2
|
//# sourceMappingURL=index.min.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import http from 'node:http';
|
|
1
|
+
import http, { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
import { FastifyCorsOptions } from '@fastify/cors';
|
|
3
3
|
import { CorsOptions } from 'cors';
|
|
4
4
|
import TestAgent from 'supertest/lib/agent';
|
|
@@ -119,12 +119,29 @@ declare const serverConfigPipe: () => Pipe<{
|
|
|
119
119
|
socketsAuthMethods: BaseRequestAuthMethod<AuthUser>[];
|
|
120
120
|
}>;
|
|
121
121
|
type ServerConfig = PipeOutput<ReturnType<typeof serverConfigPipe>>;
|
|
122
|
+
declare const rawResponseHandledSymbol: unique symbol;
|
|
123
|
+
type RawResponseHandled = {
|
|
124
|
+
readonly [rawResponseHandledSymbol]: true;
|
|
125
|
+
};
|
|
126
|
+
type RawResponseHandler = (request: IncomingMessage, response: ServerResponse) => unknown | Promise<unknown>;
|
|
127
|
+
type RawResponder = (handler: RawResponseHandler) => Promise<RawResponseHandled>;
|
|
128
|
+
type ServerBeforeListenContext = {
|
|
129
|
+
httpServer: http.Server;
|
|
130
|
+
port: number;
|
|
131
|
+
};
|
|
132
|
+
type ServerBeforeListenHandler = (context: ServerBeforeListenContext) => void | Promise<void>;
|
|
133
|
+
type ServerNotFoundContext = {
|
|
134
|
+
request: Request<any>;
|
|
135
|
+
respondWithRaw: RawResponder;
|
|
136
|
+
};
|
|
137
|
+
type ServerNotFoundHandler = (context: ServerNotFoundContext) => Response<any> | RawResponseHandled | Promise<Response<any> | RawResponseHandled>;
|
|
122
138
|
declare abstract class Server {
|
|
123
139
|
#private;
|
|
124
140
|
socket: SocketEmitter;
|
|
125
141
|
cors: CorsOptions & FastifyCorsOptions;
|
|
126
142
|
protected abstract parseRequest(req: any): Promise<Request<any>>;
|
|
127
143
|
protected abstract handleResponse(res: any, response: Response<any>): Promise<void>;
|
|
144
|
+
protected abstract createRawResponder(req: any, res: any): RawResponder;
|
|
128
145
|
protected abstract registerRoute(method: MethodsEnum, path: string, cb: (req: any, res: any) => Promise<void>): void;
|
|
129
146
|
protected abstract registerErrorHandler(cb: (error: Error, req: any, res: any) => Promise<void>): void;
|
|
130
147
|
protected abstract registerNotFoundHandler(cb: (req: any, res: any) => Promise<void>): void;
|
|
@@ -132,8 +149,15 @@ declare abstract class Server {
|
|
|
132
149
|
protected setup(httpServer: http.Server, config: ServerConfig): void;
|
|
133
150
|
addRouter(...routers: Router<any>[]): void;
|
|
134
151
|
addRoute<T extends RouteDef>(...routes: Route<T>[]): void;
|
|
152
|
+
setNotFoundHandler(handler: ServerNotFoundHandler): this;
|
|
153
|
+
onBeforeListen(handler: ServerBeforeListenHandler): this;
|
|
135
154
|
test(): TestAgent;
|
|
136
155
|
start(): Promise<boolean>;
|
|
156
|
+
protected createNodeRawResponder(input: {
|
|
157
|
+
request: IncomingMessage;
|
|
158
|
+
response: ServerResponse;
|
|
159
|
+
beforeHandle?: () => void;
|
|
160
|
+
}): RawResponder;
|
|
137
161
|
}
|
|
138
162
|
|
|
139
|
-
export { BaseRequestAuthMethod as B, type OnJoinFn as O,
|
|
163
|
+
export { BaseRequestAuthMethod as B, type OnJoinFn as O, type RawResponder as R, Server as S, type ServerConfig as a, type RawResponseHandled as b, type RawResponseHandler as c, type ServerBeforeListenContext as d, type ServerBeforeListenHandler as e, type ServerNotFoundContext as f, type ServerNotFoundHandler as g, Router as h, type SocketCallbacks as i, SocketEmitter as j, serverConfigPipe as s };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Cache
|
|
3
|
-
} from "../../../chunk-
|
|
3
|
+
} from "../../../chunk-LPB5LS7A.js";
|
|
4
4
|
import {
|
|
5
5
|
Instance,
|
|
6
6
|
configurable
|
|
7
|
-
} from "../../../chunk-
|
|
7
|
+
} from "../../../chunk-TT5EORDK.js";
|
|
8
8
|
import "../../../chunk-KZKFYO4V.js";
|
|
9
9
|
import "../../../chunk-MLKGABMK.js";
|
|
10
10
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RedisCache,
|
|
3
3
|
redisConfigPipe
|
|
4
|
-
} from "../../../chunk-
|
|
5
|
-
import "../../../chunk-
|
|
6
|
-
import "../../../chunk-
|
|
4
|
+
} from "../../../chunk-YLJNBL6J.js";
|
|
5
|
+
import "../../../chunk-LPB5LS7A.js";
|
|
6
|
+
import "../../../chunk-TT5EORDK.js";
|
|
7
7
|
import "../../../chunk-KZKFYO4V.js";
|
|
8
8
|
import "../../../chunk-MLKGABMK.js";
|
|
9
9
|
export {
|
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
PushOp,
|
|
12
12
|
SetOp,
|
|
13
13
|
UnsetOp
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-5Z26ZURE.js";
|
|
15
15
|
import {
|
|
16
16
|
configurable
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-TT5EORDK.js";
|
|
18
18
|
|
|
19
19
|
// src/orm/adapters/in-memory/index.ts
|
|
20
20
|
import { AsyncLocalStorage } from "async_hooks";
|