@reclaimprotocol/attestor-core
Version:
<div> <div> <img src="https://raw.githubusercontent.com/reclaimprotocol/.github/main/assets/banners/Attestor-Core.png" /> </div> </div>
114 lines • 10.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AttestorServerSocket = void 0;
const message_handler_1 = require("../client/utils/message-handler");
const config_1 = require("../config");
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);
}
const timeout = setTimeout(() => {
logger.warn({ type, requestId }, 'RPC took too long to respond');
}, config_1.DEFAULT_RPC_TIMEOUT_MS);
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 {
clearTimeout(timeout);
tx === null || tx === void 0 ? void 0 : tx.end();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9zb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0VBQWdFO0FBQ2hFLHVDQUFtRDtBQUVuRCxrREFBOEM7QUFDOUMsOENBQTZDO0FBQzdDLHdEQUF1RTtBQUV2RSxxQ0FBNEQ7QUFDNUQsdURBQXNEO0FBQ3RELCtCQUFnQztBQUdoQyxNQUFhLG9CQUFxQixTQUFRLDRCQUFjO0lBSXZELFlBQ0MsTUFBVSxFQUNILFNBQWlCLEVBQ2pCLFdBQW9DLEVBQzNDLE1BQWM7UUFFZCxhQUFhO1FBQ2IsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFMbEIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUFMNUMsWUFBTyxHQUFxQyxFQUFFLENBQUE7UUFVN0Msc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDakUsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN2RSxzREFBc0Q7UUFDdEQsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7WUFDbkQsS0FBSSxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3JDLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUE7WUFDdEQsQ0FBQztRQUNGLENBQUMsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FBQyxRQUFnQjtRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3JDLElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxxQkFBYSxDQUN0QixpQkFBaUIsRUFDakIsV0FBVyxRQUFRLGFBQWEsQ0FDaEMsQ0FBQTtRQUNGLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQTtJQUNkLENBQUM7SUFFRCxZQUFZLENBQUMsUUFBbUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUM1QixNQUFVLEVBQ1YsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBMkI7UUFFckQsMkRBQTJEO1FBQzNELDRCQUE0QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUEsZ0JBQVMsRUFBQyxRQUFRLENBQUMsQ0FBQTtRQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFBLHlCQUFpQixHQUFFLENBQUE7UUFDckMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRXBDLE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQ3RDLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FDdEMsQ0FBQTtRQUNELElBQUksQ0FBQztZQUNKLE1BQU0sUUFBUSxHQUFHLElBQUEsc0NBQTJCLEVBQUMsR0FBRyxDQUFDLENBQUE7WUFDakQsTUFBTSxDQUFDLEtBQUssQ0FDWCxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQzdCLCtCQUErQixDQUMvQixDQUFBO1lBQ0QsS0FBSSxNQUFNLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSwrQkFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBQUMsT0FBTSxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSx5QkFBeUIsQ0FBQyxDQUFBO1lBQ2hELElBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixNQUFNLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDL0IsR0FBRyxZQUFZLHFCQUFhO29CQUMzQixDQUFDLENBQUMsR0FBRztvQkFDTCxDQUFDLENBQUMscUJBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUN4QyxDQUFBO1lBQ0YsQ0FBQztZQUVELE9BQU07UUFDUCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUE7SUFDZCxDQUFDO0NBQ0Q7QUFuRkQsb0RBbUZDO0FBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUVqQyxFQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBOEI7O0lBRTNELElBQUksQ0FBQztRQUNKLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdkMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFBQyxPQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUseUJBQXlCLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0FBQ0YsQ0FBQztBQUVELEtBQUssVUFBVSxnQkFBZ0IsQ0FFOUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBMkI7O0lBRXJFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBRTFELE1BQU0sR0FBRyxHQUFHLElBQUEsWUFBTSxHQUFFLENBQUE7SUFDcEIsTUFBTSxFQUFFLEdBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3RDLEVBQUUsYUFBRixFQUFFLHVCQUFGLEVBQUUsQ0FBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3BDLEVBQUUsYUFBRixFQUFFLHVCQUFGLEVBQUUsQ0FBRSxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUVwRCxNQUFNLE1BQU0sR0FBRyxNQUFBLE1BQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLDBDQUFFLElBQUksMENBQUUsRUFBRSxDQUFBO0lBQzNDLElBQUcsTUFBTSxFQUFFLENBQUM7UUFDWCxFQUFFLGFBQUYsRUFBRSx1QkFBRixFQUFFLENBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLDhCQUE4QixDQUFDLENBQUE7SUFDakUsQ0FBQyxFQUFFLCtCQUFzQixDQUFDLENBQUE7SUFFMUIsSUFBSSxDQUFDO1FBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUE7UUFFOUMsTUFBTSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxJQUFJLENBQTRCLENBQUE7UUFDekQsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFWixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtRQUM1QyxFQUFFLGFBQUYsRUFBRSx1QkFBRixFQUFFLENBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzFCLENBQUM7SUFBQyxPQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUE7UUFDN0MsT0FBTyxDQUFDLHFCQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDckMsRUFBRSxhQUFGLEVBQUUsdUJBQUYsRUFBRSxDQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUV6QixHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7WUFBUyxDQUFDO1FBQ1YsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3JCLEVBQUUsYUFBRixFQUFFLHVCQUFGLEVBQUUsQ0FBRSxHQUFHLEVBQUUsQ0FBQTtJQUNWLENBQUM7QUFDRixDQUFDIn0=