@forabi/memfs
Version:
In-memory file-system with Node's fs API.
95 lines (73 loc) • 2.16 kB
text/typescript
import {Volume} from "./volume";
import {Link, Node} from "./node";
export interface IStore {
setItem(key: string, json);
getItem(key: string);
removeItem(key: string);
}
export class ObjectStore {
obj: object;
constructor(obj) {
this.obj = obj;
}
setItem(key: string, json) {
this.obj[key] = JSON.stringify(json);
}
getItem(key: string) {
const data = this.obj[key];
if(typeof data === void 0) return void 0;
return JSON.parse(data);
}
removeItem(key: string) {
delete this.obj[key];
}
}
export function createVolume(namespace: string, LS: Storage | object = localStorage): new (...args) => Volume {
const store = new ObjectStore(LS);
const key = (type, id) => `memfs.${namespace}.${type}.${id}`;
class NodeLocalStorage extends Node {
private _key: string;
get Key(): string {
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 Link {
private _key: string;
get Key(): string {
if(!this._key) this._key = key('link', this.getPath());
return this._key;
}
sync() {
store.setItem(this.Key, this.toJSON());
}
}
return class VolumeLocalStorage extends 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);
}
}
}