{"version":3,"sources":["storage-set.ts"],"sourcesContent":["// deno-lint-ignore-file no-this-alias\n\nimport { Compiler } from \"../compiler/compiler.ts\";\nimport { VOID } from \"../runtime/constants.ts\";\nimport { Pointer } from \"../runtime/pointers.ts\";\nimport { MatchResult, Storage } from \"../storage/storage.ts\";\nimport { MatchInput, match } from \"../utils/match.ts\";\nimport type { Class } from \"../utils/global_types.ts\";\nimport { MatchOptions } from \"../utils/match.ts\";\nimport { Type } from \"./type.ts\";\nimport { ReactiveValue } from \"../runtime/pointers.ts\";\n\n/**\n * WeakSet that outsources values to storage.\n * The API is similar to the JS WeakSet API, but all methods are async.\n * In contrast to JS WeakSets, primitive values are also allowed.\n * The StorageWeakSet holds no strong references to its values in storage.\n * This means that the pointer of a value can be garbage collected.\n */\nexport class StorageWeakSet<V> {\n\n\t/**\n\t * Create a new StorageWeakSet instance with the given value type.\n\t * @param type Class or DATEX Type of the values\n\t * @returns \n\t */\n\tstatic of<V>(type: Class<V>|Type<V>): StorageWeakSet<V> {\n\t\tconst storageSet = new this<V>();\n\t\tstorageSet.#_type = type instanceof Type ? type : Type.getClassDatexType(type);\n\t\tstorageSet._type = storageSet.#_type.namespace + \":\" + storageSet.#_type.name;\n\t\treturn storageSet;\n\t}\n\n\t_type?: string\n\t#_type?: Type<V>;\n\n\tprotected get type() {\n\t\tif (!this._type) return undefined;\n\t\tif (!this.#_type) this.#_type = Type.get(this._type);\n\t\treturn this.#_type;\n\t}\n\n\t/**\n\t * Time in milliseconds after which a value is removed from the in-memory cache\n\t * Default: 5min\n\t */\n\tcacheTimeout = 5 * 60 * 1000;\n\n\t/**\n\t * If true, non-pointer objects are allowed as \n\t * values in the map (default)\n\t * Otherwise, object values are automatically proxified\n\t * when added to the map.\n\t */\n\tallowNonPointerObjectValues = false;\n\n\t#prefix?: string;\n\n\t// StorageWeakSets are not bound to a pointer per default, but a pointer is automatically created if needed\n\t#_pointer?: Pointer;\n\tget #pointer() {\n\t\tif (!this.#_pointer) this.#_pointer = Pointer.getByValue(this);\n\t\tif (!this.#_pointer) {\n\t\t\tPointer.proxifyValue(this);\n\t\t\tthis.#_pointer = Pointer.getByValue(this)!;\n\t\t}\n\t\treturn this.#_pointer;\n\t}\n\n\tstatic async from<V>(values: readonly V[]) {\n\t\tconst set = $$(new StorageSet<V>());\n\t\tfor (const v of values) await set.add(v);\n\t\treturn set;\n\t}\n\n\tget _prefix() {\n\t\tif (!this.#prefix) this.#prefix = 'dxset::'+this.#pointer.idString()+'.';\n\t\treturn this.#prefix;\n\t}\n\n\tasync add(value: V) {\n\t\tconst storage_key = await this.getStorageKey(value);\n\t\tif (await this._has(storage_key)) return this; // already exists\n\t\tawait this._add(storage_key, null);\n\t\treturn this;\n\t}\n\tprotected async _add(storage_key:string, value:V|null) {\n\t\t// proxify value\n\t\tif (!this.allowNonPointerObjectValues) {\n\t\t\tvalue = this.#pointer.proxifyChild(\"\", value);\n\t\t}\n\t\tthis.activateCacheTimeout(storage_key);\n\t\tconst res = await Storage.setItem(storage_key, value);\n\t\tthis.#pointer.callObservers(value, VOID, ReactiveValue.UPDATE_TYPE.ADD)\n\t\treturn res;\n\t}\n\n\tasync has(value: V): Promise<boolean> {\n\t\tconst storage_key = await this.getStorageKey(value);\n\t\treturn this._has(storage_key);\n\t}\n\tprotected _has(storage_key:string) {\n\t\tthis.handleBeforeNonReferencableGet();\n\t\treturn Storage.hasItem(storage_key)\n\t}\n\n\tasync delete(value: V) {\n\t\tconst storage_key = await this.getStorageKey(value);\n\t\treturn this._delete(storage_key, value);\n\t}\n\tprotected async _delete(storage_key:string, value: V) {\n\t\tconst res = await Storage.removeItem(storage_key)\n\t\tthis.#pointer.callObservers(VOID, value, ReactiveValue.UPDATE_TYPE.DELETE);\n\t\treturn res;\n\t}\n\n\tprotected activateCacheTimeout(storage_key:string){\n\t\tsetTimeout(()=>{\n\t\t\tStorage.cache.delete(storage_key)\n\t\t}, this.cacheTimeout);\n\t}\n\n\tprotected async getStorageKey(value: V) {\n\t\tconst keyHash = await Compiler.getUniqueValueIdentifier(value);\n\t\t// @ts-ignore DX_PTR\n\t\treturn this._prefix + keyHash;\n\t}\n\n\tasync clear() {\n\t\tconst promises = [];\n\t\tfor (const key of await Storage.getItemKeysStartingWith(this._prefix)) {\n\t\t\tpromises.push(await Storage.removeItem(key));\n\t\t}\n\t\tawait Promise.all(promises);\n\t\tthis.#pointer.callObservers(VOID, VOID, ReactiveValue.UPDATE_TYPE.CLEAR)\n\t}\n\n\tprotected handleBeforeNonReferencableGet() {\n\t\tthis.#pointer.handleBeforeNonReferencableGet();\n\t}\n\n}\n\n/**\n * Set that outsources values to storage.\n * The API is similar to the JS Set API, but all methods are async.\n */\nexport class StorageSet<V> extends StorageWeakSet<V> {\n\n\t/**\n\t * Create a new StorageSet instance with the given value type.\n\t * @param type Class or DATEX Type of the values\n\t */\n\tstatic override of<V>(type: Class<V>|Type<V>): StorageSet<V> {\n\t\treturn super.of(type) as StorageSet<V>;\n\t}\n\n\t#size?: number;\n\n\tget size() {\n\t\tthis.handleBeforeNonReferencableGet();\n\t\tif (this.#size == undefined) throw new Error(\"size not yet available. use getSize() instead\");\n\t\treturn this.#size;\n\t}\n\n\tasync getSize() {\n\t\tthis.handleBeforeNonReferencableGet();\n\t\tif (this.#size != undefined) return this.#size;\n\t\telse {\n\t\t\tawait this.#determineSizeFromStorage(); \n\t\t\treturn this.#size!\n\t\t}\n\t}\n\n\t/**\n\t * Sets this.#size to the correct value determined from storage.\n\t */\n\tasync #determineSizeFromStorage() {\n\t\tconst calculatedSize = await Storage.getItemCountStartingWith(this._prefix);\n\t\tthis.#updateSize(calculatedSize);\n\t}\n\n\t#updateSize(newSize: number) {\n\t\tthis.#size = newSize;\n\t}\n\n\tasync #incrementSize() {\n\t\tthis.#updateSize(this.#size == undefined ? await this.getSize() : this.#size + 1);\n\t}\n\t\n\tasync #decrementSize() {\n\t\tthis.#updateSize(this.#size == undefined ? await this.getSize() : this.#size - 1);\n\t}\n\n\n\t/**\n\t * Appends a new value to the StorageWeakSet.\n\t */\n\toverride async add(value: V) {\n\t\tconst storage_key = await this.getStorageKey(value);\n\t\tif (await this._has(storage_key)) return this; // already exists\n\t\tawait this._add(storage_key, value);\n\t\tawait this.#incrementSize();\n\t\treturn this;\n\t}\n\n\toverride async delete(value: V) {\n\t\tconst wasDeleted = await super.delete(value);\n\t\tif (wasDeleted) await this.#decrementSize();\n\t\treturn wasDeleted;\n\t}\n\n\toverride async clear(): Promise<void> {\n\t\tawait super.clear();\n\t\tthis.#updateSize(0);\n\t}\n\n\t/**\n\t * Async iterator that returns all keys.\n\t */\n\tkeys() {\n\t\treturn this[Symbol.asyncIterator]()\n\t}\n\n\t/**\n\t * Returns an array containing all keys.\n\t * This can be used to iterate over the keys without using a (for await of) loop.\n\t */\n\tasync keysArray() {\n\t\tconst keys = [];\n\t\tfor await (const key of this.keys()) keys.push(key);\n\t\treturn keys;\n\t}\n\n\t/**\n\t * Async iterator that returns all values.\n\t */\n\tvalues() {\n\t\treturn this[Symbol.asyncIterator]()\n\t}\n\n\t/**\n\t * Returns an array containing all values.\n\t * This can be used to iterate over the values without using a (for await of) loop.\n\t */\n\tasync valuesArray() {\n\t\tconst values = [];\n\t\tfor await (const value of this.values()) values.push(value);\n\t\treturn values;\n\t}\n\n\t/**\n\t * Async iterator that returns all entries.\n\t */\n\tentries() {\n\t\tthis.handleBeforeNonReferencableGet();\n\t\tconst self = this;\n\t\treturn (async function*(){\n\t\t\tconst keyGenerator = await Storage.getItemKeysStartingWith(self._prefix);\n\t\t\t\n\t\t\tfor (const key of keyGenerator) {\n\t\t\t\tconst value = await Storage.getItem(key);\n\t\t\t\tyield (<[V,V]> [value,value]);\n\t\t\t}\n\t\t})()\n\t}\n\n\t/**\n\t * Returns an array containing all entries.\n\t * This can be used to iterate over the entries without using a (for await of) loop.\n\t */\n\tasync entriesArray() {\n\t\tconst entries = [];\n\t\tfor await (const entry of this.entries()) entries.push(entry);\n\t\treturn entries;\n\t}\n\n\tasync *[Symbol.asyncIterator]() {\n\t\tthis.handleBeforeNonReferencableGet();\n\t\tconst keyGenerator = await Storage.getItemKeysStartingWith(this._prefix);\n\t\t\n\t\tfor (const key of keyGenerator) {\n\t\t\tconst value = await Storage.getItem(key);\n\t\t\tyield (<V> value);\n\t\t}\n\t}\n\n\tmatch<Options extends MatchOptions, T extends V & object>(matchInput: MatchInput<T>, options?: Options, valueType?:Class<T>|Type<T>): Promise<MatchResult<T, Options>> {\n\t\tthis.handleBeforeNonReferencableGet();\n\t\tvalueType ??= this.type as any;\n\t\tif (!valueType) throw new Error(\"Cannot determine value type. Please provide a valueType parameter to match()\");\n\t\treturn match(this as unknown as StorageSet<T>, valueType, matchInput, options)\n\t}\n}"],"names":["Compiler","VOID","Pointer","Storage","match","Type","ReactiveValue","StorageWeakSet","of","type","storageSet","getClassDatexType","_type","namespace","name","get","cacheTimeout","allowNonPointerObjectValues","getByValue","proxifyValue","from","values","set","$$","StorageSet","v","add","_prefix","idString","value","storage_key","getStorageKey","_has","_add","proxifyChild","activateCacheTimeout","res","setItem","callObservers","UPDATE_TYPE","ADD","has","handleBeforeNonReferencableGet","hasItem","delete","_delete","removeItem","DELETE","setTimeout","cache","keyHash","getUniqueValueIdentifier","clear","promises","key","getItemKeysStartingWith","push","Promise","all","CLEAR","Symbol","asyncIterator","size","undefined","Error","getSize","calculatedSize","getItemCountStartingWith","newSize","wasDeleted","keys","keysArray","valuesArray","entries","self","getItem","entriesArray","entry","matchInput","options","valueType"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"storage-set.ts"}