UNPKG

@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
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=