@zenfs/core
Version:
A filesystem, anywhere
215 lines (214 loc) • 12.4 kB
JavaScript
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
};
import { Stats } from './stats.js';
import { types as t, struct, sizeof, serialize, deserialize } from 'utilium';
/**
* Room inode
* @hidden
*/
export const rootIno = 0n;
/**
* Generates a random 32 bit integer, then converts to a hex string
*/
function _random() {
return Math.round(Math.random() * 2 ** 32).toString(16);
}
/**
* Generate a random ino
* @internal
*/
export function randomIno() {
return BigInt('0x' + _random() + _random());
}
/**
* Generic inode definition that can easily be serialized.
*/
let Inode = (() => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
let _classDecorators = [struct()];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _ino_decorators;
let _ino_initializers = [];
let _ino_extraInitializers = [];
let _size_decorators;
let _size_initializers = [];
let _size_extraInitializers = [];
let _mode_decorators;
let _mode_initializers = [];
let _mode_extraInitializers = [];
let _nlink_decorators;
let _nlink_initializers = [];
let _nlink_extraInitializers = [];
let _uid_decorators;
let _uid_initializers = [];
let _uid_extraInitializers = [];
let _gid_decorators;
let _gid_initializers = [];
let _gid_extraInitializers = [];
let _atimeMs_decorators;
let _atimeMs_initializers = [];
let _atimeMs_extraInitializers = [];
let _birthtimeMs_decorators;
let _birthtimeMs_initializers = [];
let _birthtimeMs_extraInitializers = [];
let _mtimeMs_decorators;
let _mtimeMs_initializers = [];
let _mtimeMs_extraInitializers = [];
let _ctimeMs_decorators;
let _ctimeMs_initializers = [];
let _ctimeMs_extraInitializers = [];
var Inode = _classThis = class {
get data() {
return serialize(this);
}
constructor(buffer) {
this.ino = __runInitializers(this, _ino_initializers, void 0);
this.size = (__runInitializers(this, _ino_extraInitializers), __runInitializers(this, _size_initializers, void 0));
this.mode = (__runInitializers(this, _size_extraInitializers), __runInitializers(this, _mode_initializers, void 0));
this.nlink = (__runInitializers(this, _mode_extraInitializers), __runInitializers(this, _nlink_initializers, void 0));
this.uid = (__runInitializers(this, _nlink_extraInitializers), __runInitializers(this, _uid_initializers, void 0));
this.gid = (__runInitializers(this, _uid_extraInitializers), __runInitializers(this, _gid_initializers, void 0));
this.atimeMs = (__runInitializers(this, _gid_extraInitializers), __runInitializers(this, _atimeMs_initializers, void 0));
this.birthtimeMs = (__runInitializers(this, _atimeMs_extraInitializers), __runInitializers(this, _birthtimeMs_initializers, void 0));
this.mtimeMs = (__runInitializers(this, _birthtimeMs_extraInitializers), __runInitializers(this, _mtimeMs_initializers, void 0));
this.ctimeMs = (__runInitializers(this, _mtimeMs_extraInitializers), __runInitializers(this, _ctimeMs_initializers, void 0));
__runInitializers(this, _ctimeMs_extraInitializers);
if (buffer) {
if (buffer.byteLength < sizeof(Inode)) {
throw new RangeError(`Can not create an inode from a buffer less than ${sizeof(Inode)} bytes`);
}
deserialize(this, buffer);
return;
}
// set defaults on a fresh inode
this.ino = randomIno();
this.nlink = 1;
this.size = 4096;
const now = Date.now();
this.atimeMs = now;
this.mtimeMs = now;
this.ctimeMs = now;
this.birthtimeMs = now;
}
/**
* Handy function that converts the Inode to a Node Stats object.
*/
toStats() {
return new Stats(this);
}
/**
* Updates the Inode using information from the stats object. Used by file
* systems at sync time, e.g.:
* - Program opens file and gets a File object.
* - Program mutates file. File object is responsible for maintaining
* metadata changes locally -- typically in a Stats object.
* - Program closes file. File object's metadata changes are synced with the
* file system.
* @return True if any changes have occurred.
*/
update(stats) {
let hasChanged = false;
if (this.size !== stats.size) {
this.size = stats.size;
hasChanged = true;
}
if (this.mode !== stats.mode) {
this.mode = stats.mode;
hasChanged = true;
}
if (this.nlink !== stats.nlink) {
this.nlink = stats.nlink;
hasChanged = true;
}
if (this.uid !== stats.uid) {
this.uid = stats.uid;
hasChanged = true;
}
if (this.uid !== stats.uid) {
this.uid = stats.uid;
hasChanged = true;
}
if (this.atimeMs !== stats.atimeMs) {
this.atimeMs = stats.atimeMs;
hasChanged = true;
}
if (this.mtimeMs !== stats.mtimeMs) {
this.mtimeMs = stats.mtimeMs;
hasChanged = true;
}
if (this.ctimeMs !== stats.ctimeMs) {
this.ctimeMs = stats.ctimeMs;
hasChanged = true;
}
return hasChanged;
}
};
__setFunctionName(_classThis, "Inode");
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
_ino_decorators = [(_a = t).uint64.bind(_a)];
_size_decorators = [(_b = t).uint32.bind(_b)];
_mode_decorators = [(_c = t).uint16.bind(_c)];
_nlink_decorators = [(_d = t).uint32.bind(_d)];
_uid_decorators = [(_e = t).uint32.bind(_e)];
_gid_decorators = [(_f = t).uint32.bind(_f)];
_atimeMs_decorators = [(_g = t).float64.bind(_g)];
_birthtimeMs_decorators = [(_h = t).float64.bind(_h)];
_mtimeMs_decorators = [(_j = t).float64.bind(_j)];
_ctimeMs_decorators = [(_k = t).float64.bind(_k)];
__esDecorate(null, null, _ino_decorators, { kind: "field", name: "ino", static: false, private: false, access: { has: obj => "ino" in obj, get: obj => obj.ino, set: (obj, value) => { obj.ino = value; } }, metadata: _metadata }, _ino_initializers, _ino_extraInitializers);
__esDecorate(null, null, _size_decorators, { kind: "field", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
__esDecorate(null, null, _mode_decorators, { kind: "field", name: "mode", static: false, private: false, access: { has: obj => "mode" in obj, get: obj => obj.mode, set: (obj, value) => { obj.mode = value; } }, metadata: _metadata }, _mode_initializers, _mode_extraInitializers);
__esDecorate(null, null, _nlink_decorators, { kind: "field", name: "nlink", static: false, private: false, access: { has: obj => "nlink" in obj, get: obj => obj.nlink, set: (obj, value) => { obj.nlink = value; } }, metadata: _metadata }, _nlink_initializers, _nlink_extraInitializers);
__esDecorate(null, null, _uid_decorators, { kind: "field", name: "uid", static: false, private: false, access: { has: obj => "uid" in obj, get: obj => obj.uid, set: (obj, value) => { obj.uid = value; } }, metadata: _metadata }, _uid_initializers, _uid_extraInitializers);
__esDecorate(null, null, _gid_decorators, { kind: "field", name: "gid", static: false, private: false, access: { has: obj => "gid" in obj, get: obj => obj.gid, set: (obj, value) => { obj.gid = value; } }, metadata: _metadata }, _gid_initializers, _gid_extraInitializers);
__esDecorate(null, null, _atimeMs_decorators, { kind: "field", name: "atimeMs", static: false, private: false, access: { has: obj => "atimeMs" in obj, get: obj => obj.atimeMs, set: (obj, value) => { obj.atimeMs = value; } }, metadata: _metadata }, _atimeMs_initializers, _atimeMs_extraInitializers);
__esDecorate(null, null, _birthtimeMs_decorators, { kind: "field", name: "birthtimeMs", static: false, private: false, access: { has: obj => "birthtimeMs" in obj, get: obj => obj.birthtimeMs, set: (obj, value) => { obj.birthtimeMs = value; } }, metadata: _metadata }, _birthtimeMs_initializers, _birthtimeMs_extraInitializers);
__esDecorate(null, null, _mtimeMs_decorators, { kind: "field", name: "mtimeMs", static: false, private: false, access: { has: obj => "mtimeMs" in obj, get: obj => obj.mtimeMs, set: (obj, value) => { obj.mtimeMs = value; } }, metadata: _metadata }, _mtimeMs_initializers, _mtimeMs_extraInitializers);
__esDecorate(null, null, _ctimeMs_decorators, { kind: "field", name: "ctimeMs", static: false, private: false, access: { has: obj => "ctimeMs" in obj, get: obj => obj.ctimeMs, set: (obj, value) => { obj.ctimeMs = value; } }, metadata: _metadata }, _ctimeMs_initializers, _ctimeMs_extraInitializers);
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
Inode = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
})();
return Inode = _classThis;
})();
export { Inode };