"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.save = exports.load = exports.FILE_TYPE = exports.CRYPTO_DIR = exports.STORAGE_DIR = void 0; const crypto_1 = __importDefault(require("crypto")); const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); const os_1 = __importDefault(require("os")); const util_1 = require("util"); const errors_1 = require("./errors"); const has_error_code_1 = __importDefault(require("./utils/has-error-code")); const readFile = (0, util_1.promisify)(fs_1.default.readFile); const writeFile = (0, util_1.promisify)(fs_1.default.writeFile); const mkdir = (0, util_1.promisify)(fs_1.default.mkdir); const readdir = (0, util_1.promisify)(fs_1.default.readdir); const rm = (0, util_1.promisify)(fs_1.default.rm); exports.STORAGE_DIR = '.tcss'; exports.CRYPTO_DIR = '.tcpk'; var FILE_TYPE; (function (FILE_TYPE) { FILE_TYPE[FILE_TYPE["STORAGE"] = 0] = "STORAGE"; FILE_TYPE[FILE_TYPE["NONCE"] = 1] = "NONCE"; FILE_TYPE[FILE_TYPE["AUTH_TAG"] = 2] = "AUTH_TAG"; FILE_TYPE[FILE_TYPE["PRIVATE_KEY"] = 3] = "PRIVATE_KEY"; FILE_TYPE[FILE_TYPE["PASSPHRASE"] = 4] = "PASSPHRASE"; })(FILE_TYPE = exports.FILE_TYPE || (exports.FILE_TYPE = {})); // TODO: Use OS APIs to secretely store PASSPHRASE, AUTH_TAG, NONCE const FILENAME_TEMPLATES = { [FILE_TYPE.STORAGE]: (seed) => path_1.default.join(os_1.default.homedir(), exports.STORAGE_DIR, `storage-${seed}`), [FILE_TYPE.NONCE]: (seed) => path_1.default.join(os_1.default.homedir(), exports.CRYPTO_DIR, `n-${seed}`), [FILE_TYPE.AUTH_TAG]: (seed) => path_1.default.join(os_1.default.homedir(), exports.CRYPTO_DIR, `at-${seed}`), [FILE_TYPE.PRIVATE_KEY]: (seed) => path_1.default.join(os_1.default.homedir(), exports.CRYPTO_DIR, `pk-${seed}`), [FILE_TYPE.PASSPHRASE]: (seed) => path_1.default.join(os_1.default.homedir(), `.tcpp-${seed}`), }; async function ensureDir(filename) { await mkdir(path_1.default.dirname(filename), { recursive: true }); } async function readNamesDir(path) { try { return await readdir(path); } catch (error) { if ((0, has_error_code_1.default)(error) && error.code === 'ENOENT') throw new errors_1.SavedDataNotDetected(); throw error; } } async function detectNames(type) { const template = FILENAME_TEMPLATES[type](''); const dirname = path_1.default.dirname(template); const basenames = await readNamesDir(dirname); const filenames = basenames.filter(name => name.includes(path_1.default.basename(template))); return filenames.map(name => path_1.default.join(dirname, name)); } async function detectName(type) { const names = await detectNames(type); if (!names.length) throw new errors_1.SavedDataNotDetected(); if (names.length > 1) throw new errors_1.MultipleSavedDataDetected(); return names[0]; } async function generateName(type) { return FILENAME_TEMPLATES[type](crypto_1.default.randomUUID()); } async function load(type) { const name = await detectName(type); const data = await readFile(name); await remove(name); return data; } exports.load = load; async function save(type, data) { const name = await generateName(type); await ensureDir(name); await removeAll(type); await writeFile(name, data); } exports.save = save; async function remove(name) { await rm(name, { force: true }); } async function removeAll(type) { const names = await detectNames(type); await Promise.all(names.map(name => remove(name))); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLDRDQUFvQjtBQUNwQiwrQkFBaUM7QUFDakMscUNBQTJFO0FBQzNFLDRFQUFrRDtBQUdsRCxNQUFNLFFBQVEsR0FBSSxJQUFBLGdCQUFTLEVBQUMsWUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUEsZ0JBQVMsRUFBQyxZQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUMsTUFBTSxLQUFLLEdBQU8sSUFBQSxnQkFBUyxFQUFDLFlBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxNQUFNLE9BQU8sR0FBSyxJQUFBLGdCQUFTLEVBQUMsWUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sRUFBRSxHQUFVLElBQUEsZ0JBQVMsRUFBQyxZQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFdEIsUUFBQSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQ3RCLFFBQUEsVUFBVSxHQUFJLE9BQU8sQ0FBQztBQUVuQyxJQUFZLFNBTVg7QUFORCxXQUFZLFNBQVM7SUFDakIsK0NBQU8sQ0FBQTtJQUNQLDJDQUFLLENBQUE7SUFDTCxpREFBUSxDQUFBO0lBQ1IsdURBQVcsQ0FBQTtJQUNYLHFEQUFVLENBQUE7QUFDZCxDQUFDLEVBTlcsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFNcEI7QUFFRCxtRUFBbUU7QUFDbkUsTUFBTSxrQkFBa0IsR0FBRztJQUN2QixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBTSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsbUJBQVcsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO0lBQ2xHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFRLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxrQkFBVSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDM0YsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUssQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsWUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFVLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUM1RixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsa0JBQVUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzVGLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO0NBQ3RGLENBQUM7QUFFRixLQUFLLFVBQVUsU0FBUyxDQUFFLFFBQWdCO0lBQ3RDLE1BQU0sS0FBSyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FBRSxJQUFZO0lBQ3JDLElBQUk7UUFDQSxPQUFPLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsT0FBTyxLQUFjLEVBQUU7UUFDbkIsSUFBSSxJQUFBLHdCQUFZLEVBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQzlDLE1BQU0sSUFBSSw2QkFBb0IsRUFBRSxDQUFDO1FBRXJDLE1BQU0sS0FBSyxDQUFDO0tBQ2Y7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLFdBQVcsQ0FBRSxJQUFlO0lBQ3ZDLE1BQU0sUUFBUSxHQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sT0FBTyxHQUFLLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsTUFBTSxTQUFTLEdBQUcsTUFBTSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkYsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVUsQ0FBRSxJQUFlO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtRQUNiLE1BQU0sSUFBSSw2QkFBb0IsRUFBRSxDQUFDO0lBRXJDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxrQ0FBeUIsRUFBRSxDQUFDO0lBRTFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFFLElBQWU7SUFDeEMsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVNLEtBQUssVUFBVSxJQUFJLENBQUUsSUFBZTtJQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVsQyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuQixPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBUkQsb0JBUUM7QUFFTSxLQUFLLFVBQVUsSUFBSSxDQUFFLElBQWUsRUFBRSxJQUFxQjtJQUM5RCxNQUFNLElBQUksR0FBRyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0QyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0QixNQUFNLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQVBELG9CQU9DO0FBRUQsS0FBSyxVQUFVLE1BQU0sQ0FBRSxJQUFZO0lBQy9CLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxLQUFLLFVBQVUsU0FBUyxDQUFFLElBQWU7SUFDckMsTUFBTSxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMifQ==