@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.
50 lines • 3.49 kB
JavaScript
import * as plugins from './plugins.js';
import { SmartdataCollection } from './classes.collection.js';
import { SmartdataDb } from './classes.db.js';
/**
* Per-SmartdataDb collection cache.
*
* Historically this class keyed its cache by class name alone, which meant
* the first SmartdataDb to request a collection of a given class name
* "won" — every subsequent call from a different SmartdataDb instance
* received the cached collection bound to the first db. That silently
* broke multi-tenant SaaS apps (one db per tenant), tests instantiating
* multiple SmartdataDbs in sequence, and any in-process db cluster switch.
*
* The cache is now keyed by `(SmartdataDb instance, className)` using a
* WeakMap of db → Map<className, SmartdataCollection>. Entries are GC'd
* with their parent db automatically.
*/
export class CollectionFactory {
perDbCollections = new WeakMap();
getCollection = (nameArg, dbArg) => {
if (!(dbArg instanceof SmartdataDb)) {
// Preserve the historical behavior of returning undefined-ish for
// non-db args. All in-repo callers already guard on instanceof
// before using the result (see classes.collection.ts).
return undefined;
}
let dbMap = this.perDbCollections.get(dbArg);
if (!dbMap) {
dbMap = new Map();
this.perDbCollections.set(dbArg, dbMap);
}
let coll = dbMap.get(nameArg);
if (!coll) {
coll = new SmartdataCollection(nameArg, dbArg);
dbMap.set(nameArg, coll);
}
return coll;
};
/**
* @deprecated Internal back-compat shim. The previous field was a public
* Record<className, SmartdataCollection> but was not part of the
* documented public API. WeakMap is not iterable, so this getter returns
* an empty object — anyone actually relying on the old shape would get
* clean nothing rather than wrong-db data. Will be removed in 8.0.
*/
get collections() {
return {};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb2xsZWN0aW9uZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuY29sbGVjdGlvbmZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLGdCQUFnQixHQUFnRSxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRS9GLGFBQWEsR0FBRyxDQUFDLE9BQWUsRUFBRSxLQUFrQixFQUE0QixFQUFFO1FBQ3ZGLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3BDLGtFQUFrRTtZQUNsRSwrREFBK0Q7WUFDL0QsdURBQXVEO1lBQ3ZELE9BQU8sU0FBZ0QsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUY7Ozs7OztPQU1HO0lBQ0gsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGIn0=