equipped 5.3.0-alpha.0 → 5.3.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 (134) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/server/adapters/express/index.cjs +266 -4
  3. package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
  4. package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
  5. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
  6. package/dist/cjs/server/adapters/fastify/index.cjs +269 -4
  7. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
  8. package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
  9. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
  10. package/dist/cjs/server/index.cjs +215 -4
  11. package/dist/cjs/server/index.cjs.map +1 -1
  12. package/dist/cjs/server/index.min.cjs +7 -7
  13. package/dist/cjs/server/index.min.cjs.map +1 -1
  14. package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
  15. package/dist/esm/cache/adapters/in-memory/index.mjs +2 -2
  16. package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
  17. package/dist/esm/cache/adapters/redis/index.mjs +3 -3
  18. package/dist/esm/cache/index.min.mjs +1 -1
  19. package/dist/esm/cache/index.mjs +2 -2
  20. package/dist/esm/{chunk-WHIWTP2Z.min.mjs → chunk-4JLDXF7T.min.mjs} +2 -2
  21. package/dist/esm/{chunk-I4BB436E.mjs → chunk-4MXYZS5R.mjs} +2 -2
  22. package/dist/esm/{chunk-YTM6ZURZ.min.mjs → chunk-5VW3JAFR.min.mjs} +2 -2
  23. package/dist/esm/{chunk-YTHRK2PO.mjs → chunk-AKQBDYUO.mjs} +3 -3
  24. package/dist/esm/{chunk-MYGAF2AC.min.mjs → chunk-B5QQ32YY.min.mjs} +2 -2
  25. package/dist/esm/chunk-FLAPYQUT.min.mjs +32 -0
  26. package/dist/esm/chunk-FLAPYQUT.min.mjs.map +1 -0
  27. package/dist/esm/{chunk-KW3PBDFD.mjs → chunk-JH6EBXY4.mjs} +2 -2
  28. package/dist/esm/{chunk-2TCFNKRZ.mjs → chunk-MDQKODYQ.mjs} +216 -5
  29. package/dist/esm/chunk-MDQKODYQ.mjs.map +1 -0
  30. package/dist/esm/{chunk-ECBJ3NT3.min.mjs → chunk-PCAUXBAG.min.mjs} +2 -2
  31. package/dist/esm/{chunk-RIRBNBTC.mjs → chunk-PNZNNUMN.mjs} +3 -3
  32. package/dist/esm/{chunk-TWKHVLLT.mjs → chunk-PQCBVQL6.mjs} +2 -2
  33. package/dist/esm/{chunk-AUKXL4EA.min.mjs → chunk-QHLKB47N.min.mjs} +2 -2
  34. package/dist/esm/{chunk-6DW4GW3R.min.mjs → chunk-SGZNOYC3.min.mjs} +2 -2
  35. package/dist/esm/{chunk-6SB5M4XH.mjs → chunk-TVTYDU2D.mjs} +3 -3
  36. package/dist/esm/{chunk-IEBC3OWN.mjs → chunk-Z2TZ3KR7.mjs} +2 -2
  37. package/dist/esm/{chunk-OXI6IKAM.min.mjs → chunk-ZGMFFK6Y.min.mjs} +2 -2
  38. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
  39. package/dist/esm/dbs/adapters/mongodb/index.mjs +3 -3
  40. package/dist/esm/dbs/index.min.mjs +1 -1
  41. package/dist/esm/dbs/index.mjs +3 -3
  42. package/dist/esm/errors/index.min.mjs +1 -1
  43. package/dist/esm/errors/index.mjs +1 -1
  44. package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
  45. package/dist/esm/events/adapters/kafka/index.mjs +2 -2
  46. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
  47. package/dist/esm/events/adapters/rabbitmq/index.mjs +1 -1
  48. package/dist/esm/index.min.mjs +1 -1
  49. package/dist/esm/index.mjs +1 -1
  50. package/dist/esm/instance/index.min.mjs +1 -1
  51. package/dist/esm/instance/index.mjs +1 -1
  52. package/dist/esm/{introspection-Y7EXSYPD.mjs → introspection-32BRYKYY.mjs} +3 -3
  53. package/dist/esm/introspection-A72WMWE3.min.mjs +2 -0
  54. package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
  55. package/dist/esm/jobs/adapters/redis/index.mjs +3 -3
  56. package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
  57. package/dist/esm/orm/adapters/in-memory/index.mjs +3 -3
  58. package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
  59. package/dist/esm/orm/adapters/json/index.mjs +3 -3
  60. package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
  61. package/dist/esm/orm/adapters/mongodb/index.mjs +2 -2
  62. package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
  63. package/dist/esm/orm/adapters/postgresql/index.mjs +3 -3
  64. package/dist/esm/orm/index.min.mjs +1 -1
  65. package/dist/esm/orm/index.mjs +3 -3
  66. package/dist/esm/server/adapters/express/index.min.mjs +1 -1
  67. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
  68. package/dist/esm/server/adapters/express/index.mjs +52 -1
  69. package/dist/esm/server/adapters/express/index.mjs.map +1 -1
  70. package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
  71. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
  72. package/dist/esm/server/adapters/fastify/index.mjs +55 -1
  73. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
  74. package/dist/esm/server/index.min.mjs +1 -1
  75. package/dist/esm/server/index.mjs +1 -1
  76. package/dist/esm/utilities/index.min.mjs +1 -1
  77. package/dist/esm/utilities/index.mjs +1 -1
  78. package/dist/esm/validations/index.min.mjs +1 -1
  79. package/dist/esm/validations/index.mjs +1 -1
  80. package/dist/types/{base-3PpBAx1K.d.ts → base-DVr0fHil.d.ts} +20 -2
  81. package/dist/types/cache/adapters/in-memory/index.js +2 -2
  82. package/dist/types/cache/adapters/redis/index.js +3 -3
  83. package/dist/types/cache/index.js +2 -2
  84. package/dist/types/{chunk-JZ2JTENY.js → chunk-3M4PBZAQ.js} +2 -2
  85. package/dist/types/{chunk-LWUMIHL4.js → chunk-3TKJGSCZ.js} +1 -1
  86. package/dist/types/{chunk-4LRJJSGG.js → chunk-65EHKCDZ.js} +2 -2
  87. package/dist/types/{chunk-A2MRYMCA.js → chunk-JQ2FWX4W.js} +1 -1
  88. package/dist/types/{chunk-H6JBLKX5.js → chunk-NJ2FHI3U.js} +2 -2
  89. package/dist/types/{chunk-XOU2A2Y6.js → chunk-OHFTQGQG.js} +1 -1
  90. package/dist/types/{chunk-IAHTILKJ.js → chunk-XGGGAEET.js} +1 -1
  91. package/dist/types/{chunk-32DMHN3G.js → chunk-YTY3EFNB.js} +215 -4
  92. package/dist/types/dbs/adapters/mongodb/index.js +3 -3
  93. package/dist/types/dbs/index.js +3 -3
  94. package/dist/types/errors/index.js +1 -1
  95. package/dist/types/events/adapters/kafka/index.js +2 -2
  96. package/dist/types/events/adapters/rabbitmq/index.js +1 -1
  97. package/dist/types/index.js +1 -1
  98. package/dist/types/instance/index.js +1 -1
  99. package/dist/types/{introspection-ZQCAW254.js → introspection-VOIU3XE6.js} +2 -2
  100. package/dist/types/jobs/adapters/redis/index.js +3 -3
  101. package/dist/types/orm/adapters/in-memory/index.js +3 -3
  102. package/dist/types/orm/adapters/json/index.js +3 -3
  103. package/dist/types/orm/adapters/mongodb/index.js +2 -2
  104. package/dist/types/orm/adapters/postgresql/index.js +3 -3
  105. package/dist/types/orm/index.js +3 -3
  106. package/dist/types/server/adapters/express/index.d.ts +3 -1
  107. package/dist/types/server/adapters/express/index.js +52 -1
  108. package/dist/types/server/adapters/fastify/index.d.ts +3 -1
  109. package/dist/types/server/adapters/fastify/index.js +55 -1
  110. package/dist/types/server/index.d.ts +2 -2
  111. package/dist/types/server/index.js +1 -1
  112. package/dist/types/utilities/index.js +1 -1
  113. package/dist/types/validations/index.js +1 -1
  114. package/package.json +2 -4
  115. package/dist/esm/chunk-2TCFNKRZ.mjs.map +0 -1
  116. package/dist/esm/chunk-LTDVZJYJ.min.mjs +0 -32
  117. package/dist/esm/chunk-LTDVZJYJ.min.mjs.map +0 -1
  118. package/dist/esm/introspection-GP3G26B6.min.mjs +0 -2
  119. /package/dist/esm/{chunk-WHIWTP2Z.min.mjs.map → chunk-4JLDXF7T.min.mjs.map} +0 -0
  120. /package/dist/esm/{chunk-I4BB436E.mjs.map → chunk-4MXYZS5R.mjs.map} +0 -0
  121. /package/dist/esm/{chunk-YTM6ZURZ.min.mjs.map → chunk-5VW3JAFR.min.mjs.map} +0 -0
  122. /package/dist/esm/{chunk-YTHRK2PO.mjs.map → chunk-AKQBDYUO.mjs.map} +0 -0
  123. /package/dist/esm/{chunk-MYGAF2AC.min.mjs.map → chunk-B5QQ32YY.min.mjs.map} +0 -0
  124. /package/dist/esm/{chunk-KW3PBDFD.mjs.map → chunk-JH6EBXY4.mjs.map} +0 -0
  125. /package/dist/esm/{chunk-ECBJ3NT3.min.mjs.map → chunk-PCAUXBAG.min.mjs.map} +0 -0
  126. /package/dist/esm/{chunk-RIRBNBTC.mjs.map → chunk-PNZNNUMN.mjs.map} +0 -0
  127. /package/dist/esm/{chunk-TWKHVLLT.mjs.map → chunk-PQCBVQL6.mjs.map} +0 -0
  128. /package/dist/esm/{chunk-AUKXL4EA.min.mjs.map → chunk-QHLKB47N.min.mjs.map} +0 -0
  129. /package/dist/esm/{chunk-6DW4GW3R.min.mjs.map → chunk-SGZNOYC3.min.mjs.map} +0 -0
  130. /package/dist/esm/{chunk-6SB5M4XH.mjs.map → chunk-TVTYDU2D.mjs.map} +0 -0
  131. /package/dist/esm/{chunk-IEBC3OWN.mjs.map → chunk-Z2TZ3KR7.mjs.map} +0 -0
  132. /package/dist/esm/{chunk-OXI6IKAM.min.mjs.map → chunk-ZGMFFK6Y.min.mjs.map} +0 -0
  133. /package/dist/esm/{introspection-GP3G26B6.min.mjs.map → introspection-32BRYKYY.mjs.map} +0 -0
  134. /package/dist/esm/{introspection-Y7EXSYPD.mjs.map → introspection-A72WMWE3.min.mjs.map} +0 -0
@@ -64,6 +64,7 @@ var RequestError = class extends EquippedError {
64
64
  };
65
65
 
66
66
  // src/server/adapters/base.ts
67
+ var import_node_http = require("http");
67
68
  var import_cors = require("@fastify/cors");
68
69
  var import_cors2 = require("cors");
69
70
  var import_socket = require("socket.io");
@@ -1374,6 +1375,22 @@ var serverConfigPipe = () => import_valleyed8.v.object({
1374
1375
  ),
1375
1376
  socketsAuthMethods: import_valleyed8.v.defaults(import_valleyed8.v.array(import_valleyed8.v.instanceOf(BaseRequestAuthMethod)), [])
1376
1377
  });
1378
+ var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
1379
+ var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
1380
+ var rawResponseNotStartedMessage = "Raw not-found handler did not start or complete a response";
1381
+ function isRawResponseHandled(input) {
1382
+ return Boolean(input && typeof input === "object" && rawResponseHandledSymbol in input);
1383
+ }
1384
+ function hasRawResponseStarted(response) {
1385
+ return response.headersSent || response.writableEnded;
1386
+ }
1387
+ function writeRawHandlerError(response, error) {
1388
+ if (hasRawResponseStarted(response)) return;
1389
+ response.statusCode = StatusCodes.BadRequest;
1390
+ response.setHeader("Content-Type", "application/json");
1391
+ const message = error instanceof Error ? error.message : `${error}`;
1392
+ response.end(JSON.stringify([{ message }]));
1393
+ }
1377
1394
  var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
1378
1395
  status: value,
1379
1396
  contentType: "application/json",
@@ -1390,6 +1407,8 @@ var Server = class {
1390
1407
  #serverConfig;
1391
1408
  #queue = [];
1392
1409
  #routesByKey = /* @__PURE__ */ new Set();
1410
+ #started = false;
1411
+ #notFoundHandler = null;
1393
1412
  setup(httpServer, config) {
1394
1413
  this.#httpServer = httpServer;
1395
1414
  this.#serverConfig = config;
@@ -1439,10 +1458,16 @@ var Server = class {
1439
1458
  });
1440
1459
  });
1441
1460
  }
1461
+ setNotFoundHandler(handler) {
1462
+ if (this.#started) throw new EquippedError("Cannot set not-found handler after server has started", {});
1463
+ this.#notFoundHandler = handler;
1464
+ return this;
1465
+ }
1442
1466
  test() {
1443
1467
  return (0, import_supertest.default)(this.#httpServer);
1444
1468
  }
1445
1469
  async start() {
1470
+ this.#started = true;
1446
1471
  const config = this.#serverConfig;
1447
1472
  const instance = Instance.get();
1448
1473
  const { app } = instance.settings;
@@ -1456,10 +1481,7 @@ var Server = class {
1456
1481
  })
1457
1482
  });
1458
1483
  await Promise.all(this.#queue.map((cb) => cb()));
1459
- this.registerNotFoundHandler(async (req) => {
1460
- const request = await this.parseRequest(req);
1461
- throw new NotFoundError(`Route ${request.path} not found`);
1462
- });
1484
+ this.registerNotFoundHandler(async (req, res) => await this.#handleNotFound(req, res));
1463
1485
  this.registerErrorHandler(async (error, _, res) => {
1464
1486
  if (!(error instanceof EquippedError)) Instance.get().log.error({ error }, "Uncaught error in route handler");
1465
1487
  const response = error instanceof RequestError ? new Response({
@@ -1478,6 +1500,31 @@ var Server = class {
1478
1500
  if (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`);
1479
1501
  return started;
1480
1502
  }
1503
+ createNodeRawResponder(input) {
1504
+ return async (handler) => {
1505
+ input.beforeHandle?.();
1506
+ try {
1507
+ await handler(input.request, input.response);
1508
+ } catch (error) {
1509
+ if (!hasRawResponseStarted(input.response)) {
1510
+ writeRawHandlerError(input.response, error);
1511
+ return rawResponseHandled;
1512
+ }
1513
+ throw error;
1514
+ }
1515
+ if (!hasRawResponseStarted(input.response))
1516
+ writeRawHandlerError(input.response, new EquippedError(rawResponseNotStartedMessage, {}));
1517
+ return rawResponseHandled;
1518
+ };
1519
+ }
1520
+ async #handleNotFound(req, res) {
1521
+ const request = await this.parseRequest(req);
1522
+ if (!this.#notFoundHandler) throw new NotFoundError(`Route ${request.path} not found`);
1523
+ const result = await this.#notFoundHandler({ request, respondWithRaw: this.createRawResponder(req, res) });
1524
+ if (isRawResponseHandled(result)) return;
1525
+ if (result instanceof Response) return await this.handleResponse(res, result);
1526
+ throw new EquippedError("Not-found handler must return a Response or respondWithRaw(...)", {});
1527
+ }
1481
1528
  #resolveSchema(method, schema) {
1482
1529
  const defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok;
1483
1530
  const defaultContentType = schema?.defaultContentType ?? "application/json";
@@ -1568,6 +1615,170 @@ var Server = class {
1568
1615
  };
1569
1616
  }
1570
1617
  };
1618
+ if (void 0) {
1619
+ let ensureTestInstance = function() {
1620
+ const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
1621
+ if (!testInstanceState.__equippedTestInstanceAliased) {
1622
+ instance.alias("equipped-test");
1623
+ testInstanceState.__equippedTestInstanceAliased = true;
1624
+ }
1625
+ }, createRawResponse = function() {
1626
+ const chunks = [];
1627
+ return {
1628
+ statusCode: 200,
1629
+ headersSent: false,
1630
+ writableEnded: false,
1631
+ headers: {},
1632
+ setHeader(key, value) {
1633
+ this.headers[key] = value;
1634
+ },
1635
+ end(chunk) {
1636
+ if (chunk !== void 0) chunks.push(Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk));
1637
+ this.headersSent = true;
1638
+ this.writableEnded = true;
1639
+ },
1640
+ body() {
1641
+ return chunks.join("");
1642
+ }
1643
+ };
1644
+ };
1645
+ ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
1646
+ const { describe, expect, test } = void 0;
1647
+ const testInstanceState = globalThis;
1648
+ class TestServer extends Server {
1649
+ handledResponse = null;
1650
+ notFoundHandler = null;
1651
+ constructor() {
1652
+ super();
1653
+ this.setup(http.createServer(), {
1654
+ port: 0,
1655
+ cors: void 0,
1656
+ eventBus: void 0,
1657
+ publicPath: void 0,
1658
+ healthPath: void 0,
1659
+ openapi: { docsVersion: "1.0.0", docsBaseUrl: ["/"], docsPath: "/__docs" },
1660
+ requests: {
1661
+ log: false,
1662
+ rateLimit: { enabled: false, periodInMs: 1, limit: 1 },
1663
+ slowdown: { enabled: false, periodInMs: 1, delayAfter: 1, delayInMs: 1 }
1664
+ },
1665
+ socketsAuthMethods: []
1666
+ });
1667
+ }
1668
+ async parseRequest(req) {
1669
+ return new Request2({
1670
+ ip: "127.0.0.1",
1671
+ body: {},
1672
+ cookies: {},
1673
+ params: {},
1674
+ query: {},
1675
+ method: Methods.get,
1676
+ path: req.path,
1677
+ headers: {},
1678
+ files: {}
1679
+ });
1680
+ }
1681
+ async handleResponse(_, response) {
1682
+ this.handledResponse = response;
1683
+ }
1684
+ createRawResponder(req, res) {
1685
+ return this.createNodeRawResponder({ request: req.rawRequest, response: res.rawResponse });
1686
+ }
1687
+ registerRoute() {
1688
+ }
1689
+ registerErrorHandler() {
1690
+ }
1691
+ registerNotFoundHandler(cb) {
1692
+ this.notFoundHandler = cb;
1693
+ }
1694
+ async startServer() {
1695
+ return true;
1696
+ }
1697
+ async dispatchNotFound(path) {
1698
+ if (!this.notFoundHandler) throw new Error("not-found handler was not registered");
1699
+ this.handledResponse = null;
1700
+ const rawResponse = createRawResponse();
1701
+ await this.notFoundHandler({ path, rawRequest: {} }, { rawResponse });
1702
+ return { handledResponse: this.handledResponse, rawResponse };
1703
+ }
1704
+ }
1705
+ describe("Server not-found handler", () => {
1706
+ test("throws the default Equipped not-found error when no custom handler is set", async () => {
1707
+ ensureTestInstance();
1708
+ const server = new TestServer();
1709
+ await server.start();
1710
+ await expect(server.dispatchNotFound("/missing")).rejects.toBeInstanceOf(NotFoundError);
1711
+ });
1712
+ test("allows a custom not-found handler to return an Equipped response", async () => {
1713
+ ensureTestInstance();
1714
+ const server = new TestServer();
1715
+ server.setNotFoundHandler(
1716
+ ({ request }) => new Response({
1717
+ body: [{ message: `No route for ${request.path}` }],
1718
+ status: StatusCodes.NotFound,
1719
+ headers: {},
1720
+ cookies: {},
1721
+ contentType: "application/json"
1722
+ })
1723
+ );
1724
+ await server.start();
1725
+ const result = await server.dispatchNotFound("/custom");
1726
+ expect(result.handledResponse?.status).toBe(StatusCodes.NotFound);
1727
+ expect(result.handledResponse?.body).toEqual([{ message: "No route for /custom" }]);
1728
+ });
1729
+ test("allows a custom not-found handler to complete the response through a raw Node listener", async () => {
1730
+ ensureTestInstance();
1731
+ const server = new TestServer();
1732
+ server.setNotFoundHandler(
1733
+ ({ respondWithRaw }) => respondWithRaw((_, response) => {
1734
+ response.statusCode = 203;
1735
+ response.end("raw fallback");
1736
+ })
1737
+ );
1738
+ await server.start();
1739
+ const result = await server.dispatchNotFound("/page");
1740
+ expect(result.handledResponse).toBeNull();
1741
+ expect(result.rawResponse.statusCode).toBe(203);
1742
+ expect(result.rawResponse.body()).toBe("raw fallback");
1743
+ });
1744
+ test("writes a clear raw error when a raw not-found handler does not start a response", async () => {
1745
+ ensureTestInstance();
1746
+ const server = new TestServer();
1747
+ server.setNotFoundHandler(({ respondWithRaw }) => respondWithRaw(() => {
1748
+ }));
1749
+ await server.start();
1750
+ const result = await server.dispatchNotFound("/page");
1751
+ expect(result.handledResponse).toBeNull();
1752
+ expect(result.rawResponse.statusCode).toBe(StatusCodes.BadRequest);
1753
+ expect(result.rawResponse.body()).toContain(rawResponseNotStartedMessage);
1754
+ });
1755
+ test("rejects a custom not-found handler result that is neither an Equipped response nor raw completion", async () => {
1756
+ ensureTestInstance();
1757
+ const server = new TestServer();
1758
+ server.setNotFoundHandler((() => void 0));
1759
+ await server.start();
1760
+ await expect(server.dispatchNotFound("/bad")).rejects.toThrow("Not-found handler must return a Response or respondWithRaw(...)");
1761
+ });
1762
+ test("rejects setting the custom not-found handler after server startup", async () => {
1763
+ ensureTestInstance();
1764
+ const server = new TestServer();
1765
+ await server.start();
1766
+ expect(
1767
+ () => server.setNotFoundHandler(
1768
+ () => new Response({
1769
+ body: null,
1770
+ status: StatusCodes.NotFound,
1771
+ headers: {},
1772
+ cookies: {},
1773
+ contentType: "application/json"
1774
+ })
1775
+ )
1776
+ ).toThrow("Cannot set not-found handler after server has started");
1777
+ });
1778
+ });
1779
+ }
1780
+ var ensureTestInstance2;
1781
+ var createRawResponse2;
1571
1782
 
1572
1783
  // src/errors/types/badRequestError.ts
1573
1784
  var BadRequestError = class extends RequestError {
@@ -1673,6 +1884,9 @@ var FastifyServer = class extends configurable(serverConfigPipe, Server) {
1673
1884
  for (const [key, { value, ...opts }] of Object.entries(response.cookies)) res = res.setCookie(key, value, opts);
1674
1885
  await res.status(response.status).headers(response.headers).send(response.body);
1675
1886
  }
1887
+ createRawResponder(req, res) {
1888
+ return this.createNodeRawResponder({ request: req.raw, response: res.raw, beforeHandle: () => res.hijack() });
1889
+ }
1676
1890
  registerRoute(method, path, cb) {
1677
1891
  this.#app.register(async (inst) => {
1678
1892
  inst.route({ url: path, method, handler: cb });
@@ -1702,6 +1916,57 @@ function excludeBufferKeys(body) {
1702
1916
  files: Object.fromEntries(fileEntries)
1703
1917
  };
1704
1918
  }
1919
+ if (void 0) {
1920
+ let ensureTestInstance = function() {
1921
+ const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
1922
+ if (!testInstanceState.__equippedTestInstanceAliased) {
1923
+ instance.alias("equipped-test");
1924
+ testInstanceState.__equippedTestInstanceAliased = true;
1925
+ }
1926
+ }, createRawResponse = function() {
1927
+ return {
1928
+ statusCode: 200,
1929
+ headersSent: false,
1930
+ writableEnded: false,
1931
+ setHeader: vi.fn(),
1932
+ end(chunk) {
1933
+ void chunk;
1934
+ this.headersSent = true;
1935
+ this.writableEnded = true;
1936
+ }
1937
+ };
1938
+ };
1939
+ ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
1940
+ const { describe, expect, test, vi } = void 0;
1941
+ const testInstanceState = globalThis;
1942
+ class TestFastifyServer extends FastifyServer {
1943
+ exposeRawResponder(req, res) {
1944
+ return this.createRawResponder(req, res);
1945
+ }
1946
+ }
1947
+ describe("FastifyServer raw responder", () => {
1948
+ test("hijacks the Fastify reply before passing Node raw request and response to the handler", async () => {
1949
+ ensureTestInstance();
1950
+ const server = TestFastifyServer.create({ port: 0, requests: { log: false } });
1951
+ const rawRequest = { marker: "request" };
1952
+ const rawResponse = createRawResponse();
1953
+ const reply = { raw: rawResponse, hijack: vi.fn() };
1954
+ const request = { raw: rawRequest };
1955
+ let received = null;
1956
+ await server.exposeRawResponder(
1957
+ request,
1958
+ reply
1959
+ )(async (req, res) => {
1960
+ received = { request: req, response: res };
1961
+ res.end("ok");
1962
+ });
1963
+ expect(reply.hijack).toHaveBeenCalledOnce();
1964
+ expect(received).toEqual({ request: rawRequest, response: rawResponse });
1965
+ });
1966
+ });
1967
+ }
1968
+ var ensureTestInstance2;
1969
+ var createRawResponse2;
1705
1970
  // Annotate the CommonJS export names for ESM import in node:
1706
1971
  0 && (module.exports = {
1707
1972
  FastifyServer