@keepkit/core 0.28.4 → 0.28.6
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.
- package/README.md +88 -6
- package/dist/{chunk-Y4U5DEGG.js → chunk-5XSSH3TO.js} +212 -28
- package/dist/chunk-5XSSH3TO.js.map +1 -0
- package/dist/{chunk-2TENUU7B.js → chunk-QRPQYE7K.js} +643 -76
- package/dist/chunk-QRPQYE7K.js.map +1 -0
- package/dist/core.d.ts +192 -7
- package/dist/core.js +565 -7
- package/dist/core.js.map +1 -1
- package/dist/react.d.ts +5 -5
- package/dist/react.js +2 -2
- package/dist/schema.d.ts +1 -1
- package/dist/{scope-Dtkxpnof.d.ts → scope-1bxGd68Y.d.ts} +9 -4
- package/dist/storage.d.ts +42 -18
- package/dist/storage.js +1 -1
- package/dist/{store-45yaDeER.d.ts → store-98vWM3tV.d.ts} +31 -4
- package/dist/{types-C_U5Q44o.d.ts → types-GTCMFt5T.d.ts} +83 -5
- package/package.json +1 -1
- package/dist/chunk-2TENUU7B.js.map +0 -1
- package/dist/chunk-Y4U5DEGG.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/features/items/types.ts","../src/features/persistence/helpers.ts","../src/features/persistence/scope.ts","../src/storage/sync.ts","../src/storage/index.ts"],"sourcesContent":["export type KeepItemStatus = \"available\" | \"expired\" | \"removed\" | \"deleted\" | \"private\" | \"unknown\";\n\nexport type SyncScope = {\n userId?: string;\n tenantId?: string;\n};\n\nexport type KeepCollectionDefinition = {\n id: string;\n name: string;\n scope?: SyncScope;\n /** Server revision used for optimistic collection conflict checks. */\n revision?: string;\n updatedAt?: number;\n};\n\n/** A course-specific membership; the same item may have memberships in several collections. */\nexport type KeepCollectionMembership = {\n collectionId: string;\n itemId: string;\n /** Zero-based order within this collection. */\n order: number;\n scope?: SyncScope;\n};\n\nexport type KeepItem<TMeta = Record<string, unknown>> = {\n id: string;\n savedAt: number;\n updatedAt: number;\n meta: TMeta;\n /** Optional zero-based position in the user's custom viewing order. */\n order?: number;\n /** Whether the item is hidden from the default active list. */\n archived?: boolean;\n /** Whether the item should be shown before unpinned items. */\n pinned?: boolean;\n /** Timestamp for the last time the saved item was opened. */\n lastOpenedAt?: number;\n /** Optional derived collection identifier. */\n collectionId?: string;\n targetType?: string;\n note?: string;\n tags?: string[];\n schemaVersion?: number;\n /** Optional server-provided revision used by synchronizing adapters. */\n revision?: string;\n /** Timestamp for the last successful refresh of source metadata. */\n metaUpdatedAt?: number;\n /** Source availability as last determined by a revalidator. Omitted means available. */\n status?: KeepItemStatus;\n /** Optional human-readable or machine-provided reason for a non-available status. */\n statusReason?: string;\n /** Optional user/tenant scope used by a synchronizing adapter. */\n scope?: SyncScope;\n};\n\n/** The minimal item description accepted by save controls and hooks. */\nexport type KeepItemInput<TMeta = Record<string, unknown>> = {\n id: string;\n meta: TMeta;\n order?: number;\n targetType?: string;\n note?: string;\n tags?: string[];\n archived?: boolean;\n pinned?: boolean;\n collectionId?: string;\n};\n\nexport interface StorageAdapter<TMeta = Record<string, unknown>> {\n /** Active user/tenant scope when this adapter is scoped. */\n readonly scope?: SyncScope;\n getAll(): Promise<KeepItem<TMeta>[]>;\n /** Optional local collection metadata; independent of saved items and item backups. */\n getCollections?(): Promise<KeepCollectionDefinition[]>;\n /** Upsert by collection ID within the provided scope. */\n setCollection?(collection: KeepCollectionDefinition): Promise<void>;\n removeCollection?(id: string, scope?: SyncScope): Promise<void>;\n getCollectionMemberships?(): Promise<KeepCollectionMembership[]>;\n /** Upsert by collection ID and item ID within the provided scope. */\n setCollectionMembership?(membership: KeepCollectionMembership): Promise<void>;\n removeCollectionMembership?(collectionId: string, itemId: string, scope?: SyncScope): Promise<void>;\n set(item: KeepItem<TMeta>): Promise<void>;\n setMany?(items: KeepItem<TMeta>[]): Promise<void>;\n remove(id: string, scope?: SyncScope): Promise<void>;\n removeMany?(ids: string[], scope?: SyncScope): Promise<void>;\n clear(): Promise<void>;\n merge?(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]>;\n subscribe?(listener: () => void): () => void;\n readonly storageKey?: string;\n}\n\nexport type KeepAction =\n | \"refresh\"\n | \"import\"\n | \"export\"\n | \"save\"\n | \"updateNote\"\n | \"updateTags\"\n | \"updateTagsBatch\"\n | \"archive\"\n | \"pin\"\n | \"open\"\n | \"collection\"\n | \"revalidate\"\n | \"remove\"\n | \"removeBatch\"\n | \"undo\"\n | \"reorder\"\n | \"clear\";\n\nexport type KeepChangePhase = \"local\" | \"synced\";\n\nexport type KeepChangeContext<TMeta = Record<string, unknown>> = {\n action: KeepAction;\n id?: string;\n item?: KeepItem<TMeta>;\n items?: KeepItem<TMeta>[];\n phase: KeepChangePhase;\n};\n\nexport type KeepPluginContext<TMeta = Record<string, unknown>> = {\n action: KeepAction;\n id?: string;\n item?: KeepItem<TMeta>;\n items?: KeepItem<TMeta>[];\n};\n\nexport type KeepPlugin<TMeta = Record<string, unknown>> = {\n name?: string;\n before?: (context: KeepPluginContext<TMeta>) => void | Promise<void>;\n after?: (context: KeepPluginContext<TMeta>) => void | Promise<void>;\n onError?: (error: unknown, context: KeepErrorContext) => void;\n};\n\nexport type KeepSchemaParseResult<T> = { success: true; data: T } | { success: false; error?: unknown };\n\nexport type KeepSchema<T> =\n | { parse: (value: unknown) => T | Promise<T> }\n | { safeParse: (value: unknown) => KeepSchemaParseResult<T> | Promise<KeepSchemaParseResult<T>> }\n | {\n \"~standard\": {\n validate: (\n value: unknown,\n ) => { value?: T; issues?: readonly unknown[] } | Promise<{ value?: T; issues?: readonly unknown[] }>;\n };\n };\n\nexport type KeepInvalidItemPolicy = \"error\" | \"drop\";\n\nexport type KeepSyncStatus = \"idle\" | \"pending\" | \"syncing\" | \"synced\" | \"conflict\" | \"error\";\n\nexport type KeepSyncResolution = \"local\" | \"remote\" | \"manual\";\n\nexport type KeepSyncConflict<TMeta = Record<string, unknown>> = {\n id: string;\n operation: SyncOperation<TMeta>;\n remote: KeepItem<TMeta>;\n revision?: string;\n};\n\nexport type KeepSyncState<TMeta = Record<string, unknown>> = {\n status: KeepSyncStatus;\n pendingCount: number;\n conflictIds: string[];\n /** Detailed conflict records when the adapter supports interactive resolution. */\n conflicts?: KeepSyncConflict<TMeta>[];\n collectionConflicts?: KeepCollectionSyncConflict[];\n lastSyncedAt?: number;\n error?: unknown;\n};\n\nexport type SyncOperation<TMeta = Record<string, unknown>> = {\n operationId: string;\n type: \"upsert\" | \"remove\";\n /** Collection operations use a separate driver hook while sharing the durable queue format. */\n entity?: \"item\" | \"collection\";\n id: string;\n item?: KeepItem<TMeta>;\n collection?: KeepCollectionDefinition;\n createdAt: number;\n baseRevision?: string;\n attempts?: number;\n scope?: SyncScope;\n};\n\nexport type KeepCollectionSyncOperation = {\n operationId: string;\n type: \"upsert\" | \"remove\";\n entity: \"collection\";\n id: string;\n collection?: KeepCollectionDefinition;\n createdAt: number;\n baseRevision?: string;\n attempts?: number;\n scope?: SyncScope;\n};\n\n/** A conflict carries a tombstone or the complete definition needed to inspect or apply its state. */\ntype KeepCollectionConflictState =\n | { deleted: true; collection?: never }\n | { deleted: false; collection: KeepCollectionDefinition };\n\nexport type KeepCollectionSyncResult =\n | { type: \"synced\"; collection?: KeepCollectionDefinition; deleted?: boolean; revision?: string }\n | ({ type: \"conflict\"; resolution: \"local\" | \"remote\" | \"manual\"; revision?: string } & KeepCollectionConflictState);\n\nexport type KeepCollectionSyncConflict = {\n operation: KeepCollectionSyncOperation;\n resolution: \"local\" | \"remote\" | \"manual\";\n revision?: string;\n} & KeepCollectionConflictState;\n\nexport type KeepMembershipSyncOperation = {\n operationId: string;\n type: \"upsert\" | \"remove\";\n entity: \"membership\";\n id: string;\n collectionId: string;\n itemId: string;\n membership?: KeepCollectionMembership;\n createdAt: number;\n attempts?: number;\n scope?: SyncScope;\n};\n\nexport type KeepSyncQueueOperation<TMeta = Record<string, unknown>> =\n | SyncOperation<TMeta>\n | KeepCollectionSyncOperation\n | KeepMembershipSyncOperation;\n\nexport type KeepSyncAuthStatus = 401 | 403;\n\n/** Indicates that a sync request needs the host application to re-authenticate. */\nexport class KeepSyncAuthError<TMeta = Record<string, unknown>> extends Error {\n readonly status: KeepSyncAuthStatus;\n readonly operation?: SyncOperation<TMeta>;\n readonly scope?: SyncScope;\n readonly cause?: unknown;\n\n constructor(\n status: KeepSyncAuthStatus,\n options: { operation?: SyncOperation<TMeta>; scope?: SyncScope; cause?: unknown },\n ) {\n super(`KeepKit sync authorization failed with status ${status}.`);\n this.name = \"KeepSyncAuthError\";\n this.status = status;\n this.operation = options.operation;\n this.scope = options.scope;\n if (options.cause !== undefined) this.cause = options.cause;\n }\n}\n\nexport function isKeepSyncAuthError(error: unknown): error is KeepSyncAuthError {\n return error instanceof KeepSyncAuthError;\n}\n\nexport type RemoteSyncResult<TMeta = Record<string, unknown>> =\n | { type: \"synced\"; item?: KeepItem<TMeta>; revision?: string }\n | { type: \"conflict\"; remote: KeepItem<TMeta>; revision?: string };\n\nexport type KeepConflictContext<TMeta = Record<string, unknown>> = {\n operation: SyncOperation<TMeta>;\n remoteRevision?: string;\n};\n\nexport type KeepConflictResolver<TMeta = Record<string, unknown>> = (\n local: KeepItem<TMeta> | undefined,\n remote: KeepItem<TMeta>,\n context: KeepConflictContext<TMeta>,\n) => KeepItem<TMeta> | undefined | Promise<KeepItem<TMeta> | undefined>;\n\nexport interface RemoteSyncDriver<TMeta = Record<string, unknown>> {\n push(operation: SyncOperation<TMeta>): Promise<RemoteSyncResult<TMeta>>;\n pull?: () => Promise<KeepItem<TMeta>[]>;\n /** Push collection operations through the same scoped, durable queue as item operations. */\n // biome-ignore lint/suspicious/noConfusingVoidType: Existing drivers may return void; new drivers can return conflict results.\n pushCollection?(operation: KeepCollectionSyncOperation): Promise<void | KeepCollectionSyncResult>;\n /** Return the complete collection snapshot for the active authenticated scope. */\n pullCollections?: () => Promise<KeepCollectionDefinition[]>;\n /** Push collection/item membership operations through the same durable queue. */\n pushMembership?(operation: KeepMembershipSyncOperation): Promise<void>;\n /** Return the complete membership snapshot for the active authenticated scope. */\n pullMemberships?: () => Promise<KeepCollectionMembership[]>;\n}\n\nexport interface SyncQueueAdapter<TMeta = Record<string, unknown>> {\n getAll(): Promise<KeepSyncQueueOperation<TMeta>[]>;\n setMany(operations: KeepSyncQueueOperation<TMeta>[]): Promise<void>;\n remove(operationIds: string[]): Promise<void>;\n clear(): Promise<void>;\n}\n\nexport interface SyncCapableStorageAdapter<TMeta = Record<string, unknown>> extends StorageAdapter<TMeta> {\n getSyncState(): KeepSyncState<TMeta>;\n subscribeSync(listener: () => void): () => void;\n subscribeScope?(listener: () => void): () => void;\n flushSync(): Promise<void>;\n retrySync?(): Promise<void>;\n resolveSyncConflict?(id: string, resolution: KeepSyncResolution, item?: KeepItem<TMeta>): Promise<void>;\n resolveCollectionSyncConflict?(\n id: string,\n resolution: \"local\" | \"remote\",\n collection?: KeepCollectionDefinition,\n ): Promise<void>;\n dispose?(): void;\n}\n\nexport type KeepStorageOperation = \"getAll\" | \"set\" | \"remove\" | \"clear\" | \"merge\";\n\nexport class KeepStorageError extends Error {\n readonly operation: KeepStorageOperation;\n readonly storageKey?: string;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n operation: KeepStorageOperation;\n storageKey?: string;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = \"KeepStorageError\";\n this.operation = options.operation;\n this.storageKey = options.storageKey;\n if (options.cause !== undefined) this.cause = options.cause;\n }\n}\n\nexport class KeepStorageQuotaError extends KeepStorageError {\n constructor(options: { operation: KeepStorageOperation; storageKey?: string; cause?: unknown }) {\n super(\"KeepKit storage quota was exceeded.\", options);\n this.name = \"KeepStorageQuotaError\";\n }\n}\n\nexport class KeepStorageAccessError extends KeepStorageError {\n constructor(options: { operation: KeepStorageOperation; storageKey?: string; cause?: unknown }) {\n super(\"KeepKit could not access the configured storage.\", options);\n this.name = \"KeepStorageAccessError\";\n }\n}\n\nexport class KeepStorageParseError extends KeepStorageError {\n constructor(options: { operation: KeepStorageOperation; storageKey?: string; cause?: unknown }) {\n super(\"KeepKit found invalid data in the configured storage.\", options);\n this.name = \"KeepStorageParseError\";\n }\n}\n\nexport type KeepErrorContext = {\n action: KeepAction;\n id?: string;\n};\n\nexport type KeepErrorHandler = (error: unknown, context: KeepErrorContext) => void;\n\nexport type KeepEventHandlers<TMeta = Record<string, unknown>> = {\n onSave?: (item: KeepItem<TMeta>) => void;\n onRemove?: (item: KeepItem<TMeta>) => void;\n onNoteUpdate?: (id: string, note?: string) => void;\n onTagsUpdate?: (id: string, tags?: string[]) => void;\n onChange?: (context: KeepChangeContext<TMeta>) => void | Promise<void>;\n onUndo?: (items: KeepItem<TMeta>[]) => void;\n onError?: KeepErrorHandler;\n};\n\nexport type KeepUndoState = {\n canUndo: boolean;\n ids: string[];\n startedAt?: number;\n expiresAt?: number;\n};\n\nexport function normalizeKeepTags(tags?: string[]): string[] | undefined {\n if (!tags) return undefined;\n const normalized = [...new Set(tags.map((tag) => tag.trim()).filter(Boolean))];\n return normalized.length > 0 ? normalized : undefined;\n}\n","import type {\n KeepCollectionDefinition,\n KeepCollectionMembership,\n KeepItem,\n StorageAdapter,\n SyncScope,\n} from \"../items/types\";\n\nexport async function persistKeepItems<TMeta>(storage: StorageAdapter<TMeta>, items: KeepItem<TMeta>[]): Promise<void> {\n if (storage.setMany) {\n await storage.setMany(items);\n return;\n }\n for (const item of items) await storage.set(item);\n}\n\nexport async function removeKeepItems<TMeta>(storage: StorageAdapter<TMeta>, ids: string[]): Promise<void> {\n if (storage.removeMany) {\n await storage.removeMany(ids);\n return;\n }\n for (const id of ids) await storage.remove(id);\n}\n\nexport function mergeKeepItemLists<TMeta>(\n remoteItems: KeepItem<TMeta>[],\n localItems: KeepItem<TMeta>[],\n): KeepItem<TMeta>[] {\n const byId = new Map(remoteItems.map((item) => [item.id, item]));\n for (const localItem of localItems) {\n const remoteItem = byId.get(localItem.id);\n if (!remoteItem) {\n byId.set(localItem.id, localItem);\n continue;\n }\n const content = localItem.updatedAt > remoteItem.updatedAt ? localItem : remoteItem;\n const lastOpenedAt =\n remoteItem.lastOpenedAt === undefined\n ? localItem.lastOpenedAt\n : localItem.lastOpenedAt === undefined\n ? remoteItem.lastOpenedAt\n : Math.max(remoteItem.lastOpenedAt, localItem.lastOpenedAt);\n byId.set(localItem.id, lastOpenedAt === undefined ? content : { ...content, lastOpenedAt });\n }\n return [...byId.values()].sort((a, b) => b.updatedAt - a.updatedAt);\n}\n\nexport function isKeepItem(value: unknown): value is KeepItem {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.savedAt === \"number\" &&\n Number.isFinite(value.savedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt) &&\n \"meta\" in value &&\n (value.order === undefined || (typeof value.order === \"number\" && Number.isFinite(value.order))) &&\n (value.archived === undefined || typeof value.archived === \"boolean\") &&\n (value.pinned === undefined || typeof value.pinned === \"boolean\") &&\n (value.lastOpenedAt === undefined ||\n (typeof value.lastOpenedAt === \"number\" && Number.isFinite(value.lastOpenedAt))) &&\n (value.collectionId === undefined || typeof value.collectionId === \"string\") &&\n (value.targetType === undefined || typeof value.targetType === \"string\") &&\n (value.note === undefined || typeof value.note === \"string\") &&\n (value.schemaVersion === undefined ||\n (typeof value.schemaVersion === \"number\" && Number.isFinite(value.schemaVersion))) &&\n (value.revision === undefined || typeof value.revision === \"string\") &&\n (value.metaUpdatedAt === undefined ||\n (typeof value.metaUpdatedAt === \"number\" && Number.isFinite(value.metaUpdatedAt))) &&\n (value.status === undefined ||\n value.status === \"available\" ||\n value.status === \"expired\" ||\n value.status === \"removed\" ||\n value.status === \"deleted\" ||\n value.status === \"private\" ||\n value.status === \"unknown\") &&\n (value.statusReason === undefined || typeof value.statusReason === \"string\") &&\n (value.scope === undefined || isSyncScope(value.scope)) &&\n (value.tags === undefined || (Array.isArray(value.tags) && value.tags.every((tag) => typeof tag === \"string\")))\n );\n}\n\nexport function isKeepItemArray(value: unknown): value is KeepItem[] {\n return Array.isArray(value) && value.every(isKeepItem);\n}\n\nexport function isKeepCollectionDefinition(value: unknown): value is KeepCollectionDefinition {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n value.id.trim().length > 0 &&\n typeof value.name === \"string\" &&\n value.name.trim().length > 0 &&\n (value.revision === undefined || typeof value.revision === \"string\") &&\n (value.updatedAt === undefined || (typeof value.updatedAt === \"number\" && Number.isFinite(value.updatedAt))) &&\n (value.scope === undefined || isSyncScope(value.scope))\n );\n}\n\nexport function isKeepCollectionMembership(value: unknown): value is KeepCollectionMembership {\n return (\n isRecord(value) &&\n typeof value.collectionId === \"string\" &&\n value.collectionId.trim().length > 0 &&\n typeof value.itemId === \"string\" &&\n value.itemId.trim().length > 0 &&\n typeof value.order === \"number\" &&\n Number.isInteger(value.order) &&\n Number.isFinite(value.order) &&\n value.order >= 0 &&\n (value.scope === undefined || isSyncScope(value.scope))\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isSyncScope(value: unknown): value is SyncScope {\n return (\n isRecord(value) &&\n (value.userId === undefined || typeof value.userId === \"string\") &&\n (value.tenantId === undefined || typeof value.tenantId === \"string\")\n );\n}\n","import type {\n KeepCollectionDefinition,\n KeepCollectionMembership,\n KeepItem,\n KeepSyncQueueOperation,\n StorageAdapter,\n SyncQueueAdapter,\n SyncScope,\n} from \"../items/types\";\n\nexport type KeepScope = SyncScope;\n\n/** Return a stable, human-readable namespace for browser storage and queues. */\nexport function getKeepScopeKey(scope?: KeepScope): string {\n if (!scope?.userId && !scope?.tenantId) return \"\";\n return `:${encodeURIComponent(scope.tenantId ?? \"_\")}:${encodeURIComponent(scope.userId ?? \"_\")}`;\n}\n\nexport function isSameKeepScope(left: KeepScope | undefined, right: KeepScope | undefined): boolean {\n return left?.userId === right?.userId && left?.tenantId === right?.tenantId;\n}\n\n/**\n * Adds an isolated user/tenant view over any StorageAdapter. Writes preserve\n * records belonging to other scopes, which makes account switching safe even\n * when applications share one physical localStorage key.\n */\nexport class ScopedStorageAdapter<TMeta = Record<string, unknown>> implements StorageAdapter<TMeta> {\n readonly scope?: KeepScope;\n readonly storageKey?: string;\n readonly getCollections?: () => Promise<KeepCollectionDefinition[]>;\n readonly setCollection?: (collection: KeepCollectionDefinition) => Promise<void>;\n readonly removeCollection?: (id: string, scope?: SyncScope) => Promise<void>;\n readonly getCollectionMemberships?: () => Promise<KeepCollectionMembership[]>;\n readonly setCollectionMembership?: (membership: KeepCollectionMembership) => Promise<void>;\n readonly removeCollectionMembership?: (collectionId: string, itemId: string, scope?: SyncScope) => Promise<void>;\n private readonly base: StorageAdapter<TMeta>;\n\n constructor(base: StorageAdapter<TMeta>, scope?: KeepScope) {\n this.base = base;\n this.scope = scope;\n const scopeKey = getKeepScopeKey(scope);\n this.storageKey = base.storageKey\n ? base.storageKey.endsWith(scopeKey) && scopeKey\n ? base.storageKey\n : `${base.storageKey}${scopeKey}`\n : undefined;\n if (base.getCollections && base.setCollection && base.removeCollection) {\n const getCollections = base.getCollections.bind(base);\n const setCollection = base.setCollection.bind(base);\n const removeCollection = base.removeCollection.bind(base);\n this.getCollections = async () => {\n const collections = await getCollections();\n return this.scope\n ? collections.filter((collection) => isSameKeepScope(collection.scope, this.scope))\n : collections;\n };\n this.setCollection = (collection) =>\n setCollection({ ...collection, ...(this.scope ? { scope: this.scope } : {}) });\n this.removeCollection = (id) => removeCollection(id, this.scope);\n }\n if (base.getCollectionMemberships && base.setCollectionMembership && base.removeCollectionMembership) {\n const getMemberships = base.getCollectionMemberships.bind(base);\n const setMembership = base.setCollectionMembership.bind(base);\n const removeMembership = base.removeCollectionMembership.bind(base);\n this.getCollectionMemberships = async () => {\n const memberships = await getMemberships();\n return this.scope\n ? memberships.filter((membership) => isSameKeepScope(membership.scope, this.scope))\n : memberships;\n };\n this.setCollectionMembership = (membership) =>\n setMembership({ ...membership, ...(this.scope ? { scope: this.scope } : {}) });\n this.removeCollectionMembership = (collectionId, itemId) => removeMembership(collectionId, itemId, this.scope);\n }\n }\n\n async getAll(): Promise<KeepItem<TMeta>[]> {\n const items = await this.base.getAll();\n return this.scope ? items.filter((item) => isSameKeepScope(item.scope, this.scope)) : items;\n }\n\n async set(item: KeepItem<TMeta>): Promise<void> {\n await this.setMany([item]);\n }\n\n async setMany(items: KeepItem<TMeta>[]): Promise<void> {\n const current = await this.base.getAll();\n const scoped = items.map((item) => ({ ...item, ...(this.scope ? { scope: this.scope } : {}) }));\n const ids = new Set(scoped.map((item) => item.id));\n const next = current.filter((item) => !ids.has(item.id) || !isSameKeepScope(item.scope, this.scope));\n await writeAll(this.base, [...next, ...scoped], this.scope);\n }\n\n async remove(id: string): Promise<void> {\n const current = await this.base.getAll();\n await writeAll(\n this.base,\n current.filter((item) => item.id !== id || !isSameKeepScope(item.scope, this.scope)),\n this.scope,\n );\n await this.removeMembershipsForItems([id]);\n }\n\n async removeMany(ids: string[]): Promise<void> {\n const idSet = new Set(ids);\n const current = await this.base.getAll();\n await writeAll(\n this.base,\n current.filter((item) => !idSet.has(item.id) || !isSameKeepScope(item.scope, this.scope)),\n this.scope,\n );\n await this.removeMembershipsForItems([...idSet]);\n }\n\n async clear(): Promise<void> {\n const current = await this.base.getAll();\n const removedIds = current.filter((item) => isSameKeepScope(item.scope, this.scope)).map((item) => item.id);\n await writeAll(\n this.base,\n current.filter((item) => !isSameKeepScope(item.scope, this.scope)),\n this.scope,\n );\n if (removedIds.length > 0) await this.removeMembershipsForItems(removedIds);\n await this.clearMembershipsForScope();\n }\n\n async merge(items: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]> {\n await this.setMany(items);\n return this.getAll();\n }\n\n subscribe(listener: () => void): () => void {\n return this.base.subscribe?.(listener) ?? (() => undefined);\n }\n\n private async removeMembershipsForItems(ids: string[]): Promise<void> {\n if (!this.base.getCollectionMemberships || !this.base.removeCollectionMembership || ids.length === 0) return;\n const removedIds = new Set(ids);\n const memberships = await this.base.getCollectionMemberships();\n for (const membership of memberships) {\n if (removedIds.has(membership.itemId) && isSameKeepScope(membership.scope, this.scope)) {\n await this.base.removeCollectionMembership(membership.collectionId, membership.itemId, this.scope);\n }\n }\n }\n\n private async clearMembershipsForScope(): Promise<void> {\n if (!this.base.getCollectionMemberships || !this.base.removeCollectionMembership) return;\n const memberships = await this.base.getCollectionMemberships();\n for (const membership of memberships) {\n if (isSameKeepScope(membership.scope, this.scope)) {\n await this.base.removeCollectionMembership(membership.collectionId, membership.itemId, this.scope);\n }\n }\n }\n}\n\nexport function createScopedStorageAdapter<TMeta = Record<string, unknown>>(\n base: StorageAdapter<TMeta>,\n scope?: KeepScope,\n): ScopedStorageAdapter<TMeta> {\n return new ScopedStorageAdapter(base, scope);\n}\n\n/** Scope a durable synchronization queue so a user switch cannot flush another user's operations. */\nexport class ScopedSyncQueueAdapter<TMeta = Record<string, unknown>> implements SyncQueueAdapter<TMeta> {\n private readonly base: SyncQueueAdapter<TMeta>;\n private readonly scope?: KeepScope;\n\n constructor(base: SyncQueueAdapter<TMeta>, scope?: KeepScope) {\n this.base = base;\n this.scope = scope;\n }\n\n async getAll(): Promise<KeepSyncQueueOperation<TMeta>[]> {\n const operations = await this.base.getAll();\n return this.scope ? operations.filter((operation) => isSameKeepScope(operation.scope, this.scope)) : operations;\n }\n\n async setMany(operations: KeepSyncQueueOperation<TMeta>[]): Promise<void> {\n const current = await this.base.getAll();\n const scoped = operations.map((operation) => ({ ...operation, ...(this.scope ? { scope: this.scope } : {}) }));\n const ids = new Set(scoped.map((operation) => operation.operationId));\n await this.base.setMany([\n ...current.filter(\n (operation) => !ids.has(operation.operationId) || !isSameKeepScope(operation.scope, this.scope),\n ),\n ...scoped,\n ]);\n }\n\n async remove(operationIds: string[]): Promise<void> {\n const ids = new Set(operationIds);\n const scopedIds = (await this.base.getAll())\n .filter((operation) => ids.has(operation.operationId) && isSameKeepScope(operation.scope, this.scope))\n .map((operation) => operation.operationId);\n await this.base.remove(scopedIds);\n }\n\n async clear(): Promise<void> {\n const operationIds = (await this.base.getAll())\n .filter((operation) => isSameKeepScope(operation.scope, this.scope))\n .map((operation) => operation.operationId);\n await this.base.remove(operationIds);\n }\n}\n\nasync function writeAll<TMeta>(\n base: StorageAdapter<TMeta>,\n items: KeepItem<TMeta>[],\n scope?: KeepScope,\n): Promise<void> {\n const existing = await base.getAll();\n const desiredItems = new Set(items.filter((item) => isSameKeepScope(item.scope, scope)).map(itemStorageKey));\n const removedIds = existing\n .filter((item) => isSameKeepScope(item.scope, scope) && !desiredItems.has(itemStorageKey(item)))\n .map((item) => item.id);\n if (removedIds.length > 0) {\n if (base.removeMany) await base.removeMany(removedIds, scope);\n else await Promise.all(removedIds.map((id) => base.remove(id, scope)));\n }\n if (base.setMany) {\n await base.setMany(items);\n return;\n }\n for (const item of items) await base.set(item);\n}\n\nfunction itemStorageKey(item: Pick<KeepItem, \"id\" | \"scope\">): string {\n return JSON.stringify([item.scope?.tenantId ?? null, item.scope?.userId ?? null, item.id]);\n}\n","import type {\n KeepCollectionDefinition,\n KeepCollectionMembership,\n KeepCollectionSyncConflict,\n KeepCollectionSyncOperation,\n KeepCollectionSyncResult,\n KeepConflictResolver,\n KeepItem,\n KeepMembershipSyncOperation,\n KeepSyncConflict,\n KeepSyncQueueOperation,\n KeepSyncResolution,\n KeepSyncState,\n RemoteSyncDriver,\n RemoteSyncResult,\n StorageAdapter,\n SyncCapableStorageAdapter,\n SyncOperation,\n SyncQueueAdapter,\n SyncScope,\n} from \"../features/items/types\";\nimport { isKeepSyncAuthError } from \"../features/items/types\";\nimport {\n isKeepCollectionDefinition,\n isKeepCollectionMembership,\n isRecord,\n mergeKeepItemLists,\n persistKeepItems,\n} from \"../features/persistence/helpers\";\nimport { ScopedSyncQueueAdapter } from \"../features/persistence/scope\";\n\nexport type LocalStorageSyncQueueOptions = {\n key?: string;\n storage?: Storage;\n};\n\nexport type IndexedDBSyncQueueOptions = {\n databaseName?: string;\n storeName?: string;\n version?: number;\n indexedDB?: IDBFactory;\n};\n\nexport type FallbackSyncQueueAdapterOptions<TMeta = Record<string, unknown>> = {\n primary: SyncQueueAdapter<TMeta>;\n fallback: SyncQueueAdapter<TMeta>;\n shouldFallback?: (error: unknown) => boolean;\n};\n\nexport type SyncStorageAdapterOptions<TMeta = Record<string, unknown>> = {\n local: StorageAdapter<TMeta>;\n remote: RemoteSyncDriver<TMeta>;\n queue?: SyncQueueAdapter<TMeta>;\n queueKey?: string;\n queueDatabaseName?: string;\n clientId?: string;\n now?: () => number;\n resolveConflict?: KeepConflictResolver<TMeta>;\n userId?: string;\n tenantId?: string;\n maxRetries?: number;\n retryDelayMs?: number;\n retryBackoff?: number;\n scope?: SyncScope;\n};\n\nexport const DEFAULT_SYNC_QUEUE_KEY = \"keepkit:sync-queue\";\nexport const DEFAULT_SYNC_QUEUE_DATABASE = \"keepkit-sync\";\nexport const DEFAULT_SYNC_QUEUE_STORE = \"sync-queue\";\n\nexport class LocalStorageSyncQueueAdapter<TMeta = Record<string, unknown>> implements SyncQueueAdapter<TMeta> {\n private readonly key: string;\n private readonly storage: Storage | undefined;\n\n constructor(options: LocalStorageSyncQueueOptions = {}) {\n this.key = options.key ?? DEFAULT_SYNC_QUEUE_KEY;\n this.storage = options.storage ?? getBrowserStorage();\n }\n\n async getAll(): Promise<KeepSyncQueueOperation<TMeta>[]> {\n if (!this.storage) return [];\n const raw = this.storage.getItem(this.key);\n if (!raw) return [];\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (cause) {\n throw Object.assign(new Error(\"KeepKit sync queue contains invalid JSON.\"), { cause });\n }\n if (!Array.isArray(value) || !value.every(isSyncQueueOperation)) {\n throw new Error(\"KeepKit sync queue contains invalid operations.\");\n }\n return value as KeepSyncQueueOperation<TMeta>[];\n }\n\n async setMany(operations: KeepSyncQueueOperation<TMeta>[]): Promise<void> {\n if (!this.storage) return;\n this.storage.setItem(this.key, JSON.stringify(operations));\n }\n\n async remove(operationIds: string[]): Promise<void> {\n const ids = new Set(operationIds);\n const current = await this.getAll();\n await this.setMany(current.filter((operation) => !ids.has(operation.operationId)));\n }\n\n async clear(): Promise<void> {\n this.storage?.removeItem(this.key);\n }\n}\n\nexport class IndexedDBSyncQueueAdapter<TMeta = Record<string, unknown>> implements SyncQueueAdapter<TMeta> {\n private readonly databaseName: string;\n private readonly storeName: string;\n private readonly version: number;\n private readonly indexedDB: IDBFactory | undefined;\n private databasePromise: Promise<IDBDatabase | undefined> | undefined;\n\n constructor(options: IndexedDBSyncQueueOptions = {}) {\n this.databaseName = options.databaseName ?? DEFAULT_SYNC_QUEUE_DATABASE;\n this.storeName = options.storeName ?? DEFAULT_SYNC_QUEUE_STORE;\n this.version = options.version ?? 1;\n this.indexedDB = options.indexedDB ?? getBrowserIndexedDB();\n }\n\n async getAll(): Promise<KeepSyncQueueOperation<TMeta>[]> {\n const database = await this.open();\n if (!database) return [];\n const transaction = database.transaction(this.storeName, \"readonly\");\n const value: unknown = await requestToPromise(transaction.objectStore(this.storeName).getAll());\n if (!Array.isArray(value) || !value.every(isSyncQueueOperation)) {\n throw new Error(\"KeepKit sync queue contains invalid operations.\");\n }\n return value as KeepSyncQueueOperation<TMeta>[];\n }\n\n async setMany(operations: KeepSyncQueueOperation<TMeta>[]): Promise<void> {\n const database = await this.open();\n if (!database) return;\n const transaction = database.transaction(this.storeName, \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n for (const operation of operations) store.put(operation);\n await transactionToPromise(transaction);\n }\n\n async remove(operationIds: string[]): Promise<void> {\n const database = await this.open();\n if (!database) return;\n const transaction = database.transaction(this.storeName, \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n for (const operationId of new Set(operationIds)) store.delete(operationId);\n await transactionToPromise(transaction);\n }\n\n async clear(): Promise<void> {\n const database = await this.open();\n if (!database) return;\n const transaction = database.transaction(this.storeName, \"readwrite\");\n transaction.objectStore(this.storeName).clear();\n await transactionToPromise(transaction);\n }\n\n private open(): Promise<IDBDatabase | undefined> {\n if (!this.indexedDB) return Promise.resolve(undefined);\n if (!this.databasePromise) {\n this.databasePromise = new Promise((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = this.indexedDB?.open(this.databaseName, this.version) as IDBOpenDBRequest;\n } catch (cause) {\n reject(cause);\n return;\n }\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(this.storeName)) {\n request.result.createObjectStore(this.storeName, { keyPath: \"operationId\" });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n request.onblocked = () => reject(request.error ?? new Error(\"IndexedDB open was blocked.\"));\n });\n }\n return this.databasePromise.catch((cause) => {\n this.databasePromise = undefined;\n throw cause;\n });\n }\n}\n\n/** Keeps the durable sync queue available when IndexedDB is blocked or fails. */\nexport class FallbackSyncQueueAdapter<TMeta = Record<string, unknown>> implements SyncQueueAdapter<TMeta> {\n private readonly primary: SyncQueueAdapter<TMeta>;\n private readonly fallback: SyncQueueAdapter<TMeta>;\n private readonly shouldFallback: (error: unknown) => boolean;\n private active: \"primary\" | \"fallback\" = \"primary\";\n\n constructor(options: FallbackSyncQueueAdapterOptions<TMeta>) {\n this.primary = options.primary;\n this.fallback = options.fallback;\n this.shouldFallback = options.shouldFallback ?? (() => true);\n }\n\n get isUsingFallback(): boolean {\n return this.active === \"fallback\";\n }\n\n getAll(): Promise<KeepSyncQueueOperation<TMeta>[]> {\n return this.execute((adapter) => adapter.getAll());\n }\n\n setMany(operations: KeepSyncQueueOperation<TMeta>[]): Promise<void> {\n return this.execute((adapter) => adapter.setMany(operations));\n }\n\n remove(operationIds: string[]): Promise<void> {\n return this.execute((adapter) => adapter.remove(operationIds));\n }\n\n clear(): Promise<void> {\n return this.execute((adapter) => adapter.clear());\n }\n\n private async execute<TResult>(operation: (adapter: SyncQueueAdapter<TMeta>) => Promise<TResult>): Promise<TResult> {\n const adapter = this.active === \"primary\" ? this.primary : this.fallback;\n try {\n return await operation(adapter);\n } catch (error) {\n if (this.active !== \"primary\" || !this.shouldFallback(error)) throw error;\n this.active = \"fallback\";\n return operation(this.fallback);\n }\n }\n}\n\n/** A local-first adapter that persists remote operations until they are acknowledged. */\nexport class SyncStorageAdapter<TMeta = Record<string, unknown>> implements SyncCapableStorageAdapter<TMeta> {\n readonly storageKey?: string;\n readonly getCollections?: () => Promise<KeepCollectionDefinition[]>;\n readonly setCollection?: (collection: KeepCollectionDefinition) => Promise<void>;\n readonly removeCollection?: (id: string, scope?: SyncScope) => Promise<void>;\n readonly getCollectionMemberships?: () => Promise<KeepCollectionMembership[]>;\n readonly setCollectionMembership?: (membership: KeepCollectionMembership) => Promise<void>;\n readonly removeCollectionMembership?: (collectionId: string, itemId: string, scope?: SyncScope) => Promise<void>;\n private readonly local: StorageAdapter<TMeta>;\n private readonly remote: RemoteSyncDriver<TMeta>;\n private readonly queue: SyncQueueAdapter<TMeta>;\n private readonly clientId: string;\n private readonly now: () => number;\n private readonly resolveConflict?: KeepConflictResolver<TMeta>;\n readonly scope?: SyncScope;\n private readonly maxRetries: number;\n private readonly retryDelayMs: number;\n private readonly retryBackoff: number;\n private readonly listeners = new Set<() => void>();\n private readonly dataListeners = new Set<() => void>();\n private queueItems: KeepSyncQueueOperation<TMeta>[] = [];\n private queueLoaded = false;\n private queueLoadPromise: Promise<void> | undefined;\n private flushPromise: Promise<void> | undefined;\n private state: KeepSyncState<TMeta> = { status: \"idle\", pendingCount: 0, conflictIds: [], conflicts: [] };\n private readonly conflicts = new Map<string, KeepSyncConflict<TMeta>>();\n private onlineHandler?: () => void;\n private disposed = false;\n\n constructor(options: SyncStorageAdapterOptions<TMeta>) {\n this.local = options.local;\n this.remote = options.remote;\n this.scope = getSyncScope(options);\n const queue = options.queue ?? createDefaultQueue<TMeta>(options);\n this.queue = this.scope ? new ScopedSyncQueueAdapter(queue, this.scope) : queue;\n this.clientId = options.clientId ?? createId();\n this.now = options.now ?? Date.now;\n this.resolveConflict = options.resolveConflict;\n this.maxRetries = Math.max(0, options.maxRetries ?? 3);\n this.retryDelayMs = Math.max(0, options.retryDelayMs ?? 0);\n this.retryBackoff = Math.max(1, options.retryBackoff ?? 2);\n this.storageKey = this.local.storageKey;\n if (this.local.getCollections && this.local.setCollection && this.local.removeCollection) {\n const getCollections = this.local.getCollections.bind(this.local);\n const setCollection = this.local.setCollection.bind(this.local);\n const removeCollection = this.local.removeCollection.bind(this.local);\n this.getCollections = async () => {\n const collections = await getCollections();\n const scope = this.scope;\n return scope ? collections.filter((collection) => sameScope(collection.scope, scope)) : collections;\n };\n this.setCollection = async (collection) => {\n const scopedCollection = { ...collection, ...(this.scope ? { scope: this.scope } : {}) };\n if (this.remote.pushCollection) {\n const current = (await this.getCollections?.())?.find((entry) => entry.id === scopedCollection.id);\n const operation = this.createCollectionOperation(\n \"upsert\",\n scopedCollection.id,\n scopedCollection,\n current?.revision,\n );\n await this.enqueueBeforeLocalWrite(operation);\n try {\n await setCollection(scopedCollection);\n } catch (cause) {\n await this.removeQueued(operation.operationId);\n throw cause;\n }\n this.notifyDataListeners();\n this.setPendingState();\n return;\n }\n await setCollection(scopedCollection);\n this.notifyDataListeners();\n };\n this.removeCollection = async (id) => {\n const memberships = (await this.getCollectionMemberships?.()) ?? [];\n const membershipOperations = this.remote.pushMembership\n ? memberships\n .filter((membership) => membership.collectionId === id)\n .map((membership) => this.createMembershipOperation(\"remove\", membership.collectionId, membership.itemId))\n : [];\n if (this.remote.pushCollection) {\n const current = (await this.getCollections?.())?.find((collection) => collection.id === id);\n const operation = this.createCollectionOperation(\"remove\", id, undefined, current?.revision);\n await this.enqueueManyBeforeLocalWrite([...membershipOperations, operation]);\n try {\n await removeCollection(id, this.scope);\n } catch (cause) {\n await this.removeQueued([operation.operationId, ...membershipOperations.map((entry) => entry.operationId)]);\n throw cause;\n }\n this.notifyDataListeners();\n this.setPendingState();\n return;\n }\n await removeCollection(id, this.scope);\n this.notifyDataListeners();\n };\n }\n if (\n this.local.getCollectionMemberships &&\n this.local.setCollectionMembership &&\n this.local.removeCollectionMembership\n ) {\n const getMemberships = this.local.getCollectionMemberships.bind(this.local);\n const setMembership = this.local.setCollectionMembership.bind(this.local);\n const removeMembership = this.local.removeCollectionMembership.bind(this.local);\n this.getCollectionMemberships = async () => {\n const memberships = await getMemberships();\n const scope = this.scope;\n return scope ? memberships.filter((membership) => sameScope(membership.scope, scope)) : memberships;\n };\n this.setCollectionMembership = async (membership) => {\n const scoped = { ...membership, ...(this.scope ? { scope: this.scope } : {}) };\n if (this.remote.pushMembership) {\n const operation = this.createMembershipOperation(\"upsert\", scoped.collectionId, scoped.itemId, scoped);\n await this.enqueueBeforeLocalWrite(operation);\n try {\n await setMembership(scoped);\n } catch (cause) {\n await this.removeQueued(operation.operationId);\n throw cause;\n }\n this.setPendingState();\n } else {\n await setMembership(scoped);\n }\n this.notifyDataListeners();\n };\n this.removeCollectionMembership = async (collectionId, itemId) => {\n if (this.remote.pushMembership) {\n const operation = this.createMembershipOperation(\"remove\", collectionId, itemId);\n await this.enqueueBeforeLocalWrite(operation);\n try {\n await removeMembership(collectionId, itemId, this.scope);\n } catch (cause) {\n await this.removeQueued(operation.operationId);\n throw cause;\n }\n this.setPendingState();\n } else {\n await removeMembership(collectionId, itemId, this.scope);\n }\n this.notifyDataListeners();\n };\n }\n if (typeof window !== \"undefined\") {\n this.onlineHandler = () => void this.flushSync();\n window.addEventListener(\"online\", this.onlineHandler);\n }\n void this.resumeQueue();\n }\n\n getSyncState = (): KeepSyncState<TMeta> => this.state;\n\n subscribeSync = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n subscribe = (listener: () => void): (() => void) => {\n this.dataListeners.add(listener);\n const unsubscribeLocal = this.local.subscribe?.(listener) ?? (() => undefined);\n return () => {\n this.dataListeners.delete(listener);\n unsubscribeLocal();\n };\n };\n\n async getAll(): Promise<KeepItem<TMeta>[]> {\n const items = await this.local.getAll();\n const scope = this.scope;\n if (!scope) return items;\n return items.filter((item) => sameScope(item.scope, scope));\n }\n\n async set(item: KeepItem<TMeta>): Promise<void> {\n const scopedItem = this.applyScope(item);\n const operation = this.createOperation(\"upsert\", scopedItem.id, scopedItem);\n await this.enqueueBeforeLocalWrite(operation);\n try {\n await this.local.set(scopedItem);\n } catch (cause) {\n await this.removeQueued(operation.operationId);\n throw cause;\n }\n this.notifyDataListeners();\n this.setPendingState();\n }\n\n async setMany(items: KeepItem<TMeta>[]): Promise<void> {\n const scopedItems = items.map((item) => this.applyScope(item));\n const operations = scopedItems.map((item) => this.createOperation(\"upsert\", item.id, item));\n await this.enqueueManyBeforeLocalWrite(operations);\n try {\n await persistKeepItems(this.local, scopedItems);\n } catch (cause) {\n await this.removeQueued(operations.map((operation) => operation.operationId));\n throw cause;\n }\n this.notifyDataListeners();\n this.setPendingState();\n }\n\n async remove(id: string): Promise<void> {\n const operation = this.createOperation(\"remove\", id);\n const memberships = (await this.getCollectionMemberships?.()) ?? [];\n const membershipOperations = this.remote.pushMembership\n ? memberships\n .filter((membership) => membership.itemId === id)\n .map((membership) => this.createMembershipOperation(\"remove\", membership.collectionId, membership.itemId))\n : [];\n await this.enqueueManyBeforeLocalWrite([...membershipOperations, operation]);\n try {\n await this.local.remove(id, this.scope);\n } catch (cause) {\n await this.removeQueued([operation.operationId, ...membershipOperations.map((entry) => entry.operationId)]);\n throw cause;\n }\n this.notifyDataListeners();\n this.setPendingState();\n }\n\n async removeMany(ids: string[]): Promise<void> {\n const operations = [...new Set(ids)].map((id) => this.createOperation(\"remove\", id));\n const idSet = new Set(ids);\n const memberships = (await this.getCollectionMemberships?.()) ?? [];\n const membershipOperations = this.remote.pushMembership\n ? memberships\n .filter((membership) => idSet.has(membership.itemId))\n .map((membership) => this.createMembershipOperation(\"remove\", membership.collectionId, membership.itemId))\n : [];\n await this.enqueueManyBeforeLocalWrite([...membershipOperations, ...operations]);\n try {\n if (this.local.removeMany) await this.local.removeMany(ids, this.scope);\n else await Promise.all(ids.map((id) => this.local.remove(id, this.scope)));\n } catch (cause) {\n await this.removeQueued([...operations, ...membershipOperations].map((operation) => operation.operationId));\n throw cause;\n }\n this.notifyDataListeners();\n this.setPendingState();\n }\n\n async clear(): Promise<void> {\n const items = await this.getAll();\n await this.removeMany(items.map((item) => item.id));\n if (!this.scope) await this.local.clear();\n }\n\n async merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]> {\n if (this.scope) {\n const merged = mergeKeepItemLists(\n await this.getAll(),\n localItems.map((item) => this.applyScope(item)),\n );\n await this.setMany(localItems);\n return merged;\n }\n const merged = this.local.merge\n ? await this.local.merge(localItems)\n : mergeKeepItemLists(await this.local.getAll(), localItems);\n if (!this.local.merge) await persistKeepItems(this.local, merged);\n await this.setMany(localItems);\n return merged;\n }\n\n async flushSync(): Promise<void> {\n if (this.flushPromise) return this.flushPromise;\n this.flushPromise = this.runFlush().finally(() => {\n this.flushPromise = undefined;\n });\n return this.flushPromise;\n }\n\n retrySync(): Promise<void> {\n return this.flushSync();\n }\n\n async resolveSyncConflict(id: string, resolution: KeepSyncResolution, item?: KeepItem<TMeta>): Promise<void> {\n await this.loadQueue();\n const conflict = this.conflicts.get(id);\n if (!conflict) return;\n if (resolution === \"manual\" && !item) {\n throw new Error(`KeepKit manual conflict resolution requires an item for \"${id}\".`);\n }\n\n if (resolution === \"remote\") {\n await this.local.set(this.applyScope(conflict.remote));\n await this.removeQueued(conflict.operation.operationId);\n } else {\n const retry = item\n ? this.createOperation(\"upsert\", item.id, {\n ...item,\n revision: conflict.revision ?? item.revision,\n })\n : {\n ...conflict.operation,\n operationId: `${this.clientId}:${this.now()}:${createId()}`,\n createdAt: this.now(),\n baseRevision: conflict.revision,\n attempts: 0,\n };\n if (retry.item) await this.local.set(this.applyScope(retry.item));\n await this.replaceQueued(conflict.operation, retry);\n }\n\n this.conflicts.delete(id);\n this.updateState({\n status: this.queueItems.length > 0 ? \"pending\" : \"synced\",\n pendingCount: this.queueItems.length,\n conflictIds: [...this.conflicts.keys()],\n conflicts: [...this.conflicts.values()],\n });\n if (resolution !== \"remote\" && this.queueItems.length > 0) await this.flushSync();\n }\n\n async resolveCollectionSyncConflict(\n id: string,\n resolution: \"local\" | \"remote\",\n collection?: KeepCollectionDefinition,\n ): Promise<void> {\n await this.loadQueue();\n const conflict = (this.state.collectionConflicts ?? []).find((entry) => entry.operation.id === id);\n if (!conflict) return;\n if (!this.local.getCollections || !this.local.setCollection || !this.local.removeCollection) {\n throw new Error(\"KeepKit collection storage is unavailable.\");\n }\n if (resolution === \"remote\") {\n if (conflict.deleted) await this.local.removeCollection(id, this.scope);\n else {\n if (!conflict.collection) throw new Error(\"Remote collection conflict is missing its selected definition.\");\n await this.local.setCollection({\n ...conflict.collection,\n ...(conflict.revision ? { revision: conflict.revision } : {}),\n ...(this.scope ? { scope: this.scope } : {}),\n });\n }\n await this.removeQueued(conflict.operation.operationId);\n this.updateState({\n collectionConflicts: (this.state.collectionConflicts ?? []).filter((entry) => entry.operation.id !== id),\n });\n return;\n }\n\n if (collection && collection.id !== id) {\n throw new TypeError(\"KeepKit collection conflict resolution must use the requested collection ID.\");\n }\n const chosen = collection ?? (await this.getCollections?.())?.find((entry) => entry.id === id);\n const retry: KeepCollectionSyncOperation = {\n ...conflict.operation,\n operationId: `${this.clientId}:${this.now()}:${createId()}`,\n ...(conflict.operation.type === \"upsert\" && chosen\n ? { collection: { ...chosen, ...(this.scope ? { scope: this.scope } : {}) } }\n : {}),\n createdAt: this.now(),\n baseRevision: conflict.revision,\n attempts: 0,\n };\n await this.replaceQueued(conflict.operation, retry);\n this.updateState({\n collectionConflicts: (this.state.collectionConflicts ?? []).filter((entry) => entry.operation.id !== id),\n });\n await this.flushSync();\n }\n\n dispose(): void {\n this.disposed = true;\n if (this.onlineHandler) window.removeEventListener(\"online\", this.onlineHandler);\n this.listeners.clear();\n this.dataListeners.clear();\n }\n\n private async runFlush(): Promise<void> {\n await this.loadQueue();\n if (this.disposed) return;\n if (!(await this.pullRemote())) return;\n if (this.queueItems.length === 0) {\n this.updateState({ status: \"synced\", pendingCount: 0, error: undefined });\n return;\n }\n this.updateState({ status: \"syncing\", error: undefined });\n for (const operation of [...this.queueItems]) {\n if (this.disposed) return;\n try {\n if (isCollectionSyncOperation(operation)) {\n if (!this.remote.pushCollection) throw new Error(\"Remote sync driver does not support collection sync.\");\n const result = await this.pushCollectionWithRetry(operation);\n if (result?.type === \"conflict\" && result.resolution === \"manual\") {\n const conflict = createCollectionSyncConflict(operation, result);\n this.updateState({\n status: \"conflict\",\n collectionConflicts: [\n ...(this.state.collectionConflicts ?? []).filter((entry) => entry.operation.id !== operation.id),\n conflict,\n ],\n });\n continue;\n }\n await this.applyCollectionPushResult(operation, result);\n await this.removeQueued(operation.operationId);\n this.updateState({\n status: this.queueItems.length > 0 ? \"syncing\" : \"synced\",\n lastSyncedAt: this.now(),\n });\n continue;\n }\n if (isMembershipSyncOperation(operation)) {\n if (!this.remote.pushMembership) throw new Error(\"Remote sync driver does not support membership sync.\");\n await this.pushMembershipWithRetry(operation);\n await this.removeQueued(operation.operationId);\n this.updateState({\n status: this.queueItems.length > 0 ? \"syncing\" : \"synced\",\n lastSyncedAt: this.now(),\n });\n continue;\n }\n const result = await this.pushWithRetry(operation);\n if (result.type === \"conflict\") {\n const local = operation.item;\n const resolved = this.resolveConflict\n ? await this.resolveConflict(local, result.remote, {\n operation,\n remoteRevision: result.revision,\n })\n : undefined;\n if (!resolved) {\n const conflict: KeepSyncConflict<TMeta> = {\n id: operation.id,\n operation,\n remote: result.remote,\n ...(result.revision ? { revision: result.revision } : {}),\n };\n this.conflicts.set(operation.id, conflict);\n this.updateState({\n status: \"conflict\",\n conflictIds: [...this.conflicts.keys()],\n conflicts: [...this.conflicts.values()],\n });\n continue;\n }\n const retry = this.createOperation(\"upsert\", resolved.id, {\n ...resolved,\n revision: result.revision ?? resolved.revision,\n });\n await this.local.set(this.applyScope(retry.item as KeepItem<TMeta>));\n await this.replaceQueued(operation, retry);\n continue;\n }\n if (result.item) {\n await this.local.set(\n this.applyScope({\n ...result.item,\n ...(result.revision ? { revision: result.revision } : {}),\n }),\n );\n this.notifyDataListeners();\n }\n await this.removeQueued(operation.operationId);\n this.updateState({\n status: this.queueItems.length > 0 ? \"syncing\" : \"synced\",\n lastSyncedAt: this.now(),\n conflictIds: [...this.conflicts.keys()].filter((id) => id !== operation.id),\n conflicts: [...this.conflicts.values()].filter((conflict) => conflict.id !== operation.id),\n });\n } catch (error) {\n this.updateState({ status: \"error\", error });\n return;\n }\n }\n if (this.queueItems.length === 0) this.updateState({ status: \"synced\", pendingCount: 0 });\n }\n\n private createOperation(\n type: SyncOperation<TMeta>[\"type\"],\n id: string,\n item?: KeepItem<TMeta>,\n ): SyncOperation<TMeta> {\n return {\n operationId: `${this.clientId}:${this.now()}:${createId()}`,\n type,\n id,\n ...(item ? { item } : {}),\n createdAt: this.now(),\n ...(item?.revision ? { baseRevision: item.revision } : {}),\n ...(this.scope ? { scope: this.scope } : {}),\n };\n }\n\n private createCollectionOperation(\n type: KeepCollectionSyncOperation[\"type\"],\n id: string,\n collection?: KeepCollectionDefinition,\n baseRevision?: string,\n ): KeepCollectionSyncOperation {\n return {\n operationId: `${this.clientId}:${this.now()}:${createId()}`,\n type,\n entity: \"collection\",\n id,\n ...(collection ? { collection } : {}),\n createdAt: this.now(),\n ...(baseRevision ? { baseRevision } : {}),\n ...(this.scope ? { scope: this.scope } : {}),\n };\n }\n\n private createMembershipOperation(\n type: KeepMembershipSyncOperation[\"type\"],\n collectionId: string,\n itemId: string,\n membership?: KeepCollectionMembership,\n ): KeepMembershipSyncOperation {\n return {\n operationId: `${this.clientId}:${this.now()}:${createId()}`,\n type,\n entity: \"membership\",\n id: getMembershipId(collectionId, itemId),\n collectionId,\n itemId,\n ...(membership ? { membership } : {}),\n createdAt: this.now(),\n ...(this.scope ? { scope: this.scope } : {}),\n };\n }\n\n private applyScope(item: KeepItem<TMeta>): KeepItem<TMeta> {\n return this.scope ? { ...item, scope: this.scope } : item;\n }\n\n private async pushWithRetry(operation: SyncOperation<TMeta>): Promise<RemoteSyncResult<TMeta>> {\n let attempt = 0;\n while (true) {\n try {\n return await this.remote.push({ ...operation, attempts: attempt });\n } catch (error) {\n if (isKeepSyncAuthError(error) || attempt >= this.maxRetries) throw error;\n attempt += 1;\n const delay = this.retryDelayMs * this.retryBackoff ** (attempt - 1);\n if (delay > 0) await wait(delay);\n }\n }\n }\n\n private async pushCollectionWithRetry(\n operation: KeepCollectionSyncOperation,\n // biome-ignore lint/suspicious/noConfusingVoidType: Preserve drivers whose collection push returns void.\n ): Promise<void | KeepCollectionSyncResult> {\n let attempt = 0;\n while (true) {\n try {\n return await this.remote.pushCollection?.({ ...operation, attempts: attempt });\n } catch (error) {\n if (isKeepSyncAuthError(error) || attempt >= this.maxRetries) throw error;\n attempt += 1;\n const delay = this.retryDelayMs * this.retryBackoff ** (attempt - 1);\n if (delay > 0) await wait(delay);\n }\n }\n }\n\n private async applyCollectionPushResult(\n operation: KeepCollectionSyncOperation,\n // biome-ignore lint/suspicious/noConfusingVoidType: A legacy driver signals success by returning void.\n result: void | KeepCollectionSyncResult,\n ): Promise<void> {\n if (!this.local.getCollections || !this.local.setCollection || !this.local.removeCollection) return;\n if (!result) return;\n const outcome = result.type === \"conflict\" ? result.resolution : \"remote\";\n if (outcome === \"manual\") return;\n const deleted =\n outcome === \"local\"\n ? operation.type === \"remove\"\n : (result.deleted ?? (operation.type === \"remove\" && outcome === \"remote\"));\n if (deleted) {\n await this.local.removeCollection(operation.id, this.scope);\n } else if (result.type === \"synced\" || outcome === \"remote\" || outcome === \"local\") {\n const current =\n (outcome === \"local\" ? operation.collection : result.collection) ??\n (await this.getCollections?.())?.find((entry) => entry.id === operation.id);\n if (!current) return;\n await this.local.setCollection({\n ...current,\n ...(result.revision ? { revision: result.revision } : current.revision ? { revision: current.revision } : {}),\n ...(this.scope ? { scope: this.scope } : {}),\n });\n }\n if (result.type === \"conflict\") {\n const conflict = createCollectionSyncConflict(operation, result);\n this.updateState({\n status: \"conflict\",\n collectionConflicts: [\n ...(this.state.collectionConflicts ?? []).filter((entry) => entry.operation.id !== operation.id),\n conflict,\n ],\n });\n }\n }\n\n private async pushMembershipWithRetry(operation: KeepMembershipSyncOperation): Promise<void> {\n let attempt = 0;\n while (true) {\n try {\n await this.remote.pushMembership?.({ ...operation, attempts: attempt });\n return;\n } catch (error) {\n if (isKeepSyncAuthError(error) || attempt >= this.maxRetries) throw error;\n attempt += 1;\n const delay = this.retryDelayMs * this.retryBackoff ** (attempt - 1);\n if (delay > 0) await wait(delay);\n }\n }\n }\n\n private async enqueueBeforeLocalWrite(operation: KeepSyncQueueOperation<TMeta>): Promise<void> {\n await this.enqueueManyBeforeLocalWrite([operation]);\n }\n\n private async enqueueManyBeforeLocalWrite(operations: KeepSyncQueueOperation<TMeta>[]): Promise<void> {\n await this.loadQueue();\n const next = [...this.queueItems];\n for (const operation of operations) {\n for (let index = next.length - 1; index >= 0; index -= 1) {\n const queued = next[index];\n if (!queued || getQueueIdentity(queued) !== getQueueIdentity(operation)) continue;\n next.splice(index, 1);\n }\n next.push(operation);\n }\n await this.persistQueue(next);\n this.updateState({ status: \"pending\", pendingCount: this.queueItems.length });\n }\n\n private async loadQueue(): Promise<void> {\n if (this.queueLoaded) return;\n if (!this.queueLoadPromise) {\n this.queueLoadPromise = this.queue\n .getAll()\n .then((items) => {\n this.queueItems = items;\n this.queueLoaded = true;\n })\n .catch((error) => {\n this.queueLoadPromise = undefined;\n throw error;\n });\n }\n await this.queueLoadPromise;\n }\n\n private async resumeQueue(): Promise<void> {\n try {\n await this.loadQueue();\n if (this.disposed) return;\n if (this.queueItems.length === 0) return;\n this.updateState({ status: \"pending\", pendingCount: this.queueItems.length });\n if (isBrowserOnline()) await this.flushSync();\n } catch (error) {\n this.updateState({ status: \"error\", error });\n }\n }\n\n private async persistQueue(next: KeepSyncQueueOperation<TMeta>[]): Promise<void> {\n const previousIds = new Set(this.queueItems.map((operation) => operation.operationId));\n const nextIds = new Set(next.map((operation) => operation.operationId));\n const removed = [...previousIds].filter((id) => !nextIds.has(id));\n if (removed.length > 0) await this.queue.remove(removed);\n if (next.length > 0) await this.queue.setMany(next);\n this.queueItems = next;\n }\n\n private async removeQueued(operationIds: string | string[]): Promise<void> {\n await this.loadQueue();\n const ids = new Set(typeof operationIds === \"string\" ? [operationIds] : operationIds);\n await this.queue.remove([...ids]);\n this.queueItems = this.queueItems.filter((operation) => !ids.has(operation.operationId));\n this.setPendingState();\n }\n\n private async replaceQueued(previous: SyncOperation<TMeta>, next: SyncOperation<TMeta>): Promise<void> {\n await this.persistQueue(\n this.queueItems.map((operation) => (operation.operationId === previous.operationId ? next : operation)),\n );\n this.setPendingState();\n }\n\n private setPendingState(): void {\n this.updateState({\n status: this.queueItems.length > 0 ? \"pending\" : \"synced\",\n pendingCount: this.queueItems.length,\n });\n }\n\n private async pullRemote(): Promise<boolean> {\n if (!this.remote.pull && !this.remote.pullCollections && !this.remote.pullMemberships) return true;\n try {\n if (this.remote.pull) {\n const remoteItems = await this.remote.pull();\n const pendingIds = new Set(\n this.queueItems.filter((operation) => operation.entity !== \"collection\").map((operation) => operation.id),\n );\n const localItems = await this.getAll();\n const localById = new Map(localItems.map((item) => [item.id, item]));\n const remoteById = new Map<string, KeepItem<TMeta>>();\n for (const item of remoteItems) {\n if (this.scope && item.scope && !sameScope(item.scope, this.scope)) continue;\n if (pendingIds.has(item.id)) continue;\n const previous = remoteById.get(item.id);\n remoteById.set(item.id, previous ? (mergeKeepItemLists([item], [previous])[0] ?? item) : item);\n }\n const incoming = [...remoteById.values()].flatMap((item) => {\n const current = localById.get(item.id);\n if (\n current &&\n item.updatedAt < current.updatedAt &&\n (item.lastOpenedAt ?? 0) <= (current.lastOpenedAt ?? 0)\n ) {\n return [];\n }\n const merged = current ? (mergeKeepItemLists([item], [current])[0] ?? item) : item;\n return [this.applyScope(merged)];\n });\n if (incoming.length > 0) {\n await persistKeepItems(this.local, incoming);\n this.notifyDataListeners();\n }\n }\n if (\n this.remote.pullCollections &&\n this.local.getCollections &&\n this.local.setCollection &&\n this.local.removeCollection\n ) {\n const remoteCollections = await this.remote.pullCollections();\n const localCollections = await this.local.getCollections();\n const pendingIds = new Set(this.queueItems.filter(isCollectionSyncOperation).map((operation) => operation.id));\n const remoteById = new Map(\n remoteCollections\n .filter((collection) => !this.scope || !collection.scope || sameScope(collection.scope, this.scope))\n .map((collection) => [collection.id, collection]),\n );\n for (const collection of remoteById.values()) {\n if (pendingIds.has(collection.id)) continue;\n await this.local.setCollection({ ...collection, ...(this.scope ? { scope: this.scope } : {}) });\n }\n for (const collection of localCollections) {\n if (pendingIds.has(collection.id) || remoteById.has(collection.id)) continue;\n if (this.scope && !sameScope(collection.scope, this.scope)) continue;\n await this.local.removeCollection(collection.id, this.scope);\n }\n this.notifyDataListeners();\n }\n if (\n this.remote.pullMemberships &&\n this.getCollections &&\n this.local.getCollectionMemberships &&\n this.local.setCollectionMembership &&\n this.local.removeCollectionMembership\n ) {\n const remoteMemberships = await this.remote.pullMemberships();\n const localMemberships = await this.local.getCollectionMemberships();\n const pendingIds = new Set(this.queueItems.filter(isMembershipSyncOperation).map((operation) => operation.id));\n const itemIds = new Set((await this.getAll()).map((item) => item.id));\n const collectionIds = new Set((await this.getCollections()).map((collection) => collection.id));\n const remoteById = new Map(\n remoteMemberships\n .filter((membership) => {\n if (this.scope && membership.scope && !sameScope(membership.scope, this.scope)) return false;\n if (!itemIds.has(membership.itemId)) return false;\n return collectionIds.has(membership.collectionId);\n })\n .map((membership) => [getMembershipId(membership.collectionId, membership.itemId), membership]),\n );\n for (const membership of remoteById.values()) {\n const id = getMembershipId(membership.collectionId, membership.itemId);\n if (pendingIds.has(id)) continue;\n await this.local.setCollectionMembership({ ...membership, ...(this.scope ? { scope: this.scope } : {}) });\n }\n for (const membership of localMemberships) {\n const id = getMembershipId(membership.collectionId, membership.itemId);\n if (pendingIds.has(id) || remoteById.has(id)) continue;\n if (this.scope && !sameScope(membership.scope, this.scope)) continue;\n await this.local.removeCollectionMembership(membership.collectionId, membership.itemId, this.scope);\n }\n this.notifyDataListeners();\n }\n return true;\n } catch (error) {\n this.updateState({ status: \"error\", error });\n return false;\n }\n }\n\n private notifyDataListeners(): void {\n for (const listener of this.dataListeners) listener();\n }\n\n private updateState(next: Partial<KeepSyncState<TMeta>>): void {\n this.state = {\n ...this.state,\n ...next,\n pendingCount: next.pendingCount ?? this.queueItems.length,\n };\n for (const listener of this.listeners) listener();\n }\n}\n\nfunction isSyncOperation(value: unknown): value is SyncOperation {\n if (!isRecord(value)) return false;\n return (\n typeof value.operationId === \"string\" &&\n (value.type === \"upsert\" || value.type === \"remove\") &&\n typeof value.id === \"string\" &&\n typeof value.createdAt === \"number\" &&\n (value.entity === undefined || value.entity === \"item\" || value.entity === \"collection\") &&\n (value.collection === undefined || isKeepCollectionDefinition(value.collection)) &&\n (value.entity !== \"collection\" || value.type !== \"upsert\" || isKeepCollectionDefinition(value.collection))\n );\n}\n\nfunction isCollectionSyncOperation(value: unknown): value is KeepCollectionSyncOperation {\n if (!isRecord(value)) return false;\n return (\n typeof value.operationId === \"string\" &&\n value.entity === \"collection\" &&\n (value.type === \"upsert\" || value.type === \"remove\") &&\n typeof value.id === \"string\" &&\n typeof value.createdAt === \"number\" &&\n (value.collection === undefined || isKeepCollectionDefinition(value.collection))\n );\n}\n\nfunction isMembershipSyncOperation(value: unknown): value is KeepMembershipSyncOperation {\n if (!isRecord(value)) return false;\n return (\n typeof value.operationId === \"string\" &&\n value.entity === \"membership\" &&\n (value.type === \"upsert\" || value.type === \"remove\") &&\n typeof value.id === \"string\" &&\n typeof value.collectionId === \"string\" &&\n typeof value.itemId === \"string\" &&\n typeof value.createdAt === \"number\" &&\n (value.membership === undefined || isKeepCollectionMembership(value.membership)) &&\n (value.type !== \"upsert\" || isKeepCollectionMembership(value.membership))\n );\n}\n\nfunction isSyncQueueOperation(value: unknown): value is KeepSyncQueueOperation {\n return isSyncOperation(value) || isCollectionSyncOperation(value) || isMembershipSyncOperation(value);\n}\n\nfunction getQueueIdentity<TMeta>(operation: KeepSyncQueueOperation<TMeta>): string {\n return `${operation.entity ?? \"item\"}:${operation.id}`;\n}\n\nfunction getMembershipId(collectionId: string, itemId: string): string {\n return `${collectionId}\\u0000${itemId}`;\n}\n\nfunction createCollectionSyncConflict(\n operation: KeepCollectionSyncOperation,\n result: Extract<KeepCollectionSyncResult, { type: \"conflict\" }>,\n): KeepCollectionSyncConflict {\n const details = {\n operation,\n resolution: result.resolution,\n ...(result.revision ? { revision: result.revision } : {}),\n };\n if (result.deleted) return { ...details, deleted: true };\n return { ...details, deleted: false, collection: result.collection };\n}\n\nfunction createId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n return Math.random().toString(36).slice(2);\n}\n\nfunction getBrowserStorage(): Storage | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n return window.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction getBrowserIndexedDB(): IDBFactory | undefined {\n if (typeof indexedDB === \"undefined\") return undefined;\n return indexedDB;\n}\n\nfunction isBrowserOnline(): boolean {\n return typeof navigator === \"undefined\" || navigator.onLine !== false;\n}\n\nfunction createDefaultQueue<TMeta>(options: SyncStorageAdapterOptions<TMeta>): SyncQueueAdapter<TMeta> {\n const scopeKey = getScopeKey(options);\n const queueKey = `${options.queueKey ?? `${DEFAULT_SYNC_QUEUE_KEY}:${options.local.storageKey ?? \"default\"}`}${scopeKey}`;\n const fallback = new LocalStorageSyncQueueAdapter<TMeta>({ key: queueKey });\n const indexedDB = getBrowserIndexedDB();\n if (!indexedDB) return fallback;\n return new FallbackSyncQueueAdapter<TMeta>({\n primary: new IndexedDBSyncQueueAdapter<TMeta>({\n databaseName: `${options.queueDatabaseName ?? DEFAULT_SYNC_QUEUE_DATABASE}${scopeKey}`,\n indexedDB,\n }),\n fallback,\n });\n}\n\nfunction getSyncScope<TMeta>(options: SyncStorageAdapterOptions<TMeta>): SyncScope | undefined {\n if (options.scope) return options.scope;\n if (!options.userId && !options.tenantId) return undefined;\n return {\n ...(options.userId ? { userId: options.userId } : {}),\n ...(options.tenantId ? { tenantId: options.tenantId } : {}),\n };\n}\n\nfunction getScopeKey<TMeta>(options: SyncStorageAdapterOptions<TMeta>): string {\n const scope = getSyncScope(options);\n if (!scope) return \"\";\n return `:${encodeURIComponent(scope.tenantId ?? \"_\")}:${encodeURIComponent(scope.userId ?? \"_\")}`;\n}\n\nfunction sameScope(left: SyncScope | undefined, right: SyncScope): boolean {\n return left?.userId === right.userId && left?.tenantId === right.tenantId;\n}\n\nfunction wait(delay: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, delay));\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error ?? new Error(\"IndexedDB transaction aborted.\"));\n });\n}\n","import {\n type KeepCollectionDefinition,\n type KeepCollectionMembership,\n type KeepItem,\n KeepStorageAccessError,\n KeepStorageError,\n type KeepStorageOperation,\n KeepStorageParseError,\n KeepStorageQuotaError,\n type StorageAdapter,\n} from \"../features/items/types\";\nimport {\n isKeepCollectionDefinition,\n isKeepCollectionMembership,\n isKeepItemArray,\n isRecord,\n mergeKeepItemLists,\n persistKeepItems,\n} from \"../features/persistence/helpers\";\nimport {\n createScopedStorageAdapter,\n getKeepScopeKey,\n isSameKeepScope,\n type KeepScope,\n} from \"../features/persistence/scope\";\n\nexport const DEFAULT_STORAGE_KEY = \"keepkit:items\";\n\nexport type LocalStorageAdapterOptions = {\n key?: string;\n storage?: Storage;\n};\n\nexport type IndexedDBAdapterOptions = {\n databaseName?: string;\n dbName?: string;\n /** Alias for databaseName, useful when switching from LocalStorageAdapter. */\n key?: string;\n storeName?: string;\n version?: number;\n indexedDB?: IDBFactory;\n};\n\nexport const DEFAULT_INDEXEDDB_DATABASE = \"keepkit\";\nexport const DEFAULT_INDEXEDDB_STORE = \"items\";\n\nexport type StorageAdapterFactoryOptions<TMeta = Record<string, unknown>> = {\n getAll: () => KeepItem<TMeta>[] | Promise<KeepItem<TMeta>[]>;\n getCollections?: () => KeepCollectionDefinition[] | Promise<KeepCollectionDefinition[]>;\n setCollection?: (collection: KeepCollectionDefinition) => void | Promise<void>;\n removeCollection?: (id: string, scope?: KeepScope) => void | Promise<void>;\n getCollectionMemberships?: () => KeepCollectionMembership[] | Promise<KeepCollectionMembership[]>;\n setCollectionMembership?: (membership: KeepCollectionMembership) => void | Promise<void>;\n removeCollectionMembership?: (collectionId: string, itemId: string, scope?: KeepScope) => void | Promise<void>;\n set: (item: KeepItem<TMeta>) => void | Promise<void>;\n setMany?: (items: KeepItem<TMeta>[]) => void | Promise<void>;\n remove: (id: string, scope?: KeepScope) => void | Promise<void>;\n removeMany?: (ids: string[], scope?: KeepScope) => void | Promise<void>;\n clear: () => void | Promise<void>;\n merge?: (localItems: KeepItem<TMeta>[]) => KeepItem<TMeta>[] | Promise<KeepItem<TMeta>[]>;\n subscribe?: (listener: () => void) => undefined | (() => void);\n storageKey?: string;\n};\n\nexport type FallbackStorageAdapterOptions<TMeta = Record<string, unknown>> = {\n primary: StorageAdapter<TMeta>;\n fallback: StorageAdapter<TMeta>;\n /** Decide which primary adapter failures should activate the fallback. */\n shouldFallback?: (error: unknown) => boolean;\n onFallback?: (error: unknown) => void;\n /** Copy fallback data into an empty primary on the first read. */\n migrateFallbackOnEmpty?: boolean;\n /** Keep the fallback current while the primary is healthy. */\n mirrorWrites?: boolean;\n};\n\n/**\n * A storage adapter that switches to a fallback after an availability failure.\n * Parse errors remain visible so corrupt data is never silently hidden.\n */\nexport class FallbackStorageAdapter<TMeta = Record<string, unknown>> implements StorageAdapter<TMeta> {\n public readonly storageKey: string | undefined;\n public readonly scope: KeepScope | undefined;\n readonly getCollections?: () => Promise<KeepCollectionDefinition[]>;\n readonly setCollection?: (collection: KeepCollectionDefinition) => Promise<void>;\n readonly removeCollection?: (id: string, scope?: KeepScope) => Promise<void>;\n readonly getCollectionMemberships?: () => Promise<KeepCollectionMembership[]>;\n readonly setCollectionMembership?: (membership: KeepCollectionMembership) => Promise<void>;\n readonly removeCollectionMembership?: (collectionId: string, itemId: string, scope?: KeepScope) => Promise<void>;\n private readonly primary: StorageAdapter<TMeta>;\n private readonly fallback: StorageAdapter<TMeta>;\n private readonly shouldFallback: (error: unknown) => boolean;\n private readonly onFallback?: (error: unknown) => void;\n private readonly migrateFallbackOnEmpty: boolean;\n private readonly mirrorWrites: boolean;\n private active: \"primary\" | \"fallback\" = \"primary\";\n private readonly listeners = new Set<() => void>();\n\n constructor(options: FallbackStorageAdapterOptions<TMeta>) {\n this.primary = options.primary;\n this.fallback = options.fallback;\n this.shouldFallback = options.shouldFallback ?? isRecoverableStorageError;\n this.onFallback = options.onFallback;\n this.migrateFallbackOnEmpty = options.migrateFallbackOnEmpty ?? false;\n this.mirrorWrites = options.mirrorWrites ?? false;\n this.storageKey = options.fallback.storageKey ?? options.primary.storageKey;\n this.scope = options.primary.scope ?? options.fallback.scope;\n if (\n this.primary.getCollections &&\n this.primary.setCollection &&\n this.primary.removeCollection &&\n this.fallback.getCollections &&\n this.fallback.setCollection &&\n this.fallback.removeCollection\n ) {\n const fallbackGetCollections = this.fallback.getCollections.bind(this.fallback);\n this.getCollections = async () => {\n const collections = await this.execute((adapter) => {\n if (!adapter.getCollections) throw new Error(\"Collection storage is unavailable.\");\n return adapter.getCollections();\n });\n if (this.active === \"primary\" && this.migrateFallbackOnEmpty && collections.length === 0) {\n const fallbackCollections = await fallbackGetCollections();\n for (const collection of fallbackCollections) await this.setCollection?.(collection);\n return fallbackCollections;\n }\n return collections;\n };\n this.setCollection = (collection) =>\n this.executeWrite((adapter) => {\n if (!adapter.setCollection) throw new Error(\"Collection storage is unavailable.\");\n return adapter.setCollection(collection);\n });\n this.removeCollection = (id, scope) =>\n this.executeWrite((adapter) => {\n if (!adapter.removeCollection) throw new Error(\"Collection storage is unavailable.\");\n return adapter.removeCollection(id, scope);\n });\n }\n if (\n this.primary.getCollectionMemberships &&\n this.primary.setCollectionMembership &&\n this.primary.removeCollectionMembership &&\n this.fallback.getCollectionMemberships &&\n this.fallback.setCollectionMembership &&\n this.fallback.removeCollectionMembership\n ) {\n const fallbackGetMemberships = this.fallback.getCollectionMemberships.bind(this.fallback);\n this.getCollectionMemberships = async () => {\n const memberships = await this.execute(\n (adapter) => adapter.getCollectionMemberships?.() ?? Promise.resolve([]),\n );\n if (this.active !== \"primary\" || !this.migrateFallbackOnEmpty || memberships.length > 0) return memberships;\n const fallbackMemberships = await fallbackGetMemberships();\n for (const membership of fallbackMemberships) await this.setCollectionMembership?.(membership);\n return fallbackMemberships;\n };\n this.setCollectionMembership = (membership) =>\n this.executeWrite((adapter) => adapter.setCollectionMembership?.(membership) ?? Promise.resolve());\n this.removeCollectionMembership = (collectionId, itemId, scope) =>\n this.executeWrite(\n (adapter) => adapter.removeCollectionMembership?.(collectionId, itemId, scope) ?? Promise.resolve(),\n );\n }\n }\n\n get isUsingFallback(): boolean {\n return this.active === \"fallback\";\n }\n\n getAll(): Promise<KeepItem<TMeta>[]> {\n return this.readAll();\n }\n\n set(item: KeepItem<TMeta>): Promise<void> {\n return this.executeWrite((adapter) => adapter.set(item));\n }\n\n setMany(items: KeepItem<TMeta>[]): Promise<void> {\n return this.executeWrite((adapter) =>\n adapter.setMany\n ? adapter.setMany(items)\n : Promise.all(items.map((item) => adapter.set(item))).then(() => undefined),\n );\n }\n\n remove(id: string, scope?: KeepScope): Promise<void> {\n return this.executeWrite((adapter) => adapter.remove(id, scope));\n }\n\n removeMany(ids: string[], scope?: KeepScope): Promise<void> {\n return this.executeWrite((adapter) =>\n adapter.removeMany\n ? adapter.removeMany(ids, scope)\n : Promise.all(ids.map((id) => adapter.remove(id, scope))).then(() => undefined),\n );\n }\n\n clear(): Promise<void> {\n return this.executeWrite((adapter) => adapter.clear());\n }\n\n merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]> {\n return this.execute(async (adapter) => {\n const merged = adapter.merge\n ? await adapter.merge(localItems)\n : mergeKeepItemLists(await adapter.getAll(), localItems);\n if (!adapter.merge) await persistKeepItems(adapter, merged);\n if (this.active === \"primary\" && this.mirrorWrites) {\n try {\n await persistKeepItems(this.fallback, merged);\n } catch {\n // The fallback is best-effort while the primary is healthy.\n }\n }\n return merged;\n });\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n const notify = (source: \"primary\" | \"fallback\") => {\n if (source === this.active) listener();\n };\n const unsubscribePrimary = this.primary.subscribe?.(() => notify(\"primary\"));\n const unsubscribeFallback = this.fallback.subscribe?.(() => notify(\"fallback\"));\n return () => {\n this.listeners.delete(listener);\n unsubscribePrimary?.();\n unsubscribeFallback?.();\n };\n }\n\n private async readAll(): Promise<KeepItem<TMeta>[]> {\n if (this.active === \"fallback\") return this.fallback.getAll();\n let items: KeepItem<TMeta>[];\n try {\n items = await this.primary.getAll();\n } catch (error) {\n if (!this.shouldFallback(error)) throw error;\n this.activateFallback(error);\n return this.fallback.getAll();\n }\n if (!this.migrateFallbackOnEmpty || items.length > 0) return items;\n\n const fallbackItems = await this.fallback.getAll();\n if (fallbackItems.length === 0) return items;\n try {\n await persistKeepItems(this.primary, fallbackItems);\n return fallbackItems;\n } catch (error) {\n if (!this.shouldFallback(error)) throw error;\n this.activateFallback(error);\n return fallbackItems;\n }\n }\n\n private activateFallback(error: unknown): void {\n this.active = \"fallback\";\n this.onFallback?.(error);\n for (const listener of this.listeners) listener();\n }\n\n private async executeWrite<TResult>(\n operation: (adapter: StorageAdapter<TMeta>) => Promise<TResult>,\n ): Promise<TResult> {\n const result = await this.execute(operation);\n if (this.active === \"primary\" && this.mirrorWrites) {\n try {\n await operation(this.fallback);\n } catch {\n // The fallback is best-effort while the primary is healthy.\n }\n }\n return result;\n }\n\n private async execute<TResult>(operation: (adapter: StorageAdapter<TMeta>) => Promise<TResult>): Promise<TResult> {\n const adapter = this.active === \"primary\" ? this.primary : this.fallback;\n try {\n return await operation(adapter);\n } catch (error) {\n if (this.active !== \"primary\" || !this.shouldFallback(error)) throw error;\n this.activateFallback(error);\n return operation(this.fallback);\n }\n }\n}\n\nexport type BrowserStorageAdapterOptions = {\n key?: string;\n databaseName?: string;\n storeName?: string;\n version?: number;\n indexedDB?: IDBFactory;\n storage?: Storage;\n scope?: KeepScope;\n};\n\n/** IndexedDB-first browser storage with localStorage fallback. */\nexport function createBrowserStorageAdapter<TMeta = Record<string, unknown>>(\n options: BrowserStorageAdapterOptions = {},\n): StorageAdapter<TMeta> {\n const browserIndexedDB = options.indexedDB ?? getBrowserIndexedDB();\n const scopeKey = getKeepScopeKey(options.scope);\n const storageKey = options.key\n ? `${options.key}${scopeKey}`\n : scopeKey\n ? `${DEFAULT_STORAGE_KEY}${scopeKey}`\n : undefined;\n const fallback = new LocalStorageAdapter<TMeta>({ key: storageKey, storage: options.storage });\n if (!browserIndexedDB) return options.scope ? createScopedStorageAdapter(fallback, options.scope) : fallback;\n const adapter = new FallbackStorageAdapter<TMeta>({\n primary: new IndexedDBAdapter<TMeta>({\n databaseName: options.databaseName ? `${options.databaseName}${scopeKey}` : undefined,\n storeName: options.storeName,\n version: options.version,\n indexedDB: browserIndexedDB,\n }),\n fallback,\n migrateFallbackOnEmpty: true,\n mirrorWrites: true,\n });\n return options.scope ? createScopedStorageAdapter(adapter, options.scope) : adapter;\n}\n\n/** Adapt sync or async persistence functions to the StorageAdapter contract. */\nexport function createStorageAdapter<TMeta = Record<string, unknown>>(\n options: StorageAdapterFactoryOptions<TMeta>,\n): StorageAdapter<TMeta> {\n const merge = options.merge;\n const subscribe = options.subscribe;\n const setMany = options.setMany;\n const removeMany = options.removeMany;\n const getCollections = options.getCollections;\n const setCollection = options.setCollection;\n const removeCollection = options.removeCollection;\n const getCollectionMemberships = options.getCollectionMemberships;\n const setCollectionMembership = options.setCollectionMembership;\n const removeCollectionMembership = options.removeCollectionMembership;\n return {\n getAll: async () => options.getAll(),\n ...(getCollections && setCollection && removeCollection\n ? {\n getCollections: async () => getCollections(),\n setCollection: async (collection: KeepCollectionDefinition) => setCollection(collection),\n removeCollection: async (id: string, scope?: KeepScope) => removeCollection(id, scope),\n }\n : {}),\n ...(getCollectionMemberships && setCollectionMembership && removeCollectionMembership\n ? {\n getCollectionMemberships: async () => getCollectionMemberships(),\n setCollectionMembership: async (membership: KeepCollectionMembership) => setCollectionMembership(membership),\n removeCollectionMembership: async (collectionId: string, itemId: string, scope?: KeepScope) =>\n removeCollectionMembership(collectionId, itemId, scope),\n }\n : {}),\n set: async (item) => options.set(item),\n ...(setMany ? { setMany: async (items: KeepItem<TMeta>[]) => setMany(items) } : {}),\n remove: async (id, scope) => options.remove(id, scope),\n ...(removeMany ? { removeMany: async (ids: string[], scope?: KeepScope) => removeMany(ids, scope) } : {}),\n clear: async () => options.clear(),\n ...(merge ? { merge: async (items: KeepItem<TMeta>[]) => merge(items) } : {}),\n ...(subscribe\n ? {\n subscribe: (listener: () => void) => subscribe(listener) ?? (() => undefined),\n }\n : {}),\n ...(options.storageKey ? { storageKey: options.storageKey } : {}),\n };\n}\n\nexport type { KeepScope } from \"../features/persistence/scope\";\nexport { createScopedStorageAdapter, ScopedStorageAdapter } from \"../features/persistence/scope\";\n\n/** An async StorageAdapter backed by browser localStorage. */\nexport class LocalStorageAdapter<TMeta = Record<string, unknown>> implements StorageAdapter<TMeta> {\n public readonly storageKey: string;\n private readonly storage: Storage | undefined;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.storageKey = options.key ?? DEFAULT_STORAGE_KEY;\n this.storage = options.storage ?? getBrowserStorage();\n }\n\n async getAll(): Promise<KeepItem<TMeta>[]> {\n if (!this.storage) return [];\n\n let raw: string | null;\n try {\n raw = this.storage.getItem(this.storageKey);\n } catch (cause) {\n throw new KeepStorageAccessError({\n operation: \"getAll\",\n storageKey: this.storageKey,\n cause,\n });\n }\n\n if (!raw) return [];\n\n try {\n const value: unknown = JSON.parse(raw);\n if (!isKeepItemArray(value)) {\n throw new KeepStorageParseError({\n operation: \"getAll\",\n storageKey: this.storageKey,\n });\n }\n return value as KeepItem<TMeta>[];\n } catch (cause) {\n if (cause instanceof KeepStorageParseError) throw cause;\n throw new KeepStorageParseError({\n operation: \"getAll\",\n storageKey: this.storageKey,\n cause,\n });\n }\n }\n\n async getCollections(): Promise<KeepCollectionDefinition[]> {\n if (!this.storage) return [];\n const storageKey = `${this.storageKey}:collections`;\n let raw: string | null;\n try {\n raw = this.storage.getItem(storageKey);\n } catch (cause) {\n throw new KeepStorageAccessError({ operation: \"getAll\", storageKey, cause });\n }\n if (!raw) return [];\n try {\n const value: unknown = JSON.parse(raw);\n if (!Array.isArray(value) || !value.every(isKeepCollectionDefinition)) {\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey });\n }\n return value;\n } catch (cause) {\n if (cause instanceof KeepStorageParseError) throw cause;\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey, cause });\n }\n }\n\n async setCollection(collection: KeepCollectionDefinition): Promise<void> {\n if (!isKeepCollectionDefinition(collection)) throw new Error(\"Collection id and name are required.\");\n const current = await this.getCollections();\n await this.writeCollections(\n [\n ...current.filter((entry) => entry.id !== collection.id || !isSameKeepScope(entry.scope, collection.scope)),\n collection,\n ],\n \"set\",\n );\n }\n\n async removeCollection(id: string, scope?: KeepScope): Promise<void> {\n const current = await this.getCollections();\n await this.writeCollections(\n current.filter((entry) => entry.id !== id || !isSameKeepScope(entry.scope, scope)),\n \"remove\",\n );\n const memberships = await this.getCollectionMemberships();\n await this.writeMemberships(\n memberships.filter((membership) => membership.collectionId !== id || !isSameKeepScope(membership.scope, scope)),\n \"remove\",\n );\n }\n\n async getCollectionMemberships(): Promise<KeepCollectionMembership[]> {\n if (!this.storage) return [];\n const storageKey = `${this.storageKey}:memberships`;\n let raw: string | null;\n try {\n raw = this.storage.getItem(storageKey);\n } catch (cause) {\n throw new KeepStorageAccessError({ operation: \"getAll\", storageKey, cause });\n }\n if (!raw) return [];\n try {\n const value: unknown = JSON.parse(raw);\n if (!Array.isArray(value) || !value.every(isKeepCollectionMembership)) {\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey });\n }\n return value;\n } catch (cause) {\n if (cause instanceof KeepStorageParseError) throw cause;\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey, cause });\n }\n }\n\n async setCollectionMembership(membership: KeepCollectionMembership): Promise<void> {\n if (!isKeepCollectionMembership(membership)) throw new Error(\"Collection membership is invalid.\");\n const current = await this.getCollectionMemberships();\n const sameMembership = (entry: KeepCollectionMembership) =>\n entry.collectionId === membership.collectionId &&\n entry.itemId === membership.itemId &&\n isSameKeepScope(entry.scope, membership.scope);\n await this.writeMemberships([...current.filter((entry) => !sameMembership(entry)), membership], \"set\");\n }\n\n async removeCollectionMembership(collectionId: string, itemId: string, scope?: KeepScope): Promise<void> {\n const current = await this.getCollectionMemberships();\n await this.writeMemberships(\n current.filter(\n (entry) =>\n entry.collectionId !== collectionId || entry.itemId !== itemId || !isSameKeepScope(entry.scope, scope),\n ),\n \"remove\",\n );\n }\n\n async set(item: KeepItem<TMeta>): Promise<void> {\n await this.setMany([item]);\n }\n\n async setMany(items: KeepItem<TMeta>[]): Promise<void> {\n const current = await this.getAll();\n const byScopeAndId = new Map(current.map((item) => [getItemStorageKey(item), item]));\n for (const item of items) byScopeAndId.set(getItemStorageKey(item), item);\n this.write([...byScopeAndId.values()], \"set\");\n }\n\n async remove(id: string, scope?: KeepScope): Promise<void> {\n await this.removeMany([id], scope);\n }\n\n async removeMany(ids: string[], scope?: KeepScope): Promise<void> {\n const idSet = new Set(ids);\n const items = await this.getAll();\n this.write(\n items.filter((item) => !idSet.has(item.id) || (scope !== undefined && !isSameKeepScope(item.scope, scope))),\n \"remove\",\n );\n const memberships = await this.getCollectionMemberships();\n const membershipIds = memberships.filter(\n (membership) => idSet.has(membership.itemId) && (scope === undefined || isSameKeepScope(membership.scope, scope)),\n );\n for (const membership of membershipIds) {\n await this.removeCollectionMembership(membership.collectionId, membership.itemId, membership.scope);\n }\n }\n\n async clear(): Promise<void> {\n if (!this.storage) return;\n try {\n const items = await this.getAll();\n if (items.length > 0) await this.removeMany(items.map((item) => item.id));\n const memberships = await this.getCollectionMemberships();\n for (const membership of memberships) {\n await this.removeCollectionMembership(membership.collectionId, membership.itemId, membership.scope);\n }\n this.storage.removeItem(this.storageKey);\n } catch (cause) {\n throw new KeepStorageAccessError({\n operation: \"clear\",\n storageKey: this.storageKey,\n cause,\n });\n }\n }\n\n async merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]> {\n const merged = mergeKeepItemLists(await this.getAll(), localItems);\n this.write(merged, \"merge\");\n return merged;\n }\n\n subscribe(listener: () => void): () => void {\n if (typeof window === \"undefined\") return () => undefined;\n\n const handleStorage = (event: StorageEvent) => {\n if (\n event.key !== null &&\n event.key !== this.storageKey &&\n event.key !== `${this.storageKey}:collections` &&\n event.key !== `${this.storageKey}:memberships`\n )\n return;\n listener();\n };\n\n window.addEventListener(\"storage\", handleStorage);\n return () => window.removeEventListener(\"storage\", handleStorage);\n }\n\n private write(items: KeepItem<TMeta>[], operation: KeepStorageOperation): void {\n if (!this.storage) return;\n try {\n this.storage.setItem(this.storageKey, JSON.stringify(items));\n } catch (cause) {\n if (isQuotaExceededError(cause)) {\n throw new KeepStorageQuotaError({\n operation,\n storageKey: this.storageKey,\n cause,\n });\n }\n throw new KeepStorageAccessError({\n operation,\n storageKey: this.storageKey,\n cause,\n });\n }\n }\n\n private async writeCollections(\n collections: KeepCollectionDefinition[],\n operation: KeepStorageOperation,\n ): Promise<void> {\n if (!this.storage) return;\n const storageKey = `${this.storageKey}:collections`;\n try {\n this.storage.setItem(storageKey, JSON.stringify(collections));\n } catch (cause) {\n if (isQuotaExceededError(cause)) throw new KeepStorageQuotaError({ operation, storageKey, cause });\n throw new KeepStorageAccessError({ operation, storageKey, cause });\n }\n }\n\n private async writeMemberships(\n memberships: KeepCollectionMembership[],\n operation: KeepStorageOperation,\n ): Promise<void> {\n if (!this.storage) return;\n const storageKey = `${this.storageKey}:memberships`;\n try {\n this.storage.setItem(storageKey, JSON.stringify(memberships));\n } catch (cause) {\n if (isQuotaExceededError(cause)) throw new KeepStorageQuotaError({ operation, storageKey, cause });\n throw new KeepStorageAccessError({ operation, storageKey, cause });\n }\n }\n}\n\n/** An async StorageAdapter backed by IndexedDB, with one object store per adapter. */\nexport class IndexedDBAdapter<TMeta = Record<string, unknown>> implements StorageAdapter<TMeta> {\n public readonly storageKey: string;\n private readonly databaseName: string;\n private readonly storeName: string;\n private readonly version: number;\n private readonly indexedDB: IDBFactory | undefined;\n private databasePromise: Promise<IDBDatabase | undefined> | undefined;\n private collectionDatabasePromise: Promise<IDBDatabase | undefined> | undefined;\n\n constructor(options: IndexedDBAdapterOptions = {}) {\n this.databaseName = options.databaseName ?? options.dbName ?? options.key ?? DEFAULT_INDEXEDDB_DATABASE;\n this.storeName = options.storeName ?? DEFAULT_INDEXEDDB_STORE;\n this.version = options.version ?? 1;\n this.indexedDB = options.indexedDB ?? getBrowserIndexedDB();\n this.storageKey = `${this.databaseName}:${this.storeName}`;\n }\n\n async getAll(): Promise<KeepItem<TMeta>[]> {\n const database = await this.open(\"getAll\");\n if (!database) return [];\n try {\n const transaction = database.transaction(this.storeName, \"readonly\");\n const value: unknown = await requestToPromise(transaction.objectStore(this.storeName).getAll());\n if (!isKeepItemArray(value)) {\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey: this.storageKey });\n }\n return (value as KeepItem<TMeta>[]).map(decodeIndexedDBItem);\n } catch (cause) {\n if (cause instanceof KeepStorageParseError) throw cause;\n throw new KeepStorageAccessError({ operation: \"getAll\", storageKey: this.storageKey, cause });\n }\n }\n\n async getCollections(): Promise<KeepCollectionDefinition[]> {\n const database = await this.openCollections(\"getAll\");\n if (!database) return [];\n const storageKey = `${this.storageKey}:collections`;\n try {\n const transaction = database.transaction(\"collections\", \"readonly\");\n const value: unknown = await requestToPromise(transaction.objectStore(\"collections\").getAll());\n if (\n !Array.isArray(value) ||\n !value.every((entry) => isRecord(entry) && typeof entry.key === \"string\" && isKeepCollectionDefinition(entry))\n ) {\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey });\n }\n return value.map(({ key: _key, ...collection }) => collection);\n } catch (cause) {\n if (cause instanceof KeepStorageParseError) throw cause;\n throw new KeepStorageAccessError({ operation: \"getAll\", storageKey, cause });\n }\n }\n\n async setCollection(collection: KeepCollectionDefinition): Promise<void> {\n if (!isKeepCollectionDefinition(collection)) throw new Error(\"Collection id and name are required.\");\n await this.writeCollection(\"set\", (store) =>\n store.put({ ...collection, key: collectionKey(collection.id, collection.scope) }),\n );\n }\n\n async removeCollection(id: string, scope?: KeepScope): Promise<void> {\n await this.writeCollection(\"remove\", (store) => store.delete(collectionKey(id, scope)));\n const memberships = await this.getCollectionMemberships();\n for (const membership of memberships) {\n if (membership.collectionId === id && isSameKeepScope(membership.scope, scope)) {\n await this.removeCollectionMembership(id, membership.itemId, scope);\n }\n }\n }\n\n async getCollectionMemberships(): Promise<KeepCollectionMembership[]> {\n const database = await this.openCollections(\"getAll\");\n if (!database) return [];\n const storageKey = `${this.storageKey}:memberships`;\n try {\n const transaction = database.transaction(\"memberships\", \"readonly\");\n const value: unknown = await requestToPromise(transaction.objectStore(\"memberships\").getAll());\n if (\n !Array.isArray(value) ||\n !value.every((entry) => isRecord(entry) && typeof entry.key === \"string\" && isKeepCollectionMembership(entry))\n ) {\n throw new KeepStorageParseError({ operation: \"getAll\", storageKey });\n }\n return value.map(({ key: _key, ...membership }) => membership);\n } catch (cause) {\n if (cause instanceof KeepStorageParseError) throw cause;\n throw new KeepStorageAccessError({ operation: \"getAll\", storageKey, cause });\n }\n }\n\n async setCollectionMembership(membership: KeepCollectionMembership): Promise<void> {\n if (!isKeepCollectionMembership(membership)) throw new Error(\"Collection membership is invalid.\");\n await this.writeCollectionMembership(\"set\", (store) =>\n store.put({ ...membership, key: membershipKey(membership.collectionId, membership.itemId, membership.scope) }),\n );\n }\n\n async removeCollectionMembership(collectionId: string, itemId: string, scope?: KeepScope): Promise<void> {\n await this.writeCollectionMembership(\"remove\", (store) => store.delete(membershipKey(collectionId, itemId, scope)));\n }\n\n async set(item: KeepItem<TMeta>): Promise<void> {\n return this.setMany([item]);\n }\n\n async setMany(items: KeepItem<TMeta>[]): Promise<void> {\n const database = await this.open(\"set\");\n if (!database) return;\n try {\n const identities = new Set(items.map(getItemIdentity));\n const previous = (await this.getAll()).filter((item) => identities.has(getItemIdentity(item)));\n const transaction = database.transaction(this.storeName, \"readwrite\");\n const objectStore = transaction.objectStore(this.storeName);\n for (const item of previous) objectStore.delete(getStoredIndexedDBItemId(item));\n for (const item of items) objectStore.put(encodeIndexedDBItem(item));\n await transactionToPromise(transaction);\n this.notifySubscribers();\n } catch (cause) {\n if (isQuotaExceededError(cause)) {\n throw new KeepStorageQuotaError({ operation: \"set\", storageKey: this.storageKey, cause });\n }\n throw new KeepStorageAccessError({ operation: \"set\", storageKey: this.storageKey, cause });\n }\n }\n\n async remove(id: string, scope?: KeepScope): Promise<void> {\n return this.removeMany([id], scope);\n }\n\n async removeMany(ids: string[], scope?: KeepScope): Promise<void> {\n const database = await this.open(\"remove\");\n if (!database) return;\n try {\n const idSet = new Set(ids);\n const removableIds = (await this.getAll())\n .filter((item) => idSet.has(item.id) && (scope === undefined || isSameKeepScope(item.scope, scope)))\n .map(getStoredIndexedDBItemId);\n const transaction = database.transaction(this.storeName, \"readwrite\");\n const objectStore = transaction.objectStore(this.storeName);\n for (const id of removableIds) objectStore.delete(id);\n await transactionToPromise(transaction);\n const memberships = await this.getCollectionMemberships();\n for (const membership of memberships) {\n if (idSet.has(membership.itemId) && (scope === undefined || isSameKeepScope(membership.scope, scope))) {\n await this.removeCollectionMembership(membership.collectionId, membership.itemId, membership.scope);\n }\n }\n this.notifySubscribers();\n } catch (cause) {\n throw new KeepStorageAccessError({ operation: \"remove\", storageKey: this.storageKey, cause });\n }\n }\n\n async clear(): Promise<void> {\n const database = await this.open(\"clear\");\n if (!database) return;\n try {\n const items = await this.getAll();\n if (items.length > 0) await this.removeMany(items.map((item) => item.id));\n const memberships = await this.getCollectionMemberships();\n for (const membership of memberships) {\n await this.removeCollectionMembership(membership.collectionId, membership.itemId, membership.scope);\n }\n const transaction = database.transaction(this.storeName, \"readwrite\");\n transaction.objectStore(this.storeName).clear();\n await transactionToPromise(transaction);\n this.notifySubscribers();\n } catch (cause) {\n throw new KeepStorageAccessError({ operation: \"clear\", storageKey: this.storageKey, cause });\n }\n }\n\n async merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]> {\n try {\n const merged = mergeKeepItemLists(await this.getAll(), localItems);\n await this.setMany(merged);\n return merged;\n } catch (cause) {\n if (cause instanceof KeepStorageError) throw cause;\n throw new KeepStorageAccessError({ operation: \"merge\", storageKey: this.storageKey, cause });\n }\n }\n\n subscribe(listener: () => void): () => void {\n if (!this.indexedDB || typeof BroadcastChannel === \"undefined\") return () => undefined;\n const channel = new BroadcastChannel(`keepkit:${this.storageKey}`);\n channel.onmessage = () => listener();\n return () => channel.close();\n }\n\n private notifySubscribers(): void {\n if (!this.indexedDB || typeof BroadcastChannel === \"undefined\") return;\n const channel = new BroadcastChannel(`keepkit:${this.storageKey}`);\n channel.postMessage({ type: \"keepkit:changed\" });\n channel.close();\n }\n\n private async writeCollection(\n operation: KeepStorageOperation,\n write: (store: IDBObjectStore) => void,\n ): Promise<void> {\n const database = await this.openCollections(operation);\n if (!database) return;\n const storageKey = `${this.storageKey}:collections`;\n try {\n const transaction = database.transaction(\"collections\", \"readwrite\");\n write(transaction.objectStore(\"collections\"));\n await transactionToPromise(transaction);\n this.notifySubscribers();\n } catch (cause) {\n if (isQuotaExceededError(cause)) throw new KeepStorageQuotaError({ operation, storageKey, cause });\n throw new KeepStorageAccessError({ operation, storageKey, cause });\n }\n }\n\n private async writeCollectionMembership(\n operation: KeepStorageOperation,\n write: (store: IDBObjectStore) => void,\n ): Promise<void> {\n const database = await this.openCollections(operation);\n if (!database) return;\n const storageKey = `${this.storageKey}:memberships`;\n try {\n const transaction = database.transaction(\"memberships\", \"readwrite\");\n write(transaction.objectStore(\"memberships\"));\n await transactionToPromise(transaction);\n this.notifySubscribers();\n } catch (cause) {\n if (isQuotaExceededError(cause)) throw new KeepStorageQuotaError({ operation, storageKey, cause });\n throw new KeepStorageAccessError({ operation, storageKey, cause });\n }\n }\n\n private openCollections(operation: KeepStorageOperation): Promise<IDBDatabase | undefined> {\n if (!this.indexedDB) return Promise.resolve(undefined);\n const storageKey = `${this.storageKey}:collections`;\n if (!this.collectionDatabasePromise) {\n this.collectionDatabasePromise = new Promise((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = this.indexedDB?.open(storageKey, 2) as IDBOpenDBRequest;\n } catch (cause) {\n reject(cause);\n return;\n }\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(\"collections\")) {\n request.result.createObjectStore(\"collections\", { keyPath: \"key\" });\n }\n if (!request.result.objectStoreNames.contains(\"memberships\")) {\n request.result.createObjectStore(\"memberships\", { keyPath: \"key\" });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n request.onblocked = () => reject(request.error ?? new Error(\"IndexedDB collection storage open was blocked.\"));\n });\n }\n return this.collectionDatabasePromise.catch((cause) => {\n this.collectionDatabasePromise = undefined;\n throw new KeepStorageAccessError({ operation, storageKey, cause });\n });\n }\n\n private open(operation: KeepStorageOperation): Promise<IDBDatabase | undefined> {\n if (!this.indexedDB) return Promise.resolve(undefined);\n if (!this.databasePromise) {\n this.databasePromise = new Promise((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = this.indexedDB?.open(this.databaseName, this.version) as IDBOpenDBRequest;\n } catch (cause) {\n reject(new KeepStorageAccessError({ operation, storageKey: this.storageKey, cause }));\n return;\n }\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(this.storeName)) {\n request.result.createObjectStore(this.storeName, { keyPath: \"id\" });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n request.onblocked = () => reject(request.error ?? new Error(\"IndexedDB open was blocked.\"));\n });\n }\n return this.databasePromise.catch((cause) => {\n this.databasePromise = undefined;\n if (cause instanceof KeepStorageError) throw cause;\n throw new KeepStorageAccessError({ operation, storageKey: this.storageKey, cause });\n });\n }\n}\n\nconst indexedDBStoredItemId = Symbol(\"keepkit.indexeddb-stored-item-id\");\n\ntype IndexedDBStoredItem<TMeta> = KeepItem<TMeta> & { [indexedDBStoredItemId]?: string };\n\nfunction encodeIndexedDBItem<TMeta>(item: KeepItem<TMeta>): Record<string, unknown> {\n if (!item.scope) return item;\n return {\n ...item,\n id: createScopedIndexedDBItemId(item),\n __keepkitOriginalId: item.id,\n };\n}\n\nfunction decodeIndexedDBItem<TMeta>(item: KeepItem<TMeta>): KeepItem<TMeta> {\n const originalId = (item as KeepItem<TMeta> & { __keepkitOriginalId?: unknown }).__keepkitOriginalId;\n const isEncoded =\n typeof originalId === \"string\" &&\n item.scope !== undefined &&\n item.id === createScopedIndexedDBItemId({ ...item, id: originalId });\n const { __keepkitOriginalId: _encodedOriginalId, ...record } = item as KeepItem<TMeta> & {\n __keepkitOriginalId?: unknown;\n };\n const decoded = isEncoded ? { ...record, id: originalId as string } : item;\n Object.defineProperty(decoded, indexedDBStoredItemId, { value: item.id });\n return decoded;\n}\n\nfunction getStoredIndexedDBItemId<TMeta>(item: KeepItem<TMeta>): string {\n return (item as IndexedDBStoredItem<TMeta>)[indexedDBStoredItemId] ?? createScopedIndexedDBItemId(item);\n}\n\nfunction createScopedIndexedDBItemId(item: Pick<KeepItem, \"id\" | \"scope\">): string {\n if (!item.scope) return item.id;\n return `\\u0000keepkit-scope:${JSON.stringify([item.scope.tenantId ?? null, item.scope.userId ?? null, item.id])}`;\n}\n\nfunction getItemIdentity(item: Pick<KeepItem, \"id\" | \"scope\">): string {\n return JSON.stringify([item.scope?.tenantId ?? null, item.scope?.userId ?? null, item.id]);\n}\n\nfunction collectionKey(id: string, scope?: KeepScope): string {\n return JSON.stringify([scope?.tenantId ?? null, scope?.userId ?? null, id]);\n}\n\nfunction getItemStorageKey(item: Pick<KeepItem, \"id\" | \"scope\">): string {\n return JSON.stringify([item.scope?.tenantId ?? null, item.scope?.userId ?? null, item.id]);\n}\n\nfunction membershipKey(collectionId: string, itemId: string, scope?: KeepScope): string {\n return JSON.stringify([scope?.tenantId ?? null, scope?.userId ?? null, collectionId, itemId]);\n}\n\nfunction getBrowserStorage(): Storage | undefined {\n if (typeof window === \"undefined\") return undefined;\n try {\n return window.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction getBrowserIndexedDB(): IDBFactory | undefined {\n if (typeof indexedDB === \"undefined\") return undefined;\n return indexedDB;\n}\n\nfunction isRecoverableStorageError(error: unknown): boolean {\n return error instanceof KeepStorageAccessError || error instanceof KeepStorageQuotaError;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error ?? new Error(\"IndexedDB transaction aborted.\"));\n });\n}\n\nfunction isQuotaExceededError(cause: unknown): boolean {\n if (!isRecord(cause)) return false;\n return (\n cause.name === \"QuotaExceededError\" ||\n cause.name === \"NS_ERROR_DOM_QUOTA_REACHED\" ||\n cause.code === 22 ||\n cause.code === 1014\n );\n}\n\nexport { ScopedSyncQueueAdapter } from \"../features/persistence/scope\";\nexport {\n DEFAULT_SYNC_QUEUE_DATABASE,\n DEFAULT_SYNC_QUEUE_KEY,\n DEFAULT_SYNC_QUEUE_STORE,\n FallbackSyncQueueAdapter,\n type FallbackSyncQueueAdapterOptions,\n IndexedDBSyncQueueAdapter,\n type IndexedDBSyncQueueOptions,\n LocalStorageSyncQueueAdapter,\n type LocalStorageSyncQueueOptions,\n SyncStorageAdapter,\n type SyncStorageAdapterOptions,\n} from \"./sync\";\n"],"mappings":"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","names":["merged","result","indexedDB","getBrowserIndexedDB","getBrowserStorage","requestToPromise","transactionToPromise"]}
|