UNPKG

whistle

Version:

HTTP, HTTP2, HTTPS, Websocket debugging proxy

111 lines (100 loc) 2.5 kB
var fse = require('fs-extra2'); var fs = require('fs'); var common = require('../util/common'); var UTF8_OPTIONS = { encoding: 'utf8' }; function ensureFile(filepath) { return new Promise(function(resolve, reject) { fse.ensureFile(filepath, function(err) { if (err ) { return reject(err); } resolve(); }); }); } function writeJson(filepath, obj, bkFile) { return new Promise(async function(resolve, reject) { await ensureFile(filepath); fse.writeJson(filepath, obj, function(err) { if (err) { return reject(err); } common.copyFile(filepath, bkFile, function() { resolve(obj); }); }); }); } function readJson(filepath, bkFile) { return new Promise(function(resolve, reject) { fs.readFile(filepath, UTF8_OPTIONS, function(err, ctn) { if (err) { return err.code === 'ENOENT' ? resolve({}) : reject(err); } if (ctn) { try { ctn = JSON.parse(ctn) || {}; resolve(typeof ctn === 'object'? ctn : {}); } catch (e) { reject(e); } return; } common.readJson(bkFile, function(_, obj) { resolve(obj || {}); }); }); }); } module.exports = function(filepath) { var bkFile = filepath + '.bk'; var getAll = async function() { try { return await readJson(filepath, bkFile); } catch (e) {} return readJson(filepath, bkFile); }; var writeAll = async function(obj) { try { return await writeJson(filepath, obj, bkFile); } catch (e) {} return writeJson(filepath, obj, bkFile); }; var setItem = async function(key, value) { var obj = await getAll(); if (key && typeof key === 'object') { Object.keys(key).forEach(function(k) { obj[k] = key[k]; }); } else { obj[key] = value; } return writeAll(obj); }; var getItem = async function(key) { var obj = await getAll(); return obj[key]; }; var removeItem = async function(key) { var obj = await getAll(); if (Array.isArray(key)) { key.forEach(function(k) { delete obj[k]; }); } else if (key && typeof key === 'object') { Object.keys(key).forEach(function(k) { delete obj[k]; }); } else { delete obj[key]; } return writeAll(obj); }; return { getAll: getAll, setAll: writeAll, setItem: setItem, getItem: getItem, removeItem: removeItem }; };