UNPKG

@cloudpss/ubrpc

Version:

67 lines 2.56 kB
import { decodePayload, deserializeError } from './utils/serialize.js'; import { VERSION } from './version.js'; import { WebSocketAppCode } from './codes.js'; const AUTH_TIMEOUT = 5000; /** 检查认证消息 */ function checkAuthMessage(data, seq, id) { const isResponse = seq != null && id != null; const payload = decodePayload(data); if (payload?.type !== 'auth') { if (isResponse) throw new Error(`Failed to authenticate, bad response from server`); else throw new Error(`Failed to authenticate, bad request from client`); } if (payload.version !== VERSION) { throw new Error(`Failed to authenticate, version not match, expected ${VERSION}, got ${payload.version}`); } if (isResponse) { if (payload.seq !== seq) { throw new Error(`Failed to authenticate, bad response seq from server`); } if (payload.id !== id) { throw new Error(`Failed to authenticate, bad response id from server`); } } if (payload.error) { throw deserializeError(payload.error); } const metadata = typeof payload.metadata != 'object' || payload.metadata == null ? {} : payload.metadata; return [payload.seq, payload.id, metadata]; } /** 接受认证消息 */ export async function waitAuth(socket, seq, id) { return new Promise((resolve, reject) => { const onTimeout = () => { reject(new Error(`Failed to authenticate, no remote message in ${AUTH_TIMEOUT}ms`)); finalize(false); }; const onClose = (ev) => { reject(new Error(`Failed to authenticate, socket closed, code=${ev.code}: ${ev.reason}`)); finalize(false); }; const onMessage = (ev) => { try { const result = checkAuthMessage(ev.data, seq, id); resolve(result); finalize(true); } catch (ex) { reject(ex); finalize(false); } }; const timeout = setTimeout(onTimeout, AUTH_TIMEOUT); socket.addEventListener('close', onClose); socket.addEventListener('message', onMessage); const finalize = (ok) => { clearTimeout(timeout); socket.removeEventListener('message', onMessage); socket.removeEventListener('close', onClose); if (ok) return; socket.close(WebSocketAppCode.AUTH_ERROR); }; }); } //# sourceMappingURL=auth.js.map