elit 3.3.3 → 3.3.5

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 (145) hide show
  1. package/dist/build.d.mts +1 -1
  2. package/dist/build.js +1 -0
  3. package/dist/build.js.map +1 -0
  4. package/dist/build.mjs +1 -0
  5. package/dist/build.mjs.map +1 -0
  6. package/dist/chokidar.js +1 -0
  7. package/dist/chokidar.js.map +1 -0
  8. package/dist/chokidar.mjs +1 -0
  9. package/dist/chokidar.mjs.map +1 -0
  10. package/dist/cli.js +4720 -37
  11. package/dist/config.d.mts +3 -1
  12. package/dist/config.d.ts +3 -1
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +1 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/config.mjs +1 -0
  17. package/dist/config.mjs.map +1 -0
  18. package/dist/coverage.d.mts +85 -0
  19. package/dist/coverage.d.ts +76 -0
  20. package/dist/coverage.d.ts.map +1 -0
  21. package/dist/coverage.js +1549 -0
  22. package/dist/coverage.js.map +1 -0
  23. package/dist/coverage.mjs +1520 -0
  24. package/dist/coverage.mjs.map +1 -0
  25. package/dist/database.d.mts +31 -6
  26. package/dist/database.d.ts +31 -6
  27. package/dist/database.d.ts.map +1 -1
  28. package/dist/database.js +60 -33
  29. package/dist/database.js.map +1 -0
  30. package/dist/database.mjs +60 -33
  31. package/dist/database.mjs.map +1 -0
  32. package/dist/dom.js +1 -0
  33. package/dist/dom.js.map +1 -0
  34. package/dist/dom.mjs +1 -0
  35. package/dist/dom.mjs.map +1 -0
  36. package/dist/el.js +1 -0
  37. package/dist/el.js.map +1 -0
  38. package/dist/el.mjs +1 -0
  39. package/dist/el.mjs.map +1 -0
  40. package/dist/fs.js +1 -0
  41. package/dist/fs.js.map +1 -0
  42. package/dist/fs.mjs +1 -0
  43. package/dist/fs.mjs.map +1 -0
  44. package/dist/hmr.js +1 -0
  45. package/dist/hmr.js.map +1 -0
  46. package/dist/hmr.mjs +1 -0
  47. package/dist/hmr.mjs.map +1 -0
  48. package/dist/http.js +1 -0
  49. package/dist/http.js.map +1 -0
  50. package/dist/http.mjs +1 -0
  51. package/dist/http.mjs.map +1 -0
  52. package/dist/https.d.mts +1 -1
  53. package/dist/https.js +1 -0
  54. package/dist/https.js.map +1 -0
  55. package/dist/https.mjs +1 -0
  56. package/dist/https.mjs.map +1 -0
  57. package/dist/index.d.mts +1 -1
  58. package/dist/index.js +1 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/index.mjs +1 -0
  61. package/dist/index.mjs.map +1 -0
  62. package/dist/mime-types.js +1 -0
  63. package/dist/mime-types.js.map +1 -0
  64. package/dist/mime-types.mjs +1 -0
  65. package/dist/mime-types.mjs.map +1 -0
  66. package/dist/path.js +1 -0
  67. package/dist/path.js.map +1 -0
  68. package/dist/path.mjs +1 -0
  69. package/dist/path.mjs.map +1 -0
  70. package/dist/router.js +1 -0
  71. package/dist/router.js.map +1 -0
  72. package/dist/router.mjs +1 -0
  73. package/dist/router.mjs.map +1 -0
  74. package/dist/runtime.js +1 -0
  75. package/dist/runtime.js.map +1 -0
  76. package/dist/runtime.mjs +1 -0
  77. package/dist/runtime.mjs.map +1 -0
  78. package/dist/{server-Cz3z-5ls.d.mts → server-BFTzgJpO.d.mts} +62 -1
  79. package/dist/{server-BG2CaVMh.d.ts → server-CIXtexNS.d.ts} +62 -1
  80. package/dist/server.d.mts +1 -1
  81. package/dist/server.d.ts +9 -0
  82. package/dist/server.d.ts.map +1 -1
  83. package/dist/server.js +45 -3
  84. package/dist/server.js.map +1 -0
  85. package/dist/server.mjs +45 -3
  86. package/dist/server.mjs.map +1 -0
  87. package/dist/state.d.mts +1 -1
  88. package/dist/state.js +1 -0
  89. package/dist/state.js.map +1 -0
  90. package/dist/state.mjs +1 -0
  91. package/dist/state.mjs.map +1 -0
  92. package/dist/style.js +1 -0
  93. package/dist/style.js.map +1 -0
  94. package/dist/style.mjs +1 -0
  95. package/dist/style.mjs.map +1 -0
  96. package/dist/test-globals.d.ts +184 -0
  97. package/dist/test-reporter.d.mts +77 -0
  98. package/dist/test-reporter.d.ts +73 -0
  99. package/dist/test-reporter.d.ts.map +1 -0
  100. package/dist/test-reporter.js +726 -0
  101. package/dist/test-reporter.js.map +1 -0
  102. package/dist/test-reporter.mjs +696 -0
  103. package/dist/test-reporter.mjs.map +1 -0
  104. package/dist/test-runtime.d.mts +122 -0
  105. package/dist/test-runtime.d.ts +120 -0
  106. package/dist/test-runtime.d.ts.map +1 -0
  107. package/dist/test-runtime.js +1292 -0
  108. package/dist/test-runtime.js.map +1 -0
  109. package/dist/test-runtime.mjs +1269 -0
  110. package/dist/test-runtime.mjs.map +1 -0
  111. package/dist/test.d.mts +39 -0
  112. package/dist/test.d.ts +38 -0
  113. package/dist/test.d.ts.map +1 -0
  114. package/dist/test.js +4966 -0
  115. package/dist/test.js.map +1 -0
  116. package/dist/test.mjs +4944 -0
  117. package/dist/test.mjs.map +1 -0
  118. package/dist/types.d.mts +62 -1
  119. package/dist/types.d.ts +52 -0
  120. package/dist/types.d.ts.map +1 -1
  121. package/dist/types.js +1 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/types.mjs +1 -0
  124. package/dist/types.mjs.map +1 -0
  125. package/dist/ws.d.ts.map +1 -1
  126. package/dist/ws.js +24 -2
  127. package/dist/ws.js.map +1 -0
  128. package/dist/ws.mjs +24 -2
  129. package/dist/ws.mjs.map +1 -0
  130. package/dist/wss.js +24 -2
  131. package/dist/wss.js.map +1 -0
  132. package/dist/wss.mjs +24 -2
  133. package/dist/wss.mjs.map +1 -0
  134. package/package.json +37 -5
  135. package/src/cli.ts +165 -1
  136. package/src/config.ts +3 -1
  137. package/src/coverage.ts +1479 -0
  138. package/src/database.ts +71 -35
  139. package/src/server.ts +25 -1
  140. package/src/test-globals.d.ts +184 -0
  141. package/src/test-reporter.ts +609 -0
  142. package/src/test-runtime.ts +1359 -0
  143. package/src/test.ts +368 -0
  144. package/src/types.ts +59 -0
  145. package/src/ws.ts +32 -2
package/dist/types.d.mts CHANGED
@@ -186,6 +186,15 @@ declare class ServerRouter {
186
186
  private addRoute;
187
187
  private pathToRegex;
188
188
  private parseQuery;
189
+ /**
190
+ * List all registered routes for debugging
191
+ */
192
+ listRoutes(): Array<{
193
+ method: string;
194
+ pattern: string;
195
+ paramNames: string[];
196
+ handler: string;
197
+ }>;
189
198
  private parseBody;
190
199
  handle(req: IncomingMessage, res: ServerResponse): Promise<boolean>;
191
200
  }
@@ -470,5 +479,57 @@ interface PreviewOptions {
470
479
  /** Environment variables to inject (prefix with VITE_ for client access) */
471
480
  env?: Record<string, string>;
472
481
  }
482
+ type TestEnvironment = 'node' | 'jsdom' | 'happy-dom' | 'edge-runtime';
483
+ type TestCoverageProvider = 'v8' | 'istanbul';
484
+ type TestCoverageReporter = 'text' | 'json' | 'html' | 'lcov' | 'lcovonly' | 'coverage-final.json' | 'clover';
485
+ interface TestCoverageOptions {
486
+ provider?: TestCoverageProvider;
487
+ reporter?: TestCoverageReporter[];
488
+ dir?: string;
489
+ include?: string[];
490
+ exclude?: string[];
491
+ thresholds?: {
492
+ lines?: number;
493
+ functions?: number;
494
+ branches?: number;
495
+ statements?: number;
496
+ };
497
+ all?: boolean;
498
+ }
499
+ interface TestOptions {
500
+ environment?: TestEnvironment;
501
+ globals?: boolean;
502
+ setupFiles?: string[];
503
+ include?: string[];
504
+ exclude?: string[];
505
+ testTimeout?: number;
506
+ isolate?: boolean;
507
+ pool?: string;
508
+ poolOptions?: {
509
+ threads?: {
510
+ singleThread?: boolean;
511
+ minThreads?: number;
512
+ maxThreads?: number;
513
+ isolate?: boolean;
514
+ };
515
+ forks?: {
516
+ singleFork?: boolean;
517
+ minForks?: number;
518
+ maxForks?: number;
519
+ isolate?: boolean;
520
+ };
521
+ };
522
+ coverage?: TestCoverageOptions;
523
+ watch?: boolean;
524
+ ui?: boolean;
525
+ reporter?: 'verbose' | 'dot' | 'json' | 'tap';
526
+ bail?: number | boolean;
527
+ pattern?: string | RegExp;
528
+ colors?: boolean;
529
+ retry?: number;
530
+ includeSrc?: string[];
531
+ excludeSrc?: string[];
532
+ env?: Record<string, string>;
533
+ }
473
534
 
474
- export type { BuildOptions, BuildResult, Child, Children, ClientConfig, DevServer, DevServerOptions, ElementFactory, HMRMessage, JsonNode, PreviewOptions, Props, ProxyConfig, RefCallback, RefObject, Router, State, StateManager, StateOptions, VNode, VNodeJson, VirtualListController, WorkerConfig };
535
+ export type { BuildOptions, BuildResult, Child, Children, ClientConfig, DevServer, DevServerOptions, ElementFactory, HMRMessage, JsonNode, PreviewOptions, Props, ProxyConfig, RefCallback, RefObject, Router, State, StateManager, StateOptions, TestCoverageOptions, TestCoverageProvider, TestCoverageReporter, TestEnvironment, TestOptions, VNode, VNodeJson, VirtualListController, WorkerConfig };
package/dist/types.d.ts CHANGED
@@ -242,4 +242,56 @@ export interface PreviewOptions {
242
242
  /** Environment variables to inject (prefix with VITE_ for client access) */
243
243
  env?: Record<string, string>;
244
244
  }
245
+ export type TestEnvironment = 'node' | 'jsdom' | 'happy-dom' | 'edge-runtime';
246
+ export type TestCoverageProvider = 'v8' | 'istanbul';
247
+ export type TestCoverageReporter = 'text' | 'json' | 'html' | 'lcov' | 'lcovonly' | 'coverage-final.json' | 'clover';
248
+ export interface TestCoverageOptions {
249
+ provider?: TestCoverageProvider;
250
+ reporter?: TestCoverageReporter[];
251
+ dir?: string;
252
+ include?: string[];
253
+ exclude?: string[];
254
+ thresholds?: {
255
+ lines?: number;
256
+ functions?: number;
257
+ branches?: number;
258
+ statements?: number;
259
+ };
260
+ all?: boolean;
261
+ }
262
+ export interface TestOptions {
263
+ environment?: TestEnvironment;
264
+ globals?: boolean;
265
+ setupFiles?: string[];
266
+ include?: string[];
267
+ exclude?: string[];
268
+ testTimeout?: number;
269
+ isolate?: boolean;
270
+ pool?: string;
271
+ poolOptions?: {
272
+ threads?: {
273
+ singleThread?: boolean;
274
+ minThreads?: number;
275
+ maxThreads?: number;
276
+ isolate?: boolean;
277
+ };
278
+ forks?: {
279
+ singleFork?: boolean;
280
+ minForks?: number;
281
+ maxForks?: number;
282
+ isolate?: boolean;
283
+ };
284
+ };
285
+ coverage?: TestCoverageOptions;
286
+ watch?: boolean;
287
+ ui?: boolean;
288
+ reporter?: 'verbose' | 'dot' | 'json' | 'tap';
289
+ bail?: number | boolean;
290
+ pattern?: string | RegExp;
291
+ colors?: boolean;
292
+ retry?: number;
293
+ includeSrc?: string[];
294
+ excludeSrc?: string[];
295
+ env?: Record<string, string>;
296
+ }
245
297
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -16,3 +16,4 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
16
16
  // src/types.ts
17
17
  var types_exports = {};
18
18
  module.exports = __toCommonJS(types_exports);
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * Elit - Types and Interfaces\n */\n\nexport interface VNode {\n tagName: string;\n props: Props;\n children: Children;\n}\n\nexport type Child = VNode | string | number | boolean | null | undefined | Child[];\nexport type Children = Child[];\n\nexport interface Props {\n [key: string]: any;\n className?: string | string[];\n class?: string | string[];\n style?: Partial<CSSStyleDeclaration> | string;\n dangerouslySetInnerHTML?: { __html: string };\n ref?: RefCallback | RefObject;\n onClick?: (event: MouseEvent) => void;\n onChange?: (event: Event) => void;\n onInput?: (event: Event) => void;\n onSubmit?: (event: Event) => void;\n value?: string | number;\n checked?: boolean;\n}\n\nexport type RefCallback = (element: HTMLElement | SVGElement) => void;\n\nexport interface RefObject {\n current: HTMLElement | SVGElement | null;\n}\n\nexport interface State<T> {\n value: T;\n subscribe(fn: (value: T) => void): () => void;\n destroy(): void;\n}\n\nexport interface StateOptions {\n throttle?: number;\n deep?: boolean;\n}\n\nexport interface VirtualListController {\n render: () => void;\n destroy: () => void;\n}\n\n// JSON Node structure for renderJson\nexport interface JsonNode {\n tag: string;\n attributes?: Record<string, any>;\n children?: JsonNode | JsonNode[] | string | number | boolean | null;\n}\n\n// VNode JSON structure for renderVNode (serializable VNode format)\nexport type VNodeJson = {\n tagName: string;\n props?: Record<string, any>;\n children?: (VNodeJson | string | number | boolean | null)[];\n} | string | number | boolean | null;\n\n// Element Factory type\nexport type ElementFactory = {\n (...children: Child[]): VNode;\n (props: Props | null, ...children: Child[]): VNode;\n};\n\n// ===== Development Server Types =====\n\nimport type { Server } from 'http';\nimport type { WebSocketServer } from 'ws';\n\n// Forward declarations to avoid circular dependency\nexport type Router = import('./server').ServerRouter;\nexport type StateManager = import('./server').StateManager;\n\nexport interface ClientConfig {\n /** Root directory to serve files from */\n root: string;\n /** Base path for the client application (e.g., '/app1', '/app2') */\n basePath: string;\n /** Custom index file path (relative to root, e.g., './public/index.html') */\n index?: string;\n /** SSR render function - returns HTML VNode or string */\n ssr?: () => Child | string;\n /** Watch patterns for file changes */\n watch?: string[];\n /** Ignore patterns for file watching */\n ignore?: string[];\n /** Proxy configuration specific to this client */\n proxy?: ProxyConfig[];\n /** Worker scripts specific to this client */\n worker?: WorkerConfig[];\n /** API router for REST endpoints specific to this client */\n api?: Router;\n /** Server mode: 'dev' uses source files, 'preview' uses built files (default: 'dev') */\n mode?: 'dev' | 'preview';\n}\n\nexport interface ProxyConfig {\n /** Path prefix to match for proxying (e.g., '/api', '/graphql') */\n context: string;\n /** Target URL to proxy to (e.g., 'http://localhost:8080') */\n target: string;\n /** Change the origin of the host header to the target URL */\n changeOrigin?: boolean;\n /** Rewrite path before sending to target */\n pathRewrite?: Record<string, string>;\n /** Additional headers to add to the proxied request */\n headers?: Record<string, string>;\n /** Enable WebSocket proxying */\n ws?: boolean;\n}\n\nexport interface WorkerConfig {\n /** Worker script path relative to root directory */\n path: string;\n /** Worker name/identifier (optional, defaults to filename) */\n name?: string;\n /** Worker type: 'module' (ESM) or 'classic' (default: 'module') */\n type?: 'module' | 'classic';\n}\n\nexport interface DevServerOptions {\n /** Port to run the server on (default: 3000) */\n port?: number;\n /** Host to bind to (default: 'localhost') */\n host?: string;\n /** Domain to map (e.g., 'idevcoder.com') - redirects domain traffic to this server's port */\n domain?: string;\n /** Root directory to serve files from */\n root?: string;\n /** Base path for the client application (e.g., '/app1', '/app2') */\n basePath?: string;\n /** Custom index file path (relative to root, e.g., './public/index.html') */\n index?: string;\n /** Array of client configurations - allows multiple clients on same port */\n clients?: ClientConfig[];\n /** Enable HTTPS (default: false) */\n https?: boolean;\n /** Open browser automatically (default: true) */\n open?: boolean;\n /** Watch patterns for file changes */\n watch?: string[];\n /** Ignore patterns for file watcher */\n ignore?: string[];\n /** Global worker scripts (applies to all clients) */\n worker?: WorkerConfig[];\n /** Enable logging (default: true) */\n logging?: boolean;\n /** API router for REST endpoints */\n api?: Router;\n /** SSR render function - returns HTML VNode or string */\n ssr?: () => Child | string;\n /** Proxy configuration for API requests */\n proxy?: ProxyConfig[];\n /** Server mode: 'dev' uses source files, 'preview' uses built files (default: 'dev') */\n mode?: 'dev' | 'preview';\n /** Environment variables to inject (prefix with VITE_ for client access) */\n env?: Record<string, string>;\n}\n\nexport interface DevServer {\n /** HTTP server instance */\n server: Server;\n /** WebSocket server for HMR */\n wss: WebSocketServer;\n /** Server URL */\n url: string;\n /** Shared state manager */\n state: StateManager;\n /** Close the server */\n close: () => Promise<void>;\n}\n\nexport interface HMRMessage {\n type: 'update' | 'reload' | 'error' | 'connected';\n path?: string;\n timestamp?: number;\n error?: string;\n}\n\n// ===== Build Types =====\n\nexport interface BuildOptions {\n /** Entry file to build */\n entry: string;\n /** Output directory */\n outDir?: string;\n /** Output filename */\n outFile?: string;\n /** Enable minification */\n minify?: boolean;\n /** Generate sourcemap */\n sourcemap?: boolean;\n /** Target environment */\n target?: 'es2015' | 'es2016' | 'es2017' | 'es2018' | 'es2019' | 'es2020' | 'es2021' | 'es2022' | 'esnext';\n /** Output format */\n format?: 'esm' | 'cjs' | 'iife';\n /** Global name for IIFE format */\n globalName?: string;\n /** Target platform */\n platform?: 'browser' | 'node' | 'neutral';\n /** Base path for the application (injected into HTML) */\n basePath?: string;\n /** External dependencies (not bundled) */\n external?: string[];\n /** Module resolution options */\n resolve?: {\n /** Alias imports to other paths or modules */\n alias?: Record<string, string>;\n };\n /** Enable tree shaking */\n treeshake?: boolean;\n /** Enable logging */\n logging?: boolean;\n /** Environment variables to inject (prefix with VITE_ for client access) */\n env?: Record<string, string>;\n /** Copy static files after build */\n copy?: Array<{ from: string; to: string; transform?: (content: string, config: BuildOptions) => string }>;\n /** Post-build hook */\n onBuildEnd?: (result: BuildResult) => void | Promise<void>;\n}\n\nexport interface BuildResult {\n /** Output file path */\n outputPath: string;\n /** Build time in milliseconds */\n buildTime: number;\n /** Output file size in bytes */\n size: number;\n}\n\n// ===== Preview Types =====\n\nexport interface PreviewOptions {\n /** Port to run the preview server on (default: 4173) */\n port?: number;\n /** Host to bind to (default: 'localhost') */\n host?: string;\n /** Domain to map (e.g., 'idevcoder.com') - redirects domain traffic to this server's port */\n domain?: string;\n /** Root directory to serve files from (default: dist or build.outDir) */\n root?: string;\n /** Base path for the application (e.g., '/app') */\n basePath?: string;\n /** Custom index file path (relative to root, e.g., './public/index.html') */\n index?: string;\n /** Array of client configurations - allows multiple clients on same port */\n clients?: ClientConfig[];\n /** Enable HTTPS (default: false) */\n https?: boolean;\n /** Open browser automatically (default: true) */\n open?: boolean;\n /** Enable logging (default: true) */\n logging?: boolean;\n /** API router for REST endpoints */\n api?: Router;\n /** SSR render function - returns HTML VNode or string */\n ssr?: () => Child | string;\n /** Proxy configuration for API requests */\n proxy?: ProxyConfig[];\n /** Global worker scripts (applies to all clients) */\n worker?: WorkerConfig[];\n /** Environment variables to inject (prefix with VITE_ for client access) */\n env?: Record<string, string>;\n}\n\n// ===== Test Types =====\n\nexport type TestEnvironment = 'node' | 'jsdom' | 'happy-dom' | 'edge-runtime';\n\nexport type TestCoverageProvider = 'v8' | 'istanbul';\n\nexport type TestCoverageReporter = 'text' | 'json' | 'html' | 'lcov' | 'lcovonly' | 'coverage-final.json' | 'clover';\n\nexport interface TestCoverageOptions {\n provider?: TestCoverageProvider;\n reporter?: TestCoverageReporter[];\n dir?: string;\n include?: string[];\n exclude?: string[];\n thresholds?: {\n lines?: number;\n functions?: number;\n branches?: number;\n statements?: number;\n };\n all?: boolean;\n}\n\nexport interface TestOptions {\n environment?: TestEnvironment;\n globals?: boolean;\n setupFiles?: string[];\n include?: string[];\n exclude?: string[];\n testTimeout?: number;\n isolate?: boolean;\n pool?: string;\n poolOptions?: {\n threads?: {\n singleThread?: boolean;\n minThreads?: number;\n maxThreads?: number;\n isolate?: boolean;\n };\n forks?: {\n singleFork?: boolean;\n minForks?: number;\n maxForks?: number;\n isolate?: boolean;\n };\n };\n coverage?: TestCoverageOptions;\n watch?: boolean;\n ui?: boolean;\n reporter?: 'verbose' | 'dot' | 'json' | 'tap';\n bail?: number | boolean;\n pattern?: string | RegExp;\n colors?: boolean;\n retry?: number;\n includeSrc?: string[];\n excludeSrc?: string[];\n env?: Record<string, string>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
package/dist/types.mjs CHANGED
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/ws.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../src/ws.ts"],"names":[],"mappings":"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"}
package/dist/ws.js CHANGED
@@ -253,13 +253,34 @@ var WebSocketServer = class extends import_events.EventEmitter {
253
253
  client.emit("close", CLOSE_CODES.NORMAL, "");
254
254
  });
255
255
  socket.on("error", (error) => {
256
+ const errorCode = error.code;
257
+ if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
258
+ return;
259
+ }
256
260
  client.emit("error", error);
257
261
  });
258
262
  client.send = (data, _options, callback) => {
263
+ if (!socket.writable || client.readyState !== 1 /* OPEN */) {
264
+ const err = new Error("WebSocket is not open");
265
+ err.code = "WS_NOT_OPEN";
266
+ queueCallback(callback, err);
267
+ return;
268
+ }
259
269
  try {
260
270
  const frame = this._createFrame(data);
261
- socket.write(frame);
262
- queueCallback(callback);
271
+ socket.write(frame, (err) => {
272
+ if (err) {
273
+ const errorCode = err.code;
274
+ if (errorCode !== "ECONNABORTED" && errorCode !== "ECONNRESET" && errorCode !== "EPIPE") {
275
+ queueCallback(callback, err);
276
+ } else {
277
+ client.readyState = 3 /* CLOSED */;
278
+ queueCallback(callback);
279
+ }
280
+ } else {
281
+ queueCallback(callback);
282
+ }
283
+ });
263
284
  } catch (error) {
264
285
  queueCallback(callback, error);
265
286
  }
@@ -378,3 +399,4 @@ var ws_default = {
378
399
  createWebSocketServer,
379
400
  getRuntime
380
401
  });
402
+ //# sourceMappingURL=ws.js.map
package/dist/ws.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ws.ts","../src/runtime.ts"],"sourcesContent":["/**\n * WebSocket module with unified API across runtimes\n * Pure implementation without external dependencies\n * - Node.js: uses native 'ws' module (built-in WebSocket implementation)\n * - Bun: uses native WebSocket\n * - Deno: uses native WebSocket\n */\n\nimport { EventEmitter } from 'events';\nimport type { IncomingMessage } from './http';\nimport { runtime } from './runtime';\n\n/**\n * WebSocket ready state\n */\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\n/**\n * WebSocket close codes\n */\nexport const CLOSE_CODES = {\n NORMAL: 1000,\n GOING_AWAY: 1001,\n PROTOCOL_ERROR: 1002,\n UNSUPPORTED_DATA: 1003,\n NO_STATUS: 1005,\n ABNORMAL: 1006,\n INVALID_DATA: 1007,\n POLICY_VIOLATION: 1008,\n MESSAGE_TOO_BIG: 1009,\n EXTENSION_REQUIRED: 1010,\n INTERNAL_ERROR: 1011,\n SERVICE_RESTART: 1012,\n TRY_AGAIN_LATER: 1013,\n BAD_GATEWAY: 1014,\n TLS_HANDSHAKE_FAIL: 1015,\n} as const;\n\n/**\n * WebSocket data types\n */\nexport type Data = string | Buffer | ArrayBuffer | Buffer[];\n\n/**\n * WebSocket send options\n */\nexport interface SendOptions {\n binary?: boolean;\n compress?: boolean;\n fin?: boolean;\n mask?: boolean;\n}\n\n/**\n * WebSocket server options\n */\nexport interface ServerOptions {\n host?: string;\n port?: number;\n backlog?: number;\n server?: any;\n verifyClient?: VerifyClientCallback;\n handleProtocols?: (protocols: Set<string>, request: IncomingMessage) => string | false;\n path?: string;\n noServer?: boolean;\n clientTracking?: boolean;\n perMessageDeflate?: boolean | object;\n maxPayload?: number;\n}\n\n/**\n * Verify client callback\n */\nexport type VerifyClientCallback = (\n info: {\n origin: string;\n secure: boolean;\n req: IncomingMessage;\n },\n callback?: (result: boolean, code?: number, message?: string) => void\n) => boolean | void;\n\n/**\n * Helper: Queue callback with optional error (eliminates duplication in callback handling)\n */\nfunction queueCallback(callback?: (err?: Error) => void, error?: Error): void {\n if (callback) {\n queueMicrotask(() => callback(error));\n }\n}\n\n/**\n * Helper: Create native WebSocket instance (eliminates duplication in constructor)\n */\nfunction createNativeWebSocket(url: string, protocols?: string[]): any {\n // @ts-ignore - WebSocket is available in Node.js 18+ and all modern runtimes\n if (runtime === 'node' && typeof globalThis.WebSocket === 'undefined') {\n throw new Error('WebSocket is not available. Please use Node.js 18+ or install ws package.');\n }\n // @ts-ignore\n return new globalThis.WebSocket(url, protocols);\n}\n\n/**\n * WebSocket class - Pure implementation\n */\nexport class WebSocket extends EventEmitter {\n public readyState: ReadyState = ReadyState.CONNECTING;\n public url: string;\n public protocol: string = '';\n public extensions: string = '';\n public binaryType: 'nodebuffer' | 'arraybuffer' | 'fragments' = 'nodebuffer';\n\n /** @internal */\n public _socket: any;\n\n constructor(address: string | URL, protocols?: string | string[], _options?: any) {\n super();\n this.url = typeof address === 'string' ? address : address.toString();\n const protocolsArray = Array.isArray(protocols) ? protocols : protocols ? [protocols] : undefined;\n this._socket = createNativeWebSocket(this.url, protocolsArray);\n this._setupNativeSocket();\n }\n\n private _setupNativeSocket(): void {\n this._socket.onopen = () => {\n this.readyState = ReadyState.OPEN;\n this.emit('open');\n };\n\n this._socket.onmessage = (event: MessageEvent) => {\n const isBinary = event.data instanceof ArrayBuffer || event.data instanceof Blob;\n this.emit('message', event.data, isBinary);\n };\n\n this._socket.onclose = (event: CloseEvent) => {\n this.readyState = ReadyState.CLOSED;\n this.emit('close', event.code, event.reason);\n };\n\n this._socket.onerror = () => {\n this.emit('error', new Error('WebSocket error'));\n };\n }\n\n /**\n * Send data through WebSocket\n */\n send(data: Data, options?: SendOptions | ((err?: Error) => void), callback?: (err?: Error) => void): void {\n const cb = typeof options === 'function' ? options : callback;\n\n if (this.readyState !== ReadyState.OPEN) {\n return queueCallback(cb, new Error('WebSocket is not open'));\n }\n\n try {\n this._socket.send(data);\n queueCallback(cb);\n } catch (error) {\n queueCallback(cb, error as Error);\n }\n }\n\n /**\n * Close the WebSocket connection\n */\n close(code?: number, reason?: string | Buffer): void {\n if (this.readyState === ReadyState.CLOSED || this.readyState === ReadyState.CLOSING) {\n return;\n }\n\n this.readyState = ReadyState.CLOSING;\n this._socket.close(code, typeof reason === 'string' ? reason : reason?.toString());\n }\n\n /**\n * Pause the socket (no-op for native WebSocket)\n */\n pause(): void {\n // Native WebSocket doesn't support pause\n }\n\n /**\n * Resume the socket (no-op for native WebSocket)\n */\n resume(): void {\n // Native WebSocket doesn't support resume\n }\n\n /**\n * Send a ping frame (no-op for native WebSocket)\n */\n ping(_data?: Data, _mask?: boolean, callback?: (err?: Error) => void): void {\n queueCallback(callback); // Native WebSocket doesn't expose ping\n }\n\n /**\n * Send a pong frame (no-op for native WebSocket)\n */\n pong(_data?: Data, _mask?: boolean, callback?: (err?: Error) => void): void {\n queueCallback(callback); // Native WebSocket doesn't expose pong\n }\n\n /**\n * Terminate the connection\n */\n terminate(): void {\n this._socket.close();\n this.readyState = ReadyState.CLOSED;\n }\n\n /**\n * Get buffered amount\n */\n get bufferedAmount(): number {\n return this._socket.bufferedAmount || 0;\n }\n}\n\n/**\n * WebSocket Server - Server-side WebSocket implementation\n */\nexport class WebSocketServer extends EventEmitter {\n public clients: Set<WebSocket> = new Set();\n public options: ServerOptions;\n public path: string;\n\n private _httpServer: any;\n\n constructor(options?: ServerOptions, callback?: () => void) {\n super();\n this.options = options || {};\n this.path = options?.path || '/';\n\n if (runtime === 'node') {\n // Node.js - create HTTP server with WebSocket upgrade\n if (options?.server) {\n this._httpServer = options.server;\n this._setupUpgradeHandler();\n } else if (options?.noServer) {\n // No server mode - user will call handleUpgrade manually\n } else {\n // Create new HTTP server\n const http = require('http');\n this._httpServer = http.createServer();\n this._setupUpgradeHandler();\n\n if (options?.port) {\n this._httpServer.listen(options.port, options.host, callback);\n }\n }\n } else {\n // Bun/Deno - WebSocket server setup\n queueCallback(callback as any);\n }\n }\n\n private _setupUpgradeHandler(): void {\n this._httpServer.on('upgrade', (request: any, socket: any, head: Buffer) => {\n console.log('[WebSocket] Upgrade request:', request.url, 'Expected:', this.path);\n if (this.path && this.path !== '/' && request.url !== this.path) {\n console.log('[WebSocket] Path mismatch, ignoring');\n return;\n }\n\n this.handleUpgrade(request, socket, head, (client) => {\n console.log('[WebSocket] Client connected');\n this.emit('connection', client, request);\n });\n });\n }\n\n /**\n * Handle HTTP upgrade for WebSocket\n */\n handleUpgrade(request: IncomingMessage, socket: any, _head: Buffer, callback: (client: WebSocket) => void): void {\n // Simple WebSocket handshake\n const key = request.headers['sec-websocket-key'];\n if (!key) {\n socket.end('HTTP/1.1 400 Bad Request\\r\\n\\r\\n');\n return;\n }\n\n // Generate accept key\n const crypto = require('crypto');\n const acceptKey = crypto\n .createHash('sha1')\n .update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')\n .digest('base64');\n\n // Send handshake response\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${acceptKey}`,\n '',\n ''\n ];\n\n socket.write(headers.join('\\r\\n'));\n\n // Create WebSocket client from raw socket\n const client = this._createClientFromSocket(socket);\n\n if (this.options.clientTracking !== false) {\n this.clients.add(client);\n client.on('close', () => {\n this.clients.delete(client);\n });\n }\n\n callback(client);\n }\n\n private _createClientFromSocket(socket: any): WebSocket {\n const client = Object.create(WebSocket.prototype);\n EventEmitter.call(client);\n\n client.readyState = ReadyState.OPEN;\n client.url = 'ws://localhost';\n client.protocol = '';\n client.extensions = '';\n client.binaryType = 'nodebuffer';\n client._socket = socket;\n\n // Handle incoming frames\n socket.on('data', (data: Buffer) => {\n // Simple frame parsing (minimal implementation)\n try {\n const message = this._parseFrame(data);\n if (message) {\n client.emit('message', message, false);\n }\n } catch (error) {\n client.emit('error', error);\n }\n });\n\n socket.on('end', () => {\n client.readyState = ReadyState.CLOSED;\n client.emit('close', CLOSE_CODES.NORMAL, '');\n });\n\n socket.on('error', (error: Error) => {\n // Silently ignore connection errors (ECONNABORTED, ECONNRESET, etc.)\n // These are normal when clients disconnect during HMR\n const errorCode = (error as any).code;\n if (errorCode === 'ECONNABORTED' || errorCode === 'ECONNRESET' || errorCode === 'EPIPE') {\n // Silently ignore - connection was closed by client\n return;\n }\n // Only emit other errors\n client.emit('error', error);\n });\n\n // Override send method\n client.send = (data: Data, _options?: any, callback?: (err?: Error) => void) => {\n // Check if socket is still writable\n if (!socket.writable || client.readyState !== ReadyState.OPEN) {\n const err = new Error('WebSocket is not open');\n (err as any).code = 'WS_NOT_OPEN';\n queueCallback(callback, err);\n return;\n }\n\n try {\n const frame = this._createFrame(data);\n socket.write(frame, (err?: Error) => {\n // Handle async write errors (ECONNABORTED, ECONNRESET, etc.)\n if (err) {\n const errorCode = (err as any).code;\n // Silently ignore connection errors - these are normal during HMR\n if (errorCode !== 'ECONNABORTED' && errorCode !== 'ECONNRESET' && errorCode !== 'EPIPE') {\n queueCallback(callback, err);\n } else {\n // Connection closed - mark client as closed\n client.readyState = ReadyState.CLOSED;\n queueCallback(callback); // Call without error for graceful handling\n }\n } else {\n queueCallback(callback);\n }\n });\n } catch (error) {\n queueCallback(callback, error as Error);\n }\n };\n\n // Override close method\n client.close = (_code?: number, _reason?: string) => {\n socket.end();\n client.readyState = ReadyState.CLOSED;\n };\n\n return client;\n }\n\n private _parseFrame(data: Buffer): string | null {\n // Minimal WebSocket frame parsing\n if (data.length < 2) return null;\n\n const firstByte = data[0];\n const secondByte = data[1];\n\n const opcode = firstByte & 0x0f;\n const isMasked = (secondByte & 0x80) === 0x80;\n let payloadLength = secondByte & 0x7f;\n let offset = 2;\n\n if (payloadLength === 126) {\n payloadLength = data.readUInt16BE(2);\n offset = 4;\n } else if (payloadLength === 127) {\n payloadLength = Number(data.readBigUInt64BE(2));\n offset = 10;\n }\n\n let payload = data.subarray(offset);\n\n if (isMasked) {\n const maskKey = data.subarray(offset, offset + 4);\n payload = data.subarray(offset + 4, offset + 4 + payloadLength);\n\n // Unmask payload\n for (let i = 0; i < payload.length; i++) {\n payload[i] ^= maskKey[i % 4];\n }\n }\n\n // Text frame (opcode 1)\n if (opcode === 1) {\n return payload.toString('utf8');\n }\n\n return null;\n }\n\n private _createFrame(data: Data): Buffer {\n // Create simple text frame (opcode 1, no masking)\n const payload = typeof data === 'string' ? Buffer.from(data) : data;\n const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;\n\n let frame: Buffer;\n let offset = 2;\n\n if (payloadLength < 126) {\n frame = Buffer.allocUnsafe(2 + payloadLength);\n frame[1] = payloadLength;\n } else if (payloadLength < 65536) {\n frame = Buffer.allocUnsafe(4 + payloadLength);\n frame[1] = 126;\n frame.writeUInt16BE(payloadLength, 2);\n offset = 4;\n } else {\n frame = Buffer.allocUnsafe(10 + payloadLength);\n frame[1] = 127;\n frame.writeBigUInt64BE(BigInt(payloadLength), 2);\n offset = 10;\n }\n\n frame[0] = 0x81; // FIN + text frame\n\n if (Buffer.isBuffer(payload)) {\n payload.copy(frame, offset);\n }\n\n return frame;\n }\n\n /**\n * Close the server\n */\n close(callback?: (err?: Error) => void): void {\n this.clients.forEach(client => client.close());\n this.clients.clear();\n\n if (this._httpServer) {\n this._httpServer.close(callback);\n } else {\n this.emit('close');\n queueCallback(callback);\n }\n }\n\n /**\n * Check if server should handle request\n */\n shouldHandle(request: IncomingMessage): boolean {\n if (this.path && request.url !== this.path) {\n return false;\n }\n return true;\n }\n\n /**\n * Get server address\n */\n address(): { port: number; family: string; address: string } | null {\n if (this._httpServer && this._httpServer.address) {\n return this._httpServer.address();\n }\n return null;\n }\n}\n\n/**\n * Create WebSocket server\n */\nexport function createWebSocketServer(options?: ServerOptions, callback?: () => void): WebSocketServer {\n return new WebSocketServer(options, callback);\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Default export\n */\nexport default {\n WebSocket,\n WebSocketServer,\n createWebSocketServer,\n ReadyState,\n CLOSE_CODES,\n getRuntime,\n};\n","/**\n * Runtime detection and global type declarations\n * Shared across all modules for consistency\n */\n\n/**\n * Runtime detection (cached at module load)\n */\nexport const runtime = (() => {\n // @ts-ignore - Deno global\n if (typeof Deno !== 'undefined') return 'deno';\n // @ts-ignore - Bun global\n if (typeof Bun !== 'undefined') return 'bun';\n return 'node';\n})() as 'node' | 'bun' | 'deno';\n\nexport const isNode = runtime === 'node';\nexport const isBun = runtime === 'bun';\nexport const isDeno = runtime === 'deno';\n\n// Global declarations for runtime-specific APIs\ndeclare global {\n // @ts-ignore - Bun global\n const Bun: {\n build(options: {\n entrypoints: string[];\n outdir?: string;\n target?: string;\n format?: string;\n minify?: boolean;\n sourcemap?: string;\n external?: string[];\n naming?: string;\n plugins?: any[];\n define?: Record<string, string>;\n }): Promise<{\n success: boolean;\n outputs: Array<{ path: string; size: number }>;\n logs: any[];\n }>;\n Transpiler: new (options?: {\n loader?: string;\n target?: string;\n minify?: boolean;\n }) => {\n transform(code: string, loader?: string): Promise<string>;\n transformSync(code: string, loader?: string): string;\n };\n file(path: string): {\n size: number;\n arrayBuffer(): ArrayBuffer | Promise<ArrayBuffer>;\n exists(): Promise<boolean>;\n };\n write(path: string, data: string | Buffer | Uint8Array): Promise<void>;\n } | undefined;\n\n // @ts-ignore - Deno global\n const Deno: {\n emit(rootSpecifier: string | URL, options?: {\n bundle?: 'module' | 'classic';\n check?: boolean;\n compilerOptions?: any;\n importMap?: string;\n importMapPath?: string;\n sources?: Record<string, string>;\n }): Promise<{\n files: Record<string, string>;\n diagnostics: any[];\n }>;\n writeTextFile(path: string, data: string): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n readFileSync(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array): Promise<void>;\n writeFileSync(path: string, data: Uint8Array): void;\n stat(path: string): Promise<any>;\n statSync(path: string): any;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n mkdirSync(path: string, options?: { recursive?: boolean }): void;\n readDir(path: string): AsyncIterable<any>;\n readDirSync(path: string): Iterable<any>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n removeSync(path: string, options?: { recursive?: boolean }): void;\n rename(oldPath: string, newPath: string): Promise<void>;\n renameSync(oldPath: string, newPath: string): void;\n copyFile(src: string, dest: string): Promise<void>;\n copyFileSync(src: string, dest: string): void;\n realPath(path: string): Promise<string>;\n realPathSync(path: string): string;\n watchFs(paths: string | string[]): AsyncIterable<{\n kind: string;\n paths: string[];\n }>;\n build: {\n os: string;\n };\n } | undefined;\n}\n"],"mappings":"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","names":["ReadyState"]}
package/dist/ws.mjs CHANGED
@@ -231,13 +231,34 @@ var WebSocketServer = class extends EventEmitter {
231
231
  client.emit("close", CLOSE_CODES.NORMAL, "");
232
232
  });
233
233
  socket.on("error", (error) => {
234
+ const errorCode = error.code;
235
+ if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
236
+ return;
237
+ }
234
238
  client.emit("error", error);
235
239
  });
236
240
  client.send = (data, _options, callback) => {
241
+ if (!socket.writable || client.readyState !== 1 /* OPEN */) {
242
+ const err = new Error("WebSocket is not open");
243
+ err.code = "WS_NOT_OPEN";
244
+ queueCallback(callback, err);
245
+ return;
246
+ }
237
247
  try {
238
248
  const frame = this._createFrame(data);
239
- socket.write(frame);
240
- queueCallback(callback);
249
+ socket.write(frame, (err) => {
250
+ if (err) {
251
+ const errorCode = err.code;
252
+ if (errorCode !== "ECONNABORTED" && errorCode !== "ECONNRESET" && errorCode !== "EPIPE") {
253
+ queueCallback(callback, err);
254
+ } else {
255
+ client.readyState = 3 /* CLOSED */;
256
+ queueCallback(callback);
257
+ }
258
+ } else {
259
+ queueCallback(callback);
260
+ }
261
+ });
241
262
  } catch (error) {
242
263
  queueCallback(callback, error);
243
264
  }
@@ -356,3 +377,4 @@ export {
356
377
  ws_default as default,
357
378
  getRuntime
358
379
  };
380
+ //# sourceMappingURL=ws.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ws.ts","../src/runtime.ts"],"sourcesContent":["/**\n * WebSocket module with unified API across runtimes\n * Pure implementation without external dependencies\n * - Node.js: uses native 'ws' module (built-in WebSocket implementation)\n * - Bun: uses native WebSocket\n * - Deno: uses native WebSocket\n */\n\nimport { EventEmitter } from 'events';\nimport type { IncomingMessage } from './http';\nimport { runtime } from './runtime';\n\n/**\n * WebSocket ready state\n */\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\n/**\n * WebSocket close codes\n */\nexport const CLOSE_CODES = {\n NORMAL: 1000,\n GOING_AWAY: 1001,\n PROTOCOL_ERROR: 1002,\n UNSUPPORTED_DATA: 1003,\n NO_STATUS: 1005,\n ABNORMAL: 1006,\n INVALID_DATA: 1007,\n POLICY_VIOLATION: 1008,\n MESSAGE_TOO_BIG: 1009,\n EXTENSION_REQUIRED: 1010,\n INTERNAL_ERROR: 1011,\n SERVICE_RESTART: 1012,\n TRY_AGAIN_LATER: 1013,\n BAD_GATEWAY: 1014,\n TLS_HANDSHAKE_FAIL: 1015,\n} as const;\n\n/**\n * WebSocket data types\n */\nexport type Data = string | Buffer | ArrayBuffer | Buffer[];\n\n/**\n * WebSocket send options\n */\nexport interface SendOptions {\n binary?: boolean;\n compress?: boolean;\n fin?: boolean;\n mask?: boolean;\n}\n\n/**\n * WebSocket server options\n */\nexport interface ServerOptions {\n host?: string;\n port?: number;\n backlog?: number;\n server?: any;\n verifyClient?: VerifyClientCallback;\n handleProtocols?: (protocols: Set<string>, request: IncomingMessage) => string | false;\n path?: string;\n noServer?: boolean;\n clientTracking?: boolean;\n perMessageDeflate?: boolean | object;\n maxPayload?: number;\n}\n\n/**\n * Verify client callback\n */\nexport type VerifyClientCallback = (\n info: {\n origin: string;\n secure: boolean;\n req: IncomingMessage;\n },\n callback?: (result: boolean, code?: number, message?: string) => void\n) => boolean | void;\n\n/**\n * Helper: Queue callback with optional error (eliminates duplication in callback handling)\n */\nfunction queueCallback(callback?: (err?: Error) => void, error?: Error): void {\n if (callback) {\n queueMicrotask(() => callback(error));\n }\n}\n\n/**\n * Helper: Create native WebSocket instance (eliminates duplication in constructor)\n */\nfunction createNativeWebSocket(url: string, protocols?: string[]): any {\n // @ts-ignore - WebSocket is available in Node.js 18+ and all modern runtimes\n if (runtime === 'node' && typeof globalThis.WebSocket === 'undefined') {\n throw new Error('WebSocket is not available. Please use Node.js 18+ or install ws package.');\n }\n // @ts-ignore\n return new globalThis.WebSocket(url, protocols);\n}\n\n/**\n * WebSocket class - Pure implementation\n */\nexport class WebSocket extends EventEmitter {\n public readyState: ReadyState = ReadyState.CONNECTING;\n public url: string;\n public protocol: string = '';\n public extensions: string = '';\n public binaryType: 'nodebuffer' | 'arraybuffer' | 'fragments' = 'nodebuffer';\n\n /** @internal */\n public _socket: any;\n\n constructor(address: string | URL, protocols?: string | string[], _options?: any) {\n super();\n this.url = typeof address === 'string' ? address : address.toString();\n const protocolsArray = Array.isArray(protocols) ? protocols : protocols ? [protocols] : undefined;\n this._socket = createNativeWebSocket(this.url, protocolsArray);\n this._setupNativeSocket();\n }\n\n private _setupNativeSocket(): void {\n this._socket.onopen = () => {\n this.readyState = ReadyState.OPEN;\n this.emit('open');\n };\n\n this._socket.onmessage = (event: MessageEvent) => {\n const isBinary = event.data instanceof ArrayBuffer || event.data instanceof Blob;\n this.emit('message', event.data, isBinary);\n };\n\n this._socket.onclose = (event: CloseEvent) => {\n this.readyState = ReadyState.CLOSED;\n this.emit('close', event.code, event.reason);\n };\n\n this._socket.onerror = () => {\n this.emit('error', new Error('WebSocket error'));\n };\n }\n\n /**\n * Send data through WebSocket\n */\n send(data: Data, options?: SendOptions | ((err?: Error) => void), callback?: (err?: Error) => void): void {\n const cb = typeof options === 'function' ? options : callback;\n\n if (this.readyState !== ReadyState.OPEN) {\n return queueCallback(cb, new Error('WebSocket is not open'));\n }\n\n try {\n this._socket.send(data);\n queueCallback(cb);\n } catch (error) {\n queueCallback(cb, error as Error);\n }\n }\n\n /**\n * Close the WebSocket connection\n */\n close(code?: number, reason?: string | Buffer): void {\n if (this.readyState === ReadyState.CLOSED || this.readyState === ReadyState.CLOSING) {\n return;\n }\n\n this.readyState = ReadyState.CLOSING;\n this._socket.close(code, typeof reason === 'string' ? reason : reason?.toString());\n }\n\n /**\n * Pause the socket (no-op for native WebSocket)\n */\n pause(): void {\n // Native WebSocket doesn't support pause\n }\n\n /**\n * Resume the socket (no-op for native WebSocket)\n */\n resume(): void {\n // Native WebSocket doesn't support resume\n }\n\n /**\n * Send a ping frame (no-op for native WebSocket)\n */\n ping(_data?: Data, _mask?: boolean, callback?: (err?: Error) => void): void {\n queueCallback(callback); // Native WebSocket doesn't expose ping\n }\n\n /**\n * Send a pong frame (no-op for native WebSocket)\n */\n pong(_data?: Data, _mask?: boolean, callback?: (err?: Error) => void): void {\n queueCallback(callback); // Native WebSocket doesn't expose pong\n }\n\n /**\n * Terminate the connection\n */\n terminate(): void {\n this._socket.close();\n this.readyState = ReadyState.CLOSED;\n }\n\n /**\n * Get buffered amount\n */\n get bufferedAmount(): number {\n return this._socket.bufferedAmount || 0;\n }\n}\n\n/**\n * WebSocket Server - Server-side WebSocket implementation\n */\nexport class WebSocketServer extends EventEmitter {\n public clients: Set<WebSocket> = new Set();\n public options: ServerOptions;\n public path: string;\n\n private _httpServer: any;\n\n constructor(options?: ServerOptions, callback?: () => void) {\n super();\n this.options = options || {};\n this.path = options?.path || '/';\n\n if (runtime === 'node') {\n // Node.js - create HTTP server with WebSocket upgrade\n if (options?.server) {\n this._httpServer = options.server;\n this._setupUpgradeHandler();\n } else if (options?.noServer) {\n // No server mode - user will call handleUpgrade manually\n } else {\n // Create new HTTP server\n const http = require('http');\n this._httpServer = http.createServer();\n this._setupUpgradeHandler();\n\n if (options?.port) {\n this._httpServer.listen(options.port, options.host, callback);\n }\n }\n } else {\n // Bun/Deno - WebSocket server setup\n queueCallback(callback as any);\n }\n }\n\n private _setupUpgradeHandler(): void {\n this._httpServer.on('upgrade', (request: any, socket: any, head: Buffer) => {\n console.log('[WebSocket] Upgrade request:', request.url, 'Expected:', this.path);\n if (this.path && this.path !== '/' && request.url !== this.path) {\n console.log('[WebSocket] Path mismatch, ignoring');\n return;\n }\n\n this.handleUpgrade(request, socket, head, (client) => {\n console.log('[WebSocket] Client connected');\n this.emit('connection', client, request);\n });\n });\n }\n\n /**\n * Handle HTTP upgrade for WebSocket\n */\n handleUpgrade(request: IncomingMessage, socket: any, _head: Buffer, callback: (client: WebSocket) => void): void {\n // Simple WebSocket handshake\n const key = request.headers['sec-websocket-key'];\n if (!key) {\n socket.end('HTTP/1.1 400 Bad Request\\r\\n\\r\\n');\n return;\n }\n\n // Generate accept key\n const crypto = require('crypto');\n const acceptKey = crypto\n .createHash('sha1')\n .update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')\n .digest('base64');\n\n // Send handshake response\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${acceptKey}`,\n '',\n ''\n ];\n\n socket.write(headers.join('\\r\\n'));\n\n // Create WebSocket client from raw socket\n const client = this._createClientFromSocket(socket);\n\n if (this.options.clientTracking !== false) {\n this.clients.add(client);\n client.on('close', () => {\n this.clients.delete(client);\n });\n }\n\n callback(client);\n }\n\n private _createClientFromSocket(socket: any): WebSocket {\n const client = Object.create(WebSocket.prototype);\n EventEmitter.call(client);\n\n client.readyState = ReadyState.OPEN;\n client.url = 'ws://localhost';\n client.protocol = '';\n client.extensions = '';\n client.binaryType = 'nodebuffer';\n client._socket = socket;\n\n // Handle incoming frames\n socket.on('data', (data: Buffer) => {\n // Simple frame parsing (minimal implementation)\n try {\n const message = this._parseFrame(data);\n if (message) {\n client.emit('message', message, false);\n }\n } catch (error) {\n client.emit('error', error);\n }\n });\n\n socket.on('end', () => {\n client.readyState = ReadyState.CLOSED;\n client.emit('close', CLOSE_CODES.NORMAL, '');\n });\n\n socket.on('error', (error: Error) => {\n // Silently ignore connection errors (ECONNABORTED, ECONNRESET, etc.)\n // These are normal when clients disconnect during HMR\n const errorCode = (error as any).code;\n if (errorCode === 'ECONNABORTED' || errorCode === 'ECONNRESET' || errorCode === 'EPIPE') {\n // Silently ignore - connection was closed by client\n return;\n }\n // Only emit other errors\n client.emit('error', error);\n });\n\n // Override send method\n client.send = (data: Data, _options?: any, callback?: (err?: Error) => void) => {\n // Check if socket is still writable\n if (!socket.writable || client.readyState !== ReadyState.OPEN) {\n const err = new Error('WebSocket is not open');\n (err as any).code = 'WS_NOT_OPEN';\n queueCallback(callback, err);\n return;\n }\n\n try {\n const frame = this._createFrame(data);\n socket.write(frame, (err?: Error) => {\n // Handle async write errors (ECONNABORTED, ECONNRESET, etc.)\n if (err) {\n const errorCode = (err as any).code;\n // Silently ignore connection errors - these are normal during HMR\n if (errorCode !== 'ECONNABORTED' && errorCode !== 'ECONNRESET' && errorCode !== 'EPIPE') {\n queueCallback(callback, err);\n } else {\n // Connection closed - mark client as closed\n client.readyState = ReadyState.CLOSED;\n queueCallback(callback); // Call without error for graceful handling\n }\n } else {\n queueCallback(callback);\n }\n });\n } catch (error) {\n queueCallback(callback, error as Error);\n }\n };\n\n // Override close method\n client.close = (_code?: number, _reason?: string) => {\n socket.end();\n client.readyState = ReadyState.CLOSED;\n };\n\n return client;\n }\n\n private _parseFrame(data: Buffer): string | null {\n // Minimal WebSocket frame parsing\n if (data.length < 2) return null;\n\n const firstByte = data[0];\n const secondByte = data[1];\n\n const opcode = firstByte & 0x0f;\n const isMasked = (secondByte & 0x80) === 0x80;\n let payloadLength = secondByte & 0x7f;\n let offset = 2;\n\n if (payloadLength === 126) {\n payloadLength = data.readUInt16BE(2);\n offset = 4;\n } else if (payloadLength === 127) {\n payloadLength = Number(data.readBigUInt64BE(2));\n offset = 10;\n }\n\n let payload = data.subarray(offset);\n\n if (isMasked) {\n const maskKey = data.subarray(offset, offset + 4);\n payload = data.subarray(offset + 4, offset + 4 + payloadLength);\n\n // Unmask payload\n for (let i = 0; i < payload.length; i++) {\n payload[i] ^= maskKey[i % 4];\n }\n }\n\n // Text frame (opcode 1)\n if (opcode === 1) {\n return payload.toString('utf8');\n }\n\n return null;\n }\n\n private _createFrame(data: Data): Buffer {\n // Create simple text frame (opcode 1, no masking)\n const payload = typeof data === 'string' ? Buffer.from(data) : data;\n const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;\n\n let frame: Buffer;\n let offset = 2;\n\n if (payloadLength < 126) {\n frame = Buffer.allocUnsafe(2 + payloadLength);\n frame[1] = payloadLength;\n } else if (payloadLength < 65536) {\n frame = Buffer.allocUnsafe(4 + payloadLength);\n frame[1] = 126;\n frame.writeUInt16BE(payloadLength, 2);\n offset = 4;\n } else {\n frame = Buffer.allocUnsafe(10 + payloadLength);\n frame[1] = 127;\n frame.writeBigUInt64BE(BigInt(payloadLength), 2);\n offset = 10;\n }\n\n frame[0] = 0x81; // FIN + text frame\n\n if (Buffer.isBuffer(payload)) {\n payload.copy(frame, offset);\n }\n\n return frame;\n }\n\n /**\n * Close the server\n */\n close(callback?: (err?: Error) => void): void {\n this.clients.forEach(client => client.close());\n this.clients.clear();\n\n if (this._httpServer) {\n this._httpServer.close(callback);\n } else {\n this.emit('close');\n queueCallback(callback);\n }\n }\n\n /**\n * Check if server should handle request\n */\n shouldHandle(request: IncomingMessage): boolean {\n if (this.path && request.url !== this.path) {\n return false;\n }\n return true;\n }\n\n /**\n * Get server address\n */\n address(): { port: number; family: string; address: string } | null {\n if (this._httpServer && this._httpServer.address) {\n return this._httpServer.address();\n }\n return null;\n }\n}\n\n/**\n * Create WebSocket server\n */\nexport function createWebSocketServer(options?: ServerOptions, callback?: () => void): WebSocketServer {\n return new WebSocketServer(options, callback);\n}\n\n/**\n * Get current runtime\n */\nexport function getRuntime(): 'node' | 'bun' | 'deno' {\n return runtime;\n}\n\n/**\n * Default export\n */\nexport default {\n WebSocket,\n WebSocketServer,\n createWebSocketServer,\n ReadyState,\n CLOSE_CODES,\n getRuntime,\n};\n","/**\n * Runtime detection and global type declarations\n * Shared across all modules for consistency\n */\n\n/**\n * Runtime detection (cached at module load)\n */\nexport const runtime = (() => {\n // @ts-ignore - Deno global\n if (typeof Deno !== 'undefined') return 'deno';\n // @ts-ignore - Bun global\n if (typeof Bun !== 'undefined') return 'bun';\n return 'node';\n})() as 'node' | 'bun' | 'deno';\n\nexport const isNode = runtime === 'node';\nexport const isBun = runtime === 'bun';\nexport const isDeno = runtime === 'deno';\n\n// Global declarations for runtime-specific APIs\ndeclare global {\n // @ts-ignore - Bun global\n const Bun: {\n build(options: {\n entrypoints: string[];\n outdir?: string;\n target?: string;\n format?: string;\n minify?: boolean;\n sourcemap?: string;\n external?: string[];\n naming?: string;\n plugins?: any[];\n define?: Record<string, string>;\n }): Promise<{\n success: boolean;\n outputs: Array<{ path: string; size: number }>;\n logs: any[];\n }>;\n Transpiler: new (options?: {\n loader?: string;\n target?: string;\n minify?: boolean;\n }) => {\n transform(code: string, loader?: string): Promise<string>;\n transformSync(code: string, loader?: string): string;\n };\n file(path: string): {\n size: number;\n arrayBuffer(): ArrayBuffer | Promise<ArrayBuffer>;\n exists(): Promise<boolean>;\n };\n write(path: string, data: string | Buffer | Uint8Array): Promise<void>;\n } | undefined;\n\n // @ts-ignore - Deno global\n const Deno: {\n emit(rootSpecifier: string | URL, options?: {\n bundle?: 'module' | 'classic';\n check?: boolean;\n compilerOptions?: any;\n importMap?: string;\n importMapPath?: string;\n sources?: Record<string, string>;\n }): Promise<{\n files: Record<string, string>;\n diagnostics: any[];\n }>;\n writeTextFile(path: string, data: string): Promise<void>;\n readFile(path: string): Promise<Uint8Array>;\n readFileSync(path: string): Uint8Array;\n writeFile(path: string, data: Uint8Array): Promise<void>;\n writeFileSync(path: string, data: Uint8Array): void;\n stat(path: string): Promise<any>;\n statSync(path: string): any;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n mkdirSync(path: string, options?: { recursive?: boolean }): void;\n readDir(path: string): AsyncIterable<any>;\n readDirSync(path: string): Iterable<any>;\n remove(path: string, options?: { recursive?: boolean }): Promise<void>;\n removeSync(path: string, options?: { recursive?: boolean }): void;\n rename(oldPath: string, newPath: string): Promise<void>;\n renameSync(oldPath: string, newPath: string): void;\n copyFile(src: string, dest: string): Promise<void>;\n copyFileSync(src: string, dest: string): void;\n realPath(path: string): Promise<string>;\n realPathSync(path: string): string;\n watchFs(paths: string | string[]): AsyncIterable<{\n kind: string;\n paths: string[];\n }>;\n build: {\n os: string;\n };\n } | undefined;\n}\n"],"mappings":";;;;;;;;;AAQA,SAAS,oBAAoB;;;ACAtB,IAAM,WAAW,MAAM;AAE5B,MAAI,OAAO,SAAS,YAAa,QAAO;AAExC,MAAI,OAAO,QAAQ,YAAa,QAAO;AACvC,SAAO;AACT,GAAG;;;ADCI,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,wBAAA,gBAAa,KAAb;AACA,EAAAA,wBAAA,UAAO,KAAP;AACA,EAAAA,wBAAA,aAAU,KAAV;AACA,EAAAA,wBAAA,YAAS,KAAT;AAJU,SAAAA;AAAA,GAAA;AAUL,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAiDA,SAAS,cAAc,UAAkC,OAAqB;AAC5E,MAAI,UAAU;AACZ,mBAAe,MAAM,SAAS,KAAK,CAAC;AAAA,EACtC;AACF;AAKA,SAAS,sBAAsB,KAAa,WAA2B;AAErE,MAAI,YAAY,UAAU,OAAO,WAAW,cAAc,aAAa;AACrE,UAAM,IAAI,MAAM,2EAA2E;AAAA,EAC7F;AAEA,SAAO,IAAI,WAAW,UAAU,KAAK,SAAS;AAChD;AAKO,IAAM,YAAN,cAAwB,aAAa;AAAA,EAU1C,YAAY,SAAuB,WAA+B,UAAgB;AAChF,UAAM;AAVR,SAAO,aAAyB;AAEhC,SAAO,WAAmB;AAC1B,SAAO,aAAqB;AAC5B,SAAO,aAAyD;AAO9D,SAAK,MAAM,OAAO,YAAY,WAAW,UAAU,QAAQ,SAAS;AACpE,UAAM,iBAAiB,MAAM,QAAQ,SAAS,IAAI,YAAY,YAAY,CAAC,SAAS,IAAI;AACxF,SAAK,UAAU,sBAAsB,KAAK,KAAK,cAAc;AAC7D,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAA2B;AACjC,SAAK,QAAQ,SAAS,MAAM;AAC1B,WAAK,aAAa;AAClB,WAAK,KAAK,MAAM;AAAA,IAClB;AAEA,SAAK,QAAQ,YAAY,CAAC,UAAwB;AAChD,YAAM,WAAW,MAAM,gBAAgB,eAAe,MAAM,gBAAgB;AAC5E,WAAK,KAAK,WAAW,MAAM,MAAM,QAAQ;AAAA,IAC3C;AAEA,SAAK,QAAQ,UAAU,CAAC,UAAsB;AAC5C,WAAK,aAAa;AAClB,WAAK,KAAK,SAAS,MAAM,MAAM,MAAM,MAAM;AAAA,IAC7C;AAEA,SAAK,QAAQ,UAAU,MAAM;AAC3B,WAAK,KAAK,SAAS,IAAI,MAAM,iBAAiB,CAAC;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,MAAY,SAAiD,UAAwC;AACxG,UAAM,KAAK,OAAO,YAAY,aAAa,UAAU;AAErD,QAAI,KAAK,eAAe,cAAiB;AACvC,aAAO,cAAc,IAAI,IAAI,MAAM,uBAAuB,CAAC;AAAA,IAC7D;AAEA,QAAI;AACF,WAAK,QAAQ,KAAK,IAAI;AACtB,oBAAc,EAAE;AAAA,IAClB,SAAS,OAAO;AACd,oBAAc,IAAI,KAAc;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAe,QAAgC;AACnD,QAAI,KAAK,eAAe,kBAAqB,KAAK,eAAe,iBAAoB;AACnF;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,SAAK,QAAQ,MAAM,MAAM,OAAO,WAAW,WAAW,SAAS,QAAQ,SAAS,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AAAA,EAEf;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAc,OAAiB,UAAwC;AAC1E,kBAAc,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAc,OAAiB,UAAwC;AAC1E,kBAAc,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,SAAK,QAAQ,MAAM;AACnB,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,QAAQ,kBAAkB;AAAA,EACxC;AACF;AAKO,IAAM,kBAAN,cAA8B,aAAa;AAAA,EAOhD,YAAY,SAAyB,UAAuB;AAC1D,UAAM;AAPR,SAAO,UAA0B,oBAAI,IAAI;AAQvC,SAAK,UAAU,WAAW,CAAC;AAC3B,SAAK,OAAO,SAAS,QAAQ;AAE7B,QAAI,YAAY,QAAQ;AAEtB,UAAI,SAAS,QAAQ;AACnB,aAAK,cAAc,QAAQ;AAC3B,aAAK,qBAAqB;AAAA,MAC5B,WAAW,SAAS,UAAU;AAAA,MAE9B,OAAO;AAEL,cAAM,OAAO,UAAQ,MAAM;AAC3B,aAAK,cAAc,KAAK,aAAa;AACrC,aAAK,qBAAqB;AAE1B,YAAI,SAAS,MAAM;AACjB,eAAK,YAAY,OAAO,QAAQ,MAAM,QAAQ,MAAM,QAAQ;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,OAAO;AAEL,oBAAc,QAAe;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,SAAK,YAAY,GAAG,WAAW,CAAC,SAAc,QAAa,SAAiB;AAC1E,cAAQ,IAAI,gCAAgC,QAAQ,KAAK,aAAa,KAAK,IAAI;AAC/E,UAAI,KAAK,QAAQ,KAAK,SAAS,OAAO,QAAQ,QAAQ,KAAK,MAAM;AAC/D,gBAAQ,IAAI,qCAAqC;AACjD;AAAA,MACF;AAEA,WAAK,cAAc,SAAS,QAAQ,MAAM,CAAC,WAAW;AACpD,gBAAQ,IAAI,8BAA8B;AAC1C,aAAK,KAAK,cAAc,QAAQ,OAAO;AAAA,MACzC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAA0B,QAAa,OAAe,UAA6C;AAE/G,UAAM,MAAM,QAAQ,QAAQ,mBAAmB;AAC/C,QAAI,CAAC,KAAK;AACR,aAAO,IAAI,kCAAkC;AAC7C;AAAA,IACF;AAGA,UAAM,SAAS,UAAQ,QAAQ;AAC/B,UAAM,YAAY,OACf,WAAW,MAAM,EACjB,OAAO,MAAM,sCAAsC,EACnD,OAAO,QAAQ;AAGlB,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB,SAAS;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAEA,WAAO,MAAM,QAAQ,KAAK,MAAM,CAAC;AAGjC,UAAM,SAAS,KAAK,wBAAwB,MAAM;AAElD,QAAI,KAAK,QAAQ,mBAAmB,OAAO;AACzC,WAAK,QAAQ,IAAI,MAAM;AACvB,aAAO,GAAG,SAAS,MAAM;AACvB,aAAK,QAAQ,OAAO,MAAM;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,aAAS,MAAM;AAAA,EACjB;AAAA,EAEQ,wBAAwB,QAAwB;AACtD,UAAM,SAAS,OAAO,OAAO,UAAU,SAAS;AAChD,iBAAa,KAAK,MAAM;AAExB,WAAO,aAAa;AACpB,WAAO,MAAM;AACb,WAAO,WAAW;AAClB,WAAO,aAAa;AACpB,WAAO,aAAa;AACpB,WAAO,UAAU;AAGjB,WAAO,GAAG,QAAQ,CAAC,SAAiB;AAElC,UAAI;AACF,cAAM,UAAU,KAAK,YAAY,IAAI;AACrC,YAAI,SAAS;AACX,iBAAO,KAAK,WAAW,SAAS,KAAK;AAAA,QACvC;AAAA,MACF,SAAS,OAAO;AACd,eAAO,KAAK,SAAS,KAAK;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,WAAO,GAAG,OAAO,MAAM;AACrB,aAAO,aAAa;AACpB,aAAO,KAAK,SAAS,YAAY,QAAQ,EAAE;AAAA,IAC7C,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,UAAiB;AAGnC,YAAM,YAAa,MAAc;AACjC,UAAI,cAAc,kBAAkB,cAAc,gBAAgB,cAAc,SAAS;AAEvF;AAAA,MACF;AAEA,aAAO,KAAK,SAAS,KAAK;AAAA,IAC5B,CAAC;AAGD,WAAO,OAAO,CAAC,MAAY,UAAgB,aAAqC;AAE9E,UAAI,CAAC,OAAO,YAAY,OAAO,eAAe,cAAiB;AAC7D,cAAM,MAAM,IAAI,MAAM,uBAAuB;AAC7C,QAAC,IAAY,OAAO;AACpB,sBAAc,UAAU,GAAG;AAC3B;AAAA,MACF;AAEA,UAAI;AACF,cAAM,QAAQ,KAAK,aAAa,IAAI;AACpC,eAAO,MAAM,OAAO,CAAC,QAAgB;AAEnC,cAAI,KAAK;AACP,kBAAM,YAAa,IAAY;AAE/B,gBAAI,cAAc,kBAAkB,cAAc,gBAAgB,cAAc,SAAS;AACvF,4BAAc,UAAU,GAAG;AAAA,YAC7B,OAAO;AAEL,qBAAO,aAAa;AACpB,4BAAc,QAAQ;AAAA,YACxB;AAAA,UACF,OAAO;AACL,0BAAc,QAAQ;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO;AACd,sBAAc,UAAU,KAAc;AAAA,MACxC;AAAA,IACF;AAGA,WAAO,QAAQ,CAAC,OAAgB,YAAqB;AACnD,aAAO,IAAI;AACX,aAAO,aAAa;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,MAA6B;AAE/C,QAAI,KAAK,SAAS,EAAG,QAAO;AAE5B,UAAM,YAAY,KAAK,CAAC;AACxB,UAAM,aAAa,KAAK,CAAC;AAEzB,UAAM,SAAS,YAAY;AAC3B,UAAM,YAAY,aAAa,SAAU;AACzC,QAAI,gBAAgB,aAAa;AACjC,QAAI,SAAS;AAEb,QAAI,kBAAkB,KAAK;AACzB,sBAAgB,KAAK,aAAa,CAAC;AACnC,eAAS;AAAA,IACX,WAAW,kBAAkB,KAAK;AAChC,sBAAgB,OAAO,KAAK,gBAAgB,CAAC,CAAC;AAC9C,eAAS;AAAA,IACX;AAEA,QAAI,UAAU,KAAK,SAAS,MAAM;AAElC,QAAI,UAAU;AACZ,YAAM,UAAU,KAAK,SAAS,QAAQ,SAAS,CAAC;AAChD,gBAAU,KAAK,SAAS,SAAS,GAAG,SAAS,IAAI,aAAa;AAG9D,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,gBAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC7B;AAAA,IACF;AAGA,QAAI,WAAW,GAAG;AAChB,aAAO,QAAQ,SAAS,MAAM;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,MAAoB;AAEvC,UAAM,UAAU,OAAO,SAAS,WAAW,OAAO,KAAK,IAAI,IAAI;AAC/D,UAAM,gBAAgB,OAAO,SAAS,OAAO,IAAI,QAAQ,SAAS;AAElE,QAAI;AACJ,QAAI,SAAS;AAEb,QAAI,gBAAgB,KAAK;AACvB,cAAQ,OAAO,YAAY,IAAI,aAAa;AAC5C,YAAM,CAAC,IAAI;AAAA,IACb,WAAW,gBAAgB,OAAO;AAChC,cAAQ,OAAO,YAAY,IAAI,aAAa;AAC5C,YAAM,CAAC,IAAI;AACX,YAAM,cAAc,eAAe,CAAC;AACpC,eAAS;AAAA,IACX,OAAO;AACL,cAAQ,OAAO,YAAY,KAAK,aAAa;AAC7C,YAAM,CAAC,IAAI;AACX,YAAM,iBAAiB,OAAO,aAAa,GAAG,CAAC;AAC/C,eAAS;AAAA,IACX;AAEA,UAAM,CAAC,IAAI;AAEX,QAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,cAAQ,KAAK,OAAO,MAAM;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAwC;AAC5C,SAAK,QAAQ,QAAQ,YAAU,OAAO,MAAM,CAAC;AAC7C,SAAK,QAAQ,MAAM;AAEnB,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,MAAM,QAAQ;AAAA,IACjC,OAAO;AACL,WAAK,KAAK,OAAO;AACjB,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAmC;AAC9C,QAAI,KAAK,QAAQ,QAAQ,QAAQ,KAAK,MAAM;AAC1C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAoE;AAClE,QAAI,KAAK,eAAe,KAAK,YAAY,SAAS;AAChD,aAAO,KAAK,YAAY,QAAQ;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,sBAAsB,SAAyB,UAAwC;AACrG,SAAO,IAAI,gBAAgB,SAAS,QAAQ;AAC9C;AAKO,SAAS,aAAsC;AACpD,SAAO;AACT;AAKA,IAAO,aAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["ReadyState"]}
package/dist/wss.js CHANGED
@@ -1068,13 +1068,34 @@ var WebSocketServer = class extends import_events2.EventEmitter {
1068
1068
  client.emit("close", CLOSE_CODES.NORMAL, "");
1069
1069
  });
1070
1070
  socket.on("error", (error) => {
1071
+ const errorCode = error.code;
1072
+ if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
1073
+ return;
1074
+ }
1071
1075
  client.emit("error", error);
1072
1076
  });
1073
1077
  client.send = (data, _options, callback) => {
1078
+ if (!socket.writable || client.readyState !== 1 /* OPEN */) {
1079
+ const err = new Error("WebSocket is not open");
1080
+ err.code = "WS_NOT_OPEN";
1081
+ queueCallback3(callback, err);
1082
+ return;
1083
+ }
1074
1084
  try {
1075
1085
  const frame = this._createFrame(data);
1076
- socket.write(frame);
1077
- queueCallback3(callback);
1086
+ socket.write(frame, (err) => {
1087
+ if (err) {
1088
+ const errorCode = err.code;
1089
+ if (errorCode !== "ECONNABORTED" && errorCode !== "ECONNRESET" && errorCode !== "EPIPE") {
1090
+ queueCallback3(callback, err);
1091
+ } else {
1092
+ client.readyState = 3 /* CLOSED */;
1093
+ queueCallback3(callback);
1094
+ }
1095
+ } else {
1096
+ queueCallback3(callback);
1097
+ }
1098
+ });
1078
1099
  } catch (error) {
1079
1100
  queueCallback3(callback, error);
1080
1101
  }
@@ -1327,3 +1348,4 @@ var wss_default = {
1327
1348
  createWSSServer,
1328
1349
  getRuntime
1329
1350
  });
1351
+ //# sourceMappingURL=wss.js.map