hlidskjalf 0.3.7 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,37 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.4.1]
9
+
10
+ ### Added
11
+
12
+ - **Colour themes** — pick a palette with `--theme` or a `theme` key in the config.
13
+ Four built-ins named for the realms of Norse cosmology: `bifrost` (default),
14
+ `niflheim` (ice), `muspelheim` (fire), and `yggdrasil` (earth). Each realm also
15
+ answers to an elemental alias — `ice`, `fire`, and `earth`.
16
+ Status colours stay legible across every theme.
17
+
18
+ ## [0.4.0]
19
+
20
+ ### Changed
21
+
22
+ - **Ground-up internal rewrite** — the architecture was rebuilt around platform
23
+ built-ins with no change to behaviour or features. The hand-rolled, event-emitter
24
+ process runner, manual render coalescer, and the ref-juggling glue hook were
25
+ replaced by a plain store bridged into React with `useSyncExternalStore`, with
26
+ `useDeferredValue` bounding re-renders under a log flood. The `Meter` and
27
+ `Heartbeat` classes became factory functions, and a set of single-purpose modules
28
+ were consolidated (29 → 19 source files) behind shared UI primitives. The result
29
+ is materially smaller and simpler while preserving every feature: metrics, watch
30
+ rediscovery, idle probing, fsevents recovery, restart backoff, log scrolling,
31
+ hyperlinks, the alternate screen, and the full config/flag surface.
32
+
33
+ ### Fixed
34
+
35
+ - **Log scrolling no longer depends on a private Ink API** — `Home`/`End` are now
36
+ detected from the key event Ink already delivers, rather than reaching into an
37
+ internal event emitter.
38
+
8
39
  ## [0.3.7]
9
40
 
10
41
  ### Added
package/README.md CHANGED
@@ -35,6 +35,23 @@ pnpm dev
35
35
  | `title` | Custom title for the header (`--title="My App"`). Defaults to `Hlidskjalf`. |
36
36
  | `metrics` | Show CPU and memory usage per workspace. Defaults to `false`. |
37
37
  | `watch` | Re-discover workspaces when `package.json` files change. Defaults to `true`; disable with `--no-watch`. |
38
+ | `theme` | Colour theme (`--theme=niflheim` or `--theme=ice`). One of `bifrost` (default), `niflheim`, `muspelheim`, and `yggdrasil`. |
39
+
40
+ ## Themes
41
+
42
+ Named for the realms of Norse cosmology, to match the all-seeing high seat the tool is named after:
43
+
44
+ | Theme | Alias | Mood |
45
+ | --- | --- | --- |
46
+ | `bifrost` | — | Default - Rainbow bridge — indigo + teal |
47
+ | `niflheim` | `ice` | Ice — glacial blues, frost-white highlights. |
48
+ | `muspelheim` | `fire` | Fire — molten oranges, ember golds. |
49
+ | `yggdrasil` | `earth` | Earth — mosses, leaf-greens, bark greys. |
50
+
51
+ Each realm also answers to its elemental alias, so `--theme=ice` is the same as
52
+ `--theme=niflheim`.
53
+
54
+ Status colours (running / warning / error) stay legible in every theme, so a glyph never misreads.
38
55
 
39
56
  ## Configuration
40
57
 
@@ -48,6 +65,7 @@ export default defineConfig({
48
65
  order: 'run',
49
66
  metrics: true,
50
67
  filter: ['web...'],
68
+ theme: 'niflheim',
51
69
  })
52
70
  ```
53
71
 
@@ -87,24 +105,8 @@ stopped and dropped from the dashboard. Pass `--no-watch` (or set
87
105
  | `r` | Restart the selected workspace |
88
106
  | `c` | Clear the logs for the selected workspace |
89
107
  | `PgUp` / `PgDn` | Scroll the log panel up / down a page |
90
- | `Home` / `End` | Jump to the oldest / newest log lines (`End` resumes following) |
91
108
  | `q` | Quit |
92
109
 
93
- ## Benchmarks
94
-
95
- Performance-sensitive code paths — per-log-line parsing, log-buffer appends,
96
- metrics polling, and workspace ordering — are benchmarked with
97
- [tinybench](https://github.com/tinylibs/tinybench) under `__benchmarks__/`. Run
98
- them with:
99
-
100
- ```sh
101
- pnpm bench # all suites
102
- pnpm bench parser # one or more suites: parser | metrics | workspaces | logs | layout
103
- ```
104
-
105
- Each task is warmed up before measuring; the `±` column is the relative margin
106
- of error, so compare runs only when it stays small.
107
-
108
110
  ## License
109
111
 
110
112
  MIT
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+
4
+ const require$1 = createRequire(import.meta.url);
5
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require$1<"u"?require$1:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require$1<"u"?require$1:a)[b]}):x)(function(x){if(typeof require$1<"u")return require$1.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true});},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:true}):target,mod));
6
+
7
+ export { __commonJS, __export, __require, __toESM };
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { existsSync, readdirSync, realpathSync, readFileSync } from 'fs';
4
+ import { resolve, join, sep } from 'path';
5
+ import { pathToFileURL } from 'url';
6
+
7
+ createRequire(import.meta.url);
8
+ var SHARED={success:"#15FA5A",warning:"#FACC15",error:"#F87171",pending:"#8D93A0",highlight:"#faf9f6",muted:"#8D93A0",dim:"#6B7280",separator:"#353940"},themes={bifrost:{accent:"#7C8EF2",accentBright:"#BEC7F9",url:"#E8EBFD",...SHARED},niflheim:{accent:"#22D3EE",accentBright:"#92E9F7",url:"#E7FAFD",...SHARED},muspelheim:{accent:"#F97316",accentBright:"#FCBB8D",url:"#FEF0E6",...SHARED},yggdrasil:{accent:"#22C55E",accentBright:"#73E79E",url:"#E9FBF0",...SHARED}},THEME_ALIASES={ice:"niflheim",fire:"muspelheim",earth:"yggdrasil"},DEFAULT_THEME="bifrost";function parseTheme(value){if(typeof value=="string")return value in themes?value:value in THEME_ALIASES?THEME_ALIASES[value]:void 0}var colors=themes[DEFAULT_THEME];function buildStatusDisplay(c){return {pending:{color:c.pending,label:"pending",icon:"\u25CB"},building:{color:c.warning,label:"building",icon:"\u25D1"},watching:{color:c.success,label:"watching",icon:"\u25CF"},ready:{color:c.success,label:"watching",icon:"\u25CF"},error:{color:c.error,label:"error",icon:"\u2716"},stopped:{color:c.pending,label:"stopped",icon:"\u25CB"},idle:{color:c.warning,label:"idle",icon:"\u25D1"},timeout:{color:c.error,label:"timeout",icon:"\u2716"}}}var statusDisplay=buildStatusDisplay(colors);function setTheme(name){colors=themes[name],statusDisplay=buildStatusDisplay(colors);}var HINTS="\u2191/\u2193 navigate | ? help | q quit";function formatCpu(cpu){return `${cpu.toFixed(1)}%`.padStart(6)}function formatMem(bytes){let s;return bytes<1024*1024?s=`${(bytes/1024).toFixed(0)} K`:bytes<1024*1024*1024?s=`${(bytes/(1024*1024)).toFixed(1)} M`:s=`${(bytes/(1024*1024*1024)).toFixed(1)} G`,s.padStart(7)}function memColor(bytes){return bytes>512*1024*1024?colors.error:bytes>256*1024*1024?colors.warning:colors.muted}function cpuColor(metrics){return metrics.cpu>80?colors.error:colors.muted}var ESC="\x1B",OSC8=`${ESC}]8;;`,BEL="\x07";function hyperlink(url,label=url){return `${OSC8}${url}${BEL}${label}${OSC8}${BEL}`}function truncateEnd(text,width){return width<=0?"":text.length<=width?text:width===1?"...":`${text.slice(0,width-1)}...`}var ENTER_ALT_SCREEN="\x1B[?1049h",EXIT_ALT_SCREEN="\x1B[?1049l";function enterAltScreen(stream=process.stdout){if(!stream.isTTY)return ()=>{};stream.write(ENTER_ALT_SCREEN);let restored=false,restore=()=>{restored||(restored=true,stream.write(EXIT_ALT_SCREEN));};return process.once("exit",restore),restore}function every(ms,fn){let t=setInterval(fn,ms);return t.unref(),()=>clearInterval(t)}function isPlainObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var VALID_PKG_NAME=/^(@[a-z0-9\-~][a-z0-9\-._~]*\/)?[a-z0-9\-~][a-z0-9\-._~]*$/;function isValidPackageName(name){return VALID_PKG_NAME.test(name)&&name.length<=214}function normalizeFilters(raw){return raw.map(v=>v.replace(/^\{(.+)\}$/,"$1")).filter(v=>{let name=v.endsWith("...")?v.slice(0,-3):v;return isValidPackageName(name)?true:(console.error(`Ignoring invalid filter: ${name}`),false)})}function stringRecord(value){if(!isPlainObject(value))return;let result={};for(let[key,v]of Object.entries(value))typeof v=="string"&&(result[key]=v);return result}function readJson(path){try{let raw=JSON.parse(readFileSync(path,"utf-8"));return isPlainObject(raw)?{name:typeof raw.name=="string"?raw.name:void 0,scripts:stringRecord(raw.scripts),dependencies:stringRecord(raw.dependencies)}:null}catch{return null}}function workspaceDeps(pkg){return Object.entries(pkg.dependencies??{}).filter(([name,v])=>v.startsWith("workspace:")&&isValidPackageName(name)).map(([name])=>name)}var kindOrder={package:0,app:1,service:1};function discover(root){let results=[],dirs=[["packages","package"],["apps","app"],["services","service"]],resolvedRoot=resolve(root);for(let[dir,kind]of dirs){let base=join(resolvedRoot,dir);if(existsSync(base))for(let entry of readdirSync(base,{withFileTypes:true})){if(!entry.isDirectory())continue;let entryPath=join(base,entry.name);try{if(!realpathSync(entryPath).startsWith(resolvedRoot+sep))continue}catch{continue}let pkg=readJson(join(entryPath,"package.json"));pkg?.name&&isValidPackageName(pkg.name)&&pkg.name!=="hlidskjalf"&&pkg.scripts?.dev&&results.push({name:pkg.name,kind,deps:workspaceDeps(pkg)});}}return results}function sortByDeps(workspaces){let names=new Set(workspaces.map(w=>w.name)),depCount=new Map;for(let workspace of workspaces){let count=0;for(let dep of workspace.deps)names.has(dep)&&count++;depCount.set(workspace,count);}return [...workspaces].sort((a,b)=>a.kind!==b.kind?kindOrder[a.kind]-kindOrder[b.kind]:(depCount.get(a)??0)-(depCount.get(b)??0))}function sortByName(workspaces){return [...workspaces].sort((a,b)=>a.kind!==b.kind?kindOrder[a.kind]-kindOrder[b.kind]:a.name.localeCompare(b.name))}function filterWorkspaces(workspaces,patterns){let byName=new Map(workspaces.map(w=>[w.name,w])),matches=new Set;for(let pattern of patterns){let transitive=pattern.endsWith("..."),name=transitive?pattern.slice(0,-3):pattern;byName.has(name)&&matches.add(name),transitive&&collectDeps(name,byName,matches);}return workspaces.filter(w=>matches.has(w.name))}function collectDeps(name,byName,collected){let workspace=byName.get(name);if(workspace)for(let dep of workspace.deps)byName.has(dep)&&!collected.has(dep)&&(collected.add(dep),collectDeps(dep,byName,collected));}function defineConfig(config){return config}var CONFIG_FILES=["hlidskjalf.config.ts","hlidskjalf.config.mjs","hlidskjalf.config.js"],PACKAGE_JSON_KEY="hlidskjalf";function validate(raw,source){if(!isPlainObject(raw))return console.error(`Ignoring ${source}: expected a config object.`),{};let config={};if(Array.isArray(raw.filter)){let strings=raw.filter.filter(v=>typeof v=="string"),filter=normalizeFilters(strings);filter.length&&(config.filter=filter);}(raw.order==="run"||raw.order==="alphabetical")&&(config.order=raw.order),typeof raw.title=="string"&&(config.title=raw.title),typeof raw.metrics=="boolean"&&(config.metrics=raw.metrics),typeof raw.watch=="boolean"&&(config.watch=raw.watch);let theme=parseTheme(raw.theme);return theme&&(config.theme=theme),config}function fromPackageJson(root){let path=join(root,"package.json");if(!existsSync(path))return {};let parsed;try{parsed=JSON.parse(readFileSync(path,"utf-8"));}catch{return {}}if(!isPlainObject(parsed))return {};let key=parsed[PACKAGE_JSON_KEY];return key===void 0?{}:validate(key,`package.json "${PACKAGE_JSON_KEY}" key`)}async function fromConfigFile(root){for(let name of CONFIG_FILES){let path=join(root,name);if(existsSync(path))try{let mod=await import(pathToFileURL(path).href);return validate(mod.default??mod,name)}catch(err){return console.error(`Ignoring ${name}: ${err instanceof Error?err.message:"failed to load"}`),{}}}return {}}async function loadConfig(root){let fromPkg=fromPackageJson(root),fromFile=await fromConfigFile(root);return {...fromPkg,...fromFile}}
9
+
10
+ export { DEFAULT_THEME, HINTS, THEME_ALIASES, colors, cpuColor, defineConfig, discover, enterAltScreen, every, filterWorkspaces, formatCpu, formatMem, hyperlink, loadConfig, memColor, normalizeFilters, parseTheme, setTheme, sortByDeps, sortByName, statusDisplay, themes, truncateEnd };
package/dist/config.d.ts CHANGED
@@ -1,10 +1,85 @@
1
+ /**
2
+ * Shared presentation layer: the colour palette and status glyphs, the terminal
3
+ * primitives the dashboard leans on (OSC 8 hyperlinks, alternate screen), value
4
+ * formatters, and the timer helpers used across the polling code. Kept free of
5
+ * Ink/React imports so every helper here can be unit tested directly.
6
+ */
7
+
8
+ /**
9
+ * Built-in palettes, named for the realms of Norse cosmology (fitting for a tool named
10
+ * after Odin's all-seeing high seat). `success`/`warning`/`error` stay semantically
11
+ * legible — green-ish / amber-ish / red-ish — in every theme so a status glyph never
12
+ * misreads; the personality lives in the accent and status colours, with the neutral
13
+ * slots pulled from {@link SHARED}.
14
+ */
15
+ declare const themes: {
16
+ readonly bifrost: {
17
+ readonly success: string;
18
+ readonly warning: string;
19
+ readonly error: string;
20
+ readonly pending: string;
21
+ readonly highlight: string;
22
+ readonly muted: string;
23
+ readonly dim: string;
24
+ readonly separator: string;
25
+ readonly accent: "#7C8EF2";
26
+ readonly accentBright: "#BEC7F9";
27
+ readonly url: "#E8EBFD";
28
+ };
29
+ readonly niflheim: {
30
+ readonly success: string;
31
+ readonly warning: string;
32
+ readonly error: string;
33
+ readonly pending: string;
34
+ readonly highlight: string;
35
+ readonly muted: string;
36
+ readonly dim: string;
37
+ readonly separator: string;
38
+ readonly accent: "#22D3EE";
39
+ readonly accentBright: "#92E9F7";
40
+ readonly url: "#E7FAFD";
41
+ };
42
+ readonly muspelheim: {
43
+ readonly success: string;
44
+ readonly warning: string;
45
+ readonly error: string;
46
+ readonly pending: string;
47
+ readonly highlight: string;
48
+ readonly muted: string;
49
+ readonly dim: string;
50
+ readonly separator: string;
51
+ readonly accent: "#F97316";
52
+ readonly accentBright: "#FCBB8D";
53
+ readonly url: "#FEF0E6";
54
+ };
55
+ readonly yggdrasil: {
56
+ readonly success: string;
57
+ readonly warning: string;
58
+ readonly error: string;
59
+ readonly pending: string;
60
+ readonly highlight: string;
61
+ readonly muted: string;
62
+ readonly dim: string;
63
+ readonly separator: string;
64
+ readonly accent: "#22C55E";
65
+ readonly accentBright: "#73E79E";
66
+ readonly url: "#E9FBF0";
67
+ };
68
+ };
69
+ /** Selectable theme names — the keys of {@link themes}. */
70
+ type ThemeName = keyof typeof themes;
71
+
1
72
  type SortOrder = 'alphabetical' | 'run';
2
73
 
3
74
  /**
4
- * User-facing configuration. Every field mirrors a CLI flag and is optional;
5
- * anything omitted falls back to the CLI flag, then to the built-in default.
6
- * Persist these in a `hlidskjalf.config.ts` file or a `hlidskjalf` key in
7
- * `package.json` so flags don't have to be retyped on every run.
75
+ * Public configuration surface (the `config` build entry `defineConfig` is what a
76
+ * `hlidskjalf.config.ts` imports) plus the loader that resolves persisted config.
77
+ */
78
+
79
+ /**
80
+ * User-facing configuration. Every field mirrors a CLI flag and is optional; anything
81
+ * omitted falls back to the CLI flag, then the built-in default. Persist these in a
82
+ * `hlidskjalf.config.ts` file or a `hlidskjalf` key in `package.json`.
8
83
  */
9
84
  interface Config {
10
85
  /** Include only matching workspaces. Append `...` to a name for its transitive deps. */
@@ -17,17 +92,27 @@ interface Config {
17
92
  metrics?: boolean;
18
93
  /** Re-discover workspaces when `package.json` files change. Defaults to `true`. */
19
94
  watch?: boolean;
95
+ /**
96
+ * Colour theme. Defaults to `bifrost` (icy blues and purples). Accepts a realm name
97
+ * (`niflheim`, `muspelheim`, `yggdrasil`) or an elemental alias (`ice`, `fire`, `earth`).
98
+ * See {@link themes} for the palettes or define your own with {@link parseTheme}.
99
+ */
100
+ theme?: ThemeName;
20
101
  }
21
102
  /**
22
- * Identity helper that gives a `hlidskjalf.config.ts` file full type checking
23
- * and autocompletion:
103
+ * Identity helper that gives a `hlidskjalf.config.ts` full type checking:
24
104
  *
25
105
  * ```ts
26
106
  * import { defineConfig } from 'hlidskjalf'
27
- *
28
107
  * export default defineConfig({ order: 'run', metrics: true })
29
108
  * ```
30
109
  */
31
110
  declare function defineConfig(config: Config): Config;
111
+ /**
112
+ * Resolve persisted configuration for the project at `root`. A dedicated config file
113
+ * takes precedence over the package.json key; CLI flags (applied by the caller) still
114
+ * override everything here.
115
+ */
116
+ declare function loadConfig(root: string): Promise<Config>;
32
117
 
33
- export { type Config, defineConfig };
118
+ export { type Config, defineConfig, loadConfig };
package/dist/config.js CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
- function defineConfig(config){return config}
2
+ import { createRequire } from 'node:module';
3
+ export { defineConfig, loadConfig } from './chunk-WSO44QZR.js';
4
+ import './chunk-4PLEQYIC.js';
3
5
 
4
- export { defineConfig };
6
+ createRequire(import.meta.url);
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { __commonJS, __require, __toESM } from './chunk-4PLEQYIC.js';
4
+ import devtools from 'react-devtools-core';
5
+
6
+ createRequire(import.meta.url);
7
+ var require_constants=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/constants.js"(exports$1,module){var BINARY_TYPES=["nodebuffer","arraybuffer","fragments"],hasBlob=typeof Blob<"u";hasBlob&&BINARY_TYPES.push("blob");module.exports={BINARY_TYPES,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}};}});var require_buffer_util=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/buffer-util.js"(exports$1,module){var{EMPTY_BUFFER}=require_constants(),FastBuffer=Buffer[Symbol.species];function concat(list,totalLength){if(list.length===0)return EMPTY_BUFFER;if(list.length===1)return list[0];let target=Buffer.allocUnsafe(totalLength),offset=0;for(let i=0;i<list.length;i++){let buf=list[i];target.set(buf,offset),offset+=buf.length;}return offset<totalLength?new FastBuffer(target.buffer,target.byteOffset,offset):target}function _mask(source,mask,output,offset,length){for(let i=0;i<length;i++)output[offset+i]=source[i]^mask[i&3];}function _unmask(buffer,mask){for(let i=0;i<buffer.length;i++)buffer[i]^=mask[i&3];}function toArrayBuffer(buf){return buf.length===buf.buffer.byteLength?buf.buffer:buf.buffer.slice(buf.byteOffset,buf.byteOffset+buf.length)}function toBuffer(data){if(toBuffer.readOnly=true,Buffer.isBuffer(data))return data;let buf;return data instanceof ArrayBuffer?buf=new FastBuffer(data):ArrayBuffer.isView(data)?buf=new FastBuffer(data.buffer,data.byteOffset,data.byteLength):(buf=Buffer.from(data),toBuffer.readOnly=false),buf}module.exports={concat,mask:_mask,toArrayBuffer,toBuffer,unmask:_unmask};if(!process.env.WS_NO_BUFFER_UTIL)try{let bufferUtil=__require("bufferutil");module.exports.mask=function(source,mask,output,offset,length){length<48?_mask(source,mask,output,offset,length):bufferUtil.mask(source,mask,output,offset,length);},module.exports.unmask=function(buffer,mask){buffer.length<32?_unmask(buffer,mask):bufferUtil.unmask(buffer,mask);};}catch{}}});var require_limiter=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/limiter.js"(exports$1,module){var kDone=Symbol("kDone"),kRun=Symbol("kRun"),Limiter=class{constructor(concurrency){this[kDone]=()=>{this.pending--,this[kRun]();},this.concurrency=concurrency||1/0,this.jobs=[],this.pending=0;}add(job){this.jobs.push(job),this[kRun]();}[kRun](){if(this.pending!==this.concurrency&&this.jobs.length){let job=this.jobs.shift();this.pending++,job(this[kDone]);}}};module.exports=Limiter;}});var require_permessage_deflate=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/permessage-deflate.js"(exports$1,module){var zlib=__require("zlib"),bufferUtil=require_buffer_util(),Limiter=require_limiter(),{kStatusCode}=require_constants(),FastBuffer=Buffer[Symbol.species],TRAILER=Buffer.from([0,0,255,255]),kPerMessageDeflate=Symbol("permessage-deflate"),kTotalLength=Symbol("total-length"),kCallback=Symbol("callback"),kBuffers=Symbol("buffers"),kError=Symbol("error"),zlibLimiter,PerMessageDeflate=class{constructor(options,isServer,maxPayload){if(this._maxPayload=maxPayload|0,this._options=options||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._isServer=!!isServer,this._deflate=null,this._inflate=null,this.params=null,!zlibLimiter){let concurrency=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;zlibLimiter=new Limiter(concurrency);}}static get extensionName(){return "permessage-deflate"}offer(){let params={};return this._options.serverNoContextTakeover&&(params.server_no_context_takeover=true),this._options.clientNoContextTakeover&&(params.client_no_context_takeover=true),this._options.serverMaxWindowBits&&(params.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?params.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(params.client_max_window_bits=true),params}accept(configurations){return configurations=this.normalizeParams(configurations),this.params=this._isServer?this.acceptAsServer(configurations):this.acceptAsClient(configurations),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let callback=this._deflate[kCallback];this._deflate.close(),this._deflate=null,callback&&callback(new Error("The deflate stream was closed while data was being processed"));}}acceptAsServer(offers){let opts=this._options,accepted=offers.find(params=>!(opts.serverNoContextTakeover===false&&params.server_no_context_takeover||params.server_max_window_bits&&(opts.serverMaxWindowBits===false||typeof opts.serverMaxWindowBits=="number"&&opts.serverMaxWindowBits>params.server_max_window_bits)||typeof opts.clientMaxWindowBits=="number"&&!params.client_max_window_bits));if(!accepted)throw new Error("None of the extension offers can be accepted");return opts.serverNoContextTakeover&&(accepted.server_no_context_takeover=true),opts.clientNoContextTakeover&&(accepted.client_no_context_takeover=true),typeof opts.serverMaxWindowBits=="number"&&(accepted.server_max_window_bits=opts.serverMaxWindowBits),typeof opts.clientMaxWindowBits=="number"?accepted.client_max_window_bits=opts.clientMaxWindowBits:(accepted.client_max_window_bits===true||opts.clientMaxWindowBits===false)&&delete accepted.client_max_window_bits,accepted}acceptAsClient(response){let params=response[0];if(this._options.clientNoContextTakeover===false&&params.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!params.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(params.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===false||typeof this._options.clientMaxWindowBits=="number"&&params.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return params}normalizeParams(configurations){return configurations.forEach(params=>{Object.keys(params).forEach(key=>{let value=params[key];if(value.length>1)throw new Error(`Parameter "${key}" must have only a single value`);if(value=value[0],key==="client_max_window_bits"){if(value!==true){let num=+value;if(!Number.isInteger(num)||num<8||num>15)throw new TypeError(`Invalid value for parameter "${key}": ${value}`);value=num;}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${key}": ${value}`)}else if(key==="server_max_window_bits"){let num=+value;if(!Number.isInteger(num)||num<8||num>15)throw new TypeError(`Invalid value for parameter "${key}": ${value}`);value=num;}else if(key==="client_no_context_takeover"||key==="server_no_context_takeover"){if(value!==true)throw new TypeError(`Invalid value for parameter "${key}": ${value}`)}else throw new Error(`Unknown parameter "${key}"`);params[key]=value;});}),configurations}decompress(data,fin,callback){zlibLimiter.add(done=>{this._decompress(data,fin,(err,result)=>{done(),callback(err,result);});});}compress(data,fin,callback){zlibLimiter.add(done=>{this._compress(data,fin,(err,result)=>{done(),callback(err,result);});});}_decompress(data,fin,callback){let endpoint=this._isServer?"client":"server";if(!this._inflate){let key=`${endpoint}_max_window_bits`,windowBits=typeof this.params[key]!="number"?zlib.Z_DEFAULT_WINDOWBITS:this.params[key];this._inflate=zlib.createInflateRaw({...this._options.zlibInflateOptions,windowBits}),this._inflate[kPerMessageDeflate]=this,this._inflate[kTotalLength]=0,this._inflate[kBuffers]=[],this._inflate.on("error",inflateOnError),this._inflate.on("data",inflateOnData);}this._inflate[kCallback]=callback,this._inflate.write(data),fin&&this._inflate.write(TRAILER),this._inflate.flush(()=>{let err=this._inflate[kError];if(err){this._inflate.close(),this._inflate=null,callback(err);return}let data2=bufferUtil.concat(this._inflate[kBuffers],this._inflate[kTotalLength]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[kTotalLength]=0,this._inflate[kBuffers]=[],fin&&this.params[`${endpoint}_no_context_takeover`]&&this._inflate.reset()),callback(null,data2);});}_compress(data,fin,callback){let endpoint=this._isServer?"server":"client";if(!this._deflate){let key=`${endpoint}_max_window_bits`,windowBits=typeof this.params[key]!="number"?zlib.Z_DEFAULT_WINDOWBITS:this.params[key];this._deflate=zlib.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits}),this._deflate[kTotalLength]=0,this._deflate[kBuffers]=[],this._deflate.on("data",deflateOnData);}this._deflate[kCallback]=callback,this._deflate.write(data),this._deflate.flush(zlib.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let data2=bufferUtil.concat(this._deflate[kBuffers],this._deflate[kTotalLength]);fin&&(data2=new FastBuffer(data2.buffer,data2.byteOffset,data2.length-4)),this._deflate[kCallback]=null,this._deflate[kTotalLength]=0,this._deflate[kBuffers]=[],fin&&this.params[`${endpoint}_no_context_takeover`]&&this._deflate.reset(),callback(null,data2);});}};module.exports=PerMessageDeflate;function deflateOnData(chunk){this[kBuffers].push(chunk),this[kTotalLength]+=chunk.length;}function inflateOnData(chunk){if(this[kTotalLength]+=chunk.length,this[kPerMessageDeflate]._maxPayload<1||this[kTotalLength]<=this[kPerMessageDeflate]._maxPayload){this[kBuffers].push(chunk);return}this[kError]=new RangeError("Max payload size exceeded"),this[kError].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[kError][kStatusCode]=1009,this.removeListener("data",inflateOnData),this.reset();}function inflateOnError(err){if(this[kPerMessageDeflate]._inflate=null,this[kError]){this[kCallback](this[kError]);return}err[kStatusCode]=1007,this[kCallback](err);}}});var require_validation=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/validation.js"(exports$1,module){var{isUtf8}=__require("buffer"),{hasBlob}=require_constants(),tokenChars=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function isValidStatusCode(code){return code>=1e3&&code<=1014&&code!==1004&&code!==1005&&code!==1006||code>=3e3&&code<=4999}function _isValidUTF8(buf){let len=buf.length,i=0;for(;i<len;)if((buf[i]&128)===0)i++;else if((buf[i]&224)===192){if(i+1===len||(buf[i+1]&192)!==128||(buf[i]&254)===192)return false;i+=2;}else if((buf[i]&240)===224){if(i+2>=len||(buf[i+1]&192)!==128||(buf[i+2]&192)!==128||buf[i]===224&&(buf[i+1]&224)===128||buf[i]===237&&(buf[i+1]&224)===160)return false;i+=3;}else if((buf[i]&248)===240){if(i+3>=len||(buf[i+1]&192)!==128||(buf[i+2]&192)!==128||(buf[i+3]&192)!==128||buf[i]===240&&(buf[i+1]&240)===128||buf[i]===244&&buf[i+1]>143||buf[i]>244)return false;i+=4;}else return false;return true}function isBlob(value){return hasBlob&&typeof value=="object"&&typeof value.arrayBuffer=="function"&&typeof value.type=="string"&&typeof value.stream=="function"&&(value[Symbol.toStringTag]==="Blob"||value[Symbol.toStringTag]==="File")}module.exports={isBlob,isValidStatusCode,isValidUTF8:_isValidUTF8,tokenChars};if(isUtf8)module.exports.isValidUTF8=function(buf){return buf.length<24?_isValidUTF8(buf):isUtf8(buf)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let isValidUTF8=__require("utf-8-validate");module.exports.isValidUTF8=function(buf){return buf.length<32?_isValidUTF8(buf):isValidUTF8(buf)};}catch{}}});var require_receiver=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js"(exports$1,module){var{Writable}=__require("stream"),PerMessageDeflate=require_permessage_deflate(),{BINARY_TYPES,EMPTY_BUFFER,kStatusCode,kWebSocket}=require_constants(),{concat,toArrayBuffer,unmask}=require_buffer_util(),{isValidStatusCode,isValidUTF8}=require_validation(),FastBuffer=Buffer[Symbol.species],GET_INFO=0,GET_PAYLOAD_LENGTH_16=1,GET_PAYLOAD_LENGTH_64=2,GET_MASK=3,GET_DATA=4,INFLATING=5,DEFER_EVENT=6,Receiver2=class extends Writable{constructor(options={}){super(),this._allowSynchronousEvents=options.allowSynchronousEvents!==void 0?options.allowSynchronousEvents:true,this._binaryType=options.binaryType||BINARY_TYPES[0],this._extensions=options.extensions||{},this._isServer=!!options.isServer,this._maxPayload=options.maxPayload|0,this._skipUTF8Validation=!!options.skipUTF8Validation,this[kWebSocket]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=false,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=false,this._fin=false,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=false,this._loop=false,this._state=GET_INFO;}_write(chunk,encoding,cb){if(this._opcode===8&&this._state==GET_INFO)return cb();this._bufferedBytes+=chunk.length,this._buffers.push(chunk),this.startLoop(cb);}consume(n){if(this._bufferedBytes-=n,n===this._buffers[0].length)return this._buffers.shift();if(n<this._buffers[0].length){let buf=this._buffers[0];return this._buffers[0]=new FastBuffer(buf.buffer,buf.byteOffset+n,buf.length-n),new FastBuffer(buf.buffer,buf.byteOffset,n)}let dst=Buffer.allocUnsafe(n);do{let buf=this._buffers[0],offset=dst.length-n;n>=buf.length?dst.set(this._buffers.shift(),offset):(dst.set(new Uint8Array(buf.buffer,buf.byteOffset,n),offset),this._buffers[0]=new FastBuffer(buf.buffer,buf.byteOffset+n,buf.length-n)),n-=buf.length;}while(n>0);return dst}startLoop(cb){this._loop=true;do switch(this._state){case GET_INFO:this.getInfo(cb);break;case GET_PAYLOAD_LENGTH_16:this.getPayloadLength16(cb);break;case GET_PAYLOAD_LENGTH_64:this.getPayloadLength64(cb);break;case GET_MASK:this.getMask();break;case GET_DATA:this.getData(cb);break;case INFLATING:case DEFER_EVENT:this._loop=false;return}while(this._loop);this._errored||cb();}getInfo(cb){if(this._bufferedBytes<2){this._loop=false;return}let buf=this.consume(2);if((buf[0]&48)!==0){let error=this.createError(RangeError,"RSV2 and RSV3 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_2_3");cb(error);return}let compressed=(buf[0]&64)===64;if(compressed&&!this._extensions[PerMessageDeflate.extensionName]){let error=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");cb(error);return}if(this._fin=(buf[0]&128)===128,this._opcode=buf[0]&15,this._payloadLength=buf[1]&127,this._opcode===0){if(compressed){let error=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");cb(error);return}if(!this._fragmented){let error=this.createError(RangeError,"invalid opcode 0",true,1002,"WS_ERR_INVALID_OPCODE");cb(error);return}this._opcode=this._fragmented;}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let error=this.createError(RangeError,`invalid opcode ${this._opcode}`,true,1002,"WS_ERR_INVALID_OPCODE");cb(error);return}this._compressed=compressed;}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let error=this.createError(RangeError,"FIN must be set",true,1002,"WS_ERR_EXPECTED_FIN");cb(error);return}if(compressed){let error=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");cb(error);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let error=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,true,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");cb(error);return}}else {let error=this.createError(RangeError,`invalid opcode ${this._opcode}`,true,1002,"WS_ERR_INVALID_OPCODE");cb(error);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(buf[1]&128)===128,this._isServer){if(!this._masked){let error=this.createError(RangeError,"MASK must be set",true,1002,"WS_ERR_EXPECTED_MASK");cb(error);return}}else if(this._masked){let error=this.createError(RangeError,"MASK must be clear",true,1002,"WS_ERR_UNEXPECTED_MASK");cb(error);return}this._payloadLength===126?this._state=GET_PAYLOAD_LENGTH_16:this._payloadLength===127?this._state=GET_PAYLOAD_LENGTH_64:this.haveLength(cb);}getPayloadLength16(cb){if(this._bufferedBytes<2){this._loop=false;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(cb);}getPayloadLength64(cb){if(this._bufferedBytes<8){this._loop=false;return}let buf=this.consume(8),num=buf.readUInt32BE(0);if(num>Math.pow(2,21)-1){let error=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",false,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");cb(error);return}this._payloadLength=num*Math.pow(2,32)+buf.readUInt32BE(4),this.haveLength(cb);}haveLength(cb){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let error=this.createError(RangeError,"Max payload size exceeded",false,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");cb(error);return}this._masked?this._state=GET_MASK:this._state=GET_DATA;}getMask(){if(this._bufferedBytes<4){this._loop=false;return}this._mask=this.consume(4),this._state=GET_DATA;}getData(cb){let data=EMPTY_BUFFER;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=false;return}data=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&unmask(data,this._mask);}if(this._opcode>7){this.controlMessage(data,cb);return}if(this._compressed){this._state=INFLATING,this.decompress(data,cb);return}data.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(data)),this.dataMessage(cb);}decompress(data,cb){this._extensions[PerMessageDeflate.extensionName].decompress(data,this._fin,(err,buf)=>{if(err)return cb(err);if(buf.length){if(this._messageLength+=buf.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let error=this.createError(RangeError,"Max payload size exceeded",false,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");cb(error);return}this._fragments.push(buf);}this.dataMessage(cb),this._state===GET_INFO&&this.startLoop(cb);});}dataMessage(cb){if(!this._fin){this._state=GET_INFO;return}let messageLength=this._messageLength,fragments=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let data;this._binaryType==="nodebuffer"?data=concat(fragments,messageLength):this._binaryType==="arraybuffer"?data=toArrayBuffer(concat(fragments,messageLength)):this._binaryType==="blob"?data=new Blob(fragments):data=fragments,this._allowSynchronousEvents?(this.emit("message",data,true),this._state=GET_INFO):(this._state=DEFER_EVENT,setImmediate(()=>{this.emit("message",data,true),this._state=GET_INFO,this.startLoop(cb);}));}else {let buf=concat(fragments,messageLength);if(!this._skipUTF8Validation&&!isValidUTF8(buf)){let error=this.createError(Error,"invalid UTF-8 sequence",true,1007,"WS_ERR_INVALID_UTF8");cb(error);return}this._state===INFLATING||this._allowSynchronousEvents?(this.emit("message",buf,false),this._state=GET_INFO):(this._state=DEFER_EVENT,setImmediate(()=>{this.emit("message",buf,false),this._state=GET_INFO,this.startLoop(cb);}));}}controlMessage(data,cb){if(this._opcode===8){if(data.length===0)this._loop=false,this.emit("conclude",1005,EMPTY_BUFFER),this.end();else {let code=data.readUInt16BE(0);if(!isValidStatusCode(code)){let error=this.createError(RangeError,`invalid status code ${code}`,true,1002,"WS_ERR_INVALID_CLOSE_CODE");cb(error);return}let buf=new FastBuffer(data.buffer,data.byteOffset+2,data.length-2);if(!this._skipUTF8Validation&&!isValidUTF8(buf)){let error=this.createError(Error,"invalid UTF-8 sequence",true,1007,"WS_ERR_INVALID_UTF8");cb(error);return}this._loop=false,this.emit("conclude",code,buf),this.end();}this._state=GET_INFO;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",data),this._state=GET_INFO):(this._state=DEFER_EVENT,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",data),this._state=GET_INFO,this.startLoop(cb);}));}createError(ErrorCtor,message,prefix,statusCode,errorCode){this._loop=false,this._errored=true;let err=new ErrorCtor(prefix?`Invalid WebSocket frame: ${message}`:message);return Error.captureStackTrace(err,this.createError),err.code=errorCode,err[kStatusCode]=statusCode,err}};module.exports=Receiver2;}});var require_sender=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/sender.js"(exports$1,module){var{Duplex}=__require("stream"),{randomFillSync}=__require("crypto"),PerMessageDeflate=require_permessage_deflate(),{EMPTY_BUFFER,kWebSocket,NOOP}=require_constants(),{isBlob,isValidStatusCode}=require_validation(),{mask:applyMask,toBuffer}=require_buffer_util(),kByteLength=Symbol("kByteLength"),maskBuffer=Buffer.alloc(4),RANDOM_POOL_SIZE=8*1024,randomPool,randomPoolPointer=RANDOM_POOL_SIZE,DEFAULT=0,DEFLATING=1,GET_BLOB_DATA=2,Sender2=class _Sender{constructor(socket,extensions,generateMask){this._extensions=extensions||{},generateMask&&(this._generateMask=generateMask,this._maskBuffer=Buffer.alloc(4)),this._socket=socket,this._firstFragment=true,this._compress=false,this._bufferedBytes=0,this._queue=[],this._state=DEFAULT,this.onerror=NOOP,this[kWebSocket]=void 0;}static frame(data,options){let mask,merge=false,offset=2,skipMasking=false;options.mask&&(mask=options.maskBuffer||maskBuffer,options.generateMask?options.generateMask(mask):(randomPoolPointer===RANDOM_POOL_SIZE&&(randomPool===void 0&&(randomPool=Buffer.alloc(RANDOM_POOL_SIZE)),randomFillSync(randomPool,0,RANDOM_POOL_SIZE),randomPoolPointer=0),mask[0]=randomPool[randomPoolPointer++],mask[1]=randomPool[randomPoolPointer++],mask[2]=randomPool[randomPoolPointer++],mask[3]=randomPool[randomPoolPointer++]),skipMasking=(mask[0]|mask[1]|mask[2]|mask[3])===0,offset=6);let dataLength;typeof data=="string"?(!options.mask||skipMasking)&&options[kByteLength]!==void 0?dataLength=options[kByteLength]:(data=Buffer.from(data),dataLength=data.length):(dataLength=data.length,merge=options.mask&&options.readOnly&&!skipMasking);let payloadLength=dataLength;dataLength>=65536?(offset+=8,payloadLength=127):dataLength>125&&(offset+=2,payloadLength=126);let target=Buffer.allocUnsafe(merge?dataLength+offset:offset);return target[0]=options.fin?options.opcode|128:options.opcode,options.rsv1&&(target[0]|=64),target[1]=payloadLength,payloadLength===126?target.writeUInt16BE(dataLength,2):payloadLength===127&&(target[2]=target[3]=0,target.writeUIntBE(dataLength,4,6)),options.mask?(target[1]|=128,target[offset-4]=mask[0],target[offset-3]=mask[1],target[offset-2]=mask[2],target[offset-1]=mask[3],skipMasking?[target,data]:merge?(applyMask(data,mask,target,offset,dataLength),[target]):(applyMask(data,mask,data,0,dataLength),[target,data])):[target,data]}close(code,data,mask,cb){let buf;if(code===void 0)buf=EMPTY_BUFFER;else {if(typeof code!="number"||!isValidStatusCode(code))throw new TypeError("First argument must be a valid error code number");if(data===void 0||!data.length)buf=Buffer.allocUnsafe(2),buf.writeUInt16BE(code,0);else {let length=Buffer.byteLength(data);if(length>123)throw new RangeError("The message must not be greater than 123 bytes");buf=Buffer.allocUnsafe(2+length),buf.writeUInt16BE(code,0),typeof data=="string"?buf.write(data,2):buf.set(data,2);}}let options={[kByteLength]:buf.length,fin:true,generateMask:this._generateMask,mask,maskBuffer:this._maskBuffer,opcode:8,readOnly:false,rsv1:false};this._state!==DEFAULT?this.enqueue([this.dispatch,buf,false,options,cb]):this.sendFrame(_Sender.frame(buf,options),cb);}ping(data,mask,cb){let byteLength,readOnly;if(typeof data=="string"?(byteLength=Buffer.byteLength(data),readOnly=false):isBlob(data)?(byteLength=data.size,readOnly=false):(data=toBuffer(data),byteLength=data.length,readOnly=toBuffer.readOnly),byteLength>125)throw new RangeError("The data size must not be greater than 125 bytes");let options={[kByteLength]:byteLength,fin:true,generateMask:this._generateMask,mask,maskBuffer:this._maskBuffer,opcode:9,readOnly,rsv1:false};isBlob(data)?this._state!==DEFAULT?this.enqueue([this.getBlobData,data,false,options,cb]):this.getBlobData(data,false,options,cb):this._state!==DEFAULT?this.enqueue([this.dispatch,data,false,options,cb]):this.sendFrame(_Sender.frame(data,options),cb);}pong(data,mask,cb){let byteLength,readOnly;if(typeof data=="string"?(byteLength=Buffer.byteLength(data),readOnly=false):isBlob(data)?(byteLength=data.size,readOnly=false):(data=toBuffer(data),byteLength=data.length,readOnly=toBuffer.readOnly),byteLength>125)throw new RangeError("The data size must not be greater than 125 bytes");let options={[kByteLength]:byteLength,fin:true,generateMask:this._generateMask,mask,maskBuffer:this._maskBuffer,opcode:10,readOnly,rsv1:false};isBlob(data)?this._state!==DEFAULT?this.enqueue([this.getBlobData,data,false,options,cb]):this.getBlobData(data,false,options,cb):this._state!==DEFAULT?this.enqueue([this.dispatch,data,false,options,cb]):this.sendFrame(_Sender.frame(data,options),cb);}send(data,options,cb){let perMessageDeflate=this._extensions[PerMessageDeflate.extensionName],opcode=options.binary?2:1,rsv1=options.compress,byteLength,readOnly;typeof data=="string"?(byteLength=Buffer.byteLength(data),readOnly=false):isBlob(data)?(byteLength=data.size,readOnly=false):(data=toBuffer(data),byteLength=data.length,readOnly=toBuffer.readOnly),this._firstFragment?(this._firstFragment=false,rsv1&&perMessageDeflate&&perMessageDeflate.params[perMessageDeflate._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(rsv1=byteLength>=perMessageDeflate._threshold),this._compress=rsv1):(rsv1=false,opcode=0),options.fin&&(this._firstFragment=true);let opts={[kByteLength]:byteLength,fin:options.fin,generateMask:this._generateMask,mask:options.mask,maskBuffer:this._maskBuffer,opcode,readOnly,rsv1};isBlob(data)?this._state!==DEFAULT?this.enqueue([this.getBlobData,data,this._compress,opts,cb]):this.getBlobData(data,this._compress,opts,cb):this._state!==DEFAULT?this.enqueue([this.dispatch,data,this._compress,opts,cb]):this.dispatch(data,this._compress,opts,cb);}getBlobData(blob,compress,options,cb){this._bufferedBytes+=options[kByteLength],this._state=GET_BLOB_DATA,blob.arrayBuffer().then(arrayBuffer=>{if(this._socket.destroyed){let err=new Error("The socket was closed while the blob was being read");process.nextTick(callCallbacks,this,err,cb);return}this._bufferedBytes-=options[kByteLength];let data=toBuffer(arrayBuffer);compress?this.dispatch(data,compress,options,cb):(this._state=DEFAULT,this.sendFrame(_Sender.frame(data,options),cb),this.dequeue());}).catch(err=>{process.nextTick(onError,this,err,cb);});}dispatch(data,compress,options,cb){if(!compress){this.sendFrame(_Sender.frame(data,options),cb);return}let perMessageDeflate=this._extensions[PerMessageDeflate.extensionName];this._bufferedBytes+=options[kByteLength],this._state=DEFLATING,perMessageDeflate.compress(data,options.fin,(_,buf)=>{if(this._socket.destroyed){let err=new Error("The socket was closed while data was being compressed");callCallbacks(this,err,cb);return}this._bufferedBytes-=options[kByteLength],this._state=DEFAULT,options.readOnly=false,this.sendFrame(_Sender.frame(buf,options),cb),this.dequeue();});}dequeue(){for(;this._state===DEFAULT&&this._queue.length;){let params=this._queue.shift();this._bufferedBytes-=params[3][kByteLength],Reflect.apply(params[0],this,params.slice(1));}}enqueue(params){this._bufferedBytes+=params[3][kByteLength],this._queue.push(params);}sendFrame(list,cb){list.length===2?(this._socket.cork(),this._socket.write(list[0]),this._socket.write(list[1],cb),this._socket.uncork()):this._socket.write(list[0],cb);}};module.exports=Sender2;function callCallbacks(sender,err,cb){typeof cb=="function"&&cb(err);for(let i=0;i<sender._queue.length;i++){let params=sender._queue[i],callback=params[params.length-1];typeof callback=="function"&&callback(err);}}function onError(sender,err,cb){callCallbacks(sender,err,cb),sender.onerror(err);}}});var require_event_target=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/event-target.js"(exports$1,module){var{kForOnEventAttribute,kListener}=require_constants(),kCode=Symbol("kCode"),kData=Symbol("kData"),kError=Symbol("kError"),kMessage=Symbol("kMessage"),kReason=Symbol("kReason"),kTarget=Symbol("kTarget"),kType=Symbol("kType"),kWasClean=Symbol("kWasClean"),Event=class{constructor(type){this[kTarget]=null,this[kType]=type;}get target(){return this[kTarget]}get type(){return this[kType]}};Object.defineProperty(Event.prototype,"target",{enumerable:true});Object.defineProperty(Event.prototype,"type",{enumerable:true});var CloseEvent=class extends Event{constructor(type,options={}){super(type),this[kCode]=options.code===void 0?0:options.code,this[kReason]=options.reason===void 0?"":options.reason,this[kWasClean]=options.wasClean===void 0?false:options.wasClean;}get code(){return this[kCode]}get reason(){return this[kReason]}get wasClean(){return this[kWasClean]}};Object.defineProperty(CloseEvent.prototype,"code",{enumerable:true});Object.defineProperty(CloseEvent.prototype,"reason",{enumerable:true});Object.defineProperty(CloseEvent.prototype,"wasClean",{enumerable:true});var ErrorEvent=class extends Event{constructor(type,options={}){super(type),this[kError]=options.error===void 0?null:options.error,this[kMessage]=options.message===void 0?"":options.message;}get error(){return this[kError]}get message(){return this[kMessage]}};Object.defineProperty(ErrorEvent.prototype,"error",{enumerable:true});Object.defineProperty(ErrorEvent.prototype,"message",{enumerable:true});var MessageEvent=class extends Event{constructor(type,options={}){super(type),this[kData]=options.data===void 0?null:options.data;}get data(){return this[kData]}};Object.defineProperty(MessageEvent.prototype,"data",{enumerable:true});var EventTarget={addEventListener(type,handler,options={}){for(let listener of this.listeners(type))if(!options[kForOnEventAttribute]&&listener[kListener]===handler&&!listener[kForOnEventAttribute])return;let wrapper;if(type==="message")wrapper=function(data,isBinary){let event=new MessageEvent("message",{data:isBinary?data:data.toString()});event[kTarget]=this,callListener(handler,this,event);};else if(type==="close")wrapper=function(code,message){let event=new CloseEvent("close",{code,reason:message.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});event[kTarget]=this,callListener(handler,this,event);};else if(type==="error")wrapper=function(error){let event=new ErrorEvent("error",{error,message:error.message});event[kTarget]=this,callListener(handler,this,event);};else if(type==="open")wrapper=function(){let event=new Event("open");event[kTarget]=this,callListener(handler,this,event);};else return;wrapper[kForOnEventAttribute]=!!options[kForOnEventAttribute],wrapper[kListener]=handler,options.once?this.once(type,wrapper):this.on(type,wrapper);},removeEventListener(type,handler){for(let listener of this.listeners(type))if(listener[kListener]===handler&&!listener[kForOnEventAttribute]){this.removeListener(type,listener);break}}};module.exports={CloseEvent,ErrorEvent,Event,EventTarget,MessageEvent};function callListener(listener,thisArg,event){typeof listener=="object"&&listener.handleEvent?listener.handleEvent.call(listener,event):listener.call(thisArg,event);}}});var require_extension=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/extension.js"(exports$1,module){var{tokenChars}=require_validation();function push(dest,name,elem){dest[name]===void 0?dest[name]=[elem]:dest[name].push(elem);}function parse(header){let offers=Object.create(null),params=Object.create(null),mustUnescape=false,isEscaping=false,inQuotes=false,extensionName,paramName,start=-1,code=-1,end=-1,i=0;for(;i<header.length;i++)if(code=header.charCodeAt(i),extensionName===void 0)if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(i!==0&&(code===32||code===9))end===-1&&start!==-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let name=header.slice(start,end);code===44?(push(offers,name,params),params=Object.create(null)):extensionName=name,start=end=-1;}else throw new SyntaxError(`Unexpected character at index ${i}`);else if(paramName===void 0)if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(code===32||code===9)end===-1&&start!==-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i),push(params,header.slice(start,end),true),code===44&&(push(offers,extensionName,params),params=Object.create(null),extensionName=void 0),start=end=-1;}else if(code===61&&start!==-1&&end===-1)paramName=header.slice(start,i),start=end=-1;else throw new SyntaxError(`Unexpected character at index ${i}`);else if(isEscaping){if(tokenChars[code]!==1)throw new SyntaxError(`Unexpected character at index ${i}`);start===-1?start=i:mustUnescape||(mustUnescape=true),isEscaping=false;}else if(inQuotes)if(tokenChars[code]===1)start===-1&&(start=i);else if(code===34&&start!==-1)inQuotes=false,end=i;else if(code===92)isEscaping=true;else throw new SyntaxError(`Unexpected character at index ${i}`);else if(code===34&&header.charCodeAt(i-1)===61)inQuotes=true;else if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(start!==-1&&(code===32||code===9))end===-1&&(end=i);else if(code===59||code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let value=header.slice(start,end);mustUnescape&&(value=value.replace(/\\/g,""),mustUnescape=false),push(params,paramName,value),code===44&&(push(offers,extensionName,params),params=Object.create(null),extensionName=void 0),paramName=void 0,start=end=-1;}else throw new SyntaxError(`Unexpected character at index ${i}`);if(start===-1||inQuotes||code===32||code===9)throw new SyntaxError("Unexpected end of input");end===-1&&(end=i);let token=header.slice(start,end);return extensionName===void 0?push(offers,token,params):(paramName===void 0?push(params,token,true):mustUnescape?push(params,paramName,token.replace(/\\/g,"")):push(params,paramName,token),push(offers,extensionName,params)),offers}function format(extensions){return Object.keys(extensions).map(extension=>{let configurations=extensions[extension];return Array.isArray(configurations)||(configurations=[configurations]),configurations.map(params=>[extension].concat(Object.keys(params).map(k=>{let values=params[k];return Array.isArray(values)||(values=[values]),values.map(v=>v===true?k:`${k}=${v}`).join("; ")})).join("; ")).join(", ")}).join(", ")}module.exports={format,parse};}});var require_websocket=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js"(exports$1,module){var EventEmitter=__require("events"),https=__require("https"),http=__require("http"),net=__require("net"),tls=__require("tls"),{randomBytes,createHash}=__require("crypto"),{Duplex,Readable}=__require("stream"),{URL}=__require("url"),PerMessageDeflate=require_permessage_deflate(),Receiver2=require_receiver(),Sender2=require_sender(),{isBlob}=require_validation(),{BINARY_TYPES,CLOSE_TIMEOUT,EMPTY_BUFFER,GUID,kForOnEventAttribute,kListener,kStatusCode,kWebSocket,NOOP}=require_constants(),{EventTarget:{addEventListener,removeEventListener}}=require_event_target(),{format,parse}=require_extension(),{toBuffer}=require_buffer_util(),kAborted=Symbol("kAborted"),protocolVersions=[8,13],readyStates=["CONNECTING","OPEN","CLOSING","CLOSED"],subprotocolRegex=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,WebSocket2=class _WebSocket extends EventEmitter{constructor(address,protocols,options){super(),this._binaryType=BINARY_TYPES[0],this._closeCode=1006,this._closeFrameReceived=false,this._closeFrameSent=false,this._closeMessage=EMPTY_BUFFER,this._closeTimer=null,this._errorEmitted=false,this._extensions={},this._paused=false,this._protocol="",this._readyState=_WebSocket.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,address!==null?(this._bufferedAmount=0,this._isServer=false,this._redirects=0,protocols===void 0?protocols=[]:Array.isArray(protocols)||(typeof protocols=="object"&&protocols!==null?(options=protocols,protocols=[]):protocols=[protocols]),initAsClient(this,address,protocols,options)):(this._autoPong=options.autoPong,this._closeTimeout=options.closeTimeout,this._isServer=true);}get binaryType(){return this._binaryType}set binaryType(type){BINARY_TYPES.includes(type)&&(this._binaryType=type,this._receiver&&(this._receiver._binaryType=type));}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(socket,head,options){let receiver=new Receiver2({allowSynchronousEvents:options.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:options.maxPayload,skipUTF8Validation:options.skipUTF8Validation}),sender=new Sender2(socket,this._extensions,options.generateMask);this._receiver=receiver,this._sender=sender,this._socket=socket,receiver[kWebSocket]=this,sender[kWebSocket]=this,socket[kWebSocket]=this,receiver.on("conclude",receiverOnConclude),receiver.on("drain",receiverOnDrain),receiver.on("error",receiverOnError),receiver.on("message",receiverOnMessage),receiver.on("ping",receiverOnPing),receiver.on("pong",receiverOnPong),sender.onerror=senderOnError,socket.setTimeout&&socket.setTimeout(0),socket.setNoDelay&&socket.setNoDelay(),head.length>0&&socket.unshift(head),socket.on("close",socketOnClose),socket.on("data",socketOnData),socket.on("end",socketOnEnd),socket.on("error",socketOnError),this._readyState=_WebSocket.OPEN,this.emit("open");}emitClose(){if(!this._socket){this._readyState=_WebSocket.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[PerMessageDeflate.extensionName]&&this._extensions[PerMessageDeflate.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=_WebSocket.CLOSED,this.emit("close",this._closeCode,this._closeMessage);}close(code,data){if(this.readyState!==_WebSocket.CLOSED){if(this.readyState===_WebSocket.CONNECTING){abortHandshake(this,this._req,"WebSocket was closed before the connection was established");return}if(this.readyState===_WebSocket.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=_WebSocket.CLOSING,this._sender.close(code,data,!this._isServer,err=>{err||(this._closeFrameSent=true,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end());}),setCloseTimer(this);}}pause(){this.readyState===_WebSocket.CONNECTING||this.readyState===_WebSocket.CLOSED||(this._paused=true,this._socket.pause());}ping(data,mask,cb){if(this.readyState===_WebSocket.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof data=="function"?(cb=data,data=mask=void 0):typeof mask=="function"&&(cb=mask,mask=void 0),typeof data=="number"&&(data=data.toString()),this.readyState!==_WebSocket.OPEN){sendAfterClose(this,data,cb);return}mask===void 0&&(mask=!this._isServer),this._sender.ping(data||EMPTY_BUFFER,mask,cb);}pong(data,mask,cb){if(this.readyState===_WebSocket.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof data=="function"?(cb=data,data=mask=void 0):typeof mask=="function"&&(cb=mask,mask=void 0),typeof data=="number"&&(data=data.toString()),this.readyState!==_WebSocket.OPEN){sendAfterClose(this,data,cb);return}mask===void 0&&(mask=!this._isServer),this._sender.pong(data||EMPTY_BUFFER,mask,cb);}resume(){this.readyState===_WebSocket.CONNECTING||this.readyState===_WebSocket.CLOSED||(this._paused=false,this._receiver._writableState.needDrain||this._socket.resume());}send(data,options,cb){if(this.readyState===_WebSocket.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof options=="function"&&(cb=options,options={}),typeof data=="number"&&(data=data.toString()),this.readyState!==_WebSocket.OPEN){sendAfterClose(this,data,cb);return}let opts={binary:typeof data!="string",mask:!this._isServer,compress:true,fin:true,...options};this._extensions[PerMessageDeflate.extensionName]||(opts.compress=false),this._sender.send(data||EMPTY_BUFFER,opts,cb);}terminate(){if(this.readyState!==_WebSocket.CLOSED){if(this.readyState===_WebSocket.CONNECTING){abortHandshake(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=_WebSocket.CLOSING,this._socket.destroy());}}};Object.defineProperty(WebSocket2,"CONNECTING",{enumerable:true,value:readyStates.indexOf("CONNECTING")});Object.defineProperty(WebSocket2.prototype,"CONNECTING",{enumerable:true,value:readyStates.indexOf("CONNECTING")});Object.defineProperty(WebSocket2,"OPEN",{enumerable:true,value:readyStates.indexOf("OPEN")});Object.defineProperty(WebSocket2.prototype,"OPEN",{enumerable:true,value:readyStates.indexOf("OPEN")});Object.defineProperty(WebSocket2,"CLOSING",{enumerable:true,value:readyStates.indexOf("CLOSING")});Object.defineProperty(WebSocket2.prototype,"CLOSING",{enumerable:true,value:readyStates.indexOf("CLOSING")});Object.defineProperty(WebSocket2,"CLOSED",{enumerable:true,value:readyStates.indexOf("CLOSED")});Object.defineProperty(WebSocket2.prototype,"CLOSED",{enumerable:true,value:readyStates.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(property=>{Object.defineProperty(WebSocket2.prototype,property,{enumerable:true});});["open","error","close","message"].forEach(method=>{Object.defineProperty(WebSocket2.prototype,`on${method}`,{enumerable:true,get(){for(let listener of this.listeners(method))if(listener[kForOnEventAttribute])return listener[kListener];return null},set(handler){for(let listener of this.listeners(method))if(listener[kForOnEventAttribute]){this.removeListener(method,listener);break}typeof handler=="function"&&this.addEventListener(method,handler,{[kForOnEventAttribute]:true});}});});WebSocket2.prototype.addEventListener=addEventListener;WebSocket2.prototype.removeEventListener=removeEventListener;module.exports=WebSocket2;function initAsClient(websocket,address,protocols,options){let opts={allowSynchronousEvents:true,autoPong:true,closeTimeout:CLOSE_TIMEOUT,protocolVersion:protocolVersions[1],maxPayload:104857600,skipUTF8Validation:false,perMessageDeflate:true,followRedirects:false,maxRedirects:10,...options,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(websocket._autoPong=opts.autoPong,websocket._closeTimeout=opts.closeTimeout,!protocolVersions.includes(opts.protocolVersion))throw new RangeError(`Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(", ")})`);let parsedUrl;if(address instanceof URL)parsedUrl=address;else try{parsedUrl=new URL(address);}catch{throw new SyntaxError(`Invalid URL: ${address}`)}parsedUrl.protocol==="http:"?parsedUrl.protocol="ws:":parsedUrl.protocol==="https:"&&(parsedUrl.protocol="wss:"),websocket._url=parsedUrl.href;let isSecure=parsedUrl.protocol==="wss:",isIpcUrl=parsedUrl.protocol==="ws+unix:",invalidUrlMessage;if(parsedUrl.protocol!=="ws:"&&!isSecure&&!isIpcUrl?invalidUrlMessage=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:isIpcUrl&&!parsedUrl.pathname?invalidUrlMessage="The URL's pathname is empty":parsedUrl.hash&&(invalidUrlMessage="The URL contains a fragment identifier"),invalidUrlMessage){let err=new SyntaxError(invalidUrlMessage);if(websocket._redirects===0)throw err;emitErrorAndClose(websocket,err);return}let defaultPort=isSecure?443:80,key=randomBytes(16).toString("base64"),request=isSecure?https.request:http.request,protocolSet=new Set,perMessageDeflate;if(opts.createConnection=opts.createConnection||(isSecure?tlsConnect:netConnect),opts.defaultPort=opts.defaultPort||defaultPort,opts.port=parsedUrl.port||defaultPort,opts.host=parsedUrl.hostname.startsWith("[")?parsedUrl.hostname.slice(1,-1):parsedUrl.hostname,opts.headers={...opts.headers,"Sec-WebSocket-Version":opts.protocolVersion,"Sec-WebSocket-Key":key,Connection:"Upgrade",Upgrade:"websocket"},opts.path=parsedUrl.pathname+parsedUrl.search,opts.timeout=opts.handshakeTimeout,opts.perMessageDeflate&&(perMessageDeflate=new PerMessageDeflate(opts.perMessageDeflate!==true?opts.perMessageDeflate:{},false,opts.maxPayload),opts.headers["Sec-WebSocket-Extensions"]=format({[PerMessageDeflate.extensionName]:perMessageDeflate.offer()})),protocols.length){for(let protocol of protocols){if(typeof protocol!="string"||!subprotocolRegex.test(protocol)||protocolSet.has(protocol))throw new SyntaxError("An invalid or duplicated subprotocol was specified");protocolSet.add(protocol);}opts.headers["Sec-WebSocket-Protocol"]=protocols.join(",");}if(opts.origin&&(opts.protocolVersion<13?opts.headers["Sec-WebSocket-Origin"]=opts.origin:opts.headers.Origin=opts.origin),(parsedUrl.username||parsedUrl.password)&&(opts.auth=`${parsedUrl.username}:${parsedUrl.password}`),isIpcUrl){let parts=opts.path.split(":");opts.socketPath=parts[0],opts.path=parts[1];}let req;if(opts.followRedirects){if(websocket._redirects===0){websocket._originalIpc=isIpcUrl,websocket._originalSecure=isSecure,websocket._originalHostOrSocketPath=isIpcUrl?opts.socketPath:parsedUrl.host;let headers=options&&options.headers;if(options={...options,headers:{}},headers)for(let[key2,value]of Object.entries(headers))options.headers[key2.toLowerCase()]=value;}else if(websocket.listenerCount("redirect")===0){let isSameHost=isIpcUrl?websocket._originalIpc?opts.socketPath===websocket._originalHostOrSocketPath:false:websocket._originalIpc?false:parsedUrl.host===websocket._originalHostOrSocketPath;(!isSameHost||websocket._originalSecure&&!isSecure)&&(delete opts.headers.authorization,delete opts.headers.cookie,isSameHost||delete opts.headers.host,opts.auth=void 0);}opts.auth&&!options.headers.authorization&&(options.headers.authorization="Basic "+Buffer.from(opts.auth).toString("base64")),req=websocket._req=request(opts),websocket._redirects&&websocket.emit("redirect",websocket.url,req);}else req=websocket._req=request(opts);opts.timeout&&req.on("timeout",()=>{abortHandshake(websocket,req,"Opening handshake has timed out");}),req.on("error",err=>{req===null||req[kAborted]||(req=websocket._req=null,emitErrorAndClose(websocket,err));}),req.on("response",res=>{let location=res.headers.location,statusCode=res.statusCode;if(location&&opts.followRedirects&&statusCode>=300&&statusCode<400){if(++websocket._redirects>opts.maxRedirects){abortHandshake(websocket,req,"Maximum redirects exceeded");return}req.abort();let addr;try{addr=new URL(location,address);}catch{let err=new SyntaxError(`Invalid URL: ${location}`);emitErrorAndClose(websocket,err);return}initAsClient(websocket,addr,protocols,options);}else websocket.emit("unexpected-response",req,res)||abortHandshake(websocket,req,`Unexpected server response: ${res.statusCode}`);}),req.on("upgrade",(res,socket,head)=>{if(websocket.emit("upgrade",res),websocket.readyState!==WebSocket2.CONNECTING)return;req=websocket._req=null;let upgrade=res.headers.upgrade;if(upgrade===void 0||upgrade.toLowerCase()!=="websocket"){abortHandshake(websocket,socket,"Invalid Upgrade header");return}let digest=createHash("sha1").update(key+GUID).digest("base64");if(res.headers["sec-websocket-accept"]!==digest){abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Accept header");return}let serverProt=res.headers["sec-websocket-protocol"],protError;if(serverProt!==void 0?protocolSet.size?protocolSet.has(serverProt)||(protError="Server sent an invalid subprotocol"):protError="Server sent a subprotocol but none was requested":protocolSet.size&&(protError="Server sent no subprotocol"),protError){abortHandshake(websocket,socket,protError);return}serverProt&&(websocket._protocol=serverProt);let secWebSocketExtensions=res.headers["sec-websocket-extensions"];if(secWebSocketExtensions!==void 0){if(!perMessageDeflate){abortHandshake(websocket,socket,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let extensions;try{extensions=parse(secWebSocketExtensions);}catch{abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Extensions header");return}let extensionNames=Object.keys(extensions);if(extensionNames.length!==1||extensionNames[0]!==PerMessageDeflate.extensionName){abortHandshake(websocket,socket,"Server indicated an extension that was not requested");return}try{perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);}catch{abortHandshake(websocket,socket,"Invalid Sec-WebSocket-Extensions header");return}websocket._extensions[PerMessageDeflate.extensionName]=perMessageDeflate;}websocket.setSocket(socket,head,{allowSynchronousEvents:opts.allowSynchronousEvents,generateMask:opts.generateMask,maxPayload:opts.maxPayload,skipUTF8Validation:opts.skipUTF8Validation});}),opts.finishRequest?opts.finishRequest(req,websocket):req.end();}function emitErrorAndClose(websocket,err){websocket._readyState=WebSocket2.CLOSING,websocket._errorEmitted=true,websocket.emit("error",err),websocket.emitClose();}function netConnect(options){return options.path=options.socketPath,net.connect(options)}function tlsConnect(options){return options.path=void 0,!options.servername&&options.servername!==""&&(options.servername=net.isIP(options.host)?"":options.host),tls.connect(options)}function abortHandshake(websocket,stream,message){websocket._readyState=WebSocket2.CLOSING;let err=new Error(message);Error.captureStackTrace(err,abortHandshake),stream.setHeader?(stream[kAborted]=true,stream.abort(),stream.socket&&!stream.socket.destroyed&&stream.socket.destroy(),process.nextTick(emitErrorAndClose,websocket,err)):(stream.destroy(err),stream.once("error",websocket.emit.bind(websocket,"error")),stream.once("close",websocket.emitClose.bind(websocket)));}function sendAfterClose(websocket,data,cb){if(data){let length=isBlob(data)?data.size:toBuffer(data).length;websocket._socket?websocket._sender._bufferedBytes+=length:websocket._bufferedAmount+=length;}if(cb){let err=new Error(`WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})`);process.nextTick(cb,err);}}function receiverOnConclude(code,reason){let websocket=this[kWebSocket];websocket._closeFrameReceived=true,websocket._closeMessage=reason,websocket._closeCode=code,websocket._socket[kWebSocket]!==void 0&&(websocket._socket.removeListener("data",socketOnData),process.nextTick(resume,websocket._socket),code===1005?websocket.close():websocket.close(code,reason));}function receiverOnDrain(){let websocket=this[kWebSocket];websocket.isPaused||websocket._socket.resume();}function receiverOnError(err){let websocket=this[kWebSocket];websocket._socket[kWebSocket]!==void 0&&(websocket._socket.removeListener("data",socketOnData),process.nextTick(resume,websocket._socket),websocket.close(err[kStatusCode])),websocket._errorEmitted||(websocket._errorEmitted=true,websocket.emit("error",err));}function receiverOnFinish(){this[kWebSocket].emitClose();}function receiverOnMessage(data,isBinary){this[kWebSocket].emit("message",data,isBinary);}function receiverOnPing(data){let websocket=this[kWebSocket];websocket._autoPong&&websocket.pong(data,!this._isServer,NOOP),websocket.emit("ping",data);}function receiverOnPong(data){this[kWebSocket].emit("pong",data);}function resume(stream){stream.resume();}function senderOnError(err){let websocket=this[kWebSocket];websocket.readyState!==WebSocket2.CLOSED&&(websocket.readyState===WebSocket2.OPEN&&(websocket._readyState=WebSocket2.CLOSING,setCloseTimer(websocket)),this._socket.end(),websocket._errorEmitted||(websocket._errorEmitted=true,websocket.emit("error",err)));}function setCloseTimer(websocket){websocket._closeTimer=setTimeout(websocket._socket.destroy.bind(websocket._socket),websocket._closeTimeout);}function socketOnClose(){let websocket=this[kWebSocket];if(this.removeListener("close",socketOnClose),this.removeListener("data",socketOnData),this.removeListener("end",socketOnEnd),websocket._readyState=WebSocket2.CLOSING,!this._readableState.endEmitted&&!websocket._closeFrameReceived&&!websocket._receiver._writableState.errorEmitted&&this._readableState.length!==0){let chunk=this.read(this._readableState.length);websocket._receiver.write(chunk);}websocket._receiver.end(),this[kWebSocket]=void 0,clearTimeout(websocket._closeTimer),websocket._receiver._writableState.finished||websocket._receiver._writableState.errorEmitted?websocket.emitClose():(websocket._receiver.on("error",receiverOnFinish),websocket._receiver.on("finish",receiverOnFinish));}function socketOnData(chunk){this[kWebSocket]._receiver.write(chunk)||this.pause();}function socketOnEnd(){let websocket=this[kWebSocket];websocket._readyState=WebSocket2.CLOSING,websocket._receiver.end(),this.end();}function socketOnError(){let websocket=this[kWebSocket];this.removeListener("error",socketOnError),this.on("error",NOOP),websocket&&(websocket._readyState=WebSocket2.CLOSING,this.destroy());}}});var require_stream=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/stream.js"(exports$1,module){require_websocket();var {Duplex}=__require("stream");function emitClose(stream){stream.emit("close");}function duplexOnEnd(){!this.destroyed&&this._writableState.finished&&this.destroy();}function duplexOnError(err){this.removeListener("error",duplexOnError),this.destroy(),this.listenerCount("error")===0&&this.emit("error",err);}function createWebSocketStream2(ws,options){let terminateOnDestroy=true,duplex=new Duplex({...options,autoDestroy:false,emitClose:false,objectMode:false,writableObjectMode:false});return ws.on("message",function(msg,isBinary){let data=!isBinary&&duplex._readableState.objectMode?msg.toString():msg;duplex.push(data)||ws.pause();}),ws.once("error",function(err){duplex.destroyed||(terminateOnDestroy=false,duplex.destroy(err));}),ws.once("close",function(){duplex.destroyed||duplex.push(null);}),duplex._destroy=function(err,callback){if(ws.readyState===ws.CLOSED){callback(err),process.nextTick(emitClose,duplex);return}let called=false;ws.once("error",function(err2){called=true,callback(err2);}),ws.once("close",function(){called||callback(err),process.nextTick(emitClose,duplex);}),terminateOnDestroy&&ws.terminate();},duplex._final=function(callback){if(ws.readyState===ws.CONNECTING){ws.once("open",function(){duplex._final(callback);});return}ws._socket!==null&&(ws._socket._writableState.finished?(callback(),duplex._readableState.endEmitted&&duplex.destroy()):(ws._socket.once("finish",function(){callback();}),ws.close()));},duplex._read=function(){ws.isPaused&&ws.resume();},duplex._write=function(chunk,encoding,callback){if(ws.readyState===ws.CONNECTING){ws.once("open",function(){duplex._write(chunk,encoding,callback);});return}ws.send(chunk,callback);},duplex.on("end",duplexOnEnd),duplex.on("error",duplexOnError),duplex}module.exports=createWebSocketStream2;}});var require_subprotocol=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/subprotocol.js"(exports$1,module){var{tokenChars}=require_validation();function parse(header){let protocols=new Set,start=-1,end=-1,i=0;for(i;i<header.length;i++){let code=header.charCodeAt(i);if(end===-1&&tokenChars[code]===1)start===-1&&(start=i);else if(i!==0&&(code===32||code===9))end===-1&&start!==-1&&(end=i);else if(code===44){if(start===-1)throw new SyntaxError(`Unexpected character at index ${i}`);end===-1&&(end=i);let protocol2=header.slice(start,end);if(protocols.has(protocol2))throw new SyntaxError(`The "${protocol2}" subprotocol is duplicated`);protocols.add(protocol2),start=end=-1;}else throw new SyntaxError(`Unexpected character at index ${i}`)}if(start===-1||end!==-1)throw new SyntaxError("Unexpected end of input");let protocol=header.slice(start,i);if(protocols.has(protocol))throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);return protocols.add(protocol),protocols}module.exports={parse};}});var require_websocket_server=__commonJS({"node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket-server.js"(exports$1,module){var EventEmitter=__require("events"),http=__require("http"),{Duplex}=__require("stream"),{createHash}=__require("crypto"),extension=require_extension(),PerMessageDeflate=require_permessage_deflate(),subprotocol=require_subprotocol(),WebSocket2=require_websocket(),{CLOSE_TIMEOUT,GUID,kWebSocket}=require_constants(),keyRegex=/^[+/0-9A-Za-z]{22}==$/,RUNNING=0,CLOSING=1,CLOSED=2,WebSocketServer2=class extends EventEmitter{constructor(options,callback){if(super(),options={allowSynchronousEvents:true,autoPong:true,maxPayload:100*1024*1024,skipUTF8Validation:false,perMessageDeflate:false,handleProtocols:null,clientTracking:true,closeTimeout:CLOSE_TIMEOUT,verifyClient:null,noServer:false,backlog:null,server:null,host:null,path:null,port:null,WebSocket:WebSocket2,...options},options.port==null&&!options.server&&!options.noServer||options.port!=null&&(options.server||options.noServer)||options.server&&options.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(options.port!=null?(this._server=http.createServer((req,res)=>{let body=http.STATUS_CODES[426];res.writeHead(426,{"Content-Length":body.length,"Content-Type":"text/plain"}),res.end(body);}),this._server.listen(options.port,options.host,options.backlog,callback)):options.server&&(this._server=options.server),this._server){let emitConnection=this.emit.bind(this,"connection");this._removeListeners=addListeners(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(req,socket,head)=>{this.handleUpgrade(req,socket,head,emitConnection);}});}options.perMessageDeflate===true&&(options.perMessageDeflate={}),options.clientTracking&&(this.clients=new Set,this._shouldEmitClose=false),this.options=options,this._state=RUNNING;}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(cb){if(this._state===CLOSED){cb&&this.once("close",()=>{cb(new Error("The server is not running"));}),process.nextTick(emitClose,this);return}if(cb&&this.once("close",cb),this._state!==CLOSING)if(this._state=CLOSING,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients?this.clients.size?this._shouldEmitClose=true:process.nextTick(emitClose,this):process.nextTick(emitClose,this);else {let server=this._server;this._removeListeners(),this._removeListeners=this._server=null,server.close(()=>{emitClose(this);});}}shouldHandle(req){if(this.options.path){let index=req.url.indexOf("?");if((index!==-1?req.url.slice(0,index):req.url)!==this.options.path)return false}return true}handleUpgrade(req,socket,head,cb){socket.on("error",socketOnError);let key=req.headers["sec-websocket-key"],upgrade=req.headers.upgrade,version=+req.headers["sec-websocket-version"];if(req.method!=="GET"){abortHandshakeOrEmitwsClientError(this,req,socket,405,"Invalid HTTP method");return}if(upgrade===void 0||upgrade.toLowerCase()!=="websocket"){abortHandshakeOrEmitwsClientError(this,req,socket,400,"Invalid Upgrade header");return}if(key===void 0||!keyRegex.test(key)){abortHandshakeOrEmitwsClientError(this,req,socket,400,"Missing or invalid Sec-WebSocket-Key header");return}if(version!==13&&version!==8){abortHandshakeOrEmitwsClientError(this,req,socket,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(req)){abortHandshake(socket,400);return}let secWebSocketProtocol=req.headers["sec-websocket-protocol"],protocols=new Set;if(secWebSocketProtocol!==void 0)try{protocols=subprotocol.parse(secWebSocketProtocol);}catch{abortHandshakeOrEmitwsClientError(this,req,socket,400,"Invalid Sec-WebSocket-Protocol header");return}let secWebSocketExtensions=req.headers["sec-websocket-extensions"],extensions={};if(this.options.perMessageDeflate&&secWebSocketExtensions!==void 0){let perMessageDeflate=new PerMessageDeflate(this.options.perMessageDeflate,true,this.options.maxPayload);try{let offers=extension.parse(secWebSocketExtensions);offers[PerMessageDeflate.extensionName]&&(perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]),extensions[PerMessageDeflate.extensionName]=perMessageDeflate);}catch{abortHandshakeOrEmitwsClientError(this,req,socket,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let info={origin:req.headers[`${version===8?"sec-websocket-origin":"origin"}`],secure:!!(req.socket.authorized||req.socket.encrypted),req};if(this.options.verifyClient.length===2){this.options.verifyClient(info,(verified,code,message,headers)=>{if(!verified)return abortHandshake(socket,code||401,message,headers);this.completeUpgrade(extensions,key,protocols,req,socket,head,cb);});return}if(!this.options.verifyClient(info))return abortHandshake(socket,401)}this.completeUpgrade(extensions,key,protocols,req,socket,head,cb);}completeUpgrade(extensions,key,protocols,req,socket,head,cb){if(!socket.readable||!socket.writable)return socket.destroy();if(socket[kWebSocket])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>RUNNING)return abortHandshake(socket,503);let headers=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${createHash("sha1").update(key+GUID).digest("base64")}`],ws=new this.options.WebSocket(null,void 0,this.options);if(protocols.size){let protocol=this.options.handleProtocols?this.options.handleProtocols(protocols,req):protocols.values().next().value;protocol&&(headers.push(`Sec-WebSocket-Protocol: ${protocol}`),ws._protocol=protocol);}if(extensions[PerMessageDeflate.extensionName]){let params=extensions[PerMessageDeflate.extensionName].params,value=extension.format({[PerMessageDeflate.extensionName]:[params]});headers.push(`Sec-WebSocket-Extensions: ${value}`),ws._extensions=extensions;}this.emit("headers",headers,req),socket.write(headers.concat(`\r
8
+ `).join(`\r
9
+ `)),socket.removeListener("error",socketOnError),ws.setSocket(socket,head,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(ws),ws.on("close",()=>{this.clients.delete(ws),this._shouldEmitClose&&!this.clients.size&&process.nextTick(emitClose,this);})),cb(ws,req);}};module.exports=WebSocketServer2;function addListeners(server,map){for(let event of Object.keys(map))server.on(event,map[event]);return function(){for(let event of Object.keys(map))server.removeListener(event,map[event]);}}function emitClose(server){server._state=CLOSED,server.emit("close");}function socketOnError(){this.destroy();}function abortHandshake(socket,code,message,headers){message=message||http.STATUS_CODES[code],headers={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(message),...headers},socket.once("finish",socket.destroy),socket.end(`HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r
10
+ `+Object.keys(headers).map(h=>`${h}: ${headers[h]}`).join(`\r
11
+ `)+`\r
12
+ \r
13
+ `+message);}function abortHandshakeOrEmitwsClientError(server,req,socket,code,message,headers){if(server.listenerCount("wsClientError")){let err=new Error(message);Error.captureStackTrace(err,abortHandshakeOrEmitwsClientError),server.emit("wsClientError",err,socket,req);}else abortHandshake(socket,code,message,headers);}}});__toESM(require_stream(),1);__toESM(require_receiver(),1);__toESM(require_sender(),1);var import_websocket=__toESM(require_websocket(),1);__toESM(require_websocket_server(),1);var wrapper_default=import_websocket.default;var customGlobal=global;customGlobal.WebSocket||=wrapper_default;customGlobal.window||=global;customGlobal.self||=global;customGlobal.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__=[{type:1,value:7,isEnabled:true},{type:2,value:"InternalApp",isEnabled:true,isValid:true},{type:2,value:"InternalAppContext",isEnabled:true,isValid:true},{type:2,value:"InternalStdoutContext",isEnabled:true,isValid:true},{type:2,value:"InternalStderrContext",isEnabled:true,isValid:true},{type:2,value:"InternalStdinContext",isEnabled:true,isValid:true},{type:2,value:"InternalFocusContext",isEnabled:true,isValid:true}];devtools.connectToDevTools();