@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,6 @@
1
+ import type * as net from "node:net";
2
+ import { type DevServerEndpoint } from "@antelopejs/interface-core/runtime";
3
+ import { type Config, type ServerConfig } from "./server-config";
4
+ export declare function shouldAllowPortFallback(config: Config): Promise<boolean>;
5
+ export declare function collectListeningEndpoints(servers: net.Server[], configs?: ServerConfig[]): DevServerEndpoint[];
6
+ export declare function registerDevServerEndpoints(endpoints: DevServerEndpoint[]): Promise<void>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldAllowPortFallback = shouldAllowPortFallback;
4
+ exports.collectListeningEndpoints = collectListeningEndpoints;
5
+ exports.registerDevServerEndpoints = registerDevServerEndpoints;
6
+ const logging_1 = require("@antelopejs/interface-core/logging");
7
+ const runtime_1 = require("@antelopejs/interface-core/runtime");
8
+ const port_binding_1 = require("./port-binding");
9
+ const server_config_1 = require("./server-config");
10
+ const DEV_SERVER_NAME = "api";
11
+ async function shouldAllowPortFallback(config) {
12
+ if (config.strictPort) {
13
+ return false;
14
+ }
15
+ const runtimeInfo = await (0, runtime_1.GetRuntimeInfo)();
16
+ return runtimeInfo.dev;
17
+ }
18
+ function buildEndpoint(server, config) {
19
+ if (!config || !server.listening) {
20
+ return null;
21
+ }
22
+ const port = (0, port_binding_1.resolveBoundPort)(server, config.port ?? server_config_1.DEFAULT_HTTP_PORT);
23
+ return {
24
+ protocol: config.protocol,
25
+ host: config.host ?? server_config_1.DEFAULT_HOST,
26
+ port,
27
+ };
28
+ }
29
+ function collectListeningEndpoints(servers, configs = []) {
30
+ return servers
31
+ .map((server, index) => buildEndpoint(server, configs[index]))
32
+ .filter((endpoint) => endpoint !== null);
33
+ }
34
+ async function registerDevServerEndpoints(endpoints) {
35
+ try {
36
+ await (0, runtime_1.RegisterDevServer)(DEV_SERVER_NAME, endpoints);
37
+ }
38
+ catch (error) {
39
+ const message = error instanceof Error ? error.message : String(error);
40
+ logging_1.Logging.Warn(`Unable to register dev server endpoints: ${message}`);
41
+ }
42
+ }
43
+ //# sourceMappingURL=dev-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-registry.js","sourceRoot":"","sources":["../src/dev-registry.ts"],"names":[],"mappings":";;AAiBA,0DASC;AAkBD,8DAOC;AAED,gEASC;AA7DD,gEAA6D;AAC7D,gEAI4C;AAC5C,iDAAkD;AAClD,mDAKyB;AAEzB,MAAM,eAAe,GAAG,KAAK,CAAC;AAEvB,KAAK,UAAU,uBAAuB,CAC3C,MAAc;IAEd,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAA,wBAAc,GAAE,CAAC;IAC3C,OAAO,WAAW,CAAC,GAAG,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CACpB,MAAkB,EAClB,MAAqB;IAErB,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,IAAA,+BAAgB,EAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,iCAAiB,CAAC,CAAC;IACxE,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,4BAAY;QACjC,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAgB,yBAAyB,CACvC,OAAqB,EACrB,UAA0B,EAAE;IAE5B,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,QAAQ,EAAiC,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;AAC5E,CAAC;AAEM,KAAK,UAAU,0BAA0B,CAC9C,SAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,IAAA,2BAAiB,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,iBAAO,CAAC,IAAI,CAAC,4CAA4C,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type CorsConfig, type RouteHandler } from "@antelopejs/interface-api";
2
+ import type { Class } from "@antelopejs/interface-core/decorators";
3
+ import { type RequestContext } from "../../server";
4
+ export declare function GetControllerInstance(controllerClass: Class<unknown>, context: RequestContext): Promise<unknown>;
5
+ export declare function Listen(): Promise<void>;
6
+ export declare function GetCorsConfig(): CorsConfig;
7
+ export declare function SetCorsConfig(config: CorsConfig): void;
8
+ interface RouteInfo {
9
+ id: string;
10
+ uri: string;
11
+ method: string;
12
+ mode: "prefix" | "postfix" | "handler" | "monitor" | "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 {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.routesProxy = void 0;
4
+ exports.GetControllerInstance = GetControllerInstance;
5
+ exports.Listen = Listen;
6
+ exports.GetCorsConfig = GetCorsConfig;
7
+ exports.SetCorsConfig = SetCorsConfig;
8
+ const interface_api_1 = require("@antelopejs/interface-api");
9
+ const interface_core_1 = require("@antelopejs/interface-core");
10
+ const index_1 = require("../../index");
11
+ const server_1 = require("../../server");
12
+ const classCacheSymbol = Symbol();
13
+ const registeredRoutes = new Map();
14
+ function getControllerCache(context) {
15
+ if (!context[classCacheSymbol]) {
16
+ context[classCacheSymbol] = new Map();
17
+ }
18
+ return context[classCacheSymbol];
19
+ }
20
+ async function applyComputedProperties(controllerInstance, controllerMetadata, context) {
21
+ await Promise.all(Object.entries(controllerMetadata.computed_props).map(async ([propertyKey, parameter]) => {
22
+ const computedValue = await (0, interface_api_1.computeParameter)(context, parameter, controllerInstance);
23
+ controllerInstance[propertyKey] = computedValue;
24
+ }));
25
+ }
26
+ async function GetControllerInstance(controllerClass, context) {
27
+ const controllerCache = getControllerCache(context);
28
+ const cacheKey = controllerClass.prototype;
29
+ const cachedController = controllerCache.get(cacheKey);
30
+ if (cachedController) {
31
+ return cachedController;
32
+ }
33
+ const typedControllerClass = controllerClass;
34
+ const controllerInstance = new typedControllerClass();
35
+ const controllerMetadata = (0, interface_core_1.GetMetadata)(typedControllerClass, interface_api_1.ControllerMeta);
36
+ await applyComputedProperties(controllerInstance, controllerMetadata, context);
37
+ controllerCache.set(cacheKey, controllerInstance);
38
+ return controllerInstance;
39
+ }
40
+ async function Listen() {
41
+ await (0, index_1.listenServers)();
42
+ }
43
+ function GetCorsConfig() {
44
+ return (0, index_1.getConfig)().cors ?? {};
45
+ }
46
+ function SetCorsConfig(config) {
47
+ (0, index_1.setCorsConfig)(config);
48
+ }
49
+ async function invokeHandler(handler, context) {
50
+ const controllerClass = handler.proto.constructor;
51
+ const controllerInstance = await GetControllerInstance(controllerClass, context);
52
+ const resolvedParameters = await Promise.all(handler.parameters.map((parameter) => (0, interface_api_1.computeParameter)(context, parameter, controllerInstance)));
53
+ return handler.callback.apply(controllerInstance, resolvedParameters);
54
+ }
55
+ exports.routesProxy = {
56
+ register: (id, handler) => {
57
+ registeredRoutes.set(id, handler);
58
+ (0, server_1.registerHandler)(`dev/${id}`, handler.mode, handler.method, handler.location, async (context) => invokeHandler(handler, context), handler.priority);
59
+ },
60
+ unregister: (id) => {
61
+ registeredRoutes.delete(id);
62
+ (0, server_1.unregisterHandler)(`dev/${id}`);
63
+ },
64
+ getRoutes: () => {
65
+ const routes = [];
66
+ registeredRoutes.forEach((handler, id) => {
67
+ routes.push({
68
+ id,
69
+ uri: handler.location,
70
+ method: handler.method,
71
+ mode: handler.mode,
72
+ priority: handler.priority,
73
+ callbackName: handler.callback.name || "anonymous",
74
+ });
75
+ });
76
+ return routes;
77
+ },
78
+ };
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/implementations/api/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,26 +1,13 @@
1
- import * as http from 'http';
2
- import * as https from 'https';
3
- import './middlewares/cors';
4
- interface HTTPConfig extends http.ServerOptions {
5
- protocol: 'http';
6
- host?: string;
7
- port?: number;
8
- }
9
- interface HTTPSConfig extends https.ServerOptions {
10
- protocol: 'https';
11
- host?: string;
12
- port?: number;
13
- }
14
- interface Config {
15
- servers?: (HTTPConfig | HTTPSConfig)[];
16
- cors?: {
17
- allowedOrigins?: string | RegExp | (string | RegExp)[];
18
- allowedMethods?: string[];
19
- };
20
- }
1
+ import type { CorsConfig } from "@antelopejs/interface-api";
2
+ import type { DevServerEndpoint } from "@antelopejs/interface-core/runtime";
3
+ import { type Config } from "./server-config";
4
+ import "./middlewares/cors";
21
5
  export declare function getConfig(): Config;
6
+ export declare function configure(config: Config): void;
7
+ export declare function setCorsConfig(cors: CorsConfig): void;
22
8
  export declare function construct(config: Config): Promise<void>;
23
9
  export declare function destroy(): void;
24
10
  export declare function start(): void;
25
- export declare function stop(): void;
26
- export {};
11
+ export declare function getListeningEndpoints(): DevServerEndpoint[];
12
+ export declare function listenServers(): Promise<void>;
13
+ export declare function stop(): Promise<void>;
package/dist/index.js CHANGED
@@ -34,52 +34,82 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.getConfig = getConfig;
37
+ exports.configure = configure;
38
+ exports.setCorsConfig = setCorsConfig;
37
39
  exports.construct = construct;
38
40
  exports.destroy = destroy;
39
41
  exports.start = start;
42
+ exports.getListeningEndpoints = getListeningEndpoints;
43
+ exports.listenServers = listenServers;
40
44
  exports.stop = stop;
41
- const http = __importStar(require("http"));
42
- const https = __importStar(require("https"));
43
- const beta_1 = require("@ajs/core/beta");
44
- const server_1 = require("./server");
45
+ const interface_core_1 = require("@antelopejs/interface-core");
46
+ const logging_1 = require("@antelopejs/interface-core/logging");
47
+ const dev_registry_1 = require("./dev-registry");
48
+ const port_binding_1 = require("./port-binding");
49
+ const server_config_1 = require("./server-config");
50
+ const server_factory_1 = require("./server-factory");
45
51
  require("./middlewares/cors");
46
- const beta_2 = require("@ajs/logging/beta");
47
- let conf;
48
- let servers;
52
+ let conf = {
53
+ servers: [],
54
+ };
55
+ let servers = [];
56
+ let listening = false;
49
57
  function getConfig() {
50
58
  return conf;
51
59
  }
60
+ function configure(config) {
61
+ conf = {
62
+ ...config,
63
+ servers: (0, server_config_1.resolveServers)(config),
64
+ };
65
+ }
66
+ function setCorsConfig(cors) {
67
+ conf = { ...conf, cors };
68
+ }
52
69
  async function construct(config) {
53
- conf = config;
54
- conf.servers = conf.servers || [];
55
- if (conf.servers.length === 0) {
56
- conf.servers.push({ protocol: 'http', port: 80 });
57
- }
58
- await (0, beta_1.ImplementInterface)(Promise.resolve().then(() => __importStar(require('@ajs.local/api/beta'))), Promise.resolve().then(() => __importStar(require('./implementations/api/beta'))));
70
+ configure(config);
71
+ void (0, interface_core_1.ImplementInterface)(await Promise.resolve().then(() => __importStar(require("@antelopejs/interface-api"))), await Promise.resolve().then(() => __importStar(require("./implementations/api"))));
59
72
  }
60
73
  function destroy() { }
74
+ function closeServers() {
75
+ const closing = servers.map((server) => new Promise((resolve) => {
76
+ server.close(() => resolve());
77
+ }));
78
+ servers = [];
79
+ listening = false;
80
+ return Promise.all(closing).then(() => undefined);
81
+ }
61
82
  function start() {
62
- servers = conf.servers.map((config) => {
63
- let server;
64
- switch (config.protocol) {
65
- case 'http':
66
- server = http.createServer(config);
67
- server.on('request', (req, res) => void (0, server_1.requestListener)(req, res, 'http'));
68
- server.on('upgrade', (req, sock, head) => void (0, server_1.upgradeListener)(req, sock, head, 'ws'));
69
- break;
70
- case 'https':
71
- server = https.createServer(config);
72
- server.on('request', (req, res) => void (0, server_1.requestListener)(req, res, 'https'));
73
- server.on('upgrade', (req, sock, head) => void (0, server_1.upgradeListener)(req, sock, head, 'wss'));
74
- break;
75
- }
76
- const server_listener = server.listen(config.port, config.host);
77
- beta_2.Logging.Info(`Server started, listening on ${config.protocol}://${config.host || 'localhost'}:${config.port}`);
78
- return server_listener;
79
- });
83
+ const serversClosed = closeServers();
84
+ servers = (conf.servers ?? []).map((serverConfig) => (0, server_factory_1.createConfiguredServer)(serverConfig));
85
+ if (conf.autoListen !== false) {
86
+ void serversClosed
87
+ .then(() => listenServers())
88
+ .catch((error) => {
89
+ const message = error instanceof Error ? error.message : String(error);
90
+ logging_1.Logging.Error(`Unable to start listening servers: ${message}`);
91
+ });
92
+ }
93
+ }
94
+ function getListeningEndpoints() {
95
+ return (0, dev_registry_1.collectListeningEndpoints)(servers, conf.servers);
96
+ }
97
+ async function listenServers() {
98
+ if (listening || servers.length === 0) {
99
+ return;
100
+ }
101
+ listening = true;
102
+ try {
103
+ const allowPortFallback = await (0, dev_registry_1.shouldAllowPortFallback)(conf);
104
+ await Promise.all((conf.servers ?? []).map((serverConfig, index) => (0, port_binding_1.listenServer)(servers[index], serverConfig, allowPortFallback)));
105
+ }
106
+ catch (error) {
107
+ listening = false;
108
+ throw error;
109
+ }
110
+ await (0, dev_registry_1.registerDevServerEndpoints)(getListeningEndpoints());
80
111
  }
81
112
  function stop() {
82
- servers.forEach((server) => server.close());
83
- servers = [];
113
+ return closeServers();
84
114
  }
85
115
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,8BAEC;AAED,8BAQC;AAED,0BAAkC;AAElC,sBAgCC;AAED,oBAGC;AArFD,2CAA6B;AAC7B,6CAA+B;AAG/B,yCAAoD;AACpD,qCAA4D;AAC5D,8BAA4B;AAC5B,4CAA4C;AAsB5C,IAAI,IAAY,CAAC;AACjB,IAAI,OAAqB,CAAC;AAE1B,SAAgB,SAAS;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,IAAI,GAAG,MAAM,CAAC;IACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,IAAA,yBAAkB,oDAAQ,qBAAqB,uDAAU,4BAA4B,IAAE,CAAC;AAChG,CAAC;AAED,SAAgB,OAAO,KAAU,CAAC;AAElC,SAAgB,KAAK;IACnB,OAAO,GAAG,IAAI,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACrC,IAAI,MAAkB,CAAC;QACvB,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,MAAM;gBACT,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,CAAC,EAAE,CACP,SAAS,EACT,CAAC,GAAyB,EAAE,GAAwB,EAAE,EAAE,CAAC,KAAK,IAAA,wBAAe,EAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAChG,CAAC;gBACF,MAAM,CAAC,EAAE,CACP,SAAS,EACT,CAAC,GAAyB,EAAE,IAAmB,EAAE,IAAY,EAAE,EAAE,CAAC,KAAK,IAAA,wBAAe,EAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAC9G,CAAC;gBACF,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,CAAC,EAAE,CACP,SAAS,EACT,CAAC,GAAyB,EAAE,GAAwB,EAAE,EAAE,CAAC,KAAK,IAAA,wBAAe,EAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CACjG,CAAC;gBACF,MAAM,CAAC,EAAE,CACP,SAAS,EACT,CAAC,GAAyB,EAAE,IAAmB,EAAE,IAAY,EAAE,EAAE,CAC/D,KAAK,IAAA,wBAAe,EAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAC/C,CAAC;gBACF,MAAM;QACV,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAChE,cAAO,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,IAAI,IAAI,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/G,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,IAAI;IAClB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,OAAO,GAAG,EAAE,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { HTTPResult, RequestContext } from '@ajs.local/api/beta';
2
- declare const Cors_base: import("@ajs.local/api/beta").ControllerClass<object>;
1
+ import { HTTPResult, type RequestContext } from "@antelopejs/interface-api";
2
+ declare const Cors_base: import("@antelopejs/interface-api").ControllerClass<object>;
3
3
  export declare class Cors extends Cors_base {
4
- cors(ctx: RequestContext): HTTPResult | undefined;
4
+ cors(requestContext: RequestContext): HTTPResult | undefined;
5
5
  }
6
6
  export {};
@@ -13,62 +13,98 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.Cors = void 0;
16
- const beta_1 = require("@ajs.local/api/beta");
16
+ const interface_api_1 = require("@antelopejs/interface-api");
17
17
  const __1 = require("..");
18
- function isString(s) {
19
- return typeof s === 'string' || s instanceof String;
18
+ const DEFAULT_ALLOWED_METHODS = "GET,HEAD,PUT,PATCH,POST,DELETE";
19
+ const FALSE_ORIGIN = "false";
20
+ const CREDENTIALS_ENABLED_VALUE = "true";
21
+ const NO_BODY_LENGTH = "0";
22
+ const DEFAULT_CREDENTIALS = true;
23
+ function isString(value) {
24
+ return typeof value === "string" || value instanceof String;
25
+ }
26
+ function toHeaderValue(value) {
27
+ if (Array.isArray(value)) {
28
+ return value.join(",");
29
+ }
30
+ return value ?? "";
20
31
  }
21
32
  function isOriginAllowed(origin, allowedOrigin) {
22
33
  if (Array.isArray(allowedOrigin)) {
23
- for (let i = 0; i < allowedOrigin.length; ++i) {
24
- if (isOriginAllowed(origin, allowedOrigin[i])) {
25
- return true;
26
- }
27
- }
28
- return false;
34
+ return allowedOrigin.some((item) => isOriginAllowed(origin, item));
29
35
  }
30
- else if (isString(allowedOrigin)) {
36
+ if (isString(allowedOrigin)) {
31
37
  return origin === allowedOrigin;
32
38
  }
33
- else if (allowedOrigin instanceof RegExp) {
39
+ if (allowedOrigin instanceof RegExp) {
34
40
  return allowedOrigin.test(origin);
35
41
  }
36
- else {
37
- return !!allowedOrigin;
42
+ return Boolean(allowedOrigin);
43
+ }
44
+ function isCredentialsEnabled(cors) {
45
+ return cors.credentials ?? DEFAULT_CREDENTIALS;
46
+ }
47
+ function addCredentialsHeader(response, cors) {
48
+ if (isCredentialsEnabled(cors)) {
49
+ response.addHeader("Access-Control-Allow-Credentials", CREDENTIALS_ENABLED_VALUE);
38
50
  }
39
51
  }
40
- class Cors extends (0, beta_1.Controller)('') {
41
- cors(ctx) {
42
- const config = (0, __1.getConfig)();
43
- if (!config.cors) {
44
- return;
52
+ function hasStaticAllowedHeaders(cors) {
53
+ return Boolean(cors.allowedHeaders && cors.allowedHeaders.length > 0);
54
+ }
55
+ function resolveAllowedHeaders(cors, requestContext) {
56
+ const { allowedHeaders } = cors;
57
+ if (allowedHeaders && allowedHeaders.length > 0) {
58
+ return allowedHeaders.join(",");
59
+ }
60
+ return toHeaderValue(requestContext.rawRequest.headers["access-control-request-headers"]);
61
+ }
62
+ function addPreflightHeaders(response, requestContext, allowedOriginHeader, cors) {
63
+ const allowedMethods = cors.allowedMethods?.join(",") ?? DEFAULT_ALLOWED_METHODS;
64
+ response.addHeader("Access-Control-Allow-Origin", allowedOriginHeader);
65
+ response.addHeader("Vary", "Origin");
66
+ response.addHeader("Access-Control-Allow-Methods", allowedMethods);
67
+ addCredentialsHeader(response, cors);
68
+ response.addHeader("Access-Control-Allow-Headers", resolveAllowedHeaders(cors, requestContext));
69
+ if (!hasStaticAllowedHeaders(cors)) {
70
+ response.addHeader("Vary", "Access-Control-Request-Headers");
71
+ }
72
+ if (cors.maxAge !== undefined) {
73
+ response.addHeader("Access-Control-Max-Age", String(cors.maxAge));
74
+ }
75
+ response.addHeader("Content-Length", NO_BODY_LENGTH);
76
+ }
77
+ function addStandardCorsHeaders(requestContext, allowedOriginHeader, cors) {
78
+ requestContext.response.addHeader("Access-Control-Allow-Origin", allowedOriginHeader);
79
+ requestContext.response.addHeader("Vary", "Origin");
80
+ addCredentialsHeader(requestContext.response, cors);
81
+ }
82
+ class Cors extends (0, interface_api_1.Controller)("") {
83
+ cors(requestContext) {
84
+ const cors = (0, __1.getConfig)().cors;
85
+ if (!cors) {
86
+ return undefined;
45
87
  }
46
- const requestOrigin = ctx.rawRequest.headers.origin;
47
- const isAllowed = isOriginAllowed(requestOrigin, config.cors?.allowedOrigins);
48
- if (ctx.rawRequest.method === 'OPTIONS') {
49
- const response = new beta_1.HTTPResult(204, null);
50
- response.addHeader('Access-Control-Allow-Origin', isAllowed ? requestOrigin : 'false');
51
- response.addHeader('Vary', 'Origin');
52
- response.addHeader('Access-Control-Allow-Methods', config.cors?.allowedMethods ? config.cors?.allowedMethods.join(',') : 'GET,HEAD,PUT,PATCH,POST,DELETE');
53
- response.addHeader('Access-Control-Allow-Credentials', 'true');
54
- response.addHeader('Access-Control-Allow-Headers', ctx.rawRequest.headers['access-control-request-headers']);
55
- response.addHeader('Vary', 'Access-Control-Request-Headers');
56
- response.addHeader('Content-Length', '0');
88
+ const requestOrigin = requestContext.rawRequest.headers.origin;
89
+ const isAllowed = requestOrigin
90
+ ? isOriginAllowed(requestOrigin, cors.allowedOrigins)
91
+ : false;
92
+ const allowedOriginHeader = isAllowed && requestOrigin ? requestOrigin : FALSE_ORIGIN;
93
+ if (requestContext.rawRequest.method === "OPTIONS") {
94
+ const response = new interface_api_1.HTTPResult(204, null);
95
+ addPreflightHeaders(response, requestContext, allowedOriginHeader, cors);
57
96
  return response;
58
97
  }
59
- else {
60
- ctx.response?.addHeader('Access-Control-Allow-Origin', isAllowed ? requestOrigin : 'false');
61
- ctx.response?.addHeader('Vary', 'Origin');
62
- ctx.response?.addHeader('Access-Control-Allow-Credentials', 'true');
63
- }
98
+ addStandardCorsHeaders(requestContext, allowedOriginHeader, cors);
99
+ return undefined;
64
100
  }
65
101
  }
66
102
  exports.Cors = Cors;
67
103
  __decorate([
68
- (0, beta_1.Prefix)('any', '/', beta_1.HandlerPriority.HIGHEST),
69
- __param(0, (0, beta_1.Context)()),
104
+ (0, interface_api_1.Prefix)("any", "/", interface_api_1.HandlerPriority.HIGHEST),
105
+ __param(0, (0, interface_api_1.Context)()),
70
106
  __metadata("design:type", Function),
71
107
  __metadata("design:paramtypes", [Object]),
72
- __metadata("design:returntype", void 0)
108
+ __metadata("design:returntype", Object)
73
109
  ], Cors.prototype, "cors", null);
74
110
  //# sourceMappingURL=cors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middlewares/cors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middlewares/cors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type * as net from "node:net";
2
+ import { type ServerConfig } from "./server-config";
3
+ export declare function resolveBoundPort(server: net.Server, fallbackPort: number): number;
4
+ export declare function listenServer(server: net.Server, config: ServerConfig, allowPortFallback: boolean): Promise<void>;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBoundPort = resolveBoundPort;
4
+ exports.listenServer = listenServer;
5
+ const logging_1 = require("@antelopejs/interface-core/logging");
6
+ const server_config_1 = require("./server-config");
7
+ const MAX_PORT_FALLBACK_OFFSET = 20;
8
+ function listenOnce(server, port, host) {
9
+ return new Promise((resolve, reject) => {
10
+ const onListening = () => {
11
+ cleanup();
12
+ resolve();
13
+ };
14
+ const onError = (error) => {
15
+ cleanup();
16
+ reject(error);
17
+ };
18
+ const cleanup = () => {
19
+ server.off("listening", onListening);
20
+ server.off("error", onError);
21
+ };
22
+ server.once("listening", onListening);
23
+ server.once("error", onError);
24
+ server.listen(port, host);
25
+ });
26
+ }
27
+ function isPortInUseError(error) {
28
+ return error?.code === "EADDRINUSE";
29
+ }
30
+ function resolveBoundPort(server, fallbackPort) {
31
+ const address = server.address();
32
+ if (address && typeof address === "object") {
33
+ return address.port;
34
+ }
35
+ return fallbackPort;
36
+ }
37
+ function buildCandidatePorts(requestedPort, allowPortFallback) {
38
+ if (!allowPortFallback || requestedPort === server_config_1.RANDOM_PORT) {
39
+ return [requestedPort];
40
+ }
41
+ const sequentialPorts = Array.from({ length: MAX_PORT_FALLBACK_OFFSET + 1 }, (_, offset) => requestedPort + offset);
42
+ return [...sequentialPorts, server_config_1.RANDOM_PORT];
43
+ }
44
+ async function listenServerWithFallback(server, config, allowPortFallback) {
45
+ const requestedPort = config.port ?? server_config_1.DEFAULT_HTTP_PORT;
46
+ const candidatePorts = buildCandidatePorts(requestedPort, allowPortFallback);
47
+ let portInUseError = new Error(`Unable to bind ${config.protocol} server on port ${requestedPort}`);
48
+ for (const candidatePort of candidatePorts) {
49
+ try {
50
+ await listenOnce(server, candidatePort, config.host);
51
+ return resolveBoundPort(server, candidatePort);
52
+ }
53
+ catch (error) {
54
+ if (!isPortInUseError(error)) {
55
+ throw error;
56
+ }
57
+ portInUseError = error;
58
+ }
59
+ }
60
+ throw portInUseError;
61
+ }
62
+ function logServerStarted(config, requestedPort, boundPort) {
63
+ const serverUrl = `${config.protocol}://${config.host ?? server_config_1.DEFAULT_HOST}:${boundPort}`;
64
+ if (boundPort === requestedPort || requestedPort === server_config_1.RANDOM_PORT) {
65
+ logging_1.Logging.Info(`Server started, listening on ${serverUrl}`);
66
+ return;
67
+ }
68
+ logging_1.Logging.Info(`Port ${requestedPort} in use, listening on ${serverUrl} instead`);
69
+ }
70
+ async function listenServer(server, config, allowPortFallback) {
71
+ if (server.listening) {
72
+ return;
73
+ }
74
+ const requestedPort = config.port ?? server_config_1.DEFAULT_HTTP_PORT;
75
+ const boundPort = await listenServerWithFallback(server, config, allowPortFallback);
76
+ config.port = boundPort;
77
+ logServerStarted(config, requestedPort, boundPort);
78
+ }
79
+ //# sourceMappingURL=port-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-binding.js","sourceRoot":"","sources":["../src/port-binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type * as http from "node:http";
2
+ import type * as https from "node:https";
3
+ import type { CorsConfig } from "@antelopejs/interface-api";
4
+ export type ServerProtocol = "http" | "https";
5
+ export type SocketProtocol = "ws" | "wss";
6
+ interface ServerNetworkConfig {
7
+ host?: string;
8
+ port?: number;
9
+ }
10
+ export interface HTTPConfig extends http.ServerOptions, ServerNetworkConfig {
11
+ protocol: "http";
12
+ }
13
+ export interface HTTPSConfig extends https.ServerOptions, ServerNetworkConfig {
14
+ protocol: "https";
15
+ }
16
+ export type ServerConfig = HTTPConfig | HTTPSConfig;
17
+ export interface Config {
18
+ servers?: ServerConfig[];
19
+ cors?: CorsConfig;
20
+ autoListen?: boolean;
21
+ strictPort?: boolean;
22
+ }
23
+ export declare const DEFAULT_HTTP_PORT = 80;
24
+ export declare const DEFAULT_HOST = "localhost";
25
+ export declare const RANDOM_PORT = 0;
26
+ export declare function resolveServers(config: Config): ServerConfig[];
27
+ export {};