@instantdb/core 0.22.97 → 0.22.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/commonjs/Connection.js +50 -51
  2. package/dist/commonjs/Connection.js.map +1 -1
  3. package/dist/commonjs/InMemoryStorage.js +13 -32
  4. package/dist/commonjs/InMemoryStorage.js.map +1 -1
  5. package/dist/commonjs/IndexedDBStorage.js +193 -217
  6. package/dist/commonjs/IndexedDBStorage.js.map +1 -1
  7. package/dist/commonjs/InstantError.js +1 -0
  8. package/dist/commonjs/InstantError.js.map +1 -1
  9. package/dist/commonjs/Reactor.js +566 -610
  10. package/dist/commonjs/Reactor.js.map +1 -1
  11. package/dist/commonjs/StorageAPI.js +51 -70
  12. package/dist/commonjs/StorageAPI.js.map +1 -1
  13. package/dist/commonjs/SyncTable.js +68 -81
  14. package/dist/commonjs/SyncTable.js.map +1 -1
  15. package/dist/commonjs/WindowNetworkListener.js +2 -13
  16. package/dist/commonjs/WindowNetworkListener.js.map +1 -1
  17. package/dist/commonjs/__types__/fieldsTypeTest.js +8 -16
  18. package/dist/commonjs/__types__/fieldsTypeTest.js.map +1 -1
  19. package/dist/commonjs/__types__/useDatesTypeTest.js +3 -6
  20. package/dist/commonjs/__types__/useDatesTypeTest.js.map +1 -1
  21. package/dist/commonjs/authAPI.js +62 -79
  22. package/dist/commonjs/authAPI.js.map +1 -1
  23. package/dist/commonjs/createRouteHandler.js +5 -15
  24. package/dist/commonjs/createRouteHandler.js.map +1 -1
  25. package/dist/commonjs/datalog.js +1 -1
  26. package/dist/commonjs/datalog.js.map +1 -1
  27. package/dist/commonjs/devtool.js +26 -8
  28. package/dist/commonjs/devtool.js.map +1 -1
  29. package/dist/commonjs/framework.d.ts.map +1 -1
  30. package/dist/commonjs/framework.js +142 -152
  31. package/dist/commonjs/framework.js.map +1 -1
  32. package/dist/commonjs/index.js +204 -190
  33. package/dist/commonjs/index.js.map +1 -1
  34. package/dist/commonjs/instaml.js +44 -30
  35. package/dist/commonjs/instaml.js.map +1 -1
  36. package/dist/commonjs/instaql.js +25 -33
  37. package/dist/commonjs/instaql.js.map +1 -1
  38. package/dist/commonjs/parseSchemaFromJSON.js +6 -7
  39. package/dist/commonjs/parseSchemaFromJSON.js.map +1 -1
  40. package/dist/commonjs/presence.js +7 -8
  41. package/dist/commonjs/presence.js.map +1 -1
  42. package/dist/commonjs/queryValidation.js +1 -2
  43. package/dist/commonjs/queryValidation.js.map +1 -1
  44. package/dist/commonjs/schema.js +8 -6
  45. package/dist/commonjs/schema.js.map +1 -1
  46. package/dist/commonjs/schemaTypes.js +22 -3
  47. package/dist/commonjs/schemaTypes.js.map +1 -1
  48. package/dist/commonjs/store.js +29 -38
  49. package/dist/commonjs/store.js.map +1 -1
  50. package/dist/commonjs/transactionValidation.js +1 -2
  51. package/dist/commonjs/transactionValidation.js.map +1 -1
  52. package/dist/commonjs/utils/Deferred.js +3 -0
  53. package/dist/commonjs/utils/Deferred.js.map +1 -1
  54. package/dist/commonjs/utils/PersistedObject.js +216 -233
  55. package/dist/commonjs/utils/PersistedObject.js.map +1 -1
  56. package/dist/commonjs/utils/fetch.js +9 -19
  57. package/dist/commonjs/utils/fetch.js.map +1 -1
  58. package/dist/commonjs/utils/linkIndex.js +2 -4
  59. package/dist/commonjs/utils/linkIndex.js.map +1 -1
  60. package/dist/commonjs/utils/object.js +1 -1
  61. package/dist/commonjs/utils/object.js.map +1 -1
  62. package/dist/esm/Connection.js +50 -51
  63. package/dist/esm/Connection.js.map +1 -1
  64. package/dist/esm/InMemoryStorage.js +13 -32
  65. package/dist/esm/InMemoryStorage.js.map +1 -1
  66. package/dist/esm/IndexedDBStorage.js +193 -217
  67. package/dist/esm/IndexedDBStorage.js.map +1 -1
  68. package/dist/esm/InstantError.js +1 -0
  69. package/dist/esm/InstantError.js.map +1 -1
  70. package/dist/esm/Reactor.js +566 -610
  71. package/dist/esm/Reactor.js.map +1 -1
  72. package/dist/esm/StorageAPI.js +51 -70
  73. package/dist/esm/StorageAPI.js.map +1 -1
  74. package/dist/esm/SyncTable.js +68 -81
  75. package/dist/esm/SyncTable.js.map +1 -1
  76. package/dist/esm/WindowNetworkListener.js +2 -13
  77. package/dist/esm/WindowNetworkListener.js.map +1 -1
  78. package/dist/esm/__types__/fieldsTypeTest.js +8 -16
  79. package/dist/esm/__types__/fieldsTypeTest.js.map +1 -1
  80. package/dist/esm/__types__/useDatesTypeTest.js +3 -6
  81. package/dist/esm/__types__/useDatesTypeTest.js.map +1 -1
  82. package/dist/esm/authAPI.js +62 -79
  83. package/dist/esm/authAPI.js.map +1 -1
  84. package/dist/esm/createRouteHandler.js +5 -15
  85. package/dist/esm/createRouteHandler.js.map +1 -1
  86. package/dist/esm/datalog.js +1 -1
  87. package/dist/esm/datalog.js.map +1 -1
  88. package/dist/esm/devtool.js +26 -8
  89. package/dist/esm/devtool.js.map +1 -1
  90. package/dist/esm/framework.d.ts.map +1 -1
  91. package/dist/esm/framework.js +142 -152
  92. package/dist/esm/framework.js.map +1 -1
  93. package/dist/esm/index.js +204 -190
  94. package/dist/esm/index.js.map +1 -1
  95. package/dist/esm/instaml.js +44 -30
  96. package/dist/esm/instaml.js.map +1 -1
  97. package/dist/esm/instaql.js +25 -33
  98. package/dist/esm/instaql.js.map +1 -1
  99. package/dist/esm/parseSchemaFromJSON.js +6 -7
  100. package/dist/esm/parseSchemaFromJSON.js.map +1 -1
  101. package/dist/esm/presence.js +7 -8
  102. package/dist/esm/presence.js.map +1 -1
  103. package/dist/esm/queryValidation.js +1 -2
  104. package/dist/esm/queryValidation.js.map +1 -1
  105. package/dist/esm/schema.js +8 -6
  106. package/dist/esm/schema.js.map +1 -1
  107. package/dist/esm/schemaTypes.js +22 -3
  108. package/dist/esm/schemaTypes.js.map +1 -1
  109. package/dist/esm/store.js +29 -38
  110. package/dist/esm/store.js.map +1 -1
  111. package/dist/esm/transactionValidation.js +1 -2
  112. package/dist/esm/transactionValidation.js.map +1 -1
  113. package/dist/esm/utils/Deferred.js +3 -0
  114. package/dist/esm/utils/Deferred.js.map +1 -1
  115. package/dist/esm/utils/PersistedObject.js +216 -233
  116. package/dist/esm/utils/PersistedObject.js.map +1 -1
  117. package/dist/esm/utils/fetch.js +9 -19
  118. package/dist/esm/utils/fetch.js.map +1 -1
  119. package/dist/esm/utils/linkIndex.js +2 -4
  120. package/dist/esm/utils/linkIndex.js.map +1 -1
  121. package/dist/esm/utils/object.js +1 -1
  122. package/dist/esm/utils/object.js.map +1 -1
  123. package/dist/standalone/index.js +2610 -2367
  124. package/dist/standalone/index.umd.cjs +3 -3
  125. package/package.json +2 -2
  126. package/src/framework.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PersistedObject.js","sourceRoot":"","sources":["../../../src/utils/PersistedObject.ts"],"names":[],"mappings":"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","sourcesContent":["// PersistedObjects save data outside of memory.\n//\n// When we load a persisted object, it's possible we call `set`\n// before we finish loading. To address we handle set in two ways:\n//\n// 1. Before load\n// We simply update currentValue in memory\n//\n// 2. After load\n// We update currentValue in memory and in storage\n//\n// Each PersistedObject provides it's own `onMerge`\n// function to handle the merge of data from storage and memory\n// on load\n\n// Uses `requestIdleCallback` if available, otherwise calls the\n// callback immediately\n\nimport { create } from 'mutative';\nimport type { Logger } from './log.ts';\n\nfunction safeIdleCallback(cb, timeout: number) {\n if (typeof requestIdleCallback === 'undefined') {\n cb();\n } else {\n requestIdleCallback(cb, { timeout });\n }\n}\n\nexport const META_KEY = '__meta';\n\nexport type ObjectMeta = { createdAt: number; updatedAt: number; size: number };\n\nexport type Meta<K extends string> = {\n objects: Record<K, ObjectMeta>;\n};\n\nexport type StorageInterfaceStoreName = 'kv' | 'querySubs' | 'syncSubs';\n\nexport abstract class StorageInterface {\n constructor(appId: string, storeName: StorageInterfaceStoreName) {}\n abstract getItem(key: string): Promise<any>;\n abstract removeItem(key: string): Promise<void>;\n abstract multiSet(keyValuePairs: Array<[string, any]>): Promise<void>;\n abstract getAllKeys(): Promise<string[]>;\n}\n\nexport type GCOpts = {\n maxSize: number;\n maxAgeMs: number;\n maxEntries: number;\n};\n\nexport type Opts<K, T, SerializedT> = {\n persister: StorageInterface;\n /**\n * Merges data from storage with in-memory value on load.\n * The value returned from merge will become the current value.\n */\n merge: (\n key: K,\n fromStorage: T | null | undefined,\n inMemoryValue: T | null | undefined,\n ) => T;\n serialize: (key: K, input: T) => SerializedT;\n parse: (key: K, value: SerializedT) => T;\n objectSize: (x: SerializedT) => number;\n logger: Logger;\n gc: GCOpts | null | undefined;\n saveThrottleMs?: number | null | undefined;\n idleCallbackMaxWaitMs?: number | null | undefined;\n preloadEntryCount?: number | null | undefined;\n};\n\nexport class PersistedObject<K extends string, T, SerializedT> {\n currentValue: Record<K, T>;\n private _subs: ((value: Record<K, T>) => void)[] = [];\n private _persister: StorageInterface;\n private _merge: (key: K, fromStorage: T, inMemoryValue: T) => T;\n private serialize: (key: K, input: T) => SerializedT;\n private parse: (key: K, value: SerializedT) => T;\n private _saveThrottleMs: number;\n private _idleCallbackMaxWaitMs: number;\n private _nextSave: null | NodeJS.Timeout = null;\n private _nextGc: null | NodeJS.Timeout = null;\n private _pendingSaveKeys: Set<K> = new Set();\n private _loadedKeys: Set<K> = new Set();\n private _loadingKeys: Record<K, Promise<T>>;\n private _objectSize: (serializedObject: SerializedT) => number;\n private _log: Logger;\n\n onKeyLoaded: (key: string) => void | null | undefined;\n private _version = 0;\n private _meta: {\n isLoading: boolean;\n onLoadCbs: Array<() => void>;\n value: null | Meta<K>;\n error: null | Error;\n attempts: number;\n loadingPromise?: Promise<Meta<K>> | null | undefined;\n } = {\n isLoading: true,\n onLoadCbs: [],\n value: null,\n error: null,\n attempts: 0,\n };\n private _gcOpts: GCOpts | null | undefined;\n\n constructor(opts: Opts<K, T, SerializedT>) {\n this._persister = opts.persister;\n this._merge = opts.merge;\n this.serialize = opts.serialize;\n this.parse = opts.parse;\n this._objectSize = opts.objectSize;\n this._log = opts.logger;\n this._saveThrottleMs = opts.saveThrottleMs ?? 100;\n this._idleCallbackMaxWaitMs = opts.idleCallbackMaxWaitMs ?? 1000;\n this._gcOpts = opts.gc;\n this.currentValue = {} as Record<K, T>;\n this._loadedKeys = new Set();\n this._loadingKeys = {} as Record<K, Promise<T>>;\n this._initMeta();\n if (opts.preloadEntryCount) {\n this._preloadEntries(opts.preloadEntryCount);\n }\n }\n\n private async _initMeta() {\n if (this._meta.loadingPromise) {\n await this._meta.loadingPromise;\n }\n try {\n const p = this._persister.getItem(META_KEY);\n this._meta.loadingPromise = p;\n const v = await p;\n this._meta.isLoading = false;\n this._meta.error = null;\n this._meta.loadingPromise = null;\n this._meta.attempts = 0;\n const existingObjects = this._meta.value?.objects ?? {};\n const value = v ?? {};\n const objects = value.objects ?? {};\n // Merge the values from storage with in-memory values\n this._meta.value = {\n ...value,\n objects: { ...existingObjects, ...objects },\n } as Meta<K>;\n } catch (e) {\n this._meta.error = e;\n this._meta.attempts++;\n this._meta.loadingPromise = null;\n }\n }\n\n private async _getMeta(): Promise<Meta<K> | null> {\n if (this._meta.value) {\n return this._meta.value;\n }\n if (this._meta.loadingPromise) {\n await this._meta.loadingPromise;\n return this._meta.value;\n }\n this._initMeta();\n await this._meta.loadingPromise;\n return this._meta.value;\n }\n\n private async _refreshMeta(): Promise<Meta<K> | null> {\n await this._initMeta();\n return this._meta.value;\n }\n\n private async _preloadEntries(n: number) {\n const meta = await this.waitForMetaToLoad();\n if (!meta) return;\n const entries = Object.entries(meta.objects) as Array<[K, ObjectMeta]>;\n entries.sort(([_k_a, a_meta], [_k_b, b_meta]) => {\n return b_meta.updatedAt - a_meta.updatedAt;\n });\n for (const [k] of entries.slice(0, n)) {\n this._loadKey(k);\n }\n }\n\n private async _getFromStorage(key: K) {\n try {\n const data = await this._persister.getItem(key);\n if (!data) {\n return data;\n }\n const parsed = this.parse(key, data as SerializedT);\n return parsed;\n } catch (e) {\n console.error(`Unable to read from storage for key=${key}`, e);\n return null;\n }\n }\n\n public async waitForKeyToLoad(k: K) {\n if (this._loadedKeys.has(k)) {\n return this.currentValue[k];\n }\n await (this._loadingKeys[k] || this._loadKey(k));\n return this.currentValue[k];\n }\n\n // Used for tests\n public async waitForMetaToLoad() {\n return this._getMeta();\n }\n\n // Unloads the key so that it can be garbage collected, but does not\n // delete it. Removes the key from currentValue.\n public unloadKey(k: K) {\n this._loadedKeys.delete(k);\n delete this._loadingKeys[k];\n delete this.currentValue[k];\n }\n\n private async _loadKey(k: K) {\n if (this._loadedKeys.has(k) || k in this._loadingKeys) return;\n const p = this._getFromStorage(k);\n this._loadingKeys[k] = p;\n const value = await p;\n delete this._loadingKeys[k];\n this._loadedKeys.add(k);\n\n if (value) {\n const merged = this._merge(k, value, this.currentValue[k]);\n if (merged) {\n this.currentValue[k] = merged;\n }\n }\n this.onKeyLoaded && this.onKeyLoaded(k);\n }\n\n // Returns a promise with a number so that we can wait for flush\n // to finish in the tests. The number is the number of operations\n // it performed, but it's mostly there so that typescript will warn\n // us if we forget to retun the promise from the function.\n private _writeToStorage(opts?: {\n skipGc?: boolean | null | undefined;\n attempts?: number | null | undefined;\n }): Promise<number> {\n const promises: Promise<number>[] = [];\n const skipGc = opts?.skipGc;\n if (this._meta.isLoading) {\n // Wait for meta to load and try again, give it a delay so that\n // we don't spend too much time retrying\n const p: Promise<number> = new Promise((resolve, reject) => {\n setTimeout(\n () =>\n this._enqueuePersist(\n opts\n ? { ...opts, attempts: (opts.attempts || 0) + 1 }\n : { attempts: 1 },\n )\n .then(resolve)\n .catch(reject),\n 10 + (opts?.attempts ?? 0) * 1000,\n );\n });\n promises.push(p);\n return Promise.all(promises).then((vs) =>\n vs.reduce((acc, x) => acc + x, 0),\n );\n }\n const metaValue = this._meta.value;\n if (!metaValue) {\n // If it's not loading and we don't have the data, then there\n // must be an error and we're not going to be able to save until\n // the error is resolved elsewhere.\n return Promise.resolve(0);\n }\n const keysToDelete: K[] = [];\n const keysToUpdate: K[] = [];\n for (const k of this._pendingSaveKeys) {\n if (!(k in this.currentValue)) {\n keysToDelete.push(k);\n delete metaValue.objects[k];\n } else {\n keysToUpdate.push(k);\n }\n }\n\n for (const k of keysToDelete) {\n const p = this._persister.removeItem(k);\n promises.push(p.then(() => 1));\n this._loadedKeys.delete(k);\n this._pendingSaveKeys.delete(k);\n }\n\n const keysToLoad: K[] = [];\n\n const kvPairs: Array<[string, any]> = [[META_KEY, metaValue]];\n const metaObjects: Meta<K>['objects'] =\n metaValue.objects ?? ({} as Meta<K>['objects']);\n metaValue.objects = metaObjects;\n for (const k of keysToUpdate) {\n if (this._loadedKeys.has(k)) {\n const serializedV = this.serialize(k, this.currentValue[k]);\n kvPairs.push([k, serializedV]);\n const size = this._objectSize(serializedV);\n const m = metaObjects[k] ?? {\n createdAt: Date.now(),\n updatedAt: Date.now(),\n size,\n };\n m.updatedAt = Date.now();\n m.size = size;\n metaObjects[k] = m;\n this._pendingSaveKeys.delete(k);\n } else {\n keysToLoad.push(k);\n }\n }\n\n const p = this._persister.multiSet(kvPairs);\n promises.push(p.then(() => 1));\n\n // For the keys that haven't loaded, load the key then try\n // persisting again. We don't want to do any async work here\n // or else we might end up saving older copies of the data to\n // the store.\n for (const k of keysToLoad) {\n const p = this._loadKey(k).then(() => this._enqueuePersist(opts));\n promises.push(p);\n }\n\n if (!skipGc) {\n this.gc();\n }\n\n return Promise.all(promises).then((vs) => {\n return vs.reduce((acc, x) => acc + x, 0);\n });\n }\n\n async flush() {\n if (!this._nextSave) {\n return;\n }\n clearTimeout(this._nextSave);\n this._nextSave = null;\n const p = this._writeToStorage();\n return p;\n }\n\n private async _gc() {\n if (!this._gcOpts) {\n return;\n }\n const keys = new Set(await this._persister.getAllKeys());\n keys.delete(META_KEY);\n\n // Keys we can't delete\n const sacredKeys = new Set(Object.keys(this.currentValue));\n for (const k of Object.keys(this._loadingKeys)) {\n sacredKeys.add(k);\n }\n for (const k of this._loadedKeys) {\n sacredKeys.add(k);\n }\n\n // Refresh meta from the store so that we're less likely to\n // clobber data from other tabs\n const meta = await this._refreshMeta();\n if (!meta) {\n this._log.info('Could not gc because we were not able to load meta');\n return;\n }\n\n const promises: Promise<any>[] = [];\n\n const deets = {\n gcOpts: this._gcOpts,\n keys,\n sacredKeys,\n removed: [] as string[],\n metaRemoved: [],\n removedMissingCount: 0,\n removedOldCount: 0,\n removedThresholdCount: 0,\n removedSizeCount: 0,\n };\n\n // First, remove all keys we don't know about\n for (const key of keys) {\n if (sacredKeys.has(key) || key in meta.objects) {\n continue;\n }\n this._log.info('Lost track of key in meta', key);\n promises.push(this._persister.removeItem(key));\n deets.removed.push(key);\n deets.removedMissingCount++;\n }\n\n // Remove anything over the max age\n const now = Date.now();\n for (const [k, m] of Object.entries(meta.objects)) {\n if (\n !sacredKeys.has(k) &&\n (m as ObjectMeta).updatedAt < now - this._gcOpts.maxAgeMs\n ) {\n promises.push(this._persister.removeItem(k));\n delete meta.objects[k];\n deets.removed.push(k);\n deets.removedOldCount++;\n }\n }\n\n // Keep queries under max queries\n const maxEntries = Object.entries(meta.objects) as Array<[K, ObjectMeta]>;\n maxEntries.sort(([_k_a, a_meta], [_k_b, b_meta]) => {\n return a_meta.updatedAt - b_meta.updatedAt;\n });\n\n const deletableMaxEntries = maxEntries.filter(([x]) => !sacredKeys.has(x));\n if (maxEntries.length > this._gcOpts.maxEntries) {\n for (const [k] of deletableMaxEntries.slice(\n 0,\n maxEntries.length - this._gcOpts.maxEntries,\n )) {\n promises.push(this._persister.removeItem(k));\n delete meta.objects[k];\n deets.removed.push(k);\n deets.removedThresholdCount++;\n }\n }\n\n // Remove oldest entries until we are under max size\n const delEntries = Object.entries(meta.objects) as Array<[K, ObjectMeta]>;\n delEntries.sort(([_k_a, a_meta], [_k_b, b_meta]) => {\n return a_meta.updatedAt - b_meta.updatedAt;\n });\n const deletableDelEntries = delEntries.filter(([x]) => !sacredKeys.has(x));\n\n let currentSize = delEntries.reduce((acc, [_k, m]) => {\n return acc + m.size;\n }, 0);\n\n while (\n currentSize > 0 &&\n currentSize > this._gcOpts.maxSize &&\n deletableDelEntries.length\n ) {\n const [[k, m]] = deletableDelEntries.splice(0, 1);\n currentSize -= m.size;\n promises.push(this._persister.removeItem(k));\n delete meta.objects[k];\n deets.removed.push(k);\n deets.removedSizeCount++;\n }\n\n // Update meta to remove keys that are no longer in the store\n for (const k of Object.keys(meta.objects)) {\n if (!keys.has(k) && !sacredKeys.has(k)) {\n delete meta.objects[k];\n }\n }\n\n if (deets.removed.length || deets.metaRemoved.length) {\n // Trigger a flush of the meta\n promises.push(this._enqueuePersist({ skipGc: true }));\n }\n\n this._log.info('Completed GC', deets);\n\n await Promise.all(promises);\n return deets;\n }\n\n // Schedules a GC to run in one minute (unless it is already scheduled)\n gc() {\n if (this._nextGc) {\n return;\n }\n this._nextGc = setTimeout(\n () => {\n safeIdleCallback(() => {\n this._nextGc = null;\n this._gc();\n }, 30 * 1000);\n },\n // 1 minute + some jitter to keep multiple tabs from running at same time\n 1000 * 60 + Math.random() * 500,\n );\n }\n\n private _enqueuePersist(opts?: {\n skipGc?: boolean | null | undefined;\n attempts?: number | null | undefined;\n }): Promise<number> {\n return new Promise((resolve, reject) => {\n if (this._nextSave) {\n resolve(0);\n return;\n }\n\n this._nextSave = setTimeout(() => {\n safeIdleCallback(() => {\n this._nextSave = null;\n this._writeToStorage(opts).then(resolve).catch(reject);\n }, this._idleCallbackMaxWaitMs);\n }, this._saveThrottleMs);\n });\n }\n\n version() {\n return this._version;\n }\n\n // Takes a function that updates the store in place.\n // Uses `mutative` to get a list of keys that were changed\n // so that we know which entries we need to persist to the store.\n public updateInPlace(f: (prev: Record<string, T>) => void) {\n this._version++;\n const [state, patches] = create(this.currentValue, f, {\n enablePatches: true,\n });\n for (const patch of patches) {\n const k = patch.path[0];\n if (k && typeof k === 'string') {\n this._pendingSaveKeys.add(k as K);\n if (!this._loadedKeys.has(k as K)) {\n this._loadKey(k as K);\n }\n }\n }\n\n this.currentValue = state;\n this._enqueuePersist();\n for (const cb of this._subs) {\n cb(this.currentValue);\n }\n return state;\n }\n\n public subscribe(cb: (value: Record<K, T>) => void) {\n this._subs.push(cb);\n cb(this.currentValue);\n\n return () => {\n this._subs = this._subs.filter((x) => x !== cb);\n };\n }\n}\n"]}
1
+ {"version":3,"file":"PersistedObject.js","sourceRoot":"","sources":["../../../src/utils/PersistedObject.ts"],"names":[],"mappings":"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","sourcesContent":["// PersistedObjects save data outside of memory.\n//\n// When we load a persisted object, it's possible we call `set`\n// before we finish loading. To address we handle set in two ways:\n//\n// 1. Before load\n// We simply update currentValue in memory\n//\n// 2. After load\n// We update currentValue in memory and in storage\n//\n// Each PersistedObject provides it's own `onMerge`\n// function to handle the merge of data from storage and memory\n// on load\n\n// Uses `requestIdleCallback` if available, otherwise calls the\n// callback immediately\n\nimport { create } from 'mutative';\nimport type { Logger } from './log.ts';\n\nfunction safeIdleCallback(cb, timeout: number) {\n if (typeof requestIdleCallback === 'undefined') {\n cb();\n } else {\n requestIdleCallback(cb, { timeout });\n }\n}\n\nexport const META_KEY = '__meta';\n\nexport type ObjectMeta = { createdAt: number; updatedAt: number; size: number };\n\nexport type Meta<K extends string> = {\n objects: Record<K, ObjectMeta>;\n};\n\nexport type StorageInterfaceStoreName = 'kv' | 'querySubs' | 'syncSubs';\n\nexport abstract class StorageInterface {\n constructor(appId: string, storeName: StorageInterfaceStoreName) {}\n abstract getItem(key: string): Promise<any>;\n abstract removeItem(key: string): Promise<void>;\n abstract multiSet(keyValuePairs: Array<[string, any]>): Promise<void>;\n abstract getAllKeys(): Promise<string[]>;\n}\n\nexport type GCOpts = {\n maxSize: number;\n maxAgeMs: number;\n maxEntries: number;\n};\n\nexport type Opts<K, T, SerializedT> = {\n persister: StorageInterface;\n /**\n * Merges data from storage with in-memory value on load.\n * The value returned from merge will become the current value.\n */\n merge: (\n key: K,\n fromStorage: T | null | undefined,\n inMemoryValue: T | null | undefined,\n ) => T;\n serialize: (key: K, input: T) => SerializedT;\n parse: (key: K, value: SerializedT) => T;\n objectSize: (x: SerializedT) => number;\n logger: Logger;\n gc: GCOpts | null | undefined;\n saveThrottleMs?: number | null | undefined;\n idleCallbackMaxWaitMs?: number | null | undefined;\n preloadEntryCount?: number | null | undefined;\n};\n\nexport class PersistedObject<K extends string, T, SerializedT> {\n currentValue: Record<K, T>;\n private _subs: ((value: Record<K, T>) => void)[] = [];\n private _persister: StorageInterface;\n private _merge: (key: K, fromStorage: T, inMemoryValue: T) => T;\n private serialize: (key: K, input: T) => SerializedT;\n private parse: (key: K, value: SerializedT) => T;\n private _saveThrottleMs: number;\n private _idleCallbackMaxWaitMs: number;\n private _nextSave: null | NodeJS.Timeout = null;\n private _nextGc: null | NodeJS.Timeout = null;\n private _pendingSaveKeys: Set<K> = new Set();\n private _loadedKeys: Set<K> = new Set();\n private _loadingKeys: Record<K, Promise<T>>;\n private _objectSize: (serializedObject: SerializedT) => number;\n private _log: Logger;\n\n onKeyLoaded: (key: string) => void | null | undefined;\n private _version = 0;\n private _meta: {\n isLoading: boolean;\n onLoadCbs: Array<() => void>;\n value: null | Meta<K>;\n error: null | Error;\n attempts: number;\n loadingPromise?: Promise<Meta<K>> | null | undefined;\n } = {\n isLoading: true,\n onLoadCbs: [],\n value: null,\n error: null,\n attempts: 0,\n };\n private _gcOpts: GCOpts | null | undefined;\n\n constructor(opts: Opts<K, T, SerializedT>) {\n this._persister = opts.persister;\n this._merge = opts.merge;\n this.serialize = opts.serialize;\n this.parse = opts.parse;\n this._objectSize = opts.objectSize;\n this._log = opts.logger;\n this._saveThrottleMs = opts.saveThrottleMs ?? 100;\n this._idleCallbackMaxWaitMs = opts.idleCallbackMaxWaitMs ?? 1000;\n this._gcOpts = opts.gc;\n this.currentValue = {} as Record<K, T>;\n this._loadedKeys = new Set();\n this._loadingKeys = {} as Record<K, Promise<T>>;\n this._initMeta();\n if (opts.preloadEntryCount) {\n this._preloadEntries(opts.preloadEntryCount);\n }\n }\n\n private async _initMeta() {\n if (this._meta.loadingPromise) {\n await this._meta.loadingPromise;\n }\n try {\n const p = this._persister.getItem(META_KEY);\n this._meta.loadingPromise = p;\n const v = await p;\n this._meta.isLoading = false;\n this._meta.error = null;\n this._meta.loadingPromise = null;\n this._meta.attempts = 0;\n const existingObjects = this._meta.value?.objects ?? {};\n const value = v ?? {};\n const objects = value.objects ?? {};\n // Merge the values from storage with in-memory values\n this._meta.value = {\n ...value,\n objects: { ...existingObjects, ...objects },\n } as Meta<K>;\n } catch (e) {\n this._meta.error = e;\n this._meta.attempts++;\n this._meta.loadingPromise = null;\n }\n }\n\n private async _getMeta(): Promise<Meta<K> | null> {\n if (this._meta.value) {\n return this._meta.value;\n }\n if (this._meta.loadingPromise) {\n await this._meta.loadingPromise;\n return this._meta.value;\n }\n this._initMeta();\n await this._meta.loadingPromise;\n return this._meta.value;\n }\n\n private async _refreshMeta(): Promise<Meta<K> | null> {\n await this._initMeta();\n return this._meta.value;\n }\n\n private async _preloadEntries(n: number) {\n const meta = await this.waitForMetaToLoad();\n if (!meta) return;\n const entries = Object.entries(meta.objects) as Array<[K, ObjectMeta]>;\n entries.sort(([_k_a, a_meta], [_k_b, b_meta]) => {\n return b_meta.updatedAt - a_meta.updatedAt;\n });\n for (const [k] of entries.slice(0, n)) {\n this._loadKey(k);\n }\n }\n\n private async _getFromStorage(key: K) {\n try {\n const data = await this._persister.getItem(key);\n if (!data) {\n return data;\n }\n const parsed = this.parse(key, data as SerializedT);\n return parsed;\n } catch (e) {\n console.error(`Unable to read from storage for key=${key}`, e);\n return null;\n }\n }\n\n public async waitForKeyToLoad(k: K) {\n if (this._loadedKeys.has(k)) {\n return this.currentValue[k];\n }\n await (this._loadingKeys[k] || this._loadKey(k));\n return this.currentValue[k];\n }\n\n // Used for tests\n public async waitForMetaToLoad() {\n return this._getMeta();\n }\n\n // Unloads the key so that it can be garbage collected, but does not\n // delete it. Removes the key from currentValue.\n public unloadKey(k: K) {\n this._loadedKeys.delete(k);\n delete this._loadingKeys[k];\n delete this.currentValue[k];\n }\n\n private async _loadKey(k: K) {\n if (this._loadedKeys.has(k) || k in this._loadingKeys) return;\n const p = this._getFromStorage(k);\n this._loadingKeys[k] = p;\n const value = await p;\n delete this._loadingKeys[k];\n this._loadedKeys.add(k);\n\n if (value) {\n const merged = this._merge(k, value, this.currentValue[k]);\n if (merged) {\n this.currentValue[k] = merged;\n }\n }\n this.onKeyLoaded && this.onKeyLoaded(k);\n }\n\n // Returns a promise with a number so that we can wait for flush\n // to finish in the tests. The number is the number of operations\n // it performed, but it's mostly there so that typescript will warn\n // us if we forget to retun the promise from the function.\n private _writeToStorage(opts?: {\n skipGc?: boolean | null | undefined;\n attempts?: number | null | undefined;\n }): Promise<number> {\n const promises: Promise<number>[] = [];\n const skipGc = opts?.skipGc;\n if (this._meta.isLoading) {\n // Wait for meta to load and try again, give it a delay so that\n // we don't spend too much time retrying\n const p: Promise<number> = new Promise((resolve, reject) => {\n setTimeout(\n () =>\n this._enqueuePersist(\n opts\n ? { ...opts, attempts: (opts.attempts || 0) + 1 }\n : { attempts: 1 },\n )\n .then(resolve)\n .catch(reject),\n 10 + (opts?.attempts ?? 0) * 1000,\n );\n });\n promises.push(p);\n return Promise.all(promises).then((vs) =>\n vs.reduce((acc, x) => acc + x, 0),\n );\n }\n const metaValue = this._meta.value;\n if (!metaValue) {\n // If it's not loading and we don't have the data, then there\n // must be an error and we're not going to be able to save until\n // the error is resolved elsewhere.\n return Promise.resolve(0);\n }\n const keysToDelete: K[] = [];\n const keysToUpdate: K[] = [];\n for (const k of this._pendingSaveKeys) {\n if (!(k in this.currentValue)) {\n keysToDelete.push(k);\n delete metaValue.objects[k];\n } else {\n keysToUpdate.push(k);\n }\n }\n\n for (const k of keysToDelete) {\n const p = this._persister.removeItem(k);\n promises.push(p.then(() => 1));\n this._loadedKeys.delete(k);\n this._pendingSaveKeys.delete(k);\n }\n\n const keysToLoad: K[] = [];\n\n const kvPairs: Array<[string, any]> = [[META_KEY, metaValue]];\n const metaObjects: Meta<K>['objects'] =\n metaValue.objects ?? ({} as Meta<K>['objects']);\n metaValue.objects = metaObjects;\n for (const k of keysToUpdate) {\n if (this._loadedKeys.has(k)) {\n const serializedV = this.serialize(k, this.currentValue[k]);\n kvPairs.push([k, serializedV]);\n const size = this._objectSize(serializedV);\n const m = metaObjects[k] ?? {\n createdAt: Date.now(),\n updatedAt: Date.now(),\n size,\n };\n m.updatedAt = Date.now();\n m.size = size;\n metaObjects[k] = m;\n this._pendingSaveKeys.delete(k);\n } else {\n keysToLoad.push(k);\n }\n }\n\n const p = this._persister.multiSet(kvPairs);\n promises.push(p.then(() => 1));\n\n // For the keys that haven't loaded, load the key then try\n // persisting again. We don't want to do any async work here\n // or else we might end up saving older copies of the data to\n // the store.\n for (const k of keysToLoad) {\n const p = this._loadKey(k).then(() => this._enqueuePersist(opts));\n promises.push(p);\n }\n\n if (!skipGc) {\n this.gc();\n }\n\n return Promise.all(promises).then((vs) => {\n return vs.reduce((acc, x) => acc + x, 0);\n });\n }\n\n async flush() {\n if (!this._nextSave) {\n return;\n }\n clearTimeout(this._nextSave);\n this._nextSave = null;\n const p = this._writeToStorage();\n return p;\n }\n\n private async _gc() {\n if (!this._gcOpts) {\n return;\n }\n const keys = new Set(await this._persister.getAllKeys());\n keys.delete(META_KEY);\n\n // Keys we can't delete\n const sacredKeys = new Set(Object.keys(this.currentValue));\n for (const k of Object.keys(this._loadingKeys)) {\n sacredKeys.add(k);\n }\n for (const k of this._loadedKeys) {\n sacredKeys.add(k);\n }\n\n // Refresh meta from the store so that we're less likely to\n // clobber data from other tabs\n const meta = await this._refreshMeta();\n if (!meta) {\n this._log.info('Could not gc because we were not able to load meta');\n return;\n }\n\n const promises: Promise<any>[] = [];\n\n const deets = {\n gcOpts: this._gcOpts,\n keys,\n sacredKeys,\n removed: [] as string[],\n metaRemoved: [],\n removedMissingCount: 0,\n removedOldCount: 0,\n removedThresholdCount: 0,\n removedSizeCount: 0,\n };\n\n // First, remove all keys we don't know about\n for (const key of keys) {\n if (sacredKeys.has(key) || key in meta.objects) {\n continue;\n }\n this._log.info('Lost track of key in meta', key);\n promises.push(this._persister.removeItem(key));\n deets.removed.push(key);\n deets.removedMissingCount++;\n }\n\n // Remove anything over the max age\n const now = Date.now();\n for (const [k, m] of Object.entries(meta.objects)) {\n if (\n !sacredKeys.has(k) &&\n (m as ObjectMeta).updatedAt < now - this._gcOpts.maxAgeMs\n ) {\n promises.push(this._persister.removeItem(k));\n delete meta.objects[k];\n deets.removed.push(k);\n deets.removedOldCount++;\n }\n }\n\n // Keep queries under max queries\n const maxEntries = Object.entries(meta.objects) as Array<[K, ObjectMeta]>;\n maxEntries.sort(([_k_a, a_meta], [_k_b, b_meta]) => {\n return a_meta.updatedAt - b_meta.updatedAt;\n });\n\n const deletableMaxEntries = maxEntries.filter(([x]) => !sacredKeys.has(x));\n if (maxEntries.length > this._gcOpts.maxEntries) {\n for (const [k] of deletableMaxEntries.slice(\n 0,\n maxEntries.length - this._gcOpts.maxEntries,\n )) {\n promises.push(this._persister.removeItem(k));\n delete meta.objects[k];\n deets.removed.push(k);\n deets.removedThresholdCount++;\n }\n }\n\n // Remove oldest entries until we are under max size\n const delEntries = Object.entries(meta.objects) as Array<[K, ObjectMeta]>;\n delEntries.sort(([_k_a, a_meta], [_k_b, b_meta]) => {\n return a_meta.updatedAt - b_meta.updatedAt;\n });\n const deletableDelEntries = delEntries.filter(([x]) => !sacredKeys.has(x));\n\n let currentSize = delEntries.reduce((acc, [_k, m]) => {\n return acc + m.size;\n }, 0);\n\n while (\n currentSize > 0 &&\n currentSize > this._gcOpts.maxSize &&\n deletableDelEntries.length\n ) {\n const [[k, m]] = deletableDelEntries.splice(0, 1);\n currentSize -= m.size;\n promises.push(this._persister.removeItem(k));\n delete meta.objects[k];\n deets.removed.push(k);\n deets.removedSizeCount++;\n }\n\n // Update meta to remove keys that are no longer in the store\n for (const k of Object.keys(meta.objects)) {\n if (!keys.has(k) && !sacredKeys.has(k)) {\n delete meta.objects[k];\n }\n }\n\n if (deets.removed.length || deets.metaRemoved.length) {\n // Trigger a flush of the meta\n promises.push(this._enqueuePersist({ skipGc: true }));\n }\n\n this._log.info('Completed GC', deets);\n\n await Promise.all(promises);\n return deets;\n }\n\n // Schedules a GC to run in one minute (unless it is already scheduled)\n gc() {\n if (this._nextGc) {\n return;\n }\n this._nextGc = setTimeout(\n () => {\n safeIdleCallback(() => {\n this._nextGc = null;\n this._gc();\n }, 30 * 1000);\n },\n // 1 minute + some jitter to keep multiple tabs from running at same time\n 1000 * 60 + Math.random() * 500,\n );\n }\n\n private _enqueuePersist(opts?: {\n skipGc?: boolean | null | undefined;\n attempts?: number | null | undefined;\n }): Promise<number> {\n return new Promise((resolve, reject) => {\n if (this._nextSave) {\n resolve(0);\n return;\n }\n\n this._nextSave = setTimeout(() => {\n safeIdleCallback(() => {\n this._nextSave = null;\n this._writeToStorage(opts).then(resolve).catch(reject);\n }, this._idleCallbackMaxWaitMs);\n }, this._saveThrottleMs);\n });\n }\n\n version() {\n return this._version;\n }\n\n // Takes a function that updates the store in place.\n // Uses `mutative` to get a list of keys that were changed\n // so that we know which entries we need to persist to the store.\n public updateInPlace(f: (prev: Record<string, T>) => void) {\n this._version++;\n const [state, patches] = create(this.currentValue, f, {\n enablePatches: true,\n });\n for (const patch of patches) {\n const k = patch.path[0];\n if (k && typeof k === 'string') {\n this._pendingSaveKeys.add(k as K);\n if (!this._loadedKeys.has(k as K)) {\n this._loadKey(k as K);\n }\n }\n }\n\n this.currentValue = state;\n this._enqueuePersist();\n for (const cb of this._subs) {\n cb(this.currentValue);\n }\n return state;\n }\n\n public subscribe(cb: (value: Record<K, T>) => void) {\n this._subs.push(cb);\n cb(this.currentValue);\n\n return () => {\n this._subs = this._subs.filter((x) => x !== cb);\n };\n }\n}\n"]}
@@ -1,22 +1,14 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.InstantAPIError = void 0;
13
4
  exports.jsonFetch = jsonFetch;
14
5
  const InstantError_ts_1 = require("../InstantError.js");
15
6
  class InstantAPIError extends InstantError_ts_1.InstantError {
7
+ body;
8
+ status;
16
9
  constructor(error) {
17
- var _a;
18
10
  // Create a descriptive message based on the error
19
- const message = ((_a = error.body) === null || _a === void 0 ? void 0 : _a.message) || `API Error (${error.status})`;
11
+ const message = error.body?.message || `API Error (${error.status})`;
20
12
  super(message, error.body.hint);
21
13
  const actualProto = new.target.prototype;
22
14
  if (Object.setPrototypeOf) {
@@ -35,13 +27,11 @@ class InstantAPIError extends InstantError_ts_1.InstantError {
35
27
  }
36
28
  }
37
29
  exports.InstantAPIError = InstantAPIError;
38
- function jsonFetch(input, init) {
39
- return __awaiter(this, void 0, void 0, function* () {
40
- const res = yield fetch(input, init);
41
- const json = yield res.json();
42
- return res.status === 200
43
- ? Promise.resolve(json)
44
- : Promise.reject(new InstantAPIError({ status: res.status, body: json }));
45
- });
30
+ async function jsonFetch(input, init) {
31
+ const res = await fetch(input, init);
32
+ const json = await res.json();
33
+ return res.status === 200
34
+ ? Promise.resolve(json)
35
+ : Promise.reject(new InstantAPIError({ status: res.status, body: json }));
46
36
  }
47
37
  //# sourceMappingURL=fetch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/utils/fetch.ts"],"names":[],"mappings":";;;;;;;;;;;;AA8GA,8BASC;AAvHD,wDAAkD;AAiFlD,MAAa,eAAgB,SAAQ,8BAAY;IAI/C,YAAY,KAAmB;;QAC7B,kDAAkD;QAClD,MAAM,OAAO,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,KAAI,cAAc,KAAK,CAAC,MAAM,GAAG,CAAC;QACrE,KAAK,CAAC,OAAO,EAAG,KAAK,CAAC,IAAY,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QAED,6DAA6D;QAC7D,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AA3BD,0CA2BC;AAED,SAAsB,SAAS,CAC7B,KAAkB,EAClB,IAA6B;;QAE7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG;YACvB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;CAAA","sourcesContent":["import { InstantError } from '../InstantError.ts';\n\ntype InstantIssueBody =\n | { type: 'param-missing'; message: string; hint: { in: string[] } }\n | { type: 'param-malformed'; message: string; hint: { in: string[] } }\n | {\n type: 'record-not-found';\n message: string;\n hint: { 'record-type': string };\n }\n | {\n type: 'record-not-unique';\n message: string;\n hint: { 'record-type': string };\n }\n | {\n type: 'validation-failed';\n message: string;\n hint: { 'data-type': string; errors: any[] };\n }\n | {\n type: 'record-expired';\n message: string;\n hint: { 'record-type': string };\n }\n | {\n type: 'record-foreign-key-invalid';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'record-check-violation';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'permission-denied';\n message: string;\n hint: { input: any; expected: string };\n }\n | {\n type: 'permission-evaluation-failed';\n message: string;\n hint: {\n rule: [string, string];\n error?: { type: string; message: string; hint: any };\n };\n }\n | {\n type: 'sql-raise';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'sql-exception';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'rate-limited';\n message: string;\n }\n | {\n type: 'session-missing';\n message: string;\n hint: { 'sess-id': string };\n }\n | {\n type: 'socket-missing';\n message: string;\n hint: { 'sess-id': string; 'exception-message'?: string };\n }\n | { type: undefined; [k: string]: any }\n | undefined;\n// Note that InstantIssueBody is not exported and is only necessary for making InstantAPIError\n// below to have all the members and typecheck as InstantIssue\nexport type InstantIssue = {\n body: InstantIssueBody;\n status: number;\n};\n\nexport class InstantAPIError extends InstantError {\n body: InstantIssueBody;\n status: number;\n\n constructor(error: InstantIssue) {\n // Create a descriptive message based on the error\n const message = error.body?.message || `API Error (${error.status})`;\n super(message, (error.body as any).hint);\n\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(this, actualProto);\n }\n\n // Maintain proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InstantAPIError);\n }\n\n this.name = 'InstantAPIError';\n this.status = error.status;\n this.body = error.body;\n }\n\n get [Symbol.toStringTag]() {\n return 'InstantAPIError';\n }\n}\n\nexport async function jsonFetch(\n input: RequestInfo,\n init: RequestInit | undefined,\n): Promise<any> {\n const res = await fetch(input, init);\n const json = await res.json();\n return res.status === 200\n ? Promise.resolve(json)\n : Promise.reject(new InstantAPIError({ status: res.status, body: json }));\n}\n"]}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/utils/fetch.ts"],"names":[],"mappings":";;;AA8GA,8BASC;AAvHD,wDAAkD;AAiFlD,MAAa,eAAgB,SAAQ,8BAAY;IAC/C,IAAI,CAAmB;IACvB,MAAM,CAAS;IAEf,YAAY,KAAmB;QAC7B,kDAAkD;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,cAAc,KAAK,CAAC,MAAM,GAAG,CAAC;QACrE,KAAK,CAAC,OAAO,EAAG,KAAK,CAAC,IAAY,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3C,CAAC;QAED,6DAA6D;QAC7D,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AA3BD,0CA2BC;AAEM,KAAK,UAAU,SAAS,CAC7B,KAAkB,EAClB,IAA6B;IAE7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG;QACvB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["import { InstantError } from '../InstantError.ts';\n\ntype InstantIssueBody =\n | { type: 'param-missing'; message: string; hint: { in: string[] } }\n | { type: 'param-malformed'; message: string; hint: { in: string[] } }\n | {\n type: 'record-not-found';\n message: string;\n hint: { 'record-type': string };\n }\n | {\n type: 'record-not-unique';\n message: string;\n hint: { 'record-type': string };\n }\n | {\n type: 'validation-failed';\n message: string;\n hint: { 'data-type': string; errors: any[] };\n }\n | {\n type: 'record-expired';\n message: string;\n hint: { 'record-type': string };\n }\n | {\n type: 'record-foreign-key-invalid';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'record-check-violation';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'permission-denied';\n message: string;\n hint: { input: any; expected: string };\n }\n | {\n type: 'permission-evaluation-failed';\n message: string;\n hint: {\n rule: [string, string];\n error?: { type: string; message: string; hint: any };\n };\n }\n | {\n type: 'sql-raise';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'sql-exception';\n message: string;\n hint: { table?: string; condition?: string; constraint?: string };\n }\n | {\n type: 'rate-limited';\n message: string;\n }\n | {\n type: 'session-missing';\n message: string;\n hint: { 'sess-id': string };\n }\n | {\n type: 'socket-missing';\n message: string;\n hint: { 'sess-id': string; 'exception-message'?: string };\n }\n | { type: undefined; [k: string]: any }\n | undefined;\n// Note that InstantIssueBody is not exported and is only necessary for making InstantAPIError\n// below to have all the members and typecheck as InstantIssue\nexport type InstantIssue = {\n body: InstantIssueBody;\n status: number;\n};\n\nexport class InstantAPIError extends InstantError {\n body: InstantIssueBody;\n status: number;\n\n constructor(error: InstantIssue) {\n // Create a descriptive message based on the error\n const message = error.body?.message || `API Error (${error.status})`;\n super(message, (error.body as any).hint);\n\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(this, actualProto);\n }\n\n // Maintain proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, InstantAPIError);\n }\n\n this.name = 'InstantAPIError';\n this.status = error.status;\n this.body = error.body;\n }\n\n get [Symbol.toStringTag]() {\n return 'InstantAPIError';\n }\n}\n\nexport async function jsonFetch(\n input: RequestInfo,\n init: RequestInit | undefined,\n): Promise<any> {\n const res = await fetch(input, init);\n const json = await res.json();\n return res.status === 200\n ? Promise.resolve(json)\n : Promise.reject(new InstantAPIError({ status: res.status, body: json }));\n}\n"]}
@@ -3,15 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createLinkIndex = createLinkIndex;
4
4
  function createLinkIndex(schema) {
5
5
  return Object.values(schema.links).reduce((linkIndex, link) => {
6
- var _a, _b;
7
- var _c, _d;
8
- (_a = linkIndex[_c = link.forward.on]) !== null && _a !== void 0 ? _a : (linkIndex[_c] = {});
6
+ linkIndex[link.forward.on] ??= {};
9
7
  linkIndex[link.forward.on][link.forward.label] = {
10
8
  isForward: true,
11
9
  isSingular: link.forward.has === 'one',
12
10
  link,
13
11
  };
14
- (_b = linkIndex[_d = link.reverse.on]) !== null && _b !== void 0 ? _b : (linkIndex[_d] = {});
12
+ linkIndex[link.reverse.on] ??= {};
15
13
  linkIndex[link.reverse.on][link.reverse.label] = {
16
14
  isForward: false,
17
15
  isSingular: link.reverse.has === 'one',
@@ -1 +1 @@
1
- {"version":3,"file":"linkIndex.js","sourceRoot":"","sources":["../../../src/utils/linkIndex.ts"],"names":[],"mappings":";;AAcA,0CAkBC;AAlBD,SAAgB,eAAe,CAAC,MAAuC;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;;;QAC5D,MAAA,SAAS,MAAC,IAAI,CAAC,OAAO,CAAC,EAAE,qCAAzB,SAAS,OAAsB,EAAE,EAAC;QAClC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;YAC/C,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK;YACtC,IAAI;SACL,CAAC;QAEF,MAAA,SAAS,MAAC,IAAI,CAAC,OAAO,CAAC,EAAE,qCAAzB,SAAS,OAAsB,EAAE,EAAC;QAClC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;YAC/C,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK;YACtC,IAAI;SACL,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,EAAe,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import type { InstantGraph, LinkDef, LinksDef } from '../schemaTypes.ts';\n\nexport type LinkIndex = Record<\n string,\n Record<\n string,\n {\n isForward: boolean;\n isSingular: boolean;\n link: LinkDef<any, any, any, any, any, any, any>;\n }\n >\n>;\n\nexport function createLinkIndex(schema: InstantGraph<any, LinksDef<{}>>) {\n return Object.values(schema.links).reduce((linkIndex, link) => {\n linkIndex[link.forward.on] ??= {};\n linkIndex[link.forward.on][link.forward.label] = {\n isForward: true,\n isSingular: link.forward.has === 'one',\n link,\n };\n\n linkIndex[link.reverse.on] ??= {};\n linkIndex[link.reverse.on][link.reverse.label] = {\n isForward: false,\n isSingular: link.reverse.has === 'one',\n link,\n };\n\n return linkIndex;\n }, {} as LinkIndex);\n}\n"]}
1
+ {"version":3,"file":"linkIndex.js","sourceRoot":"","sources":["../../../src/utils/linkIndex.ts"],"names":[],"mappings":";;AAcA,0CAkBC;AAlBD,SAAgB,eAAe,CAAC,MAAuC;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAC5D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;YAC/C,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK;YACtC,IAAI;SACL,CAAC;QAEF,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;YAC/C,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK;YACtC,IAAI;SACL,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,EAAe,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import type { InstantGraph, LinkDef, LinksDef } from '../schemaTypes.ts';\n\nexport type LinkIndex = Record<\n string,\n Record<\n string,\n {\n isForward: boolean;\n isSingular: boolean;\n link: LinkDef<any, any, any, any, any, any, any>;\n }\n >\n>;\n\nexport function createLinkIndex(schema: InstantGraph<any, LinksDef<{}>>) {\n return Object.values(schema.links).reduce((linkIndex, link) => {\n linkIndex[link.forward.on] ??= {};\n linkIndex[link.forward.on][link.forward.label] = {\n isForward: true,\n isSingular: link.forward.has === 'one',\n link,\n };\n\n linkIndex[link.reverse.on] ??= {};\n linkIndex[link.reverse.on][link.reverse.label] = {\n isForward: false,\n isSingular: link.reverse.has === 'one',\n link,\n };\n\n return linkIndex;\n }, {} as LinkIndex);\n}\n"]}
@@ -48,7 +48,7 @@ function immutableDeepMerge(target, source) {
48
48
  if (!isObject(target) || !isObject(source)) {
49
49
  return source;
50
50
  }
51
- const result = Object.assign({}, target);
51
+ const result = { ...target };
52
52
  for (const key of Object.keys(source)) {
53
53
  if (source[key] === undefined)
54
54
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../src/utils/object.js"],"names":[],"mappings":"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","sourcesContent":["export function areObjectKeysEqual(a, b) {\n const ak = Object.keys(a);\n const bk = Object.keys(b);\n return (\n ak.length === bk.length && Object.keys(a).every((k) => b.hasOwnProperty(k))\n );\n}\n\nexport function areObjectsShallowEqual(obj1, obj2) {\n return (\n Object.keys(obj1).length === Object.keys(obj2).length &&\n Object.keys(obj1).every(\n (key) => obj2.hasOwnProperty(key) && obj1[key] === obj2[key],\n )\n );\n}\n\nexport function areObjectsDeepEqual(obj1, obj2) {\n if (\n typeof obj1 !== 'object' ||\n typeof obj2 !== 'object' ||\n obj1 === null ||\n obj2 === null\n ) {\n return obj1 === obj2;\n }\n\n if (!areObjectKeysEqual(obj1, obj2)) {\n return false;\n }\n\n return Object.keys(obj1).every((key) =>\n areObjectsDeepEqual(obj1[key], obj2[key]),\n );\n}\n\nexport function immutableRemoveUndefined(obj) {\n if (!isObject(obj)) {\n return obj;\n }\n const result = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n\n result[key] = value;\n }\n return result;\n}\n\nexport function immutableDeepMerge(target, source) {\n if (!isObject(target) || !isObject(source)) {\n return source;\n }\n\n const result = { ...target };\n\n for (const key of Object.keys(source)) {\n if (source[key] === undefined) continue;\n if (source[key] === null) {\n delete result[key];\n continue;\n }\n const areBothObjects = isObject(target[key]) && isObject(source[key]);\n result[key] = areBothObjects\n ? immutableDeepMerge(target[key], source[key])\n : source[key];\n }\n\n return result;\n}\n\nexport function immutableDeepReplace(target, replaceValue, replacementValue) {\n if (!isObject(target)) {\n return target;\n }\n\n const result = {};\n\n for (const [key, value] of Object.entries(target)) {\n result[key] = isObject(value)\n ? immutableDeepReplace(value, replaceValue, replacementValue)\n : value === replaceValue\n ? replacementValue\n : value;\n }\n\n return result;\n}\n\nexport function isObject(val) {\n return typeof val === 'object' && val !== null && !Array.isArray(val);\n}\n\nexport function immutableOmitValue(obj, v) {}\n/**\n * Like `assocInMutative`, but\n *\n * - for arrays: inserts the value at the specified index, instead of replacing it\n */\nexport function insertInMutative(obj, path, value) {\n if (!obj) {\n return;\n }\n if (path.length === 0) {\n return;\n }\n\n let current = obj || {};\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = typeof path[i + 1] === 'number' ? [] : {};\n }\n current = current[key];\n }\n\n const key = path[path.length - 1];\n if (Array.isArray(current) && typeof key === 'number') {\n current.splice(key, 0, value);\n } else {\n current[key] = value;\n }\n}\n\nexport function assocInMutative(obj, path, value) {\n if (!obj) {\n return;\n }\n if (path.length === 0) {\n return;\n }\n\n let current = obj || {};\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = typeof path[i + 1] === 'number' ? [] : {};\n }\n current = current[key];\n }\n\n current[path[path.length - 1]] = value;\n}\n\nexport function dissocInMutative(obj, path) {\n if (!obj) {\n return;\n }\n if (path.length === 0) {\n return;\n }\n\n const [key, ...restPath] = path;\n\n if (!(key in obj)) {\n return;\n }\n\n if (restPath.length === 0) {\n if (Array.isArray(obj)) {\n obj.splice(key, 1);\n } else {\n delete obj[key];\n }\n return;\n }\n\n dissocInMutative(obj[key], restPath);\n if (isEmpty(obj[key])) {\n delete obj[key];\n }\n}\n\nfunction isEmpty(obj) {\n return obj && Object.keys(obj).length === 0;\n}\n"]}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../src/utils/object.js"],"names":[],"mappings":"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","sourcesContent":["export function areObjectKeysEqual(a, b) {\n const ak = Object.keys(a);\n const bk = Object.keys(b);\n return (\n ak.length === bk.length && Object.keys(a).every((k) => b.hasOwnProperty(k))\n );\n}\n\nexport function areObjectsShallowEqual(obj1, obj2) {\n return (\n Object.keys(obj1).length === Object.keys(obj2).length &&\n Object.keys(obj1).every(\n (key) => obj2.hasOwnProperty(key) && obj1[key] === obj2[key],\n )\n );\n}\n\nexport function areObjectsDeepEqual(obj1, obj2) {\n if (\n typeof obj1 !== 'object' ||\n typeof obj2 !== 'object' ||\n obj1 === null ||\n obj2 === null\n ) {\n return obj1 === obj2;\n }\n\n if (!areObjectKeysEqual(obj1, obj2)) {\n return false;\n }\n\n return Object.keys(obj1).every((key) =>\n areObjectsDeepEqual(obj1[key], obj2[key]),\n );\n}\n\nexport function immutableRemoveUndefined(obj) {\n if (!isObject(obj)) {\n return obj;\n }\n const result = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n\n result[key] = value;\n }\n return result;\n}\n\nexport function immutableDeepMerge(target, source) {\n if (!isObject(target) || !isObject(source)) {\n return source;\n }\n\n const result = { ...target };\n\n for (const key of Object.keys(source)) {\n if (source[key] === undefined) continue;\n if (source[key] === null) {\n delete result[key];\n continue;\n }\n const areBothObjects = isObject(target[key]) && isObject(source[key]);\n result[key] = areBothObjects\n ? immutableDeepMerge(target[key], source[key])\n : source[key];\n }\n\n return result;\n}\n\nexport function immutableDeepReplace(target, replaceValue, replacementValue) {\n if (!isObject(target)) {\n return target;\n }\n\n const result = {};\n\n for (const [key, value] of Object.entries(target)) {\n result[key] = isObject(value)\n ? immutableDeepReplace(value, replaceValue, replacementValue)\n : value === replaceValue\n ? replacementValue\n : value;\n }\n\n return result;\n}\n\nexport function isObject(val) {\n return typeof val === 'object' && val !== null && !Array.isArray(val);\n}\n\nexport function immutableOmitValue(obj, v) {}\n/**\n * Like `assocInMutative`, but\n *\n * - for arrays: inserts the value at the specified index, instead of replacing it\n */\nexport function insertInMutative(obj, path, value) {\n if (!obj) {\n return;\n }\n if (path.length === 0) {\n return;\n }\n\n let current = obj || {};\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = typeof path[i + 1] === 'number' ? [] : {};\n }\n current = current[key];\n }\n\n const key = path[path.length - 1];\n if (Array.isArray(current) && typeof key === 'number') {\n current.splice(key, 0, value);\n } else {\n current[key] = value;\n }\n}\n\nexport function assocInMutative(obj, path, value) {\n if (!obj) {\n return;\n }\n if (path.length === 0) {\n return;\n }\n\n let current = obj || {};\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!(key in current) || typeof current[key] !== 'object') {\n current[key] = typeof path[i + 1] === 'number' ? [] : {};\n }\n current = current[key];\n }\n\n current[path[path.length - 1]] = value;\n}\n\nexport function dissocInMutative(obj, path) {\n if (!obj) {\n return;\n }\n if (path.length === 0) {\n return;\n }\n\n const [key, ...restPath] = path;\n\n if (!(key in obj)) {\n return;\n }\n\n if (restPath.length === 0) {\n if (Array.isArray(obj)) {\n obj.splice(key, 1);\n } else {\n delete obj[key];\n }\n return;\n }\n\n dissocInMutative(obj[key], restPath);\n if (isEmpty(obj[key])) {\n delete obj[key];\n }\n}\n\nfunction isEmpty(obj) {\n return obj && Object.keys(obj).length === 0;\n}\n"]}
@@ -1,16 +1,13 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  let _connId = 0;
11
2
  export class WSConnection {
3
+ type = 'ws';
4
+ conn;
5
+ id;
6
+ onopen;
7
+ onmessage;
8
+ onclose;
9
+ onerror;
12
10
  constructor(url) {
13
- this.type = 'ws';
14
11
  this.id = `${this.type}_${_connId++}`;
15
12
  this.conn = new WebSocket(url);
16
13
  this.conn.onopen = (_e) => {
@@ -41,24 +38,31 @@ export class WSConnection {
41
38
  this.conn.close();
42
39
  }
43
40
  isOpen() {
44
- var _a;
45
- return this.conn.readyState === ((_a = WebSocket.OPEN) !== null && _a !== void 0 ? _a : 1);
41
+ return this.conn.readyState === (WebSocket.OPEN ?? 1);
46
42
  }
47
43
  isConnecting() {
48
- var _a;
49
- return this.conn.readyState === ((_a = WebSocket.CONNECTING) !== null && _a !== void 0 ? _a : 0);
44
+ return this.conn.readyState === (WebSocket.CONNECTING ?? 0);
50
45
  }
51
46
  send(msg) {
52
47
  return this.conn.send(JSON.stringify(msg));
53
48
  }
54
49
  }
55
50
  export class SSEConnection {
51
+ type = 'sse';
52
+ initParams = null;
53
+ sendQueue = [];
54
+ sendPromise;
55
+ closeFired = false;
56
+ sseInitTimeout = undefined;
57
+ ES;
58
+ conn;
59
+ url;
60
+ id;
61
+ onopen;
62
+ onmessage;
63
+ onclose;
64
+ onerror;
56
65
  constructor(ES, url) {
57
- this.type = 'sse';
58
- this.initParams = null;
59
- this.sendQueue = [];
60
- this.closeFired = false;
61
- this.sseInitTimeout = undefined;
62
66
  this.id = `${this.type}_${_connId++}`;
63
67
  this.url = url;
64
68
  this.ES = ES;
@@ -122,41 +126,36 @@ export class SSEConnection {
122
126
  this.onclose({ target: this });
123
127
  }
124
128
  }
125
- postMessages(messages) {
126
- return __awaiter(this, void 0, void 0, function* () {
127
- var _a, _b, _c;
128
- try {
129
- const resp = yield fetch(this.url, {
130
- method: 'POST',
131
- headers: { 'Content-Type': 'application/json' },
132
- body: JSON.stringify({
133
- machine_id: (_a = this.initParams) === null || _a === void 0 ? void 0 : _a.machineId,
134
- session_id: (_b = this.initParams) === null || _b === void 0 ? void 0 : _b.sessionId,
135
- sse_token: (_c = this.initParams) === null || _c === void 0 ? void 0 : _c.sseToken,
136
- messages,
137
- }),
138
- });
139
- if (!resp.ok) {
140
- this.handleError();
141
- }
142
- }
143
- catch (e) {
129
+ async postMessages(messages) {
130
+ try {
131
+ const resp = await fetch(this.url, {
132
+ method: 'POST',
133
+ headers: { 'Content-Type': 'application/json' },
134
+ body: JSON.stringify({
135
+ machine_id: this.initParams?.machineId,
136
+ session_id: this.initParams?.sessionId,
137
+ sse_token: this.initParams?.sseToken,
138
+ messages,
139
+ }),
140
+ });
141
+ if (!resp.ok) {
144
142
  this.handleError();
145
143
  }
146
- });
144
+ }
145
+ catch (e) {
146
+ this.handleError();
147
+ }
147
148
  }
148
- flushQueue() {
149
- return __awaiter(this, void 0, void 0, function* () {
150
- if (this.sendPromise || !this.sendQueue.length)
151
- return;
152
- const messages = this.sendQueue;
153
- this.sendQueue = [];
154
- const sendPromise = this.postMessages(messages);
155
- this.sendPromise = sendPromise;
156
- sendPromise.then(() => {
157
- this.sendPromise = null;
158
- this.flushQueue();
159
- });
149
+ async flushQueue() {
150
+ if (this.sendPromise || !this.sendQueue.length)
151
+ return;
152
+ const messages = this.sendQueue;
153
+ this.sendQueue = [];
154
+ const sendPromise = this.postMessages(messages);
155
+ this.sendPromise = sendPromise;
156
+ sendPromise.then(() => {
157
+ this.sendPromise = null;
158
+ this.flushQueue();
160
159
  });
161
160
  }
162
161
  send(msg) {
@@ -1 +1 @@
1
- {"version":3,"file":"Connection.js","sourceRoot":"","sources":["../../src/Connection.ts"],"names":[],"mappings":"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","sourcesContent":["export interface EventSourceType {\n readonly url: string;\n readonly readyState: number;\n\n onopen: ((this: EventSourceType, ev: Event) => any) | null;\n onmessage: ((this: EventSourceType, ev: MessageEvent) => any) | null;\n onerror: ((this: EventSourceType, ev: Event) => any) | null;\n\n close(): void;\n}\n\nexport interface EventSourceConstructor {\n OPEN: number;\n CONNECTING: number;\n CLOSED: number;\n new (url: string): EventSourceType;\n}\n\nlet _connId = 0;\n\ntype Conn = EventSourceType | WebSocket;\n\ntype OpenEvent<T extends Conn> = {\n target: Connection<T>;\n};\n\ntype MessageData = {\n op: string;\n [key: string]: any;\n};\n\ntype SendMessageData = {\n 'client-event-id': string;\n [key: string]: any;\n};\n\ntype MsgEvent<T extends Conn> = {\n target: Connection<T>;\n message: MessageData | MessageData[];\n};\n\ntype CloseEvent<T extends Conn> = {\n target: Connection<T>;\n};\n\ninterface ErrorEvent<T extends Conn> {\n target: Connection<T>;\n}\n\nexport type TransportType = 'ws' | 'sse';\n\nexport interface Connection<T extends Conn> {\n conn: T;\n type: 'ws' | 'sse';\n id: string;\n close(): void;\n isOpen(): boolean;\n isConnecting(): boolean;\n send(msg: SendMessageData): void;\n onopen: ((event: OpenEvent<T>) => void) | null;\n onmessage: ((event: MsgEvent<T>) => void) | null;\n onclose: ((event: CloseEvent<T>) => void) | null;\n onerror: ((event: ErrorEvent<T>) => void) | null;\n}\n\nexport class WSConnection implements Connection<WebSocket> {\n type: TransportType = 'ws';\n conn: WebSocket;\n id: string;\n onopen: (event: OpenEvent<WebSocket>) => void;\n onmessage: (event: MsgEvent<WebSocket>) => void;\n onclose: (event: CloseEvent<WebSocket>) => void;\n onerror: (event: ErrorEvent<WebSocket>) => void;\n constructor(url: string) {\n this.id = `${this.type}_${_connId++}`;\n this.conn = new WebSocket(url);\n this.conn.onopen = (_e) => {\n if (this.onopen) {\n this.onopen({ target: this });\n }\n };\n this.conn.onmessage = (e) => {\n if (this.onmessage) {\n this.onmessage({\n target: this,\n message: JSON.parse(e.data.toString()),\n });\n }\n };\n this.conn.onclose = (_e) => {\n if (this.onclose) {\n this.onclose({ target: this });\n }\n };\n this.conn.onerror = (_e) => {\n if (this.onerror) {\n this.onerror({ target: this });\n }\n };\n }\n\n close() {\n this.conn.close();\n }\n\n isOpen(): boolean {\n return this.conn.readyState === (WebSocket.OPEN ?? 1);\n }\n\n isConnecting(): boolean {\n return this.conn.readyState === (WebSocket.CONNECTING ?? 0);\n }\n\n send(msg: SendMessageData) {\n return this.conn.send(JSON.stringify(msg));\n }\n}\n\ntype SSEInitParams = {\n machineId: string;\n sessionId: string;\n sseToken: string;\n};\n\nexport class SSEConnection implements Connection<EventSourceType> {\n type: TransportType = 'sse';\n private initParams: SSEInitParams | null = null;\n private sendQueue: any[] = [];\n private sendPromise: Promise<void> | null;\n private closeFired: boolean = false;\n private sseInitTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n private ES: EventSourceConstructor;\n conn: EventSourceType;\n url: string;\n id: string;\n onopen: (event: OpenEvent<EventSourceType>) => void;\n onmessage: (event: MsgEvent<EventSourceType>) => void;\n onclose: (event: CloseEvent<EventSourceType>) => void;\n onerror: (event: ErrorEvent<EventSourceType>) => void;\n\n constructor(ES: EventSourceConstructor, url: string) {\n this.id = `${this.type}_${_connId++}`;\n this.url = url;\n this.ES = ES;\n this.conn = new ES(url);\n\n // Close the connection if we didn't get an init within 10 seconds\n this.sseInitTimeout = setTimeout(() => {\n if (!this.initParams) {\n this.handleError();\n }\n }, 10000);\n\n this.conn.onmessage = (e) => {\n const message = JSON.parse(e.data);\n if (Array.isArray(message)) {\n for (const msg of message) {\n this.handleMessage(msg);\n }\n } else {\n this.handleMessage(message);\n }\n };\n\n this.conn.onerror = (e) => {\n this.handleError();\n };\n }\n\n private handleMessage(msg: MessageData) {\n if (msg.op === 'sse-init') {\n this.initParams = {\n machineId: msg['machine-id'],\n sessionId: msg['session-id'],\n sseToken: msg['sse-token'],\n };\n if (this.onopen) {\n this.onopen({ target: this });\n }\n clearTimeout(this.sseInitTimeout);\n return;\n }\n if (this.onmessage) {\n this.onmessage({\n target: this,\n message: msg,\n });\n }\n }\n\n // Runs the onerror and closes the connection\n private handleError() {\n try {\n if (this.onerror) {\n this.onerror({ target: this });\n }\n } finally {\n this.handleClose();\n }\n }\n\n private handleClose() {\n this.conn.close();\n if (this.onclose && !this.closeFired) {\n this.closeFired = true;\n this.onclose({ target: this });\n }\n }\n\n private async postMessages(messages: any[]): Promise<void> {\n try {\n const resp = await fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n machine_id: this.initParams?.machineId,\n session_id: this.initParams?.sessionId,\n sse_token: this.initParams?.sseToken,\n messages,\n }),\n });\n if (!resp.ok) {\n this.handleError();\n }\n } catch (e) {\n this.handleError();\n }\n }\n\n private async flushQueue() {\n if (this.sendPromise || !this.sendQueue.length) return;\n\n const messages = this.sendQueue;\n this.sendQueue = [];\n const sendPromise = this.postMessages(messages);\n this.sendPromise = sendPromise;\n sendPromise.then(() => {\n this.sendPromise = null;\n this.flushQueue();\n });\n }\n\n send(msg: SendMessageData) {\n if (!this.isOpen() || !this.initParams) {\n if (this.isConnecting()) {\n throw new Error(\n `Failed to execute 'send' on 'EventSource': Still in CONNECTING state.`,\n );\n }\n if (this.conn.readyState === this.ES.CLOSED) {\n throw new Error(`EventSource is already in CLOSING or CLOSED state.`);\n }\n throw new Error(`EventSource is in invalid state.`);\n }\n this.sendQueue.push(msg);\n this.flushQueue();\n }\n\n isOpen(): boolean {\n return this.conn.readyState === this.ES.OPEN && this.initParams !== null;\n }\n\n isConnecting(): boolean {\n return (\n this.conn.readyState === this.ES.CONNECTING ||\n (this.conn.readyState === this.ES.OPEN && this.initParams === null)\n );\n }\n\n close() {\n this.handleClose();\n }\n}\n"]}
1
+ {"version":3,"file":"Connection.js","sourceRoot":"","sources":["../../src/Connection.ts"],"names":[],"mappings":"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","sourcesContent":["export interface EventSourceType {\n readonly url: string;\n readonly readyState: number;\n\n onopen: ((this: EventSourceType, ev: Event) => any) | null;\n onmessage: ((this: EventSourceType, ev: MessageEvent) => any) | null;\n onerror: ((this: EventSourceType, ev: Event) => any) | null;\n\n close(): void;\n}\n\nexport interface EventSourceConstructor {\n OPEN: number;\n CONNECTING: number;\n CLOSED: number;\n new (url: string): EventSourceType;\n}\n\nlet _connId = 0;\n\ntype Conn = EventSourceType | WebSocket;\n\ntype OpenEvent<T extends Conn> = {\n target: Connection<T>;\n};\n\ntype MessageData = {\n op: string;\n [key: string]: any;\n};\n\ntype SendMessageData = {\n 'client-event-id': string;\n [key: string]: any;\n};\n\ntype MsgEvent<T extends Conn> = {\n target: Connection<T>;\n message: MessageData | MessageData[];\n};\n\ntype CloseEvent<T extends Conn> = {\n target: Connection<T>;\n};\n\ninterface ErrorEvent<T extends Conn> {\n target: Connection<T>;\n}\n\nexport type TransportType = 'ws' | 'sse';\n\nexport interface Connection<T extends Conn> {\n conn: T;\n type: 'ws' | 'sse';\n id: string;\n close(): void;\n isOpen(): boolean;\n isConnecting(): boolean;\n send(msg: SendMessageData): void;\n onopen: ((event: OpenEvent<T>) => void) | null;\n onmessage: ((event: MsgEvent<T>) => void) | null;\n onclose: ((event: CloseEvent<T>) => void) | null;\n onerror: ((event: ErrorEvent<T>) => void) | null;\n}\n\nexport class WSConnection implements Connection<WebSocket> {\n type: TransportType = 'ws';\n conn: WebSocket;\n id: string;\n onopen: (event: OpenEvent<WebSocket>) => void;\n onmessage: (event: MsgEvent<WebSocket>) => void;\n onclose: (event: CloseEvent<WebSocket>) => void;\n onerror: (event: ErrorEvent<WebSocket>) => void;\n constructor(url: string) {\n this.id = `${this.type}_${_connId++}`;\n this.conn = new WebSocket(url);\n this.conn.onopen = (_e) => {\n if (this.onopen) {\n this.onopen({ target: this });\n }\n };\n this.conn.onmessage = (e) => {\n if (this.onmessage) {\n this.onmessage({\n target: this,\n message: JSON.parse(e.data.toString()),\n });\n }\n };\n this.conn.onclose = (_e) => {\n if (this.onclose) {\n this.onclose({ target: this });\n }\n };\n this.conn.onerror = (_e) => {\n if (this.onerror) {\n this.onerror({ target: this });\n }\n };\n }\n\n close() {\n this.conn.close();\n }\n\n isOpen(): boolean {\n return this.conn.readyState === (WebSocket.OPEN ?? 1);\n }\n\n isConnecting(): boolean {\n return this.conn.readyState === (WebSocket.CONNECTING ?? 0);\n }\n\n send(msg: SendMessageData) {\n return this.conn.send(JSON.stringify(msg));\n }\n}\n\ntype SSEInitParams = {\n machineId: string;\n sessionId: string;\n sseToken: string;\n};\n\nexport class SSEConnection implements Connection<EventSourceType> {\n type: TransportType = 'sse';\n private initParams: SSEInitParams | null = null;\n private sendQueue: any[] = [];\n private sendPromise: Promise<void> | null;\n private closeFired: boolean = false;\n private sseInitTimeout: ReturnType<typeof setTimeout> | undefined = undefined;\n private ES: EventSourceConstructor;\n conn: EventSourceType;\n url: string;\n id: string;\n onopen: (event: OpenEvent<EventSourceType>) => void;\n onmessage: (event: MsgEvent<EventSourceType>) => void;\n onclose: (event: CloseEvent<EventSourceType>) => void;\n onerror: (event: ErrorEvent<EventSourceType>) => void;\n\n constructor(ES: EventSourceConstructor, url: string) {\n this.id = `${this.type}_${_connId++}`;\n this.url = url;\n this.ES = ES;\n this.conn = new ES(url);\n\n // Close the connection if we didn't get an init within 10 seconds\n this.sseInitTimeout = setTimeout(() => {\n if (!this.initParams) {\n this.handleError();\n }\n }, 10000);\n\n this.conn.onmessage = (e) => {\n const message = JSON.parse(e.data);\n if (Array.isArray(message)) {\n for (const msg of message) {\n this.handleMessage(msg);\n }\n } else {\n this.handleMessage(message);\n }\n };\n\n this.conn.onerror = (e) => {\n this.handleError();\n };\n }\n\n private handleMessage(msg: MessageData) {\n if (msg.op === 'sse-init') {\n this.initParams = {\n machineId: msg['machine-id'],\n sessionId: msg['session-id'],\n sseToken: msg['sse-token'],\n };\n if (this.onopen) {\n this.onopen({ target: this });\n }\n clearTimeout(this.sseInitTimeout);\n return;\n }\n if (this.onmessage) {\n this.onmessage({\n target: this,\n message: msg,\n });\n }\n }\n\n // Runs the onerror and closes the connection\n private handleError() {\n try {\n if (this.onerror) {\n this.onerror({ target: this });\n }\n } finally {\n this.handleClose();\n }\n }\n\n private handleClose() {\n this.conn.close();\n if (this.onclose && !this.closeFired) {\n this.closeFired = true;\n this.onclose({ target: this });\n }\n }\n\n private async postMessages(messages: any[]): Promise<void> {\n try {\n const resp = await fetch(this.url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n machine_id: this.initParams?.machineId,\n session_id: this.initParams?.sessionId,\n sse_token: this.initParams?.sseToken,\n messages,\n }),\n });\n if (!resp.ok) {\n this.handleError();\n }\n } catch (e) {\n this.handleError();\n }\n }\n\n private async flushQueue() {\n if (this.sendPromise || !this.sendQueue.length) return;\n\n const messages = this.sendQueue;\n this.sendQueue = [];\n const sendPromise = this.postMessages(messages);\n this.sendPromise = sendPromise;\n sendPromise.then(() => {\n this.sendPromise = null;\n this.flushQueue();\n });\n }\n\n send(msg: SendMessageData) {\n if (!this.isOpen() || !this.initParams) {\n if (this.isConnecting()) {\n throw new Error(\n `Failed to execute 'send' on 'EventSource': Still in CONNECTING state.`,\n );\n }\n if (this.conn.readyState === this.ES.CLOSED) {\n throw new Error(`EventSource is already in CLOSING or CLOSED state.`);\n }\n throw new Error(`EventSource is in invalid state.`);\n }\n this.sendQueue.push(msg);\n this.flushQueue();\n }\n\n isOpen(): boolean {\n return this.conn.readyState === this.ES.OPEN && this.initParams !== null;\n }\n\n isConnecting(): boolean {\n return (\n this.conn.readyState === this.ES.CONNECTING ||\n (this.conn.readyState === this.ES.OPEN && this.initParams === null)\n );\n }\n\n close() {\n this.handleClose();\n }\n}\n"]}
@@ -1,45 +1,26 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
1
  import { StorageInterface, } from './utils/PersistedObject.js';
11
2
  export default class InMemoryStorage extends StorageInterface {
3
+ store;
12
4
  constructor(appId, dbName) {
13
5
  super(appId, dbName);
14
6
  this.store = new Map();
15
7
  }
16
- getItem(k) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- var _a;
19
- return (_a = this.store.get(k)) !== null && _a !== void 0 ? _a : null;
20
- });
8
+ async getItem(k) {
9
+ return this.store.get(k) ?? null;
21
10
  }
22
- setItem(k, v) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- this.store.set(k, v);
25
- });
11
+ async setItem(k, v) {
12
+ this.store.set(k, v);
26
13
  }
27
- getAllKeys() {
28
- return __awaiter(this, void 0, void 0, function* () {
29
- return [...this.store.keys()];
30
- });
14
+ async getAllKeys() {
15
+ return [...this.store.keys()];
31
16
  }
32
- multiSet(keyValuePairs) {
33
- return __awaiter(this, void 0, void 0, function* () {
34
- for (const [k, v] of keyValuePairs) {
35
- this.setItem(k, v);
36
- }
37
- });
17
+ async multiSet(keyValuePairs) {
18
+ for (const [k, v] of keyValuePairs) {
19
+ this.setItem(k, v);
20
+ }
38
21
  }
39
- removeItem(key) {
40
- return __awaiter(this, void 0, void 0, function* () {
41
- this.store.delete(key);
42
- });
22
+ async removeItem(key) {
23
+ this.store.delete(key);
43
24
  }
44
25
  }
45
26
  //# sourceMappingURL=InMemoryStorage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryStorage.js","sourceRoot":"","sources":["../../src/InMemoryStorage.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,gBAAgB;IAE3D,YAAY,KAAa,EAAE,MAAiC;QAC1D,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAEK,OAAO,CAAC,CAAC;;;YACb,OAAO,MAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAC;QACnC,CAAC;KAAA;IAEK,OAAO,CAAC,CAAC,EAAE,CAAC;;YAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC;KAAA;IAEK,UAAU;;YACd,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;KAAA;IAEK,QAAQ,CAAC,aAAmC;;YAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;KAAA;IAEK,UAAU,CAAC,GAAW;;YAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;KAAA;CACF","sourcesContent":["import {\n StorageInterface,\n StorageInterfaceStoreName,\n} from './utils/PersistedObject.js';\n\nexport default class InMemoryStorage extends StorageInterface {\n private store: Map<string, any>;\n constructor(appId: string, dbName: StorageInterfaceStoreName) {\n super(appId, dbName);\n this.store = new Map();\n }\n\n async getItem(k) {\n return this.store.get(k) ?? null;\n }\n\n async setItem(k, v) {\n this.store.set(k, v);\n }\n\n async getAllKeys(): Promise<string[]> {\n return [...this.store.keys()];\n }\n\n async multiSet(keyValuePairs: Array<[string, any]>): Promise<void> {\n for (const [k, v] of keyValuePairs) {\n this.setItem(k, v);\n }\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n"]}
1
+ {"version":3,"file":"InMemoryStorage.js","sourceRoot":"","sources":["../../src/InMemoryStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,gBAAgB;IACnD,KAAK,CAAmB;IAChC,YAAY,KAAa,EAAE,MAAiC;QAC1D,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,aAAmC;QAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["import {\n StorageInterface,\n StorageInterfaceStoreName,\n} from './utils/PersistedObject.js';\n\nexport default class InMemoryStorage extends StorageInterface {\n private store: Map<string, any>;\n constructor(appId: string, dbName: StorageInterfaceStoreName) {\n super(appId, dbName);\n this.store = new Map();\n }\n\n async getItem(k) {\n return this.store.get(k) ?? null;\n }\n\n async setItem(k, v) {\n this.store.set(k, v);\n }\n\n async getAllKeys(): Promise<string[]> {\n return [...this.store.keys()];\n }\n\n async multiSet(keyValuePairs: Array<[string, any]>): Promise<void> {\n for (const [k, v] of keyValuePairs) {\n this.setItem(k, v);\n }\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n"]}