kv-storage
Version:
💾 Create data storage that uses a simple key-value method for Node, Browser, Deno, Bun, Cloudflare Workers
183 lines (182 loc) • 7.12 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.KVStorageModule = void 0;
const node_fs_1 = __importDefault(require("node:fs"));
class KVStorageModule {
constructor({ storageDir }) {
this._storageDir = storageDir;
}
isAlphanumeric(str) {
return /^[a-zA-Z0-9]+$/.test(str);
}
showError(msg = 'Error') {
throw new Error(msg);
}
static init({ dataDirName = "data", storageName }) {
return __awaiter(this, void 0, void 0, function* () {
function isAlphanumeric(str) {
return /^[a-zA-Z0-9]+$/.test(str);
}
function showError(msg = 'Error') {
throw new Error(msg);
}
function makeDir(dir) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
node_fs_1.default.stat(dir, (err) => {
if (err) {
node_fs_1.default.mkdir(dir, { recursive: true }, (err, path) => {
if (err) {
throw err;
}
else {
resolve(true);
}
});
}
else {
resolve(true);
}
});
});
});
}
if (!isAlphanumeric(dataDirName))
showError('dataDirName must be Alphanumeric');
if (!isAlphanumeric(storageName))
showError('storageName must be Alphanumeric');
let _dataDirName = "./" + dataDirName;
let storageDir = _dataDirName + '/' + storageName;
yield makeDir(storageDir);
return new KVStorageModule({ storageDir });
});
}
put(key, value) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
if (!this.isAlphanumeric(key))
this.showError('Key must be Alphanumeric');
const keyFilePath = this._storageDir + '/' + key;
node_fs_1.default.writeFile(keyFilePath, value, (err) => {
if (err) {
resolve(false);
}
else {
resolve(true);
}
});
});
});
}
get(key) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
if (!this.isAlphanumeric(key))
this.showError('Key must be Alphanumeric');
const keyFilePath = this._storageDir + '/' + key;
node_fs_1.default.readFile(keyFilePath, (err, data) => {
if (err) {
resolve(false);
}
else {
resolve(data.toString('utf8', 0, data.length));
}
});
});
});
}
delete(key) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
if (!this.isAlphanumeric(key))
this.showError('Key must be Alphanumeric');
const keyFilePath = this._storageDir + '/' + key;
node_fs_1.default.unlink(keyFilePath, (err) => {
if (err) {
node_fs_1.default.stat(keyFilePath, (err) => {
if (err) {
resolve(true);
}
else {
resolve(false);
}
});
}
else {
resolve(true);
}
});
});
});
}
has(key) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
if (!this.isAlphanumeric(key))
this.showError('Key must be Alphanumeric');
const keyFilePath = this._storageDir + '/' + key;
node_fs_1.default.stat(keyFilePath, (err) => {
if (err) {
resolve(false);
}
else {
resolve(true);
}
});
});
});
}
list() {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
node_fs_1.default.readdir(this._storageDir, (err, files) => {
if (err) {
resolve(false);
}
else {
let result = {
keys: files,
complete: true
};
resolve(result);
}
});
});
});
}
clear() {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
node_fs_1.default.readdir(this._storageDir, (err, files) => {
if (err) {
resolve(false);
}
else {
let success = true;
for (const file of files) {
const keyFilePath = this._storageDir + '/' + file;
node_fs_1.default.unlink(keyFilePath, (err) => {
if (err)
success = false;
});
}
resolve(success);
}
});
});
});
}
}
exports.KVStorageModule = KVStorageModule;