@varasto/fs-storage
Version:
Varasto storage implementation that stores data to hard disk
71 lines (70 loc) • 2.61 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.readItem = exports.globNamespace = exports.buildFilename = exports.createNamespace = void 0;
const storage_1 = require("@varasto/storage");
const fs_1 = __importDefault(require("fs"));
const glob_1 = require("glob");
const is_valid_slug_1 = require("is-valid-slug");
const mkdirp_1 = require("mkdirp");
const path_1 = __importDefault(require("path"));
const createNamespace = (dir, namespace) => new Promise((resolve, reject) => {
if (!(0, is_valid_slug_1.isValidSlug)(namespace)) {
reject(new storage_1.InvalidSlugError('Given namespace is not valid slug'));
return;
}
const filename = path_1.default.join(dir, namespace);
fs_1.default.exists(filename, (exists) => {
if (exists) {
resolve();
}
else {
(0, mkdirp_1.mkdirp)(filename)
.then(() => resolve())
.catch(reject);
}
});
});
exports.createNamespace = createNamespace;
const buildFilename = (dir, namespace, key) => {
if (!(0, is_valid_slug_1.isValidSlug)(namespace)) {
throw new storage_1.InvalidSlugError('Given namespace is not valid slug');
}
if (!(0, is_valid_slug_1.isValidSlug)(key)) {
throw new storage_1.InvalidSlugError('Given key is not valid slug');
}
return path_1.default.join(dir, namespace, `${key}.json`);
};
exports.buildFilename = buildFilename;
const globNamespace = (dir, namespace) => (0, is_valid_slug_1.isValidSlug)(namespace)
? (0, glob_1.glob)(path_1.default.join(dir, namespace, '*.json'))
: Promise.reject(new storage_1.InvalidSlugError('Given namespace is not valid slug'));
exports.globNamespace = globNamespace;
const readItem = (filename, encoding, deserialize) => new Promise((resolve, reject) => {
fs_1.default.readFile(filename, encoding, (err, text) => {
if (err) {
if (err.code === 'ENOENT') {
resolve(undefined);
}
else {
reject(err);
}
return;
}
try {
const value = deserialize(text);
if (typeof value === 'object') {
resolve(value);
}
else {
resolve(undefined); // XXX: Perhaps this should be an error?
}
}
catch (err) {
reject(err);
}
});
});
exports.readItem = readItem;