UNPKG

@configurator/ravendb

Version:
88 lines 3.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConnectSecuredTcpSocketResult = exports.TcpUtils = void 0; const net = require("net"); const url_1 = require("url"); const tls = require("tls"); const Certificate_1 = require("../Auth/Certificate"); const Exceptions_1 = require("../Exceptions"); class TcpUtils { static async connect(urlString, serverCertificate, clientCertificate) { const url = new url_1.URL(urlString); const host = url.hostname; const port = parseInt(url.port, 10); if (serverCertificate && clientCertificate) { return new Promise((resolve, reject) => { const agentOptions = Certificate_1.Certificate.createFromOptions(clientCertificate).toAgentOptions(); agentOptions.checkServerIdentity = (host, peerCertificate) => { const remoteCert = peerCertificate.raw; const expectedCert = Buffer.from(serverCertificate, "base64"); let sameCert = true; if (remoteCert.length !== expectedCert.length) { sameCert = false; } for (let i = 0; i < remoteCert.length; i++) { if (remoteCert[i] !== expectedCert[i]) { sameCert = false; break; } } if (!sameCert) { return (0, Exceptions_1.getError)("AuthenticationException", "Invalid server certificate."); } }; const socket = tls.connect(port, host, agentOptions, () => { socket.removeListener("error", reject); resolve(socket); }); socket.once("error", reject); socket.setNoDelay(true); }); } else { return new Promise((resolve, reject) => { const socket = new net.Socket(); socket.setNoDelay(true); socket.connect(port, host, () => { socket.removeListener("error", reject); resolve(socket); }); socket.once("error", reject); }); } } static async connectSecuredTcpSocket(info, serverCertificate, clientCertificate, operationType, negotiationCallback) { if (info.urls) { for (const url of info.urls) { try { const socket = await this.connect(url, serverCertificate, clientCertificate); const supportedFeatures = await this._invokeNegotiation(info, operationType, negotiationCallback, url, socket); return new ConnectSecuredTcpSocketResult(url, socket, supportedFeatures); } catch { } } } const socket = await this.connect(info.url, serverCertificate, clientCertificate); const supportedFeatures = await this._invokeNegotiation(info, operationType, negotiationCallback, info.url, socket); return new ConnectSecuredTcpSocketResult(info.url, socket, supportedFeatures); } static _invokeNegotiation(info, operationType, negotiationCallback, url, socket) { switch (operationType) { case "Subscription": return negotiationCallback(url, info, socket); default: (0, Exceptions_1.throwError)("NotSupportedException", "Operation type '" + operationType + "' not supported"); } } } exports.TcpUtils = TcpUtils; class ConnectSecuredTcpSocketResult { constructor(url, socket, supportedFeatures) { this.url = url; this.socket = socket; this.supportedFeatures = supportedFeatures; } } exports.ConnectSecuredTcpSocketResult = ConnectSecuredTcpSocketResult; //# sourceMappingURL=TcpUtils.js.map