iosignal 6.1.1 → 6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +269 -0
- package/README.md +176 -57
- package/dist/browser/esm/io.js +1 -1
- package/dist/browser/iife/io.js +1 -1
- package/dist/node/iosignal.cjs +1 -1
- package/dist/node/iosignal.js +1 -1
- package/package.json +1 -1
package/README.ko.md
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# iosignal
|
|
2
|
+
|
|
3
|
+
[English](README.md) | [한국어](README.ko.md)
|
|
4
|
+
|
|
5
|
+
Node.js와 브라우저를 위한 실시간 메시징 라이브러리입니다. WebSocket 기반
|
|
6
|
+
클라이언트·서버 통신, 태그 기반 발행/구독, RPC 서비스를 제공합니다.
|
|
7
|
+
Node.js에서는 TCP 기반 `IOCongSocket`도 사용할 수 있습니다.
|
|
8
|
+
|
|
9
|
+
## 설치
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install iosignal
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
아래 Node.js 예제는 ESM 형식입니다. `.mjs` 파일로 저장하거나 프로젝트의
|
|
16
|
+
`package.json`에 `"type": "module"`을 설정하세요.
|
|
17
|
+
|
|
18
|
+
## 빠른 시작
|
|
19
|
+
|
|
20
|
+
### 서버
|
|
21
|
+
|
|
22
|
+
다음을 `server.mjs`로 저장하고 `node server.mjs`로 실행합니다.
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
import { Server, replyService } from 'iosignal';
|
|
26
|
+
|
|
27
|
+
const server = new Server({ port: 8080 });
|
|
28
|
+
server.attach('reply', replyService);
|
|
29
|
+
|
|
30
|
+
server.on('ready', () => {
|
|
31
|
+
console.log(`Listening on port ${server.port}`);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
process.once('SIGINT', () => server.close());
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
이 예제는 인증 없는 로컬 개발용 서버입니다.
|
|
38
|
+
|
|
39
|
+
### Node.js 클라이언트
|
|
40
|
+
|
|
41
|
+
서버 실행 후 다음을 `client.mjs`로 저장하고 `node client.mjs`로 실행합니다.
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
import { IO } from 'iosignal';
|
|
45
|
+
|
|
46
|
+
const io = new IO('ws://localhost:8080');
|
|
47
|
+
io.on('error', console.error);
|
|
48
|
+
|
|
49
|
+
io.on('ready', async () => {
|
|
50
|
+
try {
|
|
51
|
+
const response = await io.call('reply', 'echo', 'Hello, iosignal!');
|
|
52
|
+
console.log(response.body);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error(error);
|
|
55
|
+
} finally {
|
|
56
|
+
io.stop();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
CommonJS에서도 공개 API를 사용할 수 있습니다.
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
const { IO, Server, replyService } = require('iosignal');
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 발행과 구독
|
|
68
|
+
|
|
69
|
+
연결이 준비되면 `subscribe()`로 태그를 구독하고 `signal()`로 메시지를 보냅니다.
|
|
70
|
+
다음 클라이언트는 메시지를 계속 수신합니다.
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
import { IO } from 'iosignal';
|
|
74
|
+
|
|
75
|
+
const io = new IO('ws://localhost:8080');
|
|
76
|
+
io.on('error', console.error);
|
|
77
|
+
io.on('message', (tag, message) => {
|
|
78
|
+
console.log(tag, message);
|
|
79
|
+
});
|
|
80
|
+
io.on('ready', () => {
|
|
81
|
+
io.subscribe('room');
|
|
82
|
+
io.signal('room', 'Hello, subscribers!');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
process.once('SIGINT', () => io.stop());
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`signal(tag, ...args)`는 문자열, 바이너리, 객체 및 여러 인자를 지원합니다.
|
|
89
|
+
`unsubscribe(tag)`로 구독을 해제할 수 있습니다.
|
|
90
|
+
|
|
91
|
+
## 브라우저
|
|
92
|
+
|
|
93
|
+
번들러를 사용하는 브라우저 프로젝트에서는 브라우저 전용 진입점을 가져옵니다.
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
import IO from 'iosignal/io';
|
|
97
|
+
|
|
98
|
+
const io = new IO('ws://localhost:8080');
|
|
99
|
+
io.on('error', console.error);
|
|
100
|
+
io.on('message', (tag, message) => console.log(tag, message));
|
|
101
|
+
io.on('ready', () => {
|
|
102
|
+
io.subscribe('room');
|
|
103
|
+
io.signal('room', 'Hello from the browser!');
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
브라우저 예제도 위 서버에 연결합니다. HTTPS 페이지에서는 TLS가 구성된
|
|
108
|
+
`wss://` 서버 주소를 사용하세요. 사용이 끝나면 `io.stop()`으로 연결과 자동 재연결을 중단합니다.
|
|
109
|
+
|
|
110
|
+
## 주요 API
|
|
111
|
+
|
|
112
|
+
| API | 용도 |
|
|
113
|
+
| --- | --- |
|
|
114
|
+
| `Server` | WebSocket/TCP 서버 생성 |
|
|
115
|
+
| `IO` | Node.js WebSocket 클라이언트; `iosignal/io`에서는 브라우저 클라이언트 |
|
|
116
|
+
| `IOCongSocket` | Node.js TCP 클라이언트 |
|
|
117
|
+
| `server.attach(name, service)` | RPC 서비스 등록 |
|
|
118
|
+
| `io.call(service, command, ...args)` | RPC 요청 |
|
|
119
|
+
| `io.subscribe(tag)` / `io.unsubscribe(tag)` | 태그 구독 / 해제 |
|
|
120
|
+
| `io.signal(tag, ...args)` | 메시지 발행 |
|
|
121
|
+
| `io.stop()` | 자동 재연결 중단 및 연결 정리 |
|
|
122
|
+
| `server.close(callback)` | 서버 종료 |
|
|
123
|
+
| `BohoAuth` | 서버 인증 관리자 |
|
|
124
|
+
| `StringKeyProvider`, `FileKeyProvider`, `RedisKeyProvider` | 인증 키 공급자 |
|
|
125
|
+
|
|
126
|
+
## boho를 이용한 인증과 암호통신
|
|
127
|
+
|
|
128
|
+
IOSignal은 [boho](https://github.com/remocons/boho)를 사용하여 공유 키 기반
|
|
129
|
+
인증과 메시지 암호화를 제공합니다. boho에는
|
|
130
|
+
[Arduino 구현](https://github.com/remocons/boho-arduino)과 Node.js·브라우저용
|
|
131
|
+
JavaScript 구현이 있어, 직접 만든 장치와 웹앱을 같은 방식으로 연결할 수 있습니다.
|
|
132
|
+
|
|
133
|
+
### 왜 공유 키 기반의 boho인가요?
|
|
134
|
+
|
|
135
|
+
Arduino 장치와 직접 개발한 웹앱, 관리 주체가 같은 서버에서는 양쪽 코드와
|
|
136
|
+
최초 키 설정을 직접 관리할 수 있습니다. 제작 시 USB·직렬 연결로 장치별 키를
|
|
137
|
+
기록하거나, 웹앱 사용자가 별도 경로로 받은 키를 입력하거나, 서버 사이에서
|
|
138
|
+
기존 SSH·TLS 연결로 키를 배포할 수 있습니다.
|
|
139
|
+
|
|
140
|
+
이처럼 안전한 키 설정 경로가 이미 있다면 사전 공유 대칭키로도 인증과 암호통신을
|
|
141
|
+
설계할 수 있습니다. 인증기관 없이 통신할 상대를 정할 수 있으며, 이때 신뢰의
|
|
142
|
+
기반은 키 설정 경로와 양쪽 프로그램입니다. 장치별 키, 안전한 보관과 교체·폐기
|
|
143
|
+
방법은 여전히 필요합니다. 웹앱의 공개 JavaScript 번들에 공통 비밀 키를 넣는
|
|
144
|
+
것은 안전한 키 배포가 아닙니다.
|
|
145
|
+
|
|
146
|
+
boho는 이 환경을 위해 SHA-256 기반 키스트림, XOR 암호화, 공유 키 인증과
|
|
147
|
+
바이너리 패킷을 묶습니다. 차별점은 암호 연산 자체의 새로움보다 **Arduino와
|
|
148
|
+
JavaScript의 호환 구현을 IOSignal의 연결·메시지 전달에 활용할 수 있다는 점**입니다.
|
|
149
|
+
|
|
150
|
+
### XOR와 해시 기반 ‘가상 OTP’
|
|
151
|
+
|
|
152
|
+
XOR는 같은 값으로 두 번 연산하면 원래 값으로 돌아오는 단순한 연산입니다.
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
암호화: 암호문 = 평문 XOR 키스트림
|
|
156
|
+
복호화: 평문 = 암호문 XOR 키스트림
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
진짜 일회용 패드(One-Time Pad, OTP)는 평문과 독립적인 완전한 무작위 패드를
|
|
160
|
+
데이터 길이만큼 준비하고, 비밀로 유지하며 한 번만 사용합니다. 이 조건에서는
|
|
161
|
+
완전한 비밀성을 얻지만, 1MB 데이터마다 새로운 1MB 비밀 패드를 양쪽에 공급해야
|
|
162
|
+
합니다. 같은 패드를 재사용하면 `C1 XOR C2 = P1 XOR P2`로 평문 사이의 관계가
|
|
163
|
+
노출됩니다.
|
|
164
|
+
|
|
165
|
+
boho는 데이터 길이만큼 패드를 저장하는 대신, 비밀 키와 메시지별 값에서
|
|
166
|
+
SHA-256으로 키스트림을 생성합니다. 일반적인 `set_key` 경로는 다음과 같습니다.
|
|
167
|
+
|
|
168
|
+
```text
|
|
169
|
+
K = SHA256(입력 키)
|
|
170
|
+
B = SHA256(K || salt12)
|
|
171
|
+
S_i = SHA256(B || LE32(i)) // i = 1, 2, 3, …
|
|
172
|
+
키스트림 = S_1 || S_2 || … // 평문 길이만큼 사용
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`||`는 바이트열 연결이고, `LE32`는 4바이트 little-endian 정수입니다.
|
|
176
|
+
각 해시 출력은 32바이트입니다. `salt12`는 시각·카운터·nonce로 구성되며,
|
|
177
|
+
수신자도 같은 값과 키를 사용해 키스트림을 재현합니다.
|
|
178
|
+
|
|
179
|
+
‘가상 OTP’는 이 의사난수 키스트림을 설명하는 표현이며 진짜 OTP의 완전한
|
|
180
|
+
비밀성을 뜻하지 않습니다. **공개된 랜덤 값만 해시하면 누구나 같은 출력을
|
|
181
|
+
계산할 수 있으므로 공유 비밀 키가 필요합니다.** 같은 키와 `salt12`의 중복도
|
|
182
|
+
피해야 합니다. XOR만으로 변조를 검출할 수 없어 boho는 데이터 패킷에
|
|
183
|
+
`SHA256(K || salt12 || 평문)`의 앞 8바이트로 계산한 태그도 포함합니다.
|
|
184
|
+
이 태그는 기존 코드의 명칭과 달리 표준 HMAC이 아닙니다.
|
|
185
|
+
|
|
186
|
+
### TLS와 함께 이해하기
|
|
187
|
+
|
|
188
|
+
일반적인 인증서 기반 TLS는 사전에 비밀을 공유하지 않은 상대와 인증·키 합의를
|
|
189
|
+
수행하고 실제 데이터에는 대칭키를 사용합니다. 로그인하지 않은 웹 사용자도
|
|
190
|
+
서버를 인증하고 암호화 연결을 만들 수 있지만, 네트워크 익명성을 제공하는 것은
|
|
191
|
+
아닙니다. 임베디드 환경에서는 인증서·신뢰 루트·시각·갱신 관리와 핸드셰이크
|
|
192
|
+
연산 및 버퍼가 부담이 될 수 있습니다. 키 설정 경로가 이미 있는 작은 시스템은
|
|
193
|
+
이런 구성 중 일부를 줄일 수 있습니다.
|
|
194
|
+
|
|
195
|
+
다만 TLS도 **PSK-only와 PSK+(EC)DHE**를 지원하므로 항상 제3자 인증서나 공개키
|
|
196
|
+
교환이 필요한 것은 아닙니다.
|
|
197
|
+
[TLS 1.3의 PSK 방식](https://www.rfc-editor.org/rfc/rfc8446.html#section-2.2)
|
|
198
|
+
boho가 모든 환경에서 TLS나 표준 대칭키 구현보다 빠르거나 메모리를 덜 사용한다는
|
|
199
|
+
뜻은 아니며 실제 비교에는 측정이 필요합니다.
|
|
200
|
+
|
|
201
|
+
### 연결 암호화와 E2E 데이터 키
|
|
202
|
+
|
|
203
|
+
```text
|
|
204
|
+
Arduino 장치 ←→ IOSignal 서버 ←→ 브라우저 웹앱
|
|
205
|
+
└──────── 별도 E2E 데이터 키 ────────┘
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
연결 인증용 키는 각 클라이언트의 서버 접속 자격을 확인하는 데 사용합니다.
|
|
209
|
+
중계 서버가 메시지 본문을 읽지 못하게 하려면 최종 송수신자만 공유하는 별도
|
|
210
|
+
데이터 키로 `signal_e2e`를 사용하고, 수신 측에서 `decrypt_e2e`로 검증·복호화합니다.
|
|
211
|
+
일반 연결 암호화만으로 종단간 암호화가 되는 것은 아닙니다. 서버는 E2E 메시지의
|
|
212
|
+
전달에 필요한 라우팅 정보를 처리하며 트래픽 크기 등의 메타데이터도 남습니다.
|
|
213
|
+
|
|
214
|
+
현재 JavaScript 구현의 `AUTO` 모드는 TLS를 사용하지 않고 boho 인증이 완료된
|
|
215
|
+
경우 boho 연결 암호화를 사용합니다. E2E 본문 암호화는 연결 보호 여부와 별도입니다.
|
|
216
|
+
위 빠른 시작의 인증 없는 로컬 예제는 boho 인증·암호화를 활성화한 예제가 아닙니다.
|
|
217
|
+
|
|
218
|
+
일반 웹 배포에서는 HTTPS로 웹앱을 제공하고 WSS로 연결하면서 본문에 E2E를
|
|
219
|
+
적용할 수 있습니다. 앱 코드가 변조되면 키와 평문도 노출될 수 있어 E2E에서도
|
|
220
|
+
웹앱 코드 제공자에 대한 신뢰가 필요합니다. boho는 브라우저의 mixed content
|
|
221
|
+
정책을 우회하지 않습니다.
|
|
222
|
+
|
|
223
|
+
### 현재 구현의 적용 조건
|
|
224
|
+
|
|
225
|
+
- 충분히 무작위인 키를 사용하세요. `set_key`의 SHA-256 한 번은 비밀번호용 느린 KDF가 아닙니다.
|
|
226
|
+
- JavaScript는 `crypto.getRandomValues()`를 사용하지만 현재 Arduino 구현의 독립 패킷과 인증 요청의 클라이언트 nonce는 `micros()`에 기반합니다. 이는 암호학적 난수가 아니므로 재시작·장치·통신 방향을 포함해 같은 키와 `salt12`가 반복되지 않는지 검토해야 합니다.
|
|
227
|
+
- boho 자체는 재전송 거부나 challenge 만료를 강제하지 않습니다. 유효한 태그만으로 메시지의 신선도나 명령 실행 권한이 보장되지 않으므로 호출 측과 응용 계층의 수신 정책을 확인해야 합니다.
|
|
228
|
+
- boho는 SHA-256을 조합한 자체 프로토콜입니다. 표준 AEAD/TLS와 동일한 보안 보장이나 장기 키 유출 후 과거 통신을 보호하는 순방향 비밀성을 제공한다고 취급해서는 안 됩니다.
|
|
229
|
+
|
|
230
|
+
## 소스 빌드 및 검증
|
|
231
|
+
|
|
232
|
+
이 저장소의 개발·검증 환경은 Node.js 22와 npm 10을 사용합니다.
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npm ci
|
|
236
|
+
npm run verify
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
`verify`는 공개 파일 정책을 검사하고, `dist`를 삭제한 뒤 번들과 타입 선언을
|
|
240
|
+
재생성합니다. 이어서 자동 테스트와 npm 패키지 포함 파일 검사를 수행합니다.
|
|
241
|
+
|
|
242
|
+
빌드만 실행하려면 `npm run build`, 이미 빌드된 결과의 자동 테스트만 실행하려면
|
|
243
|
+
`npm test`를 사용합니다.
|
|
244
|
+
|
|
245
|
+
### 통신 자동 테스트
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
npm run build
|
|
249
|
+
npm run test:integration
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`test/integration/`은 공개 ESM·CommonJS 빌드 각각에 대해 실제 WebSocket 통신을 검사합니다.
|
|
253
|
+
로컬 루프백(`127.0.0.1`)의 임시 포트를 사용하므로 외부 서버, Redis, 실제 인증키가 필요하지 않습니다.
|
|
254
|
+
|
|
255
|
+
- 연결과 RPC 응답, 없는 명령 및 권한 거부
|
|
256
|
+
- 두 클라이언트 간 문자열·객체·바이너리 발행/구독과 구독 해제
|
|
257
|
+
- 인증 성공 및 암호화된 RPC 응답, 잘못된 인증 거부
|
|
258
|
+
- 연결 종료 후 클라이언트 재사용과 서버 자원 정리
|
|
259
|
+
|
|
260
|
+
`npm test`와 `npm run verify`에도 통신 검사가 포함됩니다. 테스트별 시간 제한과
|
|
261
|
+
전체 테스트 파일 시간 제한을 두며, 종료 시 서버와 클라이언트를 정리합니다.
|
|
262
|
+
실제 브라우저, TLS, TCP 전송 및 Redis 연동 검증은 이 통신 테스트 범위에 포함되지 않습니다.
|
|
263
|
+
|
|
264
|
+
기존 `test/attach-services/`, `test/auth_server_client/`, `test/pubsub-counter/`,
|
|
265
|
+
`test/subscribe-signal/`은 수동 예제입니다. 자동 실행하지 않으며, 일부는 별도 서버나 Redis가 필요합니다.
|
|
266
|
+
|
|
267
|
+
## 라이선스
|
|
268
|
+
|
|
269
|
+
패키지 라이선스: MIT.
|
package/README.md
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
# iosignal
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
클라이언트·서버 통신, 태그 기반 발행/구독, RPC 서비스를 제공합니다.
|
|
5
|
-
Node.js에서는 TCP 기반 `IOCongSocket`도 사용할 수 있습니다.
|
|
3
|
+
[English](README.md) | [한국어](README.ko.md)
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
A real-time messaging library for Node.js and browsers, providing WebSocket
|
|
6
|
+
client–server communication, tag-based publish/subscribe and RPC services.
|
|
7
|
+
Node.js also supports TCP through `IOCongSocket`.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
8
10
|
|
|
9
11
|
```bash
|
|
10
12
|
npm install iosignal
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
`
|
|
15
|
+
The Node.js examples below use ESM. Save them as `.mjs` files or set
|
|
16
|
+
`"type": "module"` in your project's `package.json`.
|
|
15
17
|
|
|
16
|
-
##
|
|
18
|
+
## Quick start
|
|
17
19
|
|
|
18
|
-
###
|
|
20
|
+
### Server
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
Save the following as `server.mjs` and run `node server.mjs`.
|
|
21
23
|
|
|
22
24
|
```js
|
|
23
25
|
import { Server, replyService } from 'iosignal';
|
|
@@ -32,11 +34,12 @@ server.on('ready', () => {
|
|
|
32
34
|
process.once('SIGINT', () => server.close());
|
|
33
35
|
```
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
This is a local development server without authentication.
|
|
36
38
|
|
|
37
|
-
### Node.js
|
|
39
|
+
### Node.js client
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
After starting the server, save the following as `client.mjs` and run
|
|
42
|
+
`node client.mjs`.
|
|
40
43
|
|
|
41
44
|
```js
|
|
42
45
|
import { IO } from 'iosignal';
|
|
@@ -56,16 +59,16 @@ io.on('ready', async () => {
|
|
|
56
59
|
});
|
|
57
60
|
```
|
|
58
61
|
|
|
59
|
-
|
|
62
|
+
The public API is also available from CommonJS.
|
|
60
63
|
|
|
61
64
|
```js
|
|
62
65
|
const { IO, Server, replyService } = require('iosignal');
|
|
63
66
|
```
|
|
64
67
|
|
|
65
|
-
##
|
|
68
|
+
## Publish and subscribe
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
|
|
70
|
+
Once connected, use `subscribe()` to subscribe to a tag and `signal()` to send
|
|
71
|
+
messages. The following client keeps receiving messages.
|
|
69
72
|
|
|
70
73
|
```js
|
|
71
74
|
import { IO } from 'iosignal';
|
|
@@ -83,12 +86,12 @@ io.on('ready', () => {
|
|
|
83
86
|
process.once('SIGINT', () => io.stop());
|
|
84
87
|
```
|
|
85
88
|
|
|
86
|
-
`signal(tag, ...args)
|
|
87
|
-
`unsubscribe(tag)
|
|
89
|
+
`signal(tag, ...args)` supports strings, binary data, objects and multiple
|
|
90
|
+
arguments. Use `unsubscribe(tag)` to unsubscribe.
|
|
88
91
|
|
|
89
|
-
##
|
|
92
|
+
## Browsers
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
For browser projects using a bundler, import the browser-specific entry point.
|
|
92
95
|
|
|
93
96
|
```js
|
|
94
97
|
import IO from 'iosignal/io';
|
|
@@ -102,62 +105,178 @@ io.on('ready', () => {
|
|
|
102
105
|
});
|
|
103
106
|
```
|
|
104
107
|
|
|
105
|
-
|
|
106
|
-
`wss://`
|
|
108
|
+
This browser example connects to the same server above. From an HTTPS page,
|
|
109
|
+
use a `wss://` server URL with TLS configured. When finished, call `io.stop()`
|
|
110
|
+
to close the connection and stop automatic reconnection.
|
|
107
111
|
|
|
108
|
-
##
|
|
112
|
+
## Main APIs
|
|
109
113
|
|
|
110
|
-
| API |
|
|
114
|
+
| API | Purpose |
|
|
111
115
|
| --- | --- |
|
|
112
|
-
| `Server` | WebSocket/TCP
|
|
113
|
-
| `IO` | Node.js WebSocket
|
|
114
|
-
| `IOCongSocket` | Node.js TCP
|
|
115
|
-
| `server.attach(name, service)` | RPC
|
|
116
|
-
| `io.call(service, command, ...args)` | RPC
|
|
117
|
-
| `io.subscribe(tag)` / `io.unsubscribe(tag)` |
|
|
118
|
-
| `io.signal(tag, ...args)` |
|
|
119
|
-
| `io.stop()` |
|
|
120
|
-
| `server.close(callback)` |
|
|
121
|
-
| `BohoAuth` |
|
|
122
|
-
| `StringKeyProvider`, `FileKeyProvider`, `RedisKeyProvider` |
|
|
123
|
-
|
|
124
|
-
##
|
|
125
|
-
|
|
126
|
-
|
|
116
|
+
| `Server` | Create a WebSocket/TCP server |
|
|
117
|
+
| `IO` | Node.js WebSocket client; the browser client when imported from `iosignal/io` |
|
|
118
|
+
| `IOCongSocket` | Node.js TCP client |
|
|
119
|
+
| `server.attach(name, service)` | Register an RPC service |
|
|
120
|
+
| `io.call(service, command, ...args)` | Make an RPC request |
|
|
121
|
+
| `io.subscribe(tag)` / `io.unsubscribe(tag)` | Subscribe / unsubscribe |
|
|
122
|
+
| `io.signal(tag, ...args)` | Publish a message |
|
|
123
|
+
| `io.stop()` | Stop automatic reconnection and clean up the connection |
|
|
124
|
+
| `server.close(callback)` | Shut down the server |
|
|
125
|
+
| `BohoAuth` | Server authentication manager |
|
|
126
|
+
| `StringKeyProvider`, `FileKeyProvider`, `RedisKeyProvider` | Authentication key providers |
|
|
127
|
+
|
|
128
|
+
## Authentication and encrypted communication with Boho
|
|
129
|
+
|
|
130
|
+
IOSignal uses [Boho](https://github.com/remocons/boho) for shared-key authentication
|
|
131
|
+
and message encryption. Boho has an
|
|
132
|
+
[Arduino implementation](https://github.com/remocons/boho-arduino) and a JavaScript
|
|
133
|
+
implementation for Node.js and browsers, allowing DIY devices and web apps to use
|
|
134
|
+
the same approach.
|
|
135
|
+
|
|
136
|
+
### Why shared-key Boho?
|
|
137
|
+
|
|
138
|
+
With Arduino devices, your own web apps and servers under common administration,
|
|
139
|
+
you can control both endpoint code and initial key provisioning. Device-specific
|
|
140
|
+
keys can be installed over USB/serial during setup, web app users can enter keys
|
|
141
|
+
obtained through another channel, and servers can distribute keys through
|
|
142
|
+
existing SSH/TLS connections.
|
|
143
|
+
|
|
144
|
+
When a secure provisioning path already exists, pre-shared symmetric keys can
|
|
145
|
+
support authentication and encrypted communication. You can establish peers
|
|
146
|
+
without a certificate authority; trust rests on the provisioning path and
|
|
147
|
+
endpoint software. Device-specific keys, secure storage, rotation and revocation
|
|
148
|
+
are still necessary. Embedding a common secret in a public JavaScript bundle is
|
|
149
|
+
not secure key distribution.
|
|
150
|
+
|
|
151
|
+
Boho combines a SHA-256-based keystream, XOR encryption, shared-key authentication
|
|
152
|
+
and binary packets for this environment. Its distinction is **compatible Arduino
|
|
153
|
+
and JavaScript implementations integrated with IOSignal connections and message
|
|
154
|
+
delivery**, rather than novelty in the cryptographic operations themselves.
|
|
155
|
+
|
|
156
|
+
### XOR and a hash-based “virtual OTP”
|
|
157
|
+
|
|
158
|
+
XOR is a simple operation that restores the original value when applied twice
|
|
159
|
+
with the same value.
|
|
160
|
+
|
|
161
|
+
```text
|
|
162
|
+
Encryption: ciphertext = plaintext XOR keystream
|
|
163
|
+
Decryption: plaintext = ciphertext XOR keystream
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
A true one-time pad (OTP) uses a uniformly random pad independent of the
|
|
167
|
+
plaintext, as long as the data, kept secret and used only once. This provides
|
|
168
|
+
perfect secrecy, but requires supplying both endpoints with a new 1 MB secret
|
|
169
|
+
pad for every 1 MB of data. Reusing a pad exposes `C1 XOR C2 = P1 XOR P2`, revealing
|
|
170
|
+
a relationship between plaintexts.
|
|
171
|
+
|
|
172
|
+
Instead of storing a pad as large as the data, Boho generates a SHA-256 keystream
|
|
173
|
+
from a secret key and message-specific values. The usual `set_key` path is:
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
K = SHA256(input key)
|
|
177
|
+
B = SHA256(K || salt12)
|
|
178
|
+
S_i = SHA256(B || LE32(i)) // i = 1, 2, 3, …
|
|
179
|
+
keystream = S_1 || S_2 || … // use only the plaintext length
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
`||` means byte concatenation; `LE32` is a four-byte little-endian integer. Each
|
|
183
|
+
hash output is 32 bytes. `salt12` contains time, counter and nonce values, and
|
|
184
|
+
the receiver reproduces the stream using the same values and key.
|
|
185
|
+
|
|
186
|
+
“Virtual OTP” describes this pseudorandom stream, not the perfect secrecy of a
|
|
187
|
+
true OTP. **Public random values alone can be hashed by anyone, so a shared secret
|
|
188
|
+
key is required.** Repeating the same key and `salt12` must also be avoided. XOR
|
|
189
|
+
alone does not detect tampering, so Boho data packets include the first eight
|
|
190
|
+
bytes of `SHA256(K || salt12 || plaintext)` as a tag. Despite legacy names in the
|
|
191
|
+
code, this tag is not standard HMAC.
|
|
192
|
+
|
|
193
|
+
### Understanding the relationship with TLS
|
|
194
|
+
|
|
195
|
+
Typical certificate-based TLS authenticates peers and establishes keys without a
|
|
196
|
+
previously shared secret, then uses symmetric encryption for application data.
|
|
197
|
+
Even web users who have not logged in can authenticate the server and establish
|
|
198
|
+
an encrypted connection, but this does not provide network anonymity. On embedded
|
|
199
|
+
devices, certificate, trust-root, clock and renewal management, handshake work
|
|
200
|
+
and buffers can be burdensome. Small systems with an existing provisioning path
|
|
201
|
+
may be able to omit some of this machinery.
|
|
202
|
+
|
|
203
|
+
However, TLS supports **PSK-only and PSK with (EC)DHE**, so it does not always
|
|
204
|
+
require third-party certificates or public-key exchange.
|
|
205
|
+
[TLS 1.3 pre-shared keys](https://www.rfc-editor.org/rfc/rfc8446.html#section-2.2)
|
|
206
|
+
This does not mean Boho is faster or uses less memory than every TLS or standard
|
|
207
|
+
symmetric implementation; actual comparisons require measurement.
|
|
208
|
+
|
|
209
|
+
### Connection encryption and E2E data keys
|
|
210
|
+
|
|
211
|
+
```text
|
|
212
|
+
Arduino device ←→ IOSignal server ←→ Browser app
|
|
213
|
+
└──────── Separate E2E data key ────────┘
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Connection credentials establish each client's right to connect to the server.
|
|
217
|
+
To keep a message body confidential from a relay, use `signal_e2e` with a separate
|
|
218
|
+
data key held only by the final endpoints, then verify and decrypt it with
|
|
219
|
+
`decrypt_e2e` at the receiver. Ordinary connection encryption is not automatically
|
|
220
|
+
end-to-end encryption. The server processes routing information for E2E delivery,
|
|
221
|
+
and metadata such as traffic sizes remains visible.
|
|
222
|
+
|
|
223
|
+
The current JavaScript implementation's `AUTO` mode uses Boho connection
|
|
224
|
+
encryption when TLS is not used and Boho authentication is complete. E2E body
|
|
225
|
+
encryption is separate from connection protection. The unauthenticated local
|
|
226
|
+
quick-start examples above do not enable Boho authentication/encryption.
|
|
227
|
+
|
|
228
|
+
Normal web deployments can serve app code over HTTPS and connect over WSS while
|
|
229
|
+
also applying E2E to message bodies. Modified app code can expose keys and
|
|
230
|
+
plaintext, so E2E still requires trust in the app code provider. Boho does not
|
|
231
|
+
bypass browser mixed content rules.
|
|
232
|
+
|
|
233
|
+
### Conditions in the current implementation
|
|
234
|
+
|
|
235
|
+
- Use sufficiently random keys. A single SHA-256 in `set_key` is not a slow password KDF.
|
|
236
|
+
- JavaScript uses `crypto.getRandomValues()`, but current Arduino standalone-packet nonces and the authentication client nonce use `micros()`. This is not cryptographic randomness; consider repeated key/`salt12` combinations across restarts, devices and communication directions.
|
|
237
|
+
- Boho itself does not enforce replay rejection or challenge expiry. A valid tag alone does not establish freshness or permission to execute a command; check receive policies in the caller and application layer.
|
|
238
|
+
- Boho is a custom SHA-256-based protocol. Do not assume standard AEAD/TLS guarantees or forward secrecy protecting past traffic after a long-term key leak.
|
|
239
|
+
|
|
240
|
+
## Building and verification
|
|
241
|
+
|
|
242
|
+
This repository uses Node.js 22 and npm 10 for development and verification.
|
|
127
243
|
|
|
128
244
|
```bash
|
|
129
245
|
npm ci
|
|
130
246
|
npm run verify
|
|
131
247
|
```
|
|
132
248
|
|
|
133
|
-
`verify
|
|
134
|
-
|
|
249
|
+
`verify` checks the public-file policy, removes `dist` and rebuilds bundles and
|
|
250
|
+
type declarations. It then runs automated tests and checks the npm package file
|
|
251
|
+
list.
|
|
135
252
|
|
|
136
|
-
|
|
137
|
-
`npm test`를 사용합니다.
|
|
253
|
+
Use `npm run build` to build only, or `npm test` to test an existing build.
|
|
138
254
|
|
|
139
|
-
###
|
|
255
|
+
### Automated communication tests
|
|
140
256
|
|
|
141
257
|
```bash
|
|
142
258
|
npm run build
|
|
143
259
|
npm run test:integration
|
|
144
260
|
```
|
|
145
261
|
|
|
146
|
-
`test/integration
|
|
147
|
-
|
|
262
|
+
`test/integration/` tests actual WebSocket communication for both public ESM and
|
|
263
|
+
CommonJS builds. It uses temporary ports on local loopback (`127.0.0.1`), so it
|
|
264
|
+
requires no external server, Redis instance or real authentication credentials.
|
|
148
265
|
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
266
|
+
- Connections, RPC responses, unknown commands and permission denial
|
|
267
|
+
- String, object and binary publish/subscribe between two clients, including unsubscribe
|
|
268
|
+
- Successful authentication and encrypted RPC responses, plus rejection of invalid authentication
|
|
269
|
+
- Client reuse and server resource cleanup after disconnection
|
|
153
270
|
|
|
154
|
-
`npm test
|
|
155
|
-
|
|
156
|
-
|
|
271
|
+
These communication checks are included in `npm test` and `npm run verify`.
|
|
272
|
+
Individual tests and test files have time limits, and connections and servers
|
|
273
|
+
are cleaned up on completion. Actual browsers, TLS, TCP transport and Redis
|
|
274
|
+
integration are outside their scope.
|
|
157
275
|
|
|
158
|
-
|
|
159
|
-
`test/subscribe-signal
|
|
276
|
+
Existing `test/attach-services/`, `test/auth_server_client/`,
|
|
277
|
+
`test/pubsub-counter/` and `test/subscribe-signal/` are manual examples. They are
|
|
278
|
+
not run automatically, and some require a separate server or Redis.
|
|
160
279
|
|
|
161
|
-
##
|
|
280
|
+
## License
|
|
162
281
|
|
|
163
|
-
|
|
282
|
+
Package license: MIT.
|
package/dist/browser/esm/io.js
CHANGED
|
@@ -19,5 +19,5 @@ var s=(r||(r=1,function(r){const n=function(){if(t)return i;t=1,i.byteLength=fun
|
|
|
19
19
|
*
|
|
20
20
|
* @author Feross Aboukhadijeh <https://feross.org>
|
|
21
21
|
* @license MIT
|
|
22
|
-
*/var Yt=(zt||(zt=1,function(t){const e=function(){if(Dt)return Ht;Dt=1,Ht.byteLength=function(t){var e=o(t),r=e[0],n=e[1];return 3*(r+n)/4-n},Ht.toByteArray=function(t){var n,i,s=o(t),f=s[0],u=s[1],h=new r(function(t,e,r){return 3*(e+r)/4-r}(0,f,u)),a=0,c=u>0?f-4:f;for(i=0;i<c;i+=4)n=e[t.charCodeAt(i)]<<18|e[t.charCodeAt(i+1)]<<12|e[t.charCodeAt(i+2)]<<6|e[t.charCodeAt(i+3)],h[a++]=n>>16&255,h[a++]=n>>8&255,h[a++]=255&n;return 2===u&&(n=e[t.charCodeAt(i)]<<2|e[t.charCodeAt(i+1)]>>4,h[a++]=255&n),1===u&&(n=e[t.charCodeAt(i)]<<10|e[t.charCodeAt(i+1)]<<4|e[t.charCodeAt(i+2)]>>2,h[a++]=n>>8&255,h[a++]=255&n),h},Ht.fromByteArray=function(e){for(var r,n=e.length,i=n%3,o=[],s=16383,u=0,h=n-i;u<h;u+=s)o.push(f(e,u,u+s>h?h:u+s));return 1===i?(r=e[n-1],o.push(t[r>>2]+t[r<<4&63]+"==")):2===i&&(r=(e[n-2]<<8)+e[n-1],o.push(t[r>>10]+t[r>>4&63]+t[r<<2&63]+"=")),o.join("")};for(var t=[],e=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0;i<64;++i)t[i]=n[i],e[n.charCodeAt(i)]=i;function o(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function s(e){return t[e>>18&63]+t[e>>12&63]+t[e>>6&63]+t[63&e]}function f(t,e,r){for(var n,i=[],o=e;o<r;o+=3)n=(t[o]<<16&16711680)+(t[o+1]<<8&65280)+(255&t[o+2]),i.push(s(n));return i.join("")}return e["-".charCodeAt(0)]=62,e["_".charCodeAt(0)]=63,Ht}(),r=Gt(),n="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=s,t.SlowBuffer=function(t){return+t!=t&&(t=0),s.alloc(+t)},t.INSPECT_MAX_BYTES=50;const i=2147483647;function o(t){if(t>i)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,s.prototype),e}function s(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return h(t)}return f(t,e,r)}function f(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!s.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|p(t,e);let n=o(r);const i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(q(t,Uint8Array)){const e=new Uint8Array(t);return c(e.buffer,e.byteOffset,e.byteLength)}return a(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(q(t,ArrayBuffer)||t&&q(t.buffer,ArrayBuffer))return c(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(q(t,SharedArrayBuffer)||t&&q(t.buffer,SharedArrayBuffer)))return c(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return s.from(n,e,r);const i=function(t){if(s.isBuffer(t)){const e=0|l(t.length),r=o(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||K(t.length)?o(0):a(t):"Buffer"===t.type&&Array.isArray(t.data)?a(t.data):void 0}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return s.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function u(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function h(t){return u(t),o(t<0?0:0|l(t))}function a(t){const e=t.length<0?0:0|l(t.length),r=o(e);for(let n=0;n<e;n+=1)r[n]=255&t[n];return r}function c(t,e,r){if(e<0||t.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(t.byteLength<e+(r||0))throw new RangeError('"length" is outside of buffer bounds');let n;return n=void 0===e&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,e):new Uint8Array(t,e,r),Object.setPrototypeOf(n,s.prototype),n}function l(t){if(t>=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|t}function p(t,e){if(s.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||q(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let i=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return V(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return G(t).length;default:if(i)return n?-1:V(t).length;e=(""+e).toLowerCase(),i=!0}}function y(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return I(this,e,r);case"ascii":return U(this,e,r);case"latin1":case"binary":return L(this,e,r);case"base64":return A(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function d(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),K(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=s.from(e,n)),s.isBuffer(e))return 0===e.length?-1:b(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):b(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function b(t,e,r,n,i){let o,s=1,f=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,f/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){let n=-1;for(o=r;o<f;o++)if(h(t,o)===h(e,-1===n?0:o-n)){if(-1===n&&(n=o),o-n+1===u)return n*s}else-1!==n&&(o-=o-n),n=-1}else for(r+u>f&&(r=f-u),o=r;o>=0;o--){let r=!0;for(let n=0;n<u;n++)if(h(t,o+n)!==h(e,n)){r=!1;break}if(r)return o}return-1}function w(t,e,r,n){r=Number(r)||0;const i=t.length-r;n?(n=Number(n))>i&&(n=i):n=i;const o=e.length;let s;for(n>o/2&&(n=o/2),s=0;s<n;++s){const n=parseInt(e.substr(2*s,2),16);if(K(n))return s;t[r+s]=n}return s}function E(t,e,r,n){return Y(V(e,t.length-r),t,r,n)}function B(t,e,r,n){return Y(function(t){const e=[];for(let r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function m(t,e,r,n){return Y(G(e),t,r,n)}function _(t,e,r,n){return Y(function(t,e){let r,n,i;const o=[];for(let s=0;s<t.length&&!((e-=2)<0);++s)r=t.charCodeAt(s),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function A(t,r,n){return 0===r&&n===t.length?e.fromByteArray(t):e.fromByteArray(t.slice(r,n))}function I(t,e,r){r=Math.min(t.length,r);const n=[];let i=e;for(;i<r;){const e=t[i];let o=null,s=e>239?4:e>223?3:e>191?2:1;if(i+s<=r){let r,n,f,u;switch(s){case 1:e<128&&(o=e);break;case 2:r=t[i+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(o=u));break;case 3:r=t[i+1],n=t[i+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(o=u));break;case 4:r=t[i+1],n=t[i+2],f=t[i+3],128==(192&r)&&128==(192&n)&&128==(192&f)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&f,u>65535&&u<1114112&&(o=u))}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){const e=t.length;if(e<=v)return String.fromCharCode.apply(String,t);let r="",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=v));return r}(n)}t.kMaxLength=i,s.TYPED_ARRAY_SUPPORT=function(){try{const t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}(),s.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(s.prototype,"parent",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.buffer}}),Object.defineProperty(s.prototype,"offset",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.byteOffset}}),s.poolSize=8192,s.from=function(t,e,r){return f(t,e,r)},Object.setPrototypeOf(s.prototype,Uint8Array.prototype),Object.setPrototypeOf(s,Uint8Array),s.alloc=function(t,e,r){return function(t,e,r){return u(t),t<=0?o(t):void 0!==e?"string"==typeof r?o(t).fill(e,r):o(t).fill(e):o(t)}(t,e,r)},s.allocUnsafe=function(t){return h(t)},s.allocUnsafeSlow=function(t){return h(t)},s.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==s.prototype},s.compare=function(t,e){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),q(e,Uint8Array)&&(e=s.from(e,e.offset,e.byteLength)),!s.isBuffer(t)||!s.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let r=t.length,n=e.length;for(let i=0,o=Math.min(r,n);i<o;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},s.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(t,e){if(!Array.isArray(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return s.alloc(0);let r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;const n=s.allocUnsafe(e);let i=0;for(r=0;r<t.length;++r){let e=t[r];if(q(e,Uint8Array))i+e.length>n.length?(s.isBuffer(e)||(e=s.from(e)),e.copy(n,i)):Uint8Array.prototype.set.call(n,e,i);else{if(!s.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,i)}i+=e.length}return n},s.byteLength=p,s.prototype._isBuffer=!0,s.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;e<t;e+=2)g(this,e,e+1);return this},s.prototype.swap32=function(){const t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t;e+=4)g(this,e,e+3),g(this,e+1,e+2);return this},s.prototype.swap64=function(){const t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let e=0;e<t;e+=8)g(this,e,e+7),g(this,e+1,e+6),g(this,e+2,e+5),g(this,e+3,e+4);return this},s.prototype.toString=function(){const t=this.length;return 0===t?"":0===arguments.length?I(this,0,t):y.apply(this,arguments)},s.prototype.toLocaleString=s.prototype.toString,s.prototype.equals=function(t){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===s.compare(this,t)},s.prototype.inspect=function(){let e="";const r=t.INSPECT_MAX_BYTES;return e=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(e+=" ... "),"<Buffer "+e+">"},n&&(s.prototype[n]=s.prototype.inspect),s.prototype.compare=function(t,e,r,n,i){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),!s.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;let o=(i>>>=0)-(n>>>=0),f=(r>>>=0)-(e>>>=0);const u=Math.min(o,f),h=this.slice(n,i),a=t.slice(e,r);for(let t=0;t<u;++t)if(h[t]!==a[t]){o=h[t],f=a[t];break}return o<f?-1:f<o?1:0},s.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},s.prototype.indexOf=function(t,e,r){return d(this,t,e,r,!0)},s.prototype.lastIndexOf=function(t,e,r){return d(this,t,e,r,!1)},s.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let o=!1;for(;;)switch(n){case"hex":return w(this,t,e,r);case"utf8":case"utf-8":return E(this,t,e,r);case"ascii":case"latin1":case"binary":return B(this,t,e,r);case"base64":return m(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const v=4096;function U(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function L(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function T(t,e,r){const n=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>n)&&(r=n);let i="";for(let n=e;n<r;++n)i+=J[t[n]];return i}function S(t,e,r){const n=t.slice(e,r);let i="";for(let t=0;t<n.length-1;t+=2)i+=String.fromCharCode(n[t]+256*n[t+1]);return i}function R(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function O(t,e,r,n,i,o){if(!s.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<o)throw new RangeError('"value" argument is out of bounds');if(r+n>t.length)throw new RangeError("Index out of range")}function M(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,r}function C(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r+7]=o,o>>=8,t[r+6]=o,o>>=8,t[r+5]=o,o>>=8,t[r+4]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s>>=8,t[r+2]=s,s>>=8,t[r+1]=s,s>>=8,t[r]=s,r+8}function N(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function k(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,4),r.write(t,e,n,i,23,4),n+4}function x(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,8),r.write(t,e,n,i,52,8),n+8}s.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t);const n=this.subarray(t,e);return Object.setPrototypeOf(n,s.prototype),n},s.prototype.readUintLE=s.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return n},s.prototype.readUintBE=s.prototype.readUIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t+--e],i=1;for(;e>0&&(i*=256);)n+=this[t+--e]*i;return n},s.prototype.readUint8=s.prototype.readUInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),this[t]},s.prototype.readUint16LE=s.prototype.readUInt16LE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]|this[t+1]<<8},s.prototype.readUint16BE=s.prototype.readUInt16BE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]<<8|this[t+1]},s.prototype.readUint32LE=s.prototype.readUInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},s.prototype.readUint32BE=s.prototype.readUInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},s.prototype.readBigUInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,i=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(i)<<BigInt(32))}),s.prototype.readBigUInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],i=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<<BigInt(32))+BigInt(i)}),s.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return i*=128,n>=i&&(n-=Math.pow(2,8*e)),n},s.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=e,i=1,o=this[t+--n];for(;n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},s.prototype.readInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},s.prototype.readInt16LE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},s.prototype.readInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},s.prototype.readBigInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<<BigInt(32))+BigInt(e+256*this[++t]+65536*this[++t]+this[++t]*2**24)}),s.prototype.readBigInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<<BigInt(32))+BigInt(this[++t]*2**24+65536*this[++t]+256*this[++t]+r)}),s.prototype.readFloatLE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!0,23,4)},s.prototype.readFloatBE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!1,23,4)},s.prototype.readDoubleLE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!0,52,8)},s.prototype.readDoubleBE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!1,52,8)},s.prototype.writeUintLE=s.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=1,o=0;for(this[e]=255&t;++o<r&&(i*=256);)this[e+o]=t/i&255;return e+r},s.prototype.writeUintBE=s.prototype.writeUIntBE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=r-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+r},s.prototype.writeUint8=s.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,255,0),this[e]=255&t,e+1},s.prototype.writeUint16LE=s.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeUint16BE=s.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeUint32LE=s.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},s.prototype.writeUint32BE=s.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigUInt64LE=Q(function(t,e=0){return M(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeBigUInt64BE=Q(function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=0,o=1,s=0;for(this[e]=255&t;++i<r&&(o*=256);)t<0&&0===s&&0!==this[e+i-1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=r-1,o=1,s=0;for(this[e+i]=255&t;--i>=0&&(o*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},s.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},s.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigInt64LE=Q(function(t,e=0){return M(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeBigInt64BE=Q(function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeFloatLE=function(t,e,r){return k(this,t,e,!0,r)},s.prototype.writeFloatBE=function(t,e,r){return k(this,t,e,!1,r)},s.prototype.writeDoubleLE=function(t,e,r){return x(this,t,e,!0,r)},s.prototype.writeDoubleBE=function(t,e,r){return x(this,t,e,!1,r)},s.prototype.copy=function(t,e,r,n){if(!s.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);const i=n-r;return this===t&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(e,r,n):Uint8Array.prototype.set.call(t,this.subarray(r,n),e),i},s.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){const e=t.charCodeAt(0);("utf8"===n&&e<128||"latin1"===n)&&(t=e)}}else"number"==typeof t?t&=255:"boolean"==typeof t&&(t=Number(t));if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;let i;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(i=e;i<r;++i)this[i]=t;else{const o=s.isBuffer(t)?t:s.from(t,n),f=o.length;if(0===f)throw new TypeError('The value "'+t+'" is invalid for argument "value"');for(i=0;i<r-e;++i)this[i+e]=o[i%f]}return this};const P={};function $(t,e,r){P[t]=class extends r{constructor(){super(),Object.defineProperty(this,"message",{value:e.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${t}]`,this.stack,delete this.name}get code(){return t}set code(t){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:t,writable:!0})}toString(){return`${this.name} [${t}]: ${this.message}`}}}function D(t){let e="",r=t.length;const n="-"===t[0]?1:0;for(;r>=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function j(t,e,r,n,i,o){if(t>r||t<e){const r="bigint"==typeof e?"n":"";let n;throw n=0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(o+1)}${r}`:`>= -(2${r} ** ${8*(o+1)-1}${r}) and < 2 ** ${8*(o+1)-1}${r}`,new P.ERR_OUT_OF_RANGE("value",n,t)}!function(t,e,r){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||F(e,t.length-(r+1))}(n,i,o)}function z(t,e){if("number"!=typeof t)throw new P.ERR_INVALID_ARG_TYPE(e,"number",t)}function F(t,e,r){if(Math.floor(t)!==t)throw z(t,r),new P.ERR_OUT_OF_RANGE("offset","an integer",t);if(e<0)throw new P.ERR_BUFFER_OUT_OF_BOUNDS;throw new P.ERR_OUT_OF_RANGE("offset",`>= 0 and <= ${e}`,t)}$("ERR_BUFFER_OUT_OF_BOUNDS",function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),$("ERR_INVALID_ARG_TYPE",function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`},TypeError),$("ERR_OUT_OF_RANGE",function(t,e,r){let n=`The value of "${t}" is out of range.`,i=r;return Number.isInteger(r)&&Math.abs(r)>2**32?i=D(String(r)):"bigint"==typeof r&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=D(i)),i+="n"),n+=` It must be ${e}. Received ${i}`,n},RangeError);const H=/[^+/0-9A-Za-z-_]/g;function V(t,e){let r;e=e||1/0;const n=t.length;let i=null;const o=[];for(let s=0;s<n;++s){if(r=t.charCodeAt(s),r>55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function G(t){return e.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(H,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Y(t,e,r,n){let i;for(i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function q(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function K(t){return t!=t}const J=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let i=0;i<16;++i)e[n+i]=t[r]+t[i]}return e}();function Q(t){return"undefined"==typeof BigInt?W:t}function W(){throw new Error("BigInt not supported")}}(Ft)),Ft);let qt={SERVER_TIME_NONCE:176,AUTH_REQ:177,AUTH_RES:178,AUTH_FAIL:179,ENC_PACK:182,ENC_E2E:183,ENC_488:184};for(let t in qt)qt[qt[t]]=t;const Kt={SERVER_TIME_NONCE:Pt.meta(Pt.MB("header","8",0),Pt.MB("unixTime","32L",0),Pt.MB("milTime","16L",0),Pt.MB("counter","16L",0),Pt.MB("nonce",Yt.Buffer.alloc(4))),AUTH_REQ:Pt.meta(Pt.MB("header","8",0),Pt.MB("id8",Yt.Buffer.alloc(8)),Pt.MB("nonce",Yt.Buffer.alloc(4)),Pt.MB("hmac32",Yt.Buffer.alloc(32))),AUTH_RES:Pt.meta(Pt.MB("header","8",0),Pt.MB("hmac32",Yt.Buffer.alloc(32))),ENC_PACK:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("salt12",Yt.Buffer.alloc(12)),Pt.MB("hmac",8,0)),ENC_488:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("otpSrc8",Yt.Buffer.alloc(8)),Pt.MB("hmac8",Yt.Buffer.alloc(8)))};function Jt(t){let e=t[t.length-1];return e[2]+e[3]}const Qt={SERVER_TIME_NONCE:Jt(Kt.SERVER_TIME_NONCE),AUTH_REQ:Jt(Kt.AUTH_REQ),AUTH_RES:Jt(Kt.AUTH_RES),ENC_PACK:Jt(Kt.ENC_PACK),ENC_488:Jt(Kt.ENC_488)};function Wt(t,e){if(!(t instanceof Uint8Array&&e instanceof Uint8Array&&t.length===e.length))return!1;let r=0;for(let n=0;n<t.length;n++)r|=t[n]^e[n];return 0===r}function Xt(t,e,r,n,i=!1){if(!(t instanceof Uint8Array))return;const o=Yt.Buffer.from(t);return o.length<r||o[0]!==e||(i?o.readUInt32LE(1)!==o.length-r:o.length!==r)?void 0:Pt.unpack(o,n)}function Zt(t){return globalThis.crypto.getRandomValues(Yt.Buffer.alloc(t))}class te{constructor(){this._id8=Yt.Buffer.alloc(8),this._otpSrc44=Yt.Buffer.alloc(44),this._otp36=Yt.Buffer.alloc(36),this._hmac=Yt.Buffer.alloc(32),this.auth_salt12=Yt.Buffer.alloc(12),this.localNonce=Yt.Buffer.alloc(4),this.remoteNonce=Yt.Buffer.alloc(4),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}clearAuth(){this._id8.fill(0),this._otpSrc44.fill(0),this._otp36.fill(0),this._hmac.fill(0),this.auth_salt12.fill(0),this.localNonce.fill(0),this.remoteNonce.fill(0),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}set_hash_id8(t){Pt.B8($t.hash(t)).copy(this._id8,0,0,8)}set_id8(t){let e=Pt.B8(t);this._id8.fill(0),e.copy(this._id8,0,0,8)}set_key(t){const e=Pt.B8(t);if(!e||0===e.length)throw new TypeError("Key must not be empty");this.copy_key(Pt.B8($t.hash(e)))}set_id_key(t){let e=t.indexOf(".");if(-1==e)return;let r=t.substring(0,e),n=t.substring(e+1);this.set_id8(r),this.set_key(n)}copy_id8(t){t.copy(this._id8,0,0,8)}copy_key(t){if(!(t instanceof Uint8Array)||32!==t.length)throw new TypeError("copy_key requires exactly 32 bytes");this._otpSrc44.set(t,0),this._hasKey=!0}sha256_n(t,e){let r=$t.hash(t);for(let t=0;t<e;t++)r=$t.hash(r);return r}set_clock_rand(){this.set_clock_nonce(Zt(4))}set_clock_nonce(t){if(!(t instanceof Uint8Array)||4!==t.length)throw new TypeError("Nonce must be 4 bytes");let e=Math.max(Date.now(),this._lastSendTime);if(this.counter=this.counter+1&65535,0===this.counter&&e===this._lastSendTime&&e++,!Number.isSafeInteger(e)||e<0||Math.floor(e/1e3)>4294967295)throw new RangeError("Clock is outside the protocol range");this._lastSendTime=e,Yt.Buffer.concat([Pt.NB("32L",Math.floor(e/1e3)),Pt.NB("16L",e%1e3),Pt.NB("16L",this.counter),Yt.Buffer.from(t)]).copy(this._otpSrc44,32)}_requireKey(){if(!this._hasKey)throw new Error("Set a key before encryption or authentication")}set_salt12(t,e){if(12!=t.byteLength)throw TypeError("set_salt12: Invalid salt12 byteLength.");t.copy(this._otpSrc44,32)}resetOTP(){this._requireKey(),Pt.B8($t.hash(this._otpSrc44)).copy(this._otp36,0,0,32)}getIndexOTP(t){return this._otp36.writeUInt32LE(t,32),$t.hash(this._otp36)}generateHMAC(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);this._hmac=Pt.B8($t.hash(e))}getHMAC8(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);return this._hmac=Pt.B8($t.hash(e)),this._hmac.subarray(0,8)}xotp(t,e=0,r=!1){let n=(t=Pt.B8(t,r)).byteLength,i=e,o=0,s=0;for(;n>0;){s=n<32?n:32;let e=this.getIndexOTP(++i);for(let r=0;r<s;r++)t[o++]^=e[r];n-=32}return t}server_time_nonce(){const t=Date.now(),e=Math.floor(t/1e3),r=t%1e3;return this.localNonce=Zt(4),this.auth_salt12=Yt.Buffer.concat([Pt.NB("32L",e),Pt.NB("16L",r),Zt(2),this.localNonce]),Yt.Buffer.concat([Pt.NB("8",qt.SERVER_TIME_NONCE),this.auth_salt12])}auth_req(t){if(!this._hasKey)return!1;let e=Xt(t,qt.SERVER_TIME_NONCE,Qt.SERVER_TIME_NONCE,Kt.SERVER_TIME_NONCE);if(e&&e.milTime>=1e3)return!1;if(e){let t=Yt.Buffer.concat([Pt.NB("32L",e.unixTime),Pt.NB("16L",e.milTime),Pt.NB("16L",e.counter),e.nonce]);return this.set_salt12(t,"auth_req"),this.localNonce=Zt(4),this.generateHMAC(this.localNonce),this.remoteNonce=e.nonce,Pt.pack(Pt.MB("#header","8",qt.AUTH_REQ),Pt.MB("#id8",this._id8),Pt.MB("#nonce",this.localNonce),Pt.MB("#hmac32",this._hmac))}return!1}verify_auth_req(t){if(!this._hasKey)return!1;let e;if(t instanceof Uint8Array?e=Xt(t,qt.AUTH_REQ,Qt.AUTH_REQ,Kt.AUTH_REQ):t&&"object"==typeof t&&(e=t),!e||e.header!==qt.AUTH_REQ||!(e.id8 instanceof Uint8Array)||8!==e.id8.length||!(e.nonce instanceof Uint8Array)||4!==e.nonce.length||!(e.hmac32 instanceof Uint8Array)||32!==e.hmac32.length||e.$OTHERS&&0!==e.$OTHERS.length)return!1;this.set_salt12(this.auth_salt12,"verify_auth_req 1/2"),this.generateHMAC(e.nonce);let r=this._hmac;if(Wt(e.hmac32,r)){this.remoteNonce=Yt.Buffer.from(e.nonce);let t=Yt.Buffer.concat([this.localNonce,this.remoteNonce,this.localNonce]);this.set_salt12(t,"verify_auth_req 2/2"),this.generateHMAC(e.nonce);let r=this._hmac,n=Pt.rawPack(Pt.MB("header","8",qt.AUTH_RES),Pt.MB("hmac32",r));return this.isAuthorized=!0,n}return!1}verify_auth_res(t){if(!this._hasKey)return!1;let e=Xt(t,qt.AUTH_RES,Qt.AUTH_RES,Kt.AUTH_RES);if(e){let t=Yt.Buffer.concat([this.remoteNonce,this.localNonce,this.remoteNonce]);if(this.set_salt12(t,"verify_auth_res"),this.generateHMAC(this.localNonce),Wt(this._hmac,e.hmac32))return this.isAuthorized=!0,!0}}encrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;t=Pt.B8(t),this.set_clock_nonce(this.remoteNonce),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_488),Pt.MB("#len","32L",t.byteLength),Pt.MB("#otpSrc8",this._otpSrc44.subarray(32,40)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;let e=t;if(t instanceof Uint8Array&&t[0]===qt.ENC_E2E){if(t.length<Qt.ENC_488)return;const r=Yt.Buffer.from(t),n=r.readUInt32LE(1);if(n>r.length-Qt.ENC_488)return;e=Yt.Buffer.from(r.subarray(0,Qt.ENC_488+n)),e[0]=qt.ENC_488}const r=Xt(e,qt.ENC_488,Qt.ENC_488,Kt.ENC_488,!0);if(!(r&&(n=r.otpSrc8,n.readUInt16LE(4)<1e3)))return;var n;this.set_salt12(Yt.Buffer.concat([r.otpSrc8,this.localNonce]),"decrypt_488"),this.resetOTP();const i=this.xotp(r.$OTHERS??Yt.Buffer.alloc(0));return Wt(this.getHMAC8(i),r.hmac8)?i:void 0}encryptPack(t){this._requireKey(),t=Pt.B8(t),this.set_clock_rand(),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_PACK),Pt.MB("#len","32L",t.byteLength),Pt.MB("#salt12",this._otpSrc44.subarray(32)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decryptPack(t){if(!this._hasKey)return;const e=Xt(t,qt.ENC_PACK,Qt.ENC_PACK,Kt.ENC_PACK,!0);if(!e)return;this.set_salt12(e.salt12,"decryptPack"),this.resetOTP();const r=this.xotp(e.$OTHERS??Yt.Buffer.alloc(0));return Wt(e.hmac,this.getHMAC8(r))?(e.data=r,e):void 0}encrypt_e2e(t,e){return this._withKey(e,()=>this.encryptPack(t))}decrypt_e2e(t,e){return this._withKey(e,()=>this.decryptPack(t))}_withKey(t,e){const r=Pt.B8(t);if(!r||0===r.length)throw new TypeError("Key must not be empty");const n=[Yt.Buffer.from(this._otpSrc44),Yt.Buffer.from(this._otp36),Yt.Buffer.from(this._hmac)],i=this._hasKey;try{return this._otpSrc44.set($t.hash(r),0),this._hasKey=!0,e()}finally{this._otpSrc44.set(n[0]),this._otp36.set(n[1]),this._hmac.set(n[2]),this._hasKey=i;for(const t of n)t.fill(0)}}}te.RAND=Zt,te.BohoMsg=qt,te.Meta=Kt,te.MetaSize=Qt,te.sha256=$t,te.MBP=Pt,te.Buffer=Yt.Buffer;const ee=k.Buffer,re=new TextEncoder,ne=new TextDecoder;function ie(t,e=!0){if("string"!=typeof t)throw TypeError("tag should be string.");const r=re.encode(t);if(!e&&0===r.byteLength||r.byteLength>H.TAG_LEN1)throw TypeError("tag UTF-8 byte length must be "+(e?"0":"1")+"~255");return r}class oe extends j{constructor(t){super(),this.cid="",this.ip="",this.socket=null,this.url=t,this.state=z.CLOSED,this.stateName=this.getStateName(),this._stateRevision=0,this.txCounter=0,this.rxCounter=0,this.txBytes=0,this.rxBytes=0,this.lastTxRxTime=Date.now(),this.connectionCheckerPeriod=H.CONNECTION_CHECKER_PERIOD,this.connectionCheckerIntervalID=null,this.boho=new te,this.serverTimeNonce=ee.alloc(te.MetaSize.SERVER_TIME_NONCE),this.TLS=!1,this.encMode=F.AUTO,this.useAuth=!1,this.nick="",this.channels=new Set,this.promiseMap=new Map,this.promiseTimeOut=H.PROMISE_TIMEOUT,this.mid=0,this.level=3,this.quota=q[this.level],this.serverSet={},this.linkMap=new Map,this.autoReconnect=!0,this._closed=!1,this.on("open",this.onOpen.bind(this)),this.on("close",this.onClose.bind(this)),this.on("socket_data",this.onData.bind(this))}close(){if(!1===this.autoReconnect&&(clearInterval(this.connectionCheckerIntervalID),this.connectionCheckerIntervalID=null),!this._closed){if(this._closed=!0,this.socket){if(0===this.socket.readyState){const t=this.socket;t.onopen=()=>{t&&t.close()},t.onmessage=null,t.onerror=null,t.onclose=null}else try{this.socket.close?.()}catch{}this.socket=null}this.promiseMap.clear(),this.cid="",this.boho&&(this.boho.isAuthorized=!1),this.state!==z.STOP&&this.stateChange("closed")&&this.emit("closed")}}stop(){this.autoReconnect=!1,this.close(),this.cid="",this.stateChange("stop","stop")}destroy(){this.stop(),this.removeAllListeners(),this.channels.clear(),this.linkMap.clear(),this.boho=null}keepAlive(){this.keepConnection(),Date.now()-this.lastTxRxTime>H.CLIENT_PING_PERIOD&&this.ping()}redirect(t){this.stateChange("redirecting","redirecting"),this.close(),this.createConnection(t)}open(t){this.socket&&this.close(),t&&(this.url=t),this.url?(this.createConnection(this.url),this._closed||this.connectionCheckerIntervalID||(this.connectionCheckerIntervalID=setInterval(this.keepAlive.bind(this),this.connectionCheckerPeriod))):this.emit("error",new Error("URL is not set."))}onOpen(){this._closed=!1,this.url.includes("wss://")?this.TLS=!0:this.TLS=!1,this.stateChange("open")}onClose(){this.close()}login(t,e){if(this.serverTimeNonce){this.auth(t,e),this.useAuth=!0;let r=this.boho.auth_req(this.serverTimeNonce);this.send(r),this.stateChange("auth_req","auth_req")}return this}auth(t,e){return t||e||this.emit("error",new Error("auth failed. no id and key.")),!e&&t.includes(".")?this.boho.set_id_key(t):t&&e?(this.boho.set_id8(t),this.boho.set_key(e)):this.emit("error",new Error("auth failed. no id or key.")),this.useAuth=!0,this}onData(t){let e,r=t[0];if(r===te.BohoMsg.ENC_488)e=this.boho.decrypt_488(t),e&&(r=e[0],t=e);else if(r===te.BohoMsg.ENC_E2E)try{if(e=this.boho.decrypt_488(t),!e)return;r=e[0],t.set(e,te.MetaSize.ENC_488),t=t.subarray(te.MetaSize.ENC_488)}catch(t){return}let n=G[r];switch(n||(n=te.BohoMsg[r]),r){case G.OVER_SIZE:console.log("## server sent: over_size event."),this.emit("over_size","over_size");break;case G.PING:this.pong();break;case G.PONG:break;case G.ECHO:try{let e=ne.decode(t.subarray(1));this.emit("echo",e)}catch(t){this.emit("error",new Error("ECHO data error"))}break;case G.IAM_RES:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.ip&&(this.ip=r.ip),r.nick&&(this.nick=r.nick),r.did&&(this.did=r.did),r.uid&&(this.uid=r.uid),this.emit("iam_res",e)}catch(t){this.emit("error",new Error("IAM_RES data error"))}break;case G.CID_RES:let r=ne.decode(t.subarray(1));this.cid=r,this.stateChange("ready","cid_ready"),this.subscribe_channels();break;case G.QUOTA_LEVEL:let n=t[1];this.level=n,this.quota=q[n];break;case G.AUTH_CLEAR:this.useAuth=!1,this.boho.clearAuth(),this.stateChange("auth_clear","server request auth_clear."),this.stop();break;case G.SERVER_REDIRECT:let i,o,s;7==t.byteLength?(i=function(t){if(6!=t.byteLength)return;return t[0].toString()+"."+t[1].toString()+"."+t[2].toString()+"."+t[3].toString()+":"+((t[4]<<8)+t[5]).toString()}(t.subarray(1)),s="cong://"):(i=ne.decode(t.subarray(1)),s=""),o=s+i,this.redirect(o);break;case te.BohoMsg.SERVER_TIME_NONCE:if(t.copy(this.serverTimeNonce),!this.stateChange("server_ready","server_ready"))break;this.useAuth?(this.send(this.boho.auth_req(t)),this.stateChange("auth_req","auth_req")):this.send(ee.from([G.CID_REQ]));break;case G.SERVER_SIGNAL:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.event&&r.data&&(this.serverSet=r.data,this.emit(r.event,r.data))}catch(t){this.emit("error",new Error("SERVER_SIGNAL parsing error"))}break;case G.SET:try{let e=k.unpack(t);e&&this.emit(e.topic,...e.args)}catch(t){this.emit("error",new Error("SET parsing error"))}break;case G.SIGNAL_E2E:case G.SIGNAL:try{let e=t.readUint8(1),r=t.subarray(2,2+e),n=ne.decode(r),i=t.readUint8(2+e),o=t.subarray(3+e);switch(i){case V.EMPTY:0===n.indexOf("@")?this.emit("@",n):(this.emit(n,n),this.emit("message",n));break;case V.TEXT:let t=o;0===o[o.byteLength-1]&&(t=o.subarray(0,o.byteLength-1));let e=ne.decode(t);0===n.indexOf("@")?this.emit("@",n,e):(this.emit(n,n,e),this.emit("message",n,e));break;case V.BINARY:0===n.indexOf("@")?this.emit("@",n,o):(this.emit(n,n,o),this.emit("message",n,o));break;case V.OBJECT:let r=ne.decode(o),i=JSON.parse(r);0===n.indexOf("@")?this.emit("@",n,i):(this.emit(n,n,i),this.emit("message",n,i));break;case V.MJSON:let s=ne.decode(o),f=JSON.parse(s);0===n.indexOf("@")?this.emit("@",n,...f):(this.emit(n,n,...f),this.emit("message",n,...f));break;case V.MBA:let u=k.unpack(o);0===n.indexOf("@")?this.emit("@",n,...u.args):(this.emit(n,n,...u.args),this.emit("message",n,...u.args))}}catch(t){console.log("IOCore IOMsg.SIGNAL parser err",t)}break;case G.RESPONSE_MBP:this.testPromise(t);break;case te.BohoMsg.AUTH_FAIL:this.boho.isAuthorized=!1,this.stateChange("auth_fail","auth_fail from server.");break;case te.BohoMsg.AUTH_RES:if(this.boho.verify_auth_res(t)){if(!this.stateChange("auth_res","server sent auth_res"))break;this.send(ee.from([G.CID_REQ]))}else this.boho.isAuthorized=!1,this.stateChange("auth_fail","verify_auth_res() invalid server_hmac");break;default:try{e=ne.decode(t),this.emit("text_message",e)}catch(t){}}}iam(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM),k.MB("#",t))):this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM)))}ping(){this.send(ee.from([G.PING]))}pong(){this.send(ee.from([G.PONG]))}echo(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.ECHO),k.MB("#msg",t))):this.send(ee.from([G.ECHO]))}bin(...t){this.send(k.U8pack(...t))}send(t){if(t.byteLength>this.quota.signalSize)return this.emit("over_size"),console.log("## QUOTA LIMIT OVER!! \nsignal message.byteLength: ",t.byteLength),void console.log("## your maximum signalSize(bytes) is:",this.quota.signalSize);this.socket_send(t)}getEncryptionMode(){return!(this.encMode!==F.YES&&(this.encMode!==F.AUTO||this.TLS||!this.boho.isAuthorized))}send_enc_mode(t,e){if(void 0===e&&(e=this.getEncryptionMode()),t[0]==G.SIGNAL_E2E&&e){let e=t[1],r=this.boho.encrypt_488(t.subarray(0,3+e));r[0]=te.BohoMsg.ENC_E2E,this.send(ee.concat([r,t.subarray(3+e)]))}else if(e){let e=this.boho.encrypt_488(t);this.send(e)}else this.send(t)}setMsgPromise(t){return new Promise((e,r)=>{const n=setTimeout(e=>{this.promiseMap.has(t)&&(r("timeout"),this.promiseMap.delete(t))},this.promiseTimeOut);this.promiseMap.set(t,[e,r,n])})}testPromise(t){let e=k.unpack(t);if(e)if(this.promiseMap.has(e.mid)){let[t,r,n]=this.promiseMap.get(e.mid);clearTimeout(n),this.promiseMap.delete(e.mid),e.status<128?(e.ok=!0,t(e)):(e.ok=!1,r(e))}else console.log("no promise id")}publish(t,...e){this.signal(t,...e)}signal(t,...e){if("string"!=typeof t)throw TypeError("tag should be string.");t.startsWith("@")&&this.cid&&ie(this.cid+t);let r=J(t,...e);this.send_enc_mode(r)}decrypt_e2e(t,e){return this.boho.decrypt_e2e(t,e)}signal_e2e(t,e,r){const n=ie(t);if(t.startsWith("@")&&this.cid&&ie(this.cid+t),!this.boho.isAuthorized)return;let i=k.B8(e),o=this.boho.encrypt_e2e(i,r),s=k.pack(k.MB("#MsgType","8",G.SIGNAL_E2E),k.MB("#tagLen","8",n.byteLength),k.MB("#tag",n),k.MB("#payloadType","8",V.BINARY),k.MB("#payload",o));this.send_enc_mode(s)}set(t,...e){return t&&0!=e.length?this.call("store","set",t,...e):Promise.reject(new Error("set need storeName and value)"))}async get(t){if(!t)return Promise.reject(new Error("store get need storeName)"));let e=await this.call("store","get",t),{$:r}=k.unpack(e.body);return r}call(t,e,...r){if(!t||!e)return Promise.reject(new Error("request need target and topic)"));let n;return n=r.length>0?k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e),k.MBA(...r)):k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e)),this.send_enc_mode(n),this.setMsgPromise(this.mid)}subscribe(t){const e=ie(t);this.send_enc_mode(ee.concat([k.NB("8",G.SUBSCRIBE),k.NB("8",e.byteLength),e]))}subscribe_channels(){if(this.state!==z.READY||0===this.channels.size)return;const t=Array.from(this.channels).join(",").split(","),e=t.map(t=>ie(t).byteLength),r=[];let n=[],i=0;t.forEach((t,o)=>{n.length&&i+1+e[o]>H.TAG_LEN1&&(r.push(n.join(",")),n=[],i=0),i+=(n.length?1:0)+e[o],n.push(t)}),n.length&&r.push(n.join(",")),r.forEach(t=>this.subscribe(t))}unsubscribe(t=""){const e=ie(t);if(""==t)this.channels.clear();else{t.split(",").forEach(t=>{this.channels.delete(t)})}this.send_enc_mode(ee.concat([k.NB("8",G.UNSUBSCRIBE),k.NB("8",e.byteLength),e]))}listen(t,e){if("string"!=typeof t)throw TypeError("tag should be string.");if(ie(t,!1),"function"!=typeof e)throw TypeError("handler is not a function.");0!==t.indexOf("@")&&this.channels.add(t),this.on(t,e)}link(t,e,r){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");if(ie(e,!1),"function"!=typeof r)throw TypeError("handler is not a function.");let n;0!==e.indexOf("@")&&this.channels.add(e),n=this.linkMap.has(t)?this.linkMap.get(t):new Set,n.add(e),this.linkMap.set(t,n),this.on(e,r),this.subscribe(e)}unlink(t,e){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");ie(e,!1);const r=this.linkMap.get(t);r&&r.has(e)&&(this.unsubscribe(e),this.removeAllListeners(e),r.delete(e),0===r.size&&this.linkMap.delete(t))}unlinkAll(t){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");const e=this.linkMap.get(t);if(e){for(const t of e)this.unsubscribe(t),this.removeAllListeners(t);this.linkMap.delete(t)}}getMetric(){return{tx:this.txCounter,rx:this.rxCounter,txb:this.txBytes,rxb:this.rxBytes,last:(Date.now()-this.lastTxRxTime)/1e3}}getState(){return this.state}getStateName(){return z[this.state].toLowerCase()}getSecurity(){return{useAuth:this.useAuth,isTLS:this.TLS,isAuthorized:this.boho.isAuthorized,encMode:this.encMode,usingEncryption:this.getEncryptionMode()}}stateChange(t,e){let r=t.toLowerCase();const n=z[t.toUpperCase()];if("number"!=typeof n)throw new TypeError("Unknown state: "+t);const i=this.state!==n;this.state=n,this.stateName=r,i&&this._stateRevision++;const o=this._stateRevision;return i&&this.emit("change",r),o===this._stateRevision&&(e&&this.emit(r,e),o===this._stateRevision)}}const se=te.Buffer;class fe extends oe{static version="6.1.1";static binaryType="arraybuffer";static Boho=te;static MBP=te.MBP;static Buffer=te.Buffer;static constants=Y;static instanceCount=0;static webSocketCount=0;constructor(t){super(t),fe.instanceCount++,this.boundBrowserVisiblePing=this.browserVisiblePing.bind(this),document.addEventListener("visibilitychange",this.boundBrowserVisiblePing),t&&this.open()}browserVisiblePing(){"visible"===document.visibilityState&&this.ping()}stop(){super.stop()}destroy(){document.removeEventListener("visibilitychange",this.boundBrowserVisiblePing),super.destroy()}keepConnection(){this.autoReconnect&&(this.socket&&this.socket.readyState!==WebSocket.CLOSED||this.open())}createConnection(t){fe.webSocketCount++;const e=this.socket=new WebSocket(t);this._closed=!1,this.socket.binaryType=fe.binaryType,this.socket.onopen=()=>{this.socket===e&&("arraybuffer"==this.socket.binaryType?this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessage(t)}:this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessageBlob(t)},this.emit("open"))},this.socket.onerror=t=>{this.socket===e&&this.emit("error",t)},this.socket.onclose=()=>{this.socket===e&&this.emit("close")},this.stateChange("connecting","connecting")}onWebSocketMessage(t){this.rxCounter++,this.lastTxRxTime=Date.now();let e=se.from(t.data);this.rxBytes+=e.byteLength,this.emit("socket_data",e)}async onWebSocketMessageBlob(t){const e=this.socket;let r;if(this.rxCounter++,this.lastTxRxTime=Date.now(),t.data instanceof Blob){let e=await t.data.arrayBuffer();r=se.from(e)}else r=se.from(t.data);this.rxBytes+=r.byteLength,this.socket===e&&this.emit("socket_data",r)}socket_send(t){1===this.socket?.readyState?(this.socket.send(t),this.txCounter++,this.txBytes+=t.byteLength,this.lastTxRxTime=Date.now()):console.log(".")}}export{fe as default};
|
|
22
|
+
*/var Yt=(zt||(zt=1,function(t){const e=function(){if(Dt)return Ht;Dt=1,Ht.byteLength=function(t){var e=o(t),r=e[0],n=e[1];return 3*(r+n)/4-n},Ht.toByteArray=function(t){var n,i,s=o(t),f=s[0],u=s[1],h=new r(function(t,e,r){return 3*(e+r)/4-r}(0,f,u)),a=0,c=u>0?f-4:f;for(i=0;i<c;i+=4)n=e[t.charCodeAt(i)]<<18|e[t.charCodeAt(i+1)]<<12|e[t.charCodeAt(i+2)]<<6|e[t.charCodeAt(i+3)],h[a++]=n>>16&255,h[a++]=n>>8&255,h[a++]=255&n;return 2===u&&(n=e[t.charCodeAt(i)]<<2|e[t.charCodeAt(i+1)]>>4,h[a++]=255&n),1===u&&(n=e[t.charCodeAt(i)]<<10|e[t.charCodeAt(i+1)]<<4|e[t.charCodeAt(i+2)]>>2,h[a++]=n>>8&255,h[a++]=255&n),h},Ht.fromByteArray=function(e){for(var r,n=e.length,i=n%3,o=[],s=16383,u=0,h=n-i;u<h;u+=s)o.push(f(e,u,u+s>h?h:u+s));return 1===i?(r=e[n-1],o.push(t[r>>2]+t[r<<4&63]+"==")):2===i&&(r=(e[n-2]<<8)+e[n-1],o.push(t[r>>10]+t[r>>4&63]+t[r<<2&63]+"=")),o.join("")};for(var t=[],e=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0;i<64;++i)t[i]=n[i],e[n.charCodeAt(i)]=i;function o(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function s(e){return t[e>>18&63]+t[e>>12&63]+t[e>>6&63]+t[63&e]}function f(t,e,r){for(var n,i=[],o=e;o<r;o+=3)n=(t[o]<<16&16711680)+(t[o+1]<<8&65280)+(255&t[o+2]),i.push(s(n));return i.join("")}return e["-".charCodeAt(0)]=62,e["_".charCodeAt(0)]=63,Ht}(),r=Gt(),n="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=s,t.SlowBuffer=function(t){return+t!=t&&(t=0),s.alloc(+t)},t.INSPECT_MAX_BYTES=50;const i=2147483647;function o(t){if(t>i)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,s.prototype),e}function s(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return h(t)}return f(t,e,r)}function f(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!s.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|p(t,e);let n=o(r);const i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(q(t,Uint8Array)){const e=new Uint8Array(t);return c(e.buffer,e.byteOffset,e.byteLength)}return a(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(q(t,ArrayBuffer)||t&&q(t.buffer,ArrayBuffer))return c(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(q(t,SharedArrayBuffer)||t&&q(t.buffer,SharedArrayBuffer)))return c(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return s.from(n,e,r);const i=function(t){if(s.isBuffer(t)){const e=0|l(t.length),r=o(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||K(t.length)?o(0):a(t):"Buffer"===t.type&&Array.isArray(t.data)?a(t.data):void 0}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return s.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function u(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function h(t){return u(t),o(t<0?0:0|l(t))}function a(t){const e=t.length<0?0:0|l(t.length),r=o(e);for(let n=0;n<e;n+=1)r[n]=255&t[n];return r}function c(t,e,r){if(e<0||t.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(t.byteLength<e+(r||0))throw new RangeError('"length" is outside of buffer bounds');let n;return n=void 0===e&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,e):new Uint8Array(t,e,r),Object.setPrototypeOf(n,s.prototype),n}function l(t){if(t>=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|t}function p(t,e){if(s.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||q(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let i=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return V(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return G(t).length;default:if(i)return n?-1:V(t).length;e=(""+e).toLowerCase(),i=!0}}function y(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return I(this,e,r);case"ascii":return U(this,e,r);case"latin1":case"binary":return L(this,e,r);case"base64":return A(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function d(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),K(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=s.from(e,n)),s.isBuffer(e))return 0===e.length?-1:b(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):b(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function b(t,e,r,n,i){let o,s=1,f=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,f/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){let n=-1;for(o=r;o<f;o++)if(h(t,o)===h(e,-1===n?0:o-n)){if(-1===n&&(n=o),o-n+1===u)return n*s}else-1!==n&&(o-=o-n),n=-1}else for(r+u>f&&(r=f-u),o=r;o>=0;o--){let r=!0;for(let n=0;n<u;n++)if(h(t,o+n)!==h(e,n)){r=!1;break}if(r)return o}return-1}function w(t,e,r,n){r=Number(r)||0;const i=t.length-r;n?(n=Number(n))>i&&(n=i):n=i;const o=e.length;let s;for(n>o/2&&(n=o/2),s=0;s<n;++s){const n=parseInt(e.substr(2*s,2),16);if(K(n))return s;t[r+s]=n}return s}function E(t,e,r,n){return Y(V(e,t.length-r),t,r,n)}function B(t,e,r,n){return Y(function(t){const e=[];for(let r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function m(t,e,r,n){return Y(G(e),t,r,n)}function _(t,e,r,n){return Y(function(t,e){let r,n,i;const o=[];for(let s=0;s<t.length&&!((e-=2)<0);++s)r=t.charCodeAt(s),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function A(t,r,n){return 0===r&&n===t.length?e.fromByteArray(t):e.fromByteArray(t.slice(r,n))}function I(t,e,r){r=Math.min(t.length,r);const n=[];let i=e;for(;i<r;){const e=t[i];let o=null,s=e>239?4:e>223?3:e>191?2:1;if(i+s<=r){let r,n,f,u;switch(s){case 1:e<128&&(o=e);break;case 2:r=t[i+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(o=u));break;case 3:r=t[i+1],n=t[i+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(o=u));break;case 4:r=t[i+1],n=t[i+2],f=t[i+3],128==(192&r)&&128==(192&n)&&128==(192&f)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&f,u>65535&&u<1114112&&(o=u))}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){const e=t.length;if(e<=v)return String.fromCharCode.apply(String,t);let r="",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=v));return r}(n)}t.kMaxLength=i,s.TYPED_ARRAY_SUPPORT=function(){try{const t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}(),s.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(s.prototype,"parent",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.buffer}}),Object.defineProperty(s.prototype,"offset",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.byteOffset}}),s.poolSize=8192,s.from=function(t,e,r){return f(t,e,r)},Object.setPrototypeOf(s.prototype,Uint8Array.prototype),Object.setPrototypeOf(s,Uint8Array),s.alloc=function(t,e,r){return function(t,e,r){return u(t),t<=0?o(t):void 0!==e?"string"==typeof r?o(t).fill(e,r):o(t).fill(e):o(t)}(t,e,r)},s.allocUnsafe=function(t){return h(t)},s.allocUnsafeSlow=function(t){return h(t)},s.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==s.prototype},s.compare=function(t,e){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),q(e,Uint8Array)&&(e=s.from(e,e.offset,e.byteLength)),!s.isBuffer(t)||!s.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let r=t.length,n=e.length;for(let i=0,o=Math.min(r,n);i<o;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},s.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(t,e){if(!Array.isArray(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return s.alloc(0);let r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;const n=s.allocUnsafe(e);let i=0;for(r=0;r<t.length;++r){let e=t[r];if(q(e,Uint8Array))i+e.length>n.length?(s.isBuffer(e)||(e=s.from(e)),e.copy(n,i)):Uint8Array.prototype.set.call(n,e,i);else{if(!s.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,i)}i+=e.length}return n},s.byteLength=p,s.prototype._isBuffer=!0,s.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;e<t;e+=2)g(this,e,e+1);return this},s.prototype.swap32=function(){const t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t;e+=4)g(this,e,e+3),g(this,e+1,e+2);return this},s.prototype.swap64=function(){const t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let e=0;e<t;e+=8)g(this,e,e+7),g(this,e+1,e+6),g(this,e+2,e+5),g(this,e+3,e+4);return this},s.prototype.toString=function(){const t=this.length;return 0===t?"":0===arguments.length?I(this,0,t):y.apply(this,arguments)},s.prototype.toLocaleString=s.prototype.toString,s.prototype.equals=function(t){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===s.compare(this,t)},s.prototype.inspect=function(){let e="";const r=t.INSPECT_MAX_BYTES;return e=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(e+=" ... "),"<Buffer "+e+">"},n&&(s.prototype[n]=s.prototype.inspect),s.prototype.compare=function(t,e,r,n,i){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),!s.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;let o=(i>>>=0)-(n>>>=0),f=(r>>>=0)-(e>>>=0);const u=Math.min(o,f),h=this.slice(n,i),a=t.slice(e,r);for(let t=0;t<u;++t)if(h[t]!==a[t]){o=h[t],f=a[t];break}return o<f?-1:f<o?1:0},s.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},s.prototype.indexOf=function(t,e,r){return d(this,t,e,r,!0)},s.prototype.lastIndexOf=function(t,e,r){return d(this,t,e,r,!1)},s.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let o=!1;for(;;)switch(n){case"hex":return w(this,t,e,r);case"utf8":case"utf-8":return E(this,t,e,r);case"ascii":case"latin1":case"binary":return B(this,t,e,r);case"base64":return m(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const v=4096;function U(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function L(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function T(t,e,r){const n=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>n)&&(r=n);let i="";for(let n=e;n<r;++n)i+=J[t[n]];return i}function S(t,e,r){const n=t.slice(e,r);let i="";for(let t=0;t<n.length-1;t+=2)i+=String.fromCharCode(n[t]+256*n[t+1]);return i}function R(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function O(t,e,r,n,i,o){if(!s.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<o)throw new RangeError('"value" argument is out of bounds');if(r+n>t.length)throw new RangeError("Index out of range")}function M(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,r}function C(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r+7]=o,o>>=8,t[r+6]=o,o>>=8,t[r+5]=o,o>>=8,t[r+4]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s>>=8,t[r+2]=s,s>>=8,t[r+1]=s,s>>=8,t[r]=s,r+8}function N(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function k(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,4),r.write(t,e,n,i,23,4),n+4}function x(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,8),r.write(t,e,n,i,52,8),n+8}s.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t);const n=this.subarray(t,e);return Object.setPrototypeOf(n,s.prototype),n},s.prototype.readUintLE=s.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return n},s.prototype.readUintBE=s.prototype.readUIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t+--e],i=1;for(;e>0&&(i*=256);)n+=this[t+--e]*i;return n},s.prototype.readUint8=s.prototype.readUInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),this[t]},s.prototype.readUint16LE=s.prototype.readUInt16LE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]|this[t+1]<<8},s.prototype.readUint16BE=s.prototype.readUInt16BE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]<<8|this[t+1]},s.prototype.readUint32LE=s.prototype.readUInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},s.prototype.readUint32BE=s.prototype.readUInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},s.prototype.readBigUInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,i=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(i)<<BigInt(32))}),s.prototype.readBigUInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],i=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<<BigInt(32))+BigInt(i)}),s.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return i*=128,n>=i&&(n-=Math.pow(2,8*e)),n},s.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=e,i=1,o=this[t+--n];for(;n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},s.prototype.readInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},s.prototype.readInt16LE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},s.prototype.readInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},s.prototype.readBigInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<<BigInt(32))+BigInt(e+256*this[++t]+65536*this[++t]+this[++t]*2**24)}),s.prototype.readBigInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<<BigInt(32))+BigInt(this[++t]*2**24+65536*this[++t]+256*this[++t]+r)}),s.prototype.readFloatLE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!0,23,4)},s.prototype.readFloatBE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!1,23,4)},s.prototype.readDoubleLE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!0,52,8)},s.prototype.readDoubleBE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!1,52,8)},s.prototype.writeUintLE=s.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=1,o=0;for(this[e]=255&t;++o<r&&(i*=256);)this[e+o]=t/i&255;return e+r},s.prototype.writeUintBE=s.prototype.writeUIntBE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=r-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+r},s.prototype.writeUint8=s.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,255,0),this[e]=255&t,e+1},s.prototype.writeUint16LE=s.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeUint16BE=s.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeUint32LE=s.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},s.prototype.writeUint32BE=s.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigUInt64LE=Q(function(t,e=0){return M(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeBigUInt64BE=Q(function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=0,o=1,s=0;for(this[e]=255&t;++i<r&&(o*=256);)t<0&&0===s&&0!==this[e+i-1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=r-1,o=1,s=0;for(this[e+i]=255&t;--i>=0&&(o*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},s.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},s.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigInt64LE=Q(function(t,e=0){return M(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeBigInt64BE=Q(function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeFloatLE=function(t,e,r){return k(this,t,e,!0,r)},s.prototype.writeFloatBE=function(t,e,r){return k(this,t,e,!1,r)},s.prototype.writeDoubleLE=function(t,e,r){return x(this,t,e,!0,r)},s.prototype.writeDoubleBE=function(t,e,r){return x(this,t,e,!1,r)},s.prototype.copy=function(t,e,r,n){if(!s.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);const i=n-r;return this===t&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(e,r,n):Uint8Array.prototype.set.call(t,this.subarray(r,n),e),i},s.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){const e=t.charCodeAt(0);("utf8"===n&&e<128||"latin1"===n)&&(t=e)}}else"number"==typeof t?t&=255:"boolean"==typeof t&&(t=Number(t));if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;let i;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(i=e;i<r;++i)this[i]=t;else{const o=s.isBuffer(t)?t:s.from(t,n),f=o.length;if(0===f)throw new TypeError('The value "'+t+'" is invalid for argument "value"');for(i=0;i<r-e;++i)this[i+e]=o[i%f]}return this};const P={};function $(t,e,r){P[t]=class extends r{constructor(){super(),Object.defineProperty(this,"message",{value:e.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${t}]`,this.stack,delete this.name}get code(){return t}set code(t){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:t,writable:!0})}toString(){return`${this.name} [${t}]: ${this.message}`}}}function D(t){let e="",r=t.length;const n="-"===t[0]?1:0;for(;r>=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function j(t,e,r,n,i,o){if(t>r||t<e){const r="bigint"==typeof e?"n":"";let n;throw n=0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(o+1)}${r}`:`>= -(2${r} ** ${8*(o+1)-1}${r}) and < 2 ** ${8*(o+1)-1}${r}`,new P.ERR_OUT_OF_RANGE("value",n,t)}!function(t,e,r){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||F(e,t.length-(r+1))}(n,i,o)}function z(t,e){if("number"!=typeof t)throw new P.ERR_INVALID_ARG_TYPE(e,"number",t)}function F(t,e,r){if(Math.floor(t)!==t)throw z(t,r),new P.ERR_OUT_OF_RANGE("offset","an integer",t);if(e<0)throw new P.ERR_BUFFER_OUT_OF_BOUNDS;throw new P.ERR_OUT_OF_RANGE("offset",`>= 0 and <= ${e}`,t)}$("ERR_BUFFER_OUT_OF_BOUNDS",function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),$("ERR_INVALID_ARG_TYPE",function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`},TypeError),$("ERR_OUT_OF_RANGE",function(t,e,r){let n=`The value of "${t}" is out of range.`,i=r;return Number.isInteger(r)&&Math.abs(r)>2**32?i=D(String(r)):"bigint"==typeof r&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=D(i)),i+="n"),n+=` It must be ${e}. Received ${i}`,n},RangeError);const H=/[^+/0-9A-Za-z-_]/g;function V(t,e){let r;e=e||1/0;const n=t.length;let i=null;const o=[];for(let s=0;s<n;++s){if(r=t.charCodeAt(s),r>55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function G(t){return e.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(H,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Y(t,e,r,n){let i;for(i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function q(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function K(t){return t!=t}const J=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let i=0;i<16;++i)e[n+i]=t[r]+t[i]}return e}();function Q(t){return"undefined"==typeof BigInt?W:t}function W(){throw new Error("BigInt not supported")}}(Ft)),Ft);let qt={SERVER_TIME_NONCE:176,AUTH_REQ:177,AUTH_RES:178,AUTH_FAIL:179,ENC_PACK:182,ENC_E2E:183,ENC_488:184};for(let t in qt)qt[qt[t]]=t;const Kt={SERVER_TIME_NONCE:Pt.meta(Pt.MB("header","8",0),Pt.MB("unixTime","32L",0),Pt.MB("milTime","16L",0),Pt.MB("counter","16L",0),Pt.MB("nonce",Yt.Buffer.alloc(4))),AUTH_REQ:Pt.meta(Pt.MB("header","8",0),Pt.MB("id8",Yt.Buffer.alloc(8)),Pt.MB("nonce",Yt.Buffer.alloc(4)),Pt.MB("hmac32",Yt.Buffer.alloc(32))),AUTH_RES:Pt.meta(Pt.MB("header","8",0),Pt.MB("hmac32",Yt.Buffer.alloc(32))),ENC_PACK:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("salt12",Yt.Buffer.alloc(12)),Pt.MB("hmac",8,0)),ENC_488:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("otpSrc8",Yt.Buffer.alloc(8)),Pt.MB("hmac8",Yt.Buffer.alloc(8)))};function Jt(t){let e=t[t.length-1];return e[2]+e[3]}const Qt={SERVER_TIME_NONCE:Jt(Kt.SERVER_TIME_NONCE),AUTH_REQ:Jt(Kt.AUTH_REQ),AUTH_RES:Jt(Kt.AUTH_RES),ENC_PACK:Jt(Kt.ENC_PACK),ENC_488:Jt(Kt.ENC_488)};function Wt(t,e){if(!(t instanceof Uint8Array&&e instanceof Uint8Array&&t.length===e.length))return!1;let r=0;for(let n=0;n<t.length;n++)r|=t[n]^e[n];return 0===r}function Xt(t,e,r,n,i=!1){if(!(t instanceof Uint8Array))return;const o=Yt.Buffer.from(t);return o.length<r||o[0]!==e||(i?o.readUInt32LE(1)!==o.length-r:o.length!==r)?void 0:Pt.unpack(o,n)}function Zt(t){return globalThis.crypto.getRandomValues(Yt.Buffer.alloc(t))}class te{constructor(){this._id8=Yt.Buffer.alloc(8),this._otpSrc44=Yt.Buffer.alloc(44),this._otp36=Yt.Buffer.alloc(36),this._hmac=Yt.Buffer.alloc(32),this.auth_salt12=Yt.Buffer.alloc(12),this.localNonce=Yt.Buffer.alloc(4),this.remoteNonce=Yt.Buffer.alloc(4),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}clearAuth(){this._id8.fill(0),this._otpSrc44.fill(0),this._otp36.fill(0),this._hmac.fill(0),this.auth_salt12.fill(0),this.localNonce.fill(0),this.remoteNonce.fill(0),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}set_hash_id8(t){Pt.B8($t.hash(t)).copy(this._id8,0,0,8)}set_id8(t){let e=Pt.B8(t);this._id8.fill(0),e.copy(this._id8,0,0,8)}set_key(t){const e=Pt.B8(t);if(!e||0===e.length)throw new TypeError("Key must not be empty");this.copy_key(Pt.B8($t.hash(e)))}set_id_key(t){let e=t.indexOf(".");if(-1==e)return;let r=t.substring(0,e),n=t.substring(e+1);this.set_id8(r),this.set_key(n)}copy_id8(t){t.copy(this._id8,0,0,8)}copy_key(t){if(!(t instanceof Uint8Array)||32!==t.length)throw new TypeError("copy_key requires exactly 32 bytes");this._otpSrc44.set(t,0),this._hasKey=!0}sha256_n(t,e){let r=$t.hash(t);for(let t=0;t<e;t++)r=$t.hash(r);return r}set_clock_rand(){this.set_clock_nonce(Zt(4))}set_clock_nonce(t){if(!(t instanceof Uint8Array)||4!==t.length)throw new TypeError("Nonce must be 4 bytes");let e=Math.max(Date.now(),this._lastSendTime);if(this.counter=this.counter+1&65535,0===this.counter&&e===this._lastSendTime&&e++,!Number.isSafeInteger(e)||e<0||Math.floor(e/1e3)>4294967295)throw new RangeError("Clock is outside the protocol range");this._lastSendTime=e,Yt.Buffer.concat([Pt.NB("32L",Math.floor(e/1e3)),Pt.NB("16L",e%1e3),Pt.NB("16L",this.counter),Yt.Buffer.from(t)]).copy(this._otpSrc44,32)}_requireKey(){if(!this._hasKey)throw new Error("Set a key before encryption or authentication")}set_salt12(t,e){if(12!=t.byteLength)throw TypeError("set_salt12: Invalid salt12 byteLength.");t.copy(this._otpSrc44,32)}resetOTP(){this._requireKey(),Pt.B8($t.hash(this._otpSrc44)).copy(this._otp36,0,0,32)}getIndexOTP(t){return this._otp36.writeUInt32LE(t,32),$t.hash(this._otp36)}generateHMAC(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);this._hmac=Pt.B8($t.hash(e))}getHMAC8(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);return this._hmac=Pt.B8($t.hash(e)),this._hmac.subarray(0,8)}xotp(t,e=0,r=!1){let n=(t=Pt.B8(t,r)).byteLength,i=e,o=0,s=0;for(;n>0;){s=n<32?n:32;let e=this.getIndexOTP(++i);for(let r=0;r<s;r++)t[o++]^=e[r];n-=32}return t}server_time_nonce(){const t=Date.now(),e=Math.floor(t/1e3),r=t%1e3;return this.localNonce=Zt(4),this.auth_salt12=Yt.Buffer.concat([Pt.NB("32L",e),Pt.NB("16L",r),Zt(2),this.localNonce]),Yt.Buffer.concat([Pt.NB("8",qt.SERVER_TIME_NONCE),this.auth_salt12])}auth_req(t){if(!this._hasKey)return!1;let e=Xt(t,qt.SERVER_TIME_NONCE,Qt.SERVER_TIME_NONCE,Kt.SERVER_TIME_NONCE);if(e&&e.milTime>=1e3)return!1;if(e){let t=Yt.Buffer.concat([Pt.NB("32L",e.unixTime),Pt.NB("16L",e.milTime),Pt.NB("16L",e.counter),e.nonce]);return this.set_salt12(t,"auth_req"),this.localNonce=Zt(4),this.generateHMAC(this.localNonce),this.remoteNonce=e.nonce,Pt.pack(Pt.MB("#header","8",qt.AUTH_REQ),Pt.MB("#id8",this._id8),Pt.MB("#nonce",this.localNonce),Pt.MB("#hmac32",this._hmac))}return!1}verify_auth_req(t){if(!this._hasKey)return!1;let e;if(t instanceof Uint8Array?e=Xt(t,qt.AUTH_REQ,Qt.AUTH_REQ,Kt.AUTH_REQ):t&&"object"==typeof t&&(e=t),!e||e.header!==qt.AUTH_REQ||!(e.id8 instanceof Uint8Array)||8!==e.id8.length||!(e.nonce instanceof Uint8Array)||4!==e.nonce.length||!(e.hmac32 instanceof Uint8Array)||32!==e.hmac32.length||e.$OTHERS&&0!==e.$OTHERS.length)return!1;this.set_salt12(this.auth_salt12,"verify_auth_req 1/2"),this.generateHMAC(e.nonce);let r=this._hmac;if(Wt(e.hmac32,r)){this.remoteNonce=Yt.Buffer.from(e.nonce);let t=Yt.Buffer.concat([this.localNonce,this.remoteNonce,this.localNonce]);this.set_salt12(t,"verify_auth_req 2/2"),this.generateHMAC(e.nonce);let r=this._hmac,n=Pt.rawPack(Pt.MB("header","8",qt.AUTH_RES),Pt.MB("hmac32",r));return this.isAuthorized=!0,n}return!1}verify_auth_res(t){if(!this._hasKey)return!1;let e=Xt(t,qt.AUTH_RES,Qt.AUTH_RES,Kt.AUTH_RES);if(e){let t=Yt.Buffer.concat([this.remoteNonce,this.localNonce,this.remoteNonce]);if(this.set_salt12(t,"verify_auth_res"),this.generateHMAC(this.localNonce),Wt(this._hmac,e.hmac32))return this.isAuthorized=!0,!0}}encrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;t=Pt.B8(t),this.set_clock_nonce(this.remoteNonce),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_488),Pt.MB("#len","32L",t.byteLength),Pt.MB("#otpSrc8",this._otpSrc44.subarray(32,40)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;let e=t;if(t instanceof Uint8Array&&t[0]===qt.ENC_E2E){if(t.length<Qt.ENC_488)return;const r=Yt.Buffer.from(t),n=r.readUInt32LE(1);if(n>r.length-Qt.ENC_488)return;e=Yt.Buffer.from(r.subarray(0,Qt.ENC_488+n)),e[0]=qt.ENC_488}const r=Xt(e,qt.ENC_488,Qt.ENC_488,Kt.ENC_488,!0);if(!(r&&(n=r.otpSrc8,n.readUInt16LE(4)<1e3)))return;var n;this.set_salt12(Yt.Buffer.concat([r.otpSrc8,this.localNonce]),"decrypt_488"),this.resetOTP();const i=this.xotp(r.$OTHERS??Yt.Buffer.alloc(0));return Wt(this.getHMAC8(i),r.hmac8)?i:void 0}encryptPack(t){this._requireKey(),t=Pt.B8(t),this.set_clock_rand(),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_PACK),Pt.MB("#len","32L",t.byteLength),Pt.MB("#salt12",this._otpSrc44.subarray(32)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decryptPack(t){if(!this._hasKey)return;const e=Xt(t,qt.ENC_PACK,Qt.ENC_PACK,Kt.ENC_PACK,!0);if(!e)return;this.set_salt12(e.salt12,"decryptPack"),this.resetOTP();const r=this.xotp(e.$OTHERS??Yt.Buffer.alloc(0));return Wt(e.hmac,this.getHMAC8(r))?(e.data=r,e):void 0}encrypt_e2e(t,e){return this._withKey(e,()=>this.encryptPack(t))}decrypt_e2e(t,e){return this._withKey(e,()=>this.decryptPack(t))}_withKey(t,e){const r=Pt.B8(t);if(!r||0===r.length)throw new TypeError("Key must not be empty");const n=[Yt.Buffer.from(this._otpSrc44),Yt.Buffer.from(this._otp36),Yt.Buffer.from(this._hmac)],i=this._hasKey;try{return this._otpSrc44.set($t.hash(r),0),this._hasKey=!0,e()}finally{this._otpSrc44.set(n[0]),this._otp36.set(n[1]),this._hmac.set(n[2]),this._hasKey=i;for(const t of n)t.fill(0)}}}te.RAND=Zt,te.BohoMsg=qt,te.Meta=Kt,te.MetaSize=Qt,te.sha256=$t,te.MBP=Pt,te.Buffer=Yt.Buffer;const ee=k.Buffer,re=new TextEncoder,ne=new TextDecoder;function ie(t,e=!0){if("string"!=typeof t)throw TypeError("tag should be string.");const r=re.encode(t);if(!e&&0===r.byteLength||r.byteLength>H.TAG_LEN1)throw TypeError("tag UTF-8 byte length must be "+(e?"0":"1")+"~255");return r}class oe extends j{constructor(t){super(),this.cid="",this.ip="",this.socket=null,this.url=t,this.state=z.CLOSED,this.stateName=this.getStateName(),this._stateRevision=0,this.txCounter=0,this.rxCounter=0,this.txBytes=0,this.rxBytes=0,this.lastTxRxTime=Date.now(),this.connectionCheckerPeriod=H.CONNECTION_CHECKER_PERIOD,this.connectionCheckerIntervalID=null,this.boho=new te,this.serverTimeNonce=ee.alloc(te.MetaSize.SERVER_TIME_NONCE),this.TLS=!1,this.encMode=F.AUTO,this.useAuth=!1,this.nick="",this.channels=new Set,this.promiseMap=new Map,this.promiseTimeOut=H.PROMISE_TIMEOUT,this.mid=0,this.level=3,this.quota=q[this.level],this.serverSet={},this.linkMap=new Map,this.autoReconnect=!0,this._closed=!1,this.on("open",this.onOpen.bind(this)),this.on("close",this.onClose.bind(this)),this.on("socket_data",this.onData.bind(this))}close(){if(!1===this.autoReconnect&&(clearInterval(this.connectionCheckerIntervalID),this.connectionCheckerIntervalID=null),!this._closed){if(this._closed=!0,this.socket){if(0===this.socket.readyState){const t=this.socket;t.onopen=()=>{t&&t.close()},t.onmessage=null,t.onerror=null,t.onclose=null}else try{this.socket.close?.()}catch{}this.socket=null}this.promiseMap.clear(),this.cid="",this.boho&&(this.boho.isAuthorized=!1),this.state!==z.STOP&&this.stateChange("closed")&&this.emit("closed")}}stop(){this.autoReconnect=!1,this.close(),this.cid="",this.stateChange("stop","stop")}destroy(){this.stop(),this.removeAllListeners(),this.channels.clear(),this.linkMap.clear(),this.boho=null}keepAlive(){this.keepConnection(),Date.now()-this.lastTxRxTime>H.CLIENT_PING_PERIOD&&this.ping()}redirect(t){this.stateChange("redirecting","redirecting"),this.close(),this.createConnection(t)}open(t){this.socket&&this.close(),t&&(this.url=t),this.url?(this.createConnection(this.url),this._closed||this.connectionCheckerIntervalID||(this.connectionCheckerIntervalID=setInterval(this.keepAlive.bind(this),this.connectionCheckerPeriod))):this.emit("error",new Error("URL is not set."))}onOpen(){this._closed=!1,this.url.includes("wss://")?this.TLS=!0:this.TLS=!1,this.stateChange("open")}onClose(){this.close()}login(t,e){if(this.serverTimeNonce){this.auth(t,e),this.useAuth=!0;let r=this.boho.auth_req(this.serverTimeNonce);this.send(r),this.stateChange("auth_req","auth_req")}return this}auth(t,e){return t||e||this.emit("error",new Error("auth failed. no id and key.")),!e&&t.includes(".")?this.boho.set_id_key(t):t&&e?(this.boho.set_id8(t),this.boho.set_key(e)):this.emit("error",new Error("auth failed. no id or key.")),this.useAuth=!0,this}onData(t){let e,r=t[0];if(r===te.BohoMsg.ENC_488)e=this.boho.decrypt_488(t),e&&(r=e[0],t=e);else if(r===te.BohoMsg.ENC_E2E)try{if(e=this.boho.decrypt_488(t),!e)return;r=e[0],t.set(e,te.MetaSize.ENC_488),t=t.subarray(te.MetaSize.ENC_488)}catch(t){return}let n=G[r];switch(n||(n=te.BohoMsg[r]),r){case G.OVER_SIZE:console.log("## server sent: over_size event."),this.emit("over_size","over_size");break;case G.PING:this.pong();break;case G.PONG:break;case G.ECHO:try{let e=ne.decode(t.subarray(1));this.emit("echo",e)}catch(t){this.emit("error",new Error("ECHO data error"))}break;case G.IAM_RES:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.ip&&(this.ip=r.ip),r.nick&&(this.nick=r.nick),r.did&&(this.did=r.did),r.uid&&(this.uid=r.uid),this.emit("iam_res",e)}catch(t){this.emit("error",new Error("IAM_RES data error"))}break;case G.CID_RES:let r=ne.decode(t.subarray(1));this.cid=r,this.stateChange("ready","cid_ready"),this.subscribe_channels();break;case G.QUOTA_LEVEL:let n=t[1];this.level=n,this.quota=q[n];break;case G.AUTH_CLEAR:this.useAuth=!1,this.boho.clearAuth(),this.stateChange("auth_clear","server request auth_clear."),this.stop();break;case G.SERVER_REDIRECT:let i,o,s;7==t.byteLength?(i=function(t){if(6!=t.byteLength)return;return t[0].toString()+"."+t[1].toString()+"."+t[2].toString()+"."+t[3].toString()+":"+((t[4]<<8)+t[5]).toString()}(t.subarray(1)),s="cong://"):(i=ne.decode(t.subarray(1)),s=""),o=s+i,this.redirect(o);break;case te.BohoMsg.SERVER_TIME_NONCE:if(t.copy(this.serverTimeNonce),!this.stateChange("server_ready","server_ready"))break;this.useAuth?(this.send(this.boho.auth_req(t)),this.stateChange("auth_req","auth_req")):this.send(ee.from([G.CID_REQ]));break;case G.SERVER_SIGNAL:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.event&&r.data&&(this.serverSet=r.data,this.emit(r.event,r.data))}catch(t){this.emit("error",new Error("SERVER_SIGNAL parsing error"))}break;case G.SET:try{let e=k.unpack(t);e&&this.emit(e.topic,...e.args)}catch(t){this.emit("error",new Error("SET parsing error"))}break;case G.SIGNAL_E2E:case G.SIGNAL:try{let e=t.readUint8(1),r=t.subarray(2,2+e),n=ne.decode(r),i=t.readUint8(2+e),o=t.subarray(3+e);switch(i){case V.EMPTY:0===n.indexOf("@")?this.emit("@",n):(this.emit(n,n),this.emit("message",n));break;case V.TEXT:let t=o;0===o[o.byteLength-1]&&(t=o.subarray(0,o.byteLength-1));let e=ne.decode(t);0===n.indexOf("@")?this.emit("@",n,e):(this.emit(n,n,e),this.emit("message",n,e));break;case V.BINARY:0===n.indexOf("@")?this.emit("@",n,o):(this.emit(n,n,o),this.emit("message",n,o));break;case V.OBJECT:let r=ne.decode(o),i=JSON.parse(r);0===n.indexOf("@")?this.emit("@",n,i):(this.emit(n,n,i),this.emit("message",n,i));break;case V.MJSON:let s=ne.decode(o),f=JSON.parse(s);0===n.indexOf("@")?this.emit("@",n,...f):(this.emit(n,n,...f),this.emit("message",n,...f));break;case V.MBA:let u=k.unpack(o);0===n.indexOf("@")?this.emit("@",n,...u.args):(this.emit(n,n,...u.args),this.emit("message",n,...u.args))}}catch(t){console.log("IOCore IOMsg.SIGNAL parser err",t)}break;case G.RESPONSE_MBP:this.testPromise(t);break;case te.BohoMsg.AUTH_FAIL:this.boho.isAuthorized=!1,this.stateChange("auth_fail","auth_fail from server.");break;case te.BohoMsg.AUTH_RES:if(this.boho.verify_auth_res(t)){if(!this.stateChange("auth_res","server sent auth_res"))break;this.send(ee.from([G.CID_REQ]))}else this.boho.isAuthorized=!1,this.stateChange("auth_fail","verify_auth_res() invalid server_hmac");break;default:try{e=ne.decode(t),this.emit("text_message",e)}catch(t){}}}iam(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM),k.MB("#",t))):this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM)))}ping(){this.send(ee.from([G.PING]))}pong(){this.send(ee.from([G.PONG]))}echo(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.ECHO),k.MB("#msg",t))):this.send(ee.from([G.ECHO]))}bin(...t){this.send(k.U8pack(...t))}send(t){if(t.byteLength>this.quota.signalSize)return this.emit("over_size"),console.log("## QUOTA LIMIT OVER!! \nsignal message.byteLength: ",t.byteLength),void console.log("## your maximum signalSize(bytes) is:",this.quota.signalSize);this.socket_send(t)}getEncryptionMode(){return!(this.encMode!==F.YES&&(this.encMode!==F.AUTO||this.TLS||!this.boho.isAuthorized))}send_enc_mode(t,e){if(void 0===e&&(e=this.getEncryptionMode()),t[0]==G.SIGNAL_E2E&&e){let e=t[1],r=this.boho.encrypt_488(t.subarray(0,3+e));r[0]=te.BohoMsg.ENC_E2E,this.send(ee.concat([r,t.subarray(3+e)]))}else if(e){let e=this.boho.encrypt_488(t);this.send(e)}else this.send(t)}setMsgPromise(t){return new Promise((e,r)=>{const n=setTimeout(e=>{this.promiseMap.has(t)&&(r("timeout"),this.promiseMap.delete(t))},this.promiseTimeOut);this.promiseMap.set(t,[e,r,n])})}testPromise(t){let e=k.unpack(t);if(e)if(this.promiseMap.has(e.mid)){let[t,r,n]=this.promiseMap.get(e.mid);clearTimeout(n),this.promiseMap.delete(e.mid),e.status<128?(e.ok=!0,t(e)):(e.ok=!1,r(e))}else console.log("no promise id")}publish(t,...e){this.signal(t,...e)}signal(t,...e){if("string"!=typeof t)throw TypeError("tag should be string.");t.startsWith("@")&&this.cid&&ie(this.cid+t);let r=J(t,...e);this.send_enc_mode(r)}decrypt_e2e(t,e){return this.boho.decrypt_e2e(t,e)}signal_e2e(t,e,r){const n=ie(t);if(t.startsWith("@")&&this.cid&&ie(this.cid+t),!this.boho.isAuthorized)return;let i=k.B8(e),o=this.boho.encrypt_e2e(i,r),s=k.pack(k.MB("#MsgType","8",G.SIGNAL_E2E),k.MB("#tagLen","8",n.byteLength),k.MB("#tag",n),k.MB("#payloadType","8",V.BINARY),k.MB("#payload",o));this.send_enc_mode(s)}set(t,...e){return t&&0!=e.length?this.call("store","set",t,...e):Promise.reject(new Error("set need storeName and value)"))}async get(t){if(!t)return Promise.reject(new Error("store get need storeName)"));let e=await this.call("store","get",t),{$:r}=k.unpack(e.body);return r}call(t,e,...r){if(!t||!e)return Promise.reject(new Error("request need target and topic)"));let n;return n=r.length>0?k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e),k.MBA(...r)):k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e)),this.send_enc_mode(n),this.setMsgPromise(this.mid)}subscribe(t){const e=ie(t);this.send_enc_mode(ee.concat([k.NB("8",G.SUBSCRIBE),k.NB("8",e.byteLength),e]))}subscribe_channels(){if(this.state!==z.READY||0===this.channels.size)return;const t=Array.from(this.channels).join(",").split(","),e=t.map(t=>ie(t).byteLength),r=[];let n=[],i=0;t.forEach((t,o)=>{n.length&&i+1+e[o]>H.TAG_LEN1&&(r.push(n.join(",")),n=[],i=0),i+=(n.length?1:0)+e[o],n.push(t)}),n.length&&r.push(n.join(",")),r.forEach(t=>this.subscribe(t))}unsubscribe(t=""){const e=ie(t);if(""==t)this.channels.clear();else{t.split(",").forEach(t=>{this.channels.delete(t)})}this.send_enc_mode(ee.concat([k.NB("8",G.UNSUBSCRIBE),k.NB("8",e.byteLength),e]))}listen(t,e){if("string"!=typeof t)throw TypeError("tag should be string.");if(ie(t,!1),"function"!=typeof e)throw TypeError("handler is not a function.");0!==t.indexOf("@")&&this.channels.add(t),this.on(t,e)}link(t,e,r){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");if(ie(e,!1),"function"!=typeof r)throw TypeError("handler is not a function.");let n;0!==e.indexOf("@")&&this.channels.add(e),n=this.linkMap.has(t)?this.linkMap.get(t):new Set,n.add(e),this.linkMap.set(t,n),this.on(e,r),this.subscribe(e)}unlink(t,e){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");ie(e,!1);const r=this.linkMap.get(t);r&&r.has(e)&&(this.unsubscribe(e),this.removeAllListeners(e),r.delete(e),0===r.size&&this.linkMap.delete(t))}unlinkAll(t){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");const e=this.linkMap.get(t);if(e){for(const t of e)this.unsubscribe(t),this.removeAllListeners(t);this.linkMap.delete(t)}}getMetric(){return{tx:this.txCounter,rx:this.rxCounter,txb:this.txBytes,rxb:this.rxBytes,last:(Date.now()-this.lastTxRxTime)/1e3}}getState(){return this.state}getStateName(){return z[this.state].toLowerCase()}getSecurity(){return{useAuth:this.useAuth,isTLS:this.TLS,isAuthorized:this.boho.isAuthorized,encMode:this.encMode,usingEncryption:this.getEncryptionMode()}}stateChange(t,e){let r=t.toLowerCase();const n=z[t.toUpperCase()];if("number"!=typeof n)throw new TypeError("Unknown state: "+t);const i=this.state!==n;this.state=n,this.stateName=r,i&&this._stateRevision++;const o=this._stateRevision;return i&&this.emit("change",r),o===this._stateRevision&&(e&&this.emit(r,e),o===this._stateRevision)}}const se=te.Buffer;class fe extends oe{static version="6.1.2";static binaryType="arraybuffer";static Boho=te;static MBP=te.MBP;static Buffer=te.Buffer;static constants=Y;static instanceCount=0;static webSocketCount=0;constructor(t){super(t),fe.instanceCount++,this.boundBrowserVisiblePing=this.browserVisiblePing.bind(this),document.addEventListener("visibilitychange",this.boundBrowserVisiblePing),t&&this.open()}browserVisiblePing(){"visible"===document.visibilityState&&this.ping()}stop(){super.stop()}destroy(){document.removeEventListener("visibilitychange",this.boundBrowserVisiblePing),super.destroy()}keepConnection(){this.autoReconnect&&(this.socket&&this.socket.readyState!==WebSocket.CLOSED||this.open())}createConnection(t){fe.webSocketCount++;const e=this.socket=new WebSocket(t);this._closed=!1,this.socket.binaryType=fe.binaryType,this.socket.onopen=()=>{this.socket===e&&("arraybuffer"==this.socket.binaryType?this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessage(t)}:this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessageBlob(t)},this.emit("open"))},this.socket.onerror=t=>{this.socket===e&&this.emit("error",t)},this.socket.onclose=()=>{this.socket===e&&this.emit("close")},this.stateChange("connecting","connecting")}onWebSocketMessage(t){this.rxCounter++,this.lastTxRxTime=Date.now();let e=se.from(t.data);this.rxBytes+=e.byteLength,this.emit("socket_data",e)}async onWebSocketMessageBlob(t){const e=this.socket;let r;if(this.rxCounter++,this.lastTxRxTime=Date.now(),t.data instanceof Blob){let e=await t.data.arrayBuffer();r=se.from(e)}else r=se.from(t.data);this.rxBytes+=r.byteLength,this.socket===e&&this.emit("socket_data",r)}socket_send(t){1===this.socket?.readyState?(this.socket.send(t),this.txCounter++,this.txBytes+=t.byteLength,this.lastTxRxTime=Date.now()):console.log(".")}}export{fe as default};
|
|
23
23
|
//# sourceMappingURL=io.js.map
|
package/dist/browser/iife/io.js
CHANGED
|
@@ -19,5 +19,5 @@ var s=(r||(r=1,function(r){const n=function(){if(t)return i;t=1,i.byteLength=fun
|
|
|
19
19
|
*
|
|
20
20
|
* @author Feross Aboukhadijeh <https://feross.org>
|
|
21
21
|
* @license MIT
|
|
22
|
-
*/var Yt=(zt||(zt=1,function(t){const e=function(){if(Dt)return Ht;Dt=1,Ht.byteLength=function(t){var e=o(t),r=e[0],n=e[1];return 3*(r+n)/4-n},Ht.toByteArray=function(t){var n,i,s=o(t),f=s[0],u=s[1],h=new r(function(t,e,r){return 3*(e+r)/4-r}(0,f,u)),a=0,c=u>0?f-4:f;for(i=0;i<c;i+=4)n=e[t.charCodeAt(i)]<<18|e[t.charCodeAt(i+1)]<<12|e[t.charCodeAt(i+2)]<<6|e[t.charCodeAt(i+3)],h[a++]=n>>16&255,h[a++]=n>>8&255,h[a++]=255&n;return 2===u&&(n=e[t.charCodeAt(i)]<<2|e[t.charCodeAt(i+1)]>>4,h[a++]=255&n),1===u&&(n=e[t.charCodeAt(i)]<<10|e[t.charCodeAt(i+1)]<<4|e[t.charCodeAt(i+2)]>>2,h[a++]=n>>8&255,h[a++]=255&n),h},Ht.fromByteArray=function(e){for(var r,n=e.length,i=n%3,o=[],s=16383,u=0,h=n-i;u<h;u+=s)o.push(f(e,u,u+s>h?h:u+s));return 1===i?(r=e[n-1],o.push(t[r>>2]+t[r<<4&63]+"==")):2===i&&(r=(e[n-2]<<8)+e[n-1],o.push(t[r>>10]+t[r>>4&63]+t[r<<2&63]+"=")),o.join("")};for(var t=[],e=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0;i<64;++i)t[i]=n[i],e[n.charCodeAt(i)]=i;function o(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function s(e){return t[e>>18&63]+t[e>>12&63]+t[e>>6&63]+t[63&e]}function f(t,e,r){for(var n,i=[],o=e;o<r;o+=3)n=(t[o]<<16&16711680)+(t[o+1]<<8&65280)+(255&t[o+2]),i.push(s(n));return i.join("")}return e["-".charCodeAt(0)]=62,e["_".charCodeAt(0)]=63,Ht}(),r=Gt(),n="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=s,t.SlowBuffer=function(t){return+t!=t&&(t=0),s.alloc(+t)},t.INSPECT_MAX_BYTES=50;const i=2147483647;function o(t){if(t>i)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,s.prototype),e}function s(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return h(t)}return f(t,e,r)}function f(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!s.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|p(t,e);let n=o(r);const i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(q(t,Uint8Array)){const e=new Uint8Array(t);return c(e.buffer,e.byteOffset,e.byteLength)}return a(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(q(t,ArrayBuffer)||t&&q(t.buffer,ArrayBuffer))return c(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(q(t,SharedArrayBuffer)||t&&q(t.buffer,SharedArrayBuffer)))return c(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return s.from(n,e,r);const i=function(t){if(s.isBuffer(t)){const e=0|l(t.length),r=o(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||K(t.length)?o(0):a(t):"Buffer"===t.type&&Array.isArray(t.data)?a(t.data):void 0}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return s.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function u(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function h(t){return u(t),o(t<0?0:0|l(t))}function a(t){const e=t.length<0?0:0|l(t.length),r=o(e);for(let n=0;n<e;n+=1)r[n]=255&t[n];return r}function c(t,e,r){if(e<0||t.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(t.byteLength<e+(r||0))throw new RangeError('"length" is outside of buffer bounds');let n;return n=void 0===e&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,e):new Uint8Array(t,e,r),Object.setPrototypeOf(n,s.prototype),n}function l(t){if(t>=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|t}function p(t,e){if(s.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||q(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let i=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return V(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return G(t).length;default:if(i)return n?-1:V(t).length;e=(""+e).toLowerCase(),i=!0}}function y(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return I(this,e,r);case"ascii":return U(this,e,r);case"latin1":case"binary":return L(this,e,r);case"base64":return A(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function d(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),K(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=s.from(e,n)),s.isBuffer(e))return 0===e.length?-1:b(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):b(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function b(t,e,r,n,i){let o,s=1,f=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,f/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){let n=-1;for(o=r;o<f;o++)if(h(t,o)===h(e,-1===n?0:o-n)){if(-1===n&&(n=o),o-n+1===u)return n*s}else-1!==n&&(o-=o-n),n=-1}else for(r+u>f&&(r=f-u),o=r;o>=0;o--){let r=!0;for(let n=0;n<u;n++)if(h(t,o+n)!==h(e,n)){r=!1;break}if(r)return o}return-1}function w(t,e,r,n){r=Number(r)||0;const i=t.length-r;n?(n=Number(n))>i&&(n=i):n=i;const o=e.length;let s;for(n>o/2&&(n=o/2),s=0;s<n;++s){const n=parseInt(e.substr(2*s,2),16);if(K(n))return s;t[r+s]=n}return s}function E(t,e,r,n){return Y(V(e,t.length-r),t,r,n)}function B(t,e,r,n){return Y(function(t){const e=[];for(let r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function m(t,e,r,n){return Y(G(e),t,r,n)}function _(t,e,r,n){return Y(function(t,e){let r,n,i;const o=[];for(let s=0;s<t.length&&!((e-=2)<0);++s)r=t.charCodeAt(s),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function A(t,r,n){return 0===r&&n===t.length?e.fromByteArray(t):e.fromByteArray(t.slice(r,n))}function I(t,e,r){r=Math.min(t.length,r);const n=[];let i=e;for(;i<r;){const e=t[i];let o=null,s=e>239?4:e>223?3:e>191?2:1;if(i+s<=r){let r,n,f,u;switch(s){case 1:e<128&&(o=e);break;case 2:r=t[i+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(o=u));break;case 3:r=t[i+1],n=t[i+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(o=u));break;case 4:r=t[i+1],n=t[i+2],f=t[i+3],128==(192&r)&&128==(192&n)&&128==(192&f)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&f,u>65535&&u<1114112&&(o=u))}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){const e=t.length;if(e<=v)return String.fromCharCode.apply(String,t);let r="",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=v));return r}(n)}t.kMaxLength=i,s.TYPED_ARRAY_SUPPORT=function(){try{const t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}(),s.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(s.prototype,"parent",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.buffer}}),Object.defineProperty(s.prototype,"offset",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.byteOffset}}),s.poolSize=8192,s.from=function(t,e,r){return f(t,e,r)},Object.setPrototypeOf(s.prototype,Uint8Array.prototype),Object.setPrototypeOf(s,Uint8Array),s.alloc=function(t,e,r){return function(t,e,r){return u(t),t<=0?o(t):void 0!==e?"string"==typeof r?o(t).fill(e,r):o(t).fill(e):o(t)}(t,e,r)},s.allocUnsafe=function(t){return h(t)},s.allocUnsafeSlow=function(t){return h(t)},s.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==s.prototype},s.compare=function(t,e){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),q(e,Uint8Array)&&(e=s.from(e,e.offset,e.byteLength)),!s.isBuffer(t)||!s.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let r=t.length,n=e.length;for(let i=0,o=Math.min(r,n);i<o;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},s.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(t,e){if(!Array.isArray(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return s.alloc(0);let r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;const n=s.allocUnsafe(e);let i=0;for(r=0;r<t.length;++r){let e=t[r];if(q(e,Uint8Array))i+e.length>n.length?(s.isBuffer(e)||(e=s.from(e)),e.copy(n,i)):Uint8Array.prototype.set.call(n,e,i);else{if(!s.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,i)}i+=e.length}return n},s.byteLength=p,s.prototype._isBuffer=!0,s.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;e<t;e+=2)g(this,e,e+1);return this},s.prototype.swap32=function(){const t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t;e+=4)g(this,e,e+3),g(this,e+1,e+2);return this},s.prototype.swap64=function(){const t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let e=0;e<t;e+=8)g(this,e,e+7),g(this,e+1,e+6),g(this,e+2,e+5),g(this,e+3,e+4);return this},s.prototype.toString=function(){const t=this.length;return 0===t?"":0===arguments.length?I(this,0,t):y.apply(this,arguments)},s.prototype.toLocaleString=s.prototype.toString,s.prototype.equals=function(t){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===s.compare(this,t)},s.prototype.inspect=function(){let e="";const r=t.INSPECT_MAX_BYTES;return e=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(e+=" ... "),"<Buffer "+e+">"},n&&(s.prototype[n]=s.prototype.inspect),s.prototype.compare=function(t,e,r,n,i){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),!s.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;let o=(i>>>=0)-(n>>>=0),f=(r>>>=0)-(e>>>=0);const u=Math.min(o,f),h=this.slice(n,i),a=t.slice(e,r);for(let t=0;t<u;++t)if(h[t]!==a[t]){o=h[t],f=a[t];break}return o<f?-1:f<o?1:0},s.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},s.prototype.indexOf=function(t,e,r){return d(this,t,e,r,!0)},s.prototype.lastIndexOf=function(t,e,r){return d(this,t,e,r,!1)},s.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let o=!1;for(;;)switch(n){case"hex":return w(this,t,e,r);case"utf8":case"utf-8":return E(this,t,e,r);case"ascii":case"latin1":case"binary":return B(this,t,e,r);case"base64":return m(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const v=4096;function U(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function L(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function T(t,e,r){const n=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>n)&&(r=n);let i="";for(let n=e;n<r;++n)i+=J[t[n]];return i}function S(t,e,r){const n=t.slice(e,r);let i="";for(let t=0;t<n.length-1;t+=2)i+=String.fromCharCode(n[t]+256*n[t+1]);return i}function R(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function O(t,e,r,n,i,o){if(!s.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<o)throw new RangeError('"value" argument is out of bounds');if(r+n>t.length)throw new RangeError("Index out of range")}function M(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,r}function C(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r+7]=o,o>>=8,t[r+6]=o,o>>=8,t[r+5]=o,o>>=8,t[r+4]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s>>=8,t[r+2]=s,s>>=8,t[r+1]=s,s>>=8,t[r]=s,r+8}function N(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function k(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,4),r.write(t,e,n,i,23,4),n+4}function x(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,8),r.write(t,e,n,i,52,8),n+8}s.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t);const n=this.subarray(t,e);return Object.setPrototypeOf(n,s.prototype),n},s.prototype.readUintLE=s.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return n},s.prototype.readUintBE=s.prototype.readUIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t+--e],i=1;for(;e>0&&(i*=256);)n+=this[t+--e]*i;return n},s.prototype.readUint8=s.prototype.readUInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),this[t]},s.prototype.readUint16LE=s.prototype.readUInt16LE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]|this[t+1]<<8},s.prototype.readUint16BE=s.prototype.readUInt16BE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]<<8|this[t+1]},s.prototype.readUint32LE=s.prototype.readUInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},s.prototype.readUint32BE=s.prototype.readUInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},s.prototype.readBigUInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,i=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(i)<<BigInt(32))}),s.prototype.readBigUInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],i=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<<BigInt(32))+BigInt(i)}),s.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return i*=128,n>=i&&(n-=Math.pow(2,8*e)),n},s.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=e,i=1,o=this[t+--n];for(;n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},s.prototype.readInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},s.prototype.readInt16LE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},s.prototype.readInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},s.prototype.readBigInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<<BigInt(32))+BigInt(e+256*this[++t]+65536*this[++t]+this[++t]*2**24)}),s.prototype.readBigInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<<BigInt(32))+BigInt(this[++t]*2**24+65536*this[++t]+256*this[++t]+r)}),s.prototype.readFloatLE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!0,23,4)},s.prototype.readFloatBE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!1,23,4)},s.prototype.readDoubleLE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!0,52,8)},s.prototype.readDoubleBE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!1,52,8)},s.prototype.writeUintLE=s.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=1,o=0;for(this[e]=255&t;++o<r&&(i*=256);)this[e+o]=t/i&255;return e+r},s.prototype.writeUintBE=s.prototype.writeUIntBE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=r-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+r},s.prototype.writeUint8=s.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,255,0),this[e]=255&t,e+1},s.prototype.writeUint16LE=s.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeUint16BE=s.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeUint32LE=s.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},s.prototype.writeUint32BE=s.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigUInt64LE=Q(function(t,e=0){return M(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeBigUInt64BE=Q(function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=0,o=1,s=0;for(this[e]=255&t;++i<r&&(o*=256);)t<0&&0===s&&0!==this[e+i-1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=r-1,o=1,s=0;for(this[e+i]=255&t;--i>=0&&(o*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},s.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},s.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigInt64LE=Q(function(t,e=0){return M(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeBigInt64BE=Q(function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeFloatLE=function(t,e,r){return k(this,t,e,!0,r)},s.prototype.writeFloatBE=function(t,e,r){return k(this,t,e,!1,r)},s.prototype.writeDoubleLE=function(t,e,r){return x(this,t,e,!0,r)},s.prototype.writeDoubleBE=function(t,e,r){return x(this,t,e,!1,r)},s.prototype.copy=function(t,e,r,n){if(!s.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);const i=n-r;return this===t&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(e,r,n):Uint8Array.prototype.set.call(t,this.subarray(r,n),e),i},s.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){const e=t.charCodeAt(0);("utf8"===n&&e<128||"latin1"===n)&&(t=e)}}else"number"==typeof t?t&=255:"boolean"==typeof t&&(t=Number(t));if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;let i;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(i=e;i<r;++i)this[i]=t;else{const o=s.isBuffer(t)?t:s.from(t,n),f=o.length;if(0===f)throw new TypeError('The value "'+t+'" is invalid for argument "value"');for(i=0;i<r-e;++i)this[i+e]=o[i%f]}return this};const P={};function $(t,e,r){P[t]=class extends r{constructor(){super(),Object.defineProperty(this,"message",{value:e.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${t}]`,this.stack,delete this.name}get code(){return t}set code(t){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:t,writable:!0})}toString(){return`${this.name} [${t}]: ${this.message}`}}}function D(t){let e="",r=t.length;const n="-"===t[0]?1:0;for(;r>=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function j(t,e,r,n,i,o){if(t>r||t<e){const r="bigint"==typeof e?"n":"";let n;throw n=0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(o+1)}${r}`:`>= -(2${r} ** ${8*(o+1)-1}${r}) and < 2 ** ${8*(o+1)-1}${r}`,new P.ERR_OUT_OF_RANGE("value",n,t)}!function(t,e,r){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||F(e,t.length-(r+1))}(n,i,o)}function z(t,e){if("number"!=typeof t)throw new P.ERR_INVALID_ARG_TYPE(e,"number",t)}function F(t,e,r){if(Math.floor(t)!==t)throw z(t,r),new P.ERR_OUT_OF_RANGE("offset","an integer",t);if(e<0)throw new P.ERR_BUFFER_OUT_OF_BOUNDS;throw new P.ERR_OUT_OF_RANGE("offset",`>= 0 and <= ${e}`,t)}$("ERR_BUFFER_OUT_OF_BOUNDS",function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),$("ERR_INVALID_ARG_TYPE",function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`},TypeError),$("ERR_OUT_OF_RANGE",function(t,e,r){let n=`The value of "${t}" is out of range.`,i=r;return Number.isInteger(r)&&Math.abs(r)>2**32?i=D(String(r)):"bigint"==typeof r&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=D(i)),i+="n"),n+=` It must be ${e}. Received ${i}`,n},RangeError);const H=/[^+/0-9A-Za-z-_]/g;function V(t,e){let r;e=e||1/0;const n=t.length;let i=null;const o=[];for(let s=0;s<n;++s){if(r=t.charCodeAt(s),r>55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function G(t){return e.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(H,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Y(t,e,r,n){let i;for(i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function q(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function K(t){return t!=t}const J=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let i=0;i<16;++i)e[n+i]=t[r]+t[i]}return e}();function Q(t){return"undefined"==typeof BigInt?W:t}function W(){throw new Error("BigInt not supported")}}(Ft)),Ft);let qt={SERVER_TIME_NONCE:176,AUTH_REQ:177,AUTH_RES:178,AUTH_FAIL:179,ENC_PACK:182,ENC_E2E:183,ENC_488:184};for(let t in qt)qt[qt[t]]=t;const Kt={SERVER_TIME_NONCE:Pt.meta(Pt.MB("header","8",0),Pt.MB("unixTime","32L",0),Pt.MB("milTime","16L",0),Pt.MB("counter","16L",0),Pt.MB("nonce",Yt.Buffer.alloc(4))),AUTH_REQ:Pt.meta(Pt.MB("header","8",0),Pt.MB("id8",Yt.Buffer.alloc(8)),Pt.MB("nonce",Yt.Buffer.alloc(4)),Pt.MB("hmac32",Yt.Buffer.alloc(32))),AUTH_RES:Pt.meta(Pt.MB("header","8",0),Pt.MB("hmac32",Yt.Buffer.alloc(32))),ENC_PACK:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("salt12",Yt.Buffer.alloc(12)),Pt.MB("hmac",8,0)),ENC_488:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("otpSrc8",Yt.Buffer.alloc(8)),Pt.MB("hmac8",Yt.Buffer.alloc(8)))};function Jt(t){let e=t[t.length-1];return e[2]+e[3]}const Qt={SERVER_TIME_NONCE:Jt(Kt.SERVER_TIME_NONCE),AUTH_REQ:Jt(Kt.AUTH_REQ),AUTH_RES:Jt(Kt.AUTH_RES),ENC_PACK:Jt(Kt.ENC_PACK),ENC_488:Jt(Kt.ENC_488)};function Wt(t,e){if(!(t instanceof Uint8Array&&e instanceof Uint8Array&&t.length===e.length))return!1;let r=0;for(let n=0;n<t.length;n++)r|=t[n]^e[n];return 0===r}function Xt(t,e,r,n,i=!1){if(!(t instanceof Uint8Array))return;const o=Yt.Buffer.from(t);return o.length<r||o[0]!==e||(i?o.readUInt32LE(1)!==o.length-r:o.length!==r)?void 0:Pt.unpack(o,n)}function Zt(t){return globalThis.crypto.getRandomValues(Yt.Buffer.alloc(t))}class te{constructor(){this._id8=Yt.Buffer.alloc(8),this._otpSrc44=Yt.Buffer.alloc(44),this._otp36=Yt.Buffer.alloc(36),this._hmac=Yt.Buffer.alloc(32),this.auth_salt12=Yt.Buffer.alloc(12),this.localNonce=Yt.Buffer.alloc(4),this.remoteNonce=Yt.Buffer.alloc(4),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}clearAuth(){this._id8.fill(0),this._otpSrc44.fill(0),this._otp36.fill(0),this._hmac.fill(0),this.auth_salt12.fill(0),this.localNonce.fill(0),this.remoteNonce.fill(0),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}set_hash_id8(t){Pt.B8($t.hash(t)).copy(this._id8,0,0,8)}set_id8(t){let e=Pt.B8(t);this._id8.fill(0),e.copy(this._id8,0,0,8)}set_key(t){const e=Pt.B8(t);if(!e||0===e.length)throw new TypeError("Key must not be empty");this.copy_key(Pt.B8($t.hash(e)))}set_id_key(t){let e=t.indexOf(".");if(-1==e)return;let r=t.substring(0,e),n=t.substring(e+1);this.set_id8(r),this.set_key(n)}copy_id8(t){t.copy(this._id8,0,0,8)}copy_key(t){if(!(t instanceof Uint8Array)||32!==t.length)throw new TypeError("copy_key requires exactly 32 bytes");this._otpSrc44.set(t,0),this._hasKey=!0}sha256_n(t,e){let r=$t.hash(t);for(let t=0;t<e;t++)r=$t.hash(r);return r}set_clock_rand(){this.set_clock_nonce(Zt(4))}set_clock_nonce(t){if(!(t instanceof Uint8Array)||4!==t.length)throw new TypeError("Nonce must be 4 bytes");let e=Math.max(Date.now(),this._lastSendTime);if(this.counter=this.counter+1&65535,0===this.counter&&e===this._lastSendTime&&e++,!Number.isSafeInteger(e)||e<0||Math.floor(e/1e3)>4294967295)throw new RangeError("Clock is outside the protocol range");this._lastSendTime=e,Yt.Buffer.concat([Pt.NB("32L",Math.floor(e/1e3)),Pt.NB("16L",e%1e3),Pt.NB("16L",this.counter),Yt.Buffer.from(t)]).copy(this._otpSrc44,32)}_requireKey(){if(!this._hasKey)throw new Error("Set a key before encryption or authentication")}set_salt12(t,e){if(12!=t.byteLength)throw TypeError("set_salt12: Invalid salt12 byteLength.");t.copy(this._otpSrc44,32)}resetOTP(){this._requireKey(),Pt.B8($t.hash(this._otpSrc44)).copy(this._otp36,0,0,32)}getIndexOTP(t){return this._otp36.writeUInt32LE(t,32),$t.hash(this._otp36)}generateHMAC(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);this._hmac=Pt.B8($t.hash(e))}getHMAC8(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);return this._hmac=Pt.B8($t.hash(e)),this._hmac.subarray(0,8)}xotp(t,e=0,r=!1){let n=(t=Pt.B8(t,r)).byteLength,i=e,o=0,s=0;for(;n>0;){s=n<32?n:32;let e=this.getIndexOTP(++i);for(let r=0;r<s;r++)t[o++]^=e[r];n-=32}return t}server_time_nonce(){const t=Date.now(),e=Math.floor(t/1e3),r=t%1e3;return this.localNonce=Zt(4),this.auth_salt12=Yt.Buffer.concat([Pt.NB("32L",e),Pt.NB("16L",r),Zt(2),this.localNonce]),Yt.Buffer.concat([Pt.NB("8",qt.SERVER_TIME_NONCE),this.auth_salt12])}auth_req(t){if(!this._hasKey)return!1;let e=Xt(t,qt.SERVER_TIME_NONCE,Qt.SERVER_TIME_NONCE,Kt.SERVER_TIME_NONCE);if(e&&e.milTime>=1e3)return!1;if(e){let t=Yt.Buffer.concat([Pt.NB("32L",e.unixTime),Pt.NB("16L",e.milTime),Pt.NB("16L",e.counter),e.nonce]);return this.set_salt12(t,"auth_req"),this.localNonce=Zt(4),this.generateHMAC(this.localNonce),this.remoteNonce=e.nonce,Pt.pack(Pt.MB("#header","8",qt.AUTH_REQ),Pt.MB("#id8",this._id8),Pt.MB("#nonce",this.localNonce),Pt.MB("#hmac32",this._hmac))}return!1}verify_auth_req(t){if(!this._hasKey)return!1;let e;if(t instanceof Uint8Array?e=Xt(t,qt.AUTH_REQ,Qt.AUTH_REQ,Kt.AUTH_REQ):t&&"object"==typeof t&&(e=t),!e||e.header!==qt.AUTH_REQ||!(e.id8 instanceof Uint8Array)||8!==e.id8.length||!(e.nonce instanceof Uint8Array)||4!==e.nonce.length||!(e.hmac32 instanceof Uint8Array)||32!==e.hmac32.length||e.$OTHERS&&0!==e.$OTHERS.length)return!1;this.set_salt12(this.auth_salt12,"verify_auth_req 1/2"),this.generateHMAC(e.nonce);let r=this._hmac;if(Wt(e.hmac32,r)){this.remoteNonce=Yt.Buffer.from(e.nonce);let t=Yt.Buffer.concat([this.localNonce,this.remoteNonce,this.localNonce]);this.set_salt12(t,"verify_auth_req 2/2"),this.generateHMAC(e.nonce);let r=this._hmac,n=Pt.rawPack(Pt.MB("header","8",qt.AUTH_RES),Pt.MB("hmac32",r));return this.isAuthorized=!0,n}return!1}verify_auth_res(t){if(!this._hasKey)return!1;let e=Xt(t,qt.AUTH_RES,Qt.AUTH_RES,Kt.AUTH_RES);if(e){let t=Yt.Buffer.concat([this.remoteNonce,this.localNonce,this.remoteNonce]);if(this.set_salt12(t,"verify_auth_res"),this.generateHMAC(this.localNonce),Wt(this._hmac,e.hmac32))return this.isAuthorized=!0,!0}}encrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;t=Pt.B8(t),this.set_clock_nonce(this.remoteNonce),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_488),Pt.MB("#len","32L",t.byteLength),Pt.MB("#otpSrc8",this._otpSrc44.subarray(32,40)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;let e=t;if(t instanceof Uint8Array&&t[0]===qt.ENC_E2E){if(t.length<Qt.ENC_488)return;const r=Yt.Buffer.from(t),n=r.readUInt32LE(1);if(n>r.length-Qt.ENC_488)return;e=Yt.Buffer.from(r.subarray(0,Qt.ENC_488+n)),e[0]=qt.ENC_488}const r=Xt(e,qt.ENC_488,Qt.ENC_488,Kt.ENC_488,!0);if(!(r&&(n=r.otpSrc8,n.readUInt16LE(4)<1e3)))return;var n;this.set_salt12(Yt.Buffer.concat([r.otpSrc8,this.localNonce]),"decrypt_488"),this.resetOTP();const i=this.xotp(r.$OTHERS??Yt.Buffer.alloc(0));return Wt(this.getHMAC8(i),r.hmac8)?i:void 0}encryptPack(t){this._requireKey(),t=Pt.B8(t),this.set_clock_rand(),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_PACK),Pt.MB("#len","32L",t.byteLength),Pt.MB("#salt12",this._otpSrc44.subarray(32)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decryptPack(t){if(!this._hasKey)return;const e=Xt(t,qt.ENC_PACK,Qt.ENC_PACK,Kt.ENC_PACK,!0);if(!e)return;this.set_salt12(e.salt12,"decryptPack"),this.resetOTP();const r=this.xotp(e.$OTHERS??Yt.Buffer.alloc(0));return Wt(e.hmac,this.getHMAC8(r))?(e.data=r,e):void 0}encrypt_e2e(t,e){return this._withKey(e,()=>this.encryptPack(t))}decrypt_e2e(t,e){return this._withKey(e,()=>this.decryptPack(t))}_withKey(t,e){const r=Pt.B8(t);if(!r||0===r.length)throw new TypeError("Key must not be empty");const n=[Yt.Buffer.from(this._otpSrc44),Yt.Buffer.from(this._otp36),Yt.Buffer.from(this._hmac)],i=this._hasKey;try{return this._otpSrc44.set($t.hash(r),0),this._hasKey=!0,e()}finally{this._otpSrc44.set(n[0]),this._otp36.set(n[1]),this._hmac.set(n[2]),this._hasKey=i;for(const t of n)t.fill(0)}}}te.RAND=Zt,te.BohoMsg=qt,te.Meta=Kt,te.MetaSize=Qt,te.sha256=$t,te.MBP=Pt,te.Buffer=Yt.Buffer;const ee=k.Buffer,re=new TextEncoder,ne=new TextDecoder;function ie(t,e=!0){if("string"!=typeof t)throw TypeError("tag should be string.");const r=re.encode(t);if(!e&&0===r.byteLength||r.byteLength>H.TAG_LEN1)throw TypeError("tag UTF-8 byte length must be "+(e?"0":"1")+"~255");return r}class oe extends j{constructor(t){super(),this.cid="",this.ip="",this.socket=null,this.url=t,this.state=z.CLOSED,this.stateName=this.getStateName(),this._stateRevision=0,this.txCounter=0,this.rxCounter=0,this.txBytes=0,this.rxBytes=0,this.lastTxRxTime=Date.now(),this.connectionCheckerPeriod=H.CONNECTION_CHECKER_PERIOD,this.connectionCheckerIntervalID=null,this.boho=new te,this.serverTimeNonce=ee.alloc(te.MetaSize.SERVER_TIME_NONCE),this.TLS=!1,this.encMode=F.AUTO,this.useAuth=!1,this.nick="",this.channels=new Set,this.promiseMap=new Map,this.promiseTimeOut=H.PROMISE_TIMEOUT,this.mid=0,this.level=3,this.quota=q[this.level],this.serverSet={},this.linkMap=new Map,this.autoReconnect=!0,this._closed=!1,this.on("open",this.onOpen.bind(this)),this.on("close",this.onClose.bind(this)),this.on("socket_data",this.onData.bind(this))}close(){if(!1===this.autoReconnect&&(clearInterval(this.connectionCheckerIntervalID),this.connectionCheckerIntervalID=null),!this._closed){if(this._closed=!0,this.socket){if(0===this.socket.readyState){const t=this.socket;t.onopen=()=>{t&&t.close()},t.onmessage=null,t.onerror=null,t.onclose=null}else try{this.socket.close?.()}catch{}this.socket=null}this.promiseMap.clear(),this.cid="",this.boho&&(this.boho.isAuthorized=!1),this.state!==z.STOP&&this.stateChange("closed")&&this.emit("closed")}}stop(){this.autoReconnect=!1,this.close(),this.cid="",this.stateChange("stop","stop")}destroy(){this.stop(),this.removeAllListeners(),this.channels.clear(),this.linkMap.clear(),this.boho=null}keepAlive(){this.keepConnection(),Date.now()-this.lastTxRxTime>H.CLIENT_PING_PERIOD&&this.ping()}redirect(t){this.stateChange("redirecting","redirecting"),this.close(),this.createConnection(t)}open(t){this.socket&&this.close(),t&&(this.url=t),this.url?(this.createConnection(this.url),this._closed||this.connectionCheckerIntervalID||(this.connectionCheckerIntervalID=setInterval(this.keepAlive.bind(this),this.connectionCheckerPeriod))):this.emit("error",new Error("URL is not set."))}onOpen(){this._closed=!1,this.url.includes("wss://")?this.TLS=!0:this.TLS=!1,this.stateChange("open")}onClose(){this.close()}login(t,e){if(this.serverTimeNonce){this.auth(t,e),this.useAuth=!0;let r=this.boho.auth_req(this.serverTimeNonce);this.send(r),this.stateChange("auth_req","auth_req")}return this}auth(t,e){return t||e||this.emit("error",new Error("auth failed. no id and key.")),!e&&t.includes(".")?this.boho.set_id_key(t):t&&e?(this.boho.set_id8(t),this.boho.set_key(e)):this.emit("error",new Error("auth failed. no id or key.")),this.useAuth=!0,this}onData(t){let e,r=t[0];if(r===te.BohoMsg.ENC_488)e=this.boho.decrypt_488(t),e&&(r=e[0],t=e);else if(r===te.BohoMsg.ENC_E2E)try{if(e=this.boho.decrypt_488(t),!e)return;r=e[0],t.set(e,te.MetaSize.ENC_488),t=t.subarray(te.MetaSize.ENC_488)}catch(t){return}let n=G[r];switch(n||(n=te.BohoMsg[r]),r){case G.OVER_SIZE:console.log("## server sent: over_size event."),this.emit("over_size","over_size");break;case G.PING:this.pong();break;case G.PONG:break;case G.ECHO:try{let e=ne.decode(t.subarray(1));this.emit("echo",e)}catch(t){this.emit("error",new Error("ECHO data error"))}break;case G.IAM_RES:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.ip&&(this.ip=r.ip),r.nick&&(this.nick=r.nick),r.did&&(this.did=r.did),r.uid&&(this.uid=r.uid),this.emit("iam_res",e)}catch(t){this.emit("error",new Error("IAM_RES data error"))}break;case G.CID_RES:let r=ne.decode(t.subarray(1));this.cid=r,this.stateChange("ready","cid_ready"),this.subscribe_channels();break;case G.QUOTA_LEVEL:let n=t[1];this.level=n,this.quota=q[n];break;case G.AUTH_CLEAR:this.useAuth=!1,this.boho.clearAuth(),this.stateChange("auth_clear","server request auth_clear."),this.stop();break;case G.SERVER_REDIRECT:let i,o,s;7==t.byteLength?(i=function(t){if(6!=t.byteLength)return;return t[0].toString()+"."+t[1].toString()+"."+t[2].toString()+"."+t[3].toString()+":"+((t[4]<<8)+t[5]).toString()}(t.subarray(1)),s="cong://"):(i=ne.decode(t.subarray(1)),s=""),o=s+i,this.redirect(o);break;case te.BohoMsg.SERVER_TIME_NONCE:if(t.copy(this.serverTimeNonce),!this.stateChange("server_ready","server_ready"))break;this.useAuth?(this.send(this.boho.auth_req(t)),this.stateChange("auth_req","auth_req")):this.send(ee.from([G.CID_REQ]));break;case G.SERVER_SIGNAL:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.event&&r.data&&(this.serverSet=r.data,this.emit(r.event,r.data))}catch(t){this.emit("error",new Error("SERVER_SIGNAL parsing error"))}break;case G.SET:try{let e=k.unpack(t);e&&this.emit(e.topic,...e.args)}catch(t){this.emit("error",new Error("SET parsing error"))}break;case G.SIGNAL_E2E:case G.SIGNAL:try{let e=t.readUint8(1),r=t.subarray(2,2+e),n=ne.decode(r),i=t.readUint8(2+e),o=t.subarray(3+e);switch(i){case V.EMPTY:0===n.indexOf("@")?this.emit("@",n):(this.emit(n,n),this.emit("message",n));break;case V.TEXT:let t=o;0===o[o.byteLength-1]&&(t=o.subarray(0,o.byteLength-1));let e=ne.decode(t);0===n.indexOf("@")?this.emit("@",n,e):(this.emit(n,n,e),this.emit("message",n,e));break;case V.BINARY:0===n.indexOf("@")?this.emit("@",n,o):(this.emit(n,n,o),this.emit("message",n,o));break;case V.OBJECT:let r=ne.decode(o),i=JSON.parse(r);0===n.indexOf("@")?this.emit("@",n,i):(this.emit(n,n,i),this.emit("message",n,i));break;case V.MJSON:let s=ne.decode(o),f=JSON.parse(s);0===n.indexOf("@")?this.emit("@",n,...f):(this.emit(n,n,...f),this.emit("message",n,...f));break;case V.MBA:let u=k.unpack(o);0===n.indexOf("@")?this.emit("@",n,...u.args):(this.emit(n,n,...u.args),this.emit("message",n,...u.args))}}catch(t){console.log("IOCore IOMsg.SIGNAL parser err",t)}break;case G.RESPONSE_MBP:this.testPromise(t);break;case te.BohoMsg.AUTH_FAIL:this.boho.isAuthorized=!1,this.stateChange("auth_fail","auth_fail from server.");break;case te.BohoMsg.AUTH_RES:if(this.boho.verify_auth_res(t)){if(!this.stateChange("auth_res","server sent auth_res"))break;this.send(ee.from([G.CID_REQ]))}else this.boho.isAuthorized=!1,this.stateChange("auth_fail","verify_auth_res() invalid server_hmac");break;default:try{e=ne.decode(t),this.emit("text_message",e)}catch(t){}}}iam(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM),k.MB("#",t))):this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM)))}ping(){this.send(ee.from([G.PING]))}pong(){this.send(ee.from([G.PONG]))}echo(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.ECHO),k.MB("#msg",t))):this.send(ee.from([G.ECHO]))}bin(...t){this.send(k.U8pack(...t))}send(t){if(t.byteLength>this.quota.signalSize)return this.emit("over_size"),console.log("## QUOTA LIMIT OVER!! \nsignal message.byteLength: ",t.byteLength),void console.log("## your maximum signalSize(bytes) is:",this.quota.signalSize);this.socket_send(t)}getEncryptionMode(){return!(this.encMode!==F.YES&&(this.encMode!==F.AUTO||this.TLS||!this.boho.isAuthorized))}send_enc_mode(t,e){if(void 0===e&&(e=this.getEncryptionMode()),t[0]==G.SIGNAL_E2E&&e){let e=t[1],r=this.boho.encrypt_488(t.subarray(0,3+e));r[0]=te.BohoMsg.ENC_E2E,this.send(ee.concat([r,t.subarray(3+e)]))}else if(e){let e=this.boho.encrypt_488(t);this.send(e)}else this.send(t)}setMsgPromise(t){return new Promise((e,r)=>{const n=setTimeout(e=>{this.promiseMap.has(t)&&(r("timeout"),this.promiseMap.delete(t))},this.promiseTimeOut);this.promiseMap.set(t,[e,r,n])})}testPromise(t){let e=k.unpack(t);if(e)if(this.promiseMap.has(e.mid)){let[t,r,n]=this.promiseMap.get(e.mid);clearTimeout(n),this.promiseMap.delete(e.mid),e.status<128?(e.ok=!0,t(e)):(e.ok=!1,r(e))}else console.log("no promise id")}publish(t,...e){this.signal(t,...e)}signal(t,...e){if("string"!=typeof t)throw TypeError("tag should be string.");t.startsWith("@")&&this.cid&&ie(this.cid+t);let r=J(t,...e);this.send_enc_mode(r)}decrypt_e2e(t,e){return this.boho.decrypt_e2e(t,e)}signal_e2e(t,e,r){const n=ie(t);if(t.startsWith("@")&&this.cid&&ie(this.cid+t),!this.boho.isAuthorized)return;let i=k.B8(e),o=this.boho.encrypt_e2e(i,r),s=k.pack(k.MB("#MsgType","8",G.SIGNAL_E2E),k.MB("#tagLen","8",n.byteLength),k.MB("#tag",n),k.MB("#payloadType","8",V.BINARY),k.MB("#payload",o));this.send_enc_mode(s)}set(t,...e){return t&&0!=e.length?this.call("store","set",t,...e):Promise.reject(new Error("set need storeName and value)"))}async get(t){if(!t)return Promise.reject(new Error("store get need storeName)"));let e=await this.call("store","get",t),{$:r}=k.unpack(e.body);return r}call(t,e,...r){if(!t||!e)return Promise.reject(new Error("request need target and topic)"));let n;return n=r.length>0?k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e),k.MBA(...r)):k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e)),this.send_enc_mode(n),this.setMsgPromise(this.mid)}subscribe(t){const e=ie(t);this.send_enc_mode(ee.concat([k.NB("8",G.SUBSCRIBE),k.NB("8",e.byteLength),e]))}subscribe_channels(){if(this.state!==z.READY||0===this.channels.size)return;const t=Array.from(this.channels).join(",").split(","),e=t.map(t=>ie(t).byteLength),r=[];let n=[],i=0;t.forEach((t,o)=>{n.length&&i+1+e[o]>H.TAG_LEN1&&(r.push(n.join(",")),n=[],i=0),i+=(n.length?1:0)+e[o],n.push(t)}),n.length&&r.push(n.join(",")),r.forEach(t=>this.subscribe(t))}unsubscribe(t=""){const e=ie(t);if(""==t)this.channels.clear();else{t.split(",").forEach(t=>{this.channels.delete(t)})}this.send_enc_mode(ee.concat([k.NB("8",G.UNSUBSCRIBE),k.NB("8",e.byteLength),e]))}listen(t,e){if("string"!=typeof t)throw TypeError("tag should be string.");if(ie(t,!1),"function"!=typeof e)throw TypeError("handler is not a function.");0!==t.indexOf("@")&&this.channels.add(t),this.on(t,e)}link(t,e,r){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");if(ie(e,!1),"function"!=typeof r)throw TypeError("handler is not a function.");let n;0!==e.indexOf("@")&&this.channels.add(e),n=this.linkMap.has(t)?this.linkMap.get(t):new Set,n.add(e),this.linkMap.set(t,n),this.on(e,r),this.subscribe(e)}unlink(t,e){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");ie(e,!1);const r=this.linkMap.get(t);r&&r.has(e)&&(this.unsubscribe(e),this.removeAllListeners(e),r.delete(e),0===r.size&&this.linkMap.delete(t))}unlinkAll(t){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");const e=this.linkMap.get(t);if(e){for(const t of e)this.unsubscribe(t),this.removeAllListeners(t);this.linkMap.delete(t)}}getMetric(){return{tx:this.txCounter,rx:this.rxCounter,txb:this.txBytes,rxb:this.rxBytes,last:(Date.now()-this.lastTxRxTime)/1e3}}getState(){return this.state}getStateName(){return z[this.state].toLowerCase()}getSecurity(){return{useAuth:this.useAuth,isTLS:this.TLS,isAuthorized:this.boho.isAuthorized,encMode:this.encMode,usingEncryption:this.getEncryptionMode()}}stateChange(t,e){let r=t.toLowerCase();const n=z[t.toUpperCase()];if("number"!=typeof n)throw new TypeError("Unknown state: "+t);const i=this.state!==n;this.state=n,this.stateName=r,i&&this._stateRevision++;const o=this._stateRevision;return i&&this.emit("change",r),o===this._stateRevision&&(e&&this.emit(r,e),o===this._stateRevision)}}const se=te.Buffer;class fe extends oe{static version="6.1.1";static binaryType="arraybuffer";static Boho=te;static MBP=te.MBP;static Buffer=te.Buffer;static constants=Y;static instanceCount=0;static webSocketCount=0;constructor(t){super(t),fe.instanceCount++,this.boundBrowserVisiblePing=this.browserVisiblePing.bind(this),document.addEventListener("visibilitychange",this.boundBrowserVisiblePing),t&&this.open()}browserVisiblePing(){"visible"===document.visibilityState&&this.ping()}stop(){super.stop()}destroy(){document.removeEventListener("visibilitychange",this.boundBrowserVisiblePing),super.destroy()}keepConnection(){this.autoReconnect&&(this.socket&&this.socket.readyState!==WebSocket.CLOSED||this.open())}createConnection(t){fe.webSocketCount++;const e=this.socket=new WebSocket(t);this._closed=!1,this.socket.binaryType=fe.binaryType,this.socket.onopen=()=>{this.socket===e&&("arraybuffer"==this.socket.binaryType?this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessage(t)}:this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessageBlob(t)},this.emit("open"))},this.socket.onerror=t=>{this.socket===e&&this.emit("error",t)},this.socket.onclose=()=>{this.socket===e&&this.emit("close")},this.stateChange("connecting","connecting")}onWebSocketMessage(t){this.rxCounter++,this.lastTxRxTime=Date.now();let e=se.from(t.data);this.rxBytes+=e.byteLength,this.emit("socket_data",e)}async onWebSocketMessageBlob(t){const e=this.socket;let r;if(this.rxCounter++,this.lastTxRxTime=Date.now(),t.data instanceof Blob){let e=await t.data.arrayBuffer();r=se.from(e)}else r=se.from(t.data);this.rxBytes+=r.byteLength,this.socket===e&&this.emit("socket_data",r)}socket_send(t){1===this.socket?.readyState?(this.socket.send(t),this.txCounter++,this.txBytes+=t.byteLength,this.lastTxRxTime=Date.now()):console.log(".")}}return fe}();
|
|
22
|
+
*/var Yt=(zt||(zt=1,function(t){const e=function(){if(Dt)return Ht;Dt=1,Ht.byteLength=function(t){var e=o(t),r=e[0],n=e[1];return 3*(r+n)/4-n},Ht.toByteArray=function(t){var n,i,s=o(t),f=s[0],u=s[1],h=new r(function(t,e,r){return 3*(e+r)/4-r}(0,f,u)),a=0,c=u>0?f-4:f;for(i=0;i<c;i+=4)n=e[t.charCodeAt(i)]<<18|e[t.charCodeAt(i+1)]<<12|e[t.charCodeAt(i+2)]<<6|e[t.charCodeAt(i+3)],h[a++]=n>>16&255,h[a++]=n>>8&255,h[a++]=255&n;return 2===u&&(n=e[t.charCodeAt(i)]<<2|e[t.charCodeAt(i+1)]>>4,h[a++]=255&n),1===u&&(n=e[t.charCodeAt(i)]<<10|e[t.charCodeAt(i+1)]<<4|e[t.charCodeAt(i+2)]>>2,h[a++]=n>>8&255,h[a++]=255&n),h},Ht.fromByteArray=function(e){for(var r,n=e.length,i=n%3,o=[],s=16383,u=0,h=n-i;u<h;u+=s)o.push(f(e,u,u+s>h?h:u+s));return 1===i?(r=e[n-1],o.push(t[r>>2]+t[r<<4&63]+"==")):2===i&&(r=(e[n-2]<<8)+e[n-1],o.push(t[r>>10]+t[r>>4&63]+t[r<<2&63]+"=")),o.join("")};for(var t=[],e=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0;i<64;++i)t[i]=n[i],e[n.charCodeAt(i)]=i;function o(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function s(e){return t[e>>18&63]+t[e>>12&63]+t[e>>6&63]+t[63&e]}function f(t,e,r){for(var n,i=[],o=e;o<r;o+=3)n=(t[o]<<16&16711680)+(t[o+1]<<8&65280)+(255&t[o+2]),i.push(s(n));return i.join("")}return e["-".charCodeAt(0)]=62,e["_".charCodeAt(0)]=63,Ht}(),r=Gt(),n="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.Buffer=s,t.SlowBuffer=function(t){return+t!=t&&(t=0),s.alloc(+t)},t.INSPECT_MAX_BYTES=50;const i=2147483647;function o(t){if(t>i)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,s.prototype),e}function s(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return h(t)}return f(t,e,r)}function f(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!s.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|p(t,e);let n=o(r);const i=n.write(t,e);return i!==r&&(n=n.slice(0,i)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(q(t,Uint8Array)){const e=new Uint8Array(t);return c(e.buffer,e.byteOffset,e.byteLength)}return a(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(q(t,ArrayBuffer)||t&&q(t.buffer,ArrayBuffer))return c(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(q(t,SharedArrayBuffer)||t&&q(t.buffer,SharedArrayBuffer)))return c(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return s.from(n,e,r);const i=function(t){if(s.isBuffer(t)){const e=0|l(t.length),r=o(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||K(t.length)?o(0):a(t):"Buffer"===t.type&&Array.isArray(t.data)?a(t.data):void 0}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return s.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function u(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function h(t){return u(t),o(t<0?0:0|l(t))}function a(t){const e=t.length<0?0:0|l(t.length),r=o(e);for(let n=0;n<e;n+=1)r[n]=255&t[n];return r}function c(t,e,r){if(e<0||t.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(t.byteLength<e+(r||0))throw new RangeError('"length" is outside of buffer bounds');let n;return n=void 0===e&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,e):new Uint8Array(t,e,r),Object.setPrototypeOf(n,s.prototype),n}function l(t){if(t>=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|t}function p(t,e){if(s.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||q(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let i=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return V(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return G(t).length;default:if(i)return n?-1:V(t).length;e=(""+e).toLowerCase(),i=!0}}function y(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return I(this,e,r);case"ascii":return U(this,e,r);case"latin1":case"binary":return L(this,e,r);case"base64":return A(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function g(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function d(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),K(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=s.from(e,n)),s.isBuffer(e))return 0===e.length?-1:b(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):b(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function b(t,e,r,n,i){let o,s=1,f=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,f/=2,u/=2,r/=2}function h(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){let n=-1;for(o=r;o<f;o++)if(h(t,o)===h(e,-1===n?0:o-n)){if(-1===n&&(n=o),o-n+1===u)return n*s}else-1!==n&&(o-=o-n),n=-1}else for(r+u>f&&(r=f-u),o=r;o>=0;o--){let r=!0;for(let n=0;n<u;n++)if(h(t,o+n)!==h(e,n)){r=!1;break}if(r)return o}return-1}function w(t,e,r,n){r=Number(r)||0;const i=t.length-r;n?(n=Number(n))>i&&(n=i):n=i;const o=e.length;let s;for(n>o/2&&(n=o/2),s=0;s<n;++s){const n=parseInt(e.substr(2*s,2),16);if(K(n))return s;t[r+s]=n}return s}function E(t,e,r,n){return Y(V(e,t.length-r),t,r,n)}function B(t,e,r,n){return Y(function(t){const e=[];for(let r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function m(t,e,r,n){return Y(G(e),t,r,n)}function _(t,e,r,n){return Y(function(t,e){let r,n,i;const o=[];for(let s=0;s<t.length&&!((e-=2)<0);++s)r=t.charCodeAt(s),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function A(t,r,n){return 0===r&&n===t.length?e.fromByteArray(t):e.fromByteArray(t.slice(r,n))}function I(t,e,r){r=Math.min(t.length,r);const n=[];let i=e;for(;i<r;){const e=t[i];let o=null,s=e>239?4:e>223?3:e>191?2:1;if(i+s<=r){let r,n,f,u;switch(s){case 1:e<128&&(o=e);break;case 2:r=t[i+1],128==(192&r)&&(u=(31&e)<<6|63&r,u>127&&(o=u));break;case 3:r=t[i+1],n=t[i+2],128==(192&r)&&128==(192&n)&&(u=(15&e)<<12|(63&r)<<6|63&n,u>2047&&(u<55296||u>57343)&&(o=u));break;case 4:r=t[i+1],n=t[i+2],f=t[i+3],128==(192&r)&&128==(192&n)&&128==(192&f)&&(u=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&f,u>65535&&u<1114112&&(o=u))}}null===o?(o=65533,s=1):o>65535&&(o-=65536,n.push(o>>>10&1023|55296),o=56320|1023&o),n.push(o),i+=s}return function(t){const e=t.length;if(e<=v)return String.fromCharCode.apply(String,t);let r="",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=v));return r}(n)}t.kMaxLength=i,s.TYPED_ARRAY_SUPPORT=function(){try{const t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}(),s.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(s.prototype,"parent",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.buffer}}),Object.defineProperty(s.prototype,"offset",{enumerable:!0,get:function(){if(s.isBuffer(this))return this.byteOffset}}),s.poolSize=8192,s.from=function(t,e,r){return f(t,e,r)},Object.setPrototypeOf(s.prototype,Uint8Array.prototype),Object.setPrototypeOf(s,Uint8Array),s.alloc=function(t,e,r){return function(t,e,r){return u(t),t<=0?o(t):void 0!==e?"string"==typeof r?o(t).fill(e,r):o(t).fill(e):o(t)}(t,e,r)},s.allocUnsafe=function(t){return h(t)},s.allocUnsafeSlow=function(t){return h(t)},s.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==s.prototype},s.compare=function(t,e){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),q(e,Uint8Array)&&(e=s.from(e,e.offset,e.byteLength)),!s.isBuffer(t)||!s.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let r=t.length,n=e.length;for(let i=0,o=Math.min(r,n);i<o;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},s.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(t,e){if(!Array.isArray(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return s.alloc(0);let r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;const n=s.allocUnsafe(e);let i=0;for(r=0;r<t.length;++r){let e=t[r];if(q(e,Uint8Array))i+e.length>n.length?(s.isBuffer(e)||(e=s.from(e)),e.copy(n,i)):Uint8Array.prototype.set.call(n,e,i);else{if(!s.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,i)}i+=e.length}return n},s.byteLength=p,s.prototype._isBuffer=!0,s.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;e<t;e+=2)g(this,e,e+1);return this},s.prototype.swap32=function(){const t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t;e+=4)g(this,e,e+3),g(this,e+1,e+2);return this},s.prototype.swap64=function(){const t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let e=0;e<t;e+=8)g(this,e,e+7),g(this,e+1,e+6),g(this,e+2,e+5),g(this,e+3,e+4);return this},s.prototype.toString=function(){const t=this.length;return 0===t?"":0===arguments.length?I(this,0,t):y.apply(this,arguments)},s.prototype.toLocaleString=s.prototype.toString,s.prototype.equals=function(t){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===s.compare(this,t)},s.prototype.inspect=function(){let e="";const r=t.INSPECT_MAX_BYTES;return e=this.toString("hex",0,r).replace(/(.{2})/g,"$1 ").trim(),this.length>r&&(e+=" ... "),"<Buffer "+e+">"},n&&(s.prototype[n]=s.prototype.inspect),s.prototype.compare=function(t,e,r,n,i){if(q(t,Uint8Array)&&(t=s.from(t,t.offset,t.byteLength)),!s.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;let o=(i>>>=0)-(n>>>=0),f=(r>>>=0)-(e>>>=0);const u=Math.min(o,f),h=this.slice(n,i),a=t.slice(e,r);for(let t=0;t<u;++t)if(h[t]!==a[t]){o=h[t],f=a[t];break}return o<f?-1:f<o?1:0},s.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},s.prototype.indexOf=function(t,e,r){return d(this,t,e,r,!0)},s.prototype.lastIndexOf=function(t,e,r){return d(this,t,e,r,!1)},s.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let o=!1;for(;;)switch(n){case"hex":return w(this,t,e,r);case"utf8":case"utf-8":return E(this,t,e,r);case"ascii":case"latin1":case"binary":return B(this,t,e,r);case"base64":return m(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const v=4096;function U(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function L(t,e,r){let n="";r=Math.min(t.length,r);for(let i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function T(t,e,r){const n=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>n)&&(r=n);let i="";for(let n=e;n<r;++n)i+=J[t[n]];return i}function S(t,e,r){const n=t.slice(e,r);let i="";for(let t=0;t<n.length-1;t+=2)i+=String.fromCharCode(n[t]+256*n[t+1]);return i}function R(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function O(t,e,r,n,i,o){if(!s.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<o)throw new RangeError('"value" argument is out of bounds');if(r+n>t.length)throw new RangeError("Index out of range")}function M(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o,o>>=8,t[r++]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,s>>=8,t[r++]=s,r}function C(t,e,r,n,i){j(e,n,i,t,r,7);let o=Number(e&BigInt(4294967295));t[r+7]=o,o>>=8,t[r+6]=o,o>>=8,t[r+5]=o,o>>=8,t[r+4]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=s,s>>=8,t[r+2]=s,s>>=8,t[r+1]=s,s>>=8,t[r]=s,r+8}function N(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function k(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,4),r.write(t,e,n,i,23,4),n+4}function x(t,e,n,i,o){return e=+e,n>>>=0,o||N(t,0,n,8),r.write(t,e,n,i,52,8),n+8}s.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t);const n=this.subarray(t,e);return Object.setPrototypeOf(n,s.prototype),n},s.prototype.readUintLE=s.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return n},s.prototype.readUintBE=s.prototype.readUIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t+--e],i=1;for(;e>0&&(i*=256);)n+=this[t+--e]*i;return n},s.prototype.readUint8=s.prototype.readUInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),this[t]},s.prototype.readUint16LE=s.prototype.readUInt16LE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]|this[t+1]<<8},s.prototype.readUint16BE=s.prototype.readUInt16BE=function(t,e){return t>>>=0,e||R(t,2,this.length),this[t]<<8|this[t+1]},s.prototype.readUint32LE=s.prototype.readUInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},s.prototype.readUint32BE=s.prototype.readUInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},s.prototype.readBigUInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,i=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(i)<<BigInt(32))}),s.prototype.readBigUInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],i=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<<BigInt(32))+BigInt(i)}),s.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=this[t],i=1,o=0;for(;++o<e&&(i*=256);)n+=this[t+o]*i;return i*=128,n>=i&&(n-=Math.pow(2,8*e)),n},s.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||R(t,e,this.length);let n=e,i=1,o=this[t+--n];for(;n>0&&(i*=256);)o+=this[t+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*e)),o},s.prototype.readInt8=function(t,e){return t>>>=0,e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},s.prototype.readInt16LE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(t,e){t>>>=0,e||R(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},s.prototype.readInt32BE=function(t,e){return t>>>=0,e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},s.prototype.readBigInt64LE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<<BigInt(32))+BigInt(e+256*this[++t]+65536*this[++t]+this[++t]*2**24)}),s.prototype.readBigInt64BE=Q(function(t){z(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||F(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<<BigInt(32))+BigInt(this[++t]*2**24+65536*this[++t]+256*this[++t]+r)}),s.prototype.readFloatLE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!0,23,4)},s.prototype.readFloatBE=function(t,e){return t>>>=0,e||R(t,4,this.length),r.read(this,t,!1,23,4)},s.prototype.readDoubleLE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!0,52,8)},s.prototype.readDoubleBE=function(t,e){return t>>>=0,e||R(t,8,this.length),r.read(this,t,!1,52,8)},s.prototype.writeUintLE=s.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=1,o=0;for(this[e]=255&t;++o<r&&(i*=256);)this[e+o]=t/i&255;return e+r},s.prototype.writeUintBE=s.prototype.writeUIntBE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||O(this,t,e,r,Math.pow(2,8*r)-1,0);let i=r-1,o=1;for(this[e+i]=255&t;--i>=0&&(o*=256);)this[e+i]=t/o&255;return e+r},s.prototype.writeUint8=s.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,255,0),this[e]=255&t,e+1},s.prototype.writeUint16LE=s.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeUint16BE=s.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeUint32LE=s.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},s.prototype.writeUint32BE=s.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigUInt64LE=Q(function(t,e=0){return M(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeBigUInt64BE=Q(function(t,e=0){return C(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),s.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=0,o=1,s=0;for(this[e]=255&t;++i<r&&(o*=256);)t<0&&0===s&&0!==this[e+i-1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);O(this,t,e,r,n-1,-n)}let i=r-1,o=1,s=0;for(this[e+i]=255&t;--i>=0&&(o*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/o|0)-s&255;return e+r},s.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},s.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},s.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||O(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeBigInt64LE=Q(function(t,e=0){return M(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeBigInt64BE=Q(function(t,e=0){return C(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),s.prototype.writeFloatLE=function(t,e,r){return k(this,t,e,!0,r)},s.prototype.writeFloatBE=function(t,e,r){return k(this,t,e,!1,r)},s.prototype.writeDoubleLE=function(t,e,r){return x(this,t,e,!0,r)},s.prototype.writeDoubleBE=function(t,e,r){return x(this,t,e,!1,r)},s.prototype.copy=function(t,e,r,n){if(!s.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);const i=n-r;return this===t&&"function"==typeof Uint8Array.prototype.copyWithin?this.copyWithin(e,r,n):Uint8Array.prototype.set.call(t,this.subarray(r,n),e),i},s.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){const e=t.charCodeAt(0);("utf8"===n&&e<128||"latin1"===n)&&(t=e)}}else"number"==typeof t?t&=255:"boolean"==typeof t&&(t=Number(t));if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;let i;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(i=e;i<r;++i)this[i]=t;else{const o=s.isBuffer(t)?t:s.from(t,n),f=o.length;if(0===f)throw new TypeError('The value "'+t+'" is invalid for argument "value"');for(i=0;i<r-e;++i)this[i+e]=o[i%f]}return this};const P={};function $(t,e,r){P[t]=class extends r{constructor(){super(),Object.defineProperty(this,"message",{value:e.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${t}]`,this.stack,delete this.name}get code(){return t}set code(t){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:t,writable:!0})}toString(){return`${this.name} [${t}]: ${this.message}`}}}function D(t){let e="",r=t.length;const n="-"===t[0]?1:0;for(;r>=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function j(t,e,r,n,i,o){if(t>r||t<e){const r="bigint"==typeof e?"n":"";let n;throw n=0===e||e===BigInt(0)?`>= 0${r} and < 2${r} ** ${8*(o+1)}${r}`:`>= -(2${r} ** ${8*(o+1)-1}${r}) and < 2 ** ${8*(o+1)-1}${r}`,new P.ERR_OUT_OF_RANGE("value",n,t)}!function(t,e,r){z(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||F(e,t.length-(r+1))}(n,i,o)}function z(t,e){if("number"!=typeof t)throw new P.ERR_INVALID_ARG_TYPE(e,"number",t)}function F(t,e,r){if(Math.floor(t)!==t)throw z(t,r),new P.ERR_OUT_OF_RANGE("offset","an integer",t);if(e<0)throw new P.ERR_BUFFER_OUT_OF_BOUNDS;throw new P.ERR_OUT_OF_RANGE("offset",`>= 0 and <= ${e}`,t)}$("ERR_BUFFER_OUT_OF_BOUNDS",function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError),$("ERR_INVALID_ARG_TYPE",function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`},TypeError),$("ERR_OUT_OF_RANGE",function(t,e,r){let n=`The value of "${t}" is out of range.`,i=r;return Number.isInteger(r)&&Math.abs(r)>2**32?i=D(String(r)):"bigint"==typeof r&&(i=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(i=D(i)),i+="n"),n+=` It must be ${e}. Received ${i}`,n},RangeError);const H=/[^+/0-9A-Za-z-_]/g;function V(t,e){let r;e=e||1/0;const n=t.length;let i=null;const o=[];for(let s=0;s<n;++s){if(r=t.charCodeAt(s),r>55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function G(t){return e.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(H,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Y(t,e,r,n){let i;for(i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function q(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function K(t){return t!=t}const J=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let i=0;i<16;++i)e[n+i]=t[r]+t[i]}return e}();function Q(t){return"undefined"==typeof BigInt?W:t}function W(){throw new Error("BigInt not supported")}}(Ft)),Ft);let qt={SERVER_TIME_NONCE:176,AUTH_REQ:177,AUTH_RES:178,AUTH_FAIL:179,ENC_PACK:182,ENC_E2E:183,ENC_488:184};for(let t in qt)qt[qt[t]]=t;const Kt={SERVER_TIME_NONCE:Pt.meta(Pt.MB("header","8",0),Pt.MB("unixTime","32L",0),Pt.MB("milTime","16L",0),Pt.MB("counter","16L",0),Pt.MB("nonce",Yt.Buffer.alloc(4))),AUTH_REQ:Pt.meta(Pt.MB("header","8",0),Pt.MB("id8",Yt.Buffer.alloc(8)),Pt.MB("nonce",Yt.Buffer.alloc(4)),Pt.MB("hmac32",Yt.Buffer.alloc(32))),AUTH_RES:Pt.meta(Pt.MB("header","8",0),Pt.MB("hmac32",Yt.Buffer.alloc(32))),ENC_PACK:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("salt12",Yt.Buffer.alloc(12)),Pt.MB("hmac",8,0)),ENC_488:Pt.meta(Pt.MB("type","8",0),Pt.MB("len","32L",0),Pt.MB("otpSrc8",Yt.Buffer.alloc(8)),Pt.MB("hmac8",Yt.Buffer.alloc(8)))};function Jt(t){let e=t[t.length-1];return e[2]+e[3]}const Qt={SERVER_TIME_NONCE:Jt(Kt.SERVER_TIME_NONCE),AUTH_REQ:Jt(Kt.AUTH_REQ),AUTH_RES:Jt(Kt.AUTH_RES),ENC_PACK:Jt(Kt.ENC_PACK),ENC_488:Jt(Kt.ENC_488)};function Wt(t,e){if(!(t instanceof Uint8Array&&e instanceof Uint8Array&&t.length===e.length))return!1;let r=0;for(let n=0;n<t.length;n++)r|=t[n]^e[n];return 0===r}function Xt(t,e,r,n,i=!1){if(!(t instanceof Uint8Array))return;const o=Yt.Buffer.from(t);return o.length<r||o[0]!==e||(i?o.readUInt32LE(1)!==o.length-r:o.length!==r)?void 0:Pt.unpack(o,n)}function Zt(t){return globalThis.crypto.getRandomValues(Yt.Buffer.alloc(t))}class te{constructor(){this._id8=Yt.Buffer.alloc(8),this._otpSrc44=Yt.Buffer.alloc(44),this._otp36=Yt.Buffer.alloc(36),this._hmac=Yt.Buffer.alloc(32),this.auth_salt12=Yt.Buffer.alloc(12),this.localNonce=Yt.Buffer.alloc(4),this.remoteNonce=Yt.Buffer.alloc(4),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}clearAuth(){this._id8.fill(0),this._otpSrc44.fill(0),this._otp36.fill(0),this._hmac.fill(0),this.auth_salt12.fill(0),this.localNonce.fill(0),this.remoteNonce.fill(0),this.isAuthorized=!1,this.counter=0,this._hasKey=!1,this._lastSendTime=0}set_hash_id8(t){Pt.B8($t.hash(t)).copy(this._id8,0,0,8)}set_id8(t){let e=Pt.B8(t);this._id8.fill(0),e.copy(this._id8,0,0,8)}set_key(t){const e=Pt.B8(t);if(!e||0===e.length)throw new TypeError("Key must not be empty");this.copy_key(Pt.B8($t.hash(e)))}set_id_key(t){let e=t.indexOf(".");if(-1==e)return;let r=t.substring(0,e),n=t.substring(e+1);this.set_id8(r),this.set_key(n)}copy_id8(t){t.copy(this._id8,0,0,8)}copy_key(t){if(!(t instanceof Uint8Array)||32!==t.length)throw new TypeError("copy_key requires exactly 32 bytes");this._otpSrc44.set(t,0),this._hasKey=!0}sha256_n(t,e){let r=$t.hash(t);for(let t=0;t<e;t++)r=$t.hash(r);return r}set_clock_rand(){this.set_clock_nonce(Zt(4))}set_clock_nonce(t){if(!(t instanceof Uint8Array)||4!==t.length)throw new TypeError("Nonce must be 4 bytes");let e=Math.max(Date.now(),this._lastSendTime);if(this.counter=this.counter+1&65535,0===this.counter&&e===this._lastSendTime&&e++,!Number.isSafeInteger(e)||e<0||Math.floor(e/1e3)>4294967295)throw new RangeError("Clock is outside the protocol range");this._lastSendTime=e,Yt.Buffer.concat([Pt.NB("32L",Math.floor(e/1e3)),Pt.NB("16L",e%1e3),Pt.NB("16L",this.counter),Yt.Buffer.from(t)]).copy(this._otpSrc44,32)}_requireKey(){if(!this._hasKey)throw new Error("Set a key before encryption or authentication")}set_salt12(t,e){if(12!=t.byteLength)throw TypeError("set_salt12: Invalid salt12 byteLength.");t.copy(this._otpSrc44,32)}resetOTP(){this._requireKey(),Pt.B8($t.hash(this._otpSrc44)).copy(this._otp36,0,0,32)}getIndexOTP(t){return this._otp36.writeUInt32LE(t,32),$t.hash(this._otp36)}generateHMAC(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);this._hmac=Pt.B8($t.hash(e))}getHMAC8(t){this._requireKey();let e=Yt.Buffer.concat([this._otpSrc44,t]);return this._hmac=Pt.B8($t.hash(e)),this._hmac.subarray(0,8)}xotp(t,e=0,r=!1){let n=(t=Pt.B8(t,r)).byteLength,i=e,o=0,s=0;for(;n>0;){s=n<32?n:32;let e=this.getIndexOTP(++i);for(let r=0;r<s;r++)t[o++]^=e[r];n-=32}return t}server_time_nonce(){const t=Date.now(),e=Math.floor(t/1e3),r=t%1e3;return this.localNonce=Zt(4),this.auth_salt12=Yt.Buffer.concat([Pt.NB("32L",e),Pt.NB("16L",r),Zt(2),this.localNonce]),Yt.Buffer.concat([Pt.NB("8",qt.SERVER_TIME_NONCE),this.auth_salt12])}auth_req(t){if(!this._hasKey)return!1;let e=Xt(t,qt.SERVER_TIME_NONCE,Qt.SERVER_TIME_NONCE,Kt.SERVER_TIME_NONCE);if(e&&e.milTime>=1e3)return!1;if(e){let t=Yt.Buffer.concat([Pt.NB("32L",e.unixTime),Pt.NB("16L",e.milTime),Pt.NB("16L",e.counter),e.nonce]);return this.set_salt12(t,"auth_req"),this.localNonce=Zt(4),this.generateHMAC(this.localNonce),this.remoteNonce=e.nonce,Pt.pack(Pt.MB("#header","8",qt.AUTH_REQ),Pt.MB("#id8",this._id8),Pt.MB("#nonce",this.localNonce),Pt.MB("#hmac32",this._hmac))}return!1}verify_auth_req(t){if(!this._hasKey)return!1;let e;if(t instanceof Uint8Array?e=Xt(t,qt.AUTH_REQ,Qt.AUTH_REQ,Kt.AUTH_REQ):t&&"object"==typeof t&&(e=t),!e||e.header!==qt.AUTH_REQ||!(e.id8 instanceof Uint8Array)||8!==e.id8.length||!(e.nonce instanceof Uint8Array)||4!==e.nonce.length||!(e.hmac32 instanceof Uint8Array)||32!==e.hmac32.length||e.$OTHERS&&0!==e.$OTHERS.length)return!1;this.set_salt12(this.auth_salt12,"verify_auth_req 1/2"),this.generateHMAC(e.nonce);let r=this._hmac;if(Wt(e.hmac32,r)){this.remoteNonce=Yt.Buffer.from(e.nonce);let t=Yt.Buffer.concat([this.localNonce,this.remoteNonce,this.localNonce]);this.set_salt12(t,"verify_auth_req 2/2"),this.generateHMAC(e.nonce);let r=this._hmac,n=Pt.rawPack(Pt.MB("header","8",qt.AUTH_RES),Pt.MB("hmac32",r));return this.isAuthorized=!0,n}return!1}verify_auth_res(t){if(!this._hasKey)return!1;let e=Xt(t,qt.AUTH_RES,Qt.AUTH_RES,Kt.AUTH_RES);if(e){let t=Yt.Buffer.concat([this.remoteNonce,this.localNonce,this.remoteNonce]);if(this.set_salt12(t,"verify_auth_res"),this.generateHMAC(this.localNonce),Wt(this._hmac,e.hmac32))return this.isAuthorized=!0,!0}}encrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;t=Pt.B8(t),this.set_clock_nonce(this.remoteNonce),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_488),Pt.MB("#len","32L",t.byteLength),Pt.MB("#otpSrc8",this._otpSrc44.subarray(32,40)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decrypt_488(t){if(!this.isAuthorized||!this._hasKey)return;let e=t;if(t instanceof Uint8Array&&t[0]===qt.ENC_E2E){if(t.length<Qt.ENC_488)return;const r=Yt.Buffer.from(t),n=r.readUInt32LE(1);if(n>r.length-Qt.ENC_488)return;e=Yt.Buffer.from(r.subarray(0,Qt.ENC_488+n)),e[0]=qt.ENC_488}const r=Xt(e,qt.ENC_488,Qt.ENC_488,Kt.ENC_488,!0);if(!(r&&(n=r.otpSrc8,n.readUInt16LE(4)<1e3)))return;var n;this.set_salt12(Yt.Buffer.concat([r.otpSrc8,this.localNonce]),"decrypt_488"),this.resetOTP();const i=this.xotp(r.$OTHERS??Yt.Buffer.alloc(0));return Wt(this.getHMAC8(i),r.hmac8)?i:void 0}encryptPack(t){this._requireKey(),t=Pt.B8(t),this.set_clock_rand(),this.resetOTP();let e=this.getHMAC8(t),r=this.xotp(t);return Pt.pack(Pt.MB("#type","8",qt.ENC_PACK),Pt.MB("#len","32L",t.byteLength),Pt.MB("#salt12",this._otpSrc44.subarray(32)),Pt.MB("#hmac8",e),Pt.MB("#xdata",r))}decryptPack(t){if(!this._hasKey)return;const e=Xt(t,qt.ENC_PACK,Qt.ENC_PACK,Kt.ENC_PACK,!0);if(!e)return;this.set_salt12(e.salt12,"decryptPack"),this.resetOTP();const r=this.xotp(e.$OTHERS??Yt.Buffer.alloc(0));return Wt(e.hmac,this.getHMAC8(r))?(e.data=r,e):void 0}encrypt_e2e(t,e){return this._withKey(e,()=>this.encryptPack(t))}decrypt_e2e(t,e){return this._withKey(e,()=>this.decryptPack(t))}_withKey(t,e){const r=Pt.B8(t);if(!r||0===r.length)throw new TypeError("Key must not be empty");const n=[Yt.Buffer.from(this._otpSrc44),Yt.Buffer.from(this._otp36),Yt.Buffer.from(this._hmac)],i=this._hasKey;try{return this._otpSrc44.set($t.hash(r),0),this._hasKey=!0,e()}finally{this._otpSrc44.set(n[0]),this._otp36.set(n[1]),this._hmac.set(n[2]),this._hasKey=i;for(const t of n)t.fill(0)}}}te.RAND=Zt,te.BohoMsg=qt,te.Meta=Kt,te.MetaSize=Qt,te.sha256=$t,te.MBP=Pt,te.Buffer=Yt.Buffer;const ee=k.Buffer,re=new TextEncoder,ne=new TextDecoder;function ie(t,e=!0){if("string"!=typeof t)throw TypeError("tag should be string.");const r=re.encode(t);if(!e&&0===r.byteLength||r.byteLength>H.TAG_LEN1)throw TypeError("tag UTF-8 byte length must be "+(e?"0":"1")+"~255");return r}class oe extends j{constructor(t){super(),this.cid="",this.ip="",this.socket=null,this.url=t,this.state=z.CLOSED,this.stateName=this.getStateName(),this._stateRevision=0,this.txCounter=0,this.rxCounter=0,this.txBytes=0,this.rxBytes=0,this.lastTxRxTime=Date.now(),this.connectionCheckerPeriod=H.CONNECTION_CHECKER_PERIOD,this.connectionCheckerIntervalID=null,this.boho=new te,this.serverTimeNonce=ee.alloc(te.MetaSize.SERVER_TIME_NONCE),this.TLS=!1,this.encMode=F.AUTO,this.useAuth=!1,this.nick="",this.channels=new Set,this.promiseMap=new Map,this.promiseTimeOut=H.PROMISE_TIMEOUT,this.mid=0,this.level=3,this.quota=q[this.level],this.serverSet={},this.linkMap=new Map,this.autoReconnect=!0,this._closed=!1,this.on("open",this.onOpen.bind(this)),this.on("close",this.onClose.bind(this)),this.on("socket_data",this.onData.bind(this))}close(){if(!1===this.autoReconnect&&(clearInterval(this.connectionCheckerIntervalID),this.connectionCheckerIntervalID=null),!this._closed){if(this._closed=!0,this.socket){if(0===this.socket.readyState){const t=this.socket;t.onopen=()=>{t&&t.close()},t.onmessage=null,t.onerror=null,t.onclose=null}else try{this.socket.close?.()}catch{}this.socket=null}this.promiseMap.clear(),this.cid="",this.boho&&(this.boho.isAuthorized=!1),this.state!==z.STOP&&this.stateChange("closed")&&this.emit("closed")}}stop(){this.autoReconnect=!1,this.close(),this.cid="",this.stateChange("stop","stop")}destroy(){this.stop(),this.removeAllListeners(),this.channels.clear(),this.linkMap.clear(),this.boho=null}keepAlive(){this.keepConnection(),Date.now()-this.lastTxRxTime>H.CLIENT_PING_PERIOD&&this.ping()}redirect(t){this.stateChange("redirecting","redirecting"),this.close(),this.createConnection(t)}open(t){this.socket&&this.close(),t&&(this.url=t),this.url?(this.createConnection(this.url),this._closed||this.connectionCheckerIntervalID||(this.connectionCheckerIntervalID=setInterval(this.keepAlive.bind(this),this.connectionCheckerPeriod))):this.emit("error",new Error("URL is not set."))}onOpen(){this._closed=!1,this.url.includes("wss://")?this.TLS=!0:this.TLS=!1,this.stateChange("open")}onClose(){this.close()}login(t,e){if(this.serverTimeNonce){this.auth(t,e),this.useAuth=!0;let r=this.boho.auth_req(this.serverTimeNonce);this.send(r),this.stateChange("auth_req","auth_req")}return this}auth(t,e){return t||e||this.emit("error",new Error("auth failed. no id and key.")),!e&&t.includes(".")?this.boho.set_id_key(t):t&&e?(this.boho.set_id8(t),this.boho.set_key(e)):this.emit("error",new Error("auth failed. no id or key.")),this.useAuth=!0,this}onData(t){let e,r=t[0];if(r===te.BohoMsg.ENC_488)e=this.boho.decrypt_488(t),e&&(r=e[0],t=e);else if(r===te.BohoMsg.ENC_E2E)try{if(e=this.boho.decrypt_488(t),!e)return;r=e[0],t.set(e,te.MetaSize.ENC_488),t=t.subarray(te.MetaSize.ENC_488)}catch(t){return}let n=G[r];switch(n||(n=te.BohoMsg[r]),r){case G.OVER_SIZE:console.log("## server sent: over_size event."),this.emit("over_size","over_size");break;case G.PING:this.pong();break;case G.PONG:break;case G.ECHO:try{let e=ne.decode(t.subarray(1));this.emit("echo",e)}catch(t){this.emit("error",new Error("ECHO data error"))}break;case G.IAM_RES:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.ip&&(this.ip=r.ip),r.nick&&(this.nick=r.nick),r.did&&(this.did=r.did),r.uid&&(this.uid=r.uid),this.emit("iam_res",e)}catch(t){this.emit("error",new Error("IAM_RES data error"))}break;case G.CID_RES:let r=ne.decode(t.subarray(1));this.cid=r,this.stateChange("ready","cid_ready"),this.subscribe_channels();break;case G.QUOTA_LEVEL:let n=t[1];this.level=n,this.quota=q[n];break;case G.AUTH_CLEAR:this.useAuth=!1,this.boho.clearAuth(),this.stateChange("auth_clear","server request auth_clear."),this.stop();break;case G.SERVER_REDIRECT:let i,o,s;7==t.byteLength?(i=function(t){if(6!=t.byteLength)return;return t[0].toString()+"."+t[1].toString()+"."+t[2].toString()+"."+t[3].toString()+":"+((t[4]<<8)+t[5]).toString()}(t.subarray(1)),s="cong://"):(i=ne.decode(t.subarray(1)),s=""),o=s+i,this.redirect(o);break;case te.BohoMsg.SERVER_TIME_NONCE:if(t.copy(this.serverTimeNonce),!this.stateChange("server_ready","server_ready"))break;this.useAuth?(this.send(this.boho.auth_req(t)),this.stateChange("auth_req","auth_req")):this.send(ee.from([G.CID_REQ]));break;case G.SERVER_SIGNAL:try{let e=ne.decode(t.subarray(1)),r=JSON.parse(e);r.event&&r.data&&(this.serverSet=r.data,this.emit(r.event,r.data))}catch(t){this.emit("error",new Error("SERVER_SIGNAL parsing error"))}break;case G.SET:try{let e=k.unpack(t);e&&this.emit(e.topic,...e.args)}catch(t){this.emit("error",new Error("SET parsing error"))}break;case G.SIGNAL_E2E:case G.SIGNAL:try{let e=t.readUint8(1),r=t.subarray(2,2+e),n=ne.decode(r),i=t.readUint8(2+e),o=t.subarray(3+e);switch(i){case V.EMPTY:0===n.indexOf("@")?this.emit("@",n):(this.emit(n,n),this.emit("message",n));break;case V.TEXT:let t=o;0===o[o.byteLength-1]&&(t=o.subarray(0,o.byteLength-1));let e=ne.decode(t);0===n.indexOf("@")?this.emit("@",n,e):(this.emit(n,n,e),this.emit("message",n,e));break;case V.BINARY:0===n.indexOf("@")?this.emit("@",n,o):(this.emit(n,n,o),this.emit("message",n,o));break;case V.OBJECT:let r=ne.decode(o),i=JSON.parse(r);0===n.indexOf("@")?this.emit("@",n,i):(this.emit(n,n,i),this.emit("message",n,i));break;case V.MJSON:let s=ne.decode(o),f=JSON.parse(s);0===n.indexOf("@")?this.emit("@",n,...f):(this.emit(n,n,...f),this.emit("message",n,...f));break;case V.MBA:let u=k.unpack(o);0===n.indexOf("@")?this.emit("@",n,...u.args):(this.emit(n,n,...u.args),this.emit("message",n,...u.args))}}catch(t){console.log("IOCore IOMsg.SIGNAL parser err",t)}break;case G.RESPONSE_MBP:this.testPromise(t);break;case te.BohoMsg.AUTH_FAIL:this.boho.isAuthorized=!1,this.stateChange("auth_fail","auth_fail from server.");break;case te.BohoMsg.AUTH_RES:if(this.boho.verify_auth_res(t)){if(!this.stateChange("auth_res","server sent auth_res"))break;this.send(ee.from([G.CID_REQ]))}else this.boho.isAuthorized=!1,this.stateChange("auth_fail","verify_auth_res() invalid server_hmac");break;default:try{e=ne.decode(t),this.emit("text_message",e)}catch(t){}}}iam(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM),k.MB("#",t))):this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.IAM)))}ping(){this.send(ee.from([G.PING]))}pong(){this.send(ee.from([G.PONG]))}echo(t){t?this.send_enc_mode(k.pack(k.MB("#MsgType","8",G.ECHO),k.MB("#msg",t))):this.send(ee.from([G.ECHO]))}bin(...t){this.send(k.U8pack(...t))}send(t){if(t.byteLength>this.quota.signalSize)return this.emit("over_size"),console.log("## QUOTA LIMIT OVER!! \nsignal message.byteLength: ",t.byteLength),void console.log("## your maximum signalSize(bytes) is:",this.quota.signalSize);this.socket_send(t)}getEncryptionMode(){return!(this.encMode!==F.YES&&(this.encMode!==F.AUTO||this.TLS||!this.boho.isAuthorized))}send_enc_mode(t,e){if(void 0===e&&(e=this.getEncryptionMode()),t[0]==G.SIGNAL_E2E&&e){let e=t[1],r=this.boho.encrypt_488(t.subarray(0,3+e));r[0]=te.BohoMsg.ENC_E2E,this.send(ee.concat([r,t.subarray(3+e)]))}else if(e){let e=this.boho.encrypt_488(t);this.send(e)}else this.send(t)}setMsgPromise(t){return new Promise((e,r)=>{const n=setTimeout(e=>{this.promiseMap.has(t)&&(r("timeout"),this.promiseMap.delete(t))},this.promiseTimeOut);this.promiseMap.set(t,[e,r,n])})}testPromise(t){let e=k.unpack(t);if(e)if(this.promiseMap.has(e.mid)){let[t,r,n]=this.promiseMap.get(e.mid);clearTimeout(n),this.promiseMap.delete(e.mid),e.status<128?(e.ok=!0,t(e)):(e.ok=!1,r(e))}else console.log("no promise id")}publish(t,...e){this.signal(t,...e)}signal(t,...e){if("string"!=typeof t)throw TypeError("tag should be string.");t.startsWith("@")&&this.cid&&ie(this.cid+t);let r=J(t,...e);this.send_enc_mode(r)}decrypt_e2e(t,e){return this.boho.decrypt_e2e(t,e)}signal_e2e(t,e,r){const n=ie(t);if(t.startsWith("@")&&this.cid&&ie(this.cid+t),!this.boho.isAuthorized)return;let i=k.B8(e),o=this.boho.encrypt_e2e(i,r),s=k.pack(k.MB("#MsgType","8",G.SIGNAL_E2E),k.MB("#tagLen","8",n.byteLength),k.MB("#tag",n),k.MB("#payloadType","8",V.BINARY),k.MB("#payload",o));this.send_enc_mode(s)}set(t,...e){return t&&0!=e.length?this.call("store","set",t,...e):Promise.reject(new Error("set need storeName and value)"))}async get(t){if(!t)return Promise.reject(new Error("store get need storeName)"));let e=await this.call("store","get",t),{$:r}=k.unpack(e.body);return r}call(t,e,...r){if(!t||!e)return Promise.reject(new Error("request need target and topic)"));let n;return n=r.length>0?k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e),k.MBA(...r)):k.pack(k.MB("#MsgType","8",G.CALL),k.MB("mid","16",++this.mid),k.MB("target",t),k.MB("topic",e)),this.send_enc_mode(n),this.setMsgPromise(this.mid)}subscribe(t){const e=ie(t);this.send_enc_mode(ee.concat([k.NB("8",G.SUBSCRIBE),k.NB("8",e.byteLength),e]))}subscribe_channels(){if(this.state!==z.READY||0===this.channels.size)return;const t=Array.from(this.channels).join(",").split(","),e=t.map(t=>ie(t).byteLength),r=[];let n=[],i=0;t.forEach((t,o)=>{n.length&&i+1+e[o]>H.TAG_LEN1&&(r.push(n.join(",")),n=[],i=0),i+=(n.length?1:0)+e[o],n.push(t)}),n.length&&r.push(n.join(",")),r.forEach(t=>this.subscribe(t))}unsubscribe(t=""){const e=ie(t);if(""==t)this.channels.clear();else{t.split(",").forEach(t=>{this.channels.delete(t)})}this.send_enc_mode(ee.concat([k.NB("8",G.UNSUBSCRIBE),k.NB("8",e.byteLength),e]))}listen(t,e){if("string"!=typeof t)throw TypeError("tag should be string.");if(ie(t,!1),"function"!=typeof e)throw TypeError("handler is not a function.");0!==t.indexOf("@")&&this.channels.add(t),this.on(t,e)}link(t,e,r){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");if(ie(e,!1),"function"!=typeof r)throw TypeError("handler is not a function.");let n;0!==e.indexOf("@")&&this.channels.add(e),n=this.linkMap.has(t)?this.linkMap.get(t):new Set,n.add(e),this.linkMap.set(t,n),this.on(e,r),this.subscribe(e)}unlink(t,e){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");if("string"!=typeof e)throw TypeError("tag is not a string.");ie(e,!1);const r=this.linkMap.get(t);r&&r.has(e)&&(this.unsubscribe(e),this.removeAllListeners(e),r.delete(e),0===r.size&&this.linkMap.delete(t))}unlinkAll(t){if("string"!=typeof t)throw TypeError("to(local link target) is not a string.");const e=this.linkMap.get(t);if(e){for(const t of e)this.unsubscribe(t),this.removeAllListeners(t);this.linkMap.delete(t)}}getMetric(){return{tx:this.txCounter,rx:this.rxCounter,txb:this.txBytes,rxb:this.rxBytes,last:(Date.now()-this.lastTxRxTime)/1e3}}getState(){return this.state}getStateName(){return z[this.state].toLowerCase()}getSecurity(){return{useAuth:this.useAuth,isTLS:this.TLS,isAuthorized:this.boho.isAuthorized,encMode:this.encMode,usingEncryption:this.getEncryptionMode()}}stateChange(t,e){let r=t.toLowerCase();const n=z[t.toUpperCase()];if("number"!=typeof n)throw new TypeError("Unknown state: "+t);const i=this.state!==n;this.state=n,this.stateName=r,i&&this._stateRevision++;const o=this._stateRevision;return i&&this.emit("change",r),o===this._stateRevision&&(e&&this.emit(r,e),o===this._stateRevision)}}const se=te.Buffer;class fe extends oe{static version="6.1.2";static binaryType="arraybuffer";static Boho=te;static MBP=te.MBP;static Buffer=te.Buffer;static constants=Y;static instanceCount=0;static webSocketCount=0;constructor(t){super(t),fe.instanceCount++,this.boundBrowserVisiblePing=this.browserVisiblePing.bind(this),document.addEventListener("visibilitychange",this.boundBrowserVisiblePing),t&&this.open()}browserVisiblePing(){"visible"===document.visibilityState&&this.ping()}stop(){super.stop()}destroy(){document.removeEventListener("visibilitychange",this.boundBrowserVisiblePing),super.destroy()}keepConnection(){this.autoReconnect&&(this.socket&&this.socket.readyState!==WebSocket.CLOSED||this.open())}createConnection(t){fe.webSocketCount++;const e=this.socket=new WebSocket(t);this._closed=!1,this.socket.binaryType=fe.binaryType,this.socket.onopen=()=>{this.socket===e&&("arraybuffer"==this.socket.binaryType?this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessage(t)}:this.socket.onmessage=t=>{this.socket===e&&this.onWebSocketMessageBlob(t)},this.emit("open"))},this.socket.onerror=t=>{this.socket===e&&this.emit("error",t)},this.socket.onclose=()=>{this.socket===e&&this.emit("close")},this.stateChange("connecting","connecting")}onWebSocketMessage(t){this.rxCounter++,this.lastTxRxTime=Date.now();let e=se.from(t.data);this.rxBytes+=e.byteLength,this.emit("socket_data",e)}async onWebSocketMessageBlob(t){const e=this.socket;let r;if(this.rxCounter++,this.lastTxRxTime=Date.now(),t.data instanceof Blob){let e=await t.data.arrayBuffer();r=se.from(e)}else r=se.from(t.data);this.rxBytes+=r.byteLength,this.socket===e&&this.emit("socket_data",r)}socket_send(t){1===this.socket?.readyState?(this.socket.send(t),this.txCounter++,this.txBytes+=t.byteLength,this.lastTxRxTime=Date.now()):console.log(".")}}return fe}();
|
|
23
23
|
//# sourceMappingURL=io.js.map
|
package/dist/node/iosignal.cjs
CHANGED
package/dist/node/iosignal.js
CHANGED