@push.rocks/smartdata
Version:
An advanced library for NoSQL data organization and manipulation using TypeScript with support for MongoDB, data validation, collections, and custom data types.
191 lines • 14.1 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;
};
import * as plugins from './plugins.js';
import { Collection } from './classes.collection.js';
import { SmartdataDb } from './classes.db.js';
import { SmartDataDbDoc, svDb, unI } from './classes.doc.js';
/**
* EasyStore allows the storage of easy objects. It also allows easy sharing of the object between different instances
*/
export class EasyStore {
// instance
smartdataDbRef;
nameId;
easyStoreClass = (() => {
let SmartdataEasyStore = (() => {
let _classDecorators = [Collection(() => this.smartdataDbRef)];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = SmartDataDbDoc;
let _nameId_decorators;
let _nameId_initializers = [];
let _nameId_extraInitializers = [];
let _ephemeral_decorators;
let _ephemeral_initializers = [];
let _ephemeral_extraInitializers = [];
let _lastEdit_decorators;
let _lastEdit_initializers = [];
let _lastEdit_extraInitializers = [];
let _data_decorators;
let _data_initializers = [];
let _data_extraInitializers = [];
var SmartdataEasyStore = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_nameId_decorators = [unI()];
_ephemeral_decorators = [svDb()];
_lastEdit_decorators = [svDb()];
_data_decorators = [svDb()];
__esDecorate(null, null, _nameId_decorators, { kind: "field", name: "nameId", static: false, private: false, access: { has: obj => "nameId" in obj, get: obj => obj.nameId, set: (obj, value) => { obj.nameId = value; } }, metadata: _metadata }, _nameId_initializers, _nameId_extraInitializers);
__esDecorate(null, null, _ephemeral_decorators, { kind: "field", name: "ephemeral", static: false, private: false, access: { has: obj => "ephemeral" in obj, get: obj => obj.ephemeral, set: (obj, value) => { obj.ephemeral = value; } }, metadata: _metadata }, _ephemeral_initializers, _ephemeral_extraInitializers);
__esDecorate(null, null, _lastEdit_decorators, { kind: "field", name: "lastEdit", static: false, private: false, access: { has: obj => "lastEdit" in obj, get: obj => obj.lastEdit, set: (obj, value) => { obj.lastEdit = value; } }, metadata: _metadata }, _lastEdit_initializers, _lastEdit_extraInitializers);
__esDecorate(null, null, _data_decorators, { kind: "field", name: "data", static: false, private: false, access: { has: obj => "data" in obj, get: obj => obj.data, set: (obj, value) => { obj.data = value; } }, metadata: _metadata }, _data_initializers, _data_extraInitializers);
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
SmartdataEasyStore = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
__runInitializers(_classThis, _classExtraInitializers);
}
nameId = __runInitializers(this, _nameId_initializers, void 0);
ephemeral = (__runInitializers(this, _nameId_extraInitializers), __runInitializers(this, _ephemeral_initializers, void 0));
lastEdit = (__runInitializers(this, _ephemeral_extraInitializers), __runInitializers(this, _lastEdit_initializers, void 0));
data = (__runInitializers(this, _lastEdit_extraInitializers), __runInitializers(this, _data_initializers, void 0));
constructor() {
super(...arguments);
__runInitializers(this, _data_extraInitializers);
}
};
return SmartdataEasyStore = _classThis;
})();
return SmartdataEasyStore;
})();
constructor(nameIdArg, smartdataDbRefArg) {
this.smartdataDbRef = smartdataDbRefArg;
this.nameId = nameIdArg;
}
easyStorePromise;
async getEasyStore() {
if (this.easyStorePromise) {
return this.easyStorePromise;
}
// first run from here
const deferred = plugins.smartpromise.defer();
this.easyStorePromise = deferred.promise;
try {
let easyStore = await this.easyStoreClass.getInstance({
nameId: this.nameId,
});
if (!easyStore) {
easyStore = new this.easyStoreClass();
easyStore.nameId = this.nameId;
easyStore.data = {};
await easyStore.save();
}
deferred.resolve(easyStore);
}
catch (error) {
// settle the deferred and clear the cache so concurrent callers get the
// error instead of awaiting forever, and later callers can retry
this.easyStorePromise = undefined;
deferred.reject(error);
}
return deferred.promise;
}
/**
* reads all keyValue pairs at once and returns them
*/
async readAll() {
const easyStore = await this.getEasyStore();
return easyStore.data;
}
/**
* reads a keyValueFile from disk
*/
async readKey(keyArg) {
const easyStore = await this.getEasyStore();
return easyStore.data[keyArg];
}
/**
* writes a specific key to the keyValueStore
*/
async writeKey(keyArg, valueArg) {
const easyStore = await this.getEasyStore();
easyStore.data[keyArg] = valueArg;
await easyStore.save();
}
async deleteKey(keyArg) {
const easyStore = await this.getEasyStore();
delete easyStore.data[keyArg];
await easyStore.save();
}
/**
* merges all keyValue pairs from the object argument into the store.
* Existing keys that are not present in `keyValueObject` are preserved.
* To overwrite the entire store and drop missing keys, use `replace()`.
*/
async writeAll(keyValueObject) {
const easyStore = await this.getEasyStore();
easyStore.data = { ...easyStore.data, ...keyValueObject };
await easyStore.save();
}
/**
* atomically replaces the entire store with the given object.
* Unlike `writeAll` (which merges), `replace` clears any keys not
* present in `keyValueObject`. Useful when you need to drop a key.
*/
async replace(keyValueObject) {
const easyStore = await this.getEasyStore();
easyStore.data = { ...keyValueObject };
await easyStore.save();
}
/**
* wipes a key value store from disk
*/
async wipe() {
const easyStore = await this.getEasyStore();
easyStore.data = {};
await easyStore.save();
}
async cleanUpEphemeral() {
// Clean up ephemeral data periodically while connected
while (this.smartdataDbRef.status === 'connected') {
await plugins.smartdelay.delayFor(60000); // Check every minute
// TODO: Implement actual cleanup logic for ephemeral data
// For now, this prevents the infinite CPU loop
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lYXN5c3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmVhc3lzdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RDs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFTO0lBQ3BCLFdBQVc7SUFDSixjQUFjLENBQWM7SUFDNUIsTUFBTSxDQUFTO0lBRWQsY0FBYyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBRXZCLGtCQUFrQjtvQ0FEdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7Ozs7OEJBQ0wsY0FBYzs7Ozs7Ozs7Ozs7OzswQ0FBdEIsU0FBUSxXQUFzRDs7OzswQ0FDcEYsR0FBRyxFQUFFOzZDQUdMLElBQUksRUFBRTs0Q0FNTixJQUFJLEVBQUU7d0NBR04sSUFBSSxFQUFFO29CQVhQLG9LQUFPLE1BQU0sNkJBQU4sTUFBTSx1RkFBVTtvQkFHdkIsNktBQU8sU0FBUyw2QkFBVCxTQUFTLDZGQUdkO29CQUdGLDBLQUFBLFFBQVEsNkJBQVIsUUFBUSwyRkFBVTtvQkFHbEIsOEpBQU8sSUFBSSw2QkFBSixJQUFJLG1GQUFjO29CQWQzQiw2S0FlQzs7O29CQWZLLHVEQUFrQjs7Z0JBRWYsTUFBTSx5REFBVTtnQkFHaEIsU0FBUyxrSEFHZDtnQkFHRixRQUFRLG9IQUFVO2dCQUdYLElBQUksK0dBQWM7Ozs7Ozs7O1FBRTNCLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQyxD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