asai-nodejs-host 0.2.25 → 0.2.26

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 (3) hide show
  1. package/README.md +436 -0
  2. package/index.js +1 -1
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -0,0 +1,436 @@
1
+ # asai-nodejs-host — HTTP/WebSocket 服务器主机插件
2
+
3
+ ## 功能概述
4
+
5
+ `asai-nodejs-host` 是整个系统的**核心服务器引擎**,负责创建和管理 **HTTP 服务器**、**HTTPS 服务器**、**代理服务器**和 **WebSocket 服务器**。它基于 Node.js 原生 `http`/`https` 模块和 `ws` 库构建。
6
+
7
+ 支持特性:
8
+ - 多站点并行托管(通过 `hostdir` 区分)
9
+ - HTTP/HTTPS 双模式
10
+ - URL Rewrite / Fallback 机制(SPA 支持)
11
+ - 反向代理服务(Proxy)
12
+ - WebSocket 服务(支持用户鉴权、连接管理)
13
+ - CORS 跨域支持
14
+ - 连接数监控与限流
15
+ - 优雅关闭
16
+
17
+ ---
18
+
19
+ ## 文件结构
20
+
21
+ ```
22
+ asai-nodejs-host/
23
+ ├── README.md
24
+ ├── AsaiHost.ts ← 入口文件
25
+ └── src/
26
+ ├── index.ts ← 核心逻辑:主机初始化、服务器启动
27
+ ├── types.ts ← 类型定义
28
+ ├── core.ts ← 工具函数(IP 获取、配置合并等)
29
+ ├── http-server.ts ← HTTP/HTTPS 服务器实现
30
+ ├── ws-server.ts ← WebSocket 服务器实现
31
+ ├── proxy-server.ts ← 反向代理服务器实现
32
+ ├── logger.ts ← 日志系统(带缓冲区、按日轮转)
33
+ ├── process.ts ← 进程管理(异常处理、优雅关闭)
34
+ └── utils.ts ← 工具函数(用户信息编解码)
35
+ ```
36
+
37
+ ---
38
+
39
+ ## 入口文件 — `AsaiHost.ts`
40
+
41
+ ```typescript
42
+ module.exports = ($asai: any, opt: any) => {
43
+ const { StartAsaiHost, asaiWs } = AsaiHost($asai, opt);
44
+ return { StartAsaiHost, asaiWs };
45
+ };
46
+ ```
47
+
48
+ **返回值**:
49
+ | 名称 | 类型 | 说明 |
50
+ |------|------|------|
51
+ | `StartAsaiHost` | function | 启动所有 HTTP/HTTPS/WebSocket 服务器 |
52
+ | `asaiWs` | object | `ws` 模块引用 |
53
+
54
+ ---
55
+
56
+ ## 核心模块分析
57
+
58
+ ### `src/index.ts` — 主机初始化入口
59
+
60
+ **功能**:
61
+ 1. 将 `opt` 中的处理器(`sysWork`, `apiWork`, `wsWork`, `jsonpWork`)挂载到 `global`
62
+ 2. 提供 `StartAsaiHost()` 函数
63
+
64
+ **`StartAsaiHost()` 启动流程**:
65
+ 1. 调用 `initAsaiHost()` 初始化核心环境
66
+ 2. 遍历 `$asai.hostconfig.hosts` → 启动 HTTP 服务器
67
+ 3. 遍历 `$asai.hostconfig.proxyhosts` → 启动代理服务器
68
+
69
+ ---
70
+
71
+ ### `src/types.ts` — 类型定义
72
+
73
+ ```typescript
74
+ type WorkHandler = (req: any, res: any, hostdir: string) => void;
75
+ type WsWorkHandler = (msg: any, ws: any, hostdir: string, req: any) => void;
76
+
77
+ interface AsaiHostOptions {
78
+ sysWork: WorkHandler; // /sys/* 路由处理器
79
+ apiWork: WorkHandler; // /api/* 路由处理器
80
+ wsWork: WsWorkHandler; // WebSocket 消息处理器
81
+ jsonpWork: WorkHandler; // /jsonp/* 路由处理器
82
+ }
83
+ ```
84
+
85
+ ---
86
+
87
+ ### `src/core.ts` — 核心工具函数
88
+
89
+ | 函数 | 说明 |
90
+ |------|------|
91
+ | `getIp()` | 获取本机非 127.0.0.1 的第一个 IPv4 地址 |
92
+ | `getNowTime(type, date)` | 格式化时间,支持 6 种格式 |
93
+ | `validateHostdir(hostdir)` | 验证主机目录名是否合法(字母数字下划线中划线) |
94
+ | `getHostIP(ip, $asai)` | 获取主机 IP |
95
+ | `getHostCFG(hostdir, $asai)` | 合并 host 配置(默认配置 + 站点配置) |
96
+ | `getProxyHostCFG(proxyhostdir, $asai)` | 合并代理配置 |
97
+ | `initAsaiHost($asai, opt)` | 初始化:挂载方法、设置端口、初始化进程/日志、配置 AES |
98
+
99
+ ---
100
+
101
+ ### `src/logger.ts` — 日志系统
102
+
103
+ **类:`LogBuffer`**
104
+ - 带缓冲区的异步写入,支持按缓冲区大小或定时刷新
105
+ - `flushInterval`: 100ms
106
+ - `maxBufferSize`: 100 条
107
+ - 使用 `$asai.asaifs.append()` 异步写入
108
+
109
+ **函数**:
110
+
111
+ | 函数 | 说明 |
112
+ |------|------|
113
+ | `setAppend($asai, src, logstr)` | 追加日志(自动检查文件大小,超 1MB 自动轮转) |
114
+ | `setLog($asai, src, logstr)` | 同步写入日志 |
115
+ | `initLog($asai)` | 初始化日志系统:设置 `$asai.$log` 函数 |
116
+
117
+ **日志配置**(`$asai.hostconfig.logger`):
118
+ ```javascript
119
+ {
120
+ lv: {
121
+ view: true, // 是否在控制台显示
122
+ record: true // 是否记录到文件
123
+ },
124
+ path: {
125
+ client: './logs/client/', // 客户端日志目录
126
+ server: './logs/server/', // 服务器日志目录
127
+ maxsize: 1048576 // 单个日志文件最大字节
128
+ }
129
+ }
130
+ ```
131
+
132
+ **日志类型**:
133
+ - 参数 `0` 或不传:服务器日志(自动添加时间戳)
134
+ - 参数 `1`:客户端日志(独立格式)
135
+ - 参数 `> 666`:静默日志(仅记录,控制台不显示)
136
+
137
+ ---
138
+
139
+ ### `src/process.ts` — 进程管理
140
+
141
+ | 事件 | 处理方式 |
142
+ |------|----------|
143
+ | `unhandledRejection` | 记录未处理的 Promise 拒绝,含调用堆栈 |
144
+ | `uncaughtException` | 记录未捕获异常,60 秒内最多 10 次自动重启,超出则退出 |
145
+ | `SIGTERM` / `SIGINT` | 优雅关闭所有 HTTP/WS 服务器,超时 60 秒强制退出 |
146
+
147
+ **`gracefulShutdown($asai)` 关闭顺序**:
148
+ 1. 关闭所有 HTTP 服务器
149
+ 2. 关闭所有 WebSocket 服务器
150
+ 3. 清除守护定时器
151
+ 4. 清除 WS 心跳监控
152
+ 5. 3 秒后退出进程
153
+
154
+ ---
155
+
156
+ ### `src/http-server.ts` — HTTP/HTTPS 服务器
157
+
158
+ **核心函数**:
159
+
160
+ #### `getHTTPServer(httptype, cfg, $asai)`
161
+ 根据协议类型返回 `http` 或 `https` 模块,并注入 `AsCreateServer` 方法。
162
+
163
+ #### `startHTTPServer($asai, hostdir)`
164
+ 启动一个站点的 HTTP/HTTPS 服务器。
165
+
166
+ **路由规则**:
167
+ | URL 前缀 | 处理器 |
168
+ |----------|--------|
169
+ | `/sys/*` | `sysWork()` |
170
+ | `/api/*` | `apiWork()` |
171
+ | `/jsonp/*` | `jsonpWork()` |
172
+ | 其他 | 静态文件服务 |
173
+
174
+ **静态文件服务特性**:
175
+ - URL Rewrite 支持 — 如果配置了 `weburls.rewrite` 和 `keys`,匹配的 URL 重写回首页(SPA 支持)
176
+ - 多目录查找 — 依次在 `hostdirs` 配置的目录中查找文件
177
+ - 目录遍历防护 — 拒绝包含 `..` 的路径
178
+ - MIME 类型自定义 — 通过 `mimetypes` 配置
179
+ - 文件流缓存 — `Cache-Control: public, max-age=3600`
180
+
181
+ **连接管理**:
182
+ - 通过 `ckhttp` 和 `maxhttp` 配置连接数限制
183
+ - 当连接数达到 `80%` 时记录警告
184
+ - 当达到 `95%` 时强制清理空闲超过 5 分钟的连接
185
+ - 每 30 分钟检查一次
186
+
187
+ #### `asaiGuard($asai)`
188
+ 守护机制 — 当 `asai` 端口被占用时退出进程;否则延迟 2 秒重新启动。
189
+
190
+ #### `checkHttpHeader(req, $asai)`
191
+ 检查 HTTP 请求头中的用户信息并解码。
192
+
193
+ ---
194
+
195
+ ### `src/ws-server.ts` — WebSocket 服务器
196
+
197
+ **核心函数**:
198
+
199
+ #### `createWSHost($asai, hostdir)`
200
+ 为指定 hostdir 创建 WebSocket 服务(附加到已有的 HTTP 服务器)。
201
+
202
+ **`wss.sendws(msg, type, curws)` — 发送消息**:
203
+ | type | 行为 |
204
+ |------|------|
205
+ | 0 | 仅发送给当前连接 |
206
+ | 1 | 发送给除当前连接外的所有人 |
207
+ | 2 | 发送给所有人(广播) |
208
+
209
+ **`wss.broadws(msg)` — 广播消息**:发送给所有连接。
210
+
211
+ **WebSocket 连接鉴权**:
212
+ 1. 从 `Sec-WebSocket-Protocol` 请求头获取用户信息
213
+ 2. 调用 `deUserInfoWithAsai()` 解码用户信息(AES 解码)
214
+ 3. 如果启用了鉴权(`hostcfg.ckws`),执行 `isOkWs()`
215
+
216
+ **`isOkWs()` 鉴权检查**:
217
+ 1. 用户名是否存在
218
+ 2. 同一用户名是否已登录(踢下线旧连接或阻止新连接)
219
+ 3. 同一 Token 是否已登录
220
+ 4. 在线人数是否达到上限(`maxonline`)
221
+
222
+ **连接数控制**:
223
+ - 通过 `maxws` 配置限制 WS 连接数(默认 100)
224
+ - 超过限制时发送错误消息并关闭连接(1013 状态码)
225
+
226
+ ---
227
+
228
+ ### `src/proxy-server.ts` — 反向代理服务器
229
+
230
+ **函数**:`startProxyServer($asai, proxyhostdir)`
231
+
232
+ **代理配置**(`$asai.hostconfig.proxyhosts`):
233
+ | 参数 | 默认值 | 说明 |
234
+ |------|--------|------|
235
+ | `url` | — | 目标服务器 URL |
236
+ | `httptype` | `http://` | 代理协议类型 |
237
+ | `port` | — | 代理端口 |
238
+ | `proxyhttptype` | — | 代理服务器自身协议类型 |
239
+ | `proxyport` | — | 代理服务器端口 |
240
+ | `redirect` | false | 设为 true 时做 301 重定向而非代理 |
241
+ | `keepAlive` | true | 是否保持连接 |
242
+ | `timeout` | 60000 | 请求超时(ms) |
243
+ | `maxSockets` | 1000 | 最大 socket 数 |
244
+
245
+ **特性**:
246
+ - 支持 HTTP→HTTPS、HTTPS→HTTP、HTTPS→HTTPS 代理
247
+ - 请求头过滤(去掉 transfer-encoding、connection 等转发无关头)
248
+ - 错误处理:502 Bad Gateway、504 Gateway Timeout
249
+ - 用户信息透传(在 `Userinfo` 头中传递)
250
+
251
+ ---
252
+
253
+ ### `src/utils.ts` — 工具函数
254
+
255
+ | 函数 | 说明 |
256
+ |------|------|
257
+ | `deUserInfoWithAsai(userinfo, $asai)` | 解码加密后的用户信息(用户名、等级、token) |
258
+ | `deUserInfo(userinfo)` | 旧版兼容函数(不处理解码) |
259
+
260
+ **用户信息编码格式**:
261
+ ```
262
+ [decode(用户名, token), decode(等级, token), token本身]
263
+ ```
264
+ 使用 `$asai.$lib.AsCode.asdecode()` 进行解码。
265
+
266
+ ---
267
+
268
+ ## 配置参考
269
+
270
+ ### `hostconfig` 结构
271
+
272
+ ```javascript
273
+ {
274
+ ip: '0.0.0.0', // 绑定 IP
275
+ index: 'index.html', // 默认首页文件
276
+ mimetypes: { '.html': 'text/html' }, // 自定义 MIME 类型
277
+ tm: { c: 2000, d: 3000 }, // 定时器配置
278
+ aes: { // AES 加密配置
279
+ lv: 0, // 加密等级
280
+ keybase64: '...', // 密钥(Base64)
281
+ aad: '...', // 附加认证数据
282
+ ivlength: 16, // IV 长度
283
+ algorithm: 'aes-256-gcm' // 加密算法
284
+ },
285
+ logger: {
286
+ lv: { view: true, record: true },
287
+ path: { client: './logs/', server: './logs/', maxsize: 1048576 }
288
+ },
289
+
290
+ // 站点配置
291
+ hosts: {
292
+ default: { // 默认配置
293
+ httptype: 'http://',
294
+ port: 80,
295
+ hostdirs: [], // 静态文件目录列表
296
+ ws: true, // 是否启用 WebSocket
297
+ ckws: true, // 是否鉴权
298
+ cors: ['*'], // 允许的跨域来源
299
+ maxws: 100, // 最大 WS 连接数
300
+ maxonline: 100, // 最大在线人数
301
+ maxhttp: 100 // 最大 HTTP 连接数
302
+ },
303
+ mysite: { // 具体站点
304
+ httptype: 'https://',
305
+ port: 443,
306
+ weburls: { // SPA URL 重写
307
+ rewrite: true,
308
+ webdir: './dist',
309
+ keys: ['/app', '/user']
310
+ },
311
+ httpscert: { // HTTPS 证书
312
+ key: fs.readFileSync('./cert/key.pem'),
313
+ cert: fs.readFileSync('./cert/cert.pem')
314
+ }
315
+ }
316
+ },
317
+
318
+ // 代理配置
319
+ proxyhosts: {
320
+ api: {
321
+ url: 'http://localhost:3000',
322
+ proxyport: 8080
323
+ }
324
+ }
325
+ }
326
+ ```
327
+
328
+ ---
329
+
330
+ ## 使用示例
331
+
332
+ ```javascript
333
+ const AsaiHost = require('./AsaiHost');
334
+
335
+ const { StartAsaiHost, asaiWs } = AsaiHost($asai, {
336
+ sysWork: (req, res, hostdir) => { /* 系统路由处理 */ },
337
+ apiWork: (req, res, hostdir) => { /* API 路由处理 */ },
338
+ wsWork: (msg, ws, hostdir, req) => { /* WS 消息处理 */ },
339
+ jsonpWork: (req, res, hostdir) => { /* JSONP 处理 */ }
340
+ });
341
+
342
+ StartAsaiHost(); // 启动所有服务器
343
+ ```
344
+
345
+ ---
346
+
347
+ ## 注意事项
348
+
349
+ 1. 所有处理器(`sysWork`/`apiWork`/`wsWork`/`jsonpWork`)在 `index.ts` 中被挂载到 `global`
350
+ 2. `validateHostdir()` 拒绝名称为 `default` 和 `asai` 的站点
351
+ 3. `http-server.ts` 中的 `checkFileExists()` 同时检查文件权限
352
+ 4. 代理服务器中包含 SSL 错误处理(`rejectUnauthorized: false` 用于自签名证书)
353
+ 5. 日志系统使用缓冲区异步写入,不会阻塞主线程
354
+
355
+ ---
356
+
357
+ ## 代码分析与优化建议
358
+
359
+ ### ✅ 已优化项目
360
+
361
+ #### 1. 全局变量污染 ➔ 模块级 Map ✅
362
+
363
+ **优化内容**:`index.ts` 中改用模块级 `workHandlers` Map 存储处理器,通过 `getWorkHandler()` 导出,`http-server.ts` 和 `ws-server.ts` 通过该函数获取,不再污染 `global`。
364
+
365
+ ```typescript
366
+ // 优化后:模块级 Map,可多实例并行
367
+ const workHandlers = new Map<string, Function>();
368
+ export function getWorkHandler(name: string): Function | undefined {
369
+ return workHandlers.get(name);
370
+ }
371
+ ```
372
+
373
+ **优化收益**:避免全局命名冲突,支持多实例并行运行,单元测试可独立 mock。
374
+
375
+ ---
376
+
377
+ #### 2. 静态文件服务增加 ETag 和 Last-Modified ✅
378
+
379
+ **优化内容**:新增 `serveStaticFile()` 函数,增加 `ETag` 和 `Last-Modified` 响应头,支持客户端条件请求(`If-None-Match` / `If-Modified-Since`),返回 304 Not Modified 减少不必要的文件传输。
380
+
381
+ **优化收益**:节省带宽约 30-50%。
382
+
383
+ ---
384
+
385
+ #### 3. URL 解析增加编码保护 ✅
386
+
387
+ **优化内容**:`parseUrlPath()` 在解析前对 URL 进行 `encodeURI()` 编码,避免中文等特殊字符导致 `new URL()` 抛出异常。
388
+
389
+ ---
390
+
391
+ #### 4. 日志缓冲区增加进程退出刷新 ✅
392
+
393
+ **优化内容**:`LogBuffer` 构造函数和 `initLog()` 中注册 `process.once('beforeExit')` 钩子,确保进程退出前刷新所有日志缓冲区,防止日志数据丢失。
394
+
395
+ ---
396
+
397
+ #### 5. WebSocket 鉴权 `ws.send` + `close` 竞争修复 ✅
398
+
399
+ **优化内容**:`isOkWs()` 中所有 `ws.send(msg)` 改为在回调中执行 `ws.close()`,确保消息发送完毕后再关闭连接。
400
+
401
+ ---
402
+
403
+ #### 6. 代理服务器 Userinfo 透传增加开关 ✅
404
+
405
+ **优化内容**:在 `startProxyServer()` 中增加 `passUserInfo` 配置开关(默认关闭),避免用户信息泄露给第三方后端。
406
+
407
+ ---
408
+
409
+ #### 7. HTTP 连接监控间隔缩短 ✅
410
+
411
+ **优化内容**:连接监控间隔从 30 分钟缩短为 5 分钟,更及时地处理连接数激增。
412
+
413
+ ---
414
+
415
+ #### 8. 代码可维护性改进 ✅
416
+
417
+ **优化内容**:将静态文件服务逻辑拆分为独立的 `serveStaticFile()` 函数,包含完整的 ETag 校验和流式文件服务逻辑。
418
+
419
+ ---
420
+
421
+ ### 🔜 待优化项目
422
+
423
+ | 优先级 | 问题 | 状态 |
424
+ |--------|------|------|
425
+ | 🟡 P1 | 代码拆分完成(http-server.ts 仍需进一步细化) | 待处理 |
426
+
427
+ ---
428
+
429
+ ### 优化优先级总结
430
+
431
+ | 优先级 | 问题 | 影响 |
432
+ |--------|------|------|
433
+ | ✅ 已修复 | 全局变量污染 | 可维护性/多实例兼容 |
434
+ | ✅ 已修复 | 缺少 ETag、日志丢失、鉴权竞争 | 性能/可靠性 |
435
+ | ✅ 已修复 | 代理信息泄露、URL 解析异常 | 安全/稳定性 |
436
+ | ✅ 已修复 | 代码拆分、监控粒度 | 可维护性 |
package/index.js CHANGED
@@ -1 +1 @@
1
- (()=>{var __webpack_modules__={546:(e,t,s)=>{var r=s(407);e.exports=function(e,t){var s=r(e,t),o=s.StartAsaiHost,n=s.asaiWs;return{StartAsaiHost:o,asaiWs:n}}},354:(e,t,s)=>{"use strict";const r=s(412);const o=s(335);const n=s(376);const i=s(893);const a=s(389);const c=s(332);const l=s(681);const f=s(129);l.createWebSocketStream=r;l.extension=o;l.PerMessageDeflate=n;l.Receiver=i;l.Sender=a;l.Server=f;l.subprotocol=c;l.WebSocket=l;l.WebSocketServer=f;e.exports=l},803:(e,t,s)=>{"use strict";const{EMPTY_BUFFER:r}=s(791);const o=Buffer[Symbol.species];function concat(e,t){if(e.length===0)return r;if(e.length===1)return e[0];const s=Buffer.allocUnsafe(t);let n=0;for(let t=0;t<e.length;t++){const r=e[t];s.set(r,n);n+=r.length}if(n<t){return new o(s.buffer,s.byteOffset,n)}return s}function _mask(e,t,s,r,o){for(let n=0;n<o;n++){s[r+n]=e[n]^t[n&3]}}function _unmask(e,t){for(let s=0;s<e.length;s++){e[s]^=t[s&3]}}function toArrayBuffer(e){if(e.length===e.buffer.byteLength){return e.buffer}return e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}function toBuffer(e){toBuffer.readOnly=true;if(Buffer.isBuffer(e))return e;let t;if(e instanceof ArrayBuffer){t=new o(e)}else if(ArrayBuffer.isView(e)){t=new o(e.buffer,e.byteOffset,e.byteLength)}else{t=Buffer.from(e);toBuffer.readOnly=false}return t}e.exports={concat:concat,mask:_mask,toArrayBuffer:toArrayBuffer,toBuffer:toBuffer,unmask:_unmask};if(!process.env.WS_NO_BUFFER_UTIL){try{const t=s(327);e.exports.mask=function(e,s,r,o,n){if(n<48)_mask(e,s,r,o,n);else t.mask(e,s,r,o,n)};e.exports.unmask=function(e,s){if(e.length<32)_unmask(e,s);else t.unmask(e,s)}}catch(e){}}},791:e=>{"use strict";const t=["nodebuffer","arraybuffer","fragments"];const s=typeof Blob!=="undefined";if(s)t.push("blob");e.exports={BINARY_TYPES:t,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:s,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}},634:(e,t,s)=>{"use strict";const{kForOnEventAttribute:r,kListener:o}=s(791);const n=Symbol("kCode");const i=Symbol("kData");const a=Symbol("kError");const c=Symbol("kMessage");const l=Symbol("kReason");const f=Symbol("kTarget");const h=Symbol("kType");const u=Symbol("kWasClean");class Event{constructor(e){this[f]=null;this[h]=e}get target(){return this[f]}get type(){return this[h]}}Object.defineProperty(Event.prototype,"target",{enumerable:true});Object.defineProperty(Event.prototype,"type",{enumerable:true});class CloseEvent extends Event{constructor(e,t={}){super(e);this[n]=t.code===undefined?0:t.code;this[l]=t.reason===undefined?"":t.reason;this[u]=t.wasClean===undefined?false:t.wasClean}get code(){return this[n]}get reason(){return this[l]}get wasClean(){return this[u]}}Object.defineProperty(CloseEvent.prototype,"code",{enumerable:true});Object.defineProperty(CloseEvent.prototype,"reason",{enumerable:true});Object.defineProperty(CloseEvent.prototype,"wasClean",{enumerable:true});class ErrorEvent extends Event{constructor(e,t={}){super(e);this[a]=t.error===undefined?null:t.error;this[c]=t.message===undefined?"":t.message}get error(){return this[a]}get message(){return this[c]}}Object.defineProperty(ErrorEvent.prototype,"error",{enumerable:true});Object.defineProperty(ErrorEvent.prototype,"message",{enumerable:true});class MessageEvent extends Event{constructor(e,t={}){super(e);this[i]=t.data===undefined?null:t.data}get data(){return this[i]}}Object.defineProperty(MessageEvent.prototype,"data",{enumerable:true});const d={addEventListener(e,t,s={}){for(const n of this.listeners(e)){if(!s[r]&&n[o]===t&&!n[r]){return}}let n;if(e==="message"){n=function onMessage(e,s){const r=new MessageEvent("message",{data:s?e:e.toString()});r[f]=this;callListener(t,this,r)}}else if(e==="close"){n=function onClose(e,s){const r=new CloseEvent("close",{code:e,reason:s.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[f]=this;callListener(t,this,r)}}else if(e==="error"){n=function onError(e){const s=new ErrorEvent("error",{error:e,message:e.message});s[f]=this;callListener(t,this,s)}}else if(e==="open"){n=function onOpen(){const e=new Event("open");e[f]=this;callListener(t,this,e)}}else{return}n[r]=!!s[r];n[o]=t;if(s.once){this.once(e,n)}else{this.on(e,n)}},removeEventListener(e,t){for(const s of this.listeners(e)){if(s[o]===t&&!s[r]){this.removeListener(e,s);break}}}};e.exports={CloseEvent:CloseEvent,ErrorEvent:ErrorEvent,Event:Event,EventTarget:d,MessageEvent:MessageEvent};function callListener(e,t,s){if(typeof e==="object"&&e.handleEvent){e.handleEvent.call(e,s)}else{e.call(t,s)}}},335:(e,t,s)=>{"use strict";const{tokenChars:r}=s(615);function push(e,t,s){if(e[t]===undefined)e[t]=[s];else e[t].push(s)}function parse(e){const t=Object.create(null);let s=Object.create(null);let o=false;let n=false;let i=false;let a;let c;let l=-1;let f=-1;let h=-1;let u=0;for(;u<e.length;u++){f=e.charCodeAt(u);if(a===undefined){if(h===-1&&r[f]===1){if(l===-1)l=u}else if(u!==0&&(f===32||f===9)){if(h===-1&&l!==-1)h=u}else if(f===59||f===44){if(l===-1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(h===-1)h=u;const r=e.slice(l,h);if(f===44){push(t,r,s);s=Object.create(null)}else{a=r}l=h=-1}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}else if(c===undefined){if(h===-1&&r[f]===1){if(l===-1)l=u}else if(f===32||f===9){if(h===-1&&l!==-1)h=u}else if(f===59||f===44){if(l===-1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(h===-1)h=u;push(s,e.slice(l,h),true);if(f===44){push(t,a,s);s=Object.create(null);a=undefined}l=h=-1}else if(f===61&&l!==-1&&h===-1){c=e.slice(l,u);l=h=-1}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}else{if(n){if(r[f]!==1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(l===-1)l=u;else if(!o)o=true;n=false}else if(i){if(r[f]===1){if(l===-1)l=u}else if(f===34&&l!==-1){i=false;h=u}else if(f===92){n=true}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}else if(f===34&&e.charCodeAt(u-1)===61){i=true}else if(h===-1&&r[f]===1){if(l===-1)l=u}else if(l!==-1&&(f===32||f===9)){if(h===-1)h=u}else if(f===59||f===44){if(l===-1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(h===-1)h=u;let r=e.slice(l,h);if(o){r=r.replace(/\\/g,"");o=false}push(s,c,r);if(f===44){push(t,a,s);s=Object.create(null);a=undefined}c=undefined;l=h=-1}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}}if(l===-1||i||f===32||f===9){throw new SyntaxError("Unexpected end of input")}if(h===-1)h=u;const d=e.slice(l,h);if(a===undefined){push(t,d,s)}else{if(c===undefined){push(s,d,true)}else if(o){push(s,c,d.replace(/\\/g,""))}else{push(s,c,d)}push(t,a,s)}return t}function format(e){return Object.keys(e).map((t=>{let s=e[t];if(!Array.isArray(s))s=[s];return s.map((e=>[t].concat(Object.keys(e).map((t=>{let s=e[t];if(!Array.isArray(s))s=[s];return s.map((e=>e===true?t:`${t}=${e}`)).join("; ")}))).join("; "))).join(", ")})).join(", ")}e.exports={format:format,parse:parse}},958:e=>{"use strict";const t=Symbol("kDone");const s=Symbol("kRun");class Limiter{constructor(e){this[t]=()=>{this.pending--;this[s]()};this.concurrency=e||Infinity;this.jobs=[];this.pending=0}add(e){this.jobs.push(e);this[s]()}[s](){if(this.pending===this.concurrency)return;if(this.jobs.length){const e=this.jobs.shift();this.pending++;e(this[t])}}}e.exports=Limiter},376:(e,t,s)=>{"use strict";const r=s(106);const o=s(803);const n=s(958);const{kStatusCode:i}=s(791);const a=Buffer[Symbol.species];const c=Buffer.from([0,0,255,255]);const l=Symbol("permessage-deflate");const f=Symbol("total-length");const h=Symbol("callback");const u=Symbol("buffers");const d=Symbol("error");let p;class PerMessageDeflate{constructor(e){this._options=e||{};this._threshold=this._options.threshold!==undefined?this._options.threshold:1024;this._maxPayload=this._options.maxPayload|0;this._isServer=!!this._options.isServer;this._deflate=null;this._inflate=null;this.params=null;if(!p){const e=this._options.concurrencyLimit!==undefined?this._options.concurrencyLimit:10;p=new n(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};if(this._options.serverNoContextTakeover){e.server_no_context_takeover=true}if(this._options.clientNoContextTakeover){e.client_no_context_takeover=true}if(this._options.serverMaxWindowBits){e.server_max_window_bits=this._options.serverMaxWindowBits}if(this._options.clientMaxWindowBits){e.client_max_window_bits=this._options.clientMaxWindowBits}else if(this._options.clientMaxWindowBits==null){e.client_max_window_bits=true}return e}accept(e){e=this.normalizeParams(e);this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e);return this.params}cleanup(){if(this._inflate){this._inflate.close();this._inflate=null}if(this._deflate){const e=this._deflate[h];this._deflate.close();this._deflate=null;if(e){e(new Error("The deflate stream was closed while data was being processed"))}}}acceptAsServer(e){const t=this._options;const s=e.find((e=>{if(t.serverNoContextTakeover===false&&e.server_no_context_takeover||e.server_max_window_bits&&(t.serverMaxWindowBits===false||typeof t.serverMaxWindowBits==="number"&&t.serverMaxWindowBits>e.server_max_window_bits)||typeof t.clientMaxWindowBits==="number"&&!e.client_max_window_bits){return false}return true}));if(!s){throw new Error("None of the extension offers can be accepted")}if(t.serverNoContextTakeover){s.server_no_context_takeover=true}if(t.clientNoContextTakeover){s.client_no_context_takeover=true}if(typeof t.serverMaxWindowBits==="number"){s.server_max_window_bits=t.serverMaxWindowBits}if(typeof t.clientMaxWindowBits==="number"){s.client_max_window_bits=t.clientMaxWindowBits}else if(s.client_max_window_bits===true||t.clientMaxWindowBits===false){delete s.client_max_window_bits}return s}acceptAsClient(e){const t=e[0];if(this._options.clientNoContextTakeover===false&&t.client_no_context_takeover){throw new Error('Unexpected parameter "client_no_context_takeover"')}if(!t.client_max_window_bits){if(typeof this._options.clientMaxWindowBits==="number"){t.client_max_window_bits=this._options.clientMaxWindowBits}}else if(this._options.clientMaxWindowBits===false||typeof this._options.clientMaxWindowBits==="number"&&t.client_max_window_bits>this._options.clientMaxWindowBits){throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}return t}normalizeParams(e){e.forEach((e=>{Object.keys(e).forEach((t=>{let s=e[t];if(s.length>1){throw new Error(`Parameter "${t}" must have only a single value`)}s=s[0];if(t==="client_max_window_bits"){if(s!==true){const e=+s;if(!Number.isInteger(e)||e<8||e>15){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}s=e}else if(!this._isServer){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}}else if(t==="server_max_window_bits"){const e=+s;if(!Number.isInteger(e)||e<8||e>15){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}s=e}else if(t==="client_no_context_takeover"||t==="server_no_context_takeover"){if(s!==true){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}}else{throw new Error(`Unknown parameter "${t}"`)}e[t]=s}))}));return e}decompress(e,t,s){p.add((r=>{this._decompress(e,t,((e,t)=>{r();s(e,t)}))}))}compress(e,t,s){p.add((r=>{this._compress(e,t,((e,t)=>{r();s(e,t)}))}))}_decompress(e,t,s){const n=this._isServer?"client":"server";if(!this._inflate){const e=`${n}_max_window_bits`;const t=typeof this.params[e]!=="number"?r.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=r.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t});this._inflate[l]=this;this._inflate[f]=0;this._inflate[u]=[];this._inflate.on("error",inflateOnError);this._inflate.on("data",inflateOnData)}this._inflate[h]=s;this._inflate.write(e);if(t)this._inflate.write(c);this._inflate.flush((()=>{const e=this._inflate[d];if(e){this._inflate.close();this._inflate=null;s(e);return}const r=o.concat(this._inflate[u],this._inflate[f]);if(this._inflate._readableState.endEmitted){this._inflate.close();this._inflate=null}else{this._inflate[f]=0;this._inflate[u]=[];if(t&&this.params[`${n}_no_context_takeover`]){this._inflate.reset()}}s(null,r)}))}_compress(e,t,s){const n=this._isServer?"server":"client";if(!this._deflate){const e=`${n}_max_window_bits`;const t=typeof this.params[e]!=="number"?r.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=r.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t});this._deflate[f]=0;this._deflate[u]=[];this._deflate.on("data",deflateOnData)}this._deflate[h]=s;this._deflate.write(e);this._deflate.flush(r.Z_SYNC_FLUSH,(()=>{if(!this._deflate){return}let e=o.concat(this._deflate[u],this._deflate[f]);if(t){e=new a(e.buffer,e.byteOffset,e.length-4)}this._deflate[h]=null;this._deflate[f]=0;this._deflate[u]=[];if(t&&this.params[`${n}_no_context_takeover`]){this._deflate.reset()}s(null,e)}))}}e.exports=PerMessageDeflate;function deflateOnData(e){this[u].push(e);this[f]+=e.length}function inflateOnData(e){this[f]+=e.length;if(this[l]._maxPayload<1||this[f]<=this[l]._maxPayload){this[u].push(e);return}this[d]=new RangeError("Max payload size exceeded");this[d].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH";this[d][i]=1009;this.removeListener("data",inflateOnData);this.reset()}function inflateOnError(e){this[l]._inflate=null;if(this[d]){this[h](this[d]);return}e[i]=1007;this[h](e)}},893:(e,t,s)=>{"use strict";const{Writable:r}=s(203);const o=s(376);const{BINARY_TYPES:n,EMPTY_BUFFER:i,kStatusCode:a,kWebSocket:c}=s(791);const{concat:l,toArrayBuffer:f,unmask:h}=s(803);const{isValidStatusCode:u,isValidUTF8:d}=s(615);const p=Buffer[Symbol.species];const _=0;const g=1;const m=2;const b=3;const y=4;const S=5;const k=6;class Receiver extends r{constructor(e={}){super();this._allowSynchronousEvents=e.allowSynchronousEvents!==undefined?e.allowSynchronousEvents:true;this._binaryType=e.binaryType||n[0];this._extensions=e.extensions||{};this._isServer=!!e.isServer;this._maxPayload=e.maxPayload|0;this._skipUTF8Validation=!!e.skipUTF8Validation;this[c]=undefined;this._bufferedBytes=0;this._buffers=[];this._compressed=false;this._payloadLength=0;this._mask=undefined;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=_}_write(e,t,s){if(this._opcode===8&&this._state==_)return s();this._bufferedBytes+=e.length;this._buffers.push(e);this.startLoop(s)}consume(e){this._bufferedBytes-=e;if(e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){const t=this._buffers[0];this._buffers[0]=new p(t.buffer,t.byteOffset+e,t.length-e);return new p(t.buffer,t.byteOffset,e)}const t=Buffer.allocUnsafe(e);do{const s=this._buffers[0];const r=t.length-e;if(e>=s.length){t.set(this._buffers.shift(),r)}else{t.set(new Uint8Array(s.buffer,s.byteOffset,e),r);this._buffers[0]=new p(s.buffer,s.byteOffset+e,s.length-e)}e-=s.length}while(e>0);return t}startLoop(e){this._loop=true;do{switch(this._state){case _:this.getInfo(e);break;case g:this.getPayloadLength16(e);break;case m:this.getPayloadLength64(e);break;case b:this.getMask();break;case y:this.getData(e);break;case S:case k:this._loop=false;return}}while(this._loop);if(!this._errored)e()}getInfo(e){if(this._bufferedBytes<2){this._loop=false;return}const t=this.consume(2);if((t[0]&48)!==0){const t=this.createError(RangeError,"RSV2 and RSV3 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_2_3");e(t);return}const s=(t[0]&64)===64;if(s&&!this._extensions[o.extensionName]){const t=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");e(t);return}this._fin=(t[0]&128)===128;this._opcode=t[0]&15;this._payloadLength=t[1]&127;if(this._opcode===0){if(s){const t=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");e(t);return}if(!this._fragmented){const t=this.createError(RangeError,"invalid opcode 0",true,1002,"WS_ERR_INVALID_OPCODE");e(t);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){const t=this.createError(RangeError,`invalid opcode ${this._opcode}`,true,1002,"WS_ERR_INVALID_OPCODE");e(t);return}this._compressed=s}else if(this._opcode>7&&this._opcode<11){if(!this._fin){const t=this.createError(RangeError,"FIN must be set",true,1002,"WS_ERR_EXPECTED_FIN");e(t);return}if(s){const t=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");e(t);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){const t=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,true,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");e(t);return}}else{const t=this.createError(RangeError,`invalid opcode ${this._opcode}`,true,1002,"WS_ERR_INVALID_OPCODE");e(t);return}if(!this._fin&&!this._fragmented)this._fragmented=this._opcode;this._masked=(t[1]&128)===128;if(this._isServer){if(!this._masked){const t=this.createError(RangeError,"MASK must be set",true,1002,"WS_ERR_EXPECTED_MASK");e(t);return}}else if(this._masked){const t=this.createError(RangeError,"MASK must be clear",true,1002,"WS_ERR_UNEXPECTED_MASK");e(t);return}if(this._payloadLength===126)this._state=g;else if(this._payloadLength===127)this._state=m;else this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=false;return}this._payloadLength=this.consume(2).readUInt16BE(0);this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=false;return}const t=this.consume(8);const s=t.readUInt32BE(0);if(s>Math.pow(2,53-32)-1){const t=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",false,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");e(t);return}this._payloadLength=s*Math.pow(2,32)+t.readUInt32BE(4);this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8){this._totalPayloadLength+=this._payloadLength;if(this._totalPayloadLength>this._maxPayload&&this._maxPayload>0){const t=this.createError(RangeError,"Max payload size exceeded",false,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");e(t);return}}if(this._masked)this._state=b;else this._state=y}getMask(){if(this._bufferedBytes<4){this._loop=false;return}this._mask=this.consume(4);this._state=y}getData(e){let t=i;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=false;return}t=this.consume(this._payloadLength);if(this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0){h(t,this._mask)}}if(this._opcode>7){this.controlMessage(t,e);return}if(this._compressed){this._state=S;this.decompress(t,e);return}if(t.length){this._messageLength=this._totalPayloadLength;this._fragments.push(t)}this.dataMessage(e)}decompress(e,t){const s=this._extensions[o.extensionName];s.decompress(e,this._fin,((e,s)=>{if(e)return t(e);if(s.length){this._messageLength+=s.length;if(this._messageLength>this._maxPayload&&this._maxPayload>0){const e=this.createError(RangeError,"Max payload size exceeded",false,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");t(e);return}this._fragments.push(s)}this.dataMessage(t);if(this._state===_)this.startLoop(t)}))}dataMessage(e){if(!this._fin){this._state=_;return}const t=this._messageLength;const s=this._fragments;this._totalPayloadLength=0;this._messageLength=0;this._fragmented=0;this._fragments=[];if(this._opcode===2){let r;if(this._binaryType==="nodebuffer"){r=l(s,t)}else if(this._binaryType==="arraybuffer"){r=f(l(s,t))}else if(this._binaryType==="blob"){r=new Blob(s)}else{r=s}if(this._allowSynchronousEvents){this.emit("message",r,true);this._state=_}else{this._state=k;setImmediate((()=>{this.emit("message",r,true);this._state=_;this.startLoop(e)}))}}else{const r=l(s,t);if(!this._skipUTF8Validation&&!d(r)){const t=this.createError(Error,"invalid UTF-8 sequence",true,1007,"WS_ERR_INVALID_UTF8");e(t);return}if(this._state===S||this._allowSynchronousEvents){this.emit("message",r,false);this._state=_}else{this._state=k;setImmediate((()=>{this.emit("message",r,false);this._state=_;this.startLoop(e)}))}}}controlMessage(e,t){if(this._opcode===8){if(e.length===0){this._loop=false;this.emit("conclude",1005,i);this.end()}else{const s=e.readUInt16BE(0);if(!u(s)){const e=this.createError(RangeError,`invalid status code ${s}`,true,1002,"WS_ERR_INVALID_CLOSE_CODE");t(e);return}const r=new p(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!d(r)){const e=this.createError(Error,"invalid UTF-8 sequence",true,1007,"WS_ERR_INVALID_UTF8");t(e);return}this._loop=false;this.emit("conclude",s,r);this.end()}this._state=_;return}if(this._allowSynchronousEvents){this.emit(this._opcode===9?"ping":"pong",e);this._state=_}else{this._state=k;setImmediate((()=>{this.emit(this._opcode===9?"ping":"pong",e);this._state=_;this.startLoop(t)}))}}createError(e,t,s,r,o){this._loop=false;this._errored=true;const n=new e(s?`Invalid WebSocket frame: ${t}`:t);Error.captureStackTrace(n,this.createError);n.code=o;n[a]=r;return n}}e.exports=Receiver},389:(e,t,s)=>{"use strict";const{Duplex:r}=s(203);const{randomFillSync:o}=s(982);const n=s(376);const{EMPTY_BUFFER:i,kWebSocket:a,NOOP:c}=s(791);const{isBlob:l,isValidStatusCode:f}=s(615);const{mask:h,toBuffer:u}=s(803);const d=Symbol("kByteLength");const p=Buffer.alloc(4);const _=8*1024;let g;let m=_;const b=0;const y=1;const S=2;class Sender{constructor(e,t,s){this._extensions=t||{};if(s){this._generateMask=s;this._maskBuffer=Buffer.alloc(4)}this._socket=e;this._firstFragment=true;this._compress=false;this._bufferedBytes=0;this._queue=[];this._state=b;this.onerror=c;this[a]=undefined}static frame(e,t){let s;let r=false;let n=2;let i=false;if(t.mask){s=t.maskBuffer||p;if(t.generateMask){t.generateMask(s)}else{if(m===_){if(g===undefined){g=Buffer.alloc(_)}o(g,0,_);m=0}s[0]=g[m++];s[1]=g[m++];s[2]=g[m++];s[3]=g[m++]}i=(s[0]|s[1]|s[2]|s[3])===0;n=6}let a;if(typeof e==="string"){if((!t.mask||i)&&t[d]!==undefined){a=t[d]}else{e=Buffer.from(e);a=e.length}}else{a=e.length;r=t.mask&&t.readOnly&&!i}let c=a;if(a>=65536){n+=8;c=127}else if(a>125){n+=2;c=126}const l=Buffer.allocUnsafe(r?a+n:n);l[0]=t.fin?t.opcode|128:t.opcode;if(t.rsv1)l[0]|=64;l[1]=c;if(c===126){l.writeUInt16BE(a,2)}else if(c===127){l[2]=l[3]=0;l.writeUIntBE(a,4,6)}if(!t.mask)return[l,e];l[1]|=128;l[n-4]=s[0];l[n-3]=s[1];l[n-2]=s[2];l[n-1]=s[3];if(i)return[l,e];if(r){h(e,s,l,n,a);return[l]}h(e,s,e,0,a);return[l,e]}close(e,t,s,r){let o;if(e===undefined){o=i}else if(typeof e!=="number"||!f(e)){throw new TypeError("First argument must be a valid error code number")}else if(t===undefined||!t.length){o=Buffer.allocUnsafe(2);o.writeUInt16BE(e,0)}else{const s=Buffer.byteLength(t);if(s>123){throw new RangeError("The message must not be greater than 123 bytes")}o=Buffer.allocUnsafe(2+s);o.writeUInt16BE(e,0);if(typeof t==="string"){o.write(t,2)}else{o.set(t,2)}}const n={[d]:o.length,fin:true,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:8,readOnly:false,rsv1:false};if(this._state!==b){this.enqueue([this.dispatch,o,false,n,r])}else{this.sendFrame(Sender.frame(o,n),r)}}ping(e,t,s){let r;let o;if(typeof e==="string"){r=Buffer.byteLength(e);o=false}else if(l(e)){r=e.size;o=false}else{e=u(e);r=e.length;o=u.readOnly}if(r>125){throw new RangeError("The data size must not be greater than 125 bytes")}const n={[d]:r,fin:true,generateMask:this._generateMask,mask:t,maskBuffer:this._maskBuffer,opcode:9,readOnly:o,rsv1:false};if(l(e)){if(this._state!==b){this.enqueue([this.getBlobData,e,false,n,s])}else{this.getBlobData(e,false,n,s)}}else if(this._state!==b){this.enqueue([this.dispatch,e,false,n,s])}else{this.sendFrame(Sender.frame(e,n),s)}}pong(e,t,s){let r;let o;if(typeof e==="string"){r=Buffer.byteLength(e);o=false}else if(l(e)){r=e.size;o=false}else{e=u(e);r=e.length;o=u.readOnly}if(r>125){throw new RangeError("The data size must not be greater than 125 bytes")}const n={[d]:r,fin:true,generateMask:this._generateMask,mask:t,maskBuffer:this._maskBuffer,opcode:10,readOnly:o,rsv1:false};if(l(e)){if(this._state!==b){this.enqueue([this.getBlobData,e,false,n,s])}else{this.getBlobData(e,false,n,s)}}else if(this._state!==b){this.enqueue([this.dispatch,e,false,n,s])}else{this.sendFrame(Sender.frame(e,n),s)}}send(e,t,s){const r=this._extensions[n.extensionName];let o=t.binary?2:1;let i=t.compress;let a;let c;if(typeof e==="string"){a=Buffer.byteLength(e);c=false}else if(l(e)){a=e.size;c=false}else{e=u(e);a=e.length;c=u.readOnly}if(this._firstFragment){this._firstFragment=false;if(i&&r&&r.params[r._isServer?"server_no_context_takeover":"client_no_context_takeover"]){i=a>=r._threshold}this._compress=i}else{i=false;o=0}if(t.fin)this._firstFragment=true;const f={[d]:a,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:o,readOnly:c,rsv1:i};if(l(e)){if(this._state!==b){this.enqueue([this.getBlobData,e,this._compress,f,s])}else{this.getBlobData(e,this._compress,f,s)}}else if(this._state!==b){this.enqueue([this.dispatch,e,this._compress,f,s])}else{this.dispatch(e,this._compress,f,s)}}getBlobData(e,t,s,r){this._bufferedBytes+=s[d];this._state=S;e.arrayBuffer().then((e=>{if(this._socket.destroyed){const e=new Error("The socket was closed while the blob was being read");process.nextTick(callCallbacks,this,e,r);return}this._bufferedBytes-=s[d];const o=u(e);if(!t){this._state=b;this.sendFrame(Sender.frame(o,s),r);this.dequeue()}else{this.dispatch(o,t,s,r)}})).catch((e=>{process.nextTick(onError,this,e,r)}))}dispatch(e,t,s,r){if(!t){this.sendFrame(Sender.frame(e,s),r);return}const o=this._extensions[n.extensionName];this._bufferedBytes+=s[d];this._state=y;o.compress(e,s.fin,((e,t)=>{if(this._socket.destroyed){const e=new Error("The socket was closed while data was being compressed");callCallbacks(this,e,r);return}this._bufferedBytes-=s[d];this._state=b;s.readOnly=false;this.sendFrame(Sender.frame(t,s),r);this.dequeue()}))}dequeue(){while(this._state===b&&this._queue.length){const e=this._queue.shift();this._bufferedBytes-=e[3][d];Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][d];this._queue.push(e)}sendFrame(e,t){if(e.length===2){this._socket.cork();this._socket.write(e[0]);this._socket.write(e[1],t);this._socket.uncork()}else{this._socket.write(e[0],t)}}}e.exports=Sender;function callCallbacks(e,t,s){if(typeof s==="function")s(t);for(let s=0;s<e._queue.length;s++){const r=e._queue[s];const o=r[r.length-1];if(typeof o==="function")o(t)}}function onError(e,t,s){callCallbacks(e,t,s);e.onerror(t)}},412:(e,t,s)=>{"use strict";const r=s(681);const{Duplex:o}=s(203);function emitClose(e){e.emit("close")}function duplexOnEnd(){if(!this.destroyed&&this._writableState.finished){this.destroy()}}function duplexOnError(e){this.removeListener("error",duplexOnError);this.destroy();if(this.listenerCount("error")===0){this.emit("error",e)}}function createWebSocketStream(e,t){let s=true;const r=new o({...t,autoDestroy:false,emitClose:false,objectMode:false,writableObjectMode:false});e.on("message",(function message(t,s){const o=!s&&r._readableState.objectMode?t.toString():t;if(!r.push(o))e.pause()}));e.once("error",(function error(e){if(r.destroyed)return;s=false;r.destroy(e)}));e.once("close",(function close(){if(r.destroyed)return;r.push(null)}));r._destroy=function(t,o){if(e.readyState===e.CLOSED){o(t);process.nextTick(emitClose,r);return}let n=false;e.once("error",(function error(e){n=true;o(e)}));e.once("close",(function close(){if(!n)o(t);process.nextTick(emitClose,r)}));if(s)e.terminate()};r._final=function(t){if(e.readyState===e.CONNECTING){e.once("open",(function open(){r._final(t)}));return}if(e._socket===null)return;if(e._socket._writableState.finished){t();if(r._readableState.endEmitted)r.destroy()}else{e._socket.once("finish",(function finish(){t()}));e.close()}};r._read=function(){if(e.isPaused)e.resume()};r._write=function(t,s,o){if(e.readyState===e.CONNECTING){e.once("open",(function open(){r._write(t,s,o)}));return}e.send(t,o)};r.on("end",duplexOnEnd);r.on("error",duplexOnError);return r}e.exports=createWebSocketStream},332:(e,t,s)=>{"use strict";const{tokenChars:r}=s(615);function parse(e){const t=new Set;let s=-1;let o=-1;let n=0;for(n;n<e.length;n++){const i=e.charCodeAt(n);if(o===-1&&r[i]===1){if(s===-1)s=n}else if(n!==0&&(i===32||i===9)){if(o===-1&&s!==-1)o=n}else if(i===44){if(s===-1){throw new SyntaxError(`Unexpected character at index ${n}`)}if(o===-1)o=n;const r=e.slice(s,o);if(t.has(r)){throw new SyntaxError(`The "${r}" subprotocol is duplicated`)}t.add(r);s=o=-1}else{throw new SyntaxError(`Unexpected character at index ${n}`)}}if(s===-1||o!==-1){throw new SyntaxError("Unexpected end of input")}const i=e.slice(s,n);if(t.has(i)){throw new SyntaxError(`The "${i}" subprotocol is duplicated`)}t.add(i);return t}e.exports={parse:parse}},615:(e,t,s)=>{"use strict";const{isUtf8:r}=s(181);const{hasBlob:o}=s(791);const n=[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(e){return e>=1e3&&e<=1014&&e!==1004&&e!==1005&&e!==1006||e>=3e3&&e<=4999}function _isValidUTF8(e){const t=e.length;let s=0;while(s<t){if((e[s]&128)===0){s++}else if((e[s]&224)===192){if(s+1===t||(e[s+1]&192)!==128||(e[s]&254)===192){return false}s+=2}else if((e[s]&240)===224){if(s+2>=t||(e[s+1]&192)!==128||(e[s+2]&192)!==128||e[s]===224&&(e[s+1]&224)===128||e[s]===237&&(e[s+1]&224)===160){return false}s+=3}else if((e[s]&248)===240){if(s+3>=t||(e[s+1]&192)!==128||(e[s+2]&192)!==128||(e[s+3]&192)!==128||e[s]===240&&(e[s+1]&240)===128||e[s]===244&&e[s+1]>143||e[s]>244){return false}s+=4}else{return false}}return true}function isBlob(e){return o&&typeof e==="object"&&typeof e.arrayBuffer==="function"&&typeof e.type==="string"&&typeof e.stream==="function"&&(e[Symbol.toStringTag]==="Blob"||e[Symbol.toStringTag]==="File")}e.exports={isBlob:isBlob,isValidStatusCode:isValidStatusCode,isValidUTF8:_isValidUTF8,tokenChars:n};if(r){e.exports.isValidUTF8=function(e){return e.length<24?_isValidUTF8(e):r(e)}}else if(!process.env.WS_NO_UTF_8_VALIDATE){try{const t=s(414);e.exports.isValidUTF8=function(e){return e.length<32?_isValidUTF8(e):t(e)}}catch(e){}}},129:(e,t,s)=>{"use strict";const r=s(434);const o=s(611);const{Duplex:n}=s(203);const{createHash:i}=s(982);const a=s(335);const c=s(376);const l=s(332);const f=s(681);const{CLOSE_TIMEOUT:h,GUID:u,kWebSocket:d}=s(791);const p=/^[+/0-9A-Za-z]{22}==$/;const _=0;const g=1;const m=2;class WebSocketServer extends r{constructor(e,t){super();e={allowSynchronousEvents:true,autoPong:true,maxPayload:100*1024*1024,skipUTF8Validation:false,perMessageDeflate:false,handleProtocols:null,clientTracking:true,closeTimeout:h,verifyClient:null,noServer:false,backlog:null,server:null,host:null,path:null,port:null,WebSocket:f,...e};if(e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer){throw new TypeError('One and only one of the "port", "server", or "noServer" options '+"must be specified")}if(e.port!=null){this._server=o.createServer(((e,t)=>{const s=o.STATUS_CODES[426];t.writeHead(426,{"Content-Length":s.length,"Content-Type":"text/plain"});t.end(s)}));this._server.listen(e.port,e.host,e.backlog,t)}else if(e.server){this._server=e.server}if(this._server){const e=this.emit.bind(this,"connection");this._removeListeners=addListeners(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,s,r)=>{this.handleUpgrade(t,s,r,e)}})}if(e.perMessageDeflate===true)e.perMessageDeflate={};if(e.clientTracking){this.clients=new Set;this._shouldEmitClose=false}this.options=e;this._state=_}address(){if(this.options.noServer){throw new Error('The server is operating in "noServer" mode')}if(!this._server)return null;return this._server.address()}close(e){if(this._state===m){if(e){this.once("close",(()=>{e(new Error("The server is not running"))}))}process.nextTick(emitClose,this);return}if(e)this.once("close",e);if(this._state===g)return;this._state=g;if(this.options.noServer||this.options.server){if(this._server){this._removeListeners();this._removeListeners=this._server=null}if(this.clients){if(!this.clients.size){process.nextTick(emitClose,this)}else{this._shouldEmitClose=true}}else{process.nextTick(emitClose,this)}}else{const e=this._server;this._removeListeners();this._removeListeners=this._server=null;e.close((()=>{emitClose(this)}))}}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");const s=t!==-1?e.url.slice(0,t):e.url;if(s!==this.options.path)return false}return true}handleUpgrade(e,t,s,r){t.on("error",socketOnError);const o=e.headers["sec-websocket-key"];const n=e.headers.upgrade;const i=+e.headers["sec-websocket-version"];if(e.method!=="GET"){const s="Invalid HTTP method";abortHandshakeOrEmitwsClientError(this,e,t,405,s);return}if(n===undefined||n.toLowerCase()!=="websocket"){const s="Invalid Upgrade header";abortHandshakeOrEmitwsClientError(this,e,t,400,s);return}if(o===undefined||!p.test(o)){const s="Missing or invalid Sec-WebSocket-Key header";abortHandshakeOrEmitwsClientError(this,e,t,400,s);return}if(i!==13&&i!==8){const s="Missing or invalid Sec-WebSocket-Version header";abortHandshakeOrEmitwsClientError(this,e,t,400,s,{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(e)){abortHandshake(t,400);return}const f=e.headers["sec-websocket-protocol"];let h=new Set;if(f!==undefined){try{h=l.parse(f)}catch(s){const r="Invalid Sec-WebSocket-Protocol header";abortHandshakeOrEmitwsClientError(this,e,t,400,r);return}}const u=e.headers["sec-websocket-extensions"];const d={};if(this.options.perMessageDeflate&&u!==undefined){const s=new c({...this.options.perMessageDeflate,isServer:true,maxPayload:this.options.maxPayload});try{const e=a.parse(u);if(e[c.extensionName]){s.accept(e[c.extensionName]);d[c.extensionName]=s}}catch(s){const r="Invalid or unacceptable Sec-WebSocket-Extensions header";abortHandshakeOrEmitwsClientError(this,e,t,400,r);return}}if(this.options.verifyClient){const n={origin:e.headers[`${i===8?"sec-websocket-origin":"origin"}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(n,((n,i,a,c)=>{if(!n){return abortHandshake(t,i||401,a,c)}this.completeUpgrade(d,o,h,e,t,s,r)}));return}if(!this.options.verifyClient(n))return abortHandshake(t,401)}this.completeUpgrade(d,o,h,e,t,s,r)}completeUpgrade(e,t,s,r,o,n,l){if(!o.readable||!o.writable)return o.destroy();if(o[d]){throw new Error("server.handleUpgrade() was called more than once with the same "+"socket, possibly due to a misconfiguration")}if(this._state>_)return abortHandshake(o,503);const f=i("sha1").update(t+u).digest("base64");const h=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${f}`];const p=new this.options.WebSocket(null,undefined,this.options);if(s.size){const e=this.options.handleProtocols?this.options.handleProtocols(s,r):s.values().next().value;if(e){h.push(`Sec-WebSocket-Protocol: ${e}`);p._protocol=e}}if(e[c.extensionName]){const t=e[c.extensionName].params;const s=a.format({[c.extensionName]:[t]});h.push(`Sec-WebSocket-Extensions: ${s}`);p._extensions=e}this.emit("headers",h,r);o.write(h.concat("\r\n").join("\r\n"));o.removeListener("error",socketOnError);p.setSocket(o,n,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation});if(this.clients){this.clients.add(p);p.on("close",(()=>{this.clients.delete(p);if(this._shouldEmitClose&&!this.clients.size){process.nextTick(emitClose,this)}}))}l(p,r)}}e.exports=WebSocketServer;function addListeners(e,t){for(const s of Object.keys(t))e.on(s,t[s]);return function removeListeners(){for(const s of Object.keys(t)){e.removeListener(s,t[s])}}}function emitClose(e){e._state=m;e.emit("close")}function socketOnError(){this.destroy()}function abortHandshake(e,t,s,r){s=s||o.STATUS_CODES[t];r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(s),...r};e.once("finish",e.destroy);e.end(`HTTP/1.1 ${t} ${o.STATUS_CODES[t]}\r\n`+Object.keys(r).map((e=>`${e}: ${r[e]}`)).join("\r\n")+"\r\n\r\n"+s)}function abortHandshakeOrEmitwsClientError(e,t,s,r,o,n){if(e.listenerCount("wsClientError")){const r=new Error(o);Error.captureStackTrace(r,abortHandshakeOrEmitwsClientError);e.emit("wsClientError",r,s,t)}else{abortHandshake(s,r,o,n)}}},681:(e,t,s)=>{"use strict";const r=s(434);const o=s(692);const n=s(611);const i=s(278);const a=s(756);const{randomBytes:c,createHash:l}=s(982);const{Duplex:f,Readable:h}=s(203);const{URL:u}=s(16);const d=s(376);const p=s(893);const _=s(389);const{isBlob:g}=s(615);const{BINARY_TYPES:m,CLOSE_TIMEOUT:b,EMPTY_BUFFER:y,GUID:S,kForOnEventAttribute:k,kListener:w,kStatusCode:v,kWebSocket:E,NOOP:x}=s(791);const{EventTarget:{addEventListener:O,removeEventListener:T}}=s(634);const{format:C,parse:P}=s(335);const{toBuffer:W}=s(803);const $=Symbol("kAborted");const N=[8,13];const L=["CONNECTING","OPEN","CLOSING","CLOSED"];const H=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;class WebSocket extends r{constructor(e,t,s){super();this._binaryType=m[0];this._closeCode=1006;this._closeFrameReceived=false;this._closeFrameSent=false;this._closeMessage=y;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;if(e!==null){this._bufferedAmount=0;this._isServer=false;this._redirects=0;if(t===undefined){t=[]}else if(!Array.isArray(t)){if(typeof t==="object"&&t!==null){s=t;t=[]}else{t=[t]}}initAsClient(this,e,t,s)}else{this._autoPong=s.autoPong;this._closeTimeout=s.closeTimeout;this._isServer=true}}get binaryType(){return this._binaryType}set binaryType(e){if(!m.includes(e))return;this._binaryType=e;if(this._receiver)this._receiver._binaryType=e}get bufferedAmount(){if(!this._socket)return this._bufferedAmount;return this._socket._writableState.length+this._sender._bufferedBytes}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(e,t,s){const r=new p({allowSynchronousEvents:s.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:s.maxPayload,skipUTF8Validation:s.skipUTF8Validation});const o=new _(e,this._extensions,s.generateMask);this._receiver=r;this._sender=o;this._socket=e;r[E]=this;o[E]=this;e[E]=this;r.on("conclude",receiverOnConclude);r.on("drain",receiverOnDrain);r.on("error",receiverOnError);r.on("message",receiverOnMessage);r.on("ping",receiverOnPing);r.on("pong",receiverOnPong);o.onerror=senderOnError;if(e.setTimeout)e.setTimeout(0);if(e.setNoDelay)e.setNoDelay();if(t.length>0)e.unshift(t);e.on("close",socketOnClose);e.on("data",socketOnData);e.on("end",socketOnEnd);e.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}if(this._extensions[d.extensionName]){this._extensions[d.extensionName].cleanup()}this._receiver.removeAllListeners();this._readyState=WebSocket.CLOSED;this.emit("close",this._closeCode,this._closeMessage)}close(e,t){if(this.readyState===WebSocket.CLOSED)return;if(this.readyState===WebSocket.CONNECTING){const e="WebSocket was closed before the connection was established";abortHandshake(this,this._req,e);return}if(this.readyState===WebSocket.CLOSING){if(this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)){this._socket.end()}return}this._readyState=WebSocket.CLOSING;this._sender.close(e,t,!this._isServer,(e=>{if(e)return;this._closeFrameSent=true;if(this._closeFrameReceived||this._receiver._writableState.errorEmitted){this._socket.end()}}));setCloseTimer(this)}pause(){if(this.readyState===WebSocket.CONNECTING||this.readyState===WebSocket.CLOSED){return}this._paused=true;this._socket.pause()}ping(e,t,s){if(this.readyState===WebSocket.CONNECTING){throw new Error("WebSocket is not open: readyState 0 (CONNECTING)")}if(typeof e==="function"){s=e;e=t=undefined}else if(typeof t==="function"){s=t;t=undefined}if(typeof e==="number")e=e.toString();if(this.readyState!==WebSocket.OPEN){sendAfterClose(this,e,s);return}if(t===undefined)t=!this._isServer;this._sender.ping(e||y,t,s)}pong(e,t,s){if(this.readyState===WebSocket.CONNECTING){throw new Error("WebSocket is not open: readyState 0 (CONNECTING)")}if(typeof e==="function"){s=e;e=t=undefined}else if(typeof t==="function"){s=t;t=undefined}if(typeof e==="number")e=e.toString();if(this.readyState!==WebSocket.OPEN){sendAfterClose(this,e,s);return}if(t===undefined)t=!this._isServer;this._sender.pong(e||y,t,s)}resume(){if(this.readyState===WebSocket.CONNECTING||this.readyState===WebSocket.CLOSED){return}this._paused=false;if(!this._receiver._writableState.needDrain)this._socket.resume()}send(e,t,s){if(this.readyState===WebSocket.CONNECTING){throw new Error("WebSocket is not open: readyState 0 (CONNECTING)")}if(typeof t==="function"){s=t;t={}}if(typeof e==="number")e=e.toString();if(this.readyState!==WebSocket.OPEN){sendAfterClose(this,e,s);return}const r={binary:typeof e!=="string",mask:!this._isServer,compress:true,fin:true,...t};if(!this._extensions[d.extensionName]){r.compress=false}this._sender.send(e||y,r,s)}terminate(){if(this.readyState===WebSocket.CLOSED)return;if(this.readyState===WebSocket.CONNECTING){const e="WebSocket was closed before the connection was established";abortHandshake(this,this._req,e);return}if(this._socket){this._readyState=WebSocket.CLOSING;this._socket.destroy()}}}Object.defineProperty(WebSocket,"CONNECTING",{enumerable:true,value:L.indexOf("CONNECTING")});Object.defineProperty(WebSocket.prototype,"CONNECTING",{enumerable:true,value:L.indexOf("CONNECTING")});Object.defineProperty(WebSocket,"OPEN",{enumerable:true,value:L.indexOf("OPEN")});Object.defineProperty(WebSocket.prototype,"OPEN",{enumerable:true,value:L.indexOf("OPEN")});Object.defineProperty(WebSocket,"CLOSING",{enumerable:true,value:L.indexOf("CLOSING")});Object.defineProperty(WebSocket.prototype,"CLOSING",{enumerable:true,value:L.indexOf("CLOSING")});Object.defineProperty(WebSocket,"CLOSED",{enumerable:true,value:L.indexOf("CLOSED")});Object.defineProperty(WebSocket.prototype,"CLOSED",{enumerable:true,value:L.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach((e=>{Object.defineProperty(WebSocket.prototype,e,{enumerable:true})}));["open","error","close","message"].forEach((e=>{Object.defineProperty(WebSocket.prototype,`on${e}`,{enumerable:true,get(){for(const t of this.listeners(e)){if(t[k])return t[w]}return null},set(t){for(const t of this.listeners(e)){if(t[k]){this.removeListener(e,t);break}}if(typeof t!=="function")return;this.addEventListener(e,t,{[k]:true})}})}));WebSocket.prototype.addEventListener=O;WebSocket.prototype.removeEventListener=T;e.exports=WebSocket;function initAsClient(e,t,s,r){const i={allowSynchronousEvents:true,autoPong:true,closeTimeout:b,protocolVersion:N[1],maxPayload:100*1024*1024,skipUTF8Validation:false,perMessageDeflate:true,followRedirects:false,maxRedirects:10,...r,socketPath:undefined,hostname:undefined,protocol:undefined,timeout:undefined,method:"GET",host:undefined,path:undefined,port:undefined};e._autoPong=i.autoPong;e._closeTimeout=i.closeTimeout;if(!N.includes(i.protocolVersion)){throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} `+`(supported versions: ${N.join(", ")})`)}let a;if(t instanceof u){a=t}else{try{a=new u(t)}catch{throw new SyntaxError(`Invalid URL: ${t}`)}}if(a.protocol==="http:"){a.protocol="ws:"}else if(a.protocol==="https:"){a.protocol="wss:"}e._url=a.href;const f=a.protocol==="wss:";const h=a.protocol==="ws+unix:";let p;if(a.protocol!=="ws:"&&!f&&!h){p='The URL\'s protocol must be one of "ws:", "wss:", '+'"http:", "https:", or "ws+unix:"'}else if(h&&!a.pathname){p="The URL's pathname is empty"}else if(a.hash){p="The URL contains a fragment identifier"}if(p){const t=new SyntaxError(p);if(e._redirects===0){throw t}else{emitErrorAndClose(e,t);return}}const _=f?443:80;const g=c(16).toString("base64");const m=f?o.request:n.request;const y=new Set;let k;i.createConnection=i.createConnection||(f?tlsConnect:netConnect);i.defaultPort=i.defaultPort||_;i.port=a.port||_;i.host=a.hostname.startsWith("[")?a.hostname.slice(1,-1):a.hostname;i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":g,Connection:"Upgrade",Upgrade:"websocket"};i.path=a.pathname+a.search;i.timeout=i.handshakeTimeout;if(i.perMessageDeflate){k=new d({...i.perMessageDeflate,isServer:false,maxPayload:i.maxPayload});i.headers["Sec-WebSocket-Extensions"]=C({[d.extensionName]:k.offer()})}if(s.length){for(const e of s){if(typeof e!=="string"||!H.test(e)||y.has(e)){throw new SyntaxError("An invalid or duplicated subprotocol was specified")}y.add(e)}i.headers["Sec-WebSocket-Protocol"]=s.join(",")}if(i.origin){if(i.protocolVersion<13){i.headers["Sec-WebSocket-Origin"]=i.origin}else{i.headers.Origin=i.origin}}if(a.username||a.password){i.auth=`${a.username}:${a.password}`}if(h){const e=i.path.split(":");i.socketPath=e[0];i.path=e[1]}let w;if(i.followRedirects){if(e._redirects===0){e._originalIpc=h;e._originalSecure=f;e._originalHostOrSocketPath=h?i.socketPath:a.host;const t=r&&r.headers;r={...r,headers:{}};if(t){for(const[e,s]of Object.entries(t)){r.headers[e.toLowerCase()]=s}}}else if(e.listenerCount("redirect")===0){const t=h?e._originalIpc?i.socketPath===e._originalHostOrSocketPath:false:e._originalIpc?false:a.host===e._originalHostOrSocketPath;if(!t||e._originalSecure&&!f){delete i.headers.authorization;delete i.headers.cookie;if(!t)delete i.headers.host;i.auth=undefined}}if(i.auth&&!r.headers.authorization){r.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")}w=e._req=m(i);if(e._redirects){e.emit("redirect",e.url,w)}}else{w=e._req=m(i)}if(i.timeout){w.on("timeout",(()=>{abortHandshake(e,w,"Opening handshake has timed out")}))}w.on("error",(t=>{if(w===null||w[$])return;w=e._req=null;emitErrorAndClose(e,t)}));w.on("response",(o=>{const n=o.headers.location;const a=o.statusCode;if(n&&i.followRedirects&&a>=300&&a<400){if(++e._redirects>i.maxRedirects){abortHandshake(e,w,"Maximum redirects exceeded");return}w.abort();let o;try{o=new u(n,t)}catch(t){const s=new SyntaxError(`Invalid URL: ${n}`);emitErrorAndClose(e,s);return}initAsClient(e,o,s,r)}else if(!e.emit("unexpected-response",w,o)){abortHandshake(e,w,`Unexpected server response: ${o.statusCode}`)}}));w.on("upgrade",((t,s,r)=>{e.emit("upgrade",t);if(e.readyState!==WebSocket.CONNECTING)return;w=e._req=null;const o=t.headers.upgrade;if(o===undefined||o.toLowerCase()!=="websocket"){abortHandshake(e,s,"Invalid Upgrade header");return}const n=l("sha1").update(g+S).digest("base64");if(t.headers["sec-websocket-accept"]!==n){abortHandshake(e,s,"Invalid Sec-WebSocket-Accept header");return}const a=t.headers["sec-websocket-protocol"];let c;if(a!==undefined){if(!y.size){c="Server sent a subprotocol but none was requested"}else if(!y.has(a)){c="Server sent an invalid subprotocol"}}else if(y.size){c="Server sent no subprotocol"}if(c){abortHandshake(e,s,c);return}if(a)e._protocol=a;const f=t.headers["sec-websocket-extensions"];if(f!==undefined){if(!k){const t="Server sent a Sec-WebSocket-Extensions header but no extension "+"was requested";abortHandshake(e,s,t);return}let t;try{t=P(f)}catch(t){const r="Invalid Sec-WebSocket-Extensions header";abortHandshake(e,s,r);return}const r=Object.keys(t);if(r.length!==1||r[0]!==d.extensionName){const t="Server indicated an extension that was not requested";abortHandshake(e,s,t);return}try{k.accept(t[d.extensionName])}catch(t){const r="Invalid Sec-WebSocket-Extensions header";abortHandshake(e,s,r);return}e._extensions[d.extensionName]=k}e.setSocket(s,r,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxPayload:i.maxPayload,skipUTF8Validation:i.skipUTF8Validation})}));if(i.finishRequest){i.finishRequest(w,e)}else{w.end()}}function emitErrorAndClose(e,t){e._readyState=WebSocket.CLOSING;e._errorEmitted=true;e.emit("error",t);e.emitClose()}function netConnect(e){e.path=e.socketPath;return i.connect(e)}function tlsConnect(e){e.path=undefined;if(!e.servername&&e.servername!==""){e.servername=i.isIP(e.host)?"":e.host}return a.connect(e)}function abortHandshake(e,t,s){e._readyState=WebSocket.CLOSING;const r=new Error(s);Error.captureStackTrace(r,abortHandshake);if(t.setHeader){t[$]=true;t.abort();if(t.socket&&!t.socket.destroyed){t.socket.destroy()}process.nextTick(emitErrorAndClose,e,r)}else{t.destroy(r);t.once("error",e.emit.bind(e,"error"));t.once("close",e.emitClose.bind(e))}}function sendAfterClose(e,t,s){if(t){const s=g(t)?t.size:W(t).length;if(e._socket)e._sender._bufferedBytes+=s;else e._bufferedAmount+=s}if(s){const t=new Error(`WebSocket is not open: readyState ${e.readyState} `+`(${L[e.readyState]})`);process.nextTick(s,t)}}function receiverOnConclude(e,t){const s=this[E];s._closeFrameReceived=true;s._closeMessage=t;s._closeCode=e;if(s._socket[E]===undefined)return;s._socket.removeListener("data",socketOnData);process.nextTick(resume,s._socket);if(e===1005)s.close();else s.close(e,t)}function receiverOnDrain(){const e=this[E];if(!e.isPaused)e._socket.resume()}function receiverOnError(e){const t=this[E];if(t._socket[E]!==undefined){t._socket.removeListener("data",socketOnData);process.nextTick(resume,t._socket);t.close(e[v])}if(!t._errorEmitted){t._errorEmitted=true;t.emit("error",e)}}function receiverOnFinish(){this[E].emitClose()}function receiverOnMessage(e,t){this[E].emit("message",e,t)}function receiverOnPing(e){const t=this[E];if(t._autoPong)t.pong(e,!this._isServer,x);t.emit("ping",e)}function receiverOnPong(e){this[E].emit("pong",e)}function resume(e){e.resume()}function senderOnError(e){const t=this[E];if(t.readyState===WebSocket.CLOSED)return;if(t.readyState===WebSocket.OPEN){t._readyState=WebSocket.CLOSING;setCloseTimer(t)}this._socket.end();if(!t._errorEmitted){t._errorEmitted=true;t.emit("error",e)}}function setCloseTimer(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),e._closeTimeout)}function socketOnClose(){const e=this[E];this.removeListener("close",socketOnClose);this.removeListener("data",socketOnData);this.removeListener("end",socketOnEnd);e._readyState=WebSocket.CLOSING;if(!this._readableState.endEmitted&&!e._closeFrameReceived&&!e._receiver._writableState.errorEmitted&&this._readableState.length!==0){const t=this.read(this._readableState.length);e._receiver.write(t)}e._receiver.end();this[E]=undefined;clearTimeout(e._closeTimer);if(e._receiver._writableState.finished||e._receiver._writableState.errorEmitted){e.emitClose()}else{e._receiver.on("error",receiverOnFinish);e._receiver.on("finish",receiverOnFinish)}}function socketOnData(e){if(!this[E]._receiver.write(e)){this.pause()}}function socketOnEnd(){const e=this[E];e._readyState=WebSocket.CLOSING;e._receiver.end();this.end()}function socketOnError(){const e=this[E];this.removeListener("error",socketOnError);this.on("error",x);if(e){e._readyState=WebSocket.CLOSING;this.destroy()}}},828:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var o=Object.getOwnPropertyDescriptor(t,s);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,o)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s))t[t.length]=s;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s=ownKeys(e),n=0;n<s.length;n++)if(s[n]!=="default")r(t,e,s[n]);o(t,e);return t}}();Object.defineProperty(t,"__esModule",{value:true});t.getIp=getIp;t.getNowTime=getNowTime;t.validateHostdir=validateHostdir;t.getHostIP=getHostIP;t.getHostCFG=getHostCFG;t.getProxyHostCFG=getProxyHostCFG;t.initAsaiHost=initAsaiHost;const i=n(s(857));const a=s(6);const c=s(999);function getIp(){try{const e=i.networkInterfaces();for(const t of Object.keys(e)){const s=e[t];if(!s)continue;for(const e of s){if(e.family==="IPv4"&&e.address!=="127.0.0.1"&&!e.internal){return e.address}}}}catch(e){console.error("Get IP address error:",e)}return"127.0.0.1"}function getNowTime(e=0,t=null){try{t=t||new Date;const s=t.getFullYear();const r=String(t.getMonth()+1).padStart(2,"0");const o=String(t.getDate()).padStart(2,"0");const n=String(t.getHours()).padStart(2,"0");const i=String(t.getMinutes()).padStart(2,"0");const a=String(t.getSeconds()).padStart(2,"0");const c=String(t.getMilliseconds()).padStart(3,"0");switch(e){case 1:return`${n}:${i}:${a}`;case 2:return`${s}-${r}-${o}`;case 3:return`${n}:${i}:${a}.${c}`;case 4:return`${s}-${r}-${o} ${n}:${i}:${a}.${c}`;case 5:return`${n}-${i}-${a}-${c}`;default:return`${s}-${r}-${o} ${n}:${i}:${a}`}}catch(e){console.error("Date formatting error:",e);return"unknown-time"}}function validateHostdir(e){if(typeof e!=="string"||e.length===0||e.length>100||e==="default"||e==="asai"){return false}return/^[a-zA-Z0-9_-]+$/.test(e)}function getHostIP(e,t){if(e&&typeof e==="string"){return e}else if(t?.hostconfig?.ip==="asai"){return"localhost"}return t?.hostconfig?.ip||"127.0.0.1"}function getHostCFG(e,t){const s=t.hostconfig.hosts.default||{};const r=t.hostconfig.hosts[e]||{};return{...s,...r}}function getProxyHostCFG(e,t){const s=t.hostconfig.proxyhosts?.default||{};const r=t.hostconfig.proxyhosts?.[e]||{};const o={...s,...r};if(!o.url&&o.port){o.url=(o.httptype||"http://")+getHostIP(o.ip,t)+":"+o.port}return o}function initAsaiHost(e,t){if(!e.hostconfig?.ip){e.hostconfig.ip=getIp()}e.setAppend=(t,s)=>(0,c.setAppend)(e,t,s);e.getHost=t=>getHostCFG(t,e);e.getHostIP=t=>getHostIP(t,e);(0,a.initProcess)(e);(0,c.initLog)(e);e.hostconfig.asaiport=[];e.hostconfig.guardtm=null;if(e.hostconfig?.aes?.lv&&!e.$lib?.aesfns){const{reqAES:t,resAES:s}=e.$lib.AsAES(e);e.$lib.aesfns={allaes:e.hostconfig.aes.lv>1,reqAES:t,resAES:s}}}},867:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var o=Object.getOwnPropertyDescriptor(t,s);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,o)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s))t[t.length]=s;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s=ownKeys(e),n=0;n<s.length;n++)if(s[n]!=="default")r(t,e,s[n]);o(t,e);return t}}();Object.defineProperty(t,"__esModule",{value:true});t.getHTTPServer=getHTTPServer;t.getHttpUserinfo=getHttpUserinfo;t.checkHttpHeader=checkHttpHeader;t.startHTTPServer=startHTTPServer;t.asaiGuard=asaiGuard;const i=n(s(611));const a=n(s(692));const c=n(s(896));const l=n(s(928));const f=s(828);const h=s(785);const u=s(798);function getHTTPServer(e="",t,s){try{if(e.startsWith("https")){a.AsCreateServer=e=>a.createServer(t?.httpscert||s.hostconfig.httpscert,e);return a}else{i.AsCreateServer=i.createServer;return i}}catch(e){s.$log("HTTP","Http server error:",JSON.stringify(e));i.AsCreateServer=i.createServer;return i}}function getHttpUserinfo(e,t){try{const s=e.rawHeaders;const r={};for(let e=0;e<s.length;e+=2){r[s[e].toLowerCase()]=s[e+1]}const o=r["userinfo"]?.split("##");return(0,u.deUserInfoWithAsai)(o,t)}catch(e){}return""}function checkHttpHeader(e,t){e.Userinfo=getHttpUserinfo(e,t);return true}function startHTTPServer(e,t){const s=(0,f.getHostCFG)(t,e);if(!s||s.close)return;try{if(!e.servershttp[t]){if(s.mimetypes){s.mimetypes={...e.hostconfig.mimetypes||{},...s.mimetypes}}const r=getHTTPServer(s.httptype,s,e);const o=!!(s.weburls?.rewrite&&s.weburls?.webdir&&s.weburls?.keys?.length);const n=[s.weburls?.webdir||"",...s.hostdirs||[]].filter((e=>e));const i=r.AsCreateServer(((r,i)=>{try{if(!checkHttpHeader(r,e)){e.$log("HTTP",r.method,r.url);i.writeHead(502,{"Content-Type":"text/plain; charset=utf-8"});i.end("502");return}if(r.url?.startsWith("/sys")){e.$log("SYS",r.method,r.url);sysWork(r,i,t)}else if(r.url?.startsWith("/api")){e.$log("API",r.method,r.url);apiWork(r,i,t)}else if(r.url?.startsWith("/jsonp")){e.$log("JSONP",r.method,r.url);jsonpWork(r,i,t)}else if(n.length>0){e.$log("REQ_OTHER",r.method,r.url);i.setHeader("Cross-Origin-Resource-Policy","cross-origin");i.setHeader("Cross-Origin-Opener-Policy","cross-origin");const checkWebUrls=e=>{if(o&&e){return s.weburls?.keys?.some((t=>e.startsWith(t)))??false}return false};const showHostDirs=(t,r,n=0)=>{const a=parseUrlPath(r);const findValidFile=(t,s)=>{for(const r of t){let t="./"+r+s;if(s.endsWith("/")){t+=e.hostconfig.index||"index.html"}if(e.hostconfig?.pkg?.type===1){const e=l.join(__dirname,t);if(checkFileExists(e)){return e}}const o=l.normalize(t);if(o.includes(".."))continue;if(checkFileExists(o)){return o}}return null};const f=a.endsWith("/")?a+(e.hostconfig.index||"index.html"):a;const h=findValidFile(t,f);if(!h){if(n>0||!o){i.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"});i.end("File not found!");return}else{const t=[s.weburls.webdir];const r=(e.hostconfig?.pkg?.type===1?"":"/")+(e.hostconfig.index||"index.html");showHostDirs(t,r,n+1);return}}let u;try{u=c.statSync(h)}catch(t){e.$log("FILE","File stat error:",t);if(!i.headersSent){i.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"});i.end("Internal Server Error")}else{i.destroy()}return}const d=s.mimetypes?.[l.extname(h)]||"application/octet-stream";const p=c.createReadStream(h);p.once("open",(()=>{i.writeHead(200,{"Content-Type":d,"Content-Length":u.size,"Cache-Control":"public, max-age=3600"});p.pipe(i)}));p.once("error",(t=>{e.$log("STREAM","Stream error:",t);if(!i.headersSent){i.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"});i.end("Internal Server Error")}else{i.destroy()}}));i.once("close",(()=>{if(!p.destroyed){p.destroy()}}))};if(checkWebUrls(r.url)){showHostDirs([s.weburls.webdir],"/"+(e.hostconfig.index||"index.html"))}else{showHostDirs(n,r.url)}}else{e.$log("HTTP",r.method,r.url);i.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"});i.end("404")}}catch(t){e.$log("HTTP","HTTP request error:",t);if(!i.headersSent){i.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"})}i.end("Internal server error")}}));e.servershttp[t]=i;if(s.ws){(0,h.createWSHost)(e,t)}i.on("error",(t=>{e.hostconfig.asaiport.push(s.port);asaiGuard(e);if(t.code==="EADDRINUSE"){e.$log("HTTP",`Port ${s.port} is already start!`)}else{e.$log("HTTP","Server error:",t)}}));if(e.hostconfig.ip==="asai"||!s.ip&&!e.hostconfig.ip){i.listen(s.port,(()=>{console.log(`[${t}] Start At ${(0,f.getNowTime)()}.`);if(s.ws){console.log(`WS Server ${s.wstype||"ws://"}localhost:${s.port}`)}console.log(`HTTP Server ${s.httptype}localhost:${s.port}`);console.log(`================================================`)}))}else{const r=(0,f.getHostIP)(s.ip,e);i.listen(s.port,r,(()=>{console.log(`[${t}] Start At ${(0,f.getNowTime)()}.`);if(s.ws){console.log(`WS Server ${s.wstype||"ws://"}${r}:${s.port}`)}console.log(`HTTP Server ${s.httptype}${r}:${s.port}`);console.log(`================================================`)}))}if(s.ckhttp){const r=s.maxhttp||100;const o=setInterval((()=>{const s=e.connectionshttp[t]?.size||0;if(s>r*.8){e.$log("HTTP",`HTTP Connection HIGH (${s}/${r})`)}if(s>r*.95){e.$log("HTTP","HTTP Connection CRITICAL! Forcing cleanup");if(e.connectionshttp[t]){e.connectionshttp[t].forEach((e=>{if(e._idleTime&&Date.now()-e._idleTime>3e5){e.destroy()}}))}}}),18e5);if(!e.tasksws[t])e.tasksws[t]={};e.tasksws[t].httpMonitor=o;i.on("connection",(s=>{if(!e.connectionshttp[t]){e.connectionshttp[t]=new Set}const o=e.connectionshttp[t].size;if(o>=r){try{e.$log("HTTP",`HTTP Connection MAX rejected (${o}/${r})`);s.destroy()}catch(t){e.$log("HTTP","Close connection error:",t)}return}e.connectionshttp[t].add(s);s.on("close",(()=>{e.connectionshttp[t].delete(s)}));s.setTimeout(3e5)}))}}}catch(t){e.$log("HTTP","Http server error:",JSON.stringify(t))}return e.servershttp[t]}function asaiGuard(e){if(e.hostconfig.asaiport.includes(e.hostconfig.hosts.asai.port)){process.exit(1)}else{if(e.hostconfig.guardtm){clearTimeout(e.hostconfig.guardtm);e.hostconfig.guardtm=null}e.hostconfig.guardtm=setTimeout((()=>{startHTTPServer(e,"asai");if(e.hostconfig.guardtm){clearTimeout(e.hostconfig.guardtm);e.hostconfig.guardtm=null}}),e.hostconfig.tm?.d||2e3)}}function parseUrlPath(e){try{if(!e)return"/";const t=e.startsWith("http")?undefined:"http://localhost";return new URL(e,t).pathname}catch{return e}}function checkFileExists(e){try{const t=c.statSync(e);return t.isFile()&&!!(t.mode&c.constants.R_OK)}catch{return false}}},407:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var o=Object.getOwnPropertyDescriptor(t,s);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,o)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s))t[t.length]=s;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s=ownKeys(e),n=0;n<s.length;n++)if(s[n]!=="default")r(t,e,s[n]);o(t,e);return t}}();const i=n(s(354));const a=s(828);const c=s(867);const l=s(471);e.exports=function(e,t){const{sysWork:s,apiWork:r,wsWork:o,jsonpWork:n}=t;global.sysWork=s;global.apiWork=r;global.wsWork=o;global.jsonpWork=n;function StartAsaiHost(){(0,a.initAsaiHost)(e,t);console.log(`※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※`);if(e.hostconfig?.hosts){e.startHTTPServer=t=>(0,c.startHTTPServer)(e,t);Object.keys(e.hostconfig.hosts).forEach((t=>{if((0,a.validateHostdir)(t)){(0,c.startHTTPServer)(e,t)}}))}if(e.hostconfig?.proxyhosts){Object.keys(e.hostconfig.proxyhosts).forEach((t=>{if((0,a.validateHostdir)(t)){(0,l.startProxyServer)(e,t)}}))}}return{StartAsaiHost:StartAsaiHost,asaiWs:i}}},999:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setAppend=setAppend;t.setLog=setLog;t.initLog=initLog;const r=s(828);const o=new Map;class LogBuffer{constructor(e,t){this.$asai=e;this.filePath=t;this.buffer=[];this.timer=null;this.flushInterval=100;this.maxBufferSize=100}add(e){this.buffer.push(e);if(this.buffer.length>=this.maxBufferSize){this.flush()}else if(!this.timer){this.timer=setTimeout((()=>this.flush()),this.flushInterval)}}flush(){if(this.timer){clearTimeout(this.timer);this.timer=null}if(this.buffer.length===0)return;const e=this.buffer.join("");this.buffer=[];this.$asai.asaifs.append(this.filePath,e).catch((e=>console.error("Log write error:",e)))}destroy(){if(this.timer){clearTimeout(this.timer);this.timer=null}this.flush()}}function saveLog(e,t,s){return new Promise(((r,n)=>{try{const n=`${e.id||"default"}_${t}`;let i=o.get(n);if(!i){i=new LogBuffer(e,t);o.set(n,i)}i.add(s);r()}catch(e){console.error(e);n(e)}}))}function newLoggerFile(e,t,s){return`#Software: ${e.hostconfig.website?.title};\n#Version: ${e.hostconfig.website?.ver};\n#Date: ${(0,r.getNowTime)(4,t)};\n#Fields: [time]; type; message;\n${s}`}async function setAppend(e,t,s){try{await e.asaifs.ensureFile(t);const o=await e.asaifs.stat(t);const n=new Date;if(o.size>=(e.hostconfig.logger?.path?.maxsize||1048576)){const s=t.lastIndexOf(".");const o=t.substring(0,s);const i=t.substring(s);await e.asaifs.rename(t,o+"-"+(0,r.getNowTime)(5,n)+i)}await saveLog(e,t,s)}catch(e){console.error(e)}return}function setLog(e,t,s){return new Promise(((r,o)=>{try{setAppend(e,t,s).then(r).catch(o)}catch(e){console.error(e);o(e)}}))}function initLog(e){function clog(e,...t){if(e.hostconfig.logger?.lv?.view){console.log(...t)}}async function xlog(...t){clog(e,...t)}async function llog(...t){const s=new Date;let o="";const n=t[0];if(n===1){if(e.hostconfig.logger?.path?.client){o=`[${(0,r.getNowTime)(3,s)}]\n`;o+=t?.slice(1)?.map((e=>typeof e==="object"?JSON.stringify(e):e)).join("\n");o+="\n";clog(e,o);await setLog(e,e.hostconfig.logger?.path?.client+`log-${(0,r.getNowTime)(2,s)}.txt`,o)}}else{t.unshift(`[${(0,r.getNowTime)(3,s)}]`);if(typeof n==="number"&&n>666){}else{if(e.hostconfig.logger?.path?.server){o=t?.map((e=>typeof e==="object"?JSON.stringify(e):e)).join("; ").replace(/\n/g," ").replace(/\r/g," ");clog(e,o);o+="\n";await setLog(e,e.hostconfig.logger?.path?.server+`log-${(0,r.getNowTime)(2)}.txt`,o)}}}}if(e&&typeof e==="object"&&e.hostconfig.logger?.lv?.record){e.$log=llog}else{e.$log=xlog}}},6:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.initProcess=initProcess;t.gracefulShutdown=gracefulShutdown;function initProcess(e,t){const s=10;const r=6e4;const o=[];process.on("unhandledRejection",((t,s)=>{const r=(new Error).stack;let o="";if(s&&typeof s==="object"){o=s.constructor?.name||"Promise";const e=r?.split("\n")||[];const t=e.slice(3,6).join(" | ");o+=` Created at: ${t}`}let n="";if(t instanceof Error){n=`\n${t.name}: ${t.message}`;if(t.stack)n+=`\n【Stack】${t.stack}`}else if(typeof t==="object"&&t!==null){try{n=JSON.stringify(t,null,2).substring(0,500)}catch{n=String(t)}}else{n=String(t)}const i=`Unhandled Promise Rejection:\n【Reason】 ${n}\n【Promise】${o}`;e.$log("UNHANDLED_REJECTION",i)}));process.on("uncaughtException",(n=>{const i=`Uncaught Exception: ${JSON.stringify(n)}`;e.$log("UNCAUGHT_EXCEPTIONS",i);const a=Date.now();o.push(a);while(o.length>0&&o[0]<a-r){o.shift()}if(o.length>s){e.$log("NO_RESTART","Process crashed too frequently, not restarting.");e.$log("SHUTDOWN","Error:",n?.message||n);process.exit(1)}if(t&&typeof t==="function"){try{t(n)}catch(e){console.error("Error in process error callback:",e)}}}));process.on("SIGTERM",(()=>{e.$log("SIGTERM","SIGTERM,CLOSING...");gracefulShutdown(e)}));process.on("SIGINT",(()=>{e.$log("SIGINT","SIGINT,CLOSING...");gracefulShutdown(e)}))}function gracefulShutdown(e){const t=6e4;let s;const r=Date.now();s=setTimeout((()=>{e.$log("SHUTDOWN",`Timeout! Exiting after ${Date.now()-r}ms`);process.exit(1)}),t);try{Object.values(e.servershttp||{}).forEach((t=>{if(t&&typeof t.close==="function"){t.close((t=>{if(t)e.$log("HTTP","HTTP server close error:",t)}))}}));Object.values(e.serversws||{}).forEach((t=>{if(t&&typeof t.close==="function"){t.close((t=>{if(t)e.$log("WS","WS server close error:",t)}))}}));if(e.hostconfig.guardtm){clearTimeout(e.hostconfig.guardtm);e.hostconfig.guardtm=null}Object.keys(e.tasksws||{}).forEach((t=>{if(e.tasksws[t].httpMonitor){clearInterval(e.tasksws[t].httpMonitor);delete e.tasksws[t].httpMonitor}}));setTimeout((()=>{clearTimeout(s);e.$log("SHUTDOWN",`Web Server Closed (${Date.now()-r}ms)`);process.exit(0)}),3e3)}catch(t){e.$log("SHUTDOWN","Graceful shutdown error:",t);clearTimeout(s);process.exit(1)}}},471:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.startProxyServer=startProxyServer;const r=s(828);const o=s(867);function startProxyServer(e,t){const s=(0,r.getProxyHostCFG)(t,e);if(!s.url)return;try{const n=(0,o.getHTTPServer)(s.proxyhttptype,s,e);const i=n.AsCreateServer(((t,r)=>{if(s.redirect){r.writeHead(301,{Location:s.url+t.url,"Strict-Transport-Security":"max-age=31536000"});r.end();return}const n=new URL(s.url+t.url);const i=n.protocol==="https:";const a=(0,o.getHTTPServer)(s.url,s,e);const c={keepAlive:s.keepAlive??true,timeout:s.timeout??6e4,keepAliveMsecs:s.keepAliveMsecs??3e4,maxSockets:s.maxSockets??1e3,maxFreeSockets:s.maxFreeSockets??100,rejectUnauthorized:s.rejectUnauthorized??false,secureProtocol:s.secureProtocol??"TLS_method"};const l=new a.Agent(c);const f={agent:l,method:t.method,hostname:n.hostname,port:n.port||(i?443:80),path:n.pathname+n.search,headers:t.headers};if(i){f.servername=n.hostname}const h=a.request(f,(s=>{Object.keys(s.headers).forEach((e=>{const t=["transfer-encoding","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailers","upgrade"];if(!t.includes(e.toLowerCase())){r.setHeader(e,s.headers[e])}}));r.statusCode=s.statusCode;const n=(0,o.getHttpUserinfo)(t,e);if(n)r.setHeader("Userinfo",Array.isArray(n)?n.join("##"):n);s.pipe(r,{end:true})}));t.pipe(h,{end:true});t.on("error",(t=>{e.$log("PROXY","Client request error:",t);h.destroy()}));h.on("error",(t=>{e.$log("PROXY","Forward request error:",t);e.$log("PROXY",`Target: ${n.href}, HTTPS: ${i}`);if(!r.headersSent){r.writeHead(502,{"Content-Type":"text/plain; charset=utf-8"})}r.end("Bad Gateway: "+t.message)}));h.setTimeout(12e4,(()=>{e.$log("PROXY","Forward request timeout");h.destroy();if(!r.headersSent){r.writeHead(504,{"Content-Type":"text/plain; charset=utf-8"})}r.end("Gateway Timeout")}))}));i.on("error",(t=>{if(t.code==="EADDRINUSE"){e.$log("PROXY",`Port ${s.proxyport} is already start!`)}else{e.$log("PROXY","Proxy server error:",t)}}));const a=(0,r.getHostIP)(s.proxyip,e);const listenCallback=()=>{console.log(`[${t}] Start At ${(0,r.getNowTime)()}.`);console.log(`Proxy Server ${s.proxyhttptype}${a||"localhost"}:${s.proxyport}`);console.log(`Target Server ${s.url}`);console.log(`================================================`)};if(a){i.listen(s.proxyport,a,listenCallback)}else{i.listen(s.proxyport,listenCallback)}}catch(t){e.$log("PROXY","Proxy server error:",JSON.stringify(t))}}},798:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.deUserInfoWithAsai=deUserInfoWithAsai;t.deUserInfo=deUserInfo;function deUserInfoWithAsai(e,t){if(!Array.isArray(e)||e.length<3){return e}if(e[2]){try{e[2]=t.$lib.AsCode.asdecode(e[2],t.hostconfig.asaisn);e[0]=t.$lib.AsCode.asdecode(e[0],e[2]);e[1]=t.$lib.AsCode.asdecode(e[1],e[2])}catch(e){t.$log("USER","User info decode error:",e)}}return e}function deUserInfo(e){return e}},785:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.getWsUserinfo=getWsUserinfo;t.clearWsServerTasks=clearWsServerTasks;t.createWSHost=createWSHost;const r=s(354);const o=s(828);const n=s(798);function getWsUserinfo(e,t){try{const s=e.rawHeaders;const r={};for(let e=0;e<s.length;e+=2){r[s[e].toLowerCase()]=s[e+1]}const o=r["sec-websocket-protocol"]?.split("##");return(0,n.deUserInfoWithAsai)(o,t)}catch{}return null}function clearWsServerTasks(e,t){const s=e.tasksws[t];if(s&&typeof s==="object"){Object.values(s).forEach((e=>{if(e)clearInterval(e)}));e.tasksws[t]={}}}function resWsMsg(e,t){if(e==="ping"||e==="pong"){return e}else if(typeof e==="object"){if((e?.aes||t.$lib.aesfns?.allaes)&&e?.db&&t.$lib?.aesfns?.resAES){e.db=t.$lib.aesfns.resAES(e.db)}return JSON.stringify(e)}return e}function createWSHost(e,t){const s=(0,o.getHostCFG)(t,e);try{if(!e.serversws[t]){if(s.ckws&&!e.connectionsws[t]){e.connectionsws[t]={}}if(!e.tasksws[t]){e.tasksws[t]={}}const o=new r.WebSocketServer({server:e.servershttp[t],perMessageDeflate:false});o.sendws=(t,s,n)=>{const i=resWsMsg(t,e);if(s){o.clients.forEach((e=>{if((s===2||e!==n)&&e.readyState===r.WebSocket.OPEN){e.send(i)}}))}else{n.send(i)}};o.broadws=t=>{const s=resWsMsg(t,e);o.clients.forEach((e=>{if(e&&e.readyState===r.WebSocket.OPEN){e.send(s)}}))};o.on("error",(s=>{clearWsServerTasks(e,t);e.$log("WS","WS Server error!",s);if(typeof o.close==="function"){o.close((()=>{e.$log("WS","WS Server closed");delete e.serversws[t]}))}}));o.on("close",((s,r)=>{try{e.$log("WS",`WebSocket closed, server ${t}, code: ${s}, reason: ${r?.toString()}`);clearWsServerTasks(e,t)}catch(t){e.$log("WS","WS close handler error:",t)}}));o.on("connection",((r,o)=>{const n=s.maxws||100;const i=e.connectionsws[t]||{};const a=Object.keys(i).length;if(a>=n){e.$log("WS",`WS Connection MAX rejected (${a}/${n})`);r.send(JSON.stringify({ty:"publish/web",db:{exit:1,type:"err",lang:"maxws",langpm:`${n}`,con:`max ${n} clients online!`}}));r.close(1013,"Server busy");return}o.Userinfo=getWsUserinfo(o,e)||[];r.Userinfo=o.Userinfo;let c=true;if(s.ckws){c=isOkWs(e,t,r,o)}if(c){loginWs(e,t,r,o)}else{r.close()}}));e.serversws[t]=o}}catch(t){e.$log("WS","ws server:",JSON.stringify(t))}}function isOkWs(e,t,s,r){const n=(0,o.getHostCFG)(t,e);const[i,a,c]=s.Userinfo||[];if(!i){s.send(JSON.stringify({ty:"publish/web",db:{exit:1,type:"err",lang:"nousername",con:"no username!"}}));return false}if(i==="asai"){}else if(e.connectionsws[t]?.[i]){const r=e.connectionsws[t][i];const o={ty:"publish/web",db:{exit:1,type:"err",lang:"logged",langpm:`${i}`,con:`${i} logged in!`}};checkWsIsOn(e,r);if(r?.Userinfo?.[2]===c){o.db.lang="loggedsametk";s.send(JSON.stringify(o));r.send(JSON.stringify(o));r.close()}else{s.send(JSON.stringify(o))}return false}else{const r=e.connectionsws[t]||{};const o=Object.values(r).find((e=>e.Userinfo?.[2]===c));const a=n.maxonline||100;if(o){const e={ty:"publish/web",db:{exit:1,type:"err",lang:"loggedsametk",langpm:`${i}(${o.Userinfo[0]})`,con:`${i}(${o.Userinfo[0]}) logged in!`}};s.send(JSON.stringify(e));o.send(JSON.stringify(e));o.close();return false}else if(Object.keys(r).length>=a){s.send(JSON.stringify({ty:"publish/web",db:{exit:1,type:"err",lang:"maxlogged",langpm:`${a}`,con:`max ${a} users online!`}}));return false}}return true}function checkWsIsOn(e,t){if(!t)return;try{t.send(JSON.stringify({ty:"publish/web",db:"pong"}));let s=setTimeout((()=>{if(typeof t.terminate==="function")t.terminate();if(typeof t.close==="function")t.close()}),e?.hostconfig?.tm?.d||3e3);if(typeof t.once==="function"){t.once("message",(()=>{if(s){clearTimeout(s);s=null}}))}}catch{}}function loginWs(e,t,s,n){const[i]=s.Userinfo||[];const a=(0,o.getHostCFG)(t,e);if(a.ckws&&i){if(!s.tasksws)s.tasksws={};e.connectionsws[t][i]=s}s.on("message",(r=>{e.$log("WS","message",r.toString());wsWork(r,s,t,n)}));s.on("close",(()=>{if(a.ckws){if(s.tasksws){Object.values(s.tasksws).forEach((e=>e&&clearInterval(e)));s.tasksws=undefined}if(i&&e.connectionsws[t]?.[i]){delete e.connectionsws[t][i]}}if(s.readyState!==r.WebSocket.CLOSED&&s.readyState!==r.WebSocket.CLOSING){s.close()}}))}},327:module=>{module.exports=eval("require")("bufferutil")},414:module=>{module.exports=eval("require")("utf-8-validate")},181:e=>{"use strict";e.exports=require("buffer")},982:e=>{"use strict";e.exports=require("crypto")},434:e=>{"use strict";e.exports=require("events")},896:e=>{"use strict";e.exports=require("fs")},611:e=>{"use strict";e.exports=require("http")},692:e=>{"use strict";e.exports=require("https")},278:e=>{"use strict";e.exports=require("net")},857:e=>{"use strict";e.exports=require("os")},928:e=>{"use strict";e.exports=require("path")},203:e=>{"use strict";e.exports=require("stream")},756:e=>{"use strict";e.exports=require("tls")},16:e=>{"use strict";e.exports=require("url")},106:e=>{"use strict";e.exports=require("zlib")}};var __webpack_module_cache__={};function __nccwpck_require__(e){var t=__webpack_module_cache__[e];if(t!==undefined){return t.exports}var s=__webpack_module_cache__[e]={exports:{}};var r=true;try{__webpack_modules__[e].call(s.exports,s,s.exports,__nccwpck_require__);r=false}finally{if(r)delete __webpack_module_cache__[e]}return s.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var __webpack_exports__=__nccwpck_require__(546);module.exports=__webpack_exports__})();
1
+ (()=>{var __webpack_modules__={546:(e,t,s)=>{var r=s(407)["default"];e.exports=function(e,t){var s=r(e,t),o=s.StartAsaiHost,n=s.asaiWs;return{StartAsaiHost:o,asaiWs:n}}},354:(e,t,s)=>{"use strict";const r=s(412);const o=s(335);const n=s(376);const i=s(893);const a=s(389);const c=s(332);const l=s(681);const f=s(129);l.createWebSocketStream=r;l.extension=o;l.PerMessageDeflate=n;l.Receiver=i;l.Sender=a;l.Server=f;l.subprotocol=c;l.WebSocket=l;l.WebSocketServer=f;e.exports=l},803:(e,t,s)=>{"use strict";const{EMPTY_BUFFER:r}=s(791);const o=Buffer[Symbol.species];function concat(e,t){if(e.length===0)return r;if(e.length===1)return e[0];const s=Buffer.allocUnsafe(t);let n=0;for(let t=0;t<e.length;t++){const r=e[t];s.set(r,n);n+=r.length}if(n<t){return new o(s.buffer,s.byteOffset,n)}return s}function _mask(e,t,s,r,o){for(let n=0;n<o;n++){s[r+n]=e[n]^t[n&3]}}function _unmask(e,t){for(let s=0;s<e.length;s++){e[s]^=t[s&3]}}function toArrayBuffer(e){if(e.length===e.buffer.byteLength){return e.buffer}return e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}function toBuffer(e){toBuffer.readOnly=true;if(Buffer.isBuffer(e))return e;let t;if(e instanceof ArrayBuffer){t=new o(e)}else if(ArrayBuffer.isView(e)){t=new o(e.buffer,e.byteOffset,e.byteLength)}else{t=Buffer.from(e);toBuffer.readOnly=false}return t}e.exports={concat:concat,mask:_mask,toArrayBuffer:toArrayBuffer,toBuffer:toBuffer,unmask:_unmask};if(!process.env.WS_NO_BUFFER_UTIL){try{const t=s(327);e.exports.mask=function(e,s,r,o,n){if(n<48)_mask(e,s,r,o,n);else t.mask(e,s,r,o,n)};e.exports.unmask=function(e,s){if(e.length<32)_unmask(e,s);else t.unmask(e,s)}}catch(e){}}},791:e=>{"use strict";const t=["nodebuffer","arraybuffer","fragments"];const s=typeof Blob!=="undefined";if(s)t.push("blob");e.exports={BINARY_TYPES:t,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:s,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}},634:(e,t,s)=>{"use strict";const{kForOnEventAttribute:r,kListener:o}=s(791);const n=Symbol("kCode");const i=Symbol("kData");const a=Symbol("kError");const c=Symbol("kMessage");const l=Symbol("kReason");const f=Symbol("kTarget");const h=Symbol("kType");const u=Symbol("kWasClean");class Event{constructor(e){this[f]=null;this[h]=e}get target(){return this[f]}get type(){return this[h]}}Object.defineProperty(Event.prototype,"target",{enumerable:true});Object.defineProperty(Event.prototype,"type",{enumerable:true});class CloseEvent extends Event{constructor(e,t={}){super(e);this[n]=t.code===undefined?0:t.code;this[l]=t.reason===undefined?"":t.reason;this[u]=t.wasClean===undefined?false:t.wasClean}get code(){return this[n]}get reason(){return this[l]}get wasClean(){return this[u]}}Object.defineProperty(CloseEvent.prototype,"code",{enumerable:true});Object.defineProperty(CloseEvent.prototype,"reason",{enumerable:true});Object.defineProperty(CloseEvent.prototype,"wasClean",{enumerable:true});class ErrorEvent extends Event{constructor(e,t={}){super(e);this[a]=t.error===undefined?null:t.error;this[c]=t.message===undefined?"":t.message}get error(){return this[a]}get message(){return this[c]}}Object.defineProperty(ErrorEvent.prototype,"error",{enumerable:true});Object.defineProperty(ErrorEvent.prototype,"message",{enumerable:true});class MessageEvent extends Event{constructor(e,t={}){super(e);this[i]=t.data===undefined?null:t.data}get data(){return this[i]}}Object.defineProperty(MessageEvent.prototype,"data",{enumerable:true});const d={addEventListener(e,t,s={}){for(const n of this.listeners(e)){if(!s[r]&&n[o]===t&&!n[r]){return}}let n;if(e==="message"){n=function onMessage(e,s){const r=new MessageEvent("message",{data:s?e:e.toString()});r[f]=this;callListener(t,this,r)}}else if(e==="close"){n=function onClose(e,s){const r=new CloseEvent("close",{code:e,reason:s.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[f]=this;callListener(t,this,r)}}else if(e==="error"){n=function onError(e){const s=new ErrorEvent("error",{error:e,message:e.message});s[f]=this;callListener(t,this,s)}}else if(e==="open"){n=function onOpen(){const e=new Event("open");e[f]=this;callListener(t,this,e)}}else{return}n[r]=!!s[r];n[o]=t;if(s.once){this.once(e,n)}else{this.on(e,n)}},removeEventListener(e,t){for(const s of this.listeners(e)){if(s[o]===t&&!s[r]){this.removeListener(e,s);break}}}};e.exports={CloseEvent:CloseEvent,ErrorEvent:ErrorEvent,Event:Event,EventTarget:d,MessageEvent:MessageEvent};function callListener(e,t,s){if(typeof e==="object"&&e.handleEvent){e.handleEvent.call(e,s)}else{e.call(t,s)}}},335:(e,t,s)=>{"use strict";const{tokenChars:r}=s(615);function push(e,t,s){if(e[t]===undefined)e[t]=[s];else e[t].push(s)}function parse(e){const t=Object.create(null);let s=Object.create(null);let o=false;let n=false;let i=false;let a;let c;let l=-1;let f=-1;let h=-1;let u=0;for(;u<e.length;u++){f=e.charCodeAt(u);if(a===undefined){if(h===-1&&r[f]===1){if(l===-1)l=u}else if(u!==0&&(f===32||f===9)){if(h===-1&&l!==-1)h=u}else if(f===59||f===44){if(l===-1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(h===-1)h=u;const r=e.slice(l,h);if(f===44){push(t,r,s);s=Object.create(null)}else{a=r}l=h=-1}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}else if(c===undefined){if(h===-1&&r[f]===1){if(l===-1)l=u}else if(f===32||f===9){if(h===-1&&l!==-1)h=u}else if(f===59||f===44){if(l===-1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(h===-1)h=u;push(s,e.slice(l,h),true);if(f===44){push(t,a,s);s=Object.create(null);a=undefined}l=h=-1}else if(f===61&&l!==-1&&h===-1){c=e.slice(l,u);l=h=-1}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}else{if(n){if(r[f]!==1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(l===-1)l=u;else if(!o)o=true;n=false}else if(i){if(r[f]===1){if(l===-1)l=u}else if(f===34&&l!==-1){i=false;h=u}else if(f===92){n=true}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}else if(f===34&&e.charCodeAt(u-1)===61){i=true}else if(h===-1&&r[f]===1){if(l===-1)l=u}else if(l!==-1&&(f===32||f===9)){if(h===-1)h=u}else if(f===59||f===44){if(l===-1){throw new SyntaxError(`Unexpected character at index ${u}`)}if(h===-1)h=u;let r=e.slice(l,h);if(o){r=r.replace(/\\/g,"");o=false}push(s,c,r);if(f===44){push(t,a,s);s=Object.create(null);a=undefined}c=undefined;l=h=-1}else{throw new SyntaxError(`Unexpected character at index ${u}`)}}}if(l===-1||i||f===32||f===9){throw new SyntaxError("Unexpected end of input")}if(h===-1)h=u;const d=e.slice(l,h);if(a===undefined){push(t,d,s)}else{if(c===undefined){push(s,d,true)}else if(o){push(s,c,d.replace(/\\/g,""))}else{push(s,c,d)}push(t,a,s)}return t}function format(e){return Object.keys(e).map((t=>{let s=e[t];if(!Array.isArray(s))s=[s];return s.map((e=>[t].concat(Object.keys(e).map((t=>{let s=e[t];if(!Array.isArray(s))s=[s];return s.map((e=>e===true?t:`${t}=${e}`)).join("; ")}))).join("; "))).join(", ")})).join(", ")}e.exports={format:format,parse:parse}},958:e=>{"use strict";const t=Symbol("kDone");const s=Symbol("kRun");class Limiter{constructor(e){this[t]=()=>{this.pending--;this[s]()};this.concurrency=e||Infinity;this.jobs=[];this.pending=0}add(e){this.jobs.push(e);this[s]()}[s](){if(this.pending===this.concurrency)return;if(this.jobs.length){const e=this.jobs.shift();this.pending++;e(this[t])}}}e.exports=Limiter},376:(e,t,s)=>{"use strict";const r=s(106);const o=s(803);const n=s(958);const{kStatusCode:i}=s(791);const a=Buffer[Symbol.species];const c=Buffer.from([0,0,255,255]);const l=Symbol("permessage-deflate");const f=Symbol("total-length");const h=Symbol("callback");const u=Symbol("buffers");const d=Symbol("error");let p;class PerMessageDeflate{constructor(e){this._options=e||{};this._threshold=this._options.threshold!==undefined?this._options.threshold:1024;this._maxPayload=this._options.maxPayload|0;this._isServer=!!this._options.isServer;this._deflate=null;this._inflate=null;this.params=null;if(!p){const e=this._options.concurrencyLimit!==undefined?this._options.concurrencyLimit:10;p=new n(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};if(this._options.serverNoContextTakeover){e.server_no_context_takeover=true}if(this._options.clientNoContextTakeover){e.client_no_context_takeover=true}if(this._options.serverMaxWindowBits){e.server_max_window_bits=this._options.serverMaxWindowBits}if(this._options.clientMaxWindowBits){e.client_max_window_bits=this._options.clientMaxWindowBits}else if(this._options.clientMaxWindowBits==null){e.client_max_window_bits=true}return e}accept(e){e=this.normalizeParams(e);this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e);return this.params}cleanup(){if(this._inflate){this._inflate.close();this._inflate=null}if(this._deflate){const e=this._deflate[h];this._deflate.close();this._deflate=null;if(e){e(new Error("The deflate stream was closed while data was being processed"))}}}acceptAsServer(e){const t=this._options;const s=e.find((e=>{if(t.serverNoContextTakeover===false&&e.server_no_context_takeover||e.server_max_window_bits&&(t.serverMaxWindowBits===false||typeof t.serverMaxWindowBits==="number"&&t.serverMaxWindowBits>e.server_max_window_bits)||typeof t.clientMaxWindowBits==="number"&&!e.client_max_window_bits){return false}return true}));if(!s){throw new Error("None of the extension offers can be accepted")}if(t.serverNoContextTakeover){s.server_no_context_takeover=true}if(t.clientNoContextTakeover){s.client_no_context_takeover=true}if(typeof t.serverMaxWindowBits==="number"){s.server_max_window_bits=t.serverMaxWindowBits}if(typeof t.clientMaxWindowBits==="number"){s.client_max_window_bits=t.clientMaxWindowBits}else if(s.client_max_window_bits===true||t.clientMaxWindowBits===false){delete s.client_max_window_bits}return s}acceptAsClient(e){const t=e[0];if(this._options.clientNoContextTakeover===false&&t.client_no_context_takeover){throw new Error('Unexpected parameter "client_no_context_takeover"')}if(!t.client_max_window_bits){if(typeof this._options.clientMaxWindowBits==="number"){t.client_max_window_bits=this._options.clientMaxWindowBits}}else if(this._options.clientMaxWindowBits===false||typeof this._options.clientMaxWindowBits==="number"&&t.client_max_window_bits>this._options.clientMaxWindowBits){throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}return t}normalizeParams(e){e.forEach((e=>{Object.keys(e).forEach((t=>{let s=e[t];if(s.length>1){throw new Error(`Parameter "${t}" must have only a single value`)}s=s[0];if(t==="client_max_window_bits"){if(s!==true){const e=+s;if(!Number.isInteger(e)||e<8||e>15){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}s=e}else if(!this._isServer){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}}else if(t==="server_max_window_bits"){const e=+s;if(!Number.isInteger(e)||e<8||e>15){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}s=e}else if(t==="client_no_context_takeover"||t==="server_no_context_takeover"){if(s!==true){throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}}else{throw new Error(`Unknown parameter "${t}"`)}e[t]=s}))}));return e}decompress(e,t,s){p.add((r=>{this._decompress(e,t,((e,t)=>{r();s(e,t)}))}))}compress(e,t,s){p.add((r=>{this._compress(e,t,((e,t)=>{r();s(e,t)}))}))}_decompress(e,t,s){const n=this._isServer?"client":"server";if(!this._inflate){const e=`${n}_max_window_bits`;const t=typeof this.params[e]!=="number"?r.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=r.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t});this._inflate[l]=this;this._inflate[f]=0;this._inflate[u]=[];this._inflate.on("error",inflateOnError);this._inflate.on("data",inflateOnData)}this._inflate[h]=s;this._inflate.write(e);if(t)this._inflate.write(c);this._inflate.flush((()=>{const e=this._inflate[d];if(e){this._inflate.close();this._inflate=null;s(e);return}const r=o.concat(this._inflate[u],this._inflate[f]);if(this._inflate._readableState.endEmitted){this._inflate.close();this._inflate=null}else{this._inflate[f]=0;this._inflate[u]=[];if(t&&this.params[`${n}_no_context_takeover`]){this._inflate.reset()}}s(null,r)}))}_compress(e,t,s){const n=this._isServer?"server":"client";if(!this._deflate){const e=`${n}_max_window_bits`;const t=typeof this.params[e]!=="number"?r.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=r.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t});this._deflate[f]=0;this._deflate[u]=[];this._deflate.on("data",deflateOnData)}this._deflate[h]=s;this._deflate.write(e);this._deflate.flush(r.Z_SYNC_FLUSH,(()=>{if(!this._deflate){return}let e=o.concat(this._deflate[u],this._deflate[f]);if(t){e=new a(e.buffer,e.byteOffset,e.length-4)}this._deflate[h]=null;this._deflate[f]=0;this._deflate[u]=[];if(t&&this.params[`${n}_no_context_takeover`]){this._deflate.reset()}s(null,e)}))}}e.exports=PerMessageDeflate;function deflateOnData(e){this[u].push(e);this[f]+=e.length}function inflateOnData(e){this[f]+=e.length;if(this[l]._maxPayload<1||this[f]<=this[l]._maxPayload){this[u].push(e);return}this[d]=new RangeError("Max payload size exceeded");this[d].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH";this[d][i]=1009;this.removeListener("data",inflateOnData);this.reset()}function inflateOnError(e){this[l]._inflate=null;if(this[d]){this[h](this[d]);return}e[i]=1007;this[h](e)}},893:(e,t,s)=>{"use strict";const{Writable:r}=s(203);const o=s(376);const{BINARY_TYPES:n,EMPTY_BUFFER:i,kStatusCode:a,kWebSocket:c}=s(791);const{concat:l,toArrayBuffer:f,unmask:h}=s(803);const{isValidStatusCode:u,isValidUTF8:d}=s(615);const p=Buffer[Symbol.species];const _=0;const g=1;const m=2;const S=3;const b=4;const y=5;const k=6;class Receiver extends r{constructor(e={}){super();this._allowSynchronousEvents=e.allowSynchronousEvents!==undefined?e.allowSynchronousEvents:true;this._binaryType=e.binaryType||n[0];this._extensions=e.extensions||{};this._isServer=!!e.isServer;this._maxPayload=e.maxPayload|0;this._skipUTF8Validation=!!e.skipUTF8Validation;this[c]=undefined;this._bufferedBytes=0;this._buffers=[];this._compressed=false;this._payloadLength=0;this._mask=undefined;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=_}_write(e,t,s){if(this._opcode===8&&this._state==_)return s();this._bufferedBytes+=e.length;this._buffers.push(e);this.startLoop(s)}consume(e){this._bufferedBytes-=e;if(e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){const t=this._buffers[0];this._buffers[0]=new p(t.buffer,t.byteOffset+e,t.length-e);return new p(t.buffer,t.byteOffset,e)}const t=Buffer.allocUnsafe(e);do{const s=this._buffers[0];const r=t.length-e;if(e>=s.length){t.set(this._buffers.shift(),r)}else{t.set(new Uint8Array(s.buffer,s.byteOffset,e),r);this._buffers[0]=new p(s.buffer,s.byteOffset+e,s.length-e)}e-=s.length}while(e>0);return t}startLoop(e){this._loop=true;do{switch(this._state){case _:this.getInfo(e);break;case g:this.getPayloadLength16(e);break;case m:this.getPayloadLength64(e);break;case S:this.getMask();break;case b:this.getData(e);break;case y:case k:this._loop=false;return}}while(this._loop);if(!this._errored)e()}getInfo(e){if(this._bufferedBytes<2){this._loop=false;return}const t=this.consume(2);if((t[0]&48)!==0){const t=this.createError(RangeError,"RSV2 and RSV3 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_2_3");e(t);return}const s=(t[0]&64)===64;if(s&&!this._extensions[o.extensionName]){const t=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");e(t);return}this._fin=(t[0]&128)===128;this._opcode=t[0]&15;this._payloadLength=t[1]&127;if(this._opcode===0){if(s){const t=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");e(t);return}if(!this._fragmented){const t=this.createError(RangeError,"invalid opcode 0",true,1002,"WS_ERR_INVALID_OPCODE");e(t);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){const t=this.createError(RangeError,`invalid opcode ${this._opcode}`,true,1002,"WS_ERR_INVALID_OPCODE");e(t);return}this._compressed=s}else if(this._opcode>7&&this._opcode<11){if(!this._fin){const t=this.createError(RangeError,"FIN must be set",true,1002,"WS_ERR_EXPECTED_FIN");e(t);return}if(s){const t=this.createError(RangeError,"RSV1 must be clear",true,1002,"WS_ERR_UNEXPECTED_RSV_1");e(t);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){const t=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,true,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");e(t);return}}else{const t=this.createError(RangeError,`invalid opcode ${this._opcode}`,true,1002,"WS_ERR_INVALID_OPCODE");e(t);return}if(!this._fin&&!this._fragmented)this._fragmented=this._opcode;this._masked=(t[1]&128)===128;if(this._isServer){if(!this._masked){const t=this.createError(RangeError,"MASK must be set",true,1002,"WS_ERR_EXPECTED_MASK");e(t);return}}else if(this._masked){const t=this.createError(RangeError,"MASK must be clear",true,1002,"WS_ERR_UNEXPECTED_MASK");e(t);return}if(this._payloadLength===126)this._state=g;else if(this._payloadLength===127)this._state=m;else this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=false;return}this._payloadLength=this.consume(2).readUInt16BE(0);this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=false;return}const t=this.consume(8);const s=t.readUInt32BE(0);if(s>Math.pow(2,53-32)-1){const t=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",false,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");e(t);return}this._payloadLength=s*Math.pow(2,32)+t.readUInt32BE(4);this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8){this._totalPayloadLength+=this._payloadLength;if(this._totalPayloadLength>this._maxPayload&&this._maxPayload>0){const t=this.createError(RangeError,"Max payload size exceeded",false,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");e(t);return}}if(this._masked)this._state=S;else this._state=b}getMask(){if(this._bufferedBytes<4){this._loop=false;return}this._mask=this.consume(4);this._state=b}getData(e){let t=i;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=false;return}t=this.consume(this._payloadLength);if(this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0){h(t,this._mask)}}if(this._opcode>7){this.controlMessage(t,e);return}if(this._compressed){this._state=y;this.decompress(t,e);return}if(t.length){this._messageLength=this._totalPayloadLength;this._fragments.push(t)}this.dataMessage(e)}decompress(e,t){const s=this._extensions[o.extensionName];s.decompress(e,this._fin,((e,s)=>{if(e)return t(e);if(s.length){this._messageLength+=s.length;if(this._messageLength>this._maxPayload&&this._maxPayload>0){const e=this.createError(RangeError,"Max payload size exceeded",false,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");t(e);return}this._fragments.push(s)}this.dataMessage(t);if(this._state===_)this.startLoop(t)}))}dataMessage(e){if(!this._fin){this._state=_;return}const t=this._messageLength;const s=this._fragments;this._totalPayloadLength=0;this._messageLength=0;this._fragmented=0;this._fragments=[];if(this._opcode===2){let r;if(this._binaryType==="nodebuffer"){r=l(s,t)}else if(this._binaryType==="arraybuffer"){r=f(l(s,t))}else if(this._binaryType==="blob"){r=new Blob(s)}else{r=s}if(this._allowSynchronousEvents){this.emit("message",r,true);this._state=_}else{this._state=k;setImmediate((()=>{this.emit("message",r,true);this._state=_;this.startLoop(e)}))}}else{const r=l(s,t);if(!this._skipUTF8Validation&&!d(r)){const t=this.createError(Error,"invalid UTF-8 sequence",true,1007,"WS_ERR_INVALID_UTF8");e(t);return}if(this._state===y||this._allowSynchronousEvents){this.emit("message",r,false);this._state=_}else{this._state=k;setImmediate((()=>{this.emit("message",r,false);this._state=_;this.startLoop(e)}))}}}controlMessage(e,t){if(this._opcode===8){if(e.length===0){this._loop=false;this.emit("conclude",1005,i);this.end()}else{const s=e.readUInt16BE(0);if(!u(s)){const e=this.createError(RangeError,`invalid status code ${s}`,true,1002,"WS_ERR_INVALID_CLOSE_CODE");t(e);return}const r=new p(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!d(r)){const e=this.createError(Error,"invalid UTF-8 sequence",true,1007,"WS_ERR_INVALID_UTF8");t(e);return}this._loop=false;this.emit("conclude",s,r);this.end()}this._state=_;return}if(this._allowSynchronousEvents){this.emit(this._opcode===9?"ping":"pong",e);this._state=_}else{this._state=k;setImmediate((()=>{this.emit(this._opcode===9?"ping":"pong",e);this._state=_;this.startLoop(t)}))}}createError(e,t,s,r,o){this._loop=false;this._errored=true;const n=new e(s?`Invalid WebSocket frame: ${t}`:t);Error.captureStackTrace(n,this.createError);n.code=o;n[a]=r;return n}}e.exports=Receiver},389:(e,t,s)=>{"use strict";const{Duplex:r}=s(203);const{randomFillSync:o}=s(982);const n=s(376);const{EMPTY_BUFFER:i,kWebSocket:a,NOOP:c}=s(791);const{isBlob:l,isValidStatusCode:f}=s(615);const{mask:h,toBuffer:u}=s(803);const d=Symbol("kByteLength");const p=Buffer.alloc(4);const _=8*1024;let g;let m=_;const S=0;const b=1;const y=2;class Sender{constructor(e,t,s){this._extensions=t||{};if(s){this._generateMask=s;this._maskBuffer=Buffer.alloc(4)}this._socket=e;this._firstFragment=true;this._compress=false;this._bufferedBytes=0;this._queue=[];this._state=S;this.onerror=c;this[a]=undefined}static frame(e,t){let s;let r=false;let n=2;let i=false;if(t.mask){s=t.maskBuffer||p;if(t.generateMask){t.generateMask(s)}else{if(m===_){if(g===undefined){g=Buffer.alloc(_)}o(g,0,_);m=0}s[0]=g[m++];s[1]=g[m++];s[2]=g[m++];s[3]=g[m++]}i=(s[0]|s[1]|s[2]|s[3])===0;n=6}let a;if(typeof e==="string"){if((!t.mask||i)&&t[d]!==undefined){a=t[d]}else{e=Buffer.from(e);a=e.length}}else{a=e.length;r=t.mask&&t.readOnly&&!i}let c=a;if(a>=65536){n+=8;c=127}else if(a>125){n+=2;c=126}const l=Buffer.allocUnsafe(r?a+n:n);l[0]=t.fin?t.opcode|128:t.opcode;if(t.rsv1)l[0]|=64;l[1]=c;if(c===126){l.writeUInt16BE(a,2)}else if(c===127){l[2]=l[3]=0;l.writeUIntBE(a,4,6)}if(!t.mask)return[l,e];l[1]|=128;l[n-4]=s[0];l[n-3]=s[1];l[n-2]=s[2];l[n-1]=s[3];if(i)return[l,e];if(r){h(e,s,l,n,a);return[l]}h(e,s,e,0,a);return[l,e]}close(e,t,s,r){let o;if(e===undefined){o=i}else if(typeof e!=="number"||!f(e)){throw new TypeError("First argument must be a valid error code number")}else if(t===undefined||!t.length){o=Buffer.allocUnsafe(2);o.writeUInt16BE(e,0)}else{const s=Buffer.byteLength(t);if(s>123){throw new RangeError("The message must not be greater than 123 bytes")}o=Buffer.allocUnsafe(2+s);o.writeUInt16BE(e,0);if(typeof t==="string"){o.write(t,2)}else{o.set(t,2)}}const n={[d]:o.length,fin:true,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:8,readOnly:false,rsv1:false};if(this._state!==S){this.enqueue([this.dispatch,o,false,n,r])}else{this.sendFrame(Sender.frame(o,n),r)}}ping(e,t,s){let r;let o;if(typeof e==="string"){r=Buffer.byteLength(e);o=false}else if(l(e)){r=e.size;o=false}else{e=u(e);r=e.length;o=u.readOnly}if(r>125){throw new RangeError("The data size must not be greater than 125 bytes")}const n={[d]:r,fin:true,generateMask:this._generateMask,mask:t,maskBuffer:this._maskBuffer,opcode:9,readOnly:o,rsv1:false};if(l(e)){if(this._state!==S){this.enqueue([this.getBlobData,e,false,n,s])}else{this.getBlobData(e,false,n,s)}}else if(this._state!==S){this.enqueue([this.dispatch,e,false,n,s])}else{this.sendFrame(Sender.frame(e,n),s)}}pong(e,t,s){let r;let o;if(typeof e==="string"){r=Buffer.byteLength(e);o=false}else if(l(e)){r=e.size;o=false}else{e=u(e);r=e.length;o=u.readOnly}if(r>125){throw new RangeError("The data size must not be greater than 125 bytes")}const n={[d]:r,fin:true,generateMask:this._generateMask,mask:t,maskBuffer:this._maskBuffer,opcode:10,readOnly:o,rsv1:false};if(l(e)){if(this._state!==S){this.enqueue([this.getBlobData,e,false,n,s])}else{this.getBlobData(e,false,n,s)}}else if(this._state!==S){this.enqueue([this.dispatch,e,false,n,s])}else{this.sendFrame(Sender.frame(e,n),s)}}send(e,t,s){const r=this._extensions[n.extensionName];let o=t.binary?2:1;let i=t.compress;let a;let c;if(typeof e==="string"){a=Buffer.byteLength(e);c=false}else if(l(e)){a=e.size;c=false}else{e=u(e);a=e.length;c=u.readOnly}if(this._firstFragment){this._firstFragment=false;if(i&&r&&r.params[r._isServer?"server_no_context_takeover":"client_no_context_takeover"]){i=a>=r._threshold}this._compress=i}else{i=false;o=0}if(t.fin)this._firstFragment=true;const f={[d]:a,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:o,readOnly:c,rsv1:i};if(l(e)){if(this._state!==S){this.enqueue([this.getBlobData,e,this._compress,f,s])}else{this.getBlobData(e,this._compress,f,s)}}else if(this._state!==S){this.enqueue([this.dispatch,e,this._compress,f,s])}else{this.dispatch(e,this._compress,f,s)}}getBlobData(e,t,s,r){this._bufferedBytes+=s[d];this._state=y;e.arrayBuffer().then((e=>{if(this._socket.destroyed){const e=new Error("The socket was closed while the blob was being read");process.nextTick(callCallbacks,this,e,r);return}this._bufferedBytes-=s[d];const o=u(e);if(!t){this._state=S;this.sendFrame(Sender.frame(o,s),r);this.dequeue()}else{this.dispatch(o,t,s,r)}})).catch((e=>{process.nextTick(onError,this,e,r)}))}dispatch(e,t,s,r){if(!t){this.sendFrame(Sender.frame(e,s),r);return}const o=this._extensions[n.extensionName];this._bufferedBytes+=s[d];this._state=b;o.compress(e,s.fin,((e,t)=>{if(this._socket.destroyed){const e=new Error("The socket was closed while data was being compressed");callCallbacks(this,e,r);return}this._bufferedBytes-=s[d];this._state=S;s.readOnly=false;this.sendFrame(Sender.frame(t,s),r);this.dequeue()}))}dequeue(){while(this._state===S&&this._queue.length){const e=this._queue.shift();this._bufferedBytes-=e[3][d];Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][d];this._queue.push(e)}sendFrame(e,t){if(e.length===2){this._socket.cork();this._socket.write(e[0]);this._socket.write(e[1],t);this._socket.uncork()}else{this._socket.write(e[0],t)}}}e.exports=Sender;function callCallbacks(e,t,s){if(typeof s==="function")s(t);for(let s=0;s<e._queue.length;s++){const r=e._queue[s];const o=r[r.length-1];if(typeof o==="function")o(t)}}function onError(e,t,s){callCallbacks(e,t,s);e.onerror(t)}},412:(e,t,s)=>{"use strict";const r=s(681);const{Duplex:o}=s(203);function emitClose(e){e.emit("close")}function duplexOnEnd(){if(!this.destroyed&&this._writableState.finished){this.destroy()}}function duplexOnError(e){this.removeListener("error",duplexOnError);this.destroy();if(this.listenerCount("error")===0){this.emit("error",e)}}function createWebSocketStream(e,t){let s=true;const r=new o({...t,autoDestroy:false,emitClose:false,objectMode:false,writableObjectMode:false});e.on("message",(function message(t,s){const o=!s&&r._readableState.objectMode?t.toString():t;if(!r.push(o))e.pause()}));e.once("error",(function error(e){if(r.destroyed)return;s=false;r.destroy(e)}));e.once("close",(function close(){if(r.destroyed)return;r.push(null)}));r._destroy=function(t,o){if(e.readyState===e.CLOSED){o(t);process.nextTick(emitClose,r);return}let n=false;e.once("error",(function error(e){n=true;o(e)}));e.once("close",(function close(){if(!n)o(t);process.nextTick(emitClose,r)}));if(s)e.terminate()};r._final=function(t){if(e.readyState===e.CONNECTING){e.once("open",(function open(){r._final(t)}));return}if(e._socket===null)return;if(e._socket._writableState.finished){t();if(r._readableState.endEmitted)r.destroy()}else{e._socket.once("finish",(function finish(){t()}));e.close()}};r._read=function(){if(e.isPaused)e.resume()};r._write=function(t,s,o){if(e.readyState===e.CONNECTING){e.once("open",(function open(){r._write(t,s,o)}));return}e.send(t,o)};r.on("end",duplexOnEnd);r.on("error",duplexOnError);return r}e.exports=createWebSocketStream},332:(e,t,s)=>{"use strict";const{tokenChars:r}=s(615);function parse(e){const t=new Set;let s=-1;let o=-1;let n=0;for(n;n<e.length;n++){const i=e.charCodeAt(n);if(o===-1&&r[i]===1){if(s===-1)s=n}else if(n!==0&&(i===32||i===9)){if(o===-1&&s!==-1)o=n}else if(i===44){if(s===-1){throw new SyntaxError(`Unexpected character at index ${n}`)}if(o===-1)o=n;const r=e.slice(s,o);if(t.has(r)){throw new SyntaxError(`The "${r}" subprotocol is duplicated`)}t.add(r);s=o=-1}else{throw new SyntaxError(`Unexpected character at index ${n}`)}}if(s===-1||o!==-1){throw new SyntaxError("Unexpected end of input")}const i=e.slice(s,n);if(t.has(i)){throw new SyntaxError(`The "${i}" subprotocol is duplicated`)}t.add(i);return t}e.exports={parse:parse}},615:(e,t,s)=>{"use strict";const{isUtf8:r}=s(181);const{hasBlob:o}=s(791);const n=[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(e){return e>=1e3&&e<=1014&&e!==1004&&e!==1005&&e!==1006||e>=3e3&&e<=4999}function _isValidUTF8(e){const t=e.length;let s=0;while(s<t){if((e[s]&128)===0){s++}else if((e[s]&224)===192){if(s+1===t||(e[s+1]&192)!==128||(e[s]&254)===192){return false}s+=2}else if((e[s]&240)===224){if(s+2>=t||(e[s+1]&192)!==128||(e[s+2]&192)!==128||e[s]===224&&(e[s+1]&224)===128||e[s]===237&&(e[s+1]&224)===160){return false}s+=3}else if((e[s]&248)===240){if(s+3>=t||(e[s+1]&192)!==128||(e[s+2]&192)!==128||(e[s+3]&192)!==128||e[s]===240&&(e[s+1]&240)===128||e[s]===244&&e[s+1]>143||e[s]>244){return false}s+=4}else{return false}}return true}function isBlob(e){return o&&typeof e==="object"&&typeof e.arrayBuffer==="function"&&typeof e.type==="string"&&typeof e.stream==="function"&&(e[Symbol.toStringTag]==="Blob"||e[Symbol.toStringTag]==="File")}e.exports={isBlob:isBlob,isValidStatusCode:isValidStatusCode,isValidUTF8:_isValidUTF8,tokenChars:n};if(r){e.exports.isValidUTF8=function(e){return e.length<24?_isValidUTF8(e):r(e)}}else if(!process.env.WS_NO_UTF_8_VALIDATE){try{const t=s(414);e.exports.isValidUTF8=function(e){return e.length<32?_isValidUTF8(e):t(e)}}catch(e){}}},129:(e,t,s)=>{"use strict";const r=s(434);const o=s(611);const{Duplex:n}=s(203);const{createHash:i}=s(982);const a=s(335);const c=s(376);const l=s(332);const f=s(681);const{CLOSE_TIMEOUT:h,GUID:u,kWebSocket:d}=s(791);const p=/^[+/0-9A-Za-z]{22}==$/;const _=0;const g=1;const m=2;class WebSocketServer extends r{constructor(e,t){super();e={allowSynchronousEvents:true,autoPong:true,maxPayload:100*1024*1024,skipUTF8Validation:false,perMessageDeflate:false,handleProtocols:null,clientTracking:true,closeTimeout:h,verifyClient:null,noServer:false,backlog:null,server:null,host:null,path:null,port:null,WebSocket:f,...e};if(e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer){throw new TypeError('One and only one of the "port", "server", or "noServer" options '+"must be specified")}if(e.port!=null){this._server=o.createServer(((e,t)=>{const s=o.STATUS_CODES[426];t.writeHead(426,{"Content-Length":s.length,"Content-Type":"text/plain"});t.end(s)}));this._server.listen(e.port,e.host,e.backlog,t)}else if(e.server){this._server=e.server}if(this._server){const e=this.emit.bind(this,"connection");this._removeListeners=addListeners(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,s,r)=>{this.handleUpgrade(t,s,r,e)}})}if(e.perMessageDeflate===true)e.perMessageDeflate={};if(e.clientTracking){this.clients=new Set;this._shouldEmitClose=false}this.options=e;this._state=_}address(){if(this.options.noServer){throw new Error('The server is operating in "noServer" mode')}if(!this._server)return null;return this._server.address()}close(e){if(this._state===m){if(e){this.once("close",(()=>{e(new Error("The server is not running"))}))}process.nextTick(emitClose,this);return}if(e)this.once("close",e);if(this._state===g)return;this._state=g;if(this.options.noServer||this.options.server){if(this._server){this._removeListeners();this._removeListeners=this._server=null}if(this.clients){if(!this.clients.size){process.nextTick(emitClose,this)}else{this._shouldEmitClose=true}}else{process.nextTick(emitClose,this)}}else{const e=this._server;this._removeListeners();this._removeListeners=this._server=null;e.close((()=>{emitClose(this)}))}}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");const s=t!==-1?e.url.slice(0,t):e.url;if(s!==this.options.path)return false}return true}handleUpgrade(e,t,s,r){t.on("error",socketOnError);const o=e.headers["sec-websocket-key"];const n=e.headers.upgrade;const i=+e.headers["sec-websocket-version"];if(e.method!=="GET"){const s="Invalid HTTP method";abortHandshakeOrEmitwsClientError(this,e,t,405,s);return}if(n===undefined||n.toLowerCase()!=="websocket"){const s="Invalid Upgrade header";abortHandshakeOrEmitwsClientError(this,e,t,400,s);return}if(o===undefined||!p.test(o)){const s="Missing or invalid Sec-WebSocket-Key header";abortHandshakeOrEmitwsClientError(this,e,t,400,s);return}if(i!==13&&i!==8){const s="Missing or invalid Sec-WebSocket-Version header";abortHandshakeOrEmitwsClientError(this,e,t,400,s,{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(e)){abortHandshake(t,400);return}const f=e.headers["sec-websocket-protocol"];let h=new Set;if(f!==undefined){try{h=l.parse(f)}catch(s){const r="Invalid Sec-WebSocket-Protocol header";abortHandshakeOrEmitwsClientError(this,e,t,400,r);return}}const u=e.headers["sec-websocket-extensions"];const d={};if(this.options.perMessageDeflate&&u!==undefined){const s=new c({...this.options.perMessageDeflate,isServer:true,maxPayload:this.options.maxPayload});try{const e=a.parse(u);if(e[c.extensionName]){s.accept(e[c.extensionName]);d[c.extensionName]=s}}catch(s){const r="Invalid or unacceptable Sec-WebSocket-Extensions header";abortHandshakeOrEmitwsClientError(this,e,t,400,r);return}}if(this.options.verifyClient){const n={origin:e.headers[`${i===8?"sec-websocket-origin":"origin"}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(n,((n,i,a,c)=>{if(!n){return abortHandshake(t,i||401,a,c)}this.completeUpgrade(d,o,h,e,t,s,r)}));return}if(!this.options.verifyClient(n))return abortHandshake(t,401)}this.completeUpgrade(d,o,h,e,t,s,r)}completeUpgrade(e,t,s,r,o,n,l){if(!o.readable||!o.writable)return o.destroy();if(o[d]){throw new Error("server.handleUpgrade() was called more than once with the same "+"socket, possibly due to a misconfiguration")}if(this._state>_)return abortHandshake(o,503);const f=i("sha1").update(t+u).digest("base64");const h=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${f}`];const p=new this.options.WebSocket(null,undefined,this.options);if(s.size){const e=this.options.handleProtocols?this.options.handleProtocols(s,r):s.values().next().value;if(e){h.push(`Sec-WebSocket-Protocol: ${e}`);p._protocol=e}}if(e[c.extensionName]){const t=e[c.extensionName].params;const s=a.format({[c.extensionName]:[t]});h.push(`Sec-WebSocket-Extensions: ${s}`);p._extensions=e}this.emit("headers",h,r);o.write(h.concat("\r\n").join("\r\n"));o.removeListener("error",socketOnError);p.setSocket(o,n,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation});if(this.clients){this.clients.add(p);p.on("close",(()=>{this.clients.delete(p);if(this._shouldEmitClose&&!this.clients.size){process.nextTick(emitClose,this)}}))}l(p,r)}}e.exports=WebSocketServer;function addListeners(e,t){for(const s of Object.keys(t))e.on(s,t[s]);return function removeListeners(){for(const s of Object.keys(t)){e.removeListener(s,t[s])}}}function emitClose(e){e._state=m;e.emit("close")}function socketOnError(){this.destroy()}function abortHandshake(e,t,s,r){s=s||o.STATUS_CODES[t];r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(s),...r};e.once("finish",e.destroy);e.end(`HTTP/1.1 ${t} ${o.STATUS_CODES[t]}\r\n`+Object.keys(r).map((e=>`${e}: ${r[e]}`)).join("\r\n")+"\r\n\r\n"+s)}function abortHandshakeOrEmitwsClientError(e,t,s,r,o,n){if(e.listenerCount("wsClientError")){const r=new Error(o);Error.captureStackTrace(r,abortHandshakeOrEmitwsClientError);e.emit("wsClientError",r,s,t)}else{abortHandshake(s,r,o,n)}}},681:(e,t,s)=>{"use strict";const r=s(434);const o=s(692);const n=s(611);const i=s(278);const a=s(756);const{randomBytes:c,createHash:l}=s(982);const{Duplex:f,Readable:h}=s(203);const{URL:u}=s(16);const d=s(376);const p=s(893);const _=s(389);const{isBlob:g}=s(615);const{BINARY_TYPES:m,CLOSE_TIMEOUT:S,EMPTY_BUFFER:b,GUID:y,kForOnEventAttribute:k,kListener:w,kStatusCode:v,kWebSocket:E,NOOP:x}=s(791);const{EventTarget:{addEventListener:O,removeEventListener:T}}=s(634);const{format:C,parse:P}=s(335);const{toBuffer:W}=s(803);const $=Symbol("kAborted");const N=[8,13];const L=["CONNECTING","OPEN","CLOSING","CLOSED"];const H=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;class WebSocket extends r{constructor(e,t,s){super();this._binaryType=m[0];this._closeCode=1006;this._closeFrameReceived=false;this._closeFrameSent=false;this._closeMessage=b;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;if(e!==null){this._bufferedAmount=0;this._isServer=false;this._redirects=0;if(t===undefined){t=[]}else if(!Array.isArray(t)){if(typeof t==="object"&&t!==null){s=t;t=[]}else{t=[t]}}initAsClient(this,e,t,s)}else{this._autoPong=s.autoPong;this._closeTimeout=s.closeTimeout;this._isServer=true}}get binaryType(){return this._binaryType}set binaryType(e){if(!m.includes(e))return;this._binaryType=e;if(this._receiver)this._receiver._binaryType=e}get bufferedAmount(){if(!this._socket)return this._bufferedAmount;return this._socket._writableState.length+this._sender._bufferedBytes}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(e,t,s){const r=new p({allowSynchronousEvents:s.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:s.maxPayload,skipUTF8Validation:s.skipUTF8Validation});const o=new _(e,this._extensions,s.generateMask);this._receiver=r;this._sender=o;this._socket=e;r[E]=this;o[E]=this;e[E]=this;r.on("conclude",receiverOnConclude);r.on("drain",receiverOnDrain);r.on("error",receiverOnError);r.on("message",receiverOnMessage);r.on("ping",receiverOnPing);r.on("pong",receiverOnPong);o.onerror=senderOnError;if(e.setTimeout)e.setTimeout(0);if(e.setNoDelay)e.setNoDelay();if(t.length>0)e.unshift(t);e.on("close",socketOnClose);e.on("data",socketOnData);e.on("end",socketOnEnd);e.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}if(this._extensions[d.extensionName]){this._extensions[d.extensionName].cleanup()}this._receiver.removeAllListeners();this._readyState=WebSocket.CLOSED;this.emit("close",this._closeCode,this._closeMessage)}close(e,t){if(this.readyState===WebSocket.CLOSED)return;if(this.readyState===WebSocket.CONNECTING){const e="WebSocket was closed before the connection was established";abortHandshake(this,this._req,e);return}if(this.readyState===WebSocket.CLOSING){if(this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)){this._socket.end()}return}this._readyState=WebSocket.CLOSING;this._sender.close(e,t,!this._isServer,(e=>{if(e)return;this._closeFrameSent=true;if(this._closeFrameReceived||this._receiver._writableState.errorEmitted){this._socket.end()}}));setCloseTimer(this)}pause(){if(this.readyState===WebSocket.CONNECTING||this.readyState===WebSocket.CLOSED){return}this._paused=true;this._socket.pause()}ping(e,t,s){if(this.readyState===WebSocket.CONNECTING){throw new Error("WebSocket is not open: readyState 0 (CONNECTING)")}if(typeof e==="function"){s=e;e=t=undefined}else if(typeof t==="function"){s=t;t=undefined}if(typeof e==="number")e=e.toString();if(this.readyState!==WebSocket.OPEN){sendAfterClose(this,e,s);return}if(t===undefined)t=!this._isServer;this._sender.ping(e||b,t,s)}pong(e,t,s){if(this.readyState===WebSocket.CONNECTING){throw new Error("WebSocket is not open: readyState 0 (CONNECTING)")}if(typeof e==="function"){s=e;e=t=undefined}else if(typeof t==="function"){s=t;t=undefined}if(typeof e==="number")e=e.toString();if(this.readyState!==WebSocket.OPEN){sendAfterClose(this,e,s);return}if(t===undefined)t=!this._isServer;this._sender.pong(e||b,t,s)}resume(){if(this.readyState===WebSocket.CONNECTING||this.readyState===WebSocket.CLOSED){return}this._paused=false;if(!this._receiver._writableState.needDrain)this._socket.resume()}send(e,t,s){if(this.readyState===WebSocket.CONNECTING){throw new Error("WebSocket is not open: readyState 0 (CONNECTING)")}if(typeof t==="function"){s=t;t={}}if(typeof e==="number")e=e.toString();if(this.readyState!==WebSocket.OPEN){sendAfterClose(this,e,s);return}const r={binary:typeof e!=="string",mask:!this._isServer,compress:true,fin:true,...t};if(!this._extensions[d.extensionName]){r.compress=false}this._sender.send(e||b,r,s)}terminate(){if(this.readyState===WebSocket.CLOSED)return;if(this.readyState===WebSocket.CONNECTING){const e="WebSocket was closed before the connection was established";abortHandshake(this,this._req,e);return}if(this._socket){this._readyState=WebSocket.CLOSING;this._socket.destroy()}}}Object.defineProperty(WebSocket,"CONNECTING",{enumerable:true,value:L.indexOf("CONNECTING")});Object.defineProperty(WebSocket.prototype,"CONNECTING",{enumerable:true,value:L.indexOf("CONNECTING")});Object.defineProperty(WebSocket,"OPEN",{enumerable:true,value:L.indexOf("OPEN")});Object.defineProperty(WebSocket.prototype,"OPEN",{enumerable:true,value:L.indexOf("OPEN")});Object.defineProperty(WebSocket,"CLOSING",{enumerable:true,value:L.indexOf("CLOSING")});Object.defineProperty(WebSocket.prototype,"CLOSING",{enumerable:true,value:L.indexOf("CLOSING")});Object.defineProperty(WebSocket,"CLOSED",{enumerable:true,value:L.indexOf("CLOSED")});Object.defineProperty(WebSocket.prototype,"CLOSED",{enumerable:true,value:L.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach((e=>{Object.defineProperty(WebSocket.prototype,e,{enumerable:true})}));["open","error","close","message"].forEach((e=>{Object.defineProperty(WebSocket.prototype,`on${e}`,{enumerable:true,get(){for(const t of this.listeners(e)){if(t[k])return t[w]}return null},set(t){for(const t of this.listeners(e)){if(t[k]){this.removeListener(e,t);break}}if(typeof t!=="function")return;this.addEventListener(e,t,{[k]:true})}})}));WebSocket.prototype.addEventListener=O;WebSocket.prototype.removeEventListener=T;e.exports=WebSocket;function initAsClient(e,t,s,r){const i={allowSynchronousEvents:true,autoPong:true,closeTimeout:S,protocolVersion:N[1],maxPayload:100*1024*1024,skipUTF8Validation:false,perMessageDeflate:true,followRedirects:false,maxRedirects:10,...r,socketPath:undefined,hostname:undefined,protocol:undefined,timeout:undefined,method:"GET",host:undefined,path:undefined,port:undefined};e._autoPong=i.autoPong;e._closeTimeout=i.closeTimeout;if(!N.includes(i.protocolVersion)){throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} `+`(supported versions: ${N.join(", ")})`)}let a;if(t instanceof u){a=t}else{try{a=new u(t)}catch{throw new SyntaxError(`Invalid URL: ${t}`)}}if(a.protocol==="http:"){a.protocol="ws:"}else if(a.protocol==="https:"){a.protocol="wss:"}e._url=a.href;const f=a.protocol==="wss:";const h=a.protocol==="ws+unix:";let p;if(a.protocol!=="ws:"&&!f&&!h){p='The URL\'s protocol must be one of "ws:", "wss:", '+'"http:", "https:", or "ws+unix:"'}else if(h&&!a.pathname){p="The URL's pathname is empty"}else if(a.hash){p="The URL contains a fragment identifier"}if(p){const t=new SyntaxError(p);if(e._redirects===0){throw t}else{emitErrorAndClose(e,t);return}}const _=f?443:80;const g=c(16).toString("base64");const m=f?o.request:n.request;const b=new Set;let k;i.createConnection=i.createConnection||(f?tlsConnect:netConnect);i.defaultPort=i.defaultPort||_;i.port=a.port||_;i.host=a.hostname.startsWith("[")?a.hostname.slice(1,-1):a.hostname;i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":g,Connection:"Upgrade",Upgrade:"websocket"};i.path=a.pathname+a.search;i.timeout=i.handshakeTimeout;if(i.perMessageDeflate){k=new d({...i.perMessageDeflate,isServer:false,maxPayload:i.maxPayload});i.headers["Sec-WebSocket-Extensions"]=C({[d.extensionName]:k.offer()})}if(s.length){for(const e of s){if(typeof e!=="string"||!H.test(e)||b.has(e)){throw new SyntaxError("An invalid or duplicated subprotocol was specified")}b.add(e)}i.headers["Sec-WebSocket-Protocol"]=s.join(",")}if(i.origin){if(i.protocolVersion<13){i.headers["Sec-WebSocket-Origin"]=i.origin}else{i.headers.Origin=i.origin}}if(a.username||a.password){i.auth=`${a.username}:${a.password}`}if(h){const e=i.path.split(":");i.socketPath=e[0];i.path=e[1]}let w;if(i.followRedirects){if(e._redirects===0){e._originalIpc=h;e._originalSecure=f;e._originalHostOrSocketPath=h?i.socketPath:a.host;const t=r&&r.headers;r={...r,headers:{}};if(t){for(const[e,s]of Object.entries(t)){r.headers[e.toLowerCase()]=s}}}else if(e.listenerCount("redirect")===0){const t=h?e._originalIpc?i.socketPath===e._originalHostOrSocketPath:false:e._originalIpc?false:a.host===e._originalHostOrSocketPath;if(!t||e._originalSecure&&!f){delete i.headers.authorization;delete i.headers.cookie;if(!t)delete i.headers.host;i.auth=undefined}}if(i.auth&&!r.headers.authorization){r.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")}w=e._req=m(i);if(e._redirects){e.emit("redirect",e.url,w)}}else{w=e._req=m(i)}if(i.timeout){w.on("timeout",(()=>{abortHandshake(e,w,"Opening handshake has timed out")}))}w.on("error",(t=>{if(w===null||w[$])return;w=e._req=null;emitErrorAndClose(e,t)}));w.on("response",(o=>{const n=o.headers.location;const a=o.statusCode;if(n&&i.followRedirects&&a>=300&&a<400){if(++e._redirects>i.maxRedirects){abortHandshake(e,w,"Maximum redirects exceeded");return}w.abort();let o;try{o=new u(n,t)}catch(t){const s=new SyntaxError(`Invalid URL: ${n}`);emitErrorAndClose(e,s);return}initAsClient(e,o,s,r)}else if(!e.emit("unexpected-response",w,o)){abortHandshake(e,w,`Unexpected server response: ${o.statusCode}`)}}));w.on("upgrade",((t,s,r)=>{e.emit("upgrade",t);if(e.readyState!==WebSocket.CONNECTING)return;w=e._req=null;const o=t.headers.upgrade;if(o===undefined||o.toLowerCase()!=="websocket"){abortHandshake(e,s,"Invalid Upgrade header");return}const n=l("sha1").update(g+y).digest("base64");if(t.headers["sec-websocket-accept"]!==n){abortHandshake(e,s,"Invalid Sec-WebSocket-Accept header");return}const a=t.headers["sec-websocket-protocol"];let c;if(a!==undefined){if(!b.size){c="Server sent a subprotocol but none was requested"}else if(!b.has(a)){c="Server sent an invalid subprotocol"}}else if(b.size){c="Server sent no subprotocol"}if(c){abortHandshake(e,s,c);return}if(a)e._protocol=a;const f=t.headers["sec-websocket-extensions"];if(f!==undefined){if(!k){const t="Server sent a Sec-WebSocket-Extensions header but no extension "+"was requested";abortHandshake(e,s,t);return}let t;try{t=P(f)}catch(t){const r="Invalid Sec-WebSocket-Extensions header";abortHandshake(e,s,r);return}const r=Object.keys(t);if(r.length!==1||r[0]!==d.extensionName){const t="Server indicated an extension that was not requested";abortHandshake(e,s,t);return}try{k.accept(t[d.extensionName])}catch(t){const r="Invalid Sec-WebSocket-Extensions header";abortHandshake(e,s,r);return}e._extensions[d.extensionName]=k}e.setSocket(s,r,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxPayload:i.maxPayload,skipUTF8Validation:i.skipUTF8Validation})}));if(i.finishRequest){i.finishRequest(w,e)}else{w.end()}}function emitErrorAndClose(e,t){e._readyState=WebSocket.CLOSING;e._errorEmitted=true;e.emit("error",t);e.emitClose()}function netConnect(e){e.path=e.socketPath;return i.connect(e)}function tlsConnect(e){e.path=undefined;if(!e.servername&&e.servername!==""){e.servername=i.isIP(e.host)?"":e.host}return a.connect(e)}function abortHandshake(e,t,s){e._readyState=WebSocket.CLOSING;const r=new Error(s);Error.captureStackTrace(r,abortHandshake);if(t.setHeader){t[$]=true;t.abort();if(t.socket&&!t.socket.destroyed){t.socket.destroy()}process.nextTick(emitErrorAndClose,e,r)}else{t.destroy(r);t.once("error",e.emit.bind(e,"error"));t.once("close",e.emitClose.bind(e))}}function sendAfterClose(e,t,s){if(t){const s=g(t)?t.size:W(t).length;if(e._socket)e._sender._bufferedBytes+=s;else e._bufferedAmount+=s}if(s){const t=new Error(`WebSocket is not open: readyState ${e.readyState} `+`(${L[e.readyState]})`);process.nextTick(s,t)}}function receiverOnConclude(e,t){const s=this[E];s._closeFrameReceived=true;s._closeMessage=t;s._closeCode=e;if(s._socket[E]===undefined)return;s._socket.removeListener("data",socketOnData);process.nextTick(resume,s._socket);if(e===1005)s.close();else s.close(e,t)}function receiverOnDrain(){const e=this[E];if(!e.isPaused)e._socket.resume()}function receiverOnError(e){const t=this[E];if(t._socket[E]!==undefined){t._socket.removeListener("data",socketOnData);process.nextTick(resume,t._socket);t.close(e[v])}if(!t._errorEmitted){t._errorEmitted=true;t.emit("error",e)}}function receiverOnFinish(){this[E].emitClose()}function receiverOnMessage(e,t){this[E].emit("message",e,t)}function receiverOnPing(e){const t=this[E];if(t._autoPong)t.pong(e,!this._isServer,x);t.emit("ping",e)}function receiverOnPong(e){this[E].emit("pong",e)}function resume(e){e.resume()}function senderOnError(e){const t=this[E];if(t.readyState===WebSocket.CLOSED)return;if(t.readyState===WebSocket.OPEN){t._readyState=WebSocket.CLOSING;setCloseTimer(t)}this._socket.end();if(!t._errorEmitted){t._errorEmitted=true;t.emit("error",e)}}function setCloseTimer(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),e._closeTimeout)}function socketOnClose(){const e=this[E];this.removeListener("close",socketOnClose);this.removeListener("data",socketOnData);this.removeListener("end",socketOnEnd);e._readyState=WebSocket.CLOSING;if(!this._readableState.endEmitted&&!e._closeFrameReceived&&!e._receiver._writableState.errorEmitted&&this._readableState.length!==0){const t=this.read(this._readableState.length);e._receiver.write(t)}e._receiver.end();this[E]=undefined;clearTimeout(e._closeTimer);if(e._receiver._writableState.finished||e._receiver._writableState.errorEmitted){e.emitClose()}else{e._receiver.on("error",receiverOnFinish);e._receiver.on("finish",receiverOnFinish)}}function socketOnData(e){if(!this[E]._receiver.write(e)){this.pause()}}function socketOnEnd(){const e=this[E];e._readyState=WebSocket.CLOSING;e._receiver.end();this.end()}function socketOnError(){const e=this[E];this.removeListener("error",socketOnError);this.on("error",x);if(e){e._readyState=WebSocket.CLOSING;this.destroy()}}},828:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var o=Object.getOwnPropertyDescriptor(t,s);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,o)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s))t[t.length]=s;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s=ownKeys(e),n=0;n<s.length;n++)if(s[n]!=="default")r(t,e,s[n]);o(t,e);return t}}();Object.defineProperty(t,"__esModule",{value:true});t.getIp=getIp;t.getNowTime=getNowTime;t.validateHostdir=validateHostdir;t.getHostIP=getHostIP;t.getHostCFG=getHostCFG;t.getProxyHostCFG=getProxyHostCFG;t.initAsaiHost=initAsaiHost;const i=n(s(857));const a=s(6);const c=s(999);function getIp(){try{const e=i.networkInterfaces();for(const t of Object.keys(e)){const s=e[t];if(!s)continue;for(const e of s){if(e.family==="IPv4"&&e.address!=="127.0.0.1"&&!e.internal){return e.address}}}}catch(e){console.error("Get IP address error:",e)}return"127.0.0.1"}function getNowTime(e=0,t=null){try{t=t||new Date;const s=t.getFullYear();const r=String(t.getMonth()+1).padStart(2,"0");const o=String(t.getDate()).padStart(2,"0");const n=String(t.getHours()).padStart(2,"0");const i=String(t.getMinutes()).padStart(2,"0");const a=String(t.getSeconds()).padStart(2,"0");const c=String(t.getMilliseconds()).padStart(3,"0");switch(e){case 1:return`${n}:${i}:${a}`;case 2:return`${s}-${r}-${o}`;case 3:return`${n}:${i}:${a}.${c}`;case 4:return`${s}-${r}-${o} ${n}:${i}:${a}.${c}`;case 5:return`${n}-${i}-${a}-${c}`;default:return`${s}-${r}-${o} ${n}:${i}:${a}`}}catch(e){console.error("Date formatting error:",e);return"unknown-time"}}function validateHostdir(e){if(typeof e!=="string"||e.length===0||e.length>100||e==="default"||e==="asai"){return false}return/^[a-zA-Z0-9_-]+$/.test(e)}function getHostIP(e,t){if(e&&typeof e==="string"){return e}else if(t?.hostconfig?.ip==="asai"){return"localhost"}return t?.hostconfig?.ip||"127.0.0.1"}function getHostCFG(e,t){const s=t.hostconfig.hosts.default||{};const r=t.hostconfig.hosts[e]||{};return{...s,...r}}function getProxyHostCFG(e,t){const s=t.hostconfig.proxyhosts?.default||{};const r=t.hostconfig.proxyhosts?.[e]||{};const o={...s,...r};if(!o.url&&o.port){o.url=(o.httptype||"http://")+getHostIP(o.ip,t)+":"+o.port}return o}function initAsaiHost(e,t){if(!e.hostconfig?.ip){e.hostconfig.ip=getIp()}e.setAppend=(t,s)=>(0,c.setAppend)(e,t,s);e.getHost=t=>getHostCFG(t,e);e.getHostIP=t=>getHostIP(t,e);(0,a.initProcess)(e);(0,c.initLog)(e);e.hostconfig.asaiport=[];e.hostconfig.guardtm=null;if(e.hostconfig?.aes?.lv&&!e.$lib?.aesfns){const{reqAES:t,resAES:s}=e.$lib.AsAES(e);e.$lib.aesfns={allaes:e.hostconfig.aes.lv>1,reqAES:t,resAES:s}}}},294:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.FileCache=void 0;class FileCache{constructor(e){this.store=new Map;this.accessOrder=[];this.totalSize=0;this.cfg={default:e.default??0,maxSize:e.maxSize??5242880,maxTotalSize:e.maxTotalSize??52428800,extensions:e.extensions??{},dirs:e.dirs??{}}}getTTL(e,t){if(this.cfg.dirs){for(const[t,s]of Object.entries(this.cfg.dirs)){if(e.startsWith(t))return s}}if(this.cfg.extensions&&t in this.cfg.extensions){return this.cfg.extensions[t]}return this.cfg.default}get(e,t){const s=this.store.get(e);if(!s)return null;if(s.mtimeMs!==t){this.delete(e);return null}if(s.expiresAt!==-1&&Date.now()>s.expiresAt){this.delete(e);return null}const r=this.accessOrder.indexOf(e);if(r!==-1)this.accessOrder.splice(r,1);this.accessOrder.push(e);s.hitCount++;return s.data}set(e,t,s,r,o){const n=this.getTTL(s,r);if(n===0)return;if(t.length>this.cfg.maxSize)return;if(this.store.has(e)){this.delete(e)}const i={data:t,mtimeMs:o,expiresAt:n===-1?-1:Date.now()+n*1e3,size:t.length,hitCount:0};while(this.totalSize+t.length>this.cfg.maxTotalSize&&this.accessOrder.length>0){const e=this.accessOrder.shift();if(e)this.delete(e)}this.store.set(e,i);this.accessOrder.push(e);this.totalSize+=t.length}delete(e){const t=this.store.get(e);if(t){this.totalSize-=t.size;this.store.delete(e)}const s=this.accessOrder.indexOf(e);if(s!==-1)this.accessOrder.splice(s,1)}clear(){this.store.clear();this.accessOrder=[];this.totalSize=0}}t.FileCache=FileCache},867:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var o=Object.getOwnPropertyDescriptor(t,s);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,o)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s))t[t.length]=s;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s=ownKeys(e),n=0;n<s.length;n++)if(s[n]!=="default")r(t,e,s[n]);o(t,e);return t}}();Object.defineProperty(t,"__esModule",{value:true});t.getHTTPServer=getHTTPServer;t.getHttpUserinfo=getHttpUserinfo;t.checkHttpHeader=checkHttpHeader;t.startHTTPServer=startHTTPServer;t.asaiGuard=asaiGuard;const i=n(s(611));const a=n(s(692));const c=n(s(896));const l=n(s(928));const f=s(828);const h=s(785);const u=s(798);const d=s(407);const p=s(294);function getHTTPServer(e="",t,s){try{if(e.startsWith("https")){a.AsCreateServer=e=>a.createServer(t?.httpscert||s.hostconfig.httpscert,e);return a}else{i.AsCreateServer=i.createServer;return i}}catch(e){s.$log("HTTP","Http server error:",JSON.stringify(e));i.AsCreateServer=i.createServer;return i}}function getHttpUserinfo(e,t){try{const s=e.rawHeaders;const r={};for(let e=0;e<s.length;e+=2){r[s[e].toLowerCase()]=s[e+1]}const o=r["userinfo"]?.split("##");return(0,u.deUserInfoWithAsai)(o,t)}catch(e){}return""}function checkHttpHeader(e,t){e.Userinfo=getHttpUserinfo(e,t);return true}function serveStaticFile(e,t,s,r,o,n,i){const a=c.createReadStream(s);let f=[];let h=0;const u=!!e.headers["range"];const d=`"${o.size}-${o.mtimeMs}"`;if(e.headers["if-none-match"]===d){t.writeHead(304);t.end();if(!a.destroyed)a.destroy();return}if(i&&!u){const e=i.get(s,o.mtimeMs);if(e){t.writeHead(200,{"Content-Type":r,"Content-Length":e.length,"Cache-Control":"public, max-age=3600",ETag:d,"Last-Modified":o.mtime.toUTCString(),"X-Cache":"HIT"});t.end(e);return}}a.once("open",(()=>{t.writeHead(200,{"Content-Type":r,"Content-Length":o.size,"Cache-Control":"public, max-age=3600",ETag:d,"Last-Modified":o.mtime.toUTCString(),"X-Cache":"MISS"})}));a.on("data",(e=>{t.write(e);if(i&&!u){f.push(e);h+=e.length}}));a.once("end",(()=>{t.end();if(i&&!u&&h>0){const t=e.url||"/";const r=l.extname(s);const n=Buffer.concat(f,h);i.set(s,n,t,r,o.mtimeMs)}f=[]}));a.once("error",(e=>{n.$log("STREAM","Stream error:",e);if(!t.headersSent){t.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"});t.end("Internal Server Error")}else{t.destroy()}}));t.once("close",(()=>{if(!a.destroyed){a.destroy()}f=[]}))}function startHTTPServer(e,t){const s=(0,f.getHostCFG)(t,e);if(!s||s.close)return;const r=s.cache?new p.FileCache(s.cache):undefined;try{if(!e.servershttp[t]){if(s.mimetypes){s.mimetypes={...e.hostconfig.mimetypes||{},...s.mimetypes}}const o=getHTTPServer(s.httptype,s,e);const n=!!(s.weburls?.rewrite&&s.weburls?.webdir&&s.weburls?.keys?.length);const i=[s.weburls?.webdir||"",...s.hostdirs||[]].filter((e=>e));const a=o.AsCreateServer(((o,a)=>{try{if(!checkHttpHeader(o,e)){e.$log("HTTP",o.method,o.url);a.writeHead(502,{"Content-Type":"text/plain; charset=utf-8"});a.end("502");return}const f=(0,d.getWorkHandler)("sysWork");const h=(0,d.getWorkHandler)("apiWork");const u=(0,d.getWorkHandler)("jsonpWork");if(o.url?.startsWith("/sys")&&f){e.$log("SYS",o.method,o.url);f(o,a,t)}else if(o.url?.startsWith("/api")&&h){e.$log("API",o.method,o.url);h(o,a,t)}else if(o.url?.startsWith("/jsonp")&&u){e.$log("JSONP",o.method,o.url);u(o,a,t)}else if(i.length>0){e.$log("REQ_OTHER",o.method,o.url);a.setHeader("Cross-Origin-Resource-Policy","cross-origin");a.setHeader("Cross-Origin-Opener-Policy","cross-origin");const checkWebUrls=e=>{if(n&&e){return s.weburls?.keys?.some((t=>e.startsWith(t)))??false}return false};const showHostDirs=(t,i,f=0)=>{const h=parseUrlPath(i);const findValidFile=(t,s)=>{for(const r of t){let t="./"+r+s;if(s.endsWith("/")){t+=e.hostconfig.index||"index.html"}if(e.hostconfig?.pkg?.type===1){const e=l.join(__dirname,t);if(checkFileExists(e)){return e}}const o=l.normalize(t);if(o.includes(".."))continue;if(checkFileExists(o)){return o}}return null};const u=h.endsWith("/")?h+(e.hostconfig.index||"index.html"):h;const d=findValidFile(t,u);if(!d){if(f>0||!n){a.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"});a.end("File not found!");return}else{const t=[s.weburls.webdir];const r=(e.hostconfig?.pkg?.type===1?"":"/")+(e.hostconfig.index||"index.html");showHostDirs(t,r,f+1);return}}let p;try{p=c.statSync(d)}catch(t){e.$log("FILE","File stat error:",t);if(!a.headersSent){a.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"});a.end("Internal Server Error")}else{a.destroy()}return}const _=s.mimetypes?.[l.extname(d)]||"application/octet-stream";serveStaticFile(o,a,d,_,p,e,r)};if(checkWebUrls(o.url)){showHostDirs([s.weburls.webdir],"/"+(e.hostconfig.index||"index.html"))}else{showHostDirs(i,o.url)}}else{e.$log("HTTP",o.method,o.url);a.writeHead(404,{"Content-Type":"text/plain; charset=utf-8"});a.end("404")}}catch(t){e.$log("HTTP","HTTP request error:",t);if(!a.headersSent){a.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"})}a.end("Internal server error")}}));e.servershttp[t]=a;if(s.ws){(0,h.createWSHost)(e,t)}a.on("error",(t=>{e.hostconfig.asaiport.push(s.port);asaiGuard(e);if(t.code==="EADDRINUSE"){e.$log("HTTP",`Port ${s.port} is already start!`)}else{e.$log("HTTP","Server error:",t)}}));if(e.hostconfig.ip==="asai"||!s.ip&&!e.hostconfig.ip){a.listen(s.port,(()=>{console.log(`[${t}] Start At ${(0,f.getNowTime)()}.`);if(s.ws){console.log(`WS Server ${s.wstype||"ws://"}localhost:${s.port}`)}console.log(`HTTP Server ${s.httptype}localhost:${s.port}`);console.log(`================================================`)}))}else{const r=(0,f.getHostIP)(s.ip,e);a.listen(s.port,r,(()=>{console.log(`[${t}] Start At ${(0,f.getNowTime)()}.`);if(s.ws){console.log(`WS Server ${s.wstype||"ws://"}${r}:${s.port}`)}console.log(`HTTP Server ${s.httptype}${r}:${s.port}`);console.log(`================================================`)}))}if(s.ckhttp){const r=s.maxhttp||100;const o=setInterval((()=>{const s=e.connectionshttp[t]?.size||0;if(s>r*.8){e.$log("HTTP",`HTTP Connection HIGH (${s}/${r})`)}if(s>r*.95){e.$log("HTTP","HTTP Connection CRITICAL! Forcing cleanup");if(e.connectionshttp[t]){e.connectionshttp[t].forEach((e=>{if(e._idleTime&&Date.now()-e._idleTime>3e5){e.destroy()}}))}}}),3e5);if(!e.tasksws[t])e.tasksws[t]={};e.tasksws[t].httpMonitor=o;a.on("connection",(s=>{if(!e.connectionshttp[t]){e.connectionshttp[t]=new Set}const o=e.connectionshttp[t].size;if(o>=r){try{e.$log("HTTP",`HTTP Connection MAX rejected (${o}/${r})`);s.destroy()}catch(t){e.$log("HTTP","Close connection error:",t)}return}e.connectionshttp[t].add(s);s.on("close",(()=>{e.connectionshttp[t].delete(s)}));s.setTimeout(3e5)}))}}}catch(t){e.$log("HTTP","Http server error:",JSON.stringify(t))}return e.servershttp[t]}function asaiGuard(e){if(e.hostconfig.asaiport.includes(e.hostconfig.hosts.asai.port)){process.exit(1)}else{if(e.hostconfig.guardtm){clearTimeout(e.hostconfig.guardtm);e.hostconfig.guardtm=null}e.hostconfig.guardtm=setTimeout((()=>{startHTTPServer(e,"asai");if(e.hostconfig.guardtm){clearTimeout(e.hostconfig.guardtm);e.hostconfig.guardtm=null}}),e.hostconfig.tm?.d||2e3)}}function parseUrlPath(e){try{if(!e)return"/";const t=e.startsWith("http")?e:encodeURI(e);return new URL(t,"http://localhost").pathname}catch{return e}}function checkFileExists(e){try{const t=c.statSync(e);return t.isFile()&&!!(t.mode&c.constants.R_OK)}catch{return false}}},407:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){if(r===undefined)r=s;var o=Object.getOwnPropertyDescriptor(t,s);if(!o||("get"in o?!t.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return t[s]}}}Object.defineProperty(e,r,o)}:function(e,t,s,r){if(r===undefined)r=s;e[r]=t[s]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(){var ownKeys=function(e){ownKeys=Object.getOwnPropertyNames||function(e){var t=[];for(var s in e)if(Object.prototype.hasOwnProperty.call(e,s))t[t.length]=s;return t};return ownKeys(e)};return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var s=ownKeys(e),n=0;n<s.length;n++)if(s[n]!=="default")r(t,e,s[n]);o(t,e);return t}}();Object.defineProperty(t,"__esModule",{value:true});t.getWorkHandler=getWorkHandler;t["default"]=default_1;const i=n(s(354));const a=s(828);const c=s(867);const l=s(471);const f=new Map;function getWorkHandler(e){return f.get(e)}function default_1(e,t){const{sysWork:s,apiWork:r,wsWork:o,jsonpWork:n}=t;f.set("sysWork",s);f.set("apiWork",r);f.set("wsWork",o);f.set("jsonpWork",n);function StartAsaiHost(){(0,a.initAsaiHost)(e,t);console.log(`※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※`);if(e.hostconfig?.hosts){e.startHTTPServer=t=>(0,c.startHTTPServer)(e,t);Object.keys(e.hostconfig.hosts).forEach((t=>{if((0,a.validateHostdir)(t)){(0,c.startHTTPServer)(e,t)}}))}if(e.hostconfig?.proxyhosts){Object.keys(e.hostconfig.proxyhosts).forEach((t=>{if((0,a.validateHostdir)(t)){(0,l.startProxyServer)(e,t)}}))}}return{StartAsaiHost:StartAsaiHost,asaiWs:i}}},999:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setAppend=setAppend;t.setLog=setLog;t.initLog=initLog;const r=s(828);const o=new Map;class LogBuffer{constructor(e,t){this.$asai=e;this.filePath=t;this.buffer=[];this.timer=null;this.flushInterval=100;this.maxBufferSize=100;process.once("beforeExit",(()=>this.flush()))}add(e){this.buffer.push(e);if(this.buffer.length>=this.maxBufferSize){this.flush()}else if(!this.timer){this.timer=setTimeout((()=>this.flush()),this.flushInterval)}}forceFlush(){this.flush()}flush(){if(this.timer){clearTimeout(this.timer);this.timer=null}if(this.buffer.length===0)return;const e=this.buffer.join("");this.buffer=[];this.$asai.asaifs.append(this.filePath,e).catch((e=>console.error("Log write error:",e)))}destroy(){if(this.timer){clearTimeout(this.timer);this.timer=null}this.flush()}}function saveLog(e,t,s){return new Promise(((r,n)=>{try{const n=`${e.id||"default"}_${t}`;let i=o.get(n);if(!i){i=new LogBuffer(e,t);o.set(n,i)}i.add(s);r()}catch(e){console.error(e);n(e)}}))}function newLoggerFile(e,t,s){return`#Software: ${e.hostconfig.website?.title};\n#Version: ${e.hostconfig.website?.ver};\n#Date: ${(0,r.getNowTime)(4,t)};\n#Fields: [time]; type; message;\n${s}`}async function setAppend(e,t,s){try{await e.asaifs.ensureFile(t);const o=await e.asaifs.stat(t);const n=new Date;if(o.size>=(e.hostconfig.logger?.path?.maxsize||1048576)){const s=t.lastIndexOf(".");const o=t.substring(0,s);const i=t.substring(s);await e.asaifs.rename(t,o+"-"+(0,r.getNowTime)(5,n)+i)}await saveLog(e,t,s)}catch(e){console.error(e)}return}function setLog(e,t,s){return new Promise(((r,o)=>{try{setAppend(e,t,s).then(r).catch(o)}catch(e){console.error(e);o(e)}}))}function initLog(e){const flushAllBuffers=()=>{for(const[,e]of o){e.forceFlush()}};process.once("beforeExit",flushAllBuffers);function clog(e,...t){if(e.hostconfig.logger?.lv?.view){console.log(...t)}}async function xlog(...t){clog(e,...t)}async function llog(...t){const s=new Date;let o="";const n=t[0];if(n===1){if(e.hostconfig.logger?.path?.client){o=`[${(0,r.getNowTime)(3,s)}]\n`;o+=t?.slice(1)?.map((e=>typeof e==="object"?JSON.stringify(e):e)).join("\n");o+="\n";clog(e,o);await setLog(e,e.hostconfig.logger?.path?.client+`log-${(0,r.getNowTime)(2,s)}.txt`,o)}}else{t.unshift(`[${(0,r.getNowTime)(3,s)}]`);if(typeof n==="number"&&n>666){}else{if(e.hostconfig.logger?.path?.server){o=t?.map((e=>typeof e==="object"?JSON.stringify(e):e)).join("; ").replace(/\n/g," ").replace(/\r/g," ");clog(e,o);o+="\n";await setLog(e,e.hostconfig.logger?.path?.server+`log-${(0,r.getNowTime)(2)}.txt`,o)}}}}if(e&&typeof e==="object"&&e.hostconfig.logger?.lv?.record){e.$log=llog}else{e.$log=xlog}}},6:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.initProcess=initProcess;t.gracefulShutdown=gracefulShutdown;function initProcess(e,t){const s=10;const r=6e4;const o=[];process.on("unhandledRejection",((t,s)=>{const r=(new Error).stack;let o="";if(s&&typeof s==="object"){o=s.constructor?.name||"Promise";const e=r?.split("\n")||[];const t=e.slice(3,6).join(" | ");o+=` Created at: ${t}`}let n="";if(t instanceof Error){n=`\n${t.name}: ${t.message}`;if(t.stack)n+=`\n【Stack】${t.stack}`}else if(typeof t==="object"&&t!==null){try{n=JSON.stringify(t,null,2).substring(0,500)}catch{n=String(t)}}else{n=String(t)}const i=`Unhandled Promise Rejection:\n【Reason】 ${n}\n【Promise】${o}`;e.$log("UNHANDLED_REJECTION",i)}));process.on("uncaughtException",(n=>{const i=`Uncaught Exception: ${JSON.stringify(n)}`;e.$log("UNCAUGHT_EXCEPTIONS",i);const a=Date.now();o.push(a);while(o.length>0&&o[0]<a-r){o.shift()}if(o.length>s){e.$log("NO_RESTART","Process crashed too frequently, not restarting.");e.$log("SHUTDOWN","Error:",n?.message||n);process.exit(1)}if(t&&typeof t==="function"){try{t(n)}catch(e){console.error("Error in process error callback:",e)}}}));process.on("SIGTERM",(()=>{e.$log("SIGTERM","SIGTERM,CLOSING...");gracefulShutdown(e)}));process.on("SIGINT",(()=>{e.$log("SIGINT","SIGINT,CLOSING...");gracefulShutdown(e)}))}function gracefulShutdown(e){const t=6e4;let s;const r=Date.now();s=setTimeout((()=>{e.$log("SHUTDOWN",`Timeout! Exiting after ${Date.now()-r}ms`);process.exit(1)}),t);try{Object.values(e.servershttp||{}).forEach((t=>{if(t&&typeof t.close==="function"){t.close((t=>{if(t)e.$log("HTTP","HTTP server close error:",t)}))}}));Object.values(e.serversws||{}).forEach((t=>{if(t&&typeof t.close==="function"){t.close((t=>{if(t)e.$log("WS","WS server close error:",t)}))}}));if(e.hostconfig.guardtm){clearTimeout(e.hostconfig.guardtm);e.hostconfig.guardtm=null}Object.keys(e.tasksws||{}).forEach((t=>{if(e.tasksws[t].httpMonitor){clearInterval(e.tasksws[t].httpMonitor);delete e.tasksws[t].httpMonitor}}));setTimeout((()=>{clearTimeout(s);e.$log("SHUTDOWN",`Web Server Closed (${Date.now()-r}ms)`);process.exit(0)}),3e3)}catch(t){e.$log("SHUTDOWN","Graceful shutdown error:",t);clearTimeout(s);process.exit(1)}}},471:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.startProxyServer=startProxyServer;const r=s(828);const o=s(867);function startProxyServer(e,t){const s=(0,r.getProxyHostCFG)(t,e);if(!s.url)return;try{const n=(0,o.getHTTPServer)(s.proxyhttptype,s,e);const i=n.AsCreateServer(((t,r)=>{if(s.redirect){r.writeHead(301,{Location:s.url+t.url,"Strict-Transport-Security":"max-age=31536000"});r.end();return}const n=new URL(s.url+t.url);const i=n.protocol==="https:";const a=(0,o.getHTTPServer)(s.url,s,e);const c={keepAlive:s.keepAlive??true,timeout:s.timeout??6e4,keepAliveMsecs:s.keepAliveMsecs??3e4,maxSockets:s.maxSockets??1e3,maxFreeSockets:s.maxFreeSockets??100,rejectUnauthorized:s.rejectUnauthorized??false,secureProtocol:s.secureProtocol??"TLS_method"};const l=new a.Agent(c);const f={agent:l,method:t.method,hostname:n.hostname,port:n.port||(i?443:80),path:n.pathname+n.search,headers:t.headers};if(i){f.servername=n.hostname}const h=s.passUserInfo??false;const u=a.request(f,(s=>{Object.keys(s.headers).forEach((e=>{const t=["transfer-encoding","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailers","upgrade"];if(!t.includes(e.toLowerCase())){r.setHeader(e,s.headers[e])}}));r.statusCode=s.statusCode;if(h){const s=(0,o.getHttpUserinfo)(t,e);if(s)r.setHeader("Userinfo",Array.isArray(s)?s.join("##"):s)}s.pipe(r,{end:true})}));t.pipe(u,{end:true});t.on("error",(t=>{e.$log("PROXY","Client request error:",t);u.destroy()}));u.on("error",(t=>{e.$log("PROXY","Forward request error:",t);e.$log("PROXY",`Target: ${n.href}, HTTPS: ${i}`);if(!r.headersSent){r.writeHead(502,{"Content-Type":"text/plain; charset=utf-8"})}r.end("Bad Gateway: "+t.message)}));u.setTimeout(12e4,(()=>{e.$log("PROXY","Forward request timeout");u.destroy();if(!r.headersSent){r.writeHead(504,{"Content-Type":"text/plain; charset=utf-8"})}r.end("Gateway Timeout")}))}));i.on("error",(t=>{if(t.code==="EADDRINUSE"){e.$log("PROXY",`Port ${s.proxyport} is already start!`)}else{e.$log("PROXY","Proxy server error:",t)}}));const a=(0,r.getHostIP)(s.proxyip,e);const listenCallback=()=>{console.log(`[${t}] Start At ${(0,r.getNowTime)()}.`);console.log(`Proxy Server ${s.proxyhttptype}${a||"localhost"}:${s.proxyport}`);console.log(`Target Server ${s.url}`);console.log(`================================================`)};if(a){i.listen(s.proxyport,a,listenCallback)}else{i.listen(s.proxyport,listenCallback)}}catch(t){e.$log("PROXY","Proxy server error:",JSON.stringify(t))}}},798:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.deUserInfoWithAsai=deUserInfoWithAsai;t.deUserInfo=deUserInfo;function deUserInfoWithAsai(e,t){if(!Array.isArray(e)||e.length<3){return e}if(e[2]){try{e[2]=t.$lib.AsCode.asdecode(e[2],t.hostconfig.asaisn);e[0]=t.$lib.AsCode.asdecode(e[0],e[2]);e[1]=t.$lib.AsCode.asdecode(e[1],e[2])}catch(e){t.$log("USER","User info decode error:",e)}}return e}function deUserInfo(e){return e}},785:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.getWsUserinfo=getWsUserinfo;t.clearWsServerTasks=clearWsServerTasks;t.createWSHost=createWSHost;const r=s(354);const o=s(828);const n=s(798);const i=s(407);function getWsUserinfo(e,t){try{const s=e.rawHeaders;const r={};for(let e=0;e<s.length;e+=2){r[s[e].toLowerCase()]=s[e+1]}const o=r["sec-websocket-protocol"]?.split("##");return(0,n.deUserInfoWithAsai)(o,t)}catch{}return null}function clearWsServerTasks(e,t){const s=e.tasksws[t];if(s&&typeof s==="object"){Object.values(s).forEach((e=>{if(e)clearInterval(e)}));e.tasksws[t]={}}}function resWsMsg(e,t){if(e==="ping"||e==="pong"){return e}else if(typeof e==="object"){if((e?.aes||t.$lib.aesfns?.allaes)&&e?.db&&t.$lib?.aesfns?.resAES){e.db=t.$lib.aesfns.resAES(e.db)}return JSON.stringify(e)}return e}function createWSHost(e,t){const s=(0,o.getHostCFG)(t,e);try{if(!e.serversws[t]){if(s.ckws&&!e.connectionsws[t]){e.connectionsws[t]={}}if(!e.tasksws[t]){e.tasksws[t]={}}const o=new r.WebSocketServer({server:e.servershttp[t],perMessageDeflate:false});o.sendws=(t,s,n)=>{const i=resWsMsg(t,e);if(s){o.clients.forEach((e=>{if((s===2||e!==n)&&e.readyState===r.WebSocket.OPEN){e.send(i)}}))}else{n.send(i)}};o.broadws=t=>{const s=resWsMsg(t,e);o.clients.forEach((e=>{if(e&&e.readyState===r.WebSocket.OPEN){e.send(s)}}))};o.on("error",(s=>{clearWsServerTasks(e,t);e.$log("WS","WS Server error!",s);if(typeof o.close==="function"){o.close((()=>{e.$log("WS","WS Server closed");delete e.serversws[t]}))}}));o.on("close",((s,r)=>{try{e.$log("WS",`WebSocket closed, server ${t}, code: ${s}, reason: ${r?.toString()}`);clearWsServerTasks(e,t)}catch(t){e.$log("WS","WS close handler error:",t)}}));o.on("connection",((r,o)=>{const n=s.maxws||100;const i=e.connectionsws[t]||{};const a=Object.keys(i).length;if(a>=n){e.$log("WS",`WS Connection MAX rejected (${a}/${n})`);const t=JSON.stringify({ty:"publish/web",db:{exit:1,type:"err",lang:"maxws",langpm:`${n}`,con:`max ${n} clients online!`}});r.send(t,(()=>{r.close(1013,"Server busy")}));return}o.Userinfo=getWsUserinfo(o,e)||[];r.Userinfo=o.Userinfo;let c=true;if(s.ckws){c=isOkWs(e,t,r,o)}if(c){loginWs(e,t,r,o)}else{r.close()}}));e.serversws[t]=o}}catch(t){e.$log("WS","ws server:",JSON.stringify(t))}}function isOkWs(e,t,s,r){const n=(0,o.getHostCFG)(t,e);const[i,a,c]=s.Userinfo||[];if(!i){const e=JSON.stringify({ty:"publish/web",db:{exit:1,type:"err",lang:"nousername",con:"no username!"}});s.send(e,(()=>{s.close()}));return false}if(i==="asai"){}else if(e.connectionsws[t]?.[i]){const r=e.connectionsws[t][i];const o={ty:"publish/web",db:{exit:1,type:"err",lang:"logged",langpm:`${i}`,con:`${i} logged in!`}};checkWsIsOn(e,r);if(r?.Userinfo?.[2]===c){o.db.lang="loggedsametk";const e=JSON.stringify(o);s.send(e);r.send(e,(()=>{r.close()}))}else{s.send(JSON.stringify(o))}return false}else{const r=e.connectionsws[t]||{};const o=Object.values(r).find((e=>e.Userinfo?.[2]===c));const a=n.maxonline||100;if(o){const e={ty:"publish/web",db:{exit:1,type:"err",lang:"loggedsametk",langpm:`${i}(${o.Userinfo[0]})`,con:`${i}(${o.Userinfo[0]}) logged in!`}};const t=JSON.stringify(e);s.send(t);o.send(t,(()=>{o.close()}));return false}else if(Object.keys(r).length>=a){const e=JSON.stringify({ty:"publish/web",db:{exit:1,type:"err",lang:"maxlogged",langpm:`${a}`,con:`max ${a} users online!`}});s.send(e,(()=>{s.close()}));return false}}return true}function checkWsIsOn(e,t){if(!t)return;try{t.send(JSON.stringify({ty:"publish/web",db:"pong"}));let s=setTimeout((()=>{if(typeof t.terminate==="function")t.terminate();if(typeof t.close==="function")t.close()}),e?.hostconfig?.tm?.d||3e3);if(typeof t.once==="function"){t.once("message",(()=>{if(s){clearTimeout(s);s=null}}))}}catch{}}function loginWs(e,t,s,n){const[a]=s.Userinfo||[];const c=(0,o.getHostCFG)(t,e);if(c.ckws&&a){if(!s.tasksws)s.tasksws={};e.connectionsws[t][a]=s}s.on("message",(r=>{e.$log("WS","message",r.toString());const o=(0,i.getWorkHandler)("wsWork");if(o){o(r,s,t,n)}}));s.on("close",(()=>{if(c.ckws){if(s.tasksws){Object.values(s.tasksws).forEach((e=>e&&clearInterval(e)));s.tasksws=undefined}if(a&&e.connectionsws[t]?.[a]){delete e.connectionsws[t][a]}}if(s.readyState!==r.WebSocket.CLOSED&&s.readyState!==r.WebSocket.CLOSING){s.close()}}))}},327:module=>{module.exports=eval("require")("bufferutil")},414:module=>{module.exports=eval("require")("utf-8-validate")},181:e=>{"use strict";e.exports=require("buffer")},982:e=>{"use strict";e.exports=require("crypto")},434:e=>{"use strict";e.exports=require("events")},896:e=>{"use strict";e.exports=require("fs")},611:e=>{"use strict";e.exports=require("http")},692:e=>{"use strict";e.exports=require("https")},278:e=>{"use strict";e.exports=require("net")},857:e=>{"use strict";e.exports=require("os")},928:e=>{"use strict";e.exports=require("path")},203:e=>{"use strict";e.exports=require("stream")},756:e=>{"use strict";e.exports=require("tls")},16:e=>{"use strict";e.exports=require("url")},106:e=>{"use strict";e.exports=require("zlib")}};var __webpack_module_cache__={};function __nccwpck_require__(e){var t=__webpack_module_cache__[e];if(t!==undefined){return t.exports}var s=__webpack_module_cache__[e]={exports:{}};var r=true;try{__webpack_modules__[e].call(s.exports,s,s.exports,__nccwpck_require__);r=false}finally{if(r)delete __webpack_module_cache__[e]}return s.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var __webpack_exports__=__nccwpck_require__(546);module.exports=__webpack_exports__})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "asai-nodejs-host",
3
- "version": "0.2.25",
3
+ "version": "0.2.26",
4
4
  "description": "asai for you",
5
5
  "author": "Asai",
6
6
  "license": "ISC",