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.
- package/CHANGELOG.md +7 -0
- package/dist/cjs/server/adapters/express/index.cjs +266 -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 +269 -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 +215 -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-WHIWTP2Z.min.mjs → chunk-4JLDXF7T.min.mjs} +2 -2
- package/dist/esm/{chunk-I4BB436E.mjs → chunk-4MXYZS5R.mjs} +2 -2
- package/dist/esm/{chunk-YTM6ZURZ.min.mjs → chunk-5VW3JAFR.min.mjs} +2 -2
- package/dist/esm/{chunk-YTHRK2PO.mjs → chunk-AKQBDYUO.mjs} +3 -3
- package/dist/esm/{chunk-MYGAF2AC.min.mjs → chunk-B5QQ32YY.min.mjs} +2 -2
- package/dist/esm/chunk-FLAPYQUT.min.mjs +32 -0
- package/dist/esm/chunk-FLAPYQUT.min.mjs.map +1 -0
- package/dist/esm/{chunk-KW3PBDFD.mjs → chunk-JH6EBXY4.mjs} +2 -2
- package/dist/esm/{chunk-2TCFNKRZ.mjs → chunk-MDQKODYQ.mjs} +216 -5
- package/dist/esm/chunk-MDQKODYQ.mjs.map +1 -0
- package/dist/esm/{chunk-ECBJ3NT3.min.mjs → chunk-PCAUXBAG.min.mjs} +2 -2
- package/dist/esm/{chunk-RIRBNBTC.mjs → chunk-PNZNNUMN.mjs} +3 -3
- package/dist/esm/{chunk-TWKHVLLT.mjs → chunk-PQCBVQL6.mjs} +2 -2
- package/dist/esm/{chunk-AUKXL4EA.min.mjs → chunk-QHLKB47N.min.mjs} +2 -2
- package/dist/esm/{chunk-6DW4GW3R.min.mjs → chunk-SGZNOYC3.min.mjs} +2 -2
- package/dist/esm/{chunk-6SB5M4XH.mjs → chunk-TVTYDU2D.mjs} +3 -3
- package/dist/esm/{chunk-IEBC3OWN.mjs → chunk-Z2TZ3KR7.mjs} +2 -2
- package/dist/esm/{chunk-OXI6IKAM.min.mjs → chunk-ZGMFFK6Y.min.mjs} +2 -2
- 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-Y7EXSYPD.mjs → introspection-32BRYKYY.mjs} +3 -3
- package/dist/esm/introspection-A72WMWE3.min.mjs +2 -0
- 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-DVr0fHil.d.ts} +20 -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-JZ2JTENY.js → chunk-3M4PBZAQ.js} +2 -2
- package/dist/types/{chunk-LWUMIHL4.js → chunk-3TKJGSCZ.js} +1 -1
- package/dist/types/{chunk-4LRJJSGG.js → chunk-65EHKCDZ.js} +2 -2
- package/dist/types/{chunk-A2MRYMCA.js → chunk-JQ2FWX4W.js} +1 -1
- package/dist/types/{chunk-H6JBLKX5.js → chunk-NJ2FHI3U.js} +2 -2
- package/dist/types/{chunk-XOU2A2Y6.js → chunk-OHFTQGQG.js} +1 -1
- package/dist/types/{chunk-IAHTILKJ.js → chunk-XGGGAEET.js} +1 -1
- package/dist/types/{chunk-32DMHN3G.js → chunk-YTY3EFNB.js} +215 -4
- 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-VOIU3XE6.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-WHIWTP2Z.min.mjs.map → chunk-4JLDXF7T.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-I4BB436E.mjs.map → chunk-4MXYZS5R.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTM6ZURZ.min.mjs.map → chunk-5VW3JAFR.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-YTHRK2PO.mjs.map → chunk-AKQBDYUO.mjs.map} +0 -0
- /package/dist/esm/{chunk-MYGAF2AC.min.mjs.map → chunk-B5QQ32YY.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-KW3PBDFD.mjs.map → chunk-JH6EBXY4.mjs.map} +0 -0
- /package/dist/esm/{chunk-ECBJ3NT3.min.mjs.map → chunk-PCAUXBAG.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-RIRBNBTC.mjs.map → chunk-PNZNNUMN.mjs.map} +0 -0
- /package/dist/esm/{chunk-TWKHVLLT.mjs.map → chunk-PQCBVQL6.mjs.map} +0 -0
- /package/dist/esm/{chunk-AUKXL4EA.min.mjs.map → chunk-QHLKB47N.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-6DW4GW3R.min.mjs.map → chunk-SGZNOYC3.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-6SB5M4XH.mjs.map → chunk-TVTYDU2D.mjs.map} +0 -0
- /package/dist/esm/{chunk-IEBC3OWN.mjs.map → chunk-Z2TZ3KR7.mjs.map} +0 -0
- /package/dist/esm/{chunk-OXI6IKAM.min.mjs.map → chunk-ZGMFFK6Y.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-GP3G26B6.min.mjs.map → introspection-32BRYKYY.mjs.map} +0 -0
- /package/dist/esm/{introspection-Y7EXSYPD.mjs.map → introspection-A72WMWE3.min.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,8 @@ var Server = class {
|
|
|
1384
1401
|
#serverConfig;
|
|
1385
1402
|
#queue = [];
|
|
1386
1403
|
#routesByKey = /* @__PURE__ */ new Set();
|
|
1404
|
+
#started = false;
|
|
1405
|
+
#notFoundHandler = null;
|
|
1387
1406
|
setup(httpServer, config) {
|
|
1388
1407
|
this.#httpServer = httpServer;
|
|
1389
1408
|
this.#serverConfig = config;
|
|
@@ -1433,10 +1452,16 @@ var Server = class {
|
|
|
1433
1452
|
});
|
|
1434
1453
|
});
|
|
1435
1454
|
}
|
|
1455
|
+
setNotFoundHandler(handler) {
|
|
1456
|
+
if (this.#started) throw new EquippedError("Cannot set not-found handler after server has started", {});
|
|
1457
|
+
this.#notFoundHandler = handler;
|
|
1458
|
+
return this;
|
|
1459
|
+
}
|
|
1436
1460
|
test() {
|
|
1437
1461
|
return (0, import_supertest.default)(this.#httpServer);
|
|
1438
1462
|
}
|
|
1439
1463
|
async start() {
|
|
1464
|
+
this.#started = true;
|
|
1440
1465
|
const config = this.#serverConfig;
|
|
1441
1466
|
const instance = Instance.get();
|
|
1442
1467
|
const { app } = instance.settings;
|
|
@@ -1450,10 +1475,7 @@ var Server = class {
|
|
|
1450
1475
|
})
|
|
1451
1476
|
});
|
|
1452
1477
|
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
|
-
});
|
|
1478
|
+
this.registerNotFoundHandler(async (req, res) => await this.#handleNotFound(req, res));
|
|
1457
1479
|
this.registerErrorHandler(async (error, _, res) => {
|
|
1458
1480
|
if (!(error instanceof EquippedError)) Instance.get().log.error({ error }, "Uncaught error in route handler");
|
|
1459
1481
|
const response = error instanceof RequestError ? new Response({
|
|
@@ -1472,6 +1494,31 @@ var Server = class {
|
|
|
1472
1494
|
if (started) Instance.get().log.info(`${instance.id}(${app.name}) service listening on port ${config.port}`);
|
|
1473
1495
|
return started;
|
|
1474
1496
|
}
|
|
1497
|
+
createNodeRawResponder(input) {
|
|
1498
|
+
return async (handler) => {
|
|
1499
|
+
input.beforeHandle?.();
|
|
1500
|
+
try {
|
|
1501
|
+
await handler(input.request, input.response);
|
|
1502
|
+
} catch (error) {
|
|
1503
|
+
if (!hasRawResponseStarted(input.response)) {
|
|
1504
|
+
writeRawHandlerError(input.response, error);
|
|
1505
|
+
return rawResponseHandled;
|
|
1506
|
+
}
|
|
1507
|
+
throw error;
|
|
1508
|
+
}
|
|
1509
|
+
if (!hasRawResponseStarted(input.response))
|
|
1510
|
+
writeRawHandlerError(input.response, new EquippedError(rawResponseNotStartedMessage, {}));
|
|
1511
|
+
return rawResponseHandled;
|
|
1512
|
+
};
|
|
1513
|
+
}
|
|
1514
|
+
async #handleNotFound(req, res) {
|
|
1515
|
+
const request = await this.parseRequest(req);
|
|
1516
|
+
if (!this.#notFoundHandler) throw new NotFoundError(`Route ${request.path} not found`);
|
|
1517
|
+
const result = await this.#notFoundHandler({ request, respondWithRaw: this.createRawResponder(req, res) });
|
|
1518
|
+
if (isRawResponseHandled(result)) return;
|
|
1519
|
+
if (result instanceof Response) return await this.handleResponse(res, result);
|
|
1520
|
+
throw new EquippedError("Not-found handler must return a Response or respondWithRaw(...)", {});
|
|
1521
|
+
}
|
|
1475
1522
|
#resolveSchema(method, schema) {
|
|
1476
1523
|
const defaultStatusCode = schema?.defaultStatusCode ?? StatusCodes.Ok;
|
|
1477
1524
|
const defaultContentType = schema?.defaultContentType ?? "application/json";
|
|
@@ -1562,6 +1609,170 @@ var Server = class {
|
|
|
1562
1609
|
};
|
|
1563
1610
|
}
|
|
1564
1611
|
};
|
|
1612
|
+
if (void 0) {
|
|
1613
|
+
let ensureTestInstance = function() {
|
|
1614
|
+
const instance = Instance.maybeGet() ?? Instance.create({ app: { name: "equipped-test" }, log: { level: "silent" } });
|
|
1615
|
+
if (!testInstanceState.__equippedTestInstanceAliased) {
|
|
1616
|
+
instance.alias("equipped-test");
|
|
1617
|
+
testInstanceState.__equippedTestInstanceAliased = true;
|
|
1618
|
+
}
|
|
1619
|
+
}, createRawResponse = function() {
|
|
1620
|
+
const chunks = [];
|
|
1621
|
+
return {
|
|
1622
|
+
statusCode: 200,
|
|
1623
|
+
headersSent: false,
|
|
1624
|
+
writableEnded: false,
|
|
1625
|
+
headers: {},
|
|
1626
|
+
setHeader(key, value) {
|
|
1627
|
+
this.headers[key] = value;
|
|
1628
|
+
},
|
|
1629
|
+
end(chunk) {
|
|
1630
|
+
if (chunk !== void 0) chunks.push(Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk));
|
|
1631
|
+
this.headersSent = true;
|
|
1632
|
+
this.writableEnded = true;
|
|
1633
|
+
},
|
|
1634
|
+
body() {
|
|
1635
|
+
return chunks.join("");
|
|
1636
|
+
}
|
|
1637
|
+
};
|
|
1638
|
+
};
|
|
1639
|
+
ensureTestInstance2 = ensureTestInstance, createRawResponse2 = createRawResponse;
|
|
1640
|
+
const { describe, expect, test } = void 0;
|
|
1641
|
+
const testInstanceState = globalThis;
|
|
1642
|
+
class TestServer extends Server {
|
|
1643
|
+
handledResponse = null;
|
|
1644
|
+
notFoundHandler = null;
|
|
1645
|
+
constructor() {
|
|
1646
|
+
super();
|
|
1647
|
+
this.setup(http.createServer(), {
|
|
1648
|
+
port: 0,
|
|
1649
|
+
cors: void 0,
|
|
1650
|
+
eventBus: void 0,
|
|
1651
|
+
publicPath: void 0,
|
|
1652
|
+
healthPath: void 0,
|
|
1653
|
+
openapi: { docsVersion: "1.0.0", docsBaseUrl: ["/"], docsPath: "/__docs" },
|
|
1654
|
+
requests: {
|
|
1655
|
+
log: false,
|
|
1656
|
+
rateLimit: { enabled: false, periodInMs: 1, limit: 1 },
|
|
1657
|
+
slowdown: { enabled: false, periodInMs: 1, delayAfter: 1, delayInMs: 1 }
|
|
1658
|
+
},
|
|
1659
|
+
socketsAuthMethods: []
|
|
1660
|
+
});
|
|
1661
|
+
}
|
|
1662
|
+
async parseRequest(req) {
|
|
1663
|
+
return new Request2({
|
|
1664
|
+
ip: "127.0.0.1",
|
|
1665
|
+
body: {},
|
|
1666
|
+
cookies: {},
|
|
1667
|
+
params: {},
|
|
1668
|
+
query: {},
|
|
1669
|
+
method: Methods.get,
|
|
1670
|
+
path: req.path,
|
|
1671
|
+
headers: {},
|
|
1672
|
+
files: {}
|
|
1673
|
+
});
|
|
1674
|
+
}
|
|
1675
|
+
async handleResponse(_, response) {
|
|
1676
|
+
this.handledResponse = response;
|
|
1677
|
+
}
|
|
1678
|
+
createRawResponder(req, res) {
|
|
1679
|
+
return this.createNodeRawResponder({ request: req.rawRequest, response: res.rawResponse });
|
|
1680
|
+
}
|
|
1681
|
+
registerRoute() {
|
|
1682
|
+
}
|
|
1683
|
+
registerErrorHandler() {
|
|
1684
|
+
}
|
|
1685
|
+
registerNotFoundHandler(cb) {
|
|
1686
|
+
this.notFoundHandler = cb;
|
|
1687
|
+
}
|
|
1688
|
+
async startServer() {
|
|
1689
|
+
return true;
|
|
1690
|
+
}
|
|
1691
|
+
async dispatchNotFound(path) {
|
|
1692
|
+
if (!this.notFoundHandler) throw new Error("not-found handler was not registered");
|
|
1693
|
+
this.handledResponse = null;
|
|
1694
|
+
const rawResponse = createRawResponse();
|
|
1695
|
+
await this.notFoundHandler({ path, rawRequest: {} }, { rawResponse });
|
|
1696
|
+
return { handledResponse: this.handledResponse, rawResponse };
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
describe("Server not-found handler", () => {
|
|
1700
|
+
test("throws the default Equipped not-found error when no custom handler is set", async () => {
|
|
1701
|
+
ensureTestInstance();
|
|
1702
|
+
const server = new TestServer();
|
|
1703
|
+
await server.start();
|
|
1704
|
+
await expect(server.dispatchNotFound("/missing")).rejects.toBeInstanceOf(NotFoundError);
|
|
1705
|
+
});
|
|
1706
|
+
test("allows a custom not-found handler to return an Equipped response", async () => {
|
|
1707
|
+
ensureTestInstance();
|
|
1708
|
+
const server = new TestServer();
|
|
1709
|
+
server.setNotFoundHandler(
|
|
1710
|
+
({ request }) => new Response({
|
|
1711
|
+
body: [{ message: `No route for ${request.path}` }],
|
|
1712
|
+
status: StatusCodes.NotFound,
|
|
1713
|
+
headers: {},
|
|
1714
|
+
cookies: {},
|
|
1715
|
+
contentType: "application/json"
|
|
1716
|
+
})
|
|
1717
|
+
);
|
|
1718
|
+
await server.start();
|
|
1719
|
+
const result = await server.dispatchNotFound("/custom");
|
|
1720
|
+
expect(result.handledResponse?.status).toBe(StatusCodes.NotFound);
|
|
1721
|
+
expect(result.handledResponse?.body).toEqual([{ message: "No route for /custom" }]);
|
|
1722
|
+
});
|
|
1723
|
+
test("allows a custom not-found handler to complete the response through a raw Node listener", async () => {
|
|
1724
|
+
ensureTestInstance();
|
|
1725
|
+
const server = new TestServer();
|
|
1726
|
+
server.setNotFoundHandler(
|
|
1727
|
+
({ respondWithRaw }) => respondWithRaw((_, response) => {
|
|
1728
|
+
response.statusCode = 203;
|
|
1729
|
+
response.end("raw fallback");
|
|
1730
|
+
})
|
|
1731
|
+
);
|
|
1732
|
+
await server.start();
|
|
1733
|
+
const result = await server.dispatchNotFound("/page");
|
|
1734
|
+
expect(result.handledResponse).toBeNull();
|
|
1735
|
+
expect(result.rawResponse.statusCode).toBe(203);
|
|
1736
|
+
expect(result.rawResponse.body()).toBe("raw fallback");
|
|
1737
|
+
});
|
|
1738
|
+
test("writes a clear raw error when a raw not-found handler does not start a response", async () => {
|
|
1739
|
+
ensureTestInstance();
|
|
1740
|
+
const server = new TestServer();
|
|
1741
|
+
server.setNotFoundHandler(({ respondWithRaw }) => respondWithRaw(() => {
|
|
1742
|
+
}));
|
|
1743
|
+
await server.start();
|
|
1744
|
+
const result = await server.dispatchNotFound("/page");
|
|
1745
|
+
expect(result.handledResponse).toBeNull();
|
|
1746
|
+
expect(result.rawResponse.statusCode).toBe(StatusCodes.BadRequest);
|
|
1747
|
+
expect(result.rawResponse.body()).toContain(rawResponseNotStartedMessage);
|
|
1748
|
+
});
|
|
1749
|
+
test("rejects a custom not-found handler result that is neither an Equipped response nor raw completion", async () => {
|
|
1750
|
+
ensureTestInstance();
|
|
1751
|
+
const server = new TestServer();
|
|
1752
|
+
server.setNotFoundHandler((() => void 0));
|
|
1753
|
+
await server.start();
|
|
1754
|
+
await expect(server.dispatchNotFound("/bad")).rejects.toThrow("Not-found handler must return a Response or respondWithRaw(...)");
|
|
1755
|
+
});
|
|
1756
|
+
test("rejects setting the custom not-found handler after server startup", async () => {
|
|
1757
|
+
ensureTestInstance();
|
|
1758
|
+
const server = new TestServer();
|
|
1759
|
+
await server.start();
|
|
1760
|
+
expect(
|
|
1761
|
+
() => server.setNotFoundHandler(
|
|
1762
|
+
() => new Response({
|
|
1763
|
+
body: null,
|
|
1764
|
+
status: StatusCodes.NotFound,
|
|
1765
|
+
headers: {},
|
|
1766
|
+
cookies: {},
|
|
1767
|
+
contentType: "application/json"
|
|
1768
|
+
})
|
|
1769
|
+
)
|
|
1770
|
+
).toThrow("Cannot set not-found handler after server has started");
|
|
1771
|
+
});
|
|
1772
|
+
});
|
|
1773
|
+
}
|
|
1774
|
+
var ensureTestInstance2;
|
|
1775
|
+
var createRawResponse2;
|
|
1565
1776
|
|
|
1566
1777
|
// src/server/middlewares/requireAuthUser.ts
|
|
1567
1778
|
var requireAuthUser = (methods) => makeMiddleware(
|