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
|
@@ -51,6 +51,7 @@ __export(server_exports, {
|
|
|
51
51
|
module.exports = __toCommonJS(server_exports);
|
|
52
52
|
|
|
53
53
|
// src/server/adapters/base.ts
|
|
54
|
+
var import_node_http = require("http");
|
|
54
55
|
var import_cors = require("@fastify/cors");
|
|
55
56
|
var import_cors2 = require("cors");
|
|
56
57
|
var import_socket = require("socket.io");
|
|
@@ -1368,6 +1369,22 @@ var serverConfigPipe = () => import_valleyed7.v.object({
|
|
|
1368
1369
|
),
|
|
1369
1370
|
socketsAuthMethods: import_valleyed7.v.defaults(import_valleyed7.v.array(import_valleyed7.v.instanceOf(BaseRequestAuthMethod)), [])
|
|
1370
1371
|
});
|
|
1372
|
+
var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
|
|
1373
|
+
var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
|
|
1374
|
+
var rawResponseNotStartedMessage = "Raw not-found handler did not start or complete a response";
|
|
1375
|
+
function isRawResponseHandled(input) {
|
|
1376
|
+
return Boolean(input && typeof input === "object" && rawResponseHandledSymbol in input);
|
|
1377
|
+
}
|
|
1378
|
+
function hasRawResponseStarted(response) {
|
|
1379
|
+
return response.headersSent || response.writableEnded;
|
|
1380
|
+
}
|
|
1381
|
+
function writeRawHandlerError(response, error) {
|
|
1382
|
+
if (hasRawResponseStarted(response)) return;
|
|
1383
|
+
response.statusCode = StatusCodes.BadRequest;
|
|
1384
|
+
response.setHeader("Content-Type", "application/json");
|
|
1385
|
+
const message = error instanceof Error ? error.message : `${error}`;
|
|
1386
|
+
response.end(JSON.stringify([{ message }]));
|
|
1387
|
+
}
|
|
1371
1388
|
var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
|
|
1372
1389
|
status: value,
|
|
1373
1390
|
contentType: "application/json",
|
|
@@ -1384,6 +1401,9 @@ var Server = class {
|
|
|
1384
1401
|
#serverConfig;
|
|
1385
1402
|
#queue = [];
|
|
1386
1403
|
#routesByKey = /* @__PURE__ */ new Set();
|
|
1404
|
+
#started = false;
|
|
1405
|
+
#beforeListenHandlers = [];
|
|
1406
|
+
#notFoundHandler = null;
|
|
1387
1407
|
setup(httpServer, config) {
|
|
1388
1408
|
this.#httpServer = httpServer;
|
|
1389
1409
|
this.#serverConfig = config;
|
|
@@ -1433,10 +1453,21 @@ var Server = class {
|
|
|
1433
1453
|
});
|
|
1434
1454
|
});
|
|
1435
1455
|
}
|
|
1456
|
+
setNotFoundHandler(handler) {
|
|
1457
|
+
if (this.#started) throw new EquippedError("Cannot set not-found handler after server has started", {});
|
|
1458
|
+
this.#notFoundHandler = handler;
|
|
1459
|
+
return this;
|
|
1460
|
+
}
|
|
1461
|
+
onBeforeListen(handler) {
|
|
1462
|
+
if (this.#started) throw new EquippedError("Cannot add before-listen handler after server has started", {});
|
|
1463
|
+
this.#beforeListenHandlers.push(handler);
|
|
1464
|
+
return this;
|
|
1465
|
+
}
|
|
1436
1466
|
test() {
|
|
1437
1467
|
return (0, import_supertest.default)(this.#httpServer);
|
|
1438
1468
|
}
|
|
1439
1469
|
async start() {
|
|
1470
|
+
this.#started = true;
|
|
1440
1471
|
const config = this.#serverConfig;
|
|
1441
1472
|
const instance = Instance.get();
|
|
1442
1473
|
const { app } = instance.settings;
|
|
@@ -1450,10 +1481,7 @@ var Server = class {
|
|
|
1450
1481
|
})
|
|
1451
1482
|
});
|
|
1452
1483
|
await Promise.all(this.#queue.map((cb) => cb()));
|
|
1453
|
-
this.registerNotFoundHandler(async (req) =>
|
|
1454
|
-
const request = await this.parseRequest(req);
|
|
1455
|
-
throw new NotFoundError(`Route ${request.path} not found`);
|
|
1456
|
-
});
|
|
1484
|
+
this.registerNotFoundHandler(async (req, res) => await this.#handleNotFound(req, res));
|
|
1457
1485
|
this.registerErrorHandler(async (error, _, res) => {
|
|
1458
1486
|
if (!(error instanceof EquippedError)) Instance.get().log.error({ error }, "Uncaught error in route handler");
|
|
1459
1487
|
const response = error instanceof RequestError ? new Response({
|
|
@@ -1468,10 +1496,36 @@ var Server = class {
|
|
|
1468
1496
|
});
|
|
1469
1497
|
return await this.handleResponse(res, response);
|
|
1470
1498
|
});
|
|
1499
|
+
for (const handler of this.#beforeListenHandlers) await handler({ httpServer: this.#httpServer, port: config.port });
|
|
1471
1500
|
const started = await this.startServer(config.port);
|
|
1472
1501
|
if (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`);
|
|
1473
1502
|
return started;
|
|
1474
1503
|
}
|
|
1504
|
+
createNodeRawResponder(input) {
|
|
1505
|
+
return async (handler) => {
|
|
1506
|
+
input.beforeHandle?.();
|
|
1507
|
+
try {
|
|
1508
|
+
await handler(input.request, input.response);
|
|
1509
|
+
} catch (error) {
|
|
1510
|
+
if (!hasRawResponseStarted(input.response)) {
|
|
1511
|
+
writeRawHandlerError(input.response, error);
|
|
1512
|
+
return rawResponseHandled;
|
|
1513
|
+
}
|
|
1514
|
+
throw error;
|
|
1515
|
+
}
|
|
1516
|
+
if (!hasRawResponseStarted(input.response))
|
|
1517
|
+
writeRawHandlerError(input.response, new EquippedError(rawResponseNotStartedMessage, {}));
|
|
1518
|
+
return rawResponseHandled;
|
|
1519
|
+
};
|
|
1520
|
+
}
|
|
1521
|
+
async #handleNotFound(req, res) {
|
|
1522
|
+
const request = await this.parseRequest(req);
|
|
1523
|
+
if (!this.#notFoundHandler) throw new NotFoundError(`Route ${request.path} not found`);
|
|
1524
|
+
const result = await this.#notFoundHandler({ request, respondWithRaw: this.createRawResponder(req, res) });
|
|
1525
|
+
if (isRawResponseHandled(result)) return;
|
|
1526
|
+
if (result instanceof Response) return await this.handleResponse(res, result);
|
|
1527
|
+
throw new EquippedError("Not-found handler must return a Response or respondWithRaw(...)", {});
|
|
1528
|
+
}
|
|
1475
1529
|
#resolveSchema(method, schema) {
|
|
1476
1530
|
const defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok;
|
|
1477
1531
|
const defaultContentType = schema?.defaultContentType ?? "application/json";
|
|
@@ -1562,6 +1616,209 @@ var Server = class {
|
|
|
1562
1616
|
};
|
|
1563
1617
|
}
|
|
1564
1618
|
};
|
|
1619
|
+
if (void 0) {
|
|
1620
|
+
let ensureTestInstance = function() {
|
|
1621
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
1622
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
1623
|
+
instance.alias("equipped-test");
|
|
1624
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
1625
|
+
}
|
|
1626
|
+
}, createRawResponse = function() {
|
|
1627
|
+
const chunks = [];
|
|
1628
|
+
return {
|
|
1629
|
+
statusCode: 200,
|
|
1630
|
+
headersSent: false,
|
|
1631
|
+
writableEnded: false,
|
|
1632
|
+
headers: {},
|
|
1633
|
+
setHeader(key, value) {
|
|
1634
|
+
this.headers[key] = value;
|
|
1635
|
+
},
|
|
1636
|
+
end(chunk) {
|
|
1637
|
+
if (chunk !== void 0) chunks.push(Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk));
|
|
1638
|
+
this.headersSent = true;
|
|
1639
|
+
this.writableEnded = true;
|
|
1640
|
+
},
|
|
1641
|
+
body() {
|
|
1642
|
+
return chunks.join("");
|
|
1643
|
+
}
|
|
1644
|
+
};
|
|
1645
|
+
};
|
|
1646
|
+
ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
|
|
1647
|
+
const { describe, expect, test } = void 0;
|
|
1648
|
+
const testInstanceState = globalThis;
|
|
1649
|
+
class TestServer extends Server {
|
|
1650
|
+
handledResponse = null;
|
|
1651
|
+
startedPorts = [];
|
|
1652
|
+
notFoundHandler = null;
|
|
1653
|
+
constructor() {
|
|
1654
|
+
super();
|
|
1655
|
+
this.setup(http.createServer(), {
|
|
1656
|
+
port: 0,
|
|
1657
|
+
cors: void 0,
|
|
1658
|
+
eventBus: void 0,
|
|
1659
|
+
publicPath: void 0,
|
|
1660
|
+
healthPath: void 0,
|
|
1661
|
+
openapi: { docsVersion: "1.0.0", docsBaseUrl: ["/"], docsPath: "/__docs" },
|
|
1662
|
+
requests: {
|
|
1663
|
+
log: false,
|
|
1664
|
+
rateLimit: { enabled: false, periodInMs: 1, limit: 1 },
|
|
1665
|
+
slowdown: { enabled: false, periodInMs: 1, delayAfter: 1, delayInMs: 1 }
|
|
1666
|
+
},
|
|
1667
|
+
socketsAuthMethods: []
|
|
1668
|
+
});
|
|
1669
|
+
}
|
|
1670
|
+
async parseRequest(req) {
|
|
1671
|
+
return new Request2({
|
|
1672
|
+
ip: "127.0.0.1",
|
|
1673
|
+
body: {},
|
|
1674
|
+
cookies: {},
|
|
1675
|
+
params: {},
|
|
1676
|
+
query: {},
|
|
1677
|
+
method: Methods.get,
|
|
1678
|
+
path: req.path,
|
|
1679
|
+
headers: {},
|
|
1680
|
+
files: {}
|
|
1681
|
+
});
|
|
1682
|
+
}
|
|
1683
|
+
async handleResponse(_, response) {
|
|
1684
|
+
this.handledResponse = response;
|
|
1685
|
+
}
|
|
1686
|
+
createRawResponder(req, res) {
|
|
1687
|
+
return this.createNodeRawResponder({ request: req.rawRequest, response: res.rawResponse });
|
|
1688
|
+
}
|
|
1689
|
+
registerRoute() {
|
|
1690
|
+
}
|
|
1691
|
+
registerErrorHandler() {
|
|
1692
|
+
}
|
|
1693
|
+
registerNotFoundHandler(cb) {
|
|
1694
|
+
this.notFoundHandler = cb;
|
|
1695
|
+
}
|
|
1696
|
+
async startServer(port) {
|
|
1697
|
+
this.startedPorts.push(port);
|
|
1698
|
+
return true;
|
|
1699
|
+
}
|
|
1700
|
+
async dispatchNotFound(path) {
|
|
1701
|
+
if (!this.notFoundHandler) throw new Error("not-found handler was not registered");
|
|
1702
|
+
this.handledResponse = null;
|
|
1703
|
+
const rawResponse = createRawResponse();
|
|
1704
|
+
await this.notFoundHandler({ path, rawRequest: {} }, { rawResponse });
|
|
1705
|
+
return { handledResponse: this.handledResponse, rawResponse };
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
describe("Server before-listen handlers", () => {
|
|
1709
|
+
test("runs before-listen handlers before adapter listen in registration order", async () => {
|
|
1710
|
+
ensureTestInstance();
|
|
1711
|
+
const server = new TestServer();
|
|
1712
|
+
const calls = [];
|
|
1713
|
+
let receivedServer = null;
|
|
1714
|
+
server.onBeforeListen(({ httpServer, port }) => {
|
|
1715
|
+
calls.push(`first:${port}`);
|
|
1716
|
+
receivedServer = httpServer;
|
|
1717
|
+
expect(server.startedPorts).toEqual([]);
|
|
1718
|
+
}).onBeforeListen(({ httpServer, port }) => {
|
|
1719
|
+
calls.push(`second:${port}`);
|
|
1720
|
+
expect(httpServer).toBe(receivedServer);
|
|
1721
|
+
expect(server.startedPorts).toEqual([]);
|
|
1722
|
+
});
|
|
1723
|
+
await server.start();
|
|
1724
|
+
expect(calls).toEqual(["first:0", "second:0"]);
|
|
1725
|
+
expect(receivedServer).toBeInstanceOf(http.Server);
|
|
1726
|
+
expect(server.startedPorts).toEqual([0]);
|
|
1727
|
+
});
|
|
1728
|
+
test("rejects startup when a before-listen handler fails before adapter listen", async () => {
|
|
1729
|
+
ensureTestInstance();
|
|
1730
|
+
const server = new TestServer();
|
|
1731
|
+
server.onBeforeListen(async () => {
|
|
1732
|
+
throw new Error("before-listen failed");
|
|
1733
|
+
});
|
|
1734
|
+
await expect(server.start()).rejects.toThrow("before-listen failed");
|
|
1735
|
+
expect(server.startedPorts).toEqual([]);
|
|
1736
|
+
});
|
|
1737
|
+
test("rejects adding before-listen handlers after server startup", async () => {
|
|
1738
|
+
ensureTestInstance();
|
|
1739
|
+
const server = new TestServer();
|
|
1740
|
+
await server.start();
|
|
1741
|
+
expect(() => server.onBeforeListen(() => {
|
|
1742
|
+
})).toThrow("Cannot add before-listen handler after server has started");
|
|
1743
|
+
});
|
|
1744
|
+
});
|
|
1745
|
+
describe("Server not-found handler", () => {
|
|
1746
|
+
test("throws the default Equipped not-found error when no custom handler is set", async () => {
|
|
1747
|
+
ensureTestInstance();
|
|
1748
|
+
const server = new TestServer();
|
|
1749
|
+
await server.start();
|
|
1750
|
+
await expect(server.dispatchNotFound("/missing")).rejects.toBeInstanceOf(NotFoundError);
|
|
1751
|
+
});
|
|
1752
|
+
test("allows a custom not-found handler to return an Equipped response", async () => {
|
|
1753
|
+
ensureTestInstance();
|
|
1754
|
+
const server = new TestServer();
|
|
1755
|
+
server.setNotFoundHandler(
|
|
1756
|
+
({ request }) => new Response({
|
|
1757
|
+
body: [{ message: `No route for ${request.path}` }],
|
|
1758
|
+
status: StatusCodes.NotFound,
|
|
1759
|
+
headers: {},
|
|
1760
|
+
cookies: {},
|
|
1761
|
+
contentType: "application/json"
|
|
1762
|
+
})
|
|
1763
|
+
);
|
|
1764
|
+
await server.start();
|
|
1765
|
+
const result = await server.dispatchNotFound("/custom");
|
|
1766
|
+
expect(result.handledResponse?.status).toBe(StatusCodes.NotFound);
|
|
1767
|
+
expect(result.handledResponse?.body).toEqual([{ message: "No route for /custom" }]);
|
|
1768
|
+
});
|
|
1769
|
+
test("allows a custom not-found handler to complete the response through a raw Node listener", async () => {
|
|
1770
|
+
ensureTestInstance();
|
|
1771
|
+
const server = new TestServer();
|
|
1772
|
+
server.setNotFoundHandler(
|
|
1773
|
+
({ respondWithRaw }) => respondWithRaw((_, response) => {
|
|
1774
|
+
response.statusCode = 203;
|
|
1775
|
+
response.end("raw fallback");
|
|
1776
|
+
})
|
|
1777
|
+
);
|
|
1778
|
+
await server.start();
|
|
1779
|
+
const result = await server.dispatchNotFound("/page");
|
|
1780
|
+
expect(result.handledResponse).toBeNull();
|
|
1781
|
+
expect(result.rawResponse.statusCode).toBe(203);
|
|
1782
|
+
expect(result.rawResponse.body()).toBe("raw fallback");
|
|
1783
|
+
});
|
|
1784
|
+
test("writes a clear raw error when a raw not-found handler does not start a response", async () => {
|
|
1785
|
+
ensureTestInstance();
|
|
1786
|
+
const server = new TestServer();
|
|
1787
|
+
server.setNotFoundHandler(({ respondWithRaw }) => respondWithRaw(() => {
|
|
1788
|
+
}));
|
|
1789
|
+
await server.start();
|
|
1790
|
+
const result = await server.dispatchNotFound("/page");
|
|
1791
|
+
expect(result.handledResponse).toBeNull();
|
|
1792
|
+
expect(result.rawResponse.statusCode).toBe(StatusCodes.BadRequest);
|
|
1793
|
+
expect(result.rawResponse.body()).toContain(rawResponseNotStartedMessage);
|
|
1794
|
+
});
|
|
1795
|
+
test("rejects a custom not-found handler result that is neither an Equipped response nor raw completion", async () => {
|
|
1796
|
+
ensureTestInstance();
|
|
1797
|
+
const server = new TestServer();
|
|
1798
|
+
server.setNotFoundHandler((() => void 0));
|
|
1799
|
+
await server.start();
|
|
1800
|
+
await expect(server.dispatchNotFound("/bad")).rejects.toThrow("Not-found handler must return a Response or respondWithRaw(...)");
|
|
1801
|
+
});
|
|
1802
|
+
test("rejects setting the custom not-found handler after server startup", async () => {
|
|
1803
|
+
ensureTestInstance();
|
|
1804
|
+
const server = new TestServer();
|
|
1805
|
+
await server.start();
|
|
1806
|
+
expect(
|
|
1807
|
+
() => server.setNotFoundHandler(
|
|
1808
|
+
() => new Response({
|
|
1809
|
+
body: null,
|
|
1810
|
+
status: StatusCodes.NotFound,
|
|
1811
|
+
headers: {},
|
|
1812
|
+
cookies: {},
|
|
1813
|
+
contentType: "application/json"
|
|
1814
|
+
})
|
|
1815
|
+
)
|
|
1816
|
+
).toThrow("Cannot set not-found handler after server has started");
|
|
1817
|
+
});
|
|
1818
|
+
});
|
|
1819
|
+
}
|
|
1820
|
+
var ensureTestInstance2;
|
|
1821
|
+
var createRawResponse2;
|
|
1565
1822
|
|
|
1566
1823
|
// src/server/middlewares/requireAuthUser.ts
|
|
1567
1824
|
var requireAuthUser = (methods) => makeMiddleware(
|