@ac-kit/node 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +7 -2
  3. package/dist/error/process-exit-error.d.ts +16 -3
  4. package/dist/error/process-exit-error.d.ts.map +1 -1
  5. package/dist/error/process-exit-error.js +51 -7
  6. package/dist/error/process-exit-error.js.map +1 -1
  7. package/dist/fs/path-escape-error.d.ts +20 -0
  8. package/dist/fs/path-escape-error.d.ts.map +1 -0
  9. package/dist/fs/path-escape-error.js +23 -0
  10. package/dist/fs/path-escape-error.js.map +1 -0
  11. package/dist/fs/path-within.d.ts +121 -0
  12. package/dist/fs/path-within.d.ts.map +1 -0
  13. package/dist/fs/path-within.js +196 -0
  14. package/dist/fs/path-within.js.map +1 -0
  15. package/dist/index.d.ts +9 -2
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +9 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/net/connection-closed-error.d.ts +12 -0
  20. package/dist/net/connection-closed-error.d.ts.map +1 -0
  21. package/dist/net/connection-closed-error.js +15 -0
  22. package/dist/net/connection-closed-error.js.map +1 -0
  23. package/dist/net/dgram-socket.d.ts +4 -3
  24. package/dist/net/dgram-socket.d.ts.map +1 -1
  25. package/dist/net/dgram-socket.js +38 -38
  26. package/dist/net/dgram-socket.js.map +1 -1
  27. package/dist/net/inet-address.d.ts +20 -0
  28. package/dist/net/inet-address.d.ts.map +1 -0
  29. package/dist/net/inet-address.js +42 -0
  30. package/dist/net/inet-address.js.map +1 -0
  31. package/dist/net/inet-endpoint.d.ts +7 -0
  32. package/dist/net/inet-endpoint.d.ts.map +1 -0
  33. package/dist/net/inet-endpoint.js +2 -0
  34. package/dist/net/inet-endpoint.js.map +1 -0
  35. package/dist/net/inet-socket.d.ts +65 -0
  36. package/dist/net/inet-socket.d.ts.map +1 -0
  37. package/dist/net/inet-socket.js +99 -0
  38. package/dist/net/inet-socket.js.map +1 -0
  39. package/dist/net/ipc-server.d.ts +63 -0
  40. package/dist/net/ipc-server.d.ts.map +1 -0
  41. package/dist/net/ipc-server.js +75 -0
  42. package/dist/net/ipc-server.js.map +1 -0
  43. package/dist/net/ipc-socket.d.ts +55 -22
  44. package/dist/net/ipc-socket.d.ts.map +1 -1
  45. package/dist/net/ipc-socket.js +50 -46
  46. package/dist/net/ipc-socket.js.map +1 -1
  47. package/dist/net/stream-server.d.ts +80 -0
  48. package/dist/net/stream-server.d.ts.map +1 -0
  49. package/dist/net/stream-server.js +129 -0
  50. package/dist/net/stream-server.js.map +1 -0
  51. package/dist/net/stream-socket.d.ts +37 -8
  52. package/dist/net/stream-socket.d.ts.map +1 -1
  53. package/dist/net/stream-socket.js +80 -27
  54. package/dist/net/stream-socket.js.map +1 -1
  55. package/dist/net/tcp-server.d.ts +31 -73
  56. package/dist/net/tcp-server.d.ts.map +1 -1
  57. package/dist/net/tcp-server.js +45 -150
  58. package/dist/net/tcp-server.js.map +1 -1
  59. package/dist/net/tcp-socket.d.ts +21 -61
  60. package/dist/net/tcp-socket.d.ts.map +1 -1
  61. package/dist/net/tcp-socket.js +23 -126
  62. package/dist/net/tcp-socket.js.map +1 -1
  63. package/dist/net/tls-server.d.ts +87 -0
  64. package/dist/net/tls-server.d.ts.map +1 -0
  65. package/dist/net/tls-server.js +103 -0
  66. package/dist/net/tls-server.js.map +1 -0
  67. package/dist/net/tls-socket.d.ts +235 -14
  68. package/dist/net/tls-socket.d.ts.map +1 -1
  69. package/dist/net/tls-socket.js +241 -91
  70. package/dist/net/tls-socket.js.map +1 -1
  71. package/package.json +4 -4
  72. package/dist/shell/escape-command-arg.d.ts +0 -9
  73. package/dist/shell/escape-command-arg.d.ts.map +0 -1
  74. package/dist/shell/escape-command-arg.js +0 -13
  75. package/dist/shell/escape-command-arg.js.map +0 -1
  76. package/dist/shell/escape-command.d.ts +0 -10
  77. package/dist/shell/escape-command.d.ts.map +0 -1
  78. package/dist/shell/escape-command.js +0 -12
  79. package/dist/shell/escape-command.js.map +0 -1
@@ -0,0 +1,129 @@
1
+ import { EventDispatcherMapBase } from "@ac-kit/async";
2
+ /**
3
+ * Base class for stream-oriented servers.
4
+ *
5
+ * This abstraction wraps a {@link net.Server} instance and exposes the lifecycle
6
+ * that is independent of the transport: binding state, connection accounting,
7
+ * event-loop referencing and closing.
8
+ *
9
+ * Binding and address reporting are transport-specific and are added by the
10
+ * concrete subclasses {@link TcpServer} and {@link IpcServer}, as is the
11
+ * "connection" event, whose payload is a socket of the matching type.
12
+ */
13
+ export class StreamServer extends EventDispatcherMapBase {
14
+ server;
15
+ handledErrorEvents = new Set();
16
+ /**
17
+ * Creates a new {@link StreamServer} instance.
18
+ *
19
+ * @param server The underlying Node.js server.
20
+ */
21
+ constructor(server) {
22
+ super();
23
+ this.server = server;
24
+ this.setupEventForwarding();
25
+ }
26
+ /** Whether the server is currently listening for connections. */
27
+ get listening() {
28
+ return this.server.listening;
29
+ }
30
+ /** Maximum number of concurrent connections accepted by the server. */
31
+ get maxConnections() {
32
+ return this.server.maxConnections;
33
+ }
34
+ /**
35
+ * Updates the maximum number of concurrent connections.
36
+ *
37
+ * Connections accepted beyond this limit are dropped.
38
+ */
39
+ set maxConnections(maxConnections) {
40
+ this.server.maxConnections = maxConnections;
41
+ }
42
+ /**
43
+ * Counts the connections currently handled by the server.
44
+ *
45
+ * @returns A promise that resolves with the connection count.
46
+ */
47
+ getConnections() {
48
+ return new Promise((resolve, reject) => {
49
+ this.server.getConnections((error, count) => {
50
+ if (error) {
51
+ reject(error);
52
+ return;
53
+ }
54
+ resolve(count);
55
+ });
56
+ });
57
+ }
58
+ /**
59
+ * Marks the server as referenced, preventing the Node.js process from exiting
60
+ * while it is listening.
61
+ */
62
+ ref() {
63
+ this.server.ref();
64
+ }
65
+ /**
66
+ * Marks the server as unreferenced, allowing the Node.js process to exit even
67
+ * while it is listening.
68
+ */
69
+ unref() {
70
+ this.server.unref();
71
+ }
72
+ /**
73
+ * Stops the server from accepting new connections. Established connections
74
+ * are not closed; the promise resolves once the last of them ends.
75
+ *
76
+ * @returns A promise that resolves when the server is fully closed.
77
+ * @throws When the server was not listening.
78
+ */
79
+ close() {
80
+ return new Promise((resolve, reject) => {
81
+ this.server.close((error) => {
82
+ if (error) {
83
+ reject(error);
84
+ return;
85
+ }
86
+ resolve();
87
+ });
88
+ });
89
+ }
90
+ /**
91
+ * Binds the server and resolves once it is listening.
92
+ *
93
+ * The bind error is consumed rather than dispatched, so that a rejected
94
+ * promise is not also reported as an unhandled "error" event.
95
+ *
96
+ * @param options The listen options to bind with. Without any, the server
97
+ * binds a system-assigned port on every interface.
98
+ * @returns A promise that resolves once the server is listening.
99
+ */
100
+ listenOn(options) {
101
+ return new Promise((resolve, reject) => {
102
+ const handleError = (error) => {
103
+ this.handledErrorEvents.add(error);
104
+ reject(error);
105
+ };
106
+ this.server.prependOnceListener("error", handleError);
107
+ this.server.listen(options ?? {}, () => {
108
+ this.server.removeListener("error", handleError);
109
+ resolve();
110
+ });
111
+ });
112
+ }
113
+ setupEventForwarding() {
114
+ this.server.on("close", () => {
115
+ this.dispatch("close", []);
116
+ });
117
+ this.server.on("error", (error) => {
118
+ if (this.handledErrorEvents.has(error)) {
119
+ this.handledErrorEvents.delete(error);
120
+ return;
121
+ }
122
+ this.dispatch("error", [error]);
123
+ });
124
+ this.server.on("listening", () => {
125
+ this.dispatch("listening", []);
126
+ });
127
+ }
128
+ }
129
+ //# sourceMappingURL=stream-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-server.js","sourceRoot":"","sources":["../../src/net/stream-server.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,23 @@ export type StreamSocketEvents = {
44
44
  */
45
45
  timeout: [];
46
46
  };
47
+ /** Options accepted by {@link StreamSocket.from}. */
48
+ export type StreamSocketOptions = net.SocketConstructorOpts;
49
+ /** Options accepted by {@link StreamSocket.end}. */
50
+ export type StreamSocketEndOptions = {
51
+ /**
52
+ * Waits for the remote side to close as well, instead of resolving as soon as
53
+ * the local FIN is queued.
54
+ */
55
+ waitForClose?: boolean;
56
+ };
57
+ /** Options accepted by {@link StreamSocket.awaitReady}. */
58
+ export type StreamSocketAwaitReadyOptions = {
59
+ /** Aborts the attempt, destroying the socket. */
60
+ signal?: AbortSignal;
61
+ /** Starts the attempt, once the settlement listeners are in place. */
62
+ start?: () => void;
63
+ };
47
64
  /**
48
65
  * Base class for stream-oriented client sockets.
49
66
  *
@@ -64,8 +81,8 @@ export type StreamSocketEvents = {
64
81
  * Unless explicitly documented otherwise, methods mirror the semantics of their
65
82
  * underlying {@link net.Socket} counterparts.
66
83
  */
67
- export declare class StreamSocket<TSock extends net.Socket = net.Socket, TEvents extends StreamSocketEvents = StreamSocketEvents> extends EventDispatcherMapBase<TEvents> implements IEventDispatcherMap<TEvents> {
68
- protected readonly sock: TSock;
84
+ export declare class StreamSocket<TSocket extends net.Socket = net.Socket, TEvents extends StreamSocketEvents = StreamSocketEvents> extends EventDispatcherMapBase<TEvents> implements IEventDispatcherMap<TEvents> {
85
+ protected readonly socket: TSocket;
69
86
  protected readonly handledErrorEvents: Set<IError>;
70
87
  /**
71
88
  * Creates a new {@link StreamSocket} instance.
@@ -73,13 +90,13 @@ export declare class StreamSocket<TSock extends net.Socket = net.Socket, TEvents
73
90
  * @param options Options for creating the underlying Node.js socket.
74
91
  * @returns A new `StreamSocket` instance.
75
92
  */
76
- static from(options?: net.SocketConstructorOpts): StreamSocket;
93
+ static from(options?: StreamSocketOptions): StreamSocket;
77
94
  /**
78
95
  * Creates a new {@link StreamSocket} instance.
79
96
  *
80
- * @param sock The underlying Node.js socket.
97
+ * @param socket The underlying Node.js socket.
81
98
  */
82
- constructor(sock: TSock);
99
+ constructor(socket: TSocket);
83
100
  /**
84
101
  * Underlying duplex stream for reading and writing data.
85
102
  *
@@ -128,9 +145,7 @@ export declare class StreamSocket<TSock extends net.Socket = net.Socket, TEvents
128
145
  * @param options Optional settings for ending the socket.
129
146
  * @returns A promise that resolves once the socket has ended.
130
147
  */
131
- end(options?: {
132
- waitForClose?: boolean;
133
- }): Promise<void>;
148
+ end(options?: StreamSocketEndOptions): Promise<void>;
134
149
  /**
135
150
  * Writes data to the socket and resolves once that chunk has been flushed.
136
151
  *
@@ -151,6 +166,20 @@ export declare class StreamSocket<TSock extends net.Socket = net.Socket, TEvents
151
166
  * still be invoked.
152
167
  */
153
168
  destroy(): void;
169
+ /**
170
+ * Runs an operation that establishes the connection and resolves once the
171
+ * socket emits `readyEvent`.
172
+ *
173
+ * The promise always settles: an "error" event rejects it and is consumed so
174
+ * it is not also dispatched to subscribers, a "close" event without a
175
+ * preceding error rejects with {@link ConnectionClosedError}, and aborting the
176
+ * signal destroys the socket and rejects with the abort reason.
177
+ *
178
+ * @param readyEvent Underlying socket event signalling a usable connection.
179
+ * @param options Abort signal and the operation that starts the connection.
180
+ * @returns A promise that resolves once the connection is established.
181
+ */
182
+ protected awaitReady(readyEvent: string, options?: StreamSocketAwaitReadyOptions): Promise<void>;
154
183
  protected setupEventForwarding(): void;
155
184
  }
156
185
  //# sourceMappingURL=stream-socket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-socket.d.ts","sourceRoot":"","sources":["../../src/net/stream-socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAChC;;;;;OAKG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEvB;;;;OAIG;IACH,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE3B;;;;OAIG;IACH,OAAO,EAAE,EAAE,CAAC;IAEZ;;;;;OAKG;IACH,KAAK,EAAE,EAAE,CAAC;IAEV;;;;;OAKG;IACH,OAAO,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY,CACxB,KAAK,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EACrC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,CAEvD,SAAQ,sBAAsB,CAAC,OAAO,CACtC,YAAW,mBAAmB,CAAC,OAAO,CAAC;IAmB3B,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK;IAjB1C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAE/D;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,qBAAqB,GAAG,YAAY,CAE7D;IAED;;;;OAIG;IACH,YAA+B,IAAI,EAAE,KAAK,EAGzC;IAED;;;;;OAKG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAE1B;IAED,0DAA0D;IAC1D,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,kEAAkE;IAClE,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,yDAAyD;IACzD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,0DAA0D;IAC1D,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,oEAAoE;IACpE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,yEAAyE;IACzE,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED;;;;;;OAMG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAEjC;IAED;;;OAGG;IACH,GAAG,IAAI,IAAI,CAEV;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;;;;;;;;;OAUG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBvD;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAYrC;IAED;;;;;;OAMG;IACH,OAAO,IAAI,IAAI,CAEd;IAED,SAAS,CAAC,oBAAoB,IAAI,IAAI,CAwBrC;CACD"}
1
+ {"version":3,"file":"stream-socket.d.ts","sourceRoot":"","sources":["../../src/net/stream-socket.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import * as net from "node:net";
2
2
  import { EventDispatcherMapBase } from "@ac-kit/async";
3
+ import { ConnectionClosedError } from "./connection-closed-error.js";
3
4
  /**
4
5
  * Base class for stream-oriented client sockets.
5
6
  *
@@ -21,7 +22,7 @@ import { EventDispatcherMapBase } from "@ac-kit/async";
21
22
  * underlying {@link net.Socket} counterparts.
22
23
  */
23
24
  export class StreamSocket extends EventDispatcherMapBase {
24
- sock;
25
+ socket;
25
26
  handledErrorEvents = new Set();
26
27
  /**
27
28
  * Creates a new {@link StreamSocket} instance.
@@ -35,11 +36,11 @@ export class StreamSocket extends EventDispatcherMapBase {
35
36
  /**
36
37
  * Creates a new {@link StreamSocket} instance.
37
38
  *
38
- * @param sock The underlying Node.js socket.
39
+ * @param socket The underlying Node.js socket.
39
40
  */
40
- constructor(sock) {
41
+ constructor(socket) {
41
42
  super();
42
- this.sock = sock;
43
+ this.socket = socket;
43
44
  this.setupEventForwarding();
44
45
  }
45
46
  /**
@@ -49,31 +50,31 @@ export class StreamSocket extends EventDispatcherMapBase {
49
50
  * to APIs that expect a Node.js stream.
50
51
  */
51
52
  get stream() {
52
- return this.sock;
53
+ return this.socket;
53
54
  }
54
55
  /** Indicates whether the socket has been fully closed. */
55
56
  get closed() {
56
- return this.sock.closed;
57
+ return this.socket.closed;
57
58
  }
58
59
  /** Indicates whether the underlying socket has been destroyed. */
59
60
  get destroyed() {
60
- return this.sock.destroyed;
61
+ return this.socket.destroyed;
61
62
  }
62
63
  /** Total number of bytes read from the socket so far. */
63
64
  get bytesRead() {
64
- return this.sock.bytesRead;
65
+ return this.socket.bytesRead;
65
66
  }
66
67
  /** Total number of bytes written to the socket so far. */
67
68
  get bytesWritten() {
68
- return this.sock.bytesWritten;
69
+ return this.socket.bytesWritten;
69
70
  }
70
71
  /** Whether the socket is currently in the process of connecting. */
71
72
  get connecting() {
72
- return this.sock.connecting;
73
+ return this.socket.connecting;
73
74
  }
74
75
  /** Current inactivity timeout in milliseconds, or `null` if disabled. */
75
76
  get timeout() {
76
- return this.sock.timeout ?? null;
77
+ return this.socket.timeout ?? null;
77
78
  }
78
79
  /**
79
80
  * Updates the inactivity timeout for the socket.
@@ -83,21 +84,21 @@ export class StreamSocket extends EventDispatcherMapBase {
83
84
  * `null` disables the timeout entirely.
84
85
  */
85
86
  set timeout(timeout) {
86
- this.sock.setTimeout(timeout ?? 0);
87
+ this.socket.setTimeout(timeout ?? 0);
87
88
  }
88
89
  /**
89
90
  * Marks the socket as referenced, preventing the Node.js process from exiting
90
91
  * while the socket is active.
91
92
  */
92
93
  ref() {
93
- this.sock.ref();
94
+ this.socket.ref();
94
95
  }
95
96
  /**
96
97
  * Marks the socket as unreferenced, allowing the Node.js process to exit even
97
98
  * if the socket is still active.
98
99
  */
99
100
  unref() {
100
- this.sock.unref();
101
+ this.socket.unref();
101
102
  }
102
103
  /**
103
104
  * Half-closes the socket, optionally waiting for a full close.
@@ -117,17 +118,17 @@ export class StreamSocket extends EventDispatcherMapBase {
117
118
  reject(error);
118
119
  };
119
120
  const handleEnd = () => {
120
- this.sock.removeListener("error", handleError);
121
+ this.socket.removeListener("error", handleError);
121
122
  resolve();
122
123
  };
123
- this.sock.prependOnceListener("error", handleError);
124
- if (options?.waitForClose && !this.sock.closed) {
125
- this.sock.prependOnceListener("close", () => {
126
- this.sock.removeListener("error", handleError);
124
+ this.socket.prependOnceListener("error", handleError);
125
+ if (options?.waitForClose && !this.socket.closed) {
126
+ this.socket.prependOnceListener("close", () => {
127
+ this.socket.removeListener("error", handleError);
127
128
  resolve();
128
129
  });
129
130
  }
130
- this.sock.end(options?.waitForClose && !this.sock.closed ? undefined : handleEnd);
131
+ this.socket.end(options?.waitForClose && !this.socket.closed ? undefined : handleEnd);
131
132
  });
132
133
  }
133
134
  /**
@@ -150,7 +151,7 @@ export class StreamSocket extends EventDispatcherMapBase {
150
151
  }
151
152
  resolve();
152
153
  };
153
- this.sock.write(data, callback);
154
+ this.socket.write(data, callback);
154
155
  });
155
156
  }
156
157
  /**
@@ -161,26 +162,78 @@ export class StreamSocket extends EventDispatcherMapBase {
161
162
  * still be invoked.
162
163
  */
163
164
  destroy() {
164
- this.sock.destroy();
165
+ this.socket.destroy();
166
+ }
167
+ /**
168
+ * Runs an operation that establishes the connection and resolves once the
169
+ * socket emits `readyEvent`.
170
+ *
171
+ * The promise always settles: an "error" event rejects it and is consumed so
172
+ * it is not also dispatched to subscribers, a "close" event without a
173
+ * preceding error rejects with {@link ConnectionClosedError}, and aborting the
174
+ * signal destroys the socket and rejects with the abort reason.
175
+ *
176
+ * @param readyEvent Underlying socket event signalling a usable connection.
177
+ * @param options Abort signal and the operation that starts the connection.
178
+ * @returns A promise that resolves once the connection is established.
179
+ */
180
+ awaitReady(readyEvent, options) {
181
+ const { signal, start } = options ?? {};
182
+ return new Promise((resolve, reject) => {
183
+ const abortListeners = new AbortController();
184
+ const cleanup = () => {
185
+ abortListeners.abort();
186
+ this.socket.removeListener(readyEvent, handleReady);
187
+ this.socket.removeListener("error", handleError);
188
+ this.socket.removeListener("close", handleClose);
189
+ };
190
+ const handleReady = () => {
191
+ cleanup();
192
+ resolve();
193
+ };
194
+ const handleError = (error) => {
195
+ this.handledErrorEvents.add(error);
196
+ cleanup();
197
+ reject(error);
198
+ };
199
+ // A peer that drops the transport mid-connection closes it without an
200
+ // "error"; without this the promise would stay pending forever.
201
+ const handleClose = () => {
202
+ cleanup();
203
+ reject(new ConnectionClosedError(`Socket closed before the "${readyEvent}" event`));
204
+ };
205
+ if (signal) {
206
+ signal.throwIfAborted();
207
+ signal.addEventListener("abort", () => {
208
+ cleanup();
209
+ this.socket.destroy();
210
+ reject(signal.reason);
211
+ }, { once: true, signal: abortListeners.signal });
212
+ }
213
+ this.socket.once(readyEvent, handleReady);
214
+ this.socket.prependOnceListener("error", handleError);
215
+ this.socket.once("close", handleClose);
216
+ start?.();
217
+ });
165
218
  }
166
219
  setupEventForwarding() {
167
- this.sock.on("error", (err) => {
220
+ this.socket.on("error", (err) => {
168
221
  if (this.handledErrorEvents.has(err)) {
169
222
  this.handledErrorEvents.delete(err);
170
223
  return;
171
224
  }
172
225
  this.dispatch("error", [err]);
173
226
  });
174
- this.sock.on("close", (hadError) => {
227
+ this.socket.on("close", (hadError) => {
175
228
  this.dispatch("close", [hadError]);
176
229
  });
177
- this.sock.on("connect", () => {
230
+ this.socket.on("connect", () => {
178
231
  this.dispatch("connect", []);
179
232
  });
180
- this.sock.on("ready", () => {
233
+ this.socket.on("ready", () => {
181
234
  this.dispatch("ready", []);
182
235
  });
183
- this.sock.on("timeout", () => {
236
+ this.socket.on("timeout", () => {
184
237
  this.dispatch("timeout", []);
185
238
  });
186
239
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream-socket.js","sourceRoot":"","sources":["../../src/net/stream-socket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream-socket.js","sourceRoot":"","sources":["../../src/net/stream-socket.ts"],"names":[],"mappings":"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"}
@@ -1,110 +1,68 @@
1
1
  import * as net from "node:net";
2
- import { EventDispatcherMapBase, IEventDispatcherMap } from "@ac-kit/async";
3
- import { InetEndpoint, type IError } from "@ac-kit/core";
4
2
  import type { Except } from "type-fest";
3
+ import type { InetEndpoint } from "./inet-endpoint.js";
4
+ import { StreamServer, type StreamServerEvents } from "./stream-server.js";
5
5
  import { TcpSocket } from "./tcp-socket.js";
6
- /** Event map for TcpServer server-specific events. */
7
- export type TcpServerEvents = {
8
- /** Emitted when the server closes. */
9
- close: [];
6
+ /** Event map for {@link TcpServer}. */
7
+ export type TcpServerEvents = StreamServerEvents & {
8
+ /** Emitted when a new connection is accepted. */
9
+ connection: [socket: TcpSocket];
10
10
  /**
11
- * Emitted when a new connection is made. The connection is wrapped in a
12
- * TcpClient instance.
13
- */
14
- connection: [client: TcpSocket];
15
- /**
16
- * Emitted when a new connection is dropped. Provides the local and remote
17
- * endpoint information of the dropped connection.
11
+ * Emitted when a connection is dropped because
12
+ * {@link StreamServer.maxConnections} was reached. Each endpoint is `null`
13
+ * when Node.js did not report it.
18
14
  */
19
15
  drop: [
20
16
  localEndpoint: InetEndpoint | null,
21
17
  remoteEndpoint: InetEndpoint | null
22
18
  ];
23
- /** Emitted when an error occurs. */
24
- error: [err: IError];
25
- /** Emitted when the server has been bound after calling server.listen(). */
26
- listening: [];
27
19
  };
20
+ /** Options accepted by {@link TcpServer.from}. */
21
+ export type TcpServerOptions = net.ServerOpts;
22
+ /** Options accepted by {@link TcpServer.listen}. */
23
+ export type TcpServerListenOptions = Except<net.ListenOptions, "port" | "path" | "handle">;
28
24
  /**
29
- * TCP server to accept incoming connections.
25
+ * TCP server accepting incoming connections.
30
26
  *
31
27
  * Example usage:
32
28
  *
33
29
  * ```ts
34
30
  * const server = TcpServer.from();
35
- * server.on("connection", (client) => {
36
- * console.log("Client connected");
37
- * client.stream.on("data", (data) => {
31
+ * server.subscribe("connection", (socket) => {
32
+ * socket.stream.on("data", (data) => {
38
33
  * console.log("Received:", data.toString());
39
34
  * });
40
35
  * });
41
- * await server.listen(8080, "0.0.0.0");
36
+ * await server.listen(8080, { host: "0.0.0.0" });
42
37
  * // ... later
43
38
  * await server.close();
44
39
  * ```
45
40
  */
46
- export declare class TcpServer extends EventDispatcherMapBase<TcpServerEvents> implements IEventDispatcherMap<TcpServerEvents> {
47
- private readonly srv;
41
+ export declare class TcpServer<TServer extends net.Server = net.Server, TEvents extends TcpServerEvents = TcpServerEvents> extends StreamServer<TServer, TEvents> {
48
42
  /**
49
- * Creates a new `TcpServer` instance with the specified options.
43
+ * Creates a new {@link TcpServer} instance.
50
44
  *
51
- * @param options Options for creating the TCP server.
45
+ * @param options Options for creating the underlying Node.js server.
52
46
  * @returns A new `TcpServer` instance.
53
47
  */
54
- static from(options?: net.ServerOpts): TcpServer;
55
- private readonly handledErrorEvents;
56
- constructor(srv: net.Server);
57
- /**
58
- * Gets the current number of concurrent connections on the server.
59
- *
60
- * @returns A promise that resolves with the connection count.
61
- */
62
- getConnections(): Promise<number>;
63
- /** Gets whether the server is currently listening for connections. */
64
- get listening(): boolean;
48
+ static from(options?: TcpServerOptions): TcpServer;
65
49
  /**
66
- * Sets the maximum number of queued pending connections.
50
+ * Binds the server and resolves once it is listening.
67
51
  *
68
- * @param maxConnections The maximum number of connections to queue.
69
- */
70
- set maxConnections(maxConnections: number);
71
- /** Gets the maximum number of queued pending connections. */
72
- get maxConnections(): number;
73
- /**
74
- * References the server, preventing the process from exiting while the server
75
- * is active.
76
- */
77
- ref(): void;
78
- /**
79
- * Unreferences the server, allowing the process from exiting even if the
80
- * server is active.
81
- */
82
- unref(): void;
83
- /**
84
- * Starts the TCP server listening on the specified port and host.
85
- *
86
- * @param port The port to listen on. If 0, a random available port will be
87
- * assigned.
88
- * @param host The host/interface to bind to. Defaults to '::' (IPv6) or
89
- * '0.0.0.0' (IPv4).
52
+ * @param port The port to listen on. Use `0` to let the system assign one.
90
53
  * @param options Additional listen options.
91
- * @returns A promise that resolves when the server is successfully listening.
92
- */
93
- listen(port: number, host?: string, options?: Except<net.ListenOptions, "port" | "host">): Promise<void>;
94
- /**
95
- * Closes the TCP server, stopping it from accepting new connections. Existing
96
- * connections are not automatically closed.
97
- *
98
- * @returns A promise that resolves when the server is fully closed.
54
+ * @returns A promise that resolves once the server is listening.
55
+ * @throws When the address is already in use or cannot be bound.
99
56
  */
100
- close(): Promise<void>;
57
+ listen(port: number, options?: TcpServerListenOptions): Promise<void>;
101
58
  /**
102
- * Gets the address information of the server.
59
+ * Returns the endpoint the server is bound to.
103
60
  *
104
- * @returns The server's endpoint information or null if the server is not
105
- * listening.
61
+ * @returns The bound endpoint, or `null` when the server is not listening.
62
+ * @throws {UnsupportedError} When the server is bound to a path rather than
63
+ * an IP endpoint. Use {@link IpcServer} for those.
106
64
  */
107
65
  address(): InetEndpoint | null;
108
- private setupEventForwarding;
66
+ protected setupEventForwarding(): void;
109
67
  }
110
68
  //# sourceMappingURL=tcp-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tcp-server.d.ts","sourceRoot":"","sources":["../../src/net/tcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAEN,YAAY,EAEZ,KAAK,MAAM,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG;IAC7B,sCAAsC;IACtC,KAAK,EAAE,EAAE,CAAC;IAEV;;;OAGG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEhC;;;OAGG;IACH,IAAI,EAAE;QACL,aAAa,EAAE,YAAY,GAAG,IAAI;QAClC,cAAc,EAAE,YAAY,GAAG,IAAI;KACnC,CAAC;IAEF,oCAAoC;IACpC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAErB,4EAA4E;IAC5E,SAAS,EAAE,EAAE,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,SACZ,SAAQ,sBAAsB,CAAC,eAAe,CAC9C,YAAW,mBAAmB,CAAC,eAAe,CAAC;IAcnC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAZhC;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,UAAU,GAAG,SAAS,CAE/C;IAED,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA0B;IAE7D,YAA6B,GAAG,EAAE,GAAG,CAAC,MAAM,EAG3C;IAED;;;;OAIG;IACH,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAUhC;IAED,sEAAsE;IACtE,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;OAIG;IACH,IAAI,cAAc,CAAC,cAAc,EAAE,MAAM,EAExC;IAED,6DAA6D;IAC7D,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;;OAGG;IACH,GAAG,IAAI,IAAI,CAEV;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;;;;;;;;OASG;IACH,MAAM,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,CAoBf;IAED;;;;;OAKG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrB;IAED;;;;;OAKG;IACH,OAAO,IAAI,YAAY,GAAG,IAAI,CAiB7B;IAED,OAAO,CAAC,oBAAoB;CAsD5B"}
1
+ {"version":3,"file":"tcp-server.d.ts","sourceRoot":"","sources":["../../src/net/tcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,uCAAuC;AACvC,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG;IAClD,iDAAiD;IACjD,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEhC;;;;OAIG;IACH,IAAI,EAAE;QACL,aAAa,EAAE,YAAY,GAAG,IAAI;QAClC,cAAc,EAAE,YAAY,GAAG,IAAI;KACnC,CAAC;CACF,CAAC;AAEF,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC;AAE9C,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAC1C,GAAG,CAAC,aAAa,EACjB,MAAM,GAAG,MAAM,GAAG,QAAQ,CAC1B,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,SAAS,CACrB,OAAO,SAAS,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EACvC,OAAO,SAAS,eAAe,GAAG,eAAe,CAChD,SAAQ,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;IACvC;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAEjD;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;IAED;;;;;;OAMG;IACH,OAAO,IAAI,YAAY,GAAG,IAAI,CAiB7B;IAED,UAAmB,oBAAoB,IAAI,IAAI,CA8B9C;CACD"}