@bsv/authsocket-client
Version:
Mutually Authenticated Web Sockets Client
59 lines (58 loc) • 1.68 kB
JavaScript
//#region src/SocketClientTransport.ts
const DEFAULT_MAX_PENDING_MESSAGES = 32;
var SocketClientTransport = class {
socket;
onDataCallback;
maxPendingMessages;
onError;
pendingMessages = 0;
failed = false;
constructor(socket, options = {}) {
this.socket = socket;
const maxPendingMessages = options.maxPendingMessages ?? DEFAULT_MAX_PENDING_MESSAGES;
if (!Number.isSafeInteger(maxPendingMessages) || maxPendingMessages < 1) throw new RangeError("maxPendingMessages must be a positive safe integer");
this.maxPendingMessages = maxPendingMessages;
this.onError = options.onError;
this.socket.on("authMessage", (msg) => {
return this.processMessage(msg);
});
}
/**
* Send an AuthMessage to the server.
*/
async send(message) {
this.socket.emit("authMessage", message);
}
/**
* Register a callback to handle incoming AuthMessages.
*/
async onData(callback) {
this.onDataCallback = callback;
}
async processMessage(message) {
if (this.failed || this.onDataCallback === void 0) return;
if (this.pendingMessages >= this.maxPendingMessages) {
this.fail(/* @__PURE__ */ new Error("Authentication message concurrency limit exceeded"));
return;
}
this.pendingMessages += 1;
try {
await this.onDataCallback(message);
} catch (error) {
this.fail(error);
} finally {
this.pendingMessages -= 1;
}
}
fail(error) {
if (this.failed) return;
this.failed = true;
Promise.resolve().then(async () => await this.onError?.(error)).catch(() => {});
try {
this.socket.disconnect();
} catch {}
}
};
//#endregion
exports.SocketClientTransport = SocketClientTransport;
//# sourceMappingURL=SocketClientTransport.cjs.map