@tableau/taco-toolkit
Version:
Tableau Connector Toolkit
79 lines • 6.49 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BrowserWatcher = void 0;
var ws_1 = require("ws");
var error_codes_1 = require("../../../shared/errors/error-codes");
var error_source_1 = require("../../../shared/errors/error-source");
var status_code_1 = require("../../../shared/errors/status-code");
var eps_logger_1 = require("../../logging/eps-logger");
var app_global_1 = __importDefault(require("../core/app-global"));
/**
* Websocket server for handling browser activity
*
* Watches the browser tab to notify if tab is closed or user leaves page app.
* 1) Launch server to listen for incoming websocket connections
* 2) For each connection,
* 3) ... listen for introduction message that has connectionId, capture it
* 4) ... attach close handler passing connectionId.
*/
var BrowserWatcher = /** @class */ (function () {
function BrowserWatcher() {
}
BrowserWatcher.prototype.start = function (port) {
return new Promise(function (resolve, reject) {
var server = new ws_1.WebSocketServer({ port: port }, function () {
eps_logger_1.Logger.info("BrowserWatcher is listening on port ".concat(port, "..."));
resolve();
});
server.on('error', function (error) {
error.message = "Failed to start BrowserWatcher on port ".concat(port, ". ").concat(error.message);
reject(error);
});
server.on('connection', function (socket) {
var connectionId;
socket.on('message', function (rawMsg) {
var msg = rawMsg.toString();
var connectionMessage;
try {
connectionMessage = JSON.parse(msg);
}
catch (err) {
eps_logger_1.Logger.logEPSError(status_code_1.StatusCode.InvalidArgument, error_source_1.ErrorSources.System, error_codes_1.ErrorCodes.RXCCMIVQ, "BrowserWatcher could not parse message '".concat(msg, "'."));
return;
}
if (!isConnectionMessage(connectionMessage)) {
eps_logger_1.Logger.logEPSError(status_code_1.StatusCode.InvalidArgument, error_source_1.ErrorSources.System, error_codes_1.ErrorCodes.UYJY51CE, "BrowserWatcher could not find connectionId: string in '".concat(msg, "'."));
return;
}
connectionId = connectionMessage.connectionId;
});
socket.on('close', function (reasonCode) {
console.log("Browser client's socket has disconnected connection ".concat(connectionId), reasonCode);
if (connectionId === undefined) {
return;
}
// Force close Chromium when the window closes. Need this on Mac.
if (app_global_1.default.connectionManager.isSubmitted(connectionId)) {
app_global_1.default.connectionManager.freeBrowser(connectionId);
}
else {
app_global_1.default.connectionManager.free(connectionId);
}
});
});
});
};
return BrowserWatcher;
}());
exports.BrowserWatcher = BrowserWatcher;
function isConnectionMessage(value) {
if (value === null || typeof value !== 'object') {
return false;
}
var obj = value;
return typeof obj.connectionId === 'string';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci13YXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2Vwcy9tYWluL3NlcnZpY2VzL2Jyb3dzZXItd2F0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSx5QkFBb0M7QUFFcEMsa0VBQStEO0FBQy9ELG9FQUFrRTtBQUNsRSxrRUFBK0Q7QUFDL0QsdURBQWlEO0FBQ2pELGtFQUEwQztBQUUxQzs7Ozs7Ozs7R0FRRztBQUNIO0lBQUE7SUE2REEsQ0FBQztJQTVEQyw4QkFBSyxHQUFMLFVBQU0sSUFBWTtRQUNoQixPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakMsSUFBTSxNQUFNLEdBQUcsSUFBSSxvQkFBZSxDQUFDLEVBQUUsSUFBSSxNQUFBLEVBQUUsRUFBRTtnQkFDM0MsbUJBQU0sQ0FBQyxJQUFJLENBQUMsOENBQXVDLElBQUksUUFBSyxDQUFDLENBQUE7Z0JBQzdELE9BQU8sRUFBRSxDQUFBO1lBQ1gsQ0FBQyxDQUFDLENBQUE7WUFFRixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFDLEtBQVk7Z0JBQzlCLEtBQUssQ0FBQyxPQUFPLEdBQUcsaURBQTBDLElBQUksZUFBSyxLQUFLLENBQUMsT0FBTyxDQUFFLENBQUE7Z0JBQ2xGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNmLENBQUMsQ0FBQyxDQUFBO1lBRUYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsVUFBQyxNQUFjO2dCQUNyQyxJQUFJLFlBQWdDLENBQUE7Z0JBRXBDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQUMsTUFBYztvQkFDbEMsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFBO29CQUU3QixJQUFJLGlCQUFpQixDQUFBO29CQUNyQixJQUFJO3dCQUNGLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7cUJBQ3BDO29CQUFDLE9BQU8sR0FBRyxFQUFFO3dCQUNaLG1CQUFNLENBQUMsV0FBVyxDQUNoQix3QkFBVSxDQUFDLGVBQWUsRUFDMUIsMkJBQVksQ0FBQyxNQUFNLEVBQ25CLHdCQUFVLENBQUMsUUFBUSxFQUNuQixrREFBMkMsR0FBRyxPQUFJLENBQ25ELENBQUE7d0JBQ0QsT0FBTTtxQkFDUDtvQkFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsRUFBRTt3QkFDM0MsbUJBQU0sQ0FBQyxXQUFXLENBQ2hCLHdCQUFVLENBQUMsZUFBZSxFQUMxQiwyQkFBWSxDQUFDLE1BQU0sRUFDbkIsd0JBQVUsQ0FBQyxRQUFRLEVBQ25CLGlFQUEwRCxHQUFHLE9BQUksQ0FDbEUsQ0FBQTt3QkFDRCxPQUFNO3FCQUNQO29CQUVELFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxZQUFZLENBQUE7Z0JBQy9DLENBQUMsQ0FBQyxDQUFBO2dCQUVGLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQUMsVUFBa0I7b0JBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOERBQXVELFlBQVksQ0FBRSxFQUFFLFVBQVUsQ0FBQyxDQUFBO29CQUM5RixJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7d0JBQzlCLE9BQU07cUJBQ1A7b0JBRUQsaUVBQWlFO29CQUNqRSxJQUFJLG9CQUFTLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxFQUFFO3dCQUN6RCxvQkFBUyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtxQkFDdEQ7eUJBQU07d0JBQ0wsb0JBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7cUJBQy9DO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQUE3REQsSUE2REM7QUE3RFksd0NBQWM7QUFtRTNCLFNBQVMsbUJBQW1CLENBQUMsS0FBYztJQUN6QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQy9DLE9BQU8sS0FBSyxDQUFBO0tBQ2I7SUFFRCxJQUFNLEdBQUcsR0FBRyxLQUFtQyxDQUFBO0lBQy9DLE9BQU8sT0FBTyxHQUFHLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FBQTtBQUM3QyxDQUFDIn0=