"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createVolume = exports.ObjectStore = void 0;
const volume_1 = require("./volume");
const node_1 = require("./node");
class ObjectStore {
constructor(obj) {
this.obj = obj;
}
setItem(key, json) {
this.obj[key] = JSON.stringify(json);
}
getItem(key) {
const data = this.obj[key];
if (typeof data === void 0)
return void 0;
return JSON.parse(data);
}
removeItem(key) {
delete this.obj[key];
}
}
exports.ObjectStore = ObjectStore;
function createVolume(namespace, LS = localStorage) {
const store = new ObjectStore(LS);
const key = (type, id) => `memfs.${namespace}.${type}.${id}`;
class NodeLocalStorage extends node_1.Node {
get Key() {
if (!this._key)
this._key = key('ino', this.ino);
return this._key;
}
sync() {
store.setItem(this.Key, this.toJSON());
}
touch() {
super.touch();
this.sync();
}
del() {
super.del();
store.removeItem(this.Key);
}
}
class LinkLocalStorage extends node_1.Link {
get Key() {
if (!this._key)
this._key = key('link', this.getPath());
return this._key;
}
sync() {
store.setItem(this.Key, this.toJSON());
}
}
return class VolumeLocalStorage extends volume_1.Volume {
constructor() {
super({
Node: NodeLocalStorage,
Link: LinkLocalStorage,
});
}
createLink(parent, name, isDirectory, perm) {
const link = super.createLink(parent, name, isDirectory, perm);
store.setItem(key('link', link.getPath()), link.toJSON());
return link;
}
deleteLink(link) {
store.removeItem(key('link', link.getPath()));
return super.deleteLink(link);
}
};
}
exports.createVolume = createVolume;