UNPKG

@cloudpss/ubrpc

Version:

Rpc server/client build on websocket and ubjson.

61 lines 2.13 kB
import { WebSocket, WebSocketStatusCode } from '@cloudpss/fetch'; import { v4 } from 'uuid'; import { waitAuth } from './auth.js'; import { RpcSocket } from './socket.js'; import { send } from './utils/messaging.js'; import { VERSION } from './version.js'; import { WebSocketAppCode } from './codes.js'; import { logger } from './logger.js'; /** 由 WS Client 建立的 RPC 连接 */ export class RpcClientSocket extends RpcSocket { /** 建立连接使用的 WebSocket 实现 */ static WebSocket = WebSocket; constructor(url, metadata, local) { super(v4(), local); this._localMetadata = metadata; this.url = typeof url == 'string' ? url : url.href; this.seq = 2; logger('[%s] client socket created. url=', this.id, this.url); this.connect(); } url; /** @inheritdoc */ async authSocket() { logger('[%s] authenticating...', this.id); const { socket } = this; const seq = this.nextSeq(); send(socket, 'auth', { seq, id: this.id, version: VERSION, metadata: this.localMetadata ?? {}, }); const metadata = (await waitAuth(socket, seq, this.id))[2]; logger('[%s] authenticated. remoteMeta=%o', this.id, metadata); return metadata; } /** @inheritdoc */ onClose(ev) { super.onClose(ev); const code = ev.code; if (code === WebSocketStatusCode.NORMAL_CLOSURE || code === WebSocketAppCode.AUTH_ERROR) return; logger('[%s] connect closed. reconnecting...', this.id); setTimeout(() => { this.connect(); }, 1000); } /** 建立连接 */ connect() { this.socket = new (this.constructor.WebSocket ?? WebSocket)(this.url); this.socket.binaryType = 'arraybuffer'; logger('[%s] connecting...', this.id); this.ready.catch(() => { logger('[%s] connect failed. retrying...', this.id); setTimeout(() => { this.connect(); }, 2000); }); } } //# sourceMappingURL=client.js.map