UNPKG

@zenfs/core

Version:

A filesystem, anywhere

215 lines (214 loc) 12.4 kB
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 };