almostnode 0.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +731 -0
  3. package/dist/__sw__.js +394 -0
  4. package/dist/ai-chatbot-demo-entry.d.ts +6 -0
  5. package/dist/ai-chatbot-demo-entry.d.ts.map +1 -0
  6. package/dist/ai-chatbot-demo.d.ts +42 -0
  7. package/dist/ai-chatbot-demo.d.ts.map +1 -0
  8. package/dist/assets/runtime-worker-D9x_Ddwz.js +60543 -0
  9. package/dist/assets/runtime-worker-D9x_Ddwz.js.map +1 -0
  10. package/dist/convex-app-demo-entry.d.ts +6 -0
  11. package/dist/convex-app-demo-entry.d.ts.map +1 -0
  12. package/dist/convex-app-demo.d.ts +68 -0
  13. package/dist/convex-app-demo.d.ts.map +1 -0
  14. package/dist/cors-proxy.d.ts +46 -0
  15. package/dist/cors-proxy.d.ts.map +1 -0
  16. package/dist/create-runtime.d.ts +42 -0
  17. package/dist/create-runtime.d.ts.map +1 -0
  18. package/dist/demo.d.ts +6 -0
  19. package/dist/demo.d.ts.map +1 -0
  20. package/dist/dev-server.d.ts +97 -0
  21. package/dist/dev-server.d.ts.map +1 -0
  22. package/dist/frameworks/next-dev-server.d.ts +202 -0
  23. package/dist/frameworks/next-dev-server.d.ts.map +1 -0
  24. package/dist/frameworks/vite-dev-server.d.ts +85 -0
  25. package/dist/frameworks/vite-dev-server.d.ts.map +1 -0
  26. package/dist/index.cjs +14965 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.ts +71 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.mjs +14867 -0
  31. package/dist/index.mjs.map +1 -0
  32. package/dist/next-demo.d.ts +49 -0
  33. package/dist/next-demo.d.ts.map +1 -0
  34. package/dist/npm/index.d.ts +71 -0
  35. package/dist/npm/index.d.ts.map +1 -0
  36. package/dist/npm/registry.d.ts +66 -0
  37. package/dist/npm/registry.d.ts.map +1 -0
  38. package/dist/npm/resolver.d.ts +52 -0
  39. package/dist/npm/resolver.d.ts.map +1 -0
  40. package/dist/npm/tarball.d.ts +29 -0
  41. package/dist/npm/tarball.d.ts.map +1 -0
  42. package/dist/runtime-interface.d.ts +90 -0
  43. package/dist/runtime-interface.d.ts.map +1 -0
  44. package/dist/runtime.d.ts +103 -0
  45. package/dist/runtime.d.ts.map +1 -0
  46. package/dist/sandbox-helpers.d.ts +43 -0
  47. package/dist/sandbox-helpers.d.ts.map +1 -0
  48. package/dist/sandbox-runtime.d.ts +65 -0
  49. package/dist/sandbox-runtime.d.ts.map +1 -0
  50. package/dist/server-bridge.d.ts +89 -0
  51. package/dist/server-bridge.d.ts.map +1 -0
  52. package/dist/shims/assert.d.ts +51 -0
  53. package/dist/shims/assert.d.ts.map +1 -0
  54. package/dist/shims/async_hooks.d.ts +37 -0
  55. package/dist/shims/async_hooks.d.ts.map +1 -0
  56. package/dist/shims/buffer.d.ts +20 -0
  57. package/dist/shims/buffer.d.ts.map +1 -0
  58. package/dist/shims/child_process-browser.d.ts +92 -0
  59. package/dist/shims/child_process-browser.d.ts.map +1 -0
  60. package/dist/shims/child_process.d.ts +93 -0
  61. package/dist/shims/child_process.d.ts.map +1 -0
  62. package/dist/shims/chokidar.d.ts +55 -0
  63. package/dist/shims/chokidar.d.ts.map +1 -0
  64. package/dist/shims/cluster.d.ts +52 -0
  65. package/dist/shims/cluster.d.ts.map +1 -0
  66. package/dist/shims/crypto.d.ts +122 -0
  67. package/dist/shims/crypto.d.ts.map +1 -0
  68. package/dist/shims/dgram.d.ts +34 -0
  69. package/dist/shims/dgram.d.ts.map +1 -0
  70. package/dist/shims/diagnostics_channel.d.ts +80 -0
  71. package/dist/shims/diagnostics_channel.d.ts.map +1 -0
  72. package/dist/shims/dns.d.ts +87 -0
  73. package/dist/shims/dns.d.ts.map +1 -0
  74. package/dist/shims/domain.d.ts +25 -0
  75. package/dist/shims/domain.d.ts.map +1 -0
  76. package/dist/shims/esbuild.d.ts +105 -0
  77. package/dist/shims/esbuild.d.ts.map +1 -0
  78. package/dist/shims/events.d.ts +37 -0
  79. package/dist/shims/events.d.ts.map +1 -0
  80. package/dist/shims/fs.d.ts +115 -0
  81. package/dist/shims/fs.d.ts.map +1 -0
  82. package/dist/shims/fsevents.d.ts +67 -0
  83. package/dist/shims/fsevents.d.ts.map +1 -0
  84. package/dist/shims/http.d.ts +217 -0
  85. package/dist/shims/http.d.ts.map +1 -0
  86. package/dist/shims/http2.d.ts +81 -0
  87. package/dist/shims/http2.d.ts.map +1 -0
  88. package/dist/shims/https.d.ts +36 -0
  89. package/dist/shims/https.d.ts.map +1 -0
  90. package/dist/shims/inspector.d.ts +25 -0
  91. package/dist/shims/inspector.d.ts.map +1 -0
  92. package/dist/shims/module.d.ts +22 -0
  93. package/dist/shims/module.d.ts.map +1 -0
  94. package/dist/shims/net.d.ts +100 -0
  95. package/dist/shims/net.d.ts.map +1 -0
  96. package/dist/shims/os.d.ts +159 -0
  97. package/dist/shims/os.d.ts.map +1 -0
  98. package/dist/shims/path.d.ts +72 -0
  99. package/dist/shims/path.d.ts.map +1 -0
  100. package/dist/shims/perf_hooks.d.ts +50 -0
  101. package/dist/shims/perf_hooks.d.ts.map +1 -0
  102. package/dist/shims/process.d.ts +93 -0
  103. package/dist/shims/process.d.ts.map +1 -0
  104. package/dist/shims/querystring.d.ts +23 -0
  105. package/dist/shims/querystring.d.ts.map +1 -0
  106. package/dist/shims/readdirp.d.ts +52 -0
  107. package/dist/shims/readdirp.d.ts.map +1 -0
  108. package/dist/shims/readline.d.ts +62 -0
  109. package/dist/shims/readline.d.ts.map +1 -0
  110. package/dist/shims/rollup.d.ts +34 -0
  111. package/dist/shims/rollup.d.ts.map +1 -0
  112. package/dist/shims/sentry.d.ts +163 -0
  113. package/dist/shims/sentry.d.ts.map +1 -0
  114. package/dist/shims/stream.d.ts +181 -0
  115. package/dist/shims/stream.d.ts.map +1 -0
  116. package/dist/shims/tls.d.ts +53 -0
  117. package/dist/shims/tls.d.ts.map +1 -0
  118. package/dist/shims/tty.d.ts +30 -0
  119. package/dist/shims/tty.d.ts.map +1 -0
  120. package/dist/shims/url.d.ts +64 -0
  121. package/dist/shims/url.d.ts.map +1 -0
  122. package/dist/shims/util.d.ts +106 -0
  123. package/dist/shims/util.d.ts.map +1 -0
  124. package/dist/shims/v8.d.ts +73 -0
  125. package/dist/shims/v8.d.ts.map +1 -0
  126. package/dist/shims/vfs-adapter.d.ts +126 -0
  127. package/dist/shims/vfs-adapter.d.ts.map +1 -0
  128. package/dist/shims/vm.d.ts +45 -0
  129. package/dist/shims/vm.d.ts.map +1 -0
  130. package/dist/shims/worker_threads.d.ts +66 -0
  131. package/dist/shims/worker_threads.d.ts.map +1 -0
  132. package/dist/shims/ws.d.ts +66 -0
  133. package/dist/shims/ws.d.ts.map +1 -0
  134. package/dist/shims/zlib.d.ts +161 -0
  135. package/dist/shims/zlib.d.ts.map +1 -0
  136. package/dist/transform.d.ts +24 -0
  137. package/dist/transform.d.ts.map +1 -0
  138. package/dist/virtual-fs.d.ts +226 -0
  139. package/dist/virtual-fs.d.ts.map +1 -0
  140. package/dist/vite-demo.d.ts +35 -0
  141. package/dist/vite-demo.d.ts.map +1 -0
  142. package/dist/vite-sw.js +132 -0
  143. package/dist/worker/runtime-worker.d.ts +8 -0
  144. package/dist/worker/runtime-worker.d.ts.map +1 -0
  145. package/dist/worker-runtime.d.ts +50 -0
  146. package/dist/worker-runtime.d.ts.map +1 -0
  147. package/package.json +85 -0
  148. package/src/ai-chatbot-demo-entry.ts +244 -0
  149. package/src/ai-chatbot-demo.ts +509 -0
  150. package/src/convex-app-demo-entry.ts +1107 -0
  151. package/src/convex-app-demo.ts +1316 -0
  152. package/src/cors-proxy.ts +81 -0
  153. package/src/create-runtime.ts +147 -0
  154. package/src/demo.ts +304 -0
  155. package/src/dev-server.ts +274 -0
  156. package/src/frameworks/next-dev-server.ts +2224 -0
  157. package/src/frameworks/vite-dev-server.ts +702 -0
  158. package/src/index.ts +101 -0
  159. package/src/next-demo.ts +1784 -0
  160. package/src/npm/index.ts +347 -0
  161. package/src/npm/registry.ts +152 -0
  162. package/src/npm/resolver.ts +385 -0
  163. package/src/npm/tarball.ts +209 -0
  164. package/src/runtime-interface.ts +103 -0
  165. package/src/runtime.ts +1046 -0
  166. package/src/sandbox-helpers.ts +173 -0
  167. package/src/sandbox-runtime.ts +252 -0
  168. package/src/server-bridge.ts +426 -0
  169. package/src/shims/assert.ts +664 -0
  170. package/src/shims/async_hooks.ts +86 -0
  171. package/src/shims/buffer.ts +75 -0
  172. package/src/shims/child_process-browser.ts +217 -0
  173. package/src/shims/child_process.ts +463 -0
  174. package/src/shims/chokidar.ts +313 -0
  175. package/src/shims/cluster.ts +67 -0
  176. package/src/shims/crypto.ts +830 -0
  177. package/src/shims/dgram.ts +47 -0
  178. package/src/shims/diagnostics_channel.ts +196 -0
  179. package/src/shims/dns.ts +172 -0
  180. package/src/shims/domain.ts +58 -0
  181. package/src/shims/esbuild.ts +805 -0
  182. package/src/shims/events.ts +195 -0
  183. package/src/shims/fs.ts +803 -0
  184. package/src/shims/fsevents.ts +63 -0
  185. package/src/shims/http.ts +904 -0
  186. package/src/shims/http2.ts +96 -0
  187. package/src/shims/https.ts +86 -0
  188. package/src/shims/inspector.ts +30 -0
  189. package/src/shims/module.ts +82 -0
  190. package/src/shims/net.ts +359 -0
  191. package/src/shims/os.ts +195 -0
  192. package/src/shims/path.ts +199 -0
  193. package/src/shims/perf_hooks.ts +92 -0
  194. package/src/shims/process.ts +346 -0
  195. package/src/shims/querystring.ts +97 -0
  196. package/src/shims/readdirp.ts +228 -0
  197. package/src/shims/readline.ts +110 -0
  198. package/src/shims/rollup.ts +80 -0
  199. package/src/shims/sentry.ts +133 -0
  200. package/src/shims/stream.ts +1126 -0
  201. package/src/shims/tls.ts +95 -0
  202. package/src/shims/tty.ts +64 -0
  203. package/src/shims/url.ts +171 -0
  204. package/src/shims/util.ts +312 -0
  205. package/src/shims/v8.ts +113 -0
  206. package/src/shims/vfs-adapter.ts +402 -0
  207. package/src/shims/vm.ts +83 -0
  208. package/src/shims/worker_threads.ts +111 -0
  209. package/src/shims/ws.ts +382 -0
  210. package/src/shims/zlib.ts +289 -0
  211. package/src/transform.ts +313 -0
  212. package/src/types/external.d.ts +67 -0
  213. package/src/virtual-fs.ts +903 -0
  214. package/src/vite-demo.ts +577 -0
  215. package/src/worker/runtime-worker.ts +128 -0
  216. package/src/worker-runtime.ts +145 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * http2 shim - HTTP/2 is not available in browser
3
+ */
4
+
5
+ import { EventEmitter } from './events';
6
+
7
+ export class Http2Session extends EventEmitter {
8
+ close(_callback?: () => void): void {
9
+ if (_callback) setTimeout(_callback, 0);
10
+ }
11
+ destroy(_error?: Error, _code?: number): void {}
12
+ get destroyed(): boolean { return false; }
13
+ get encrypted(): boolean { return false; }
14
+ get closed(): boolean { return false; }
15
+ ping(_callback: (err: Error | null, duration: number, payload: Buffer) => void): boolean {
16
+ return false;
17
+ }
18
+ ref(): void {}
19
+ unref(): void {}
20
+ setTimeout(_msecs: number, _callback?: () => void): void {}
21
+ }
22
+
23
+ export class ClientHttp2Session extends Http2Session {}
24
+ export class ServerHttp2Session extends Http2Session {}
25
+
26
+ export class Http2Stream extends EventEmitter {
27
+ close(_code?: number, _callback?: () => void): void {}
28
+ get id(): number { return 0; }
29
+ get pending(): boolean { return false; }
30
+ get destroyed(): boolean { return false; }
31
+ get closed(): boolean { return false; }
32
+ priority(_options: unknown): void {}
33
+ setTimeout(_msecs: number, _callback?: () => void): void {}
34
+ end(_data?: unknown, _encoding?: string, _callback?: () => void): void {}
35
+ }
36
+
37
+ export class Http2ServerRequest extends EventEmitter {}
38
+ export class Http2ServerResponse extends EventEmitter {
39
+ writeHead(_statusCode: number, _headers?: object): this { return this; }
40
+ end(_data?: unknown): void {}
41
+ }
42
+
43
+ export function createServer(_options?: unknown, _onRequestHandler?: unknown): EventEmitter {
44
+ return new EventEmitter();
45
+ }
46
+
47
+ export function createSecureServer(_options?: unknown, _onRequestHandler?: unknown): EventEmitter {
48
+ return new EventEmitter();
49
+ }
50
+
51
+ export function connect(_authority: string, _options?: unknown, _listener?: () => void): ClientHttp2Session {
52
+ return new ClientHttp2Session();
53
+ }
54
+
55
+ export const constants = {
56
+ NGHTTP2_SESSION_SERVER: 0,
57
+ NGHTTP2_SESSION_CLIENT: 1,
58
+ HTTP2_HEADER_STATUS: ':status',
59
+ HTTP2_HEADER_METHOD: ':method',
60
+ HTTP2_HEADER_AUTHORITY: ':authority',
61
+ HTTP2_HEADER_SCHEME: ':scheme',
62
+ HTTP2_HEADER_PATH: ':path',
63
+ HTTP_STATUS_OK: 200,
64
+ HTTP_STATUS_NOT_FOUND: 404,
65
+ };
66
+
67
+ export function getDefaultSettings(): object {
68
+ return {};
69
+ }
70
+
71
+ export function getPackedSettings(_settings?: object): Buffer {
72
+ return Buffer.from('');
73
+ }
74
+
75
+ export function getUnpackedSettings(_buf: Buffer): object {
76
+ return {};
77
+ }
78
+
79
+ export const sensitiveHeaders = Symbol('sensitiveHeaders');
80
+
81
+ export default {
82
+ Http2Session,
83
+ ClientHttp2Session,
84
+ ServerHttp2Session,
85
+ Http2Stream,
86
+ Http2ServerRequest,
87
+ Http2ServerResponse,
88
+ createServer,
89
+ createSecureServer,
90
+ connect,
91
+ constants,
92
+ getDefaultSettings,
93
+ getPackedSettings,
94
+ getUnpackedSettings,
95
+ sensitiveHeaders,
96
+ };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Node.js https module shim
3
+ * Re-exports http module functionality with https protocol default
4
+ */
5
+
6
+ import {
7
+ Server,
8
+ IncomingMessage,
9
+ ServerResponse,
10
+ ClientRequest,
11
+ createServer,
12
+ STATUS_CODES,
13
+ METHODS,
14
+ getServer,
15
+ getAllServers,
16
+ setServerListenCallback,
17
+ setServerCloseCallback,
18
+ _createClientRequest,
19
+ Agent,
20
+ globalAgent,
21
+ } from './http';
22
+
23
+ import type { RequestOptions, AgentOptions } from './http';
24
+
25
+ // Re-export all http types and classes
26
+ export {
27
+ Server,
28
+ IncomingMessage,
29
+ ServerResponse,
30
+ ClientRequest,
31
+ createServer,
32
+ STATUS_CODES,
33
+ METHODS,
34
+ getServer,
35
+ getAllServers,
36
+ setServerListenCallback,
37
+ setServerCloseCallback,
38
+ Agent,
39
+ globalAgent,
40
+ };
41
+
42
+ export type { AgentOptions };
43
+
44
+ export type { RequestOptions };
45
+
46
+ /**
47
+ * Create an HTTPS client request
48
+ */
49
+ export function request(
50
+ urlOrOptions: string | URL | RequestOptions,
51
+ optionsOrCallback?: RequestOptions | ((res: IncomingMessage) => void),
52
+ callback?: (res: IncomingMessage) => void
53
+ ): ClientRequest {
54
+ return _createClientRequest(urlOrOptions, optionsOrCallback, callback, 'https');
55
+ }
56
+
57
+ /**
58
+ * Make an HTTPS GET request
59
+ */
60
+ export function get(
61
+ urlOrOptions: string | URL | RequestOptions,
62
+ optionsOrCallback?: RequestOptions | ((res: IncomingMessage) => void),
63
+ callback?: (res: IncomingMessage) => void
64
+ ): ClientRequest {
65
+ const req = _createClientRequest(urlOrOptions, optionsOrCallback, callback, 'https');
66
+ req.end();
67
+ return req;
68
+ }
69
+
70
+ export default {
71
+ Server,
72
+ IncomingMessage,
73
+ ServerResponse,
74
+ ClientRequest,
75
+ createServer,
76
+ request,
77
+ get,
78
+ STATUS_CODES,
79
+ METHODS,
80
+ getServer,
81
+ getAllServers,
82
+ setServerListenCallback,
83
+ setServerCloseCallback,
84
+ Agent,
85
+ globalAgent,
86
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * inspector shim - V8 inspector is not available in browser
3
+ */
4
+
5
+ import { EventEmitter } from './events';
6
+
7
+ export class Session extends EventEmitter {
8
+ connect(): void {}
9
+ connectToMainThread(): void {}
10
+ disconnect(): void {}
11
+ post(_method: string, _params?: object, _callback?: (err: Error | null, result?: object) => void): void {
12
+ if (_callback) setTimeout(() => _callback(null, {}), 0);
13
+ }
14
+ }
15
+
16
+ export function open(_port?: number, _host?: string, _wait?: boolean): void {}
17
+ export function close(): void {}
18
+ export function url(): string | undefined { return undefined; }
19
+ export function waitForDebugger(): void {}
20
+
21
+ export const console = globalThis.console;
22
+
23
+ export default {
24
+ Session,
25
+ open,
26
+ close,
27
+ url,
28
+ waitForDebugger,
29
+ console,
30
+ };
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Node.js module shim
3
+ * Provides basic module system functionality
4
+ */
5
+
6
+ import * as pathShim from './path';
7
+
8
+ export function createRequire(filename: string): (id: string) => unknown {
9
+ // Return a require function that can be used by modules
10
+ return function require(id: string): unknown {
11
+ throw new Error(`Cannot find module '${id}' from '${filename}'`);
12
+ };
13
+ }
14
+
15
+ export const builtinModules = [
16
+ 'assert',
17
+ 'buffer',
18
+ 'child_process',
19
+ 'cluster',
20
+ 'console',
21
+ 'constants',
22
+ 'crypto',
23
+ 'dgram',
24
+ 'dns',
25
+ 'domain',
26
+ 'events',
27
+ 'fs',
28
+ 'http',
29
+ 'https',
30
+ 'module',
31
+ 'net',
32
+ 'os',
33
+ 'path',
34
+ 'perf_hooks',
35
+ 'process',
36
+ 'punycode',
37
+ 'querystring',
38
+ 'readline',
39
+ 'repl',
40
+ 'stream',
41
+ 'string_decoder',
42
+ 'sys',
43
+ 'timers',
44
+ 'tls',
45
+ 'tty',
46
+ 'url',
47
+ 'util',
48
+ 'v8',
49
+ 'vm',
50
+ 'worker_threads',
51
+ 'zlib',
52
+ ];
53
+
54
+ export function isBuiltin(moduleName: string): boolean {
55
+ // Strip node: prefix if present
56
+ const name = moduleName.startsWith('node:') ? moduleName.slice(5) : moduleName;
57
+ return builtinModules.includes(name);
58
+ }
59
+
60
+ export const _cache: Record<string, unknown> = {};
61
+ export const _extensions: Record<string, unknown> = {
62
+ '.js': () => {},
63
+ '.json': () => {},
64
+ '.node': () => {},
65
+ };
66
+ export const _pathCache: Record<string, string> = {};
67
+
68
+ export function syncBuiltinESMExports(): void {
69
+ // No-op in browser
70
+ }
71
+
72
+ export const Module = {
73
+ createRequire,
74
+ builtinModules,
75
+ isBuiltin,
76
+ _cache,
77
+ _extensions,
78
+ _pathCache,
79
+ syncBuiltinESMExports,
80
+ };
81
+
82
+ export default Module;
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Node.js net module shim
3
+ * Basic Socket and Server classes for virtual networking
4
+ */
5
+
6
+ import { EventEmitter, EventListener } from './events';
7
+ import { Duplex, Buffer } from './stream';
8
+
9
+ export interface AddressInfo {
10
+ address: string;
11
+ family: string;
12
+ port: number;
13
+ }
14
+
15
+ export interface SocketOptions {
16
+ allowHalfOpen?: boolean;
17
+ readable?: boolean;
18
+ writable?: boolean;
19
+ }
20
+
21
+ export interface ServerOptions {
22
+ allowHalfOpen?: boolean;
23
+ pauseOnConnect?: boolean;
24
+ }
25
+
26
+ export interface ListenOptions {
27
+ port?: number;
28
+ host?: string;
29
+ backlog?: number;
30
+ }
31
+
32
+ /**
33
+ * Virtual Socket implementation
34
+ */
35
+ export class Socket extends Duplex {
36
+ private _connecting: boolean = false;
37
+ private _connected: boolean = false;
38
+ private _destroyed: boolean = false;
39
+ private _remoteAddress: string = '';
40
+ private _remotePort: number = 0;
41
+ private _localAddress: string = '127.0.0.1';
42
+ private _localPort: number = 0;
43
+
44
+ localAddress: string = '127.0.0.1';
45
+ localPort: number = 0;
46
+ remoteAddress?: string;
47
+ remotePort?: number;
48
+ remoteFamily?: string;
49
+ connecting: boolean = false;
50
+ destroyed: boolean = false;
51
+ readyState: string = 'closed';
52
+
53
+ constructor(options?: SocketOptions) {
54
+ super();
55
+ }
56
+
57
+ connect(
58
+ portOrOptions: number | { port: number; host?: string },
59
+ hostOrCallback?: string | (() => void),
60
+ callback?: () => void
61
+ ): this {
62
+ let port: number;
63
+ let host: string = '127.0.0.1';
64
+ let cb: (() => void) | undefined;
65
+
66
+ if (typeof portOrOptions === 'number') {
67
+ port = portOrOptions;
68
+ if (typeof hostOrCallback === 'string') {
69
+ host = hostOrCallback;
70
+ cb = callback;
71
+ } else {
72
+ cb = hostOrCallback;
73
+ }
74
+ } else {
75
+ port = portOrOptions.port;
76
+ host = portOrOptions.host || '127.0.0.1';
77
+ cb = typeof hostOrCallback === 'function' ? hostOrCallback : callback;
78
+ }
79
+
80
+ this._connecting = true;
81
+ this.connecting = true;
82
+ this._remoteAddress = host;
83
+ this._remotePort = port;
84
+ this.remoteAddress = host;
85
+ this.remotePort = port;
86
+ this.remoteFamily = 'IPv4';
87
+ this.readyState = 'opening';
88
+
89
+ // Simulate async connection
90
+ queueMicrotask(() => {
91
+ this._connecting = false;
92
+ this._connected = true;
93
+ this.connecting = false;
94
+ this.readyState = 'open';
95
+ this.emit('connect');
96
+ if (cb) cb();
97
+ });
98
+
99
+ return this;
100
+ }
101
+
102
+ address(): AddressInfo | null {
103
+ if (!this._connected) return null;
104
+ return {
105
+ address: this._localAddress,
106
+ family: 'IPv4',
107
+ port: this._localPort,
108
+ };
109
+ }
110
+
111
+ setEncoding(encoding: BufferEncoding): this {
112
+ return this;
113
+ }
114
+
115
+ setTimeout(timeout: number, callback?: () => void): this {
116
+ if (callback) {
117
+ this.once('timeout', callback);
118
+ }
119
+ return this;
120
+ }
121
+
122
+ setNoDelay(noDelay?: boolean): this {
123
+ return this;
124
+ }
125
+
126
+ setKeepAlive(enable?: boolean, initialDelay?: number): this {
127
+ return this;
128
+ }
129
+
130
+ ref(): this {
131
+ return this;
132
+ }
133
+
134
+ unref(): this {
135
+ return this;
136
+ }
137
+
138
+ destroy(error?: Error): this {
139
+ if (this._destroyed) return this;
140
+
141
+ this._destroyed = true;
142
+ this._connected = false;
143
+ this.destroyed = true;
144
+ this.readyState = 'closed';
145
+
146
+ if (error) {
147
+ this.emit('error', error);
148
+ }
149
+
150
+ queueMicrotask(() => {
151
+ this.emit('close', !!error);
152
+ });
153
+
154
+ return this;
155
+ }
156
+
157
+ // Internal: simulate receiving data from remote
158
+ _receiveData(data: Buffer | string): void {
159
+ const buffer = typeof data === 'string' ? Buffer.from(data) : data;
160
+ this.push(buffer);
161
+ }
162
+
163
+ // Internal: signal end of remote data
164
+ _receiveEnd(): void {
165
+ this.push(null);
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Virtual Server implementation
171
+ */
172
+ export class Server extends EventEmitter {
173
+ private _listening: boolean = false;
174
+ private _address: AddressInfo | null = null;
175
+ private _connections: Set<Socket> = new Set();
176
+ private _maxConnections: number = Infinity;
177
+
178
+ listening: boolean = false;
179
+ maxConnections?: number;
180
+
181
+ constructor(
182
+ optionsOrConnectionListener?: ServerOptions | ((socket: Socket) => void),
183
+ connectionListener?: (socket: Socket) => void
184
+ ) {
185
+ super();
186
+
187
+ let listener: ((socket: Socket) => void) | undefined;
188
+
189
+ if (typeof optionsOrConnectionListener === 'function') {
190
+ listener = optionsOrConnectionListener;
191
+ } else {
192
+ listener = connectionListener;
193
+ }
194
+
195
+ if (listener) {
196
+ this.on('connection', listener as EventListener);
197
+ }
198
+ }
199
+
200
+ listen(
201
+ portOrOptions?: number | ListenOptions,
202
+ hostOrCallback?: string | number | (() => void),
203
+ backlogOrCallback?: number | (() => void),
204
+ callback?: () => void
205
+ ): this {
206
+ let port: number = 0;
207
+ let host: string = '0.0.0.0';
208
+ let cb: (() => void) | undefined;
209
+
210
+ if (typeof portOrOptions === 'number') {
211
+ port = portOrOptions;
212
+
213
+ if (typeof hostOrCallback === 'string') {
214
+ host = hostOrCallback;
215
+ if (typeof backlogOrCallback === 'function') {
216
+ cb = backlogOrCallback;
217
+ } else {
218
+ cb = callback;
219
+ }
220
+ } else if (typeof hostOrCallback === 'function') {
221
+ cb = hostOrCallback;
222
+ } else if (typeof hostOrCallback === 'number') {
223
+ // backlog
224
+ cb = typeof backlogOrCallback === 'function' ? backlogOrCallback : callback;
225
+ } else {
226
+ // hostOrCallback is undefined, check if callback is in third position
227
+ if (typeof backlogOrCallback === 'function') {
228
+ cb = backlogOrCallback;
229
+ } else if (typeof callback === 'function') {
230
+ cb = callback;
231
+ }
232
+ }
233
+ } else if (portOrOptions) {
234
+ port = portOrOptions.port || 0;
235
+ host = portOrOptions.host || '0.0.0.0';
236
+ cb = typeof hostOrCallback === 'function' ? hostOrCallback : callback;
237
+ }
238
+
239
+ // Assign random port if 0
240
+ if (port === 0) {
241
+ port = 3000 + Math.floor(Math.random() * 1000);
242
+ }
243
+
244
+ this._address = {
245
+ address: host,
246
+ family: 'IPv4',
247
+ port,
248
+ };
249
+
250
+ this._listening = true;
251
+ this.listening = true;
252
+
253
+ queueMicrotask(() => {
254
+ this.emit('listening');
255
+ if (cb) cb();
256
+ });
257
+
258
+ return this;
259
+ }
260
+
261
+ address(): AddressInfo | null {
262
+ return this._address;
263
+ }
264
+
265
+ close(callback?: (err?: Error) => void): this {
266
+ this._listening = false;
267
+ this.listening = false;
268
+
269
+ // Close all connections
270
+ for (const socket of this._connections) {
271
+ socket.destroy();
272
+ }
273
+ this._connections.clear();
274
+
275
+ queueMicrotask(() => {
276
+ this.emit('close');
277
+ if (callback) callback();
278
+ });
279
+
280
+ return this;
281
+ }
282
+
283
+ getConnections(callback: (err: Error | null, count: number) => void): void {
284
+ callback(null, this._connections.size);
285
+ }
286
+
287
+ ref(): this {
288
+ return this;
289
+ }
290
+
291
+ unref(): this {
292
+ return this;
293
+ }
294
+
295
+ // Internal: handle incoming connection
296
+ _handleConnection(socket: Socket): void {
297
+ if (!this._listening) {
298
+ socket.destroy();
299
+ return;
300
+ }
301
+
302
+ this._connections.add(socket);
303
+
304
+ socket.on('close', () => {
305
+ this._connections.delete(socket);
306
+ });
307
+
308
+ this.emit('connection', socket);
309
+ }
310
+ }
311
+
312
+ export function createServer(
313
+ optionsOrConnectionListener?: ServerOptions | ((socket: Socket) => void),
314
+ connectionListener?: (socket: Socket) => void
315
+ ): Server {
316
+ return new Server(optionsOrConnectionListener, connectionListener);
317
+ }
318
+
319
+ export function createConnection(
320
+ portOrOptions: number | { port: number; host?: string },
321
+ hostOrCallback?: string | (() => void),
322
+ callback?: () => void
323
+ ): Socket {
324
+ const socket = new Socket();
325
+ return socket.connect(portOrOptions, hostOrCallback as string, callback);
326
+ }
327
+
328
+ export const connect = createConnection;
329
+
330
+ export function isIP(input: string): number {
331
+ // Simple IPv4 check
332
+ if (/^(\d{1,3}\.){3}\d{1,3}$/.test(input)) {
333
+ return 4;
334
+ }
335
+ // Simple IPv6 check
336
+ if (/^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$/.test(input)) {
337
+ return 6;
338
+ }
339
+ return 0;
340
+ }
341
+
342
+ export function isIPv4(input: string): boolean {
343
+ return isIP(input) === 4;
344
+ }
345
+
346
+ export function isIPv6(input: string): boolean {
347
+ return isIP(input) === 6;
348
+ }
349
+
350
+ export default {
351
+ Socket,
352
+ Server,
353
+ createServer,
354
+ createConnection,
355
+ connect,
356
+ isIP,
357
+ isIPv4,
358
+ isIPv6,
359
+ };