@seedprotocol/sdk 0.7.4-next.793.g6dd83dd → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/{BasePathResolver-DT63t0XU.js → BasePathResolver-DrzGVH9L.js} +231 -39
  2. package/dist/BasePathResolver-DrzGVH9L.js.map +1 -0
  3. package/dist/{ClientManager-Cos8NaRU.js → ClientManager-Dfu4jcgm.js} +300 -188
  4. package/dist/ClientManager-Dfu4jcgm.js.map +1 -0
  5. package/dist/{Item-CoP48bl3.js → Item-BUUFuywT.js} +75 -219
  6. package/dist/Item-BUUFuywT.js.map +1 -0
  7. package/dist/{ModelProperty-jSo2QWIc.js → ModelProperty-B6cnRvIz.js} +37 -38
  8. package/dist/ModelProperty-B6cnRvIz.js.map +1 -0
  9. package/dist/{Schema-DN1KwJ57.js → Schema-Bf-jOLq0.js} +36 -35
  10. package/dist/{Schema-DN1KwJ57.js.map → Schema-Bf-jOLq0.js.map} +1 -1
  11. package/dist/{SchemaValidationService-CCG9Bu__.js → SchemaValidationService-BNYMacsx.js} +7 -8
  12. package/dist/{SchemaValidationService-CCG9Bu__.js.map → SchemaValidationService-BNYMacsx.js.map} +1 -1
  13. package/dist/{backfillMetadataPropertyIds-D8t61oNl.js → backfillMetadataPropertyIds-C2-s_jUa.js} +4 -5
  14. package/dist/{backfillMetadataPropertyIds-D8t61oNl.js.map → backfillMetadataPropertyIds-C2-s_jUa.js.map} +1 -1
  15. package/dist/{configurePlatform-Su9vV5qO.js → configurePlatform-BzfirKuM.js} +3 -4
  16. package/dist/{configurePlatform-Su9vV5qO.js.map → configurePlatform-BzfirKuM.js.map} +1 -1
  17. package/dist/{detachRowsBeforeDelete-DcWDZ8KP.js → detachRowsBeforeDelete-B0Daoz9Z.js} +3 -4
  18. package/dist/{detachRowsBeforeDelete-DcWDZ8KP.js.map → detachRowsBeforeDelete-B0Daoz9Z.js.map} +1 -1
  19. package/dist/{eas-Ce0KDpvb.js → eas-Dq5Kx_Nd.js} +14 -32
  20. package/dist/eas-Dq5Kx_Nd.js.map +1 -0
  21. package/dist/{errors-D1brJy1k.js → errors-DdWbxb_n.js} +42 -39
  22. package/dist/errors-DdWbxb_n.js.map +1 -0
  23. package/dist/{getItem-Cs5IIZCQ.js → getItem-9bYSErSj.js} +4 -5
  24. package/dist/{getItem-Cs5IIZCQ.js.map → getItem-9bYSErSj.js.map} +1 -1
  25. package/dist/{getPublishPayload-CquFaK1c.js → getPublishPayload-DPy-uMrR.js} +28 -29
  26. package/dist/getPublishPayload-DPy-uMrR.js.map +1 -0
  27. package/dist/{getPublishUploads-Bv9aOq2x.js → getPublishUploads-J-143iSV.js} +10 -11
  28. package/dist/{getPublishUploads-Bv9aOq2x.js.map → getPublishUploads-J-143iSV.js.map} +1 -1
  29. package/dist/{index-BPrJV9Wt.js → index-7y2f_iQz.js} +2 -2
  30. package/dist/index-7y2f_iQz.js.map +1 -0
  31. package/dist/{index-DhP5gMMF.js → index-C61Rxy0F.js} +9 -10
  32. package/dist/index-C61Rxy0F.js.map +1 -0
  33. package/dist/{index.browser-cpZehMwT.js → index.browser-C1pisOEa.js} +10 -10
  34. package/dist/{index.browser-cpZehMwT.js.map → index.browser-C1pisOEa.js.map} +1 -1
  35. package/dist/{index.node-D_-a9z-S.js → index.node-BAlST8pD.js} +6 -6
  36. package/dist/{index.node-D_-a9z-S.js.map → index.node-BAlST8pD.js.map} +1 -1
  37. package/dist/main.js +27 -28
  38. package/dist/main.js.map +1 -1
  39. package/dist/node.js +12 -13
  40. package/dist/node.js.map +1 -1
  41. package/dist/platform.browser.js +6 -7
  42. package/dist/platform.browser.js.map +1 -1
  43. package/dist/platform.node.js +5 -6
  44. package/dist/platform.node.js.map +1 -1
  45. package/dist/{property-DNfhGsdq.js → property-zFPMtR3T.js} +10 -14
  46. package/dist/property-zFPMtR3T.js.map +1 -0
  47. package/dist/{propertyValidationRules-BiEBQvPZ.js → propertyValidationRules-CeFVhdQg.js} +10 -10
  48. package/dist/{propertyValidationRules-BiEBQvPZ.js.map → propertyValidationRules-CeFVhdQg.js.map} +1 -1
  49. package/dist/{publishDraftGraph-BZ6gku_X.js → publishDraftGraph-CuVq6iAR.js} +7 -6
  50. package/dist/{publishDraftGraph-BZ6gku_X.js.map → publishDraftGraph-CuVq6iAR.js.map} +1 -1
  51. package/dist/{resetAmbiguousLegacyItemData-CkSoBEOU.js → resetAmbiguousLegacyItemData-DsFTnMBz.js} +5 -6
  52. package/dist/resetAmbiguousLegacyItemData-DsFTnMBz.js.map +1 -0
  53. package/dist/{resolveModelForSyncedSeed-CsnKV72V.js → resolveModelForSyncedSeed-RUsgAZXG.js} +2 -2
  54. package/dist/{resolveModelForSyncedSeed-CsnKV72V.js.map → resolveModelForSyncedSeed-RUsgAZXG.js.map} +1 -1
  55. package/dist/src/Item/Item.d.ts.map +1 -1
  56. package/dist/src/ItemProperty/service/propertyMachine.d.ts +4 -4
  57. package/dist/src/Model/Model.d.ts +3 -2
  58. package/dist/src/Model/Model.d.ts.map +1 -1
  59. package/dist/src/ModelProperty/ModelProperty.d.ts +1 -1
  60. package/dist/src/ModelProperty/service/modelPropertyMachine.d.ts +1 -1
  61. package/dist/src/Schema/service/schemaMachine.d.ts +2 -2
  62. package/dist/src/client/ClientManager.d.ts +6 -6
  63. package/dist/src/client/clientManagerMachine.d.ts +2 -2
  64. package/dist/src/client/clientManagerMachine.d.ts.map +1 -1
  65. package/dist/src/db/canonicalizeModelTypes.d.ts +18 -0
  66. package/dist/src/db/canonicalizeModelTypes.d.ts.map +1 -0
  67. package/dist/src/db/read/getModelSchemas.d.ts +6 -0
  68. package/dist/src/db/read/getModelSchemas.d.ts.map +1 -1
  69. package/dist/src/db/read/getPublishPayload.d.ts.map +1 -1
  70. package/dist/src/db/read/resolveModelRecord.d.ts.map +1 -1
  71. package/dist/src/db/write/createMetadata.d.ts.map +1 -1
  72. package/dist/src/db/write/updateMetadata.d.ts.map +1 -1
  73. package/dist/src/eas.d.ts.map +1 -1
  74. package/dist/src/events/item/syncDbWithEas.d.ts.map +1 -1
  75. package/dist/src/helpers/db.d.ts +20 -0
  76. package/dist/src/helpers/db.d.ts.map +1 -1
  77. package/dist/src/helpers/index.d.ts +3 -1
  78. package/dist/src/helpers/index.d.ts.map +1 -1
  79. package/dist/src/helpers/metadataPropertyNames.d.ts +12 -0
  80. package/dist/src/helpers/metadataPropertyNames.d.ts.map +1 -1
  81. package/dist/src/imports/json.d.ts +10 -0
  82. package/dist/src/imports/json.d.ts.map +1 -1
  83. package/dist/src/index.d.ts +2 -2
  84. package/dist/src/index.d.ts.map +1 -1
  85. package/dist/src/query/createLocalQueryDataSource.d.ts.map +1 -1
  86. package/dist/src/types/import.d.ts +4 -0
  87. package/dist/src/types/import.d.ts.map +1 -1
  88. package/dist/{syncDbWithEas-CfRijZhj.js → syncDbWithEas-CRpnkq00.js} +157 -61
  89. package/dist/syncDbWithEas-CRpnkq00.js.map +1 -0
  90. package/dist/{tabEvents-D5X2Hwcp.js → tabEvents-nBUq_1u1.js} +6 -6
  91. package/dist/{tabEvents-D5X2Hwcp.js.map → tabEvents-nBUq_1u1.js.map} +1 -1
  92. package/dist/{tolerantWebAccess-BNYRvW9a.js → tolerantWebAccess-DIt3R8_u.js} +7 -8
  93. package/dist/{tolerantWebAccess-BNYRvW9a.js.map → tolerantWebAccess-DIt3R8_u.js.map} +1 -1
  94. package/dist/{updateSeedRevokedAt-B-xAQxaj.js → updateSeedRevokedAt-DtTPSzpM.js} +3 -3
  95. package/dist/{updateSeedRevokedAt-B-xAQxaj.js.map → updateSeedRevokedAt-DtTPSzpM.js.map} +1 -1
  96. package/package.json +5 -5
  97. package/dist/BasePathResolver-DT63t0XU.js.map +0 -1
  98. package/dist/ClientManager-Cos8NaRU.js.map +0 -1
  99. package/dist/Item-CoP48bl3.js.map +0 -1
  100. package/dist/ModelProperty-jSo2QWIc.js.map +0 -1
  101. package/dist/eas-Ce0KDpvb.js.map +0 -1
  102. package/dist/errors-D1brJy1k.js.map +0 -1
  103. package/dist/getPublishPayload-CquFaK1c.js.map +0 -1
  104. package/dist/index-BPrJV9Wt.js.map +0 -1
  105. package/dist/index-DhP5gMMF.js.map +0 -1
  106. package/dist/property-DNfhGsdq.js.map +0 -1
  107. package/dist/resetAmbiguousLegacyItemData-CkSoBEOU.js.map +0 -1
  108. package/dist/syncDbWithEas-CfRijZhj.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tabEvents-D5X2Hwcp.js","sources":["../../src/client/events.ts","../../src/helpers/tabLocks.ts","../../src/helpers/tabCoordinator.ts","../../src/helpers/tabEvents.ts"],"sourcesContent":["/** Emitted by the client manager after `app_state.addresses` is written (post-`setAddresses`). */\nexport const ADDRESSES_PERSISTED_EVENT = 'addresses.persisted' as const\n\n/** Emitted after hard-deleting local on-chain seed copies for publisher addresses. */\nexport const LOCAL_COPIES_REMOVED_EVENT = 'localCopies.removed' as const\n\nexport type AddressesPersistedPayload = {\n owned: string[]\n watched: string[]\n}\n\nexport type LocalCopiesRemovedPayload = {\n addresses: string[]\n removedSeedLocalIds: string[]\n removedSeedUids: string[]\n}\n\nexport function parseAddressesPersistedPayload(\n value: unknown,\n): AddressesPersistedPayload {\n if (!value || typeof value !== 'object') {\n return { owned: [], watched: [] }\n }\n const v = value as { owned?: unknown; watched?: unknown }\n const owned = Array.isArray(v.owned)\n ? v.owned.filter((a): a is string => typeof a === 'string')\n : []\n const watched = Array.isArray(v.watched)\n ? v.watched.filter((a): a is string => typeof a === 'string')\n : []\n return { owned, watched }\n}\n","/**\n * Cross-tab exclusive sections, using the Web Locks API. All tabs of an origin share one SQLite\n * database and OPFS tree; the browser releases a tab's locks when it closes or crashes, so a lock\n * can't go stale. See docs/MULTI_TAB.md.\n *\n * Node has Web Locks from 24.5, scoped to the process. Where they're missing (older Node, old\n * browsers), sections still run one at a time within this JS realm (see `withProcessLock`), which\n * covers a single Node process but not other tabs or worker threads.\n * Not re-entrant: requesting a name the caller already holds waits forever, so take each lock\n * only at the outermost call site.\n */\n\n/** Long enough for a slow init in another tab; short enough that a hung tab doesn't block forever. */\nexport const TAB_LOCK_WAIT_TIMEOUT_MS = 60_000\n\n/**\n * - `migrate`: schema migrations and one-time data fixes in `prepareDb`.\n * - `init`: client init steps that check for rows and then insert them.\n */\nexport type SeedDbLockScope = 'migrate' | 'init'\n\nexport function seedDbLockName(scope: SeedDbLockScope, filesDir: string): string {\n return `seed:${scope}:${filesDir}/db/seed.db`\n}\n\n/** `withTabLock` on the database under `filesDir`; runs `fn` directly when there's no `filesDir` yet. */\nexport function withSeedDbLock<T>(\n scope: SeedDbLockScope,\n filesDir: string | undefined,\n fn: () => Promise<T>,\n): Promise<T> {\n return filesDir ? withTabLock(seedDbLockName(scope, filesDir), fn) : fn()\n}\n\nexport class TabLockTimeoutError extends Error {\n readonly code = 'TAB_LOCK_TIMEOUT' as const\n\n constructor(readonly lockName: string, timeoutMs: number) {\n super(`Timed out after ${timeoutMs}ms waiting for another tab to release \"${lockName}\".`)\n this.name = 'TabLockTimeoutError'\n }\n}\n\nexport async function withTabLock<T>(\n name: string,\n fn: () => Promise<T>,\n { timeoutMs = TAB_LOCK_WAIT_TIMEOUT_MS }: { timeoutMs?: number } = {},\n): Promise<T> {\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined\n if (!locks) return withProcessLock(name, fn, { timeoutMs })\n\n try {\n // The timeout bounds the wait only; once granted, fn runs to completion. Infinity waits for as\n // long as the holder runs (it can't outlive its tab).\n const signal = Number.isFinite(timeoutMs) ? AbortSignal.timeout(timeoutMs) : undefined\n return await locks.request(name, { mode: 'exclusive', signal }, fn)\n } catch (error) {\n if ((error as DOMException | null)?.name === 'TimeoutError') {\n throw new TabLockTimeoutError(name, timeoutMs)\n }\n throw error\n }\n}\n\n/** Tail of each name's queue: resolves once every section queued so far has finished or given up. */\nconst processLockTails = new Map<string, Promise<void>>()\n\n/**\n * The `withTabLock` fallback without Web Locks: an exclusive, first-come-first-served lock per name\n * within this JS realm. Like Web Locks, `timeoutMs` bounds the wait only, and a waiter that times\n * out doesn't let later waiters in before the current holder finishes.\n */\nexport async function withProcessLock<T>(\n name: string,\n fn: () => Promise<T>,\n { timeoutMs = TAB_LOCK_WAIT_TIMEOUT_MS }: { timeoutMs?: number } = {},\n): Promise<T> {\n const previous = processLockTails.get(name) ?? Promise.resolve()\n let release!: () => void\n const done = new Promise<void>((resolve) => (release = resolve))\n const tail = previous.then(() => done)\n processLockTails.set(name, tail)\n void tail.then(() => {\n if (processLockTails.get(name) === tail) processLockTails.delete(name)\n })\n\n try {\n await waitForTurn(previous, name, timeoutMs)\n } catch (error) {\n release()\n throw error\n }\n try {\n return await fn()\n } finally {\n release()\n }\n}\n\nfunction waitForTurn(previous: Promise<void>, name: string, timeoutMs: number): Promise<void> {\n if (!Number.isFinite(timeoutMs)) return previous\n let timer: ReturnType<typeof setTimeout> | undefined\n const timedOut = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new TabLockTimeoutError(name, timeoutMs)), timeoutMs)\n })\n return Promise.race([previous, timedOut]).finally(() => clearTimeout(timer))\n}\n","import debug from 'debug'\nimport { isBrowser } from '@/helpers/environment'\nimport { withTabLock } from '@/helpers/tabLocks'\n\nconst logger = debug('seedSdk:helpers:tabCoordinator')\n\n/**\n * One leader tab per database runs background work (EAS sync, bulk downloads, the Arweave L1\n * finalize worker); other tabs skip it. Leadership is a Web Lock held for the tab's lifetime, so\n * when the leader closes or crashes the next waiting tab takes over. See docs/MULTI_TAB.md.\n *\n * - `'coordinate'` (default): elect a leader in browsers with Web Locks.\n * - `'off'`: every tab acts as leader (behavior before multi-tab support).\n *\n * Node, browsers without Web Locks, and code running before client init always act as leader.\n */\nexport type MultiTabMode = 'coordinate' | 'off'\n\n/** Messages between tabs of the same database. */\nexport type TabMessage =\n | { type: 'eas-sync-address-change'; addresses: string[] }\n /** An event-bus event emitted in another tab (see helpers/tabEvents.ts). */\n | { type: 'event'; name: string; payload?: unknown }\n /** OPFS paths another tab (or its workers) wrote or removed, coalesced (helpers/tabEvents.ts). */\n | { type: 'files-changed'; paths: string[] }\n\n/** A message as sent: `from` is the sending tab's TAB_ID, so a tab can drop its own messages. */\ntype SentTabMessage = TabMessage & { from?: string }\n\n/** Identifies this tab (this page's SDK instance) in the messages it sends. */\nexport const TAB_ID: string =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`\n\ntype CoordinationState = {\n dbKey: string\n coordinating: boolean\n channel?: BroadcastChannel\n releaseLeadership?: () => void\n}\n\nlet state: CoordinationState | undefined\nlet leader = false\nlet leaderWaiters: Array<() => void> = []\nconst messageHandlers = new Set<(message: TabMessage) => void>()\n\n/** Starts once per page; later calls (re-init) keep the first database. */\nexport function startTabCoordination({ filesDir, mode = 'coordinate' }: { filesDir: string; mode?: MultiTabMode }): void {\n if (state) return\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined\n const dbKey = `${filesDir}/db/seed.db`\n const coordinating = mode === 'coordinate' && isBrowser() && !!locks && typeof BroadcastChannel !== 'undefined'\n state = { dbKey, coordinating }\n\n if (!coordinating) {\n becomeLeader()\n return\n }\n\n const channel = new BroadcastChannel(`seed:tabs:${dbKey}`)\n channel.onmessage = (event: MessageEvent<SentTabMessage>) => {\n // A BroadcastChannel never hears itself, but another channel object in this page would (a\n // second channel opened by a test, or the same module loaded twice): skip our own messages.\n if (event.data?.from === TAB_ID) return\n for (const handler of messageHandlers) handler(event.data)\n }\n state.channel = channel\n\n const current = state\n void locks!.request(`seed:leader:${dbKey}`, () => {\n // Reset (tests) before the grant: hand the lock straight back.\n if (state !== current) return undefined\n becomeLeader()\n // Held until the tab closes (or a test resets coordination).\n return new Promise<void>((release) => {\n current.releaseLeadership = release\n })\n })\n}\n\nfunction becomeLeader(): void {\n if (leader) return\n leader = true\n logger(`this tab leads ${state?.dbKey}`)\n const waiters = leaderWaiters\n leaderWaiters = []\n for (const resolve of waiters) resolve()\n}\n\nexport function isLeaderTab(): boolean {\n return !state || leader\n}\n\n/** Resolves when this tab leads (at once if it already does). */\nexport function whenLeaderTab(): Promise<void> {\n if (isLeaderTab()) return Promise.resolve()\n return new Promise((resolve) => leaderWaiters.push(resolve))\n}\n\n/** Sends to the other tabs of this database; a no-op when not coordinating. */\nexport function postTabMessage(message: TabMessage): void {\n state?.channel?.postMessage({ ...message, from: TAB_ID } satisfies SentTabMessage)\n}\n\n/** Whether postTabMessage reaches other tabs (a browser tab coordinating with Web Locks). */\nexport function isPostingTabMessages(): boolean {\n return !!state?.channel\n}\n\nexport function onTabMessage(handler: (message: TabMessage) => void): () => void {\n messageHandlers.add(handler)\n return () => messageHandlers.delete(handler)\n}\n\n/** `withTabLock` named for this database (`seed:<scope>:<db>`); runs `fn` directly before init. */\nexport function withDbTabLock<T>(scope: string, fn: () => Promise<T>, options?: { timeoutMs?: number }): Promise<T> {\n return state ? withTabLock(`seed:${scope}:${state.dbKey}`, fn, options) : fn()\n}\n\n/** Tests only. Keeps message handlers: modules register theirs once per page. */\nexport function resetTabCoordinationForTests(): void {\n state?.releaseLeadership?.()\n state?.channel?.close()\n state = undefined\n leader = false\n leaderWaiters = []\n}\n","import debug from 'debug'\nimport { eventEmitter } from '@/eventBus'\nimport { ADDRESSES_PERSISTED_EVENT, LOCAL_COPIES_REMOVED_EVENT } from '@/client/events'\nimport { EAS_SEED_DATA_SYNCED_TO_DB_EVENT } from '@/helpers/constants'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { isPostingTabMessages, onTabMessage, postTabMessage } from '@/helpers/tabCoordinator'\n\nconst logger = debug('seedSdk:helpers:tabEvents')\n\n/**\n * Keeps other tabs current (docs/MULTI_TAB.md). The event bus is per tab, so events that mean \"the\n * shared database or OPFS changed\" are also posted to the other tabs, which refresh their caches\n * and emit the same event locally. Events are posted only where they originate, so a relayed event\n * is never relayed again.\n */\n\n/** Emitted with the changed paths when files change outside this tab's file-system cache. */\nexport const FILES_CHANGED_EVENT = 'fs.files.changed' as const\n\n/** Events whose meaning (\"the shared data changed\") holds in every tab. */\nexport type CrossTabEventName =\n | typeof EAS_SEED_DATA_SYNCED_TO_DB_EVENT\n | typeof ADDRESSES_PERSISTED_EVENT\n | typeof LOCAL_COPIES_REMOVED_EVENT\n\n/** Emits on this tab's event bus and in every other tab of this database. */\nexport function emitAcrossTabs(name: CrossTabEventName, payload?: unknown): void {\n if (payload === undefined) {\n eventEmitter.emit(name)\n } else {\n eventEmitter.emit(name, payload)\n }\n postTabMessage({ type: 'event', name, payload })\n}\n\n/**\n * A file saved through this tab's file system: emits `file-saved` here. Other tabs hear about it\n * from the file system itself (see queueFilesChangedNotice), once the write has reached OPFS.\n */\nexport function notifyFileSaved(filePath: string): void {\n eventEmitter.emit('file-saved', filePath)\n}\n\n/**\n * Files written straight to OPFS by a worker: refreshes this tab's file-system cache, emits\n * FILES_CHANGED_EVENT, and tells other tabs to do the same.\n */\nexport async function notifyFilesWrittenOutsideCache(paths: string[]): Promise<void> {\n if (paths.length === 0) return\n await BaseFileManager.invalidateCachedPaths(paths)\n eventEmitter.emit(FILES_CHANGED_EVENT, paths)\n queueFilesChangedNotice(paths)\n}\n\n/**\n * How long changed paths gather before one `files-changed` message goes out. Counted from the\n * first queued path, so a steady stream of writes still sends once per window, never later.\n */\nexport const FILES_CHANGED_FLUSH_MS = 25\n/** Keeps a message for a huge batch (a bulk download) from being one giant structured clone. */\nexport const FILES_CHANGED_MAX_PATHS = 500\n\nlet pendingChangedPaths = new Set<string>()\nlet flushTimer: ReturnType<typeof setTimeout> | undefined\nlet flushOnPageHide = false\n\n/**\n * Tells other tabs that these absolute ZenFS paths changed in OPFS, so they drop and re-read their\n * cached copies (the sync API's in-memory copy in particular). The browser file system calls this\n * for every file it writes, truncates or removes (`TolerantWebAccessFS.onOpfsChange`, wired in\n * `BrowserFileManager.initializeFileSystem`), after the change reached OPFS. Paths are coalesced\n * for FILES_CHANGED_FLUSH_MS, so bulk writes (migrations, schema processing, downloads) send a few\n * messages rather than one per write.\n *\n * Defense in depth only: a tab that misses a message still sees the change on its next async\n * stat() (see TolerantWebAccessFS.stat). A no-op unless this tab coordinates with others.\n */\nexport function queueFilesChangedNotice(paths: Iterable<string>): void {\n if (!isPostingTabMessages()) return\n for (const path of paths) pendingChangedPaths.add(path)\n if (flushTimer !== undefined || pendingChangedPaths.size === 0) return\n flushTimer = setTimeout(flushFilesChangedNotices, FILES_CHANGED_FLUSH_MS)\n if (!flushOnPageHide && typeof addEventListener === 'function') {\n flushOnPageHide = true\n // A tab closing inside the window still sends what it wrote.\n addEventListener('pagehide', flushFilesChangedNotices)\n }\n}\n\n/** Sends the queued paths now (page hide, tests). */\nexport function flushFilesChangedNotices(): void {\n if (flushTimer !== undefined) clearTimeout(flushTimer)\n flushTimer = undefined\n if (pendingChangedPaths.size === 0) return\n const paths = [...pendingChangedPaths]\n pendingChangedPaths = new Set()\n for (let i = 0; i < paths.length; i += FILES_CHANGED_MAX_PATHS) {\n postTabMessage({ type: 'files-changed', paths: paths.slice(i, i + FILES_CHANGED_MAX_PATHS) })\n }\n}\n\n/** Refreshes this tab's in-memory state for an event another tab emitted, before re-emitting it. */\nasync function catchUpOn(name: string, payload: unknown): Promise<void> {\n if (name === EAS_SEED_DATA_SYNCED_TO_DB_EVENT) {\n const { Item } = await import('@/Item/Item')\n await Item.rehydrateCachedItemsFromDbAfterEasSync()\n } else if (name === LOCAL_COPIES_REMOVED_EVENT) {\n const { removedSeedLocalIds = [], removedSeedUids = [] } = (payload ?? {}) as {\n removedSeedLocalIds?: string[]\n removedSeedUids?: string[]\n }\n const { Item } = await import('@/Item/Item')\n Item.dropCachedInstancesForSeedIds([...removedSeedLocalIds, ...removedSeedUids])\n }\n}\n\nconst RELAYED_EVENTS = new Set<string>([\n EAS_SEED_DATA_SYNCED_TO_DB_EVENT,\n ADDRESSES_PERSISTED_EVENT,\n LOCAL_COPIES_REMOVED_EVENT,\n])\n\nlet listening = false\n\n/** Applies other tabs' events and file changes in this tab. */\nexport function listenForOtherTabsEvents(): void {\n if (listening) return\n listening = true\n onTabMessage((message) => {\n if (message.type === 'event' && RELAYED_EVENTS.has(message.name)) {\n void catchUpOn(message.name, message.payload)\n .catch((error) => logger(`catching up on ${message.name} failed`, error))\n .then(() => {\n if (message.payload === undefined) {\n eventEmitter.emit(message.name)\n } else {\n eventEmitter.emit(message.name, message.payload)\n }\n })\n } else if (message.type === 'files-changed') {\n // Only refreshes caches: never writes, so never sends files-changed back.\n void BaseFileManager.invalidateCachedPaths(message.paths)\n .catch((error) => logger('refreshing changed files failed', error))\n .then(() => eventEmitter.emit(FILES_CHANGED_EVENT, message.paths))\n }\n })\n}\n"],"names":["logger"],"mappings":";;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,yBAAyB,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,0BAA0B,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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"}
1
+ {"version":3,"file":"tabEvents-nBUq_1u1.js","sources":["../../src/client/events.ts","../../src/helpers/tabLocks.ts","../../src/helpers/tabCoordinator.ts","../../src/helpers/tabEvents.ts"],"sourcesContent":["/** Emitted by the client manager after `app_state.addresses` is written (post-`setAddresses`). */\nexport const ADDRESSES_PERSISTED_EVENT = 'addresses.persisted' as const\n\n/** Emitted after hard-deleting local on-chain seed copies for publisher addresses. */\nexport const LOCAL_COPIES_REMOVED_EVENT = 'localCopies.removed' as const\n\nexport type AddressesPersistedPayload = {\n owned: string[]\n watched: string[]\n}\n\nexport type LocalCopiesRemovedPayload = {\n addresses: string[]\n removedSeedLocalIds: string[]\n removedSeedUids: string[]\n}\n\nexport function parseAddressesPersistedPayload(\n value: unknown,\n): AddressesPersistedPayload {\n if (!value || typeof value !== 'object') {\n return { owned: [], watched: [] }\n }\n const v = value as { owned?: unknown; watched?: unknown }\n const owned = Array.isArray(v.owned)\n ? v.owned.filter((a): a is string => typeof a === 'string')\n : []\n const watched = Array.isArray(v.watched)\n ? v.watched.filter((a): a is string => typeof a === 'string')\n : []\n return { owned, watched }\n}\n","/**\n * Cross-tab exclusive sections, using the Web Locks API. All tabs of an origin share one SQLite\n * database and OPFS tree; the browser releases a tab's locks when it closes or crashes, so a lock\n * can't go stale. See docs/MULTI_TAB.md.\n *\n * Node has Web Locks from 24.5, scoped to the process. Where they're missing (older Node, old\n * browsers), sections still run one at a time within this JS realm (see `withProcessLock`), which\n * covers a single Node process but not other tabs or worker threads.\n * Not re-entrant: requesting a name the caller already holds waits forever, so take each lock\n * only at the outermost call site.\n */\n\n/** Long enough for a slow init in another tab; short enough that a hung tab doesn't block forever. */\nexport const TAB_LOCK_WAIT_TIMEOUT_MS = 60_000\n\n/**\n * - `migrate`: schema migrations and one-time data fixes in `prepareDb`.\n * - `init`: client init steps that check for rows and then insert them.\n */\nexport type SeedDbLockScope = 'migrate' | 'init'\n\nexport function seedDbLockName(scope: SeedDbLockScope, filesDir: string): string {\n return `seed:${scope}:${filesDir}/db/seed.db`\n}\n\n/** `withTabLock` on the database under `filesDir`; runs `fn` directly when there's no `filesDir` yet. */\nexport function withSeedDbLock<T>(\n scope: SeedDbLockScope,\n filesDir: string | undefined,\n fn: () => Promise<T>,\n): Promise<T> {\n return filesDir ? withTabLock(seedDbLockName(scope, filesDir), fn) : fn()\n}\n\nexport class TabLockTimeoutError extends Error {\n readonly code = 'TAB_LOCK_TIMEOUT' as const\n\n constructor(readonly lockName: string, timeoutMs: number) {\n super(`Timed out after ${timeoutMs}ms waiting for another tab to release \"${lockName}\".`)\n this.name = 'TabLockTimeoutError'\n }\n}\n\nexport async function withTabLock<T>(\n name: string,\n fn: () => Promise<T>,\n { timeoutMs = TAB_LOCK_WAIT_TIMEOUT_MS }: { timeoutMs?: number } = {},\n): Promise<T> {\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined\n if (!locks) return withProcessLock(name, fn, { timeoutMs })\n\n try {\n // The timeout bounds the wait only; once granted, fn runs to completion. Infinity waits for as\n // long as the holder runs (it can't outlive its tab).\n const signal = Number.isFinite(timeoutMs) ? AbortSignal.timeout(timeoutMs) : undefined\n return await locks.request(name, { mode: 'exclusive', signal }, fn)\n } catch (error) {\n if ((error as DOMException | null)?.name === 'TimeoutError') {\n throw new TabLockTimeoutError(name, timeoutMs)\n }\n throw error\n }\n}\n\n/** Tail of each name's queue: resolves once every section queued so far has finished or given up. */\nconst processLockTails = new Map<string, Promise<void>>()\n\n/**\n * The `withTabLock` fallback without Web Locks: an exclusive, first-come-first-served lock per name\n * within this JS realm. Like Web Locks, `timeoutMs` bounds the wait only, and a waiter that times\n * out doesn't let later waiters in before the current holder finishes.\n */\nexport async function withProcessLock<T>(\n name: string,\n fn: () => Promise<T>,\n { timeoutMs = TAB_LOCK_WAIT_TIMEOUT_MS }: { timeoutMs?: number } = {},\n): Promise<T> {\n const previous = processLockTails.get(name) ?? Promise.resolve()\n let release!: () => void\n const done = new Promise<void>((resolve) => (release = resolve))\n const tail = previous.then(() => done)\n processLockTails.set(name, tail)\n void tail.then(() => {\n if (processLockTails.get(name) === tail) processLockTails.delete(name)\n })\n\n try {\n await waitForTurn(previous, name, timeoutMs)\n } catch (error) {\n release()\n throw error\n }\n try {\n return await fn()\n } finally {\n release()\n }\n}\n\nfunction waitForTurn(previous: Promise<void>, name: string, timeoutMs: number): Promise<void> {\n if (!Number.isFinite(timeoutMs)) return previous\n let timer: ReturnType<typeof setTimeout> | undefined\n const timedOut = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new TabLockTimeoutError(name, timeoutMs)), timeoutMs)\n })\n return Promise.race([previous, timedOut]).finally(() => clearTimeout(timer))\n}\n","import debug from 'debug'\nimport { isBrowser } from '@/helpers/environment'\nimport { withTabLock } from '@/helpers/tabLocks'\n\nconst logger = debug('seedSdk:helpers:tabCoordinator')\n\n/**\n * One leader tab per database runs background work (EAS sync, bulk downloads, the Arweave L1\n * finalize worker); other tabs skip it. Leadership is a Web Lock held for the tab's lifetime, so\n * when the leader closes or crashes the next waiting tab takes over. See docs/MULTI_TAB.md.\n *\n * - `'coordinate'` (default): elect a leader in browsers with Web Locks.\n * - `'off'`: every tab acts as leader (behavior before multi-tab support).\n *\n * Node, browsers without Web Locks, and code running before client init always act as leader.\n */\nexport type MultiTabMode = 'coordinate' | 'off'\n\n/** Messages between tabs of the same database. */\nexport type TabMessage =\n | { type: 'eas-sync-address-change'; addresses: string[] }\n /** An event-bus event emitted in another tab (see helpers/tabEvents.ts). */\n | { type: 'event'; name: string; payload?: unknown }\n /** OPFS paths another tab (or its workers) wrote or removed, coalesced (helpers/tabEvents.ts). */\n | { type: 'files-changed'; paths: string[] }\n\n/** A message as sent: `from` is the sending tab's TAB_ID, so a tab can drop its own messages. */\ntype SentTabMessage = TabMessage & { from?: string }\n\n/** Identifies this tab (this page's SDK instance) in the messages it sends. */\nexport const TAB_ID: string =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`\n\ntype CoordinationState = {\n dbKey: string\n coordinating: boolean\n channel?: BroadcastChannel\n releaseLeadership?: () => void\n}\n\nlet state: CoordinationState | undefined\nlet leader = false\nlet leaderWaiters: Array<() => void> = []\nconst messageHandlers = new Set<(message: TabMessage) => void>()\n\n/** Starts once per page; later calls (re-init) keep the first database. */\nexport function startTabCoordination({ filesDir, mode = 'coordinate' }: { filesDir: string; mode?: MultiTabMode }): void {\n if (state) return\n const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined\n const dbKey = `${filesDir}/db/seed.db`\n const coordinating = mode === 'coordinate' && isBrowser() && !!locks && typeof BroadcastChannel !== 'undefined'\n state = { dbKey, coordinating }\n\n if (!coordinating) {\n becomeLeader()\n return\n }\n\n const channel = new BroadcastChannel(`seed:tabs:${dbKey}`)\n channel.onmessage = (event: MessageEvent<SentTabMessage>) => {\n // A BroadcastChannel never hears itself, but another channel object in this page would (a\n // second channel opened by a test, or the same module loaded twice): skip our own messages.\n if (event.data?.from === TAB_ID) return\n for (const handler of messageHandlers) handler(event.data)\n }\n state.channel = channel\n\n const current = state\n void locks!.request(`seed:leader:${dbKey}`, () => {\n // Reset (tests) before the grant: hand the lock straight back.\n if (state !== current) return undefined\n becomeLeader()\n // Held until the tab closes (or a test resets coordination).\n return new Promise<void>((release) => {\n current.releaseLeadership = release\n })\n })\n}\n\nfunction becomeLeader(): void {\n if (leader) return\n leader = true\n logger(`this tab leads ${state?.dbKey}`)\n const waiters = leaderWaiters\n leaderWaiters = []\n for (const resolve of waiters) resolve()\n}\n\nexport function isLeaderTab(): boolean {\n return !state || leader\n}\n\n/** Resolves when this tab leads (at once if it already does). */\nexport function whenLeaderTab(): Promise<void> {\n if (isLeaderTab()) return Promise.resolve()\n return new Promise((resolve) => leaderWaiters.push(resolve))\n}\n\n/** Sends to the other tabs of this database; a no-op when not coordinating. */\nexport function postTabMessage(message: TabMessage): void {\n state?.channel?.postMessage({ ...message, from: TAB_ID } satisfies SentTabMessage)\n}\n\n/** Whether postTabMessage reaches other tabs (a browser tab coordinating with Web Locks). */\nexport function isPostingTabMessages(): boolean {\n return !!state?.channel\n}\n\nexport function onTabMessage(handler: (message: TabMessage) => void): () => void {\n messageHandlers.add(handler)\n return () => messageHandlers.delete(handler)\n}\n\n/** `withTabLock` named for this database (`seed:<scope>:<db>`); runs `fn` directly before init. */\nexport function withDbTabLock<T>(scope: string, fn: () => Promise<T>, options?: { timeoutMs?: number }): Promise<T> {\n return state ? withTabLock(`seed:${scope}:${state.dbKey}`, fn, options) : fn()\n}\n\n/** Tests only. Keeps message handlers: modules register theirs once per page. */\nexport function resetTabCoordinationForTests(): void {\n state?.releaseLeadership?.()\n state?.channel?.close()\n state = undefined\n leader = false\n leaderWaiters = []\n}\n","import debug from 'debug'\nimport { eventEmitter } from '@/eventBus'\nimport { ADDRESSES_PERSISTED_EVENT, LOCAL_COPIES_REMOVED_EVENT } from '@/client/events'\nimport { EAS_SEED_DATA_SYNCED_TO_DB_EVENT } from '@/helpers/constants'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { isPostingTabMessages, onTabMessage, postTabMessage } from '@/helpers/tabCoordinator'\n\nconst logger = debug('seedSdk:helpers:tabEvents')\n\n/**\n * Keeps other tabs current (docs/MULTI_TAB.md). The event bus is per tab, so events that mean \"the\n * shared database or OPFS changed\" are also posted to the other tabs, which refresh their caches\n * and emit the same event locally. Events are posted only where they originate, so a relayed event\n * is never relayed again.\n */\n\n/** Emitted with the changed paths when files change outside this tab's file-system cache. */\nexport const FILES_CHANGED_EVENT = 'fs.files.changed' as const\n\n/** Events whose meaning (\"the shared data changed\") holds in every tab. */\nexport type CrossTabEventName =\n | typeof EAS_SEED_DATA_SYNCED_TO_DB_EVENT\n | typeof ADDRESSES_PERSISTED_EVENT\n | typeof LOCAL_COPIES_REMOVED_EVENT\n\n/** Emits on this tab's event bus and in every other tab of this database. */\nexport function emitAcrossTabs(name: CrossTabEventName, payload?: unknown): void {\n if (payload === undefined) {\n eventEmitter.emit(name)\n } else {\n eventEmitter.emit(name, payload)\n }\n postTabMessage({ type: 'event', name, payload })\n}\n\n/**\n * A file saved through this tab's file system: emits `file-saved` here. Other tabs hear about it\n * from the file system itself (see queueFilesChangedNotice), once the write has reached OPFS.\n */\nexport function notifyFileSaved(filePath: string): void {\n eventEmitter.emit('file-saved', filePath)\n}\n\n/**\n * Files written straight to OPFS by a worker: refreshes this tab's file-system cache, emits\n * FILES_CHANGED_EVENT, and tells other tabs to do the same.\n */\nexport async function notifyFilesWrittenOutsideCache(paths: string[]): Promise<void> {\n if (paths.length === 0) return\n await BaseFileManager.invalidateCachedPaths(paths)\n eventEmitter.emit(FILES_CHANGED_EVENT, paths)\n queueFilesChangedNotice(paths)\n}\n\n/**\n * How long changed paths gather before one `files-changed` message goes out. Counted from the\n * first queued path, so a steady stream of writes still sends once per window, never later.\n */\nexport const FILES_CHANGED_FLUSH_MS = 25\n/** Keeps a message for a huge batch (a bulk download) from being one giant structured clone. */\nexport const FILES_CHANGED_MAX_PATHS = 500\n\nlet pendingChangedPaths = new Set<string>()\nlet flushTimer: ReturnType<typeof setTimeout> | undefined\nlet flushOnPageHide = false\n\n/**\n * Tells other tabs that these absolute ZenFS paths changed in OPFS, so they drop and re-read their\n * cached copies (the sync API's in-memory copy in particular). The browser file system calls this\n * for every file it writes, truncates or removes (`TolerantWebAccessFS.onOpfsChange`, wired in\n * `BrowserFileManager.initializeFileSystem`), after the change reached OPFS. Paths are coalesced\n * for FILES_CHANGED_FLUSH_MS, so bulk writes (migrations, schema processing, downloads) send a few\n * messages rather than one per write.\n *\n * Defense in depth only: a tab that misses a message still sees the change on its next async\n * stat() (see TolerantWebAccessFS.stat). A no-op unless this tab coordinates with others.\n */\nexport function queueFilesChangedNotice(paths: Iterable<string>): void {\n if (!isPostingTabMessages()) return\n for (const path of paths) pendingChangedPaths.add(path)\n if (flushTimer !== undefined || pendingChangedPaths.size === 0) return\n flushTimer = setTimeout(flushFilesChangedNotices, FILES_CHANGED_FLUSH_MS)\n if (!flushOnPageHide && typeof addEventListener === 'function') {\n flushOnPageHide = true\n // A tab closing inside the window still sends what it wrote.\n addEventListener('pagehide', flushFilesChangedNotices)\n }\n}\n\n/** Sends the queued paths now (page hide, tests). */\nexport function flushFilesChangedNotices(): void {\n if (flushTimer !== undefined) clearTimeout(flushTimer)\n flushTimer = undefined\n if (pendingChangedPaths.size === 0) return\n const paths = [...pendingChangedPaths]\n pendingChangedPaths = new Set()\n for (let i = 0; i < paths.length; i += FILES_CHANGED_MAX_PATHS) {\n postTabMessage({ type: 'files-changed', paths: paths.slice(i, i + FILES_CHANGED_MAX_PATHS) })\n }\n}\n\n/** Refreshes this tab's in-memory state for an event another tab emitted, before re-emitting it. */\nasync function catchUpOn(name: string, payload: unknown): Promise<void> {\n if (name === EAS_SEED_DATA_SYNCED_TO_DB_EVENT) {\n const { Item } = await import('@/Item/Item')\n await Item.rehydrateCachedItemsFromDbAfterEasSync()\n } else if (name === LOCAL_COPIES_REMOVED_EVENT) {\n const { removedSeedLocalIds = [], removedSeedUids = [] } = (payload ?? {}) as {\n removedSeedLocalIds?: string[]\n removedSeedUids?: string[]\n }\n const { Item } = await import('@/Item/Item')\n Item.dropCachedInstancesForSeedIds([...removedSeedLocalIds, ...removedSeedUids])\n }\n}\n\nconst RELAYED_EVENTS = new Set<string>([\n EAS_SEED_DATA_SYNCED_TO_DB_EVENT,\n ADDRESSES_PERSISTED_EVENT,\n LOCAL_COPIES_REMOVED_EVENT,\n])\n\nlet listening = false\n\n/** Applies other tabs' events and file changes in this tab. */\nexport function listenForOtherTabsEvents(): void {\n if (listening) return\n listening = true\n onTabMessage((message) => {\n if (message.type === 'event' && RELAYED_EVENTS.has(message.name)) {\n void catchUpOn(message.name, message.payload)\n .catch((error) => logger(`catching up on ${message.name} failed`, error))\n .then(() => {\n if (message.payload === undefined) {\n eventEmitter.emit(message.name)\n } else {\n eventEmitter.emit(message.name, message.payload)\n }\n })\n } else if (message.type === 'files-changed') {\n // Only refreshes caches: never writes, so never sends files-changed back.\n void BaseFileManager.invalidateCachedPaths(message.paths)\n .catch((error) => logger('refreshing changed files failed', error))\n .then(() => eventEmitter.emit(FILES_CHANGED_EVENT, message.paths))\n }\n })\n}\n"],"names":["logger"],"mappings":";;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,yBAAyB,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAEzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,0BAA0B,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CA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"}
@@ -2,8 +2,8 @@ import { constants, Inode, vfs } from '@zenfs/core';
2
2
  import { join, dirname } from '@zenfs/core/path';
3
3
  import { WebAccess, WebAccessFS } from '@zenfs/dom';
4
4
  import debug from 'debug';
5
- import { i as isSkippableOpfsEntryError } from './index.browser-cpZehMwT.js';
6
- import './BasePathResolver-DT63t0XU.js';
5
+ import { i as isSkippableOpfsEntryError } from './index.browser-C1pisOEa.js';
6
+ import './BasePathResolver-DrzGVH9L.js';
7
7
  import '@seedprotocol/arweave';
8
8
  import '@seedprotocol/eas';
9
9
  import 'xstate';
@@ -11,25 +11,24 @@ import 'pluralize';
11
11
  import '@sinclair/typebox';
12
12
  import 'drizzle-orm/sqlite-core';
13
13
  import 'drizzle-orm';
14
- import 'drizzle-orm/casing';
15
- import 'lodash-es';
16
14
  import 'nanoid';
17
15
  import 'nanoid-dictionary';
18
16
  import '@seedprotocol/query';
19
17
  import '@noble/hashes/sha256';
20
18
  import '@noble/hashes/sha3';
21
19
  import '@noble/hashes/utils';
22
- import './tabEvents-D5X2Hwcp.js';
20
+ import 'lodash-es';
21
+ import './tabEvents-nBUq_1u1.js';
23
22
  import './mimeTypes-DHAHC4eZ.js';
24
23
  import './errors-CrBxGWah.js';
25
24
  import 'drizzle-orm/sqlite-proxy';
26
- import './index-BPrJV9Wt.js';
25
+ import './index-7y2f_iQz.js';
27
26
  import 'sqlocal/drizzle';
28
27
  import 'rxjs';
29
28
  import 'graphql-request';
30
29
  import 'arweave';
31
30
  import '@tanstack/react-query';
32
- import './configurePlatform-Su9vV5qO.js';
31
+ import './configurePlatform-BzfirKuM.js';
33
32
 
34
33
  const logger = debug('seedSdk:browser:helpers:tolerantWebAccess');
35
34
  /**
@@ -548,4 +547,4 @@ const TolerantWebAccess = {
548
547
  };
549
548
 
550
549
  export { TolerantWebAccess, TolerantWebAccessFS };
551
- //# sourceMappingURL=tolerantWebAccess-BNYRvW9a.js.map
550
+ //# sourceMappingURL=tolerantWebAccess-DIt3R8_u.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tolerantWebAccess-BNYRvW9a.js","sources":["../../src/browser/helpers/tolerantWebAccess.ts"],"sourcesContent":["import { constants, Inode, vfs } from '@zenfs/core'\nimport type { CreationOptions, InodeLike } from '@zenfs/core'\nimport { dirname, join } from '@zenfs/core/path'\nimport { WebAccess, WebAccessFS } from '@zenfs/dom'\nimport type { WebAccessOptions } from '@zenfs/dom'\nimport debug from 'debug'\nimport { isSkippableOpfsEntryError } from './opfsErrors'\n\nconst logger = debug('seedSdk:browser:helpers:tolerantWebAccess')\n\n/** A truncate made through this mount that OPFS doesn't have yet. Compared by identity. */\ntype PendingTruncate = { readonly length: number }\n\n/** An OPFS file as this mount last saw it. */\ntype OpfsVersion = { size: number; lastModified: number }\n\n/**\n * WebAccessFS mounts by walking all of OPFS and reading every file's size, and one unreadable\n * entry fails the whole mount. This variant skips such entries instead. A skipped file is still\n * listed by readdir, and WebAccessFS.stat() indexes it lazily on first use, once it is readable.\n *\n * It also makes overwrites with shorter content shrink the file (see `write` and `touch`), without\n * cutting off bytes another context (a tab, a worker writing through a SyncAccessHandle) added to a\n * file this mount had indexed at a smaller size: OPFS only shrinks for a truncate made through this\n * mount, and stat() re-reads a file's size when OPFS changed since this mount last looked.\n *\n * Overrides @zenfs/dom 1.2.9 / @zenfs/core 2.5.6 internals (`_loadHandles`, `_loadMetadata`,\n * `crossCopy`, `stat`, `write`, `touch`, `remove`, `get`, `_handles`, `_sync`, `_isInitialized`,\n * `index`, and `vfs.Handle#truncate`/`truncateSync`, see `trackTruncates`); both packages are pinned\n * to exact versions, and tolerantWebAccess.test.ts / opfsOverwrite.test.ts cover the coupling.\n */\nexport class TolerantWebAccessFS extends WebAccessFS {\n /**\n * Truncates made through this mount that OPFS doesn't have yet, by path. ZenFS truncates by\n * lowering the inode's size and syncing it later, so only these may shrink the OPFS file: an\n * inode that is merely smaller than the file is a stale view of a file someone else grew.\n */\n private readonly _truncates = new Map<string, PendingTruncate>()\n\n /** Each OPFS file as this mount last saw it, to notice writes made elsewhere. */\n private readonly _seen = new Map<string, OpfsVersion>()\n\n /**\n * Called with each file path whose OPFS contents this mount changed (a write, a truncate, a\n * removal; a rename is both), once the change is in OPFS. BrowserFileManager uses it to tell other\n * tabs. Not called for what invalidate(), stat() or crossCopy() put in the in-memory copy: those\n * only read OPFS.\n */\n onOpfsChange?: (path: string) => void\n\n constructor(root: FileSystemDirectoryHandle, disableHandleCache?: boolean) {\n super(root, disableHandleCache)\n // Reads would otherwise mark the file dirty (atime) and end in touch() for every read. Without\n // atime, touch() only follows writes, truncates, chmod and utimes.\n this.attributes.set('no_atime')\n }\n\n /**\n * Called by vfs.Handle#truncate(Sync) for files on this mount (see `trackTruncates`). Returns an\n * undo for a truncate the handle then rejects.\n */\n _noteTruncate(path: string, length: number): () => void {\n const previous = this._truncates.get(path)\n // Truncated twice before a write: the bytes past the shorter length are gone either way.\n this._truncates.set(path, { length: Math.min(length, previous?.length ?? length) })\n return () => {\n if (previous) this._truncates.set(path, previous)\n else this._truncates.delete(path)\n }\n }\n\n /**\n * The sync API's in-memory copy (a StoreFS) truncates by setting the size alone and keeps the old\n * bytes, which a later write past that size then exposes in place of zeros. Cut them off there\n * too. Called by vfs.Handle#truncate(Sync) once the truncate went through.\n */\n _truncateCache(path: string, length: number): void {\n try {\n const cached = this._sync.statSync(path)\n if ((cached.mode & constants.S_IFMT) != constants.S_IFREG) return\n // Even when the size already matches: a sync handle's truncate() has synced it by now.\n const data = new Uint8Array(length) // Past the old size (truncate to extend): zeros.\n const kept = Math.min(length, cached.size)\n if (kept) this._sync.readSync(path, data.subarray(0, kept), 0, kept)\n this._sync.unlinkSync(path)\n this._sync.createFileSync(path, cached as unknown as CreationOptions)\n if (length) this._sync.writeSync(path, data, 0)\n cached.size = length\n this._sync.touchSync(path, cached)\n } catch (error) {\n logger(`could not truncate the cached copy of ${path}: ${(error as Error).name}`)\n }\n }\n\n private _takeTruncate(path: string, pending: PendingTruncate | undefined): void {\n // A truncate recorded while this write or sync was under way is left for the next one.\n if (pending && this._truncates.get(path) === pending) this._truncates.delete(path)\n }\n\n private _changed(path: string): void {\n try {\n this.onOpfsChange?.(path)\n } catch (error) {\n logger(`change listener failed for ${path}`, error)\n }\n }\n\n private _remember(path: string, file: File): void {\n this._seen.set(path, { size: file.size, lastModified: file.lastModified })\n }\n\n /** Another context changed the file: the next stat() refreshes the sync API's in-memory copy. */\n private _markChangedElsewhere(path: string): void {\n this._seen.set(path, { size: -1, lastModified: -1 })\n }\n\n /**\n * The index holds each file's size from when this mount last looked, and another context may\n * have written the file since. Re-read it from OPFS, so opening a file (an append goes to its\n * size) and reading it see the true file, and refresh the in-memory copy behind the sync API when\n * the file changed. Costs one getFile() per stat of a regular file; contents are only read when\n * the file changed.\n */\n async stat(path: string): Promise<Inode> {\n const inode = (await super.stat(path)) as Inode\n if ((inode.mode & constants.S_IFMT) != constants.S_IFREG) return inode\n // While mounting, sizes were just read and crossCopy stats every file.\n if (!(this as unknown as AsyncState)._isInitialized) return inode\n // This mount truncated the file and OPFS doesn't have it yet: the inode's size is the truth.\n if (this._truncates.has(path)) return inode\n\n let file: File\n try {\n file = await ((await this.get('file', path)) as FileSystemFileHandle).getFile()\n } catch {\n return inode // Gone or busy: keep what the index knows.\n }\n const seen = this._seen.get(path)\n if (seen && seen.size == file.size && seen.lastModified == file.lastModified) return inode\n this._remember(path, file)\n // First look at a file this mount just indexed (WebAccessFS.stat, invalidate): nothing to fix.\n if (!seen && inode.size == file.size) return inode\n logger(`${path} changed outside this mount (${inode.size} -> ${file.size} bytes)`)\n inode.update({ size: file.size, mtimeMs: file.lastModified })\n this.index.set(path, inode)\n await this._recache(path, inode, file)\n return inode\n }\n\n /** Replaces the sync API's in-memory copy of `path` with `file`, if it holds one. */\n private async _recache(path: string, inode: Inode, file: File): Promise<void> {\n try {\n this._sync.statSync(path)\n } catch {\n return // Not cached: async reads go to OPFS, and invalidate() handles the rest.\n }\n try {\n const data = new Uint8Array(await file.arrayBuffer())\n try {\n this._sync.unlinkSync(path)\n } catch {\n // Already gone.\n }\n this._sync.createFileSync(path, inode as unknown as CreationOptions)\n this._sync.writeSync(path, data, 0)\n this._sync.touchSync(path, inode)\n } catch (error) {\n logger(`not caching ${path}: ${(error as Error).name}`)\n try {\n this._sync.unlinkSync(path)\n } catch {\n // Nothing was copied.\n }\n }\n }\n\n /**\n * WebAccessFS.write opens the file with `keepExistingData` and never truncates, so a whole-file\n * overwrite with shorter content (open 'w', then a write at 0) kept the old tail on disk. Here a\n * truncate this mount made since the file was last written (open 'w', ftruncate) is applied in\n * the same writable as the data: the file is cut to that length first (a write past it leaves\n * zeros in the gap, as POSIX does). Without one, the data goes over the file OPFS has, whatever\n * size this mount last saw: appends and writes at an offset never cut off bytes another context\n * wrote.\n */\n async write(path: string, buffer: Uint8Array, offset: number): Promise<void> {\n const pending = this._truncates.get(path)\n const inode = this.index.get(path)\n let handle: FileSystemFileHandle | undefined\n if (inode && (inode.mode & constants.S_IFMT) == constants.S_IFREG) {\n try {\n handle = (await this.get('file', path)) as FileSystemFileHandle\n } catch {\n // Not in OPFS yet: WebAccessFS.write creates it, and a new file has no old tail.\n }\n }\n if (!inode || !handle) {\n await super.write(path, buffer, offset)\n this._takeTruncate(path, pending)\n if (inode) this._seen.set(path, { size: inode.size, lastModified: inode.mtimeMs })\n // WebAccessFS.write also creates directories; only files are worth telling other tabs about.\n if (inode && (inode.mode & constants.S_IFMT) == constants.S_IFREG) this._changed(path)\n return\n }\n\n const data = copyIfShared(buffer)\n const end = offset + data.byteLength\n // Truncated to no more than this write covers: start from an empty file instead of a copy.\n const wholeFile = pending !== undefined && offset == 0 && pending.length <= data.byteLength\n const writable = await handle.createWritable({ keepExistingData: !wholeFile })\n try {\n if (pending && !wholeFile) await writable.truncate(pending.length)\n await writable.write({ type: 'write', position: offset, data })\n await writable.close()\n } catch (error) {\n await writable.abort().catch(() => {})\n throw error\n }\n this._takeTruncate(path, pending)\n\n const file = await handle.getFile()\n const seen = this._seen.get(path)\n inode.update({ size: file.size, mtimeMs: file.lastModified })\n this.index.set(path, inode)\n this._remember(path, file)\n // Larger than this mount's writes explain: another context grew it. The sync API's copy is\n // refreshed by the next stat(), not here, where queued sync writes may not have landed yet.\n const expected = pending ? Math.max(pending.length, end) : Math.max(seen?.size ?? 0, end)\n if (seen && seen.size >= 0 && file.size != expected) this._markChangedElsewhere(path)\n this._changed(path)\n }\n\n /**\n * ZenFS truncates by setting the inode's size and syncing it with touch() (FileHandle.truncate\n * with no write after it). Make OPFS follow when this mount truncated the file. Any other touch\n * (chmod, utimes, the size after writes) leaves the OPFS file alone: a smaller size there is a\n * stale view, and the index takes the file's real size back.\n */\n async touch(path: string, metadata: InodeLike): Promise<void> {\n const pending = this._truncates.get(path)\n await super.touch(path, metadata)\n const inode = this.index.get(path)\n if (!inode || (inode.mode & constants.S_IFMT) != constants.S_IFREG) return\n let handle: FileSystemFileHandle\n try {\n handle = (await this.get('file', path)) as FileSystemFileHandle\n } catch {\n return // Not in OPFS (yet): nothing to shrink, and a queued write creates it.\n }\n\n if (pending) {\n const size = typeof metadata.size == 'number' ? metadata.size : pending.length\n const writable = await handle.createWritable({ keepExistingData: true })\n try {\n await writable.truncate(Math.min(pending.length, size))\n // Truncated, then extended: the new bytes are zeros.\n if (size > pending.length) await writable.truncate(size)\n await writable.close()\n } catch (error) {\n await writable.abort().catch(() => {})\n throw error\n }\n this._takeTruncate(path, pending)\n const file = await handle.getFile()\n inode.update({ size: file.size, mtimeMs: file.lastModified })\n this._remember(path, file)\n this._changed(path)\n return\n }\n\n const file = await handle.getFile()\n if (inode.size == file.size) return\n const seen = this._seen.get(path)\n inode.update({ size: file.size })\n if (!seen || seen.size != file.size || seen.lastModified != file.lastModified) {\n this._markChangedElsewhere(path)\n }\n }\n\n async remove(path: string): Promise<void> {\n for (const map of [this._truncates, this._seen]) {\n for (const p of [...map.keys()]) if (p == path || p.startsWith(path + '/')) map.delete(p)\n }\n await super.remove(path)\n this._changed(path)\n }\n\n async _loadHandles(path: string, handle: FileSystemDirectoryHandle): Promise<void> {\n try {\n for await (const [key, child] of (handle as any).entries() as AsyncIterable<[string, FileSystemHandle]>) {\n const p = join(path, key)\n this._handles.set(p, child)\n if (child.kind == 'directory') await this._loadHandles(p, child as FileSystemDirectoryHandle)\n }\n } catch (error) {\n // An unreadable root means nothing was walked; let initializeFileSystem retry the mount.\n if (!isSkippableOpfsEntryError(error) || path == '/') throw error\n // The directory went away (or became unreadable) mid-walk: forget it and anything under it.\n logger(`skipping directory ${path}: ${(error as DOMException).name}`)\n for (const p of [...this._handles.keys()]) {\n if (p == path || p.startsWith(path + '/')) this._handles.delete(p)\n }\n }\n }\n\n async _loadMetadata(metadataPath?: string): Promise<void> {\n if (metadataPath) return super._loadMetadata(metadataPath)\n\n this._handles.set('/', this.root)\n await this._loadHandles('/', this.root)\n\n for (const [path, handle] of [...this._handles]) {\n if (handle.kind == 'directory') {\n this.index.set(path, new Inode({ mode: 0o777 | constants.S_IFDIR, size: 0 }))\n continue\n }\n try {\n const { lastModified, size } = await (handle as FileSystemFileHandle).getFile()\n this.index.set(path, new Inode({ mode: 0o644 | constants.S_IFREG, size, mtimeMs: lastModified }))\n this._seen.set(path, { size, lastModified })\n } catch (error) {\n if (!isSkippableOpfsEntryError(error)) throw error\n logger(`skipping file ${path}: ${(error as DOMException).name}`)\n // A removed file's handle would keep resolving to nothing; a locked one is still valid.\n if ((error as DOMException).name == 'NotFoundError') this._handles.delete(path)\n }\n }\n }\n\n /**\n * Forgets what the mount cached for `path` (size, handle, contents) and reads it again from OPFS.\n * For files written outside this ZenFS instance: by another tab, or by a worker writing to OPFS\n * directly. Only reads OPFS (never writes it, so never calls onOpfsChange).\n *\n * An entry that's gone (removed elsewhere) is forgotten along with anything cached under it, and\n * costs one failed lookup. A file in directories this mount hasn't cached yet (created elsewhere\n * after it mounted) gets them added to the in-memory copy, so the sync API finds it.\n */\n async invalidate(path: string): Promise<void> {\n if (path == '/') return\n this.index.delete(path)\n this._handles.delete(path)\n this._seen.delete(path)\n this._truncates.delete(path)\n let inode: Inode\n try {\n inode = await this.stat(path) // Re-indexes from OPFS (WebAccessFS.stat).\n } catch {\n this._forgetCached(path) // Gone (or unreadable for now: the next stat() looks again).\n return\n }\n try {\n this._sync.unlinkSync(path)\n } catch {\n // Not cached, or a directory: crossCopy refreshes what's under it.\n }\n if ((inode.mode & constants.S_IFMT) == constants.S_IFREG) await this._cacheParents(path)\n await this.crossCopy(path)\n }\n\n /** Drops `path` and everything under it from the index, handles and in-memory copy. */\n private _forgetCached(path: string): void {\n for (const map of [this._handles, this._seen, this._truncates] as Map<string, unknown>[]) {\n for (const p of [...map.keys()]) if (p == path || p.startsWith(path + '/')) map.delete(p)\n }\n for (const [p] of [...this.index.entries()]) {\n if (p == path || p.startsWith(path + '/')) this.index.delete(p)\n }\n const drop = (p: string): void => {\n let stats: { mode: number }\n try {\n stats = this._sync.statSync(p)\n } catch {\n return // Not cached.\n }\n try {\n if ((stats.mode & constants.S_IFMT) == constants.S_IFDIR) {\n for (const name of this._sync.readdirSync(p)) drop(join(p, name))\n this._sync.rmdirSync(p)\n } else {\n this._sync.unlinkSync(p)\n }\n } catch (error) {\n logger(`could not drop the cached copy of ${p}: ${(error as Error).name}`)\n }\n }\n drop(path)\n }\n\n /** Adds the directories above `path` that the in-memory copy lacks, so crossCopy can fill it. */\n private async _cacheParents(path: string): Promise<void> {\n const missing: string[] = []\n for (let dir = dirname(path); dir != '/'; dir = dirname(dir)) {\n try {\n this._sync.statSync(dir)\n break\n } catch {\n missing.unshift(dir)\n }\n }\n for (const dir of missing) {\n try {\n const stats = await this.stat(dir)\n this._sync.mkdirSync(dir, stats as unknown as CreationOptions)\n this._sync.touchSync(dir, stats)\n } catch (error) {\n logger(`could not cache directory ${dir}: ${(error as Error).name}`)\n return // crossCopy then skips the file (async reads still find it).\n }\n }\n }\n\n /**\n * The Async mixin's ready() then copies every file's contents into an in-memory cache, a second\n * walk that reads the same busy entries. Skip those too; the root still fails the mount.\n */\n async crossCopy(path: string): Promise<void> {\n const crossCopy = (WebAccessFS.prototype as unknown as AsyncCrossCopy).crossCopy\n if (path == '/') return crossCopy.call(this, path)\n try {\n await crossCopy.call(this, path)\n } catch (error) {\n if (!isSkippableOpfsEntryError(error) && !isErrnoChangedEntry(error)) throw error\n logger(`not caching ${path}: ${(error as Error).name}`)\n // Drop a half-copied entry so the cache doesn't serve an empty file in its place.\n try {\n this._sync.unlinkSync(path)\n } catch {\n try {\n this._sync.rmdirSync(path)\n } catch {\n // Nothing was copied.\n }\n }\n }\n }\n}\n\n/** OPFS writes take a plain ArrayBuffer view (WebAccessFS.write copies the same way). */\nfunction copyIfShared(buffer: Uint8Array): Uint8Array<ArrayBuffer> {\n const backing = buffer.buffer as ArrayBufferLike & { resizable?: boolean; growable?: boolean }\n if (backing instanceof ArrayBuffer && !backing.resizable) return buffer as Uint8Array<ArrayBuffer>\n return new Uint8Array(buffer)\n}\n\ntype AsyncCrossCopy = { crossCopy(this: TolerantWebAccessFS, path: string): Promise<void> }\n\n/** Set by the Async mixin once ready() has copied OPFS into the in-memory cache. */\ntype AsyncState = { _isInitialized: boolean }\n\nconst TRACKED = Symbol.for('seedSdk.tolerantWebAccess.trackTruncates')\n\n/**\n * ZenFS file handles truncate by lowering their inode's size, and only tell the file system the new\n * size later (touch), the same way they report a size that's merely stale. So handles on a\n * TolerantWebAccessFS report each truncate when it's made (open with 'w', ftruncate, truncate).\n * Patches the shared vfs.Handle prototype once; handles on other file systems are unaffected.\n */\nfunction trackTruncates(): void {\n const proto = vfs.Handle.prototype as typeof vfs.Handle.prototype & { [TRACKED]?: true }\n if (proto[TRACKED]) return\n proto[TRACKED] = true\n const fsOf = (handle: vfs.Handle) => (handle.fs instanceof TolerantWebAccessFS ? handle.fs : undefined)\n\n const truncate = proto.truncate\n proto.truncate = async function (this: vfs.Handle, length: number) {\n const fs = fsOf(this)\n // Noted first: on a sync handle, truncate() syncs (touch) before it returns.\n const undo = fs?._noteTruncate(this.internalPath, length)\n try {\n await truncate.call(this, length)\n } catch (error) {\n undo?.()\n throw error\n }\n fs?._truncateCache(this.internalPath, length)\n }\n const truncateSync = proto.truncateSync\n proto.truncateSync = function (this: vfs.Handle, length: number) {\n const fs = fsOf(this)\n const undo = fs?._noteTruncate(this.internalPath, length)\n try {\n truncateSync.call(this, length)\n } catch (error) {\n undo?.()\n throw error\n }\n fs?._truncateCache(this.internalPath, length)\n }\n}\ntrackTruncates()\n\n/**\n * ZenFS converts most DOMExceptions to errno errors: an entry removed mid-walk becomes ENOENT, and\n * a file whose size changed since _loadMetadata (SQLite writing in another tab) fails read() with\n * an EIO size mismatch.\n */\nfunction isErrnoChangedEntry(error: unknown): boolean {\n const { code, message } = (error ?? {}) as { code?: unknown; message?: unknown }\n if (code === 'ENOENT') return true\n return code === 'EIO' && typeof message === 'string' && message.includes('mismatch in file data size')\n}\n\n/** Drop-in for `WebAccess` in `configureSingle({ backend, handle })`. */\nexport const TolerantWebAccess = {\n ...WebAccess,\n name: 'TolerantWebAccess',\n async create(options: WebAccessOptions): Promise<WebAccessFS> {\n const fs = new TolerantWebAccessFS(options.handle, options.disableHandleCache)\n await fs._loadMetadata(options.metadata)\n return fs\n },\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tolerantWebAccess-DIt3R8_u.js","sources":["../../src/browser/helpers/tolerantWebAccess.ts"],"sourcesContent":["import { constants, Inode, vfs } from '@zenfs/core'\nimport type { CreationOptions, InodeLike } from '@zenfs/core'\nimport { dirname, join } from '@zenfs/core/path'\nimport { WebAccess, WebAccessFS } from '@zenfs/dom'\nimport type { WebAccessOptions } from '@zenfs/dom'\nimport debug from 'debug'\nimport { isSkippableOpfsEntryError } from './opfsErrors'\n\nconst logger = debug('seedSdk:browser:helpers:tolerantWebAccess')\n\n/** A truncate made through this mount that OPFS doesn't have yet. Compared by identity. */\ntype PendingTruncate = { readonly length: number }\n\n/** An OPFS file as this mount last saw it. */\ntype OpfsVersion = { size: number; lastModified: number }\n\n/**\n * WebAccessFS mounts by walking all of OPFS and reading every file's size, and one unreadable\n * entry fails the whole mount. This variant skips such entries instead. A skipped file is still\n * listed by readdir, and WebAccessFS.stat() indexes it lazily on first use, once it is readable.\n *\n * It also makes overwrites with shorter content shrink the file (see `write` and `touch`), without\n * cutting off bytes another context (a tab, a worker writing through a SyncAccessHandle) added to a\n * file this mount had indexed at a smaller size: OPFS only shrinks for a truncate made through this\n * mount, and stat() re-reads a file's size when OPFS changed since this mount last looked.\n *\n * Overrides @zenfs/dom 1.2.9 / @zenfs/core 2.5.6 internals (`_loadHandles`, `_loadMetadata`,\n * `crossCopy`, `stat`, `write`, `touch`, `remove`, `get`, `_handles`, `_sync`, `_isInitialized`,\n * `index`, and `vfs.Handle#truncate`/`truncateSync`, see `trackTruncates`); both packages are pinned\n * to exact versions, and tolerantWebAccess.test.ts / opfsOverwrite.test.ts cover the coupling.\n */\nexport class TolerantWebAccessFS extends WebAccessFS {\n /**\n * Truncates made through this mount that OPFS doesn't have yet, by path. ZenFS truncates by\n * lowering the inode's size and syncing it later, so only these may shrink the OPFS file: an\n * inode that is merely smaller than the file is a stale view of a file someone else grew.\n */\n private readonly _truncates = new Map<string, PendingTruncate>()\n\n /** Each OPFS file as this mount last saw it, to notice writes made elsewhere. */\n private readonly _seen = new Map<string, OpfsVersion>()\n\n /**\n * Called with each file path whose OPFS contents this mount changed (a write, a truncate, a\n * removal; a rename is both), once the change is in OPFS. BrowserFileManager uses it to tell other\n * tabs. Not called for what invalidate(), stat() or crossCopy() put in the in-memory copy: those\n * only read OPFS.\n */\n onOpfsChange?: (path: string) => void\n\n constructor(root: FileSystemDirectoryHandle, disableHandleCache?: boolean) {\n super(root, disableHandleCache)\n // Reads would otherwise mark the file dirty (atime) and end in touch() for every read. Without\n // atime, touch() only follows writes, truncates, chmod and utimes.\n this.attributes.set('no_atime')\n }\n\n /**\n * Called by vfs.Handle#truncate(Sync) for files on this mount (see `trackTruncates`). Returns an\n * undo for a truncate the handle then rejects.\n */\n _noteTruncate(path: string, length: number): () => void {\n const previous = this._truncates.get(path)\n // Truncated twice before a write: the bytes past the shorter length are gone either way.\n this._truncates.set(path, { length: Math.min(length, previous?.length ?? length) })\n return () => {\n if (previous) this._truncates.set(path, previous)\n else this._truncates.delete(path)\n }\n }\n\n /**\n * The sync API's in-memory copy (a StoreFS) truncates by setting the size alone and keeps the old\n * bytes, which a later write past that size then exposes in place of zeros. Cut them off there\n * too. Called by vfs.Handle#truncate(Sync) once the truncate went through.\n */\n _truncateCache(path: string, length: number): void {\n try {\n const cached = this._sync.statSync(path)\n if ((cached.mode & constants.S_IFMT) != constants.S_IFREG) return\n // Even when the size already matches: a sync handle's truncate() has synced it by now.\n const data = new Uint8Array(length) // Past the old size (truncate to extend): zeros.\n const kept = Math.min(length, cached.size)\n if (kept) this._sync.readSync(path, data.subarray(0, kept), 0, kept)\n this._sync.unlinkSync(path)\n this._sync.createFileSync(path, cached as unknown as CreationOptions)\n if (length) this._sync.writeSync(path, data, 0)\n cached.size = length\n this._sync.touchSync(path, cached)\n } catch (error) {\n logger(`could not truncate the cached copy of ${path}: ${(error as Error).name}`)\n }\n }\n\n private _takeTruncate(path: string, pending: PendingTruncate | undefined): void {\n // A truncate recorded while this write or sync was under way is left for the next one.\n if (pending && this._truncates.get(path) === pending) this._truncates.delete(path)\n }\n\n private _changed(path: string): void {\n try {\n this.onOpfsChange?.(path)\n } catch (error) {\n logger(`change listener failed for ${path}`, error)\n }\n }\n\n private _remember(path: string, file: File): void {\n this._seen.set(path, { size: file.size, lastModified: file.lastModified })\n }\n\n /** Another context changed the file: the next stat() refreshes the sync API's in-memory copy. */\n private _markChangedElsewhere(path: string): void {\n this._seen.set(path, { size: -1, lastModified: -1 })\n }\n\n /**\n * The index holds each file's size from when this mount last looked, and another context may\n * have written the file since. Re-read it from OPFS, so opening a file (an append goes to its\n * size) and reading it see the true file, and refresh the in-memory copy behind the sync API when\n * the file changed. Costs one getFile() per stat of a regular file; contents are only read when\n * the file changed.\n */\n async stat(path: string): Promise<Inode> {\n const inode = (await super.stat(path)) as Inode\n if ((inode.mode & constants.S_IFMT) != constants.S_IFREG) return inode\n // While mounting, sizes were just read and crossCopy stats every file.\n if (!(this as unknown as AsyncState)._isInitialized) return inode\n // This mount truncated the file and OPFS doesn't have it yet: the inode's size is the truth.\n if (this._truncates.has(path)) return inode\n\n let file: File\n try {\n file = await ((await this.get('file', path)) as FileSystemFileHandle).getFile()\n } catch {\n return inode // Gone or busy: keep what the index knows.\n }\n const seen = this._seen.get(path)\n if (seen && seen.size == file.size && seen.lastModified == file.lastModified) return inode\n this._remember(path, file)\n // First look at a file this mount just indexed (WebAccessFS.stat, invalidate): nothing to fix.\n if (!seen && inode.size == file.size) return inode\n logger(`${path} changed outside this mount (${inode.size} -> ${file.size} bytes)`)\n inode.update({ size: file.size, mtimeMs: file.lastModified })\n this.index.set(path, inode)\n await this._recache(path, inode, file)\n return inode\n }\n\n /** Replaces the sync API's in-memory copy of `path` with `file`, if it holds one. */\n private async _recache(path: string, inode: Inode, file: File): Promise<void> {\n try {\n this._sync.statSync(path)\n } catch {\n return // Not cached: async reads go to OPFS, and invalidate() handles the rest.\n }\n try {\n const data = new Uint8Array(await file.arrayBuffer())\n try {\n this._sync.unlinkSync(path)\n } catch {\n // Already gone.\n }\n this._sync.createFileSync(path, inode as unknown as CreationOptions)\n this._sync.writeSync(path, data, 0)\n this._sync.touchSync(path, inode)\n } catch (error) {\n logger(`not caching ${path}: ${(error as Error).name}`)\n try {\n this._sync.unlinkSync(path)\n } catch {\n // Nothing was copied.\n }\n }\n }\n\n /**\n * WebAccessFS.write opens the file with `keepExistingData` and never truncates, so a whole-file\n * overwrite with shorter content (open 'w', then a write at 0) kept the old tail on disk. Here a\n * truncate this mount made since the file was last written (open 'w', ftruncate) is applied in\n * the same writable as the data: the file is cut to that length first (a write past it leaves\n * zeros in the gap, as POSIX does). Without one, the data goes over the file OPFS has, whatever\n * size this mount last saw: appends and writes at an offset never cut off bytes another context\n * wrote.\n */\n async write(path: string, buffer: Uint8Array, offset: number): Promise<void> {\n const pending = this._truncates.get(path)\n const inode = this.index.get(path)\n let handle: FileSystemFileHandle | undefined\n if (inode && (inode.mode & constants.S_IFMT) == constants.S_IFREG) {\n try {\n handle = (await this.get('file', path)) as FileSystemFileHandle\n } catch {\n // Not in OPFS yet: WebAccessFS.write creates it, and a new file has no old tail.\n }\n }\n if (!inode || !handle) {\n await super.write(path, buffer, offset)\n this._takeTruncate(path, pending)\n if (inode) this._seen.set(path, { size: inode.size, lastModified: inode.mtimeMs })\n // WebAccessFS.write also creates directories; only files are worth telling other tabs about.\n if (inode && (inode.mode & constants.S_IFMT) == constants.S_IFREG) this._changed(path)\n return\n }\n\n const data = copyIfShared(buffer)\n const end = offset + data.byteLength\n // Truncated to no more than this write covers: start from an empty file instead of a copy.\n const wholeFile = pending !== undefined && offset == 0 && pending.length <= data.byteLength\n const writable = await handle.createWritable({ keepExistingData: !wholeFile })\n try {\n if (pending && !wholeFile) await writable.truncate(pending.length)\n await writable.write({ type: 'write', position: offset, data })\n await writable.close()\n } catch (error) {\n await writable.abort().catch(() => {})\n throw error\n }\n this._takeTruncate(path, pending)\n\n const file = await handle.getFile()\n const seen = this._seen.get(path)\n inode.update({ size: file.size, mtimeMs: file.lastModified })\n this.index.set(path, inode)\n this._remember(path, file)\n // Larger than this mount's writes explain: another context grew it. The sync API's copy is\n // refreshed by the next stat(), not here, where queued sync writes may not have landed yet.\n const expected = pending ? Math.max(pending.length, end) : Math.max(seen?.size ?? 0, end)\n if (seen && seen.size >= 0 && file.size != expected) this._markChangedElsewhere(path)\n this._changed(path)\n }\n\n /**\n * ZenFS truncates by setting the inode's size and syncing it with touch() (FileHandle.truncate\n * with no write after it). Make OPFS follow when this mount truncated the file. Any other touch\n * (chmod, utimes, the size after writes) leaves the OPFS file alone: a smaller size there is a\n * stale view, and the index takes the file's real size back.\n */\n async touch(path: string, metadata: InodeLike): Promise<void> {\n const pending = this._truncates.get(path)\n await super.touch(path, metadata)\n const inode = this.index.get(path)\n if (!inode || (inode.mode & constants.S_IFMT) != constants.S_IFREG) return\n let handle: FileSystemFileHandle\n try {\n handle = (await this.get('file', path)) as FileSystemFileHandle\n } catch {\n return // Not in OPFS (yet): nothing to shrink, and a queued write creates it.\n }\n\n if (pending) {\n const size = typeof metadata.size == 'number' ? metadata.size : pending.length\n const writable = await handle.createWritable({ keepExistingData: true })\n try {\n await writable.truncate(Math.min(pending.length, size))\n // Truncated, then extended: the new bytes are zeros.\n if (size > pending.length) await writable.truncate(size)\n await writable.close()\n } catch (error) {\n await writable.abort().catch(() => {})\n throw error\n }\n this._takeTruncate(path, pending)\n const file = await handle.getFile()\n inode.update({ size: file.size, mtimeMs: file.lastModified })\n this._remember(path, file)\n this._changed(path)\n return\n }\n\n const file = await handle.getFile()\n if (inode.size == file.size) return\n const seen = this._seen.get(path)\n inode.update({ size: file.size })\n if (!seen || seen.size != file.size || seen.lastModified != file.lastModified) {\n this._markChangedElsewhere(path)\n }\n }\n\n async remove(path: string): Promise<void> {\n for (const map of [this._truncates, this._seen]) {\n for (const p of [...map.keys()]) if (p == path || p.startsWith(path + '/')) map.delete(p)\n }\n await super.remove(path)\n this._changed(path)\n }\n\n async _loadHandles(path: string, handle: FileSystemDirectoryHandle): Promise<void> {\n try {\n for await (const [key, child] of (handle as any).entries() as AsyncIterable<[string, FileSystemHandle]>) {\n const p = join(path, key)\n this._handles.set(p, child)\n if (child.kind == 'directory') await this._loadHandles(p, child as FileSystemDirectoryHandle)\n }\n } catch (error) {\n // An unreadable root means nothing was walked; let initializeFileSystem retry the mount.\n if (!isSkippableOpfsEntryError(error) || path == '/') throw error\n // The directory went away (or became unreadable) mid-walk: forget it and anything under it.\n logger(`skipping directory ${path}: ${(error as DOMException).name}`)\n for (const p of [...this._handles.keys()]) {\n if (p == path || p.startsWith(path + '/')) this._handles.delete(p)\n }\n }\n }\n\n async _loadMetadata(metadataPath?: string): Promise<void> {\n if (metadataPath) return super._loadMetadata(metadataPath)\n\n this._handles.set('/', this.root)\n await this._loadHandles('/', this.root)\n\n for (const [path, handle] of [...this._handles]) {\n if (handle.kind == 'directory') {\n this.index.set(path, new Inode({ mode: 0o777 | constants.S_IFDIR, size: 0 }))\n continue\n }\n try {\n const { lastModified, size } = await (handle as FileSystemFileHandle).getFile()\n this.index.set(path, new Inode({ mode: 0o644 | constants.S_IFREG, size, mtimeMs: lastModified }))\n this._seen.set(path, { size, lastModified })\n } catch (error) {\n if (!isSkippableOpfsEntryError(error)) throw error\n logger(`skipping file ${path}: ${(error as DOMException).name}`)\n // A removed file's handle would keep resolving to nothing; a locked one is still valid.\n if ((error as DOMException).name == 'NotFoundError') this._handles.delete(path)\n }\n }\n }\n\n /**\n * Forgets what the mount cached for `path` (size, handle, contents) and reads it again from OPFS.\n * For files written outside this ZenFS instance: by another tab, or by a worker writing to OPFS\n * directly. Only reads OPFS (never writes it, so never calls onOpfsChange).\n *\n * An entry that's gone (removed elsewhere) is forgotten along with anything cached under it, and\n * costs one failed lookup. A file in directories this mount hasn't cached yet (created elsewhere\n * after it mounted) gets them added to the in-memory copy, so the sync API finds it.\n */\n async invalidate(path: string): Promise<void> {\n if (path == '/') return\n this.index.delete(path)\n this._handles.delete(path)\n this._seen.delete(path)\n this._truncates.delete(path)\n let inode: Inode\n try {\n inode = await this.stat(path) // Re-indexes from OPFS (WebAccessFS.stat).\n } catch {\n this._forgetCached(path) // Gone (or unreadable for now: the next stat() looks again).\n return\n }\n try {\n this._sync.unlinkSync(path)\n } catch {\n // Not cached, or a directory: crossCopy refreshes what's under it.\n }\n if ((inode.mode & constants.S_IFMT) == constants.S_IFREG) await this._cacheParents(path)\n await this.crossCopy(path)\n }\n\n /** Drops `path` and everything under it from the index, handles and in-memory copy. */\n private _forgetCached(path: string): void {\n for (const map of [this._handles, this._seen, this._truncates] as Map<string, unknown>[]) {\n for (const p of [...map.keys()]) if (p == path || p.startsWith(path + '/')) map.delete(p)\n }\n for (const [p] of [...this.index.entries()]) {\n if (p == path || p.startsWith(path + '/')) this.index.delete(p)\n }\n const drop = (p: string): void => {\n let stats: { mode: number }\n try {\n stats = this._sync.statSync(p)\n } catch {\n return // Not cached.\n }\n try {\n if ((stats.mode & constants.S_IFMT) == constants.S_IFDIR) {\n for (const name of this._sync.readdirSync(p)) drop(join(p, name))\n this._sync.rmdirSync(p)\n } else {\n this._sync.unlinkSync(p)\n }\n } catch (error) {\n logger(`could not drop the cached copy of ${p}: ${(error as Error).name}`)\n }\n }\n drop(path)\n }\n\n /** Adds the directories above `path` that the in-memory copy lacks, so crossCopy can fill it. */\n private async _cacheParents(path: string): Promise<void> {\n const missing: string[] = []\n for (let dir = dirname(path); dir != '/'; dir = dirname(dir)) {\n try {\n this._sync.statSync(dir)\n break\n } catch {\n missing.unshift(dir)\n }\n }\n for (const dir of missing) {\n try {\n const stats = await this.stat(dir)\n this._sync.mkdirSync(dir, stats as unknown as CreationOptions)\n this._sync.touchSync(dir, stats)\n } catch (error) {\n logger(`could not cache directory ${dir}: ${(error as Error).name}`)\n return // crossCopy then skips the file (async reads still find it).\n }\n }\n }\n\n /**\n * The Async mixin's ready() then copies every file's contents into an in-memory cache, a second\n * walk that reads the same busy entries. Skip those too; the root still fails the mount.\n */\n async crossCopy(path: string): Promise<void> {\n const crossCopy = (WebAccessFS.prototype as unknown as AsyncCrossCopy).crossCopy\n if (path == '/') return crossCopy.call(this, path)\n try {\n await crossCopy.call(this, path)\n } catch (error) {\n if (!isSkippableOpfsEntryError(error) && !isErrnoChangedEntry(error)) throw error\n logger(`not caching ${path}: ${(error as Error).name}`)\n // Drop a half-copied entry so the cache doesn't serve an empty file in its place.\n try {\n this._sync.unlinkSync(path)\n } catch {\n try {\n this._sync.rmdirSync(path)\n } catch {\n // Nothing was copied.\n }\n }\n }\n }\n}\n\n/** OPFS writes take a plain ArrayBuffer view (WebAccessFS.write copies the same way). */\nfunction copyIfShared(buffer: Uint8Array): Uint8Array<ArrayBuffer> {\n const backing = buffer.buffer as ArrayBufferLike & { resizable?: boolean; growable?: boolean }\n if (backing instanceof ArrayBuffer && !backing.resizable) return buffer as Uint8Array<ArrayBuffer>\n return new Uint8Array(buffer)\n}\n\ntype AsyncCrossCopy = { crossCopy(this: TolerantWebAccessFS, path: string): Promise<void> }\n\n/** Set by the Async mixin once ready() has copied OPFS into the in-memory cache. */\ntype AsyncState = { _isInitialized: boolean }\n\nconst TRACKED = Symbol.for('seedSdk.tolerantWebAccess.trackTruncates')\n\n/**\n * ZenFS file handles truncate by lowering their inode's size, and only tell the file system the new\n * size later (touch), the same way they report a size that's merely stale. So handles on a\n * TolerantWebAccessFS report each truncate when it's made (open with 'w', ftruncate, truncate).\n * Patches the shared vfs.Handle prototype once; handles on other file systems are unaffected.\n */\nfunction trackTruncates(): void {\n const proto = vfs.Handle.prototype as typeof vfs.Handle.prototype & { [TRACKED]?: true }\n if (proto[TRACKED]) return\n proto[TRACKED] = true\n const fsOf = (handle: vfs.Handle) => (handle.fs instanceof TolerantWebAccessFS ? handle.fs : undefined)\n\n const truncate = proto.truncate\n proto.truncate = async function (this: vfs.Handle, length: number) {\n const fs = fsOf(this)\n // Noted first: on a sync handle, truncate() syncs (touch) before it returns.\n const undo = fs?._noteTruncate(this.internalPath, length)\n try {\n await truncate.call(this, length)\n } catch (error) {\n undo?.()\n throw error\n }\n fs?._truncateCache(this.internalPath, length)\n }\n const truncateSync = proto.truncateSync\n proto.truncateSync = function (this: vfs.Handle, length: number) {\n const fs = fsOf(this)\n const undo = fs?._noteTruncate(this.internalPath, length)\n try {\n truncateSync.call(this, length)\n } catch (error) {\n undo?.()\n throw error\n }\n fs?._truncateCache(this.internalPath, length)\n }\n}\ntrackTruncates()\n\n/**\n * ZenFS converts most DOMExceptions to errno errors: an entry removed mid-walk becomes ENOENT, and\n * a file whose size changed since _loadMetadata (SQLite writing in another tab) fails read() with\n * an EIO size mismatch.\n */\nfunction isErrnoChangedEntry(error: unknown): boolean {\n const { code, message } = (error ?? {}) as { code?: unknown; message?: unknown }\n if (code === 'ENOENT') return true\n return code === 'EIO' && typeof message === 'string' && message.includes('mismatch in file data size')\n}\n\n/** Drop-in for `WebAccess` in `configureSingle({ backend, handle })`. */\nexport const TolerantWebAccess = {\n ...WebAccess,\n name: 'TolerantWebAccess',\n async create(options: WebAccessOptions): Promise<WebAccessFS> {\n const fs = new TolerantWebAccessFS(options.handle, options.disableHandleCache)\n await fs._loadMetadata(options.metadata)\n return fs\n },\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { E as BaseDb, A as seeds, m as metadata, C as versions } from './BasePathResolver-DT63t0XU.js';
1
+ import { E as BaseDb, A as seeds, m as metadata, C as versions } from './BasePathResolver-DrzGVH9L.js';
2
2
  import { eq, and, or, inArray, isNull } from 'drizzle-orm';
3
- import { w as writeInBatches } from './Item-CoP48bl3.js';
3
+ import { w as writeInBatches } from './Item-BUUFuywT.js';
4
4
 
5
5
  /**
6
6
  * Sets revokedAt timestamp on a seed record after attestations have been revoked on EAS.
@@ -29,4 +29,4 @@ const updateSeedRevokedAt = async ({ seedLocalId, revokedAt, metadataUids, versi
29
29
  };
30
30
 
31
31
  export { updateSeedRevokedAt as u };
32
- //# sourceMappingURL=updateSeedRevokedAt-B-xAQxaj.js.map
32
+ //# sourceMappingURL=updateSeedRevokedAt-DtTPSzpM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"updateSeedRevokedAt-B-xAQxaj.js","sources":["../../src/db/write/updateSeedRevokedAt.ts"],"sourcesContent":["import { BaseDb } from '@/db/Db/BaseDb'\nimport { metadata, seeds, versions } from '@/seedSchema'\nimport { and, eq, inArray, isNull, or } from 'drizzle-orm'\nimport { writeInBatches } from '@/db/sqlParamBatches'\n\ntype UpdateSeedRevokedAtProps = {\n seedLocalId: string\n /** Unix seconds. */\n revokedAt: number\n /**\n * Property attestation UIDs revoked along with the seed. Their metadata rows get the same\n * `revoked_at` (unless they already have one), so they read as revoked before the next sync.\n * Rows sync derived from them (ItemStorage rows whose `derived_from_uid` is one of these) are\n * stamped the same way.\n */\n metadataUids?: string[]\n /** Version attestation UIDs revoked along with the seed; their rows are stamped the same way. */\n versionUids?: string[]\n}\n\n/**\n * Sets revokedAt timestamp on a seed record after attestations have been revoked on EAS.\n */\nexport const updateSeedRevokedAt = async ({\n seedLocalId,\n revokedAt,\n metadataUids,\n versionUids,\n}: UpdateSeedRevokedAtProps): Promise<void> => {\n if (!seedLocalId) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n await appDb\n .update(seeds)\n .set({\n revokedAt,\n updatedAt: Date.now(),\n })\n .where(eq(seeds.localId, seedLocalId))\n\n // An item can have many property attestations; each list binds once per uid (twice for metadata).\n await writeInBatches(metadataUids ?? [], (chunk) =>\n appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n or(inArray(metadata.uid, chunk), inArray(metadata.derivedFromUid, chunk)),\n isNull(metadata.revokedAt),\n ),\n ),\n )\n\n await writeInBatches(versionUids ?? [], (chunk) =>\n appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(and(inArray(versions.uid, chunk), isNull(versions.revokedAt))),\n )\n}\n"],"names":[],"mappings":";;;;AAoBA;;AAEG;AACI,MAAM,mBAAmB,GAAG,OAAO,EACxC,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,GACc,KAAmB;IAC5C,IAAI,CAAC,WAAW,EAAE;QAChB;IACF;AAEA,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,MAAM;SACH,MAAM,CAAC,KAAK;AACZ,SAAA,GAAG,CAAC;QACH,SAAS;AACT,QAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB;SACA,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;;IAGxC,MAAM,cAAc,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,KAAK,KAC7C;SACG,MAAM,CAAC,QAAQ;SACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AACxC,SAAA,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EACzE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC3B,CACF,CACJ;IAED,MAAM,cAAc,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,KAAK,KAC5C;SACG,MAAM,CAAC,QAAQ;SACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;SACxC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CACxE;AACH;;"}
1
+ {"version":3,"file":"updateSeedRevokedAt-DtTPSzpM.js","sources":["../../src/db/write/updateSeedRevokedAt.ts"],"sourcesContent":["import { BaseDb } from '@/db/Db/BaseDb'\nimport { metadata, seeds, versions } from '@/seedSchema'\nimport { and, eq, inArray, isNull, or } from 'drizzle-orm'\nimport { writeInBatches } from '@/db/sqlParamBatches'\n\ntype UpdateSeedRevokedAtProps = {\n seedLocalId: string\n /** Unix seconds. */\n revokedAt: number\n /**\n * Property attestation UIDs revoked along with the seed. Their metadata rows get the same\n * `revoked_at` (unless they already have one), so they read as revoked before the next sync.\n * Rows sync derived from them (ItemStorage rows whose `derived_from_uid` is one of these) are\n * stamped the same way.\n */\n metadataUids?: string[]\n /** Version attestation UIDs revoked along with the seed; their rows are stamped the same way. */\n versionUids?: string[]\n}\n\n/**\n * Sets revokedAt timestamp on a seed record after attestations have been revoked on EAS.\n */\nexport const updateSeedRevokedAt = async ({\n seedLocalId,\n revokedAt,\n metadataUids,\n versionUids,\n}: UpdateSeedRevokedAtProps): Promise<void> => {\n if (!seedLocalId) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n await appDb\n .update(seeds)\n .set({\n revokedAt,\n updatedAt: Date.now(),\n })\n .where(eq(seeds.localId, seedLocalId))\n\n // An item can have many property attestations; each list binds once per uid (twice for metadata).\n await writeInBatches(metadataUids ?? [], (chunk) =>\n appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n or(inArray(metadata.uid, chunk), inArray(metadata.derivedFromUid, chunk)),\n isNull(metadata.revokedAt),\n ),\n ),\n )\n\n await writeInBatches(versionUids ?? [], (chunk) =>\n appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(and(inArray(versions.uid, chunk), isNull(versions.revokedAt))),\n )\n}\n"],"names":[],"mappings":";;;;AAoBA;;AAEG;AACI,MAAM,mBAAmB,GAAG,OAAO,EACxC,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,GACc,KAAmB;IAC5C,IAAI,CAAC,WAAW,EAAE;QAChB;IACF;AAEA,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE;AAE/B,IAAA,MAAM;SACH,MAAM,CAAC,KAAK;AACZ,SAAA,GAAG,CAAC;QACH,SAAS;AACT,QAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB;SACA,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;;IAGxC,MAAM,cAAc,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,KAAK,KAC7C;SACG,MAAM,CAAC,QAAQ;SACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;AACxC,SAAA,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EACzE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC3B,CACF,CACJ;IAED,MAAM,cAAc,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,KAAK,KAC5C;SACG,MAAM,CAAC,QAAQ;SACf,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;SACxC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CACxE;AACH;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seedprotocol/sdk",
3
- "version": "0.7.4-next.793.g6dd83dd",
3
+ "version": "0.7.4",
4
4
  "description": "Official TypeScript SDK for Seed Protocol — local-first ORM with SQLite/OPFS, syncing via Ethereum Attestation Service (EAS) and Arweave.",
5
5
  "keywords": [
6
6
  "seed-protocol",
@@ -78,10 +78,10 @@
78
78
  "dependencies": {
79
79
  "@ethereum-attestation-service/eas-sdk": "^2.9.0",
80
80
  "@libsql/client": "^0.15.15",
81
- "@seedprotocol/arweave": "0.7.4-next.793.g6dd83dd",
82
- "@seedprotocol/eas": "0.7.4-next.793.g6dd83dd",
83
- "@seedprotocol/query": "0.7.4-next.793.g6dd83dd",
84
- "@seedprotocol/vite": "0.7.4-next.793.g6dd83dd",
81
+ "@seedprotocol/arweave": "0.7.4",
82
+ "@seedprotocol/eas": "0.7.4",
83
+ "@seedprotocol/query": "0.7.4",
84
+ "@seedprotocol/vite": "0.7.4",
85
85
  "@sinclair/typebox": "^0.34.45",
86
86
  "@sqlite.org/sqlite-wasm": "^3.51.1-build2",
87
87
  "arweave": "^1.15.5",