jamsocket
Version:
A CLI for the Jamsocket platform
118 lines (117 loc) • 4.38 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JamsocketConfig = exports.JAMSOCKET_CONFIG_DIR = void 0;
exports.isUserSessionConfig = isUserSessionConfig;
exports.isApiTokenConfig = isApiTokenConfig;
exports.deleteJamsocketConfig = deleteJamsocketConfig;
const os_1 = require("os");
const path_1 = require("path");
const fs_1 = require("fs");
exports.JAMSOCKET_CONFIG_DIR = (0, path_1.resolve)((0, os_1.homedir)(), '.jamsocket');
const JAMSOCKET_CONFIG_PATH = (0, path_1.resolve)(exports.JAMSOCKET_CONFIG_DIR, 'config.json');
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function isUserSessionConfig(config) {
return (config !== undefined &&
config.user_session !== undefined &&
config.user_session.uuid !== undefined &&
config.user_session.token !== undefined &&
config.user_session.user_id !== undefined &&
config.user_session.selected_account !== undefined);
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function isApiTokenConfig(config) {
return (config !== undefined &&
config.api_token !== undefined &&
config.api_token.token !== undefined &&
config.api_token.account !== undefined);
}
function deleteJamsocketConfig() {
if (!(0, fs_1.existsSync)(JAMSOCKET_CONFIG_PATH))
return;
(0, fs_1.unlinkSync)(JAMSOCKET_CONFIG_PATH);
}
class JamsocketConfig {
static fromSaved() {
if (!(0, fs_1.existsSync)(JAMSOCKET_CONFIG_PATH))
return null;
const contents = (0, fs_1.readFileSync)(JAMSOCKET_CONFIG_PATH, 'utf-8');
let config;
try {
config = JSON.parse(contents);
}
catch {
deleteJamsocketConfig();
return null;
}
const isInvalidConfig = isApiTokenConfig(config) === isUserSessionConfig(config);
if (isInvalidConfig) {
deleteJamsocketConfig();
return null;
}
return new JamsocketConfig(config);
}
constructor(config) {
this.config = config;
}
loggedInType() {
if (isUserSessionConfig(this.config))
return 'user_session';
return 'api_token';
}
updateSelectedAccount(selectedAccount) {
if (isUserSessionConfig(this.config)) {
this.config.user_session.selected_account = selectedAccount;
}
else {
throw new Error('Cannot update selected account for API token config. This is a bug with the Jamsocket CLI.');
}
}
save() {
const dir = (0, path_1.dirname)(JAMSOCKET_CONFIG_PATH);
(0, fs_1.mkdirSync)(dir, { recursive: true });
(0, fs_1.writeFileSync)(JAMSOCKET_CONFIG_PATH, `${JSON.stringify(this.config, null, 2)}${os_1.EOL}`);
}
getSessionUuid() {
if (isUserSessionConfig(this.config))
return this.config.user_session.uuid;
return null;
}
// returns a token that can access our API endpoints (either a user session token or api token)
getAccessToken() {
if (isApiTokenConfig(this.config))
return this.config.api_token.token;
return this.config.user_session.token;
}
getAuthHeaders() {
const headers = {
Authorization: `Bearer ${this.getAccessToken()}`,
};
if (this.isAdmin()) {
headers['X-Jamsocket-Admin-As-Account'] = this.getAccount();
}
return headers;
}
getAccount() {
if (isApiTokenConfig(this.config))
return this.config.api_token.account;
return this.config.user_session.selected_account;
}
getUserEmail() {
if (isUserSessionConfig(this.config))
return this.config.user_session.user_email ?? null;
return null;
}
isAdmin() {
if (isUserSessionConfig(this.config))
return this.config.user_session.user_is_admin;
return false;
}
getRegistryAuth() {
// this version of the token is used for Basic Authorization, which is required for our Docker registry
const account = this.getAccount();
const token = this.getAccessToken();
const buff = Buffer.from(`${account}:${token}`, 'utf-8');
return buff.toString('base64');
}
}
exports.JamsocketConfig = JamsocketConfig;