@zeltjs/adapter-node 0.9.1-canary.5 → 0.10.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/README.md CHANGED
@@ -15,10 +15,41 @@ npm install @zeltjs/adapter-node @zeltjs/core
15
15
  ## Usage
16
16
 
17
17
  ```typescript
18
- import { serve } from '@zeltjs/adapter-node';
19
- import { createApp } from '@zeltjs/core';
18
+ import { createApp, http, Controller, Get } from '@zeltjs/core';
19
+ import { onNode } from '@zeltjs/adapter-node';
20
+
21
+ @Controller('/hello')
22
+ class HelloController {
23
+ @Get('/')
24
+ greet() {
25
+ return { message: 'Hello from Node.js!' };
26
+ }
27
+ }
28
+
29
+ const app = createApp([http({ controllers: [HelloController] })]);
30
+
31
+ const nodeApp = await onNode(app);
32
+ const server = await nodeApp.http.listen({ port: 3000 });
33
+ console.log(`Listening on port ${server.address.port}`);
34
+ ```
20
35
 
21
- const app = createApp({ controllers: [...] });
36
+ Each named `http()` feature gets its own namespace with an independent `listen()`, sharing the same runtime and services:
22
37
 
23
- serve(app, { port: 3000 });
38
+ ```typescript
39
+ @Controller('/admin')
40
+ class AdminController {
41
+ @Get('/')
42
+ status() {
43
+ return { admin: true };
44
+ }
45
+ }
46
+
47
+ const app = createApp([
48
+ http({ controllers: [HelloController] }),
49
+ http({ name: 'admin', controllers: [AdminController] }),
50
+ ]);
51
+
52
+ const nodeApp = await onNode(app);
53
+ await nodeApp.http.listen(3000);
54
+ await nodeApp.admin.listen(8080);
24
55
  ```
package/dist/index.cjs CHANGED
@@ -1,6 +1,37 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let _hono_node_server = require("@hono/node-server");
3
3
  let _zeltjs_core = require("@zeltjs/core");
4
+ //#region src/listen.lib.ts
5
+ const closeServer = (server) => new Promise((resolve, reject) => {
6
+ server.close((err) => err ? reject(err) : resolve());
7
+ });
8
+ /** @throws {Error} propagates the server's bind error (e.g. EADDRINUSE) instead of hanging */ const createListenForHttp = (appFetch, registerShutdown) => {
9
+ return async (portOrOptions) => {
10
+ const listenOptions = typeof portOrOptions === "number" ? { port: portOrOptions } : portOrOptions ?? {};
11
+ const port = listenOptions.port ?? 3e3;
12
+ const hostname = listenOptions.hostname ?? "0.0.0.0";
13
+ let server;
14
+ return {
15
+ address: await new Promise((resolve, reject) => {
16
+ const onError = (err) => reject(err);
17
+ server = (0, _hono_node_server.serve)({
18
+ fetch: appFetch,
19
+ port,
20
+ hostname
21
+ }, (info) => {
22
+ server.off("error", onError);
23
+ resolve({
24
+ port: info.port,
25
+ address: info.address
26
+ });
27
+ });
28
+ server.once("error", onError);
29
+ }),
30
+ shutdown: registerShutdown(() => closeServer(server))
31
+ };
32
+ };
33
+ };
34
+ //#endregion
4
35
  //#region src/node-cli.config.ts
5
36
  function _ts_decorate$1(decorators, target, key, desc) {
6
37
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -45,32 +76,6 @@ var ProcessEnvAdaptor = class extends _zeltjs_core.EnvAdaptor {
45
76
  ProcessEnvAdaptor = _ts_decorate([_zeltjs_core.Config], ProcessEnvAdaptor);
46
77
  //#endregion
47
78
  //#region src/on-node.ts
48
- const closeServer = (server) => new Promise((resolve, reject) => {
49
- server.close((err) => err ? reject(err) : resolve());
50
- });
51
- const createListenForHttp = (appFetch, registerShutdown) => {
52
- return async (portOrOptions) => {
53
- const listenOptions = typeof portOrOptions === "number" ? { port: portOrOptions } : portOrOptions ?? {};
54
- const port = listenOptions.port ?? 3e3;
55
- const hostname = listenOptions.hostname ?? "0.0.0.0";
56
- let server;
57
- const serverReady = new Promise((resolve) => {
58
- server = (0, _hono_node_server.serve)({
59
- fetch: appFetch,
60
- port,
61
- hostname
62
- }, (info) => resolve({
63
- port: info.port,
64
- address: info.address
65
- }));
66
- });
67
- const shutdown = registerShutdown(() => closeServer(server));
68
- return {
69
- address: await serverReady,
70
- shutdown
71
- };
72
- };
73
- };
74
79
  const getArgs = () => globalThis.process.argv.slice(2);
75
80
  const createNodeApp = (readyApp, shutdown, args) => {
76
81
  const nodeApp = {
@@ -148,5 +153,6 @@ Object.defineProperty(exports, "createAdaptorServer", {
148
153
  return _hono_node_server.createAdaptorServer;
149
154
  }
150
155
  });
156
+ exports.createListenForHttp = createListenForHttp;
151
157
  exports.onNode = onNode;
152
158
  exports.serve = serveApp;
package/dist/index.d.cts CHANGED
@@ -1,17 +1,7 @@
1
1
  import { ServerType, createAdaptorServer } from "@hono/node-server";
2
2
  import { CliConfig, ConfigClass, ConfiguredFeature, EnvAdaptor, FeatureApp, FeatureReadyCapabilities, HttpFeature, RuntimeApp, Signal, SignalHandler } from "@zeltjs/core";
3
3
 
4
- //#region src/node-cli.config.d.ts
5
- declare class NodeCliConfig extends CliConfig {
6
- cwd(): string;
7
- argv(): readonly string[];
8
- exit(code: number): never;
9
- setExitCode(code: number): void;
10
- onSignal(signal: Signal, handler: SignalHandler): void;
11
- offSignal(signal: Signal, handler: SignalHandler): void;
12
- }
13
- //#endregion
14
- //#region src/on-node.d.ts
4
+ //#region src/listen.lib.d.ts
15
5
  type ListenOptions = {
16
6
  readonly port?: number;
17
7
  readonly hostname?: string;
@@ -23,6 +13,20 @@ type ServerHandle = {
23
13
  };
24
14
  readonly shutdown: () => Promise<void>;
25
15
  };
16
+ /** @throws {Error} propagates the server's bind error (e.g. EADDRINUSE) instead of hanging */
17
+ declare const createListenForHttp: (appFetch: (request: Request) => Promise<Response>, registerShutdown: (callback: () => Promise<void>) => () => Promise<void>) => ((portOrOptions?: number | ListenOptions) => Promise<ServerHandle>);
18
+ //#endregion
19
+ //#region src/node-cli.config.d.ts
20
+ declare class NodeCliConfig extends CliConfig {
21
+ cwd(): string;
22
+ argv(): readonly string[];
23
+ exit(code: number): never;
24
+ setExitCode(code: number): void;
25
+ onSignal(signal: Signal, handler: SignalHandler): void;
26
+ offSignal(signal: Signal, handler: SignalHandler): void;
27
+ }
28
+ //#endregion
29
+ //#region src/on-node.d.ts
26
30
  type NodeAppOptions = {
27
31
  readonly configs?: readonly ConfigClass<object>[];
28
32
  readonly warmup?: boolean;
@@ -58,5 +62,5 @@ type AppLike = {
58
62
  };
59
63
  declare const serveApp: (app: AppLike, optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void), maybeCallback?: (info: AddressInfo) => void) => ServerType;
60
64
  //#endregion
61
- export { type AddressInfo, NodeCliConfig, ProcessEnvAdaptor, type ServeOptions, type ServerHandle, createAdaptorServer, onNode, serveApp as serve };
65
+ export { type AddressInfo, type ListenOptions, NodeCliConfig, ProcessEnvAdaptor, type ServeOptions, type ServerHandle, createAdaptorServer, createListenForHttp, onNode, serveApp as serve };
62
66
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;cAIa,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCXzC,aAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGf,cAAA;EAAA,SACD,OAAA,YAAmB,WAAA;EAAA,SACnB,MAAA;AAAA;AAAA,KAKN,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGtB,eAAA;EAAA,SACM,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAGlE,uBAAA,kBAAyC,iBAAA,IAC5C,wBAAA,CAAyB,QAAA,KACtB,QAAA,SAAiB,WAAA,WAAsB,eAAA;AAAA,KAEvC,0BAAA,oBAA8C,iBAAA,8BAC3B,CAAA,YAAa,QAAA,UAAkB,uBAAA,CAAwB,QAAA;AAAA,KAK1E,kBAAA,oBAAsC,iBAAA,MAAuB,UAAA,CAAW,CAAA,IAC3E,sBAAA,GACA,0BAAA,CAA2B,CAAA;AAAA,iBA+Db,MAAA,0BAAgC,iBAAA,GAAA,CAC9C,GAAA,EAAK,UAAA,CAAW,CAAA,GAChB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,kBAAA,CAAmB,CAAA;;;cCnHjB,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/listen.lib.ts","../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;KAGY,aAAA;EAAA,SACD,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;;cASd,mBAAA,GACX,QAAA,GAAW,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA,GACxC,gBAAA,GAAmB,QAAA,QAAgB,OAAA,iBAAwB,OAAA,aACxD,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;;;cClB3C,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCTlC,cAAA;EAAA,SACD,OAAA,YAAmB,WAAA;EAAA,SACnB,MAAA;AAAA;AAAA,KAKN,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGtB,eAAA;EAAA,SACM,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAGlE,uBAAA,kBAAyC,iBAAA,IAC5C,wBAAA,CAAyB,QAAA,KACtB,QAAA,SAAiB,WAAA,WAAsB,eAAA;AAAA,KAEvC,0BAAA,oBAA8C,iBAAA,8BAC3B,CAAA,YAAa,QAAA,UAAkB,uBAAA,CAAwB,QAAA;AAAA,KAK1E,kBAAA,oBAAsC,iBAAA,MAAuB,UAAA,CAAW,CAAA,IAC3E,sBAAA,GACA,0BAAA,CAA2B,CAAA;AAAA,iBAiCb,MAAA,0BAAgC,iBAAA,GAAA,CAC9C,GAAA,EAAK,UAAA,CAAW,CAAA,GAChB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,kBAAA,CAAmB,CAAA;;;cC7EjB,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
package/dist/index.d.ts CHANGED
@@ -1,17 +1,7 @@
1
1
  import { ServerType, createAdaptorServer } from "@hono/node-server";
2
2
  import { CliConfig, ConfigClass, ConfiguredFeature, EnvAdaptor, FeatureApp, FeatureReadyCapabilities, HttpFeature, RuntimeApp, Signal, SignalHandler } from "@zeltjs/core";
3
3
 
4
- //#region src/node-cli.config.d.ts
5
- declare class NodeCliConfig extends CliConfig {
6
- cwd(): string;
7
- argv(): readonly string[];
8
- exit(code: number): never;
9
- setExitCode(code: number): void;
10
- onSignal(signal: Signal, handler: SignalHandler): void;
11
- offSignal(signal: Signal, handler: SignalHandler): void;
12
- }
13
- //#endregion
14
- //#region src/on-node.d.ts
4
+ //#region src/listen.lib.d.ts
15
5
  type ListenOptions = {
16
6
  readonly port?: number;
17
7
  readonly hostname?: string;
@@ -23,6 +13,20 @@ type ServerHandle = {
23
13
  };
24
14
  readonly shutdown: () => Promise<void>;
25
15
  };
16
+ /** @throws {Error} propagates the server's bind error (e.g. EADDRINUSE) instead of hanging */
17
+ declare const createListenForHttp: (appFetch: (request: Request) => Promise<Response>, registerShutdown: (callback: () => Promise<void>) => () => Promise<void>) => ((portOrOptions?: number | ListenOptions) => Promise<ServerHandle>);
18
+ //#endregion
19
+ //#region src/node-cli.config.d.ts
20
+ declare class NodeCliConfig extends CliConfig {
21
+ cwd(): string;
22
+ argv(): readonly string[];
23
+ exit(code: number): never;
24
+ setExitCode(code: number): void;
25
+ onSignal(signal: Signal, handler: SignalHandler): void;
26
+ offSignal(signal: Signal, handler: SignalHandler): void;
27
+ }
28
+ //#endregion
29
+ //#region src/on-node.d.ts
26
30
  type NodeAppOptions = {
27
31
  readonly configs?: readonly ConfigClass<object>[];
28
32
  readonly warmup?: boolean;
@@ -58,5 +62,5 @@ type AppLike = {
58
62
  };
59
63
  declare const serveApp: (app: AppLike, optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void), maybeCallback?: (info: AddressInfo) => void) => ServerType;
60
64
  //#endregion
61
- export { type AddressInfo, NodeCliConfig, ProcessEnvAdaptor, type ServeOptions, type ServerHandle, createAdaptorServer, onNode, serveApp as serve };
65
+ export { type AddressInfo, type ListenOptions, NodeCliConfig, ProcessEnvAdaptor, type ServeOptions, type ServerHandle, createAdaptorServer, createListenForHttp, onNode, serveApp as serve };
62
66
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;cAIa,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCXzC,aAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGf,cAAA;EAAA,SACD,OAAA,YAAmB,WAAA;EAAA,SACnB,MAAA;AAAA;AAAA,KAKN,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGtB,eAAA;EAAA,SACM,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAGlE,uBAAA,mBAAyC,iBAAA,IAC5C,wBAAA,CAAyB,SAAA,KACtB,SAAA,SAAiB,WAAA,WAAsB,eAAA;AAAA,KAEvC,0BAAA,oBAA8C,iBAAA,8BAC3B,CAAA,YAAa,QAAA,UAAkB,uBAAA,CAAwB,QAAA;AAAA,KAK1E,kBAAA,oBAAsC,iBAAA,MAAuB,UAAA,CAAW,CAAA,IAC3E,sBAAA,GACA,0BAAA,CAA2B,CAAA;AAAA,iBA+Db,MAAA,0BAAgC,iBAAA,GAAA,CAC9C,GAAA,EAAK,UAAA,CAAW,CAAA,GAChB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,kBAAA,CAAmB,CAAA;;;cCnHjB,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/listen.lib.ts","../src/node-cli.config.ts","../src/on-node.ts","../src/process-env.adaptor.ts","../src/serve.lib.ts"],"mappings":";;;;KAGY,aAAA;EAAA,SACD,IAAA;EAAA,SACA,QAAA;AAAA;AAAA,KAGC,YAAA;EAAA,SACD,OAAA;IAAW,IAAA;IAAc,OAAA;EAAA;EAAA,SACzB,QAAA,QAAgB,OAAA;AAAA;;cASd,mBAAA,GACX,QAAA,GAAW,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA,GACxC,gBAAA,GAAmB,QAAA,QAAgB,OAAA,iBAAwB,OAAA,aACxD,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;;;cClB3C,aAAA,SAAsB,SAAA;EACxB,GAAA,CAAA;EAIA,IAAA,CAAA;EAIA,IAAA,CAAK,IAAA;EAIL,WAAA,CAAY,IAAA;EAIZ,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;EAIlC,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,aAAA;AAAA;;;KCTlC,cAAA;EAAA,SACD,OAAA,YAAmB,WAAA;EAAA,SACnB,MAAA;AAAA;AAAA,KAKN,sBAAA;EAAA,SACM,IAAA;EAAA,SACA,QAAA,QAAgB,OAAA;AAAA;AAAA,KAGtB,eAAA;EAAA,SACM,MAAA,GAAS,aAAA,YAAyB,aAAA,KAAkB,OAAA,CAAQ,YAAA;AAAA;AAAA,KAGlE,uBAAA,mBAAyC,iBAAA,IAC5C,wBAAA,CAAyB,SAAA,KACtB,SAAA,SAAiB,WAAA,WAAsB,eAAA;AAAA,KAEvC,0BAAA,oBAA8C,iBAAA,8BAC3B,CAAA,YAAa,QAAA,UAAkB,uBAAA,CAAwB,QAAA;AAAA,KAK1E,kBAAA,oBAAsC,iBAAA,MAAuB,UAAA,CAAW,CAAA,IAC3E,sBAAA,GACA,0BAAA,CAA2B,CAAA;AAAA,iBAiCb,MAAA,0BAAgC,iBAAA,GAAA,CAC9C,GAAA,EAAK,UAAA,CAAW,CAAA,GAChB,OAAA,GAAU,cAAA,GACT,OAAA,CAAQ,kBAAA,CAAmB,CAAA;;;cC7EjB,iBAAA,SAA0B,UAAA;EAC5B,GAAA,CAAI,GAAA;AAAA;;;KCDH,YAAA;EACV,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,IAAA;EACA,OAAA;AAAA;AAAA,KAGG,OAAA;EACH,KAAA,GAAQ,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA;AAAA,cAa1B,QAAA,GACX,GAAA,EAAK,OAAA,EACL,iBAAA,GAAoB,YAAA,KAAiB,IAAA,EAAM,WAAA,YAC3C,aAAA,IAAiB,IAAA,EAAM,WAAA,cACtB,UAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,36 @@
1
1
  import { createAdaptorServer, serve } from "@hono/node-server";
2
2
  import { CliConfig, Config, EnvAdaptor, HttpFeature } from "@zeltjs/core";
3
+ //#region src/listen.lib.ts
4
+ const closeServer = (server) => new Promise((resolve, reject) => {
5
+ server.close((err) => err ? reject(err) : resolve());
6
+ });
7
+ /** @throws {Error} propagates the server's bind error (e.g. EADDRINUSE) instead of hanging */ const createListenForHttp = (appFetch, registerShutdown) => {
8
+ return async (portOrOptions) => {
9
+ const listenOptions = typeof portOrOptions === "number" ? { port: portOrOptions } : portOrOptions ?? {};
10
+ const port = listenOptions.port ?? 3e3;
11
+ const hostname = listenOptions.hostname ?? "0.0.0.0";
12
+ let server;
13
+ return {
14
+ address: await new Promise((resolve, reject) => {
15
+ const onError = (err) => reject(err);
16
+ server = serve({
17
+ fetch: appFetch,
18
+ port,
19
+ hostname
20
+ }, (info) => {
21
+ server.off("error", onError);
22
+ resolve({
23
+ port: info.port,
24
+ address: info.address
25
+ });
26
+ });
27
+ server.once("error", onError);
28
+ }),
29
+ shutdown: registerShutdown(() => closeServer(server))
30
+ };
31
+ };
32
+ };
33
+ //#endregion
3
34
  //#region src/node-cli.config.ts
4
35
  function _ts_decorate$1(decorators, target, key, desc) {
5
36
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -44,32 +75,6 @@ var ProcessEnvAdaptor = class extends EnvAdaptor {
44
75
  ProcessEnvAdaptor = _ts_decorate([Config], ProcessEnvAdaptor);
45
76
  //#endregion
46
77
  //#region src/on-node.ts
47
- const closeServer = (server) => new Promise((resolve, reject) => {
48
- server.close((err) => err ? reject(err) : resolve());
49
- });
50
- const createListenForHttp = (appFetch, registerShutdown) => {
51
- return async (portOrOptions) => {
52
- const listenOptions = typeof portOrOptions === "number" ? { port: portOrOptions } : portOrOptions ?? {};
53
- const port = listenOptions.port ?? 3e3;
54
- const hostname = listenOptions.hostname ?? "0.0.0.0";
55
- let server;
56
- const serverReady = new Promise((resolve) => {
57
- server = serve({
58
- fetch: appFetch,
59
- port,
60
- hostname
61
- }, (info) => resolve({
62
- port: info.port,
63
- address: info.address
64
- }));
65
- });
66
- const shutdown = registerShutdown(() => closeServer(server));
67
- return {
68
- address: await serverReady,
69
- shutdown
70
- };
71
- };
72
- };
73
78
  const getArgs = () => globalThis.process.argv.slice(2);
74
79
  const createNodeApp = (readyApp, shutdown, args) => {
75
80
  const nodeApp = {
@@ -129,6 +134,6 @@ const serveApp = (app, optionsOrCallback, maybeCallback) => {
129
134
  }, callback);
130
135
  };
131
136
  //#endregion
132
- export { NodeCliConfig, ProcessEnvAdaptor, createAdaptorServer, onNode, serveApp as serve };
137
+ export { NodeCliConfig, ProcessEnvAdaptor, createAdaptorServer, createListenForHttp, onNode, serveApp as serve };
133
138
 
134
139
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["CliConfig","Config","NodeCliConfig","cwd","process","argv","exit","code","setExitCode","exitCode","onSignal","signal","handler","on","offSignal","off","Config","EnvAdaptor","ProcessEnvAdaptor","get","key","process","env","serve","HttpFeature","NodeCliConfig","ProcessEnvAdaptor","closeServer","server","Promise","resolve","reject","close","err","createListenForHttp","appFetch","registerShutdown","portOrOptions","listenOptions","port","hostname","serverReady","fetch","info","address","shutdown","getArgs","globalThis","process","argv","slice","createNodeApp","readyApp","args","base","nodeApp","entry","getFeatureEntries","Object","defineProperty","key","value","capabilities","listen","callback","feature","configurable","enumerable","onNode","app","options","createRuntime","configs","undefined","fallbackConfigs","warmup","cliConfig","get","shuttingDown","detachSignals","offSignal","gracefulShutdown","catch","onSignal","serve","buildServeOptions","optionsOrCallback","extractCallback","maybeCallback","serveApp","app","options","callback","fetch","port","hostname"],"sources":["../src/node-cli.config.ts","../src/process-env.adaptor.ts","../src/on-node.ts","../src/serve.lib.ts"],"sourcesContent":["import type { Signal, SignalHandler } from '@zeltjs/core';\nimport { CliConfig, Config } from '@zeltjs/core';\n\n@Config\nexport class NodeCliConfig extends CliConfig {\n override cwd(): string {\n return process.cwd();\n }\n\n override argv(): readonly string[] {\n return process.argv;\n }\n\n override exit(code: number): never {\n process.exit(code);\n }\n\n override setExitCode(code: number): void {\n process.exitCode = code;\n }\n\n override onSignal(signal: Signal, handler: SignalHandler): void {\n process.on(signal, handler);\n }\n\n override offSignal(signal: Signal, handler: SignalHandler): void {\n process.off(signal, handler);\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ProcessEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\nimport type {\n ConfigClass,\n ConfiguredFeature,\n FeatureApp,\n FeatureReadyCapabilities,\n RuntimeApp,\n} from '@zeltjs/core';\nimport { HttpFeature } from '@zeltjs/core';\n\nimport { NodeCliConfig } from './node-cli.config';\nimport { ProcessEnvAdaptor } from './process-env.adaptor';\n\ntype ListenOptions = {\n readonly port?: number;\n readonly hostname?: string;\n};\n\nexport type ServerHandle = {\n readonly address: { port: number; address: string };\n readonly shutdown: () => Promise<void>;\n};\n\nexport type NodeAppOptions = {\n readonly configs?: readonly ConfigClass<object>[];\n readonly warmup?: boolean;\n};\n\nexport type { ExecResult } from '@zeltjs/core';\n\ntype EnvironmentNodeAppPart = {\n readonly args: readonly string[];\n readonly shutdown: () => Promise<void>;\n};\n\ntype HttpNodeAppPart = {\n readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;\n};\n\ntype NodeFeatureCapabilities<TFeature extends ConfiguredFeature> =\n FeatureReadyCapabilities<TFeature> &\n (TFeature extends HttpFeature<string> ? HttpNodeAppPart : unknown);\n\ntype NodeNamespacedCapabilities<F extends readonly ConfiguredFeature[]> = {\n readonly [TFeature in F[number] as TFeature['key']]: NodeFeatureCapabilities<TFeature>;\n};\n\nexport type NodeApp = RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentNodeAppPart;\n\ntype NodeAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> &\n EnvironmentNodeAppPart &\n NodeNamespacedCapabilities<F>;\n\nconst closeServer = (server: ServerType): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n\nconst createListenForHttp = (\n appFetch: (request: Request) => Promise<Response>,\n registerShutdown: (callback: () => Promise<void>) => () => Promise<void>,\n): ((portOrOptions?: number | ListenOptions) => Promise<ServerHandle>) => {\n return async (portOrOptions?: number | ListenOptions): Promise<ServerHandle> => {\n const listenOptions: ListenOptions =\n typeof portOrOptions === 'number' ? { port: portOrOptions } : (portOrOptions ?? {});\n\n const port = listenOptions.port ?? 3000;\n const hostname = listenOptions.hostname ?? '0.0.0.0';\n\n let server!: ServerType;\n const serverReady = new Promise<{ port: number; address: string }>((resolve) => {\n server = serve({ fetch: appFetch, port, hostname }, (info) =>\n resolve({ port: info.port, address: info.address }),\n );\n });\n const shutdown = registerShutdown(() => closeServer(server));\n\n const address = await serverReady;\n\n return { address, shutdown };\n };\n};\n\nconst getArgs = (): readonly string[] => globalThis.process.argv.slice(2);\n\nconst createNodeApp = (\n readyApp: RuntimeApp<readonly ConfiguredFeature[]>,\n shutdown: () => Promise<void>,\n args: readonly string[],\n): NodeApp => {\n const base: RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentNodeAppPart = {\n ...readyApp,\n args,\n shutdown,\n };\n\n const nodeApp: NodeApp = { ...base };\n\n for (const entry of readyApp.getFeatureEntries(HttpFeature)) {\n Object.defineProperty(nodeApp, entry.key, {\n value: {\n ...entry.capabilities,\n listen: createListenForHttp(entry.capabilities.fetch, (callback) =>\n entry.feature.registerShutdown(callback),\n ),\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n return nodeApp;\n};\n\nexport function onNode<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options?: NodeAppOptions,\n): Promise<NodeAppForFeatures<F>>;\n\n/** @throws {ZeltLifecycleStateError} */\nexport async function onNode<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options: NodeAppOptions = {},\n): Promise<NodeApp> {\n const readyApp = await app.createRuntime({\n ...(options.configs === undefined ? {} : { configs: options.configs }),\n fallbackConfigs: [NodeCliConfig, ProcessEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n const cliConfig = await readyApp.get(NodeCliConfig);\n\n let shuttingDown = false;\n const detachSignals = (): void => {\n cliConfig.offSignal('SIGINT', gracefulShutdown);\n cliConfig.offSignal('SIGTERM', gracefulShutdown);\n };\n\n const shutdown = async (): Promise<void> => {\n if (shuttingDown) return;\n shuttingDown = true;\n try {\n await readyApp.shutdown();\n } finally {\n detachSignals();\n }\n };\n\n const gracefulShutdown = (): void => {\n void shutdown().catch(() => {});\n };\n\n cliConfig.onSignal('SIGINT', gracefulShutdown);\n cliConfig.onSignal('SIGTERM', gracefulShutdown);\n\n const args = getArgs();\n\n return createNodeApp(readyApp, shutdown, args);\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\n\nexport type ServeOptions = {\n port?: number;\n hostname?: string;\n};\n\nexport type AddressInfo = {\n port: number;\n address: string;\n};\n\ntype AppLike = {\n fetch: (request: Request) => Promise<Response>;\n};\n\nconst buildServeOptions = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n): ServeOptions => (typeof optionsOrCallback === 'function' ? {} : (optionsOrCallback ?? {}));\n\nconst extractCallback = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n maybeCallback: ((info: AddressInfo) => void) | undefined,\n): ((info: AddressInfo) => void) | undefined =>\n typeof optionsOrCallback === 'function' ? optionsOrCallback : maybeCallback;\n\nexport const serveApp = (\n app: AppLike,\n optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void),\n maybeCallback?: (info: AddressInfo) => void,\n): ServerType => {\n const options = buildServeOptions(optionsOrCallback);\n const callback = extractCallback(optionsOrCallback, maybeCallback);\n\n return serve(\n {\n fetch: app.fetch,\n port: options.port ?? 3000,\n hostname: options.hostname ?? '0.0.0.0',\n },\n callback,\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["serve","closeServer","server","Promise","resolve","reject","close","err","createListenForHttp","appFetch","registerShutdown","portOrOptions","listenOptions","port","hostname","serverReady","onError","fetch","info","off","address","once","shutdown","CliConfig","Config","NodeCliConfig","cwd","process","argv","exit","code","setExitCode","exitCode","onSignal","signal","handler","on","offSignal","off","Config","EnvAdaptor","ProcessEnvAdaptor","get","key","process","env","HttpFeature","createListenForHttp","NodeCliConfig","ProcessEnvAdaptor","getArgs","globalThis","process","argv","slice","createNodeApp","readyApp","shutdown","args","base","nodeApp","entry","getFeatureEntries","Object","defineProperty","key","value","capabilities","listen","fetch","callback","feature","registerShutdown","configurable","enumerable","onNode","app","options","createRuntime","configs","undefined","fallbackConfigs","warmup","cliConfig","get","shuttingDown","detachSignals","offSignal","gracefulShutdown","catch","onSignal","serve","buildServeOptions","optionsOrCallback","extractCallback","maybeCallback","serveApp","app","options","callback","fetch","port","hostname"],"sources":["../src/listen.lib.ts","../src/node-cli.config.ts","../src/process-env.adaptor.ts","../src/on-node.ts","../src/serve.lib.ts"],"sourcesContent":["import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\n\nexport type ListenOptions = {\n readonly port?: number;\n readonly hostname?: string;\n};\n\nexport type ServerHandle = {\n readonly address: { port: number; address: string };\n readonly shutdown: () => Promise<void>;\n};\n\nconst closeServer = (server: ServerType): Promise<void> =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n });\n\n/** @throws {Error} propagates the server's bind error (e.g. EADDRINUSE) instead of hanging */\nexport const createListenForHttp = (\n appFetch: (request: Request) => Promise<Response>,\n registerShutdown: (callback: () => Promise<void>) => () => Promise<void>,\n): ((portOrOptions?: number | ListenOptions) => Promise<ServerHandle>) => {\n return async (portOrOptions?: number | ListenOptions): Promise<ServerHandle> => {\n const listenOptions: ListenOptions =\n typeof portOrOptions === 'number' ? { port: portOrOptions } : (portOrOptions ?? {});\n\n const port = listenOptions.port ?? 3000;\n const hostname = listenOptions.hostname ?? '0.0.0.0';\n\n let server!: ServerType;\n const serverReady = new Promise<{ port: number; address: string }>((resolve, reject) => {\n const onError = (err: Error): void => reject(err);\n server = serve({ fetch: appFetch, port, hostname }, (info) => {\n server.off('error', onError);\n resolve({ port: info.port, address: info.address });\n });\n server.once('error', onError);\n });\n\n const address = await serverReady;\n const shutdown = registerShutdown(() => closeServer(server));\n\n return { address, shutdown };\n };\n};\n","import type { Signal, SignalHandler } from '@zeltjs/core';\nimport { CliConfig, Config } from '@zeltjs/core';\n\n@Config\nexport class NodeCliConfig extends CliConfig {\n override cwd(): string {\n return process.cwd();\n }\n\n override argv(): readonly string[] {\n return process.argv;\n }\n\n override exit(code: number): never {\n process.exit(code);\n }\n\n override setExitCode(code: number): void {\n process.exitCode = code;\n }\n\n override onSignal(signal: Signal, handler: SignalHandler): void {\n process.on(signal, handler);\n }\n\n override offSignal(signal: Signal, handler: SignalHandler): void {\n process.off(signal, handler);\n }\n}\n","import { Config, EnvAdaptor } from '@zeltjs/core';\n\n@Config\nexport class ProcessEnvAdaptor extends EnvAdaptor {\n override get(key: string): string | undefined {\n return process.env[key];\n }\n}\n","import type {\n ConfigClass,\n ConfiguredFeature,\n FeatureApp,\n FeatureReadyCapabilities,\n RuntimeApp,\n} from '@zeltjs/core';\nimport { HttpFeature } from '@zeltjs/core';\n\nimport type { ListenOptions, ServerHandle } from './listen.lib';\nimport { createListenForHttp } from './listen.lib';\nimport { NodeCliConfig } from './node-cli.config';\nimport { ProcessEnvAdaptor } from './process-env.adaptor';\n\nexport type { ServerHandle } from './listen.lib';\n\nexport type NodeAppOptions = {\n readonly configs?: readonly ConfigClass<object>[];\n readonly warmup?: boolean;\n};\n\nexport type { ExecResult } from '@zeltjs/core';\n\ntype EnvironmentNodeAppPart = {\n readonly args: readonly string[];\n readonly shutdown: () => Promise<void>;\n};\n\ntype HttpNodeAppPart = {\n readonly listen: (portOrOptions?: number | ListenOptions) => Promise<ServerHandle>;\n};\n\ntype NodeFeatureCapabilities<TFeature extends ConfiguredFeature> =\n FeatureReadyCapabilities<TFeature> &\n (TFeature extends HttpFeature<string> ? HttpNodeAppPart : unknown);\n\ntype NodeNamespacedCapabilities<F extends readonly ConfiguredFeature[]> = {\n readonly [TFeature in F[number] as TFeature['key']]: NodeFeatureCapabilities<TFeature>;\n};\n\nexport type NodeApp = RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentNodeAppPart;\n\ntype NodeAppForFeatures<F extends readonly ConfiguredFeature[]> = RuntimeApp<F> &\n EnvironmentNodeAppPart &\n NodeNamespacedCapabilities<F>;\n\nconst getArgs = (): readonly string[] => globalThis.process.argv.slice(2);\n\nconst createNodeApp = (\n readyApp: RuntimeApp<readonly ConfiguredFeature[]>,\n shutdown: () => Promise<void>,\n args: readonly string[],\n): NodeApp => {\n const base: RuntimeApp<readonly ConfiguredFeature[]> & EnvironmentNodeAppPart = {\n ...readyApp,\n args,\n shutdown,\n };\n\n const nodeApp: NodeApp = { ...base };\n\n for (const entry of readyApp.getFeatureEntries(HttpFeature)) {\n Object.defineProperty(nodeApp, entry.key, {\n value: {\n ...entry.capabilities,\n listen: createListenForHttp(entry.capabilities.fetch, (callback) =>\n entry.feature.registerShutdown(callback),\n ),\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n return nodeApp;\n};\n\nexport function onNode<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options?: NodeAppOptions,\n): Promise<NodeAppForFeatures<F>>;\n\n/** @throws {ZeltLifecycleStateError} */\nexport async function onNode<const F extends readonly ConfiguredFeature[]>(\n app: FeatureApp<F>,\n options: NodeAppOptions = {},\n): Promise<NodeApp> {\n const readyApp = await app.createRuntime({\n ...(options.configs === undefined ? {} : { configs: options.configs }),\n fallbackConfigs: [NodeCliConfig, ProcessEnvAdaptor],\n warmup: options.warmup ?? true,\n });\n\n const cliConfig = await readyApp.get(NodeCliConfig);\n\n let shuttingDown = false;\n const detachSignals = (): void => {\n cliConfig.offSignal('SIGINT', gracefulShutdown);\n cliConfig.offSignal('SIGTERM', gracefulShutdown);\n };\n\n const shutdown = async (): Promise<void> => {\n if (shuttingDown) return;\n shuttingDown = true;\n try {\n await readyApp.shutdown();\n } finally {\n detachSignals();\n }\n };\n\n const gracefulShutdown = (): void => {\n void shutdown().catch(() => {});\n };\n\n cliConfig.onSignal('SIGINT', gracefulShutdown);\n cliConfig.onSignal('SIGTERM', gracefulShutdown);\n\n const args = getArgs();\n\n return createNodeApp(readyApp, shutdown, args);\n}\n","import type { ServerType } from '@hono/node-server';\nimport { serve } from '@hono/node-server';\n\nexport type ServeOptions = {\n port?: number;\n hostname?: string;\n};\n\nexport type AddressInfo = {\n port: number;\n address: string;\n};\n\ntype AppLike = {\n fetch: (request: Request) => Promise<Response>;\n};\n\nconst buildServeOptions = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n): ServeOptions => (typeof optionsOrCallback === 'function' ? {} : (optionsOrCallback ?? {}));\n\nconst extractCallback = (\n optionsOrCallback: ServeOptions | ((info: AddressInfo) => void) | undefined,\n maybeCallback: ((info: AddressInfo) => void) | undefined,\n): ((info: AddressInfo) => void) | undefined =>\n typeof optionsOrCallback === 'function' ? optionsOrCallback : maybeCallback;\n\nexport const serveApp = (\n app: AppLike,\n optionsOrCallback?: ServeOptions | ((info: AddressInfo) => void),\n maybeCallback?: (info: AddressInfo) => void,\n): ServerType => {\n const options = buildServeOptions(optionsOrCallback);\n const callback = extractCallback(optionsOrCallback, maybeCallback);\n\n return serve(\n {\n fetch: app.fetch,\n port: options.port ?? 3000,\n hostname: options.hostname ?? '0.0.0.0',\n },\n callback,\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeltjs/adapter-node",
3
- "version": "0.9.1-canary.5",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -30,11 +30,11 @@
30
30
  "@hono/node-server": "2.0.1"
31
31
  },
32
32
  "peerDependencies": {
33
- "@zeltjs/core": "0.9.1-canary.5"
33
+ "@zeltjs/core": "0.10.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "22.19.17",
37
- "@zeltjs/core": "0.9.1-canary.5"
37
+ "@zeltjs/core": "0.10.0"
38
38
  },
39
39
  "volta": {
40
40
  "extends": "../../package.json"