xshell 1.0.14 → 1.0.16

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.
@@ -1 +1 @@
1
- {"version":3,"file":"net.browser.js","sourceRoot":"","sources":["net.browser.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types='tampermonkey' />\n\nimport { t } from './i18n/instance.js'\nimport './prototype.browser.js' // to_time_str()\nimport { assert, concat, genid, delay } from './utils.browser.js'\n\n\n// ------------------------------------ fetch, request\nexport interface BasicAuth {\n type: 'basic',\n username: string\n password: string\n}\n\nexport interface BearerAuth {\n type: 'bearer',\n token: string\n}\n\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'HEAD' | 'DELETE' | 'PATCH'\n \n queries?: Record<string, any>\n \n headers?: Record<string, string> | Headers\n \n body?: string | Record<string, any> | ArrayBufferView | ArrayBuffer | Blob |\n URLSearchParams | FormData\n \n type?: 'application/json' | 'application/x-www-form-urlencoded' | 'multipart/form-data'\n \n retries?: true | number\n \n timeout?: number\n \n auth?: BasicAuth | BearerAuth\n \n cookies?: Record<string, string>\n \n cors?: boolean\n \n by?: 'fetch' | 'GM_xmlhttpRequest'\n}\n\nexport interface RequestRawOptions extends RequestOptions {\n raw: true\n}\n\n\nasync function fetch_retry (url: URL, options: RequestInit, timeout: number, retries = 0, count = 0): Promise<Response> {\n try {\n options.signal = AbortSignal.timeout(timeout)\n return await fetch(url, options)\n } catch (error) {\n if (\n count >= retries ||\n error.name !== 'TimeoutError' && !['ECONNRESET', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(error.cause?.code)\n )\n throw error\n else {\n const duration = 2 ** count\n console.log(`${t('等待 {{duration}} 秒后重试 fetch ({{_count}}) …', { duration, _count: count })} ${url.toString()}`)\n await delay(1000 * duration)\n return fetch_retry(url, options, timeout, retries, count + 1)\n }\n }\n}\n\n\nexport interface RequestError extends Error {\n url: URL\n \n options: RequestInit\n \n response?: {\n /** 状态码 */\n status: number\n \n url: string\n \n headers: Headers\n \n ok: boolean\n \n type: ResponseType\n \n text: string\n \n redirected: boolean\n }\n}\n\n\n/**\n - url: 可以只有 pathname 部分\n - options?:\n - method?: `有 body 时为 POST, 否则为 GET` 'GET' | 'POST' | ···\n - queries?: 添加到 url 上的参数,是 Record<string, any>,true/false 会被转换为 0/1\n - headers?: http 请求头 (Record<string, string> 或者 Headers 类型),其中 key 必须是小写的\n - body?: http 请求体,可以是 string, Record<string, any> (会自动 JSON.stringify), ArrayBuffer(View), Blob, \n URLSearchParams (type 为 x-www-form-urlencoded), FormData (type 为 form-data)\n - type?: `'application/json'` 有 body 时设置 http 请求头中的 content-type 头\n - retries?: `false` 可以传入 true (默认 2 次) 或 重试次数\n - timeout?: `5 * 1000`\n - auth?: BasicAuth | BearerAuth\n - raw?: `false` 传入后返回整个 response \n - by: `window.GM_xmlhttpRequest ? 'GM_xmlhttpRequest' : 'fetch'` 发起请求所使用的底层方法 */\nexport async function request (url: string | URL): Promise<string>\nexport async function request (url: string | URL, options: RequestRawOptions): Promise<Response>\nexport async function request (url: string | URL, options: RequestOptions & { encoding: 'binary' }): Promise<ArrayBuffer>\nexport async function request (url: string | URL, options: RequestOptions): Promise<string>\nexport async function request (url: string | URL, {\n method,\n \n queries,\n \n headers: _headers,\n \n body,\n \n type = 'application/json',\n \n retries,\n \n timeout = 5 * 1000,\n \n auth,\n \n raw = false,\n \n cors,\n \n by = window.GM_xmlhttpRequest ? 'GM_xmlhttpRequest' : 'fetch',\n}: RequestOptions & { raw?: boolean } = { }) {\n url = new URL(url, location.href)\n \n if (queries)\n for (const key in queries) {\n let value = queries[key]\n if (typeof value === 'boolean')\n value = value ? '1' : '0'\n url.searchParams.append(key, value)\n }\n \n if (body !== undefined && !method)\n method = 'POST'\n \n if (retries === true)\n retries = 2\n \n \n // --- headers, http/2 开始都用小写的 headers\n let headers = new Headers()\n \n if (body !== undefined)\n headers.set('content-type', type)\n \n if (auth)\n headers.set(\n 'authorization',\n auth.type === 'basic' ? `Basic ${`${auth.username}:${auth.password}`.to_base64()}` : `Bearer ${auth.token}`\n )\n \n if (_headers)\n if (_headers instanceof Headers)\n // @ts-ignore: ts 类型不支持,实际上已经有了\n for (const [key, value] of _headers)\n headers.set(key, value)\n else\n for (const key in _headers) {\n const value = _headers[key]\n if (!value.startsWith(':')) { // 可能在 http/2 的 response 中会有这样开头的保留 headers, 在透传时忽略比较好\n assert(key === key.toLowerCase(), t('传入 request 的 headers 参数中 key 应该都是小写的,实际为 {{key}}', { key }))\n headers[key] = value\n }\n }\n \n \n if (by === 'fetch') {\n let options: RequestInit = {\n ... method ? { method } : { },\n \n keepalive: true,\n \n redirect: 'follow',\n \n credentials: 'include',\n \n ... cors ? { mode: 'cors' } : { },\n \n headers,\n \n // --- body\n body: (() => {\n if (body === undefined)\n return\n \n switch (type) {\n case 'application/json':\n return typeof body === 'string' || \n ArrayBuffer.isView(body) || \n body instanceof ArrayBuffer ||\n body instanceof Blob ?\n body as (string | NodeJS.ArrayBufferView | ArrayBuffer | Blob)\n :\n JSON.stringify(body)\n \n case 'application/x-www-form-urlencoded':\n return body instanceof URLSearchParams ? body : new URLSearchParams(body as Record<string, any>)\n \n case 'multipart/form-data':\n if (body instanceof FormData)\n return body\n else {\n let form = new FormData()\n for (const key in body as Record<string, any>) {\n let value = body[key]\n form.set(key, value)\n }\n return form\n }\n }\n })(),\n }\n \n \n let response: Response\n \n try {\n response = await fetch_retry(url, options, timeout, retries)\n \n if (!response.ok)\n throw Object.assign(\n new Error(`状态码 ${response.status}, 非 2xx`),\n { name: 'StatusCodeError' }\n )\n } catch (error) {\n error.url = url\n error.options = options\n \n if (response)\n error.response = {\n status: response.status,\n url: response.url,\n headers: response.headers,\n ok: response.ok,\n type: response.type,\n text: await response.text(),\n redirected: response.redirected\n }\n \n throw error\n }\n \n if (raw)\n return response\n \n if (!response.body)\n return response.body\n \n return response.text()\n } else\n return new Promise((resolve, reject) => {\n const options: Tampermonkey.Request<any> = {\n ... method ? { method: method as 'GET' | 'POST' | 'HEAD' } : { },\n \n url: url.toString(),\n \n // @ts-ignore ts 类型不支持,实际上已经有了\n headers: Object.fromEntries(headers),\n \n ... body ? {\n data: typeof body === 'string' ? body : JSON.stringify(body)\n } : { },\n \n onload (response) {\n if (200 <= response.status && response.status <= 299)\n resolve(response.responseText)\n else\n reject(\n Object.assign(\n new Error(`状态码 ${response.status}, 非 2xx`), \n {\n name: 'StatusCodeError',\n url,\n options,\n response: {\n stauts: response.status,\n url: url.toString(),\n headers: response.responseHeaders,\n ok: false,\n text: response.responseText\n }\n }\n )\n )\n },\n \n onerror (response) {\n reject(\n Object.assign(\n new Error(response.error),\n {\n name: 'TimeoutError',\n url: url as URL,\n options,\n response: {\n stauts: response.status,\n url: url.toString(),\n headers: response.responseHeaders,\n ok: false,\n text: response.responseText\n }\n }\n )\n )\n },\n \n ontimeout () {\n reject(\n Object.assign(\n new Error('GM_xmlhttpRequest 超时'),\n { name: 'TimeoutError', url, options }\n )\n )\n },\n }\n \n GM_xmlhttpRequest(options)\n })\n}\n\n\n/** 发起 http 请求并将响应体作为 json 解析 */\nexport async function request_json <T = any> (url: string, options?: RequestOptions): Promise<T> {\n const resp = await request(url, options)\n if (!resp)\n return\n try {\n return JSON.parse(resp)\n } catch (error) {\n console.error(resp)\n throw error\n }\n}\n\n\n\nlet decoder = new TextDecoder()\n\nlet encoder = new TextEncoder()\n\n\nexport class WebSocketConnectionError extends Error {\n override name = 'WebSocketConnectionError'\n \n websocket: WebSocket\n \n constructor (websocket: WebSocket) {\n super(`${websocket.url} ${t('连接出错了')}`)\n this.websocket = websocket\n }\n}\n\n\n/** 连接 websocket url, 设置各种事件监听器。在 open 事件后 resolve, 返回 websocket \n 遇到 error 时会创建 WebSocketConnectionError, 并作为参数调用 on_error,同时 reject 掉返回的 promise (若此时未 settle) \n - url\n - options:\n - protocols?\n - on_message: 根据 websocket frame 的 opcode 不同 (text frame 或 binary frame),event 中的 data 对应为 ArrayBuffer 或者 string\n https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n - on_close?: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes\n - on_error? */\nexport async function connect_websocket (\n url: string | URL,\n {\n protocols,\n on_close,\n on_error,\n on_message\n }: {\n protocols?: string | string[]\n on_close? (event: { code: number, reason: string }, websocket: WebSocket): any\n on_error? (error: WebSocketConnectionError, websocket: WebSocket): any\n on_message (data: ArrayBuffer | string, websocket: WebSocket): any\n }\n) {\n let websocket = new WebSocket(url, protocols)\n \n // https://stackoverflow.com/questions/11821096/what-is-the-difference-between-an-arraybuffer-and-a-blob/39951543\n websocket.binaryType = 'arraybuffer'\n \n return new Promise<WebSocket>((resolve, reject) => {\n let settled = false\n \n websocket.addEventListener('open', async event => {\n console.log(\n websocket.url +\n (protocols ? \n ' ' + (\n typeof protocols === 'string' ? protocols : protocols.join(', ').bracket('square')\n ).bracket()\n :\n '') +\n t(' 已连接')\n )\n \n settled = true\n resolve(websocket)\n })\n \n websocket.addEventListener('close', event => {\n if (event.code === 1000)\n console.log(websocket.url + t(' 已正常关闭'))\n else\n console.log(`${websocket.url} ${t('被关闭')}, code: ${event.code}${ event.reason ? `, ${t('原因')}: ${event.reason}` : '' }`)\n on_close?.(event, websocket)\n })\n \n websocket.addEventListener('error', event => {\n const error = new WebSocketConnectionError(websocket)\n \n try {\n on_error?.(error, websocket)\n } catch (error) {\n if (settled)\n throw error\n else {\n settled = true\n reject(error)\n }\n }\n \n if (settled)\n throw error\n else {\n settled = true\n reject(error)\n }\n })\n \n websocket.addEventListener('message', event => {\n on_message(event.data, websocket)\n })\n })\n}\n\n\n/** 接收到消息后的处理函数 \n 返回值可以是:\n - 数组: 会自动被封装为 { id: 相同, data: 返回值, done: true } 这样的消息并调用 websocket.send 将其发送\n - void: 什么都不做\n - 以上的 promise */\nexport type MessageHandler = (message: Message, websocket?: WebSocket) => void | any[] | Promise<void | any[]>\n\n\n/** 二进制消息格式 \n - json.length (小端序): 4 字节\n - json 数据\n - binary 数据\n*/\nexport interface Message <TData extends any[] = any[]> {\n /** rpc id: 在 rpc 系统中认为是唯一的。用来在单个 websocket 连接上复用多个 rpc 请求。多个相同 id 的 message 组成一个请求流 */\n id?: number\n \n /** 只在 rpc 发起时指定被调用的 function name,发起时 rpc 时必传 */\n func?: string\n \n /** 通过这个 flag 主动表明这是发往对方的最后一个 message, 对方可以销毁 handler 了 \n 并非强制,可以不说明,由双方的函数自己约定\n */\n done?: boolean\n \n /** 通知对方这里产生的错误,本质上类似 data 也是一种数据,并不代表 rpc 的结束,后续可能继续有 rpc message 交换 */\n error?: Error\n \n /** data 是一个数组, 作为:\n - rpc 发起方调用 func 的参数,或者请求流 message 携带的数据\n - 结果或者响应流的数据,传给请求发起方\n \n 里面是可序列化为 json 的 js 变量,或者是 Uint8Array \n Uint8Array 的参数处理后被替换为 Uint8Array.byteLength, 并将下标记录在 bins 中\n \n 注意: 数组中如果有 undefined 值,传输到对面会变成 null 值\n */\n data?: TData\n \n /** bins: data 中哪些下标对应的原始值是 Uint8Array 类型的,如: [0, 3] */\n bins?: number[]\n}\n\n/** 通过创建 remote 对象对 websocket rpc 进行抽象 \n 调用方使用 remote.call 进行调用 \n 被调方在创建 remote 对象时传入 funcs 注册处理函数,并使用 remote.handle 方法处理 websocket message \n 未连接时自动连接,断开后自动重连 */\nexport class Remote {\n url: string\n \n /** 主动发起 websocket 连接的客户端 (构造函数传 url) 有这个属性 */\n websocket?: WebSocket\n \n /** 通过 rpc message.func 被调用的 rpc 函数 */\n funcs: Record<string, MessageHandler>\n \n /** map<id, message handler>: 通过 rpc message.id 找到对应的 handler, unary rpc 接收方不需要设置 handlers, 发送方需要 */\n handlers = new Map<number, MessageHandler>()\n \n \n print = false\n \n pconnect: Promise<any>\n \n \n get connected () {\n return this.websocket?.readyState === WebSocket.OPEN\n }\n \n \n static parse <TData extends any[] = any[]> (array_buffer: ArrayBuffer) {\n const buf = new Uint8Array(array_buffer as ArrayBuffer)\n const dv = new DataView(array_buffer)\n \n const len_json = dv.getUint32(0, true)\n \n let offset = 4 + len_json\n \n let message: Message<TData> = JSON.parse(decoder.decode(buf.subarray(4, offset)))\n \n if (message.bins) {\n const { bins } = message\n let { data } = message\n \n for (const ibin of bins) {\n const len_buf = data[ibin]\n data[ibin] = buf.subarray(offset, offset + len_buf)\n offset += len_buf\n }\n }\n \n if (message.error)\n message.error = Object.assign(new Error(), message.error)\n \n return message\n }\n \n \n static pack ({ id, func, data = [ ], done, error }: Message) {\n let data_ = new Array(data.length)\n let bins: number[] = [ ]\n let bufs: Uint8Array[] = [ ]\n \n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n if (item instanceof Uint8Array) {\n bins.push(i)\n bufs.push(item)\n data_[i] = item.length\n } else\n data_[i] = item\n }\n \n const data_json = {\n id,\n ... func ? { func } : { },\n ... done ? { done } : { },\n ... error ? { error } : { },\n ... data_.length ? { data: data_ } : { },\n ... bins.length ? { bins } : { },\n }\n \n const str_json = encoder.encode(JSON.stringify(data_json))\n \n let dv = new DataView(new ArrayBuffer(4))\n \n dv.setUint32(0, str_json.length, true)\n \n return concat([dv, str_json, ... bufs])\n }\n \n \n constructor ({\n url, funcs = { }, websocket\n }: {\n url?: string, funcs?: Remote['funcs'], websocket?: WebSocket\n } = { }) {\n this.url = url\n this.funcs = funcs\n this.websocket = websocket\n }\n \n \n /** 幂等,保证 websocket 已连接,否则抛出异常,不需要手动调用,在其它方法中已默认自动重连 */\n async connect () {\n if (this.connected)\n return\n \n const ptail = this.pconnect\n \n let resolve: () => void\n this.pconnect = new Promise<void>((_resolve, _reject) => {\n resolve = _resolve\n })\n \n await ptail\n \n try {\n if (!this.connected)\n // 保存的 rpc 状态在 this.handlers, 与 websocket 无关,因此即使断开重连也不影响 rpc 的运行,即\n // 底层连接断开后自动重连对上层应该是无感知的,除非再次连接时失败\n this.websocket = await connect_websocket(this.url, { on_message: this.handle.bind(this) })\n } finally {\n resolve()\n }\n }\n \n \n disconnect () {\n this.websocket?.close()\n }\n \n \n /** 接收 websocket 连接的 remote 端必传 websocket 参数;发起端选传,如果传了必须等于 this.websocket \n 发送或连接出错时自动清理 message.id 对应的 handler */\n async send (message: Message, websocket?: WebSocket) {\n try {\n if (this.url) {\n assert(!websocket || websocket === this.websocket)\n await this.connect()\n websocket = this.websocket\n } else {\n assert(websocket)\n if (websocket.readyState !== WebSocket.OPEN)\n throw new Error(t('remote.send(): websocket client 已断开'))\n }\n \n if (!message.id)\n message.id = genid()\n \n websocket.send(Remote.pack(message))\n } catch (error) {\n if (message.id)\n this.handlers.delete(message.id)\n throw error\n }\n }\n \n \n /** 处理接收到的 websocket message 并解析, 根据 id dispatch 到对应的 handler 进行处理 \n 如果 message.done == true 则清理 handler \n 如果 handler 返回了值,则包装为 message 发送 */\n async handle (data: ArrayBuffer, websocket: WebSocket) {\n const message = Remote.parse(data)\n \n const { id, func, done } = message\n \n if (this.print)\n console.log(message)\n \n let handler: MessageHandler\n \n if (func)\n handler = this.funcs[func]\n else {\n handler = this.handlers.get(id)\n if (done)\n this.handlers.delete(id)\n }\n \n try {\n if (handler) {\n const data = await handler(message, websocket)\n if (data)\n await this.send({ id, data }, websocket)\n } else if (message.error)\n throw message.error\n else\n throw new Error(`${t('找不到 rpc handler')}: ${func ? `func: ${func.quote()}` : `id: ${id}`}`)\n } catch (error) {\n // handle 出错并不意味着 rpc 一定会结束,可能 error 是运行中的正常数据,所以不能清理 handler\n \n if (\n websocket.readyState === WebSocket.OPEN &&\n !message.error // 防止无限循环往对方发送 error, 只有在对方无错误时才可以发送\n )\n try { await this.send({ id, error, /* 不能设置 done 清理对面 handler, 理由同上 */ }, websocket) } catch { }\n \n // 再往上层抛出错误没有意义了,上层调用栈是 websocket.on('message') 之类的\n console.log(error)\n }\n }\n \n \n /** 调用 remote 中的 func, 只适用于最简单的一元 rpc (请求, 响应) */\n async call <TReturn extends any[] = any[]> (func: string, args?: any[]) {\n return new Promise<TReturn>(async (resolve, reject) => {\n const id = genid()\n \n this.handlers.set(id, (message: Message<TReturn>) => {\n const { error, data } = message\n if (error)\n reject(error)\n else\n resolve(data)\n this.handlers.delete(id)\n })\n \n try {\n await this.send({ id, func, data: args }) // 不需要 done: true, 因为对面的 remote.handlers 中不会有这个 id 的 handler\n } catch (error) {\n reject(error)\n }\n })\n }\n}\n\n"]}
1
+ {"version":3,"file":"net.browser.js","sourceRoot":"","sources":["net.browser.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types='tampermonkey' />\n\nimport { t } from './i18n/instance.js'\nimport './prototype.browser.js' // to_time_str()\nimport { assert, concat, genid, delay } from './utils.browser.js'\n\n\n// ------------------------------------ fetch, request\nexport interface BasicAuth {\n type: 'basic',\n username: string\n password: string\n}\n\nexport interface BearerAuth {\n type: 'bearer',\n token: string\n}\n\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'HEAD' | 'DELETE' | 'PATCH'\n \n queries?: Record<string, any>\n \n headers?: Record<string, string> | Headers\n \n body?: string | Record<string, any> | ArrayBufferView | ArrayBuffer | Blob |\n URLSearchParams | FormData\n \n type?: 'application/json' | 'application/x-www-form-urlencoded' | 'multipart/form-data'\n \n retries?: true | number\n \n timeout?: number\n \n auth?: BasicAuth | BearerAuth\n \n cookies?: Record<string, string>\n \n cors?: boolean\n \n by?: 'fetch' | 'GM_xmlhttpRequest'\n}\n\nexport interface RequestRawOptions extends RequestOptions {\n raw: true\n}\n\n\nasync function fetch_retry (url: URL, options: RequestInit, timeout: number, retries = 0, count = 0): Promise<Response> {\n try {\n options.signal = AbortSignal.timeout(timeout)\n return await fetch(url, options)\n } catch (error) {\n if (\n count >= retries ||\n error.name !== 'TimeoutError' && !['ECONNRESET', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(error.cause?.code)\n )\n throw error\n else {\n const duration = 2 ** count\n console.log(`${t('等待 {{duration}} 秒后重试 fetch ({{_count}}) …', { duration, _count: count })} ${url.toString()}`)\n await delay(1000 * duration)\n return fetch_retry(url, options, timeout, retries, count + 1)\n }\n }\n}\n\n\nexport interface RequestError extends Error {\n url: URL\n \n options: RequestInit\n \n response?: {\n /** 状态码 */\n status: number\n \n url: string\n \n headers: Headers\n \n ok: boolean\n \n type: ResponseType\n \n text: string\n \n redirected: boolean\n }\n}\n\n\n/**\n - url: 可以只有 pathname 部分\n - options?:\n - method?: `有 body 时为 POST, 否则为 GET` 'GET' | 'POST' | ···\n - queries?: 添加到 url 上的参数,是 Record<string, any>,true/false 会被转换为 0/1\n - headers?: http 请求头 (Record<string, string> 或者 Headers 类型),其中 key 必须是小写的\n - body?: http 请求体,可以是 string, Record<string, any> (会自动 JSON.stringify), ArrayBuffer(View), Blob, \n URLSearchParams (type 为 x-www-form-urlencoded), FormData (type 为 form-data)\n - type?: `'application/json'` 有 body 时设置 http 请求头中的 content-type 头\n - retries?: `false` 可以传入 true (默认 2 次) 或 重试次数\n - timeout?: `5 * 1000`\n - auth?: BasicAuth | BearerAuth\n - raw?: `false` 传入后返回整个 response \n - by: `window.GM_xmlhttpRequest ? 'GM_xmlhttpRequest' : 'fetch'` 发起请求所使用的底层方法 */\nexport async function request (url: string | URL): Promise<string>\nexport async function request (url: string | URL, options: RequestRawOptions): Promise<Response>\nexport async function request (url: string | URL, options: RequestOptions & { encoding: 'binary' }): Promise<ArrayBuffer>\nexport async function request (url: string | URL, options: RequestOptions): Promise<string>\nexport async function request (url: string | URL, {\n method,\n \n queries,\n \n headers: _headers,\n \n body,\n \n type = 'application/json',\n \n retries,\n \n timeout = 5 * 1000,\n \n auth,\n \n raw = false,\n \n cors,\n \n by = window.GM_xmlhttpRequest ? 'GM_xmlhttpRequest' : 'fetch',\n}: RequestOptions & { raw?: boolean } = { }) {\n url = new URL(url, location.href)\n \n if (queries)\n for (const key in queries) {\n let value = queries[key]\n if (typeof value === 'boolean')\n value = value ? '1' : '0'\n url.searchParams.append(key, value)\n }\n \n if (body !== undefined && !method)\n method = 'POST'\n \n if (retries === true)\n retries = 2\n \n \n // --- headers, http/2 开始都用小写的 headers\n let headers = new Headers()\n \n if (body !== undefined)\n headers.set('content-type', type)\n \n if (auth)\n headers.set(\n 'authorization',\n auth.type === 'basic' ? `Basic ${`${auth.username}:${auth.password}`.to_base64()}` : `Bearer ${auth.token}`\n )\n \n if (_headers)\n if (_headers instanceof Headers)\n // @ts-ignore: ts 类型不支持,实际上已经有了\n for (const [key, value] of _headers)\n headers.set(key, value)\n else\n for (const key in _headers) {\n const value = _headers[key]\n if (!value.startsWith(':')) { // 可能在 http/2 的 response 中会有这样开头的保留 headers, 在透传时忽略比较好\n assert(key === key.toLowerCase(), t('传入 request 的 headers 参数中 key 应该都是小写的,实际为 {{key}}', { key }))\n headers[key] = value\n }\n }\n \n \n if (by === 'fetch') {\n let options: RequestInit = {\n ... method ? { method } : { },\n \n keepalive: true,\n \n redirect: 'follow',\n \n credentials: 'include',\n \n ... cors ? { mode: 'cors' } : { },\n \n headers,\n \n // --- body\n body: (() => {\n if (body === undefined)\n return\n \n switch (type) {\n case 'application/json':\n return typeof body === 'string' || \n ArrayBuffer.isView(body) || \n body instanceof ArrayBuffer ||\n body instanceof Blob ?\n body as (string | NodeJS.ArrayBufferView | ArrayBuffer | Blob)\n :\n JSON.stringify(body)\n \n case 'application/x-www-form-urlencoded':\n return body instanceof URLSearchParams ? body : new URLSearchParams(body as Record<string, any>)\n \n case 'multipart/form-data':\n if (body instanceof FormData)\n return body\n else {\n let form = new FormData()\n for (const key in body as Record<string, any>) {\n let value = body[key]\n form.set(key, value)\n }\n return form\n }\n }\n })(),\n }\n \n \n let response: Response\n \n try {\n response = await fetch_retry(url, options, timeout, retries)\n \n if (!response.ok)\n throw Object.assign(\n new Error(`状态码 ${response.status}, 非 2xx`),\n { name: 'StatusCodeError' }\n )\n } catch (error) {\n error.url = url\n error.options = options\n \n if (response)\n error.response = {\n status: response.status,\n url: response.url,\n headers: response.headers,\n ok: response.ok,\n type: response.type,\n text: await response.text(),\n redirected: response.redirected\n }\n \n throw error\n }\n \n if (raw)\n return response\n \n if (!response.body)\n return response.body\n \n return response.text()\n } else\n return new Promise((resolve, reject) => {\n const options: Tampermonkey.Request<any> = {\n ... method ? { method: method as 'GET' | 'POST' | 'HEAD' } : { },\n \n url: url.toString(),\n \n // @ts-ignore ts 类型不支持,实际上已经有了\n headers: Object.fromEntries(headers),\n \n ... body ? {\n data: typeof body === 'string' ? body : JSON.stringify(body)\n } : { },\n \n onload (response) {\n if (200 <= response.status && response.status <= 299)\n resolve(response.responseText)\n else\n reject(\n Object.assign(\n new Error(`状态码 ${response.status}, 非 2xx`), \n {\n name: 'StatusCodeError',\n url,\n options,\n response: {\n stauts: response.status,\n url: url.toString(),\n headers: response.responseHeaders,\n ok: false,\n text: response.responseText\n }\n }\n )\n )\n },\n \n onerror (response) {\n reject(\n Object.assign(\n new Error(response.error),\n {\n name: 'TimeoutError',\n url: url as URL,\n options,\n response: {\n stauts: response.status,\n url: url.toString(),\n headers: response.responseHeaders,\n ok: false,\n text: response.responseText\n }\n }\n )\n )\n },\n \n ontimeout () {\n reject(\n Object.assign(\n new Error('GM_xmlhttpRequest 超时'),\n { name: 'TimeoutError', url, options }\n )\n )\n },\n }\n \n GM_xmlhttpRequest(options)\n })\n}\n\n\n/** 发起 http 请求并将响应体作为 json 解析 */\nexport async function request_json <T = any> (url: string, options?: RequestOptions): Promise<T> {\n const resp = await request(url, options)\n if (!resp)\n return\n try {\n return JSON.parse(resp)\n } catch (error) {\n console.error(resp)\n throw error\n }\n}\n\n\n\nlet decoder = new TextDecoder()\n\nlet encoder = new TextEncoder()\n\n\nexport class WebSocketConnectionError extends Error {\n override name = 'WebSocketConnectionError'\n \n websocket: WebSocket\n \n event: WebSocketEventMap['close' | 'error']\n \n type: 'close' | 'error'\n \n code?: number\n \n reason?: string\n \n \n constructor (websocket: WebSocket, event: WebSocketConnectionError['event'], message?: string) {\n super(`${websocket.url} ${t('连接出错了')}. ${message || ''}`)\n this.websocket = websocket\n this.event = event\n this.type = event.type as 'close' | 'error'\n if (this.type === 'close') {\n this.code = (event as CloseEvent).code\n this.reason = (event as CloseEvent).reason\n }\n }\n}\n\n\n/** 连接 websocket url, 设置各种事件监听器。在 open 事件后 resolve, 返回 websocket \n 遇到 error 时会创建 WebSocketConnectionError: \n - reject 掉返回的 promise (若此时未 settle) \n - 作为参数调用 on_error (已 settle 且有 on_error 回调) \n 可以用 WebSocket.bufferedAmount 来显示大消息的发送进度 \n https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/bufferedAmount\n - url\n - options:\n - protocols?\n - on_message: 根据 websocket frame 的 opcode 不同 (text frame 或 binary frame),event 中的 data 对应为 ArrayBuffer 或者 string\n https://datatracker.ietf.org/doc/html/rfc6455#section-5.2\n - on_error?: 在 websocket 出错和非正常关闭 (close, error 事件) 时都调用,可以根据 error.type 来区分,error 的类型是 WebSocketConnectionError,\n type 为 'close' 时有 code 和 reason 属性 \n - on_close?: 和 websocket 的 'close' 事件不相同,只在正常关闭 (close code 为 1000) 时才调用,否则都会调用 on_error\n https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes */\nexport async function connect_websocket (\n url: string | URL,\n {\n protocols,\n on_message,\n on_error,\n on_close,\n }: {\n protocols?: string | string[]\n on_message (data: ArrayBuffer | string, websocket: WebSocket): any\n on_error? (error: WebSocketConnectionError, websocket: WebSocket): any\n on_close? (event: CloseEvent, websocket: WebSocket): any\n }\n) {\n let websocket = new WebSocket(url, protocols)\n \n // https://stackoverflow.com/questions/11821096/what-is-the-difference-between-an-arraybuffer-and-a-blob/39951543\n websocket.binaryType = 'arraybuffer'\n \n return new Promise<WebSocket>((resolve, reject) => {\n let settled = false\n \n websocket.addEventListener('open', event => {\n console.log(\n websocket.url +\n (protocols ? \n ' ' + (\n typeof protocols === 'string' ? protocols : protocols.join(', ').bracket('square')\n ).bracket()\n :\n '') +\n t(' 已连接')\n )\n \n settled = true\n resolve(websocket)\n })\n \n websocket.addEventListener('close', event => {\n if (event.code === 1000) // 正常关闭\n if (on_close)\n on_close(event, websocket)\n else\n console.log(`${websocket.url} ${t('已正常关闭')}`)\n else { // 异常关闭,认为发生了错误,进行错误处理\n assert(settled, t('websocket close 事件时应该已经 settled'))\n \n const error = new WebSocketConnectionError(websocket, event, `${t('连接被关闭')}, code: ${event.code}${ event.reason ? `, ${t('原因')}: ${event.reason}` : '' }`)\n \n if (on_error)\n on_error(error, websocket)\n else // 既然用户不传 on_error, 就当 unhandled error 抛出来\n throw error\n }\n })\n \n websocket.addEventListener('error', event => {\n const error = new WebSocketConnectionError(websocket, event)\n \n if (settled) {\n if (on_error)\n on_error(error, websocket)\n else // 既然用户不传 on_error, 就当 unhandled error 抛出来\n throw error\n } else {\n settled = true\n reject(error)\n }\n })\n \n websocket.addEventListener('message', event => {\n on_message(event.data, websocket)\n })\n })\n}\n\n\n/** 接收到消息后的处理函数 \n 返回值可以是:\n - 数组: 会自动被封装为 { id: 相同, data: 返回值, done: true } 这样的消息并调用 websocket.send 将其发送\n - void: 什么都不做\n - 以上的 promise */\nexport type MessageHandler = (message: Message, websocket?: WebSocket) => void | any[] | Promise<void | any[]>\n\n\n/** 二进制消息格式 \n - json.length (小端序): 4 字节\n - json 数据\n - binary 数据\n*/\nexport interface Message <TData extends any[] = any[]> {\n /** rpc id: 在 rpc 系统中认为是唯一的。用来在单个 websocket 连接上复用多个 rpc 请求。多个相同 id 的 message 组成一个请求流 */\n id?: number\n \n /** 只在 rpc 发起时指定被调用的 function name,发起时 rpc 时必传 */\n func?: string\n \n /** 通过这个 flag 主动表明这是发往对方的最后一个 message, 对方可以销毁 handler 了 \n 并非强制,可以不说明,由双方的函数自己约定\n */\n done?: boolean\n \n /** 通知对方这里产生的错误,本质上类似 data 也是一种数据,并不代表 rpc 的结束,后续可能继续有 rpc message 交换 */\n error?: Error\n \n /** data 是一个数组, 作为:\n - rpc 发起方调用 func 的参数,或者请求流 message 携带的数据\n - 结果或者响应流的数据,传给请求发起方\n \n 里面是可序列化为 json 的 js 变量,或者是 Uint8Array \n Uint8Array 的参数处理后被替换为 Uint8Array.byteLength, 并将下标记录在 bins 中\n \n 注意: 数组中如果有 undefined 值,传输到对面会变成 null 值\n */\n data?: TData\n \n /** bins: data 中哪些下标对应的原始值是 Uint8Array 类型的,如: [0, 3] */\n bins?: number[]\n}\n\n/** 通过创建 remote 对象对 websocket rpc 进行抽象 \n 调用方使用 remote.call 进行调用 \n 被调方在创建 remote 对象时传入 funcs 注册处理函数,并使用 remote.handle 方法处理 websocket message \n 未连接时自动连接,断开后自动重连 */\nexport class Remote {\n url: string\n \n /** 主动发起 websocket 连接的客户端 (构造函数传 url) 有这个属性 */\n websocket?: WebSocket\n \n /** 通过 rpc message.func 被调用的 rpc 函数 */\n funcs: Record<string, MessageHandler>\n \n /** map<id, message handler>: 通过 rpc message.id 找到对应的 handler, unary rpc 接收方不需要设置 handlers, 发送方需要 */\n handlers = new Map<number, MessageHandler>()\n \n \n print = false\n \n pconnect: Promise<any>\n \n \n get connected () {\n return this.websocket?.readyState === WebSocket.OPEN\n }\n \n \n static parse <TData extends any[] = any[]> (array_buffer: ArrayBuffer) {\n const buf = new Uint8Array(array_buffer as ArrayBuffer)\n const dv = new DataView(array_buffer)\n \n const len_json = dv.getUint32(0, true)\n \n let offset = 4 + len_json\n \n let message: Message<TData> = JSON.parse(decoder.decode(buf.subarray(4, offset)))\n \n if (message.bins) {\n const { bins } = message\n let { data } = message\n \n for (const ibin of bins) {\n const len_buf = data[ibin]\n data[ibin] = buf.subarray(offset, offset + len_buf)\n offset += len_buf\n }\n }\n \n if (message.error)\n message.error = Object.assign(new Error(), message.error)\n \n return message\n }\n \n \n static pack ({ id, func, data = [ ], done, error }: Message) {\n let data_ = new Array(data.length)\n let bins: number[] = [ ]\n let bufs: Uint8Array[] = [ ]\n \n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n if (item instanceof Uint8Array) {\n bins.push(i)\n bufs.push(item)\n data_[i] = item.length\n } else\n data_[i] = item\n }\n \n const data_json = {\n id,\n ... func ? { func } : { },\n ... done ? { done } : { },\n ... error ? { error } : { },\n ... data_.length ? { data: data_ } : { },\n ... bins.length ? { bins } : { },\n }\n \n const str_json = encoder.encode(JSON.stringify(data_json))\n \n let dv = new DataView(new ArrayBuffer(4))\n \n dv.setUint32(0, str_json.length, true)\n \n return concat([dv, str_json, ... bufs])\n }\n \n \n constructor ({\n url, funcs = { }, websocket\n }: {\n url?: string, funcs?: Remote['funcs'], websocket?: WebSocket\n } = { }) {\n this.url = url\n this.funcs = funcs\n this.websocket = websocket\n }\n \n \n /** 幂等,保证 websocket 已连接,否则抛出异常,不需要手动调用,在其它方法中已默认自动重连 */\n async connect () {\n if (this.connected)\n return\n \n const ptail = this.pconnect\n \n let resolve: () => void\n this.pconnect = new Promise<void>((_resolve, _reject) => {\n resolve = _resolve\n })\n \n await ptail\n \n try {\n if (!this.connected)\n // 保存的 rpc 状态在 this.handlers, 与 websocket 无关,因此即使断开重连也不影响 rpc 的运行,即\n // 底层连接断开后自动重连对上层应该是无感知的,除非再次连接时失败\n this.websocket = await connect_websocket(this.url, { on_message: this.handle.bind(this) })\n } finally {\n resolve()\n }\n }\n \n \n disconnect () {\n this.websocket?.close()\n }\n \n \n /** 接收 websocket 连接的 remote 端必传 websocket 参数;发起端选传,如果传了必须等于 this.websocket \n 发送或连接出错时自动清理 message.id 对应的 handler */\n async send (message: Message, websocket?: WebSocket) {\n try {\n if (this.url) {\n assert(!websocket || websocket === this.websocket)\n await this.connect()\n websocket = this.websocket\n } else {\n assert(websocket)\n if (websocket.readyState !== WebSocket.OPEN)\n throw new Error(t('remote.send(): websocket client 已断开'))\n }\n \n if (!message.id)\n message.id = genid()\n \n websocket.send(Remote.pack(message))\n } catch (error) {\n if (message.id)\n this.handlers.delete(message.id)\n throw error\n }\n }\n \n \n /** 处理接收到的 websocket message 并解析, 根据 id dispatch 到对应的 handler 进行处理 \n 如果 message.done == true 则清理 handler \n 如果 handler 返回了值,则包装为 message 发送 */\n async handle (data: ArrayBuffer, websocket: WebSocket) {\n const message = Remote.parse(data)\n \n const { id, func, done } = message\n \n if (this.print)\n console.log(message)\n \n let handler: MessageHandler\n \n if (func)\n handler = this.funcs[func]\n else {\n handler = this.handlers.get(id)\n if (done)\n this.handlers.delete(id)\n }\n \n try {\n if (handler) {\n const data = await handler(message, websocket)\n if (data)\n await this.send({ id, data }, websocket)\n } else if (message.error)\n throw message.error\n else\n throw new Error(`${t('找不到 rpc handler')}: ${func ? `func: ${func.quote()}` : `id: ${id}`}`)\n } catch (error) {\n // handle 出错并不意味着 rpc 一定会结束,可能 error 是运行中的正常数据,所以不能清理 handler\n \n if (\n websocket.readyState === WebSocket.OPEN &&\n !message.error // 防止无限循环往对方发送 error, 只有在对方无错误时才可以发送\n )\n try { await this.send({ id, error, /* 不能设置 done 清理对面 handler, 理由同上 */ }, websocket) } catch { }\n \n // 再往上层抛出错误没有意义了,上层调用栈是 websocket.on('message') 之类的\n console.log(error)\n }\n }\n \n \n /** 调用 remote 中的 func, 只适用于最简单的一元 rpc (请求, 响应) */\n async call <TReturn extends any[] = any[]> (func: string, args?: any[]) {\n return new Promise<TReturn>(async (resolve, reject) => {\n const id = genid()\n \n this.handlers.set(id, (message: Message<TReturn>) => {\n const { error, data } = message\n if (error)\n reject(error)\n else\n resolve(data)\n this.handlers.delete(id)\n })\n \n try {\n await this.send({ id, func, data: args }) // 不需要 done: true, 因为对面的 remote.handlers 中不会有这个 id 的 handler\n } catch (error) {\n reject(error)\n }\n })\n }\n}\n\n"]}
package/net.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  /// <reference types="cheerio" />
3
3
  import { FormData, Headers, type Response, type RequestInit } from 'undici';
4
- import { WebSocket } from 'ws';
4
+ import { WebSocket, type CloseEvent, type ErrorEvent } from 'ws';
5
5
  import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';
6
6
  declare module 'tough-cookie' {
7
7
  interface MemoryCookieStore {
@@ -18,7 +18,7 @@ export declare enum MyProxy {
18
18
  export declare const cookies: {
19
19
  store: MemoryCookieStore;
20
20
  jar: CookieJar;
21
- get(domain_or_url: string, str?: boolean): Cookie[] | Promise<string> | Promise<Cookie[]>;
21
+ get(domain_or_url: string, str?: boolean): Promise<string> | Cookie[] | Promise<Cookie[]>;
22
22
  };
23
23
  export { Cookie };
24
24
  export interface BasicAuth {
@@ -37,7 +37,7 @@ export interface RequestOptions {
37
37
  body?: string | Record<string, any> | NodeJS.ArrayBufferView | ArrayBuffer | AsyncIterable<Uint8Array> | Iterable<Uint8Array> | URLSearchParams | FormData;
38
38
  type?: 'application/json' | 'application/x-www-form-urlencoded' | 'multipart/form-data';
39
39
  proxy?: boolean | MyProxy | string;
40
- encoding?: Encoding;
40
+ encoding?: Encoding | 'binary';
41
41
  retries?: true | number;
42
42
  timeout?: number;
43
43
  auth?: BasicAuth | BearerAuth;
@@ -107,37 +107,44 @@ export declare function rpc(func: string, args?: any[], { url, async: _async, ig
107
107
  async?: boolean;
108
108
  ignore?: boolean;
109
109
  }): Promise<any>;
110
+ export { WebSocket };
110
111
  export declare class WebSocketConnectionError extends Error {
111
112
  name: string;
112
113
  websocket: WebSocket;
113
- address: string;
114
- code: string;
115
- errno: number;
116
- port: number;
117
- syscall: string;
118
- constructor(websocket: WebSocket, error: Error);
114
+ event: CloseEvent | ErrorEvent;
115
+ type: 'close' | 'error';
116
+ address?: string;
117
+ errno?: number;
118
+ port?: number;
119
+ syscall?: string;
120
+ /** close 事件时为 close code, error 事件为 error code */
121
+ code?: string | number;
122
+ reason?: string;
123
+ constructor(websocket: WebSocket, event: CloseEvent | ErrorEvent, message?: string);
119
124
  }
120
- export { WebSocket };
121
125
  /** 连接 websocket url, 设置各种事件监听器。在 open 事件后 resolve, 返回 websocket
122
- 遇到 error 时会创建 WebSocketConnectionError, 并作为参数调用 on_error,同时 reject 掉返回的 promise (若此时未 settle)
126
+ 遇到 error 时会创建 WebSocketConnectionError:
127
+ - reject 掉返回的 promise (若此时未 settle)
128
+ - 作为参数调用 on_error (已 settle 且有 on_error 回调)
129
+ 可以用 WebSocket.bufferedAmount 来显示大消息的发送进度
130
+ https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/bufferedAmount
123
131
  - url
124
132
  - options:
125
133
  - protocols?
126
- - max_payload?
134
+ - max_payload?: `8 GB`
127
135
  - on_message: 根据 websocket frame 的 opcode 不同 (text frame 或 binary frame),event 中的 data 对应为 ArrayBuffer 或者 string
128
136
  https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
129
- - on_close?: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes
130
- - on_error? */
137
+ - on_error?: 在 websocket 出错和非正常关闭 (close, error 事件) 时都调用,可以根据 error.type 来区分,error 的类型是 WebSocketConnectionError,
138
+ type 'close' 时有 code 和 reason 属性
139
+ - on_close?: 和 websocket 的 'close' 事件不相同,只在正常关闭 (close code 为 1000) 时才调用,否则都会调用 on_error
140
+ https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes */
131
141
  export declare function connect_websocket(url: string | URL, { protocols, max_payload, // 8 GB
132
- on_close, on_error, on_message }: {
142
+ on_message, on_error, on_close }: {
133
143
  protocols?: string | string[];
134
144
  max_payload?: number;
135
- on_close?(event: {
136
- code: number;
137
- reason: string;
138
- }, websocket: WebSocket): any;
139
- on_error?(error: WebSocketConnectionError, websocket: WebSocket): any;
140
145
  on_message(data: ArrayBuffer | string, websocket: WebSocket): any;
146
+ on_error?(error: WebSocketConnectionError, websocket: WebSocket): any;
147
+ on_close?(event: CloseEvent, websocket: WebSocket): any;
141
148
  }): Promise<WebSocket>;
142
149
  /** 接收到消息后的处理函数
143
150
  返回值可以是:
package/net.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { fetch, ProxyAgent, FormData, Headers } from 'undici';
2
2
  import { WebSocket } from 'ws';
3
- import iconv from 'iconv-lite';
4
3
  import qs from 'qs';
5
4
  import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';
6
5
  import make_fetch_cookie from 'fetch-cookie';
@@ -230,7 +229,8 @@ export async function request(url, { method, queries, headers: _headers, body, t
230
229
  encoding ||= /charset=(.*)/.exec(response.headers.get('content-type'))?.[1] || 'utf-8';
231
230
  if (/utf-?8/i.test(encoding))
232
231
  return response.text();
233
- return iconv.decode(Buffer.from(await response.arrayBuffer()), encoding);
232
+ return new TextDecoder(encoding)
233
+ .decode(await response.arrayBuffer());
234
234
  }
235
235
  /** 发起 http 请求并将响应体作为 json 解析 */
236
236
  export async function request_json(url, options) {
@@ -316,42 +316,62 @@ export async function rpc(func, args, { url = 'http://localhost:8421/api/rpc', a
316
316
  }
317
317
  let decoder = new TextDecoder();
318
318
  let encoder = new TextEncoder();
319
+ export { WebSocket };
319
320
  export class WebSocketConnectionError extends Error {
320
321
  name = 'WebSocketConnectionError';
321
322
  websocket;
323
+ event;
324
+ type;
322
325
  address;
323
- code;
324
326
  errno;
325
327
  port;
326
328
  syscall;
327
- constructor(websocket, error) {
328
- super(`${websocket.url} ${t('连接出错了')}. ${error.message}`);
329
+ /** close 事件时为 close code, error 事件为 error code */
330
+ code;
331
+ reason;
332
+ constructor(websocket, event, message = '') {
333
+ super(`${websocket.url} ${t('连接出错了')}. ${message}`);
329
334
  this.websocket = websocket;
330
- this.address = error.address;
331
- this.code = error.code;
332
- this.errno = error.errno;
333
- this.port = error.port;
334
- this.syscall = error.syscall;
335
- const [message_line, ...stack_lines] = this.stack.split_lines();
336
- this.stack =
337
- message_line + '\n' +
338
- error.stack.slice(error.stack.indexOf('\n') + 1) + '\n' +
339
- stack_lines.join_lines();
335
+ this.event = event;
336
+ this.type = event.type;
337
+ if (this.type === 'error') {
338
+ const { error } = event;
339
+ this.address = error.address;
340
+ this.code = error.code;
341
+ this.errno = error.errno;
342
+ this.port = error.port;
343
+ this.syscall = error.syscall;
344
+ this.reason = error.reason;
345
+ const [message_line, ...stack_lines] = this.stack.split_lines();
346
+ this.stack =
347
+ message_line + '\n' +
348
+ error.stack.slice(error.stack.indexOf('\n') + 1) + '\n' +
349
+ stack_lines.join_lines();
350
+ }
351
+ else {
352
+ this.code = event.code;
353
+ this.reason = event.reason;
354
+ }
340
355
  }
341
356
  }
342
- export { WebSocket };
343
357
  /** 连接 websocket url, 设置各种事件监听器。在 open 事件后 resolve, 返回 websocket
344
- 遇到 error 时会创建 WebSocketConnectionError, 并作为参数调用 on_error,同时 reject 掉返回的 promise (若此时未 settle)
358
+ 遇到 error 时会创建 WebSocketConnectionError:
359
+ - reject 掉返回的 promise (若此时未 settle)
360
+ - 作为参数调用 on_error (已 settle 且有 on_error 回调)
361
+ 可以用 WebSocket.bufferedAmount 来显示大消息的发送进度
362
+ https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/bufferedAmount
345
363
  - url
346
364
  - options:
347
365
  - protocols?
348
- - max_payload?
366
+ - max_payload?: `8 GB`
349
367
  - on_message: 根据 websocket frame 的 opcode 不同 (text frame 或 binary frame),event 中的 data 对应为 ArrayBuffer 或者 string
350
368
  https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
351
- - on_close?: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes
352
- - on_error? */
369
+ - on_error?: 在 websocket 出错和非正常关闭 (close, error 事件) 时都调用,可以根据 error.type 来区分,error 的类型是 WebSocketConnectionError,
370
+ type 'close' 时有 code 和 reason 属性
371
+ - on_close?: 和 websocket 的 'close' 事件不相同,只在正常关闭 (close code 为 1000) 时才调用,否则都会调用 on_error
372
+ https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes */
353
373
  export async function connect_websocket(url, { protocols, max_payload = 2 ** 33, // 8 GB
354
- on_close, on_error, on_message }) {
374
+ on_message, on_error, on_close }) {
355
375
  let websocket = new WebSocket(url, protocols, {
356
376
  maxPayload: max_payload,
357
377
  skipUTF8Validation: true
@@ -360,7 +380,7 @@ on_close, on_error, on_message }) {
360
380
  websocket.binaryType = 'arraybuffer';
361
381
  return new Promise((resolve, reject) => {
362
382
  let settled = false;
363
- websocket.addEventListener('open', async (event) => {
383
+ websocket.addEventListener('open', event => {
364
384
  console.log(websocket.url +
365
385
  (protocols ?
366
386
  ' ' + (typeof protocols === 'string' ? protocols : protocols.join(', ').bracket('square')).bracket()
@@ -371,27 +391,28 @@ on_close, on_error, on_message }) {
371
391
  resolve(websocket);
372
392
  });
373
393
  websocket.addEventListener('close', event => {
374
- if (event.code === 1000)
375
- console.log(websocket.url + t(' 已正常关闭'));
376
- else
377
- console.log(`${websocket.url} ${t('被关闭')}, code: ${event.code}${event.reason ? `, ${t('原因')}: ${event.reason}` : ''}`);
378
- on_close?.(event, websocket);
394
+ if (event.code === 1000) // 正常关闭
395
+ if (on_close)
396
+ on_close(event, websocket);
397
+ else
398
+ console.log(`${websocket.url} ${t('已正常关闭')}`);
399
+ else { // 异常关闭,认为发生了错误,进行错误处理
400
+ assert(settled, t('websocket close 事件时应该已经 settled'));
401
+ const error = new WebSocketConnectionError(websocket, event, `${t('连接被关闭')}, code: ${event.code}${event.reason ? `, ${t('原因')}: ${event.reason}` : ''}`);
402
+ if (on_error)
403
+ on_error(error, websocket);
404
+ else // 既然用户不传 on_error, 就当 unhandled error 抛出来
405
+ throw error;
406
+ }
379
407
  });
380
408
  websocket.addEventListener('error', event => {
381
- const error = new WebSocketConnectionError(websocket, event.error);
382
- try {
383
- on_error?.(error, websocket);
384
- }
385
- catch (error) {
386
- if (settled)
409
+ const error = new WebSocketConnectionError(websocket, event, event.error?.message);
410
+ if (settled) {
411
+ if (on_error)
412
+ on_error(error, websocket);
413
+ else // 既然用户不传 on_error, 就当 unhandled error 抛出来
387
414
  throw error;
388
- else {
389
- settled = true;
390
- reject(error);
391
- }
392
415
  }
393
- if (settled)
394
- throw error;
395
416
  else {
396
417
  settled = true;
397
418
  reject(error);