@cloudpss/ubrpc
Version:
67 lines • 2.56 kB
JavaScript
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