@antelopejs/api 0.2.0 → 1.1.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/dist/dev-registry.d.ts +6 -0
- package/dist/dev-registry.js +43 -0
- package/dist/dev-registry.js.map +1 -0
- package/dist/implementations/api/index.d.ts +21 -0
- package/dist/implementations/api/index.js +79 -0
- package/dist/implementations/api/index.js.map +1 -0
- package/dist/index.d.ts +9 -22
- package/dist/index.js +63 -33
- package/dist/index.js.map +1 -1
- package/dist/middlewares/cors.d.ts +3 -3
- package/dist/middlewares/cors.js +73 -37
- package/dist/middlewares/cors.js.map +1 -1
- package/dist/port-binding.d.ts +4 -0
- package/dist/port-binding.js +79 -0
- package/dist/port-binding.js.map +1 -0
- package/dist/server-config.d.ts +27 -0
- package/dist/server-config.js +18 -0
- package/dist/server-config.js.map +1 -0
- package/dist/server-factory.d.ts +3 -0
- package/dist/server-factory.js +61 -0
- package/dist/server-factory.js.map +1 -0
- package/dist/server.d.ts +8 -7
- package/dist/server.js +229 -108
- package/dist/server.js.map +1 -1
- package/dist/test/antelope.test.d.ts +2 -0
- package/dist/test/antelope.test.js +25 -0
- package/dist/test/antelope.test.js.map +1 -0
- package/dist/test/cors.test.d.ts +1 -0
- package/dist/test/cors.test.js +118 -0
- package/dist/test/cors.test.js.map +1 -0
- package/dist/test/listen.test.d.ts +1 -0
- package/dist/test/listen.test.js +225 -0
- package/dist/test/listen.test.js.map +1 -0
- package/package.json +21 -37
- package/dist/implementations/api/beta.d.ts +0 -21
- package/dist/implementations/api/beta.js +0 -54
- package/dist/implementations/api/beta.js.map +0 -1
- package/dist/interfaces/api/beta/index.d.ts +0 -116
- package/dist/interfaces/api/beta/index.js +0 -305
- package/dist/interfaces/api/beta/index.js.map +0 -1
- package/dist/interfaces/api-util/dev.d.ts +0 -2
- package/dist/interfaces/api-util/dev.js +0 -20
- package/dist/interfaces/api-util/dev.js.map +0 -1
- package/dist/test/interface/api.d.ts +0 -69
- package/dist/test/interface/api.js +0 -739
- package/dist/test/interface/api.js.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const config_1 = require("@antelopejs/interface-core/config");
|
|
4
|
+
exports.default = (0, config_1.defineConfig)({
|
|
5
|
+
name: "api-test",
|
|
6
|
+
cacheFolder: ".antelope/cache",
|
|
7
|
+
modules: {
|
|
8
|
+
local: {
|
|
9
|
+
source: { type: "local", path: "." },
|
|
10
|
+
config: {
|
|
11
|
+
servers: [
|
|
12
|
+
{
|
|
13
|
+
protocol: "http",
|
|
14
|
+
host: "127.0.0.1",
|
|
15
|
+
port: 5010,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
test: {
|
|
22
|
+
folder: "dist/test",
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=antelope.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antelope.test.js","sourceRoot":"","sources":["../../src/test/antelope.test.ts"],"names":[],"mappings":";;AAAA,8DAAiE;AAEjE,kBAAe,IAAA,qBAAY,EAAC;IAC1B,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE;QACP,KAAK,EAAE;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE;YACpC,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP;wBACE,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,IAAI;qBACX;iBACF;aACF;SACF;KACF;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,WAAW;KACpB;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
7
|
+
const interface_api_1 = require("@antelopejs/interface-api");
|
|
8
|
+
const api_1 = require("../implementations/api");
|
|
9
|
+
const index_1 = require("../index");
|
|
10
|
+
const cors_1 = require("../middlewares/cors");
|
|
11
|
+
const ALLOWED_ORIGIN = "https://example.com";
|
|
12
|
+
const DISALLOWED_ORIGIN = "https://evil.com";
|
|
13
|
+
const REQUESTED_HEADERS = "x-custom";
|
|
14
|
+
const PREFLIGHT_STATUS = 204;
|
|
15
|
+
const corsController = new cors_1.Cors();
|
|
16
|
+
function buildContext(method, headers) {
|
|
17
|
+
return {
|
|
18
|
+
rawRequest: { method, headers },
|
|
19
|
+
response: new interface_api_1.HTTPResult(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function preflightHeaders(headers) {
|
|
23
|
+
const result = corsController.cors(buildContext("OPTIONS", headers));
|
|
24
|
+
node_assert_1.default.ok(result instanceof interface_api_1.HTTPResult);
|
|
25
|
+
return result.getHeaders();
|
|
26
|
+
}
|
|
27
|
+
describe("CORS", () => {
|
|
28
|
+
let originalConfig;
|
|
29
|
+
before(() => {
|
|
30
|
+
originalConfig = (0, index_1.getConfig)();
|
|
31
|
+
});
|
|
32
|
+
after(() => {
|
|
33
|
+
(0, index_1.configure)(originalConfig);
|
|
34
|
+
});
|
|
35
|
+
it("round-trips the configuration through the contract functions", () => {
|
|
36
|
+
(0, api_1.SetCorsConfig)({ allowedOrigins: ALLOWED_ORIGIN, credentials: false });
|
|
37
|
+
node_assert_1.default.deepEqual((0, api_1.GetCorsConfig)(), {
|
|
38
|
+
allowedOrigins: ALLOWED_ORIGIN,
|
|
39
|
+
credentials: false,
|
|
40
|
+
});
|
|
41
|
+
node_assert_1.default.deepEqual((0, index_1.getConfig)().cors, {
|
|
42
|
+
allowedOrigins: ALLOWED_ORIGIN,
|
|
43
|
+
credentials: false,
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it("returns an empty configuration when CORS is unset", () => {
|
|
47
|
+
(0, index_1.configure)({ servers: [] });
|
|
48
|
+
node_assert_1.default.deepEqual((0, api_1.GetCorsConfig)(), {});
|
|
49
|
+
});
|
|
50
|
+
it("skips handling when no configuration is set", () => {
|
|
51
|
+
(0, index_1.configure)({ servers: [] });
|
|
52
|
+
const context = buildContext("GET", { origin: ALLOWED_ORIGIN });
|
|
53
|
+
const result = corsController.cors(context);
|
|
54
|
+
node_assert_1.default.equal(result, undefined);
|
|
55
|
+
node_assert_1.default.deepEqual(context.response.getHeaders(), {});
|
|
56
|
+
});
|
|
57
|
+
it("adds standard headers for an allowed origin", () => {
|
|
58
|
+
(0, index_1.setCorsConfig)({ allowedOrigins: ALLOWED_ORIGIN });
|
|
59
|
+
const context = buildContext("GET", { origin: ALLOWED_ORIGIN });
|
|
60
|
+
const result = corsController.cors(context);
|
|
61
|
+
const headers = context.response.getHeaders();
|
|
62
|
+
node_assert_1.default.equal(result, undefined);
|
|
63
|
+
node_assert_1.default.equal(headers["Access-Control-Allow-Origin"], ALLOWED_ORIGIN);
|
|
64
|
+
node_assert_1.default.equal(headers["Access-Control-Allow-Credentials"], "true");
|
|
65
|
+
});
|
|
66
|
+
it("reports a disallowed origin as false", () => {
|
|
67
|
+
(0, index_1.setCorsConfig)({ allowedOrigins: ALLOWED_ORIGIN });
|
|
68
|
+
const context = buildContext("GET", { origin: DISALLOWED_ORIGIN });
|
|
69
|
+
corsController.cors(context);
|
|
70
|
+
node_assert_1.default.equal(context.response.getHeaders()["Access-Control-Allow-Origin"], "false");
|
|
71
|
+
});
|
|
72
|
+
it("omits the credentials header when credentials are disabled", () => {
|
|
73
|
+
(0, index_1.setCorsConfig)({ allowedOrigins: ALLOWED_ORIGIN, credentials: false });
|
|
74
|
+
const context = buildContext("GET", { origin: ALLOWED_ORIGIN });
|
|
75
|
+
corsController.cors(context);
|
|
76
|
+
node_assert_1.default.equal(context.response.getHeaders()["Access-Control-Allow-Credentials"], undefined);
|
|
77
|
+
});
|
|
78
|
+
it("emits preflight headers with configured methods and max-age", () => {
|
|
79
|
+
(0, index_1.setCorsConfig)({
|
|
80
|
+
allowedOrigins: ALLOWED_ORIGIN,
|
|
81
|
+
allowedMethods: ["GET", "POST"],
|
|
82
|
+
maxAge: 600,
|
|
83
|
+
});
|
|
84
|
+
const result = corsController.cors(buildContext("OPTIONS", { origin: ALLOWED_ORIGIN }));
|
|
85
|
+
node_assert_1.default.ok(result instanceof interface_api_1.HTTPResult);
|
|
86
|
+
node_assert_1.default.equal(result.getStatus(), PREFLIGHT_STATUS);
|
|
87
|
+
const headers = result.getHeaders();
|
|
88
|
+
node_assert_1.default.equal(headers["Access-Control-Allow-Methods"], "GET,POST");
|
|
89
|
+
node_assert_1.default.equal(headers["Access-Control-Max-Age"], "600");
|
|
90
|
+
});
|
|
91
|
+
it("reflects the requested headers when none are configured", () => {
|
|
92
|
+
(0, index_1.setCorsConfig)({ allowedOrigins: ALLOWED_ORIGIN });
|
|
93
|
+
const headers = preflightHeaders({
|
|
94
|
+
origin: ALLOWED_ORIGIN,
|
|
95
|
+
"access-control-request-headers": REQUESTED_HEADERS,
|
|
96
|
+
});
|
|
97
|
+
node_assert_1.default.equal(headers["Access-Control-Allow-Headers"], REQUESTED_HEADERS);
|
|
98
|
+
node_assert_1.default.equal(headers.Vary, "Access-Control-Request-Headers");
|
|
99
|
+
});
|
|
100
|
+
it("uses the configured allowed headers over the requested ones", () => {
|
|
101
|
+
(0, index_1.setCorsConfig)({
|
|
102
|
+
allowedOrigins: ALLOWED_ORIGIN,
|
|
103
|
+
allowedHeaders: ["X-A", "X-B"],
|
|
104
|
+
});
|
|
105
|
+
const headers = preflightHeaders({
|
|
106
|
+
origin: ALLOWED_ORIGIN,
|
|
107
|
+
"access-control-request-headers": REQUESTED_HEADERS,
|
|
108
|
+
});
|
|
109
|
+
node_assert_1.default.equal(headers["Access-Control-Allow-Headers"], "X-A,X-B");
|
|
110
|
+
node_assert_1.default.equal(headers.Vary, "Origin");
|
|
111
|
+
});
|
|
112
|
+
it("omits the max-age header when it is not configured", () => {
|
|
113
|
+
(0, index_1.setCorsConfig)({ allowedOrigins: ALLOWED_ORIGIN });
|
|
114
|
+
const headers = preflightHeaders({ origin: ALLOWED_ORIGIN });
|
|
115
|
+
node_assert_1.default.equal(headers["Access-Control-Max-Age"], undefined);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=cors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.test.js","sourceRoot":"","sources":["../../src/test/cors.test.ts"],"names":[],"mappings":";;;;;AAAA,8DAAiC;AACjC,6DAA4E;AAC5E,gDAAsE;AACtE,oCAA+D;AAC/D,8CAA2C;AAE3C,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAC7C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAC7C,MAAM,iBAAiB,GAAG,UAAU,CAAC;AACrC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAO7B,MAAM,cAAc,GAAG,IAAI,WAAI,EAAE,CAAC;AAElC,SAAS,YAAY,CAAC,MAAc,EAAE,OAAuB;IAC3D,OAAO;QACL,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAC/B,QAAQ,EAAE,IAAI,0BAAU,EAAE;KACE,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,qBAAM,CAAC,EAAE,CAAC,MAAM,YAAY,0BAAU,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,IAAI,cAA4C,CAAC;IAEjD,MAAM,CAAC,GAAG,EAAE;QACV,cAAc,GAAG,IAAA,iBAAS,GAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACT,IAAA,iBAAS,EAAC,cAAc,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,IAAA,mBAAa,EAAC,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtE,qBAAM,CAAC,SAAS,CAAC,IAAA,mBAAa,GAAE,EAAE;YAChC,cAAc,EAAE,cAAc;YAC9B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,qBAAM,CAAC,SAAS,CAAC,IAAA,iBAAS,GAAE,CAAC,IAAI,EAAE;YACjC,cAAc,EAAE,cAAc;YAC9B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,IAAA,iBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAE3B,qBAAM,CAAC,SAAS,CAAC,IAAA,mBAAa,GAAE,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAA,iBAAS,EAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAE3B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,qBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,qBAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAA,qBAAa,EAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE9C,qBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,EAAE,cAAc,CAAC,CAAC;QACrE,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,kCAAkC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,IAAA,qBAAa,EAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7B,qBAAM,CAAC,KAAK,CACV,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,6BAA6B,CAAC,EAC5D,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,IAAA,qBAAa,EAAC,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtE,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAChE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7B,qBAAM,CAAC,KAAK,CACV,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,kCAAkC,CAAC,EACjE,SAAS,CACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,IAAA,qBAAa,EAAC;YACZ,cAAc,EAAE,cAAc;YAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;YAC/B,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAChC,YAAY,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CACpD,CAAC;QAEF,qBAAM,CAAC,EAAE,CAAC,MAAM,YAAY,0BAAU,CAAC,CAAC;QACxC,qBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAC,EAAE,UAAU,CAAC,CAAC;QAClE,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAA,qBAAa,EAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,MAAM,EAAE,cAAc;YACtB,gCAAgC,EAAE,iBAAiB;SACpD,CAAC,CAAC;QAEH,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACzE,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,IAAA,qBAAa,EAAC;YACZ,cAAc,EAAE,cAAc;YAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;SAC/B,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,gBAAgB,CAAC;YAC/B,MAAM,EAAE,cAAc;YACtB,gCAAgC,EAAE,iBAAiB;SACpD,CAAC,CAAC;QAEH,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,8BAA8B,CAAC,EAAE,SAAS,CAAC,CAAC;QACjE,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,IAAA,qBAAa,EAAC,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAE7D,qBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
40
|
+
const net = __importStar(require("node:net"));
|
|
41
|
+
const coreRuntime = __importStar(require("@antelopejs/interface-core/runtime"));
|
|
42
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
43
|
+
const index_1 = require("../index");
|
|
44
|
+
const TEST_HOST = "127.0.0.1";
|
|
45
|
+
const FALLBACK_BASE_PORT = 25040;
|
|
46
|
+
const EXPLICIT_FALSE_PORT = 25060;
|
|
47
|
+
const STRICT_FREE_PORT = 25070;
|
|
48
|
+
const STRICT_PORT = 25080;
|
|
49
|
+
const PROD_PORT = 25090;
|
|
50
|
+
const EXHAUSTED_BASE_PORT = 25100;
|
|
51
|
+
const EXHAUSTED_RANGE_SIZE = 21;
|
|
52
|
+
const MULTI_OCCUPIED_PORT = 25140;
|
|
53
|
+
const MULTI_FREE_PORT = 25150;
|
|
54
|
+
const RANDOM_PORT = 0;
|
|
55
|
+
function occupyPort(port) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
const blocker = net.createServer();
|
|
58
|
+
blocker.once("error", reject);
|
|
59
|
+
blocker.listen(port, TEST_HOST, () => resolve(blocker));
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function closeServer(server) {
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
server.close(() => resolve());
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function configureSingleServer(port, strictPort) {
|
|
68
|
+
(0, index_1.configure)({
|
|
69
|
+
autoListen: false,
|
|
70
|
+
strictPort,
|
|
71
|
+
servers: [{ protocol: "http", host: TEST_HOST, port }],
|
|
72
|
+
});
|
|
73
|
+
(0, index_1.start)();
|
|
74
|
+
}
|
|
75
|
+
function isPortInUseError(error) {
|
|
76
|
+
return error.code === "EADDRINUSE";
|
|
77
|
+
}
|
|
78
|
+
function stubRuntime(dev) {
|
|
79
|
+
sinon_1.default
|
|
80
|
+
.stub(coreRuntime, "GetRuntimeInfo")
|
|
81
|
+
.resolves({ dev, projectPath: "", env: "test" });
|
|
82
|
+
return sinon_1.default.stub(coreRuntime, "RegisterDevServer").resolves();
|
|
83
|
+
}
|
|
84
|
+
const LISTEN_POLL_INTERVAL_MS = 50;
|
|
85
|
+
const LISTEN_POLL_TIMEOUT_MS = 2000;
|
|
86
|
+
function delay(ms) {
|
|
87
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
88
|
+
}
|
|
89
|
+
async function waitForListening() {
|
|
90
|
+
const deadline = Date.now() + LISTEN_POLL_TIMEOUT_MS;
|
|
91
|
+
while ((0, index_1.getListeningEndpoints)().length === 0) {
|
|
92
|
+
if (Date.now() > deadline) {
|
|
93
|
+
throw new Error("Timed out waiting for servers to listen");
|
|
94
|
+
}
|
|
95
|
+
await delay(LISTEN_POLL_INTERVAL_MS);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
describe("Port fallback", () => {
|
|
99
|
+
const blockers = [];
|
|
100
|
+
let originalConfig;
|
|
101
|
+
async function blockPort(port) {
|
|
102
|
+
blockers.push(await occupyPort(port));
|
|
103
|
+
}
|
|
104
|
+
before(() => {
|
|
105
|
+
originalConfig = (0, index_1.getConfig)();
|
|
106
|
+
});
|
|
107
|
+
after(async () => {
|
|
108
|
+
if (!originalConfig.servers?.length) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
(0, index_1.configure)(originalConfig);
|
|
112
|
+
(0, index_1.start)();
|
|
113
|
+
if (originalConfig.autoListen !== false) {
|
|
114
|
+
await waitForListening();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
afterEach(async () => {
|
|
118
|
+
await (0, index_1.stop)();
|
|
119
|
+
sinon_1.default.restore();
|
|
120
|
+
await Promise.all(blockers.map((blocker) => closeServer(blocker)));
|
|
121
|
+
blockers.length = 0;
|
|
122
|
+
});
|
|
123
|
+
it("falls back to the next available port in dev runtime", async () => {
|
|
124
|
+
const registerStub = stubRuntime(true);
|
|
125
|
+
await blockPort(FALLBACK_BASE_PORT);
|
|
126
|
+
configureSingleServer(FALLBACK_BASE_PORT);
|
|
127
|
+
await (0, index_1.listenServers)();
|
|
128
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
129
|
+
node_assert_1.default.equal(endpoints.length, 1);
|
|
130
|
+
node_assert_1.default.equal(endpoints[0].port, FALLBACK_BASE_PORT + 1);
|
|
131
|
+
node_assert_1.default.equal((0, index_1.getConfig)().servers?.[0].port, FALLBACK_BASE_PORT + 1);
|
|
132
|
+
sinon_1.default.assert.calledOnce(registerStub);
|
|
133
|
+
node_assert_1.default.deepEqual(registerStub.firstCall.args, ["api", endpoints]);
|
|
134
|
+
});
|
|
135
|
+
it("falls back to a random port when the whole range is occupied", async () => {
|
|
136
|
+
stubRuntime(true);
|
|
137
|
+
const occupiedPorts = Array.from({ length: EXHAUSTED_RANGE_SIZE }, (_, offset) => EXHAUSTED_BASE_PORT + offset);
|
|
138
|
+
await Promise.all(occupiedPorts.map((port) => blockPort(port)));
|
|
139
|
+
configureSingleServer(EXHAUSTED_BASE_PORT);
|
|
140
|
+
await (0, index_1.listenServers)();
|
|
141
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
142
|
+
node_assert_1.default.equal(endpoints.length, 1);
|
|
143
|
+
node_assert_1.default.ok(endpoints[0].port > 0);
|
|
144
|
+
node_assert_1.default.ok(!occupiedPorts.includes(endpoints[0].port));
|
|
145
|
+
});
|
|
146
|
+
it("falls back when strictPort is explicitly false in dev runtime", async () => {
|
|
147
|
+
stubRuntime(true);
|
|
148
|
+
await blockPort(EXPLICIT_FALSE_PORT);
|
|
149
|
+
configureSingleServer(EXPLICIT_FALSE_PORT, false);
|
|
150
|
+
await (0, index_1.listenServers)();
|
|
151
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
152
|
+
node_assert_1.default.equal(endpoints.length, 1);
|
|
153
|
+
node_assert_1.default.equal(endpoints[0].port, EXPLICIT_FALSE_PORT + 1);
|
|
154
|
+
});
|
|
155
|
+
it("rejects when the port is in use and strictPort is enabled", async () => {
|
|
156
|
+
stubRuntime(true);
|
|
157
|
+
await blockPort(STRICT_PORT);
|
|
158
|
+
configureSingleServer(STRICT_PORT, true);
|
|
159
|
+
await node_assert_1.default.rejects((0, index_1.listenServers)(), isPortInUseError);
|
|
160
|
+
});
|
|
161
|
+
it("binds the requested port when strictPort is enabled and the port is free", async () => {
|
|
162
|
+
stubRuntime(true);
|
|
163
|
+
configureSingleServer(STRICT_FREE_PORT, true);
|
|
164
|
+
await (0, index_1.listenServers)();
|
|
165
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
166
|
+
node_assert_1.default.equal(endpoints.length, 1);
|
|
167
|
+
node_assert_1.default.equal(endpoints[0].port, STRICT_FREE_PORT);
|
|
168
|
+
node_assert_1.default.equal((0, index_1.getConfig)().servers?.[0].port, STRICT_FREE_PORT);
|
|
169
|
+
});
|
|
170
|
+
it("rejects when the port is in use outside of dev runtime", async () => {
|
|
171
|
+
stubRuntime(false);
|
|
172
|
+
await blockPort(PROD_PORT);
|
|
173
|
+
configureSingleServer(PROD_PORT);
|
|
174
|
+
await node_assert_1.default.rejects((0, index_1.listenServers)(), isPortInUseError);
|
|
175
|
+
});
|
|
176
|
+
it("reports actual endpoints when listening on a random port", async () => {
|
|
177
|
+
stubRuntime(false);
|
|
178
|
+
configureSingleServer(RANDOM_PORT);
|
|
179
|
+
await (0, index_1.listenServers)();
|
|
180
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
181
|
+
node_assert_1.default.equal(endpoints.length, 1);
|
|
182
|
+
node_assert_1.default.ok(endpoints[0].port > 0);
|
|
183
|
+
node_assert_1.default.equal(endpoints[0].protocol, "http");
|
|
184
|
+
node_assert_1.default.equal(endpoints[0].host, TEST_HOST);
|
|
185
|
+
node_assert_1.default.equal((0, index_1.getConfig)().servers?.[0].port, endpoints[0].port);
|
|
186
|
+
});
|
|
187
|
+
it("binds a single random port when port 0 is requested in dev runtime", async () => {
|
|
188
|
+
stubRuntime(true);
|
|
189
|
+
configureSingleServer(RANDOM_PORT);
|
|
190
|
+
await (0, index_1.listenServers)();
|
|
191
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
192
|
+
node_assert_1.default.equal(endpoints.length, 1);
|
|
193
|
+
node_assert_1.default.ok(endpoints[0].port > 0);
|
|
194
|
+
node_assert_1.default.equal((0, index_1.getConfig)().servers?.[0].port, endpoints[0].port);
|
|
195
|
+
});
|
|
196
|
+
it("falls back per server when multiple servers are configured", async () => {
|
|
197
|
+
const registerStub = stubRuntime(true);
|
|
198
|
+
await blockPort(MULTI_OCCUPIED_PORT);
|
|
199
|
+
(0, index_1.configure)({
|
|
200
|
+
autoListen: false,
|
|
201
|
+
servers: [
|
|
202
|
+
{ protocol: "http", host: TEST_HOST, port: MULTI_OCCUPIED_PORT },
|
|
203
|
+
{ protocol: "http", host: TEST_HOST, port: MULTI_FREE_PORT },
|
|
204
|
+
],
|
|
205
|
+
});
|
|
206
|
+
(0, index_1.start)();
|
|
207
|
+
await (0, index_1.listenServers)();
|
|
208
|
+
const endpoints = (0, index_1.getListeningEndpoints)();
|
|
209
|
+
node_assert_1.default.equal(endpoints.length, 2);
|
|
210
|
+
node_assert_1.default.equal(endpoints[0].port, MULTI_OCCUPIED_PORT + 1);
|
|
211
|
+
node_assert_1.default.equal(endpoints[1].port, MULTI_FREE_PORT);
|
|
212
|
+
node_assert_1.default.equal((0, index_1.getConfig)().servers?.[0].port, MULTI_OCCUPIED_PORT + 1);
|
|
213
|
+
node_assert_1.default.equal((0, index_1.getConfig)().servers?.[1].port, MULTI_FREE_PORT);
|
|
214
|
+
sinon_1.default.assert.calledOnce(registerStub);
|
|
215
|
+
node_assert_1.default.deepEqual(registerStub.firstCall.args, ["api", endpoints]);
|
|
216
|
+
});
|
|
217
|
+
it("clears endpoints after stop", async () => {
|
|
218
|
+
stubRuntime(false);
|
|
219
|
+
configureSingleServer(RANDOM_PORT);
|
|
220
|
+
await (0, index_1.listenServers)();
|
|
221
|
+
await (0, index_1.stop)();
|
|
222
|
+
node_assert_1.default.deepEqual((0, index_1.getListeningEndpoints)(), []);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=listen.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.test.js","sourceRoot":"","sources":["../../src/test/listen.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAiC;AACjC,8CAAgC;AAChC,gFAAkE;AAClE,kDAA0B;AAC1B,oCAOkB;AAElB,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,WAAW,GAAG,CAAC,CAAC;AAMtB,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,UAAoB;IAC/D,IAAA,iBAAS,EAAC;QACR,UAAU,EAAE,KAAK;QACjB,UAAU;QACV,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACvD,CAAC,CAAC;IACH,IAAA,aAAK,GAAE,CAAC;AACV,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAQ,KAAwB,CAAC,IAAI,KAAK,YAAY,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,eAAK;SACF,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC;SACnC,QAAQ,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,OAAO,eAAK,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC;IACrD,OAAO,IAAA,6BAAqB,GAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAI,cAA4C,CAAC;IAEjD,KAAK,UAAU,SAAS,CAAC,IAAY;QACnC,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,GAAG,EAAE;QACV,cAAc,GAAG,IAAA,iBAAS,GAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAA,iBAAS,EAAC,cAAc,CAAC,CAAC;QAC1B,IAAA,aAAK,GAAE,CAAC;QACR,IAAI,cAAc,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACxC,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAA,YAAI,GAAE,CAAC;QACb,eAAK,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAEpC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC;QACxD,qBAAM,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC;QACpE,eAAK,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACtC,qBAAM,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAC9B,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAChC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,mBAAmB,GAAG,MAAM,CAC5C,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACjC,qBAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAErC,qBAAqB,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QAE7B,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEzC,MAAM,qBAAM,CAAC,OAAO,CAAC,IAAA,qBAAa,GAAE,EAAE,gBAAgB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,WAAW,CAAC,IAAI,CAAC,CAAC;QAElB,qBAAqB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAClD,qBAAM,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QAE3B,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAEjC,MAAM,qBAAM,CAAC,OAAO,CAAC,IAAA,qBAAa,GAAE,EAAE,gBAAgB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,WAAW,CAAC,KAAK,CAAC,CAAC;QAEnB,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACjC,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,qBAAM,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,WAAW,CAAC,IAAI,CAAC,CAAC;QAElB,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACjC,qBAAM,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAErC,IAAA,iBAAS,EAAC;YACR,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE;gBACP,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE;gBAChE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE;aAC7D;SACF,CAAC,CAAC;QACH,IAAA,aAAK,GAAE,CAAC;QACR,MAAM,IAAA,qBAAa,GAAE,CAAC;QAEtB,MAAM,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAC;QAC1C,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC;QACzD,qBAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACjD,qBAAM,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC;QACrE,qBAAM,CAAC,KAAK,CAAC,IAAA,iBAAS,GAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAC7D,eAAK,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACtC,qBAAM,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,WAAW,CAAC,KAAK,CAAC,CAAC;QAEnB,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,IAAA,qBAAa,GAAE,CAAC;QACtB,MAAM,IAAA,YAAI,GAAE,CAAC;QAEb,qBAAM,CAAC,SAAS,CAAC,IAAA,6BAAqB,GAAE,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antelopejs/api",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A flexible API module that implements the API interfaces of antelopejs with HTTP and WebSocket support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"antelopejs",
|
|
@@ -23,26 +23,21 @@
|
|
|
23
23
|
"license": "Apache-2.0",
|
|
24
24
|
"packageManager": "pnpm@10.6.5",
|
|
25
25
|
"scripts": {
|
|
26
|
-
"build": "
|
|
27
|
-
"dev:prepare": "cd playground && ajs module imports install",
|
|
26
|
+
"build": "rimraf dist && tsc",
|
|
28
27
|
"dev": "ajs project run -w -p playground",
|
|
29
|
-
"format": "
|
|
30
|
-
"
|
|
31
|
-
"lint
|
|
32
|
-
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
|
28
|
+
"format": "biome format --write .",
|
|
29
|
+
"lint:fix": "biome check --write .",
|
|
30
|
+
"lint": "biome check .",
|
|
33
31
|
"prepack": "pnpm run build",
|
|
34
|
-
"prepare": "ajs module imports install",
|
|
35
32
|
"release": "pnpm run lint && pnpm run test && pnpm run prepack && release-it",
|
|
36
|
-
"test": "ajs module test ."
|
|
37
|
-
"changelog": "changelogen"
|
|
33
|
+
"test": "pnpm run build && ajs module test ."
|
|
38
34
|
},
|
|
39
35
|
"antelopeJs": {
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
"logging@beta"
|
|
36
|
+
"implements": [
|
|
37
|
+
"@antelopejs/interface-api",
|
|
38
|
+
"@antelopejs/interface-api-util"
|
|
44
39
|
],
|
|
45
|
-
"
|
|
40
|
+
"test": "src/test/antelope.test.ts",
|
|
46
41
|
"defaultConfig": {
|
|
47
42
|
"servers": [
|
|
48
43
|
{
|
|
@@ -51,36 +46,25 @@
|
|
|
51
46
|
"port": 8080
|
|
52
47
|
}
|
|
53
48
|
]
|
|
54
|
-
},
|
|
55
|
-
"test": {
|
|
56
|
-
"project": "src/test/antelope.test.json",
|
|
57
|
-
"folder": "dist/test"
|
|
58
49
|
}
|
|
59
50
|
},
|
|
60
51
|
"dependencies": {
|
|
52
|
+
"@antelopejs/interface-api": "^0.0.4",
|
|
53
|
+
"@antelopejs/interface-api-util": "^0.0.2",
|
|
54
|
+
"@antelopejs/interface-core": "^0.0.5",
|
|
61
55
|
"reflect-metadata": "^0.2.2",
|
|
62
|
-
"ws": "^8.
|
|
56
|
+
"ws": "^8.20.0"
|
|
63
57
|
},
|
|
64
58
|
"devDependencies": {
|
|
65
|
-
"@
|
|
66
|
-
"@eslint/js": "^9.25.0",
|
|
67
|
-
"@types/chai": "^5.2.2",
|
|
68
|
-
"@types/express": "^5.0.1",
|
|
59
|
+
"@biomejs/biome": "2.3.2",
|
|
69
60
|
"@types/mocha": "^10.0.10",
|
|
70
|
-
"@types/node": "^22.
|
|
71
|
-
"@types/sinon": "^
|
|
61
|
+
"@types/node": "^22.19.15",
|
|
62
|
+
"@types/sinon": "^21.0.0",
|
|
72
63
|
"@types/ws": "^8.18.1",
|
|
73
|
-
"
|
|
74
|
-
"eslint": "^9.25.0",
|
|
75
|
-
"eslint-config-prettier": "^10.1.2",
|
|
76
|
-
"eslint-plugin-import": "^2.31.0",
|
|
77
|
-
"eslint-plugin-prettier": "^5.2.6",
|
|
78
|
-
"globals": "^16.0.0",
|
|
79
|
-
"prettier": "^3.5.3",
|
|
80
|
-
"release-it": "^19.0.2",
|
|
64
|
+
"release-it": "^19.2.4",
|
|
81
65
|
"release-it-changelogen": "^0.1.0",
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"typescript
|
|
66
|
+
"rimraf": "^6.1.3",
|
|
67
|
+
"sinon": "^21.0.3",
|
|
68
|
+
"typescript": "^5.9.3"
|
|
85
69
|
}
|
|
86
70
|
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { RouteHandler } from '@ajs.local/api/beta';
|
|
2
|
-
import { RequestContext } from '../../server';
|
|
3
|
-
declare const classCacheSymbol: unique symbol;
|
|
4
|
-
interface RequestContextDev extends RequestContext {
|
|
5
|
-
[classCacheSymbol]?: Map<any, any>;
|
|
6
|
-
}
|
|
7
|
-
export declare function GetControllerInstance(cl: any, context: RequestContextDev): Promise<any>;
|
|
8
|
-
interface RouteInfo {
|
|
9
|
-
id: string;
|
|
10
|
-
uri: string;
|
|
11
|
-
method: string;
|
|
12
|
-
mode: 'prefix' | 'postfix' | 'handler' | 'websocket';
|
|
13
|
-
priority?: number;
|
|
14
|
-
callbackName: string;
|
|
15
|
-
}
|
|
16
|
-
export declare const routesProxy: {
|
|
17
|
-
register: (id: string, handler: RouteHandler) => void;
|
|
18
|
-
unregister: (id: string) => void;
|
|
19
|
-
getRoutes: () => RouteInfo[];
|
|
20
|
-
};
|
|
21
|
-
export {};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.routesProxy = void 0;
|
|
4
|
-
exports.GetControllerInstance = GetControllerInstance;
|
|
5
|
-
const beta_1 = require("@ajs.local/api/beta");
|
|
6
|
-
const server_1 = require("../../server");
|
|
7
|
-
const beta_2 = require("@ajs/core/beta");
|
|
8
|
-
const classCacheSymbol = Symbol();
|
|
9
|
-
const registeredRoutes = new Map();
|
|
10
|
-
async function GetControllerInstance(cl, context) {
|
|
11
|
-
if (!(classCacheSymbol in context)) {
|
|
12
|
-
context[classCacheSymbol] = new Map();
|
|
13
|
-
}
|
|
14
|
-
if (context[classCacheSymbol].has(cl.prototype)) {
|
|
15
|
-
return context[classCacheSymbol].get(cl.prototype);
|
|
16
|
-
}
|
|
17
|
-
const obj = new cl();
|
|
18
|
-
const meta = (0, beta_2.GetMetadata)(cl, beta_1.ControllerMeta);
|
|
19
|
-
await Promise.all(Object.entries(meta.computed_props).map(async ([key, param]) => {
|
|
20
|
-
const val = await (0, beta_1.computeParameter)(context, param, obj);
|
|
21
|
-
obj[key] = val;
|
|
22
|
-
}));
|
|
23
|
-
context[classCacheSymbol].set(cl.prototype, obj);
|
|
24
|
-
return obj;
|
|
25
|
-
}
|
|
26
|
-
exports.routesProxy = {
|
|
27
|
-
register: (id, handler) => {
|
|
28
|
-
registeredRoutes.set(id, handler);
|
|
29
|
-
(0, server_1.registerHandler)('dev/' + id, handler.mode, handler.method, handler.location, async (context) => {
|
|
30
|
-
const thisObj = await GetControllerInstance(handler.proto.constructor, context);
|
|
31
|
-
const params = await Promise.all(handler.parameters.map((param) => (0, beta_1.computeParameter)(context, param, thisObj)));
|
|
32
|
-
return handler.callback.apply(thisObj, params);
|
|
33
|
-
}, handler.priority);
|
|
34
|
-
},
|
|
35
|
-
unregister: (id) => {
|
|
36
|
-
registeredRoutes.delete(id);
|
|
37
|
-
(0, server_1.unregisterHandler)('dev/' + id);
|
|
38
|
-
},
|
|
39
|
-
getRoutes: () => {
|
|
40
|
-
const routes = [];
|
|
41
|
-
registeredRoutes.forEach((handler, id) => {
|
|
42
|
-
routes.push({
|
|
43
|
-
id,
|
|
44
|
-
uri: handler.location,
|
|
45
|
-
method: handler.method,
|
|
46
|
-
mode: handler.mode,
|
|
47
|
-
priority: handler.priority,
|
|
48
|
-
callbackName: handler.callback.name || 'anonymous',
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
return routes;
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=beta.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"beta.js","sourceRoot":"","sources":["../../../src/implementations/api/beta.ts"],"names":[],"mappings":"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"}
|