UNPKG

vibetunnel

Version:

Terminal sharing server with web interface - supports macOS, Linux, and headless environments

169 lines 22.6 kB
"use strict"; /** * Unix socket protocol for VibeTunnel IPC * * Message format (binary): * [1 byte: message type] * [4 bytes: payload length (big-endian)] * [N bytes: payload] */ Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageBuilder = exports.MessageParser = exports.MessageType = void 0; exports.frameMessage = frameMessage; exports.parsePayload = parsePayload; const buffer_1 = require("buffer"); /** * Message types for the socket protocol */ var MessageType; (function (MessageType) { MessageType[MessageType["STDIN_DATA"] = 1] = "STDIN_DATA"; MessageType[MessageType["CONTROL_CMD"] = 2] = "CONTROL_CMD"; MessageType[MessageType["STATUS_UPDATE"] = 3] = "STATUS_UPDATE"; MessageType[MessageType["HEARTBEAT"] = 4] = "HEARTBEAT"; MessageType[MessageType["ERROR"] = 5] = "ERROR"; // Reserved for future use MessageType[MessageType["STDOUT_SUBSCRIBE"] = 16] = "STDOUT_SUBSCRIBE"; MessageType[MessageType["METRICS"] = 17] = "METRICS"; // Status operations MessageType[MessageType["STATUS_REQUEST"] = 32] = "STATUS_REQUEST"; MessageType[MessageType["STATUS_RESPONSE"] = 33] = "STATUS_RESPONSE"; // Git operations MessageType[MessageType["GIT_FOLLOW_REQUEST"] = 48] = "GIT_FOLLOW_REQUEST"; MessageType[MessageType["GIT_FOLLOW_RESPONSE"] = 49] = "GIT_FOLLOW_RESPONSE"; MessageType[MessageType["GIT_EVENT_NOTIFY"] = 50] = "GIT_EVENT_NOTIFY"; MessageType[MessageType["GIT_EVENT_ACK"] = 51] = "GIT_EVENT_ACK"; })(MessageType || (exports.MessageType = MessageType = {})); /** * Frame a message for transmission */ function frameMessage(type, payload) { const payloadBuffer = buffer_1.Buffer.isBuffer(payload) ? payload : buffer_1.Buffer.from(typeof payload === 'string' ? payload : JSON.stringify(payload), 'utf8'); const message = buffer_1.Buffer.allocUnsafe(5 + payloadBuffer.length); message[0] = type; message.writeUInt32BE(payloadBuffer.length, 1); payloadBuffer.copy(message, 5); return message; } /** * Parse messages from a buffer */ class MessageParser { constructor() { this.buffer = buffer_1.Buffer.alloc(0); } /** * Add data to the parser */ addData(chunk) { this.buffer = buffer_1.Buffer.concat([this.buffer, chunk]); } /** * Parse complete messages from the buffer */ *parseMessages() { while (this.buffer.length >= 5) { const messageType = this.buffer[0]; const payloadLength = this.buffer.readUInt32BE(1); // Check if we have the complete message if (this.buffer.length < 5 + payloadLength) { break; } // Extract the message const payload = this.buffer.subarray(5, 5 + payloadLength); this.buffer = this.buffer.subarray(5 + payloadLength); yield { type: messageType, payload }; } } /** * Get the number of bytes waiting to be parsed */ get pendingBytes() { return this.buffer.length; } /** * Clear the buffer */ clear() { this.buffer = buffer_1.Buffer.alloc(0); } } exports.MessageParser = MessageParser; /** * High-level message creation helpers */ exports.MessageBuilder = { stdin(data) { return frameMessage(MessageType.STDIN_DATA, data); }, resize(cols, rows) { return frameMessage(MessageType.CONTROL_CMD, { cmd: 'resize', cols, rows }); }, kill(signal) { return frameMessage(MessageType.CONTROL_CMD, { cmd: 'kill', signal }); }, resetSize() { return frameMessage(MessageType.CONTROL_CMD, { cmd: 'reset-size' }); }, updateTitle(title) { return frameMessage(MessageType.CONTROL_CMD, { cmd: 'update-title', title }); }, status(app, status, extra) { return frameMessage(MessageType.STATUS_UPDATE, { app, status, ...extra }); }, heartbeat() { return frameMessage(MessageType.HEARTBEAT, buffer_1.Buffer.alloc(0)); }, error(code, message, details) { return frameMessage(MessageType.ERROR, { code, message, details }); }, gitFollowRequest(request) { return frameMessage(MessageType.GIT_FOLLOW_REQUEST, request); }, gitFollowResponse(response) { return frameMessage(MessageType.GIT_FOLLOW_RESPONSE, response); }, gitEventNotify(event) { return frameMessage(MessageType.GIT_EVENT_NOTIFY, event); }, gitEventAck(ack) { return frameMessage(MessageType.GIT_EVENT_ACK, ack); }, statusRequest() { return frameMessage(MessageType.STATUS_REQUEST, {}); }, statusResponse(response) { return frameMessage(MessageType.STATUS_RESPONSE, response); }, }; /** * Parse payload based on message type */ function parsePayload(type, payload) { switch (type) { case MessageType.STDIN_DATA: return payload.toString('utf8'); case MessageType.CONTROL_CMD: case MessageType.STATUS_UPDATE: case MessageType.ERROR: case MessageType.STATUS_REQUEST: case MessageType.STATUS_RESPONSE: case MessageType.GIT_FOLLOW_REQUEST: case MessageType.GIT_FOLLOW_RESPONSE: case MessageType.GIT_EVENT_NOTIFY: case MessageType.GIT_EVENT_ACK: try { return JSON.parse(payload.toString('utf8')); } catch (e) { throw new Error(`Failed to parse JSON payload for message type ${type}: ${e instanceof Error ? e.message : String(e)}`); } case MessageType.HEARTBEAT: return null; default: return payload; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LXByb3RvY29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci9wdHkvc29ja2V0LXByb3RvY29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOzs7QUE4Skgsb0NBV0M7QUFtSEQsb0NBNEJDO0FBdFRELG1DQUFnQztBQUVoQzs7R0FFRztBQUNILElBQVksV0FpQlg7QUFqQkQsV0FBWSxXQUFXO0lBQ3JCLHlEQUFpQixDQUFBO0lBQ2pCLDJEQUFrQixDQUFBO0lBQ2xCLCtEQUFvQixDQUFBO0lBQ3BCLHVEQUFnQixDQUFBO0lBQ2hCLCtDQUFZLENBQUE7SUFDWiwwQkFBMEI7SUFDMUIsc0VBQXVCLENBQUE7SUFDdkIsb0RBQWMsQ0FBQTtJQUNkLG9CQUFvQjtJQUNwQixrRUFBcUIsQ0FBQTtJQUNyQixvRUFBc0IsQ0FBQTtJQUN0QixpQkFBaUI7SUFDakIsMEVBQXlCLENBQUE7SUFDekIsNEVBQTBCLENBQUE7SUFDMUIsc0VBQXVCLENBQUE7SUFDdkIsZ0VBQW9CLENBQUE7QUFDdEIsQ0FBQyxFQWpCVyxXQUFXLDJCQUFYLFdBQVcsUUFpQnRCO0FBbUlEOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLElBQWlCLEVBQUUsT0FBaUM7SUFDL0UsTUFBTSxhQUFhLEdBQUcsZUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDNUMsQ0FBQyxDQUFDLE9BQU87UUFDVCxDQUFDLENBQUMsZUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV6RixNQUFNLE9BQU8sR0FBRyxlQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFD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UUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssV0FBVyxDQUFDLFVBQVU7WUFDekIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLEtBQUssV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUM3QixLQUFLLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDL0IsS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLEtBQUssV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUNoQyxLQUFLLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFDakMsS0FBSyxXQUFXLENBQUMsa0JBQWtCLENBQUM7UUFDcEMsS0FBSyxXQUFXLENBQUMsbUJBQW1CLENBQUM7UUFDckMsS0FBSyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7UUFDbEMsS0FBSyxXQUFXLENBQUMsYUFBYTtZQUM1QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3ZHLENBQUM7WUFDSixDQUFDO1FBRUgsS0FBSyxXQUFXLENBQUMsU0FBUztZQUN4QixPQUFPLElBQUksQ0FBQztRQUVkO1lBQ0UsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVuaXggc29ja2V0IHByb3RvY29sIGZvciBWaWJlVHVubmVsIElQQ1xuICpcbiAqIE1lc3NhZ2UgZm9ybWF0IChiaW5hcnkpOlxuICogWzEgYnl0ZTogbWVzc2FnZSB0eXBlXVxuICogWzQgYnl0ZXM6IHBheWxvYWQgbGVuZ3RoIChiaWctZW5kaWFuKV1cbiAqIFtOIGJ5dGVzOiBwYXlsb2FkXVxuICovXG5cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbi8qKlxuICogTWVzc2FnZSB0eXBlcyBmb3IgdGhlIHNvY2tldCBwcm90b2NvbFxuICovXG5leHBvcnQgZW51bSBNZXNzYWdlVHlwZSB7XG4gIFNURElOX0RBVEEgPSAweDAxLCAvLyBSYXcgc3RkaW4gZGF0YSAoa2V5Ym9hcmQgaW5wdXQpXG4gIENPTlRST0xfQ01EID0gMHgwMiwgLy8gQ29udHJvbCBjb21tYW5kcyAocmVzaXplLCBraWxsLCBldGMpXG4gIFNUQVRVU19VUERBVEUgPSAweDAzLCAvLyBTdGF0dXMgdXBkYXRlcyAoQ2xhdWRlIHN0YXR1cywgZXRjKVxuICBIRUFSVEJFQVQgPSAweDA0LCAvLyBLZWVwLWFsaXZlIHBpbmcvcG9uZ1xuICBFUlJPUiA9IDB4MDUsIC8vIEVycm9yIG1lc3NhZ2VzXG4gIC8vIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlXG4gIFNURE9VVF9TVUJTQ1JJQkUgPSAweDEwLFxuICBNRVRSSUNTID0gMHgxMSxcbiAgLy8gU3RhdHVzIG9wZXJhdGlvbnNcbiAgU1RBVFVTX1JFUVVFU1QgPSAweDIwLCAvLyBSZXF1ZXN0IHNlcnZlciBzdGF0dXNcbiAgU1RBVFVTX1JFU1BPTlNFID0gMHgyMSwgLy8gU2VydmVyIHN0YXR1cyByZXNwb25zZVxuICAvLyBHaXQgb3BlcmF0aW9uc1xuICBHSVRfRk9MTE9XX1JFUVVFU1QgPSAweDMwLCAvLyBFbmFibGUvZGlzYWJsZSBHaXQgZm9sbG93IG1vZGVcbiAgR0lUX0ZPTExPV19SRVNQT05TRSA9IDB4MzEsIC8vIFJlc3BvbnNlIHRvIGZvbGxvdyByZXF1ZXN0XG4gIEdJVF9FVkVOVF9OT1RJRlkgPSAweDMyLCAvLyBHaXQgZXZlbnQgbm90aWZpY2F0aW9uXG4gIEdJVF9FVkVOVF9BQ0sgPSAweDMzLCAvLyBHaXQgZXZlbnQgYWNrbm93bGVkZ21lbnRcbn1cblxuLyoqXG4gKiBDb250cm9sIGNvbW1hbmQgdHlwZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sQ29tbWFuZCB7XG4gIGNtZDogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUNvbW1hbmQgZXh0ZW5kcyBDb250cm9sQ29tbWFuZCB7XG4gIGNtZDogJ3Jlc2l6ZSc7XG4gIGNvbHM6IG51bWJlcjtcbiAgcm93czogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtpbGxDb21tYW5kIGV4dGVuZHMgQ29udHJvbENvbW1hbmQge1xuICBjbWQ6ICdraWxsJztcbiAgc2lnbmFsPzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2V0U2l6ZUNvbW1hbmQgZXh0ZW5kcyBDb250cm9sQ29tbWFuZCB7XG4gIGNtZDogJ3Jlc2V0LXNpemUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVRpdGxlQ29tbWFuZCBleHRlbmRzIENvbnRyb2xDb21tYW5kIHtcbiAgY21kOiAndXBkYXRlLXRpdGxlJztcbiAgdGl0bGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGF0dXMgdXBkYXRlIHBheWxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNVcGRhdGUge1xuICBhcHA6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHRpbWVzdGFtcD86IG51bWJlcjtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBFcnJvciBtZXNzYWdlIHBheWxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcnJvck1lc3NhZ2Uge1xuICBjb2RlOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZGV0YWlscz86IHVua25vd247XG59XG5cbi8qKlxuICogU2VydmVyIHN0YXR1cyByZXF1ZXN0IChlbXB0eSBwYXlsb2FkKVxuICovXG5leHBvcnQgdHlwZSBTdGF0dXNSZXF1ZXN0ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuXG4vKipcbiAqIFNlcnZlciBzdGF0dXMgcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNSZXNwb25zZSB7XG4gIHJ1bm5pbmc6IGJvb2xlYW47XG4gIHBvcnQ/OiBudW1iZXI7XG4gIHVybD86IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYnVpbGREYXRlPzogc3RyaW5nO1xuICBmb2xsb3dNb2RlPzoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgYnJhbmNoPzogc3RyaW5nO1xuICAgIHJlcG9QYXRoPzogc3RyaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIEdpdCBmb2xsb3cgbW9kZSByZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Rm9sbG93UmVxdWVzdCB7XG4gIHJlcG9QYXRoPzogc3RyaW5nOyAvLyBNYWluIHJlcG8gcGF0aCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gIGJyYW5jaD86IHN0cmluZzsgLy8gT3B0aW9uYWwgLSBicmFuY2ggbmFtZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gIGVuYWJsZTogYm9vbGVhbjtcbiAgLy8gTmV3IGZpZWxkcyBmb3Igd29ya3RyZWUtYmFzZWQgZm9sbG93IG1vZGVcbiAgd29ya3RyZWVQYXRoPzogc3RyaW5nOyAvLyBUaGUgd29ya3RyZWUgcGF0aCB0byBmb2xsb3dcbiAgbWFpblJlcG9QYXRoPzogc3RyaW5nOyAvLyBUaGUgbWFpbiByZXBvc2l0b3J5IHBhdGhcbn1cblxuLyoqXG4gKiBHaXQgZm9sbG93IG1vZGUgcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRGb2xsb3dSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGN1cnJlbnRCcmFuY2g/OiBzdHJpbmc7XG4gIHByZXZpb3VzQnJhbmNoPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBHaXQgZXZlbnQgbm90aWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0RXZlbnROb3RpZnkge1xuICByZXBvUGF0aDogc3RyaW5nO1xuICB0eXBlOiAnY2hlY2tvdXQnIHwgJ2NvbW1pdCcgfCAnbWVyZ2UnIHwgJ3JlYmFzZScgfCAnb3RoZXInO1xufVxuXG4vKipcbiAqIEdpdCBldmVudCBhY2tub3dsZWRnbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdEV2ZW50QWNrIHtcbiAgaGFuZGxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUeXBlLXNhZmUgbWFwcGluZyBvZiBtZXNzYWdlIHR5cGVzIHRvIHRoZWlyIHBheWxvYWQgdHlwZXNcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZVBheWxvYWRNYXAgPSB7XG4gIFtNZXNzYWdlVHlwZS5TVERJTl9EQVRBXTogc3RyaW5nO1xuICBbTWVzc2FnZVR5cGUuQ09OVFJPTF9DTURdOiBDb250cm9sQ29tbWFuZDtcbiAgW01lc3NhZ2VUeXBlLlNUQVRVU19VUERBVEVdOiBTdGF0dXNVcGRhdGU7XG4gIFtNZXNzYWdlVHlwZS5IRUFSVEJFQVRdOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj47XG4gIFtNZXNzYWdlVHlwZS5FUlJPUl06IEVycm9yTWVzc2FnZTtcbiAgW01lc3NhZ2VUeXBlLlNUQVRVU19SRVFVRVNUXTogU3RhdHVzUmVxdWVzdDtcbiAgW01lc3NhZ2VUeXBlLlNUQVRVU19SRVNQT05TRV06IFN0YXR1c1Jlc3BvbnNlO1xuICBbTWVzc2FnZVR5cGUuR0lUX0ZPTExPV19SRVFVRVNUXTogR2l0Rm9sbG93UmVxdWVzdDtcbiAgW01lc3NhZ2VUeXBlLkdJVF9GT0xMT1dfUkVTUE9OU0VdOiBHaXRGb2xsb3dSZXNwb25zZTtcbiAgW01lc3NhZ2VUeXBlLkdJVF9FVkVOVF9OT1RJRlldOiBHaXRFdmVudE5vdGlmeTtcbiAgW01lc3NhZ2VUeXBlLkdJVF9FVkVOVF9BQ0tdOiBHaXRFdmVudEFjaztcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXlsb2FkIHR5cGUgZm9yIGEgZ2l2ZW4gbWVzc2FnZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VQYXlsb2FkPFQgZXh0ZW5kcyBNZXNzYWdlVHlwZT4gPSBUIGV4dGVuZHMga2V5b2YgTWVzc2FnZVBheWxvYWRNYXBcbiAgPyBNZXNzYWdlUGF5bG9hZE1hcFtUXVxuICA6IG5ldmVyO1xuXG4vKipcbiAqIEZyYW1lIGEgbWVzc2FnZSBmb3IgdHJhbnNtaXNzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZU1lc3NhZ2UodHlwZTogTWVzc2FnZVR5cGUsIHBheWxvYWQ6IEJ1ZmZlciB8IHN0cmluZyB8IG9iamVjdCk6IEJ1ZmZlciB7XG4gIGNvbnN0IHBheWxvYWRCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXIocGF5bG9hZClcbiAgICA/IHBheWxvYWRcbiAgICA6IEJ1ZmZlci5mcm9tKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJyA/IHBheWxvYWQgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSwgJ3V0ZjgnKTtcblxuICBjb25zdCBtZXNzYWdlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDUgKyBwYXlsb2FkQnVmZmVyLmxlbmd0aCk7XG4gIG1lc3NhZ2VbMF0gPSB0eXBlO1xuICBtZXNzYWdlLndyaXRlVUludDMyQkUocGF5bG9hZEJ1ZmZlci5sZW5ndGgsIDEpO1xuICBwYXlsb2FkQnVmZmVyLmNvcHkobWVzc2FnZSwgNSk7XG5cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKlxuICogUGFyc2UgbWVzc2FnZXMgZnJvbSBhIGJ1ZmZlclxuICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZVBhcnNlciB7XG4gIHByaXZhdGUgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gIC8qKlxuICAgKiBBZGQgZGF0YSB0byB0aGUgcGFyc2VyXG4gICAqL1xuICBhZGREYXRhKGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBjaHVua10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGNvbXBsZXRlIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlclxuICAgKi9cbiAgKnBhcnNlTWVzc2FnZXMoKTogR2VuZXJhdG9yPHsgdHlwZTogTWVzc2FnZVR5cGU7IHBheWxvYWQ6IEJ1ZmZlciB9PiB7XG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyLmxlbmd0aCA+PSA1KSB7XG4gICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IHRoaXMuYnVmZmVyWzBdIGFzIE1lc3NhZ2VUeXBlO1xuICAgICAgY29uc3QgcGF5bG9hZExlbmd0aCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MzJCRSgxKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgY29tcGxldGUgbWVzc2FnZVxuICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA8IDUgKyBwYXlsb2FkTGVuZ3RoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IHRoZSBtZXNzYWdlXG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5idWZmZXIuc3ViYXJyYXkoNSwgNSArIHBheWxvYWRMZW5ndGgpO1xuICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJhcnJheSg1ICsgcGF5bG9hZExlbmd0aCk7XG5cbiAgICAgIHlpZWxkIHsgdHlwZTogbWVzc2FnZVR5cGUsIHBheWxvYWQgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgd2FpdGluZyB0byBiZSBwYXJzZWRcbiAgICovXG4gIGdldCBwZW5kaW5nQnl0ZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBidWZmZXJcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICB9XG59XG5cbi8qKlxuICogSGlnaC1sZXZlbCBtZXNzYWdlIGNyZWF0aW9uIGhlbHBlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2VCdWlsZGVyID0ge1xuICBzdGRpbihkYXRhOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBmcmFtZU1lc3NhZ2UoTWVzc2FnZVR5cGUuU1RESU5fREFUQSwgZGF0YSk7XG4gIH0sXG5cbiAgcmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gZnJhbWVNZXNzYWdlKE1lc3NhZ2VUeXBlLkNPTlRST0xfQ01ELCB7IGNtZDogJ3Jlc2l6ZScsIGNvbHMsIHJvd3MgfSk7XG4gIH0sXG5cbiAga2lsbChzaWduYWw/OiBzdHJpbmcgfCBudW1iZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiBmcmFtZU1lc3NhZ2UoTWVzc2FnZVR5cGUuQ09OVFJPTF9DTUQsIHsgY21kOiAna2lsbCcsIHNpZ25hbCB9KTtcbiAgfSxcblxuICByZXNldFNpemUoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gZnJhbWVNZXNzYWdlKE1lc3NhZ2VUeXBlLkNPTlRST0xfQ01ELCB7IGNtZDogJ3Jlc2V0LXNpemUnIH0pO1xuICB9LFxuXG4gIHVwZGF0ZVRpdGxlKHRpdGxlOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBmcmFtZU1lc3NhZ2UoTWVzc2FnZVR5cGUuQ09OVFJPTF9DTUQsIHsgY21kOiAndXBkYXRlLXRpdGxlJywgdGl0bGUgfSk7XG4gIH0sXG5cbiAgc3RhdHVzKGFwcDogc3RyaW5nLCBzdGF0dXM6IHN0cmluZywgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGZyYW1lTWVzc2FnZShNZXNzYWdlVHlwZS5TVEFUVVNfVVBEQVRFLCB7IGFwcCwgc3RhdHVzLCAuLi5leHRyYSB9KTtcbiAgfSxcblxuICBoZWFydGJlYXQoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gZnJhbWVNZXNzYWdlKE1lc3NhZ2VUeXBlLkhFQVJUQkVBVCwgQnVmZmVyLmFsbG9jKDApKTtcbiAgfSxcblxuICBlcnJvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGV0YWlscz86IHVua25vd24pOiBCdWZmZXIge1xuICAgIHJldHVybiBmcmFtZU1lc3NhZ2UoTWVzc2FnZVR5cGUuRVJST1IsIHsgY29kZSwgbWVzc2FnZSwgZGV0YWlscyB9KTtcbiAgfSxcblxuICBnaXRGb2xsb3dSZXF1ZXN0KHJlcXVlc3Q6IEdpdEZvbGxvd1JlcXVlc3QpOiBCdWZmZXIge1xuICAgIHJldHVybiBmcmFtZU1lc3NhZ2UoTWVzc2FnZVR5cGUuR0lUX0ZPTExPV19SRVFVRVNULCByZXF1ZXN0KTtcbiAgfSxcblxuICBnaXRGb2xsb3dSZXNwb25zZShyZXNwb25zZTogR2l0Rm9sbG93UmVzcG9uc2UpOiBCdWZmZXIge1xuICAgIHJldHVybiBmcmFtZU1lc3NhZ2UoTWVzc2FnZVR5cGUuR0lUX0ZPTExPV19SRVNQT05TRSwgcmVzcG9uc2UpO1xuICB9LFxuXG4gIGdpdEV2ZW50Tm90aWZ5KGV2ZW50OiBHaXRFdmVudE5vdGlmeSk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGZyYW1lTWVzc2FnZShNZXNzYWdlVHlwZS5HSVRfRVZFTlRfTk9USUZZLCBldmVudCk7XG4gIH0sXG5cbiAgZ2l0RXZlbnRBY2soYWNrOiBHaXRFdmVudEFjayk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGZyYW1lTWVzc2FnZShNZXNzYWdlVHlwZS5HSVRfRVZFTlRfQUNLLCBhY2spO1xuICB9LFxuXG4gIHN0YXR1c1JlcXVlc3QoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gZnJhbWVNZXNzYWdlKE1lc3NhZ2VUeXBlLlNUQVRVU19SRVFVRVNULCB7fSk7XG4gIH0sXG5cbiAgc3RhdHVzUmVzcG9uc2UocmVzcG9uc2U6IFN0YXR1c1Jlc3BvbnNlKTogQnVmZmVyIHtcbiAgICByZXR1cm4gZnJhbWVNZXNzYWdlKE1lc3NhZ2VUeXBlLlNUQVRVU19SRVNQT05TRSwgcmVzcG9uc2UpO1xuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBQYXJzZSBwYXlsb2FkIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXlsb2FkKHR5cGU6IE1lc3NhZ2VUeXBlLCBwYXlsb2FkOiBCdWZmZXIpOiB1bmtub3duIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBNZXNzYWdlVHlwZS5TVERJTl9EQVRBOlxuICAgICAgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKTtcblxuICAgIGNhc2UgTWVzc2FnZVR5cGUuQ09OVFJPTF9DTUQ6XG4gICAgY2FzZSBNZXNzYWdlVHlwZS5TVEFUVVNfVVBEQVRFOlxuICAgIGNhc2UgTWVzc2FnZVR5cGUuRVJST1I6XG4gICAgY2FzZSBNZXNzYWdlVHlwZS5TVEFUVVNfUkVRVUVTVDpcbiAgICBjYXNlIE1lc3NhZ2VUeXBlLlNUQVRVU19SRVNQT05TRTpcbiAgICBjYXNlIE1lc3NhZ2VUeXBlLkdJVF9GT0xMT1dfUkVRVUVTVDpcbiAgICBjYXNlIE1lc3NhZ2VUeXBlLkdJVF9GT0xMT1dfUkVTUE9OU0U6XG4gICAgY2FzZSBNZXNzYWdlVHlwZS5HSVRfRVZFTlRfTk9USUZZOlxuICAgIGNhc2UgTWVzc2FnZVR5cGUuR0lUX0VWRU5UX0FDSzpcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIEpTT04gcGF5bG9hZCBmb3IgbWVzc2FnZSB0eXBlICR7dHlwZX06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTWVzc2FnZVR5cGUuSEVBUlRCRUFUOlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbn1cbiJdfQ==