@configurator/ravendb
Version:
RavenDB client for Node.js
88 lines • 3.99 kB
JavaScript
;
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