2021-12-07 13:18:08 -05:00

61 lines
2.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PortForward = void 0;
const querystring = require("querystring");
const util_1 = require("util");
const web_socket_handler_1 = require("./web-socket-handler");
class PortForward {
// handler is a parameter really only for injecting for testing.
constructor(config, disconnectOnErr, handler) {
this.handler = handler || new web_socket_handler_1.WebSocketHandler(config);
this.disconnectOnErr = util_1.isUndefined(disconnectOnErr) ? true : disconnectOnErr;
}
// TODO: support multiple ports for real...
async portForward(namespace, podName, targetPorts, output, err, input, retryCount = 0) {
if (targetPorts.length === 0) {
throw new Error('You must provide at least one port to forward to.');
}
if (targetPorts.length > 1) {
throw new Error('Only one port is currently supported for port-forward');
}
const query = {
ports: targetPorts[0],
};
const queryStr = querystring.stringify(query);
const needsToReadPortNumber = [];
targetPorts.forEach((value, index) => {
needsToReadPortNumber[index * 2] = true;
needsToReadPortNumber[index * 2 + 1] = true;
});
const path = `/api/v1/namespaces/${namespace}/pods/${podName}/portforward?${queryStr}`;
const createWebSocket = () => {
return this.handler.connect(path, null, (streamNum, buff) => {
if (streamNum >= targetPorts.length * 2) {
return !this.disconnectOnErr;
}
// First two bytes of each stream are the port number
if (needsToReadPortNumber[streamNum]) {
buff = buff.slice(2);
needsToReadPortNumber[streamNum] = false;
}
if (streamNum % 2 === 1) {
if (err) {
err.write(buff);
}
}
else {
output.write(buff);
}
return true;
});
};
if (retryCount < 1) {
const ws = await createWebSocket();
web_socket_handler_1.WebSocketHandler.handleStandardInput(ws, input, 0);
return ws;
}
return web_socket_handler_1.WebSocketHandler.restartableHandleStandardInput(createWebSocket, input, 0, retryCount);
}
}
exports.PortForward = PortForward;
//# sourceMappingURL=portforward.js.map