vibetunnel
Version:
Terminal sharing server with web interface - supports macOS, Linux, and headless environments
118 lines • 11.9 kB
JavaScript
;
/**
* Socket API client for VibeTunnel control operations
* Used by the vt command to communicate with the server via Unix socket
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocketApiClient = void 0;
const fs = __importStar(require("fs"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const socket_client_js_1 = require("./pty/socket-client.js");
const socket_protocol_js_1 = require("./pty/socket-protocol.js");
const logger_js_1 = require("./utils/logger.js");
const logger = (0, logger_js_1.createLogger)('socket-api');
/**
* Client for control socket operations
*/
class SocketApiClient {
constructor() {
// Use control directory from environment or default
const controlDir = process.env.VIBETUNNEL_CONTROL_DIR || path.join(os.homedir(), '.vibetunnel');
// Use api.sock instead of control.sock to avoid conflicts with Mac app
this.controlSocketPath = path.join(controlDir, 'api.sock');
}
/**
* Check if the control socket exists
*/
isSocketAvailable() {
return fs.existsSync(this.controlSocketPath);
}
/**
* Send a request and wait for response
*/
async sendRequest(type, payload, responseType, timeout = 5000) {
if (!this.isSocketAvailable()) {
throw new Error('VibeTunnel server is not running');
}
const client = new socket_client_js_1.VibeTunnelSocketClient(this.controlSocketPath);
try {
await client.connect();
const response = await client.sendMessageWithResponse(type, payload, responseType, timeout);
return response;
}
catch (error) {
if (error instanceof Error && error.message.includes('ENOENT')) {
throw new Error('VibeTunnel server is not running');
}
throw error;
}
finally {
client.disconnect();
}
}
/**
* Get server status
*/
async getStatus() {
if (!this.isSocketAvailable()) {
return { running: false };
}
try {
// Send STATUS_REQUEST and wait for STATUS_RESPONSE
const response = await this.sendRequest(socket_protocol_js_1.MessageType.STATUS_REQUEST, {}, socket_protocol_js_1.MessageType.STATUS_RESPONSE);
return response;
}
catch (error) {
logger.error('Failed to get server status:', error);
return { running: false };
}
}
/**
* Enable or disable Git follow mode
*/
async setFollowMode(request) {
return this.sendRequest(socket_protocol_js_1.MessageType.GIT_FOLLOW_REQUEST, request, socket_protocol_js_1.MessageType.GIT_FOLLOW_RESPONSE);
}
/**
* Send Git event notification
*/
async sendGitEvent(event) {
return this.sendRequest(socket_protocol_js_1.MessageType.GIT_EVENT_NOTIFY, event, socket_protocol_js_1.MessageType.GIT_EVENT_ACK);
}
}
exports.SocketApiClient = SocketApiClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3NvY2tldC1hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHVDQUF5QjtBQUN6Qix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLDZEQUFnRTtBQUNoRSxpRUFPa0M7QUFDbEMsaURBQWlEO0FBRWpELE1BQU0sTUFBTSxHQUFHLElBQUEsd0JBQVksRUFBQyxZQUFZLENBQUMsQ0FBQztBQWExQzs7R0FFRztBQUNILE1BQWEsZUFBZTtJQUcxQjtRQUNFLG9EQUFvRDtRQUNwRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2hHLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixJQUFjLEVBQ2QsT0FBaUMsRUFDakMsWUFBeUIsRUFDekIsT0FBTyxHQUFHLElBQUk7UUFFZCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUkseUNBQXNCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUYsT0FBTyxRQUFxQixDQUFDO1FBQy9CLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7WUFDOUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsbURBQW1EO1lBQ25ELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FDckMsZ0NBQVcsQ0FBQyxjQUFjLEVBQzFCLEVBQUUsRUFDRixnQ0FBVyxDQUFDLGVBQWUsQ0FDNUIsQ0FBQztZQUNGLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQXlCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FDckIsZ0NBQVcsQ0FBQyxrQkFBa0IsRUFDOUIsT0FBTyxFQUNQLGdDQUFXLENBQUMsbUJBQW1CLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQXFCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FDckIsZ0NBQVcsQ0FBQyxnQkFBZ0IsRUFDNUIsS0FBSyxFQUNMLGdDQUFXLENBQUMsYUFBYSxDQUMxQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBekZELDBDQXlGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29ja2V0IEFQSSBjbGllbnQgZm9yIFZpYmVUdW5uZWwgY29udHJvbCBvcGVyYXRpb25zXG4gKiBVc2VkIGJ5IHRoZSB2dCBjb21tYW5kIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlciB2aWEgVW5peCBzb2NrZXRcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVmliZVR1bm5lbFNvY2tldENsaWVudCB9IGZyb20gJy4vcHR5L3NvY2tldC1jbGllbnQuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBHaXRFdmVudEFjayxcbiAgdHlwZSBHaXRFdmVudE5vdGlmeSxcbiAgdHlwZSBHaXRGb2xsb3dSZXF1ZXN0LFxuICB0eXBlIEdpdEZvbGxvd1Jlc3BvbnNlLFxuICB0eXBlIE1lc3NhZ2VQYXlsb2FkLFxuICBNZXNzYWdlVHlwZSxcbn0gZnJvbSAnLi9wdHkvc29ja2V0LXByb3RvY29sLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzb2NrZXQtYXBpJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyU3RhdHVzIHtcbiAgcnVubmluZzogYm9vbGVhbjtcbiAgcG9ydD86IG51bWJlcjtcbiAgdXJsPzogc3RyaW5nO1xuICBmb2xsb3dNb2RlPzoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgYnJhbmNoPzogc3RyaW5nO1xuICAgIHJlcG9QYXRoPzogc3RyaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIENsaWVudCBmb3IgY29udHJvbCBzb2NrZXQgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgU29ja2V0QXBpQ2xpZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cm9sU29ja2V0UGF0aDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIFVzZSBjb250cm9sIGRpcmVjdG9yeSBmcm9tIGVudmlyb25tZW50IG9yIGRlZmF1bHRcbiAgICBjb25zdCBjb250cm9sRGlyID0gcHJvY2Vzcy5lbnYuVklCRVRVTk5FTF9DT05UUk9MX0RJUiB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLnZpYmV0dW5uZWwnKTtcbiAgICAvLyBVc2UgYXBpLnNvY2sgaW5zdGVhZCBvZiBjb250cm9sLnNvY2sgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggTWFjIGFwcFxuICAgIHRoaXMuY29udHJvbFNvY2tldFBhdGggPSBwYXRoLmpvaW4oY29udHJvbERpciwgJ2FwaS5zb2NrJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGNvbnRyb2wgc29ja2V0IGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBpc1NvY2tldEF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0aGlzLmNvbnRyb2xTb2NrZXRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcmVxdWVzdCBhbmQgd2FpdCBmb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZFJlcXVlc3Q8VFJlcXVlc3QgZXh0ZW5kcyBNZXNzYWdlVHlwZSwgVFJlc3BvbnNlPihcbiAgICB0eXBlOiBUUmVxdWVzdCxcbiAgICBwYXlsb2FkOiBNZXNzYWdlUGF5bG9hZDxUUmVxdWVzdD4sXG4gICAgcmVzcG9uc2VUeXBlOiBNZXNzYWdlVHlwZSxcbiAgICB0aW1lb3V0ID0gNTAwMFxuICApOiBQcm9taXNlPFRSZXNwb25zZT4ge1xuICAgIGlmICghdGhpcy5pc1NvY2tldEF2YWlsYWJsZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpYmVUdW5uZWwgc2VydmVyIGlzIG5vdCBydW5uaW5nJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFZpYmVUdW5uZWxTb2NrZXRDbGllbnQodGhpcy5jb250cm9sU29ja2V0UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmRNZXNzYWdlV2l0aFJlc3BvbnNlKHR5cGUsIHBheWxvYWQsIHJlc3BvbnNlVHlwZSwgdGltZW91dCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgVFJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFTk9FTlQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpYmVUdW5uZWwgc2VydmVyIGlzIG5vdCBydW5uaW5nJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlcnZlciBzdGF0dXNcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPFNlcnZlclN0YXR1cz4ge1xuICAgIGlmICghdGhpcy5pc1NvY2tldEF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm4geyBydW5uaW5nOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBTZW5kIFNUQVRVU19SRVFVRVNUIGFuZCB3YWl0IGZvciBTVEFUVVNfUkVTUE9OU0VcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdDxNZXNzYWdlVHlwZS5TVEFUVVNfUkVRVUVTVCwgU2VydmVyU3RhdHVzPihcbiAgICAgICAgTWVzc2FnZVR5cGUuU1RBVFVTX1JFUVVFU1QsXG4gICAgICAgIHt9LFxuICAgICAgICBNZXNzYWdlVHlwZS5TVEFUVVNfUkVTUE9OU0VcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBzZXJ2ZXIgc3RhdHVzOicsIGVycm9yKTtcbiAgICAgIHJldHVybiB7IHJ1bm5pbmc6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIEdpdCBmb2xsb3cgbW9kZVxuICAgKi9cbiAgYXN5bmMgc2V0Rm9sbG93TW9kZShyZXF1ZXN0OiBHaXRGb2xsb3dSZXF1ZXN0KTogUHJvbWlzZTxHaXRGb2xsb3dSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRSZXF1ZXN0PE1lc3NhZ2VUeXBlLkdJVF9GT0xMT1dfUkVRVUVTVCwgR2l0Rm9sbG93UmVzcG9uc2U+KFxuICAgICAgTWVzc2FnZVR5cGUuR0lUX0ZPTExPV19SRVFVRVNULFxuICAgICAgcmVxdWVzdCxcbiAgICAgIE1lc3NhZ2VUeXBlLkdJVF9GT0xMT1dfUkVTUE9OU0VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgR2l0IGV2ZW50IG5vdGlmaWNhdGlvblxuICAgKi9cbiAgYXN5bmMgc2VuZEdpdEV2ZW50KGV2ZW50OiBHaXRFdmVudE5vdGlmeSk6IFByb21pc2U8R2l0RXZlbnRBY2s+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxNZXNzYWdlVHlwZS5HSVRfRVZFTlRfTk9USUZZLCBHaXRFdmVudEFjaz4oXG4gICAgICBNZXNzYWdlVHlwZS5HSVRfRVZFTlRfTk9USUZZLFxuICAgICAgZXZlbnQsXG4gICAgICBNZXNzYWdlVHlwZS5HSVRfRVZFTlRfQUNLXG4gICAgKTtcbiAgfVxufVxuIl19