@reclaimprotocol/attestor-core
Version:
<div> <div> <img src="https://raw.githubusercontent.com/reclaimprotocol/.github/main/assets/banners/Attestor-Core.png" /> </div> </div>
115 lines • 10.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.AttestorServerSocket = void 0;
const message_handler_1 = require("../client/utils/message-handler");
const handlers_1 = require("../server/handlers");
const apm_1 = require("../server/utils/apm");
const generics_1 = require("../server/utils/generics");
const utils_1 = require("../utils");
const socket_base_1 = require("../utils/socket-base");
const util_1 = require("util");
class AttestorServerSocket extends socket_base_1.AttestorSocket {
constructor(socket, sessionId, bgpListener, logger) {
// @ts-ignore
super(socket, {}, logger);
this.sessionId = sessionId;
this.bgpListener = bgpListener;
this.tunnels = {};
// handle RPC requests
this.addEventListener('rpc-request', handleRpcRequest.bind(this));
// forward packets to the appropriate tunnel
this.addEventListener('tunnel-message', handleTunnelMessage.bind(this));
// close all tunnels when the connection is terminated
// since this tunnel can no longer be written to
this.addEventListener('connection-terminated', () => {
for (const tunnelId in this.tunnels) {
const tunnel = this.tunnels[tunnelId];
void tunnel.close(new Error('WS session terminated'));
}
});
}
getTunnel(tunnelId) {
const tunnel = this.tunnels[tunnelId];
if (!tunnel) {
throw new utils_1.AttestorError('ERROR_NOT_FOUND', `Tunnel "${tunnelId}" not found`);
}
return tunnel;
}
removeTunnel(tunnelId) {
delete this.tunnels[tunnelId];
}
static async acceptConnection(socket, { req, logger, bgpListener }) {
// promisify ws.send -- so the sendMessage method correctly
// awaits the send operation
const bindSend = socket.send.bind(socket);
socket.send = (0, util_1.promisify)(bindSend);
const sessionId = (0, utils_1.generateSessionId)();
logger = logger.child({ sessionId });
const client = new AttestorServerSocket(socket, sessionId, bgpListener, logger);
try {
const initMsgs = (0, generics_1.getInitialMessagesFromQuery)(req);
logger.trace({ initMsgs: initMsgs.length }, 'new connection, validating...');
for (const msg of initMsgs) {
await message_handler_1.handleMessage.call(client, msg);
}
logger.debug('connection accepted');
}
catch (err) {
logger.error({ err }, 'error in new connection');
if (client.isOpen) {
await client.terminateConnection(err instanceof utils_1.AttestorError
? err
: utils_1.AttestorError.badRequest(err.message));
}
return;
}
return client;
}
}
exports.AttestorServerSocket = AttestorServerSocket;
async function handleTunnelMessage({ data: { tunnelId, message } }) {
var _a;
try {
const tunnel = this.getTunnel(tunnelId);
await tunnel.write(message);
}
catch (err) {
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.error({
err,
tunnelId,
}, 'error writing to tunnel');
}
}
async function handleRpcRequest({ data: { data, requestId, respond, type } }) {
var _a, _b;
const logger = this.logger.child({
rpc: type,
requestId
});
const apm = (0, apm_1.getApm)();
const tx = apm === null || apm === void 0 ? void 0 : apm.startTransaction(type);
tx === null || tx === void 0 ? void 0 : tx.setLabel('requestId', requestId);
tx === null || tx === void 0 ? void 0 : tx.setLabel('sessionId', this.sessionId.toString());
const userId = (_b = (_a = this.metadata.auth) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.id;
if (userId) {
tx === null || tx === void 0 ? void 0 : tx.setLabel('authUserId', userId);
}
try {
logger.debug({ data }, 'handling RPC request');
const handler = handlers_1.HANDLERS[type];
const res = await handler(data, { client: this, logger, tx });
respond(res);
logger.debug({ res }, 'handled RPC request');
tx === null || tx === void 0 ? void 0 : tx.setOutcome('success');
}
catch (err) {
logger.error({ err }, 'error in RPC request');
respond(utils_1.AttestorError.fromError(err));
tx === null || tx === void 0 ? void 0 : tx.setOutcome('failure');
apm === null || apm === void 0 ? void 0 : apm.captureError(err, { parent: tx });
}
finally {
tx === null || tx === void 0 ? void 0 : tx.end();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0VBQWdFO0FBRWhFLGtEQUE4QztBQUM5Qyw4Q0FBNkM7QUFDN0Msd0RBQXVFO0FBRXZFLHFDQUE0RDtBQUM1RCx1REFBc0Q7QUFDdEQsK0JBQWdDO0FBR2hDLE1BQWEsb0JBQXFCLFNBQVEsNEJBQWM7SUFJdkQsWUFDQyxNQUFVLEVBQ0gsU0FBaUIsRUFDakIsV0FBb0MsRUFDM0MsTUFBYztRQUVkLGFBQWE7UUFDYixLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUxsQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUw1QyxZQUFPLEdBQXFDLEVBQUUsQ0FBQTtRQVU3QyxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNqRSw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3ZFLHNEQUFzRDtRQUN0RCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtZQUNuRCxLQUFJLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDckMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQTtZQUN0RCxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUE7SUFD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
;