@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.
Files changed (46) hide show
  1. package/dist/dev-registry.d.ts +6 -0
  2. package/dist/dev-registry.js +43 -0
  3. package/dist/dev-registry.js.map +1 -0
  4. package/dist/implementations/api/index.d.ts +21 -0
  5. package/dist/implementations/api/index.js +79 -0
  6. package/dist/implementations/api/index.js.map +1 -0
  7. package/dist/index.d.ts +9 -22
  8. package/dist/index.js +63 -33
  9. package/dist/index.js.map +1 -1
  10. package/dist/middlewares/cors.d.ts +3 -3
  11. package/dist/middlewares/cors.js +73 -37
  12. package/dist/middlewares/cors.js.map +1 -1
  13. package/dist/port-binding.d.ts +4 -0
  14. package/dist/port-binding.js +79 -0
  15. package/dist/port-binding.js.map +1 -0
  16. package/dist/server-config.d.ts +27 -0
  17. package/dist/server-config.js +18 -0
  18. package/dist/server-config.js.map +1 -0
  19. package/dist/server-factory.d.ts +3 -0
  20. package/dist/server-factory.js +61 -0
  21. package/dist/server-factory.js.map +1 -0
  22. package/dist/server.d.ts +8 -7
  23. package/dist/server.js +229 -108
  24. package/dist/server.js.map +1 -1
  25. package/dist/test/antelope.test.d.ts +2 -0
  26. package/dist/test/antelope.test.js +25 -0
  27. package/dist/test/antelope.test.js.map +1 -0
  28. package/dist/test/cors.test.d.ts +1 -0
  29. package/dist/test/cors.test.js +118 -0
  30. package/dist/test/cors.test.js.map +1 -0
  31. package/dist/test/listen.test.d.ts +1 -0
  32. package/dist/test/listen.test.js +225 -0
  33. package/dist/test/listen.test.js.map +1 -0
  34. package/package.json +21 -37
  35. package/dist/implementations/api/beta.d.ts +0 -21
  36. package/dist/implementations/api/beta.js +0 -54
  37. package/dist/implementations/api/beta.js.map +0 -1
  38. package/dist/interfaces/api/beta/index.d.ts +0 -116
  39. package/dist/interfaces/api/beta/index.js +0 -305
  40. package/dist/interfaces/api/beta/index.js.map +0 -1
  41. package/dist/interfaces/api-util/dev.d.ts +0 -2
  42. package/dist/interfaces/api-util/dev.js +0 -20
  43. package/dist/interfaces/api-util/dev.js.map +0 -1
  44. package/dist/test/interface/api.d.ts +0 -69
  45. package/dist/test/interface/api.js +0 -739
  46. package/dist/test/interface/api.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ declare const _default: import("@antelopejs/interface-core/config").ConfigInput;
2
+ export default _default;
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/api",
3
- "version": "0.2.0",
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": "rm -rf dist && tsc",
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": "prettier --write .",
30
- "generate": "ajs module exports generate",
31
- "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
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
- "exportsPath": "dist/interfaces",
41
- "imports": [
42
- "core@beta",
43
- "logging@beta"
36
+ "implements": [
37
+ "@antelopejs/interface-api",
38
+ "@antelopejs/interface-api-util"
44
39
  ],
45
- "importsOptional": [],
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.18.1"
56
+ "ws": "^8.20.0"
63
57
  },
64
58
  "devDependencies": {
65
- "@eslint/eslintrc": "^3.3.1",
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.14.1",
71
- "@types/sinon": "^17.0.4",
61
+ "@types/node": "^22.19.15",
62
+ "@types/sinon": "^21.0.0",
72
63
  "@types/ws": "^8.18.1",
73
- "chai": "^5.2.0",
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
- "sinon": "^20.0.0",
83
- "typescript": "^5.8.3",
84
- "typescript-eslint": "^8.30.1"
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":";;;AAWA,sDAoBC;AA/BD,8CAAqF;AACrF,yCAAkF;AAClF,yCAA6C;AAE7C,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC;AAClC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAwB,CAAC;AAMlD,KAAK,UAAU,qBAAqB,CAAC,EAAO,EAAE,OAA0B;IAC7E,IAAI,CAAC,CAAC,gBAAgB,IAAI,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,gBAAgB,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAE,CAAC;IACvD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,IAAA,kBAAW,EAAC,EAAE,EAAE,qBAAc,CAAC,CAAC;IAE7C,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7D,MAAM,GAAG,GAAG,MAAM,IAAA,uBAAgB,EAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,gBAAgB,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AAWY,QAAA,WAAW,GAAG;IACzB,QAAQ,EAAE,CAAC,EAAU,EAAE,OAAqB,EAAE,EAAE;QAC9C,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAClC,IAAA,wBAAe,EACb,MAAM,GAAG,EAAE,EACX,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,QAAQ,EAChB,KAAK,EAAE,OAA0B,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,uBAAgB,EAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/G,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,EACD,OAAO,CAAC,QAAQ,CACjB,CAAC;IACJ,CAAC;IACD,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE;QACzB,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAA,0BAAiB,EAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,SAAS,EAAE,GAAgB,EAAE;QAC3B,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE;gBACF,GAAG,EAAE,OAAO,CAAC,QAAQ;gBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW;aACnD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}