@seedprotocol/sdk 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BasePathResolver-ndE8XTpw.js → BasePathResolver-DRT09oVv.js} +2 -2
- package/dist/{BasePathResolver-ndE8XTpw.js.map → BasePathResolver-DRT09oVv.js.map} +1 -1
- package/dist/{ClientManager-DLleL_2e.js → ClientManager-DngaZdw6.js} +20 -20
- package/dist/{ClientManager-DLleL_2e.js.map → ClientManager-DngaZdw6.js.map} +1 -1
- package/dist/{Item-zBFWQDU9.js → Item-ZUAmf943.js} +118 -72
- package/dist/{Item-zBFWQDU9.js.map → Item-ZUAmf943.js.map} +1 -1
- package/dist/{ModelProperty-lth9L37R.js → ModelProperty-6llK4MTH.js} +64 -35
- package/dist/ModelProperty-6llK4MTH.js.map +1 -0
- package/dist/{Schema-DOhlrQ-N.js → Schema-D-Ud-XYw.js} +106 -57
- package/dist/Schema-D-Ud-XYw.js.map +1 -0
- package/dist/{SchemaValidationService-DDKr5piy.js → SchemaValidationService-IoS7JquP.js} +7 -7
- package/dist/{SchemaValidationService-DDKr5piy.js.map → SchemaValidationService-IoS7JquP.js.map} +1 -1
- package/dist/{backfillMetadataPropertyIds-fG3ujaSh.js → backfillMetadataPropertyIds-BlVeE7w7.js} +4 -4
- package/dist/{backfillMetadataPropertyIds-fG3ujaSh.js.map → backfillMetadataPropertyIds-BlVeE7w7.js.map} +1 -1
- package/dist/cjs/{ModelProperty-BEsIHAjk.js → ModelProperty-Dv7AQfmQ.js} +59 -30
- package/dist/cjs/ModelProperty-Dv7AQfmQ.js.map +1 -0
- package/dist/cjs/{Schema-qEp5mH1N.js → Schema-BHVp1g-M.js} +93 -44
- package/dist/cjs/Schema-BHVp1g-M.js.map +1 -0
- package/dist/cjs/{SchemaValidationService-CWEnZmOH.js → SchemaValidationService-BSU9knjf.js} +2 -2
- package/dist/cjs/{SchemaValidationService-CWEnZmOH.js.map → SchemaValidationService-BSU9knjf.js.map} +1 -1
- package/dist/cjs/{backfillMetadataPropertyIds-tw8JGMT0.js → backfillMetadataPropertyIds-WIovQ_d8.js} +3 -3
- package/dist/cjs/{backfillMetadataPropertyIds-tw8JGMT0.js.map → backfillMetadataPropertyIds-WIovQ_d8.js.map} +1 -1
- package/dist/cjs/{eas-CLiV2Hmn.js → eas-CUYXdr2t.js} +3 -3
- package/dist/cjs/{eas-CLiV2Hmn.js.map → eas-CUYXdr2t.js.map} +1 -1
- package/dist/cjs/{getItem-DSRtx_68.js → getItem-z1tHu0hu.js} +2 -2
- package/dist/cjs/{getItem-DSRtx_68.js.map → getItem-z1tHu0hu.js.map} +1 -1
- package/dist/cjs/{getLatestVersionRow-DVizNNoI.js → getLatestVersionRow-CcaabxIW.js} +2 -2
- package/dist/cjs/{getLatestVersionRow-DVizNNoI.js.map → getLatestVersionRow-CcaabxIW.js.map} +1 -1
- package/dist/cjs/{getPublishPayload-D5-dYtNq.js → getPublishPayload-CEP_e-Kv.js} +160 -204
- package/dist/cjs/getPublishPayload-CEP_e-Kv.js.map +1 -0
- package/dist/cjs/{getPublishUploads-B5Lq6q-_.js → getPublishUploads-Ctn5k1k6.js} +49 -10
- package/dist/cjs/getPublishUploads-Ctn5k1k6.js.map +1 -0
- package/dist/cjs/{index-C66AfYDG.js → index-Cvvt0-5B.js} +244 -87
- package/dist/cjs/index-Cvvt0-5B.js.map +1 -0
- package/dist/cjs/{index-B3UDbm1C.js → index-DfGhF1dc.js} +3 -3
- package/dist/cjs/index-DfGhF1dc.js.map +1 -0
- package/dist/cjs/{property-BVJIP7SX.js → property-DbEPQ1m9.js} +5 -5
- package/dist/cjs/{property-BVJIP7SX.js.map → property-DbEPQ1m9.js.map} +1 -1
- package/dist/cjs/publishDraftGraph-C38gf302.js +403 -0
- package/dist/cjs/publishDraftGraph-C38gf302.js.map +1 -0
- package/dist/cjs/{resetAmbiguousLegacyItemData-BaZqUui9.js → resetAmbiguousLegacyItemData-CfMhRHwK.js} +2 -2
- package/dist/cjs/{resetAmbiguousLegacyItemData-BaZqUui9.js.map → resetAmbiguousLegacyItemData-CfMhRHwK.js.map} +1 -1
- package/dist/cjs/{resolveModelForSyncedSeed-CC6dQctx.js → resolveModelForSyncedSeed-CNYaLOir.js} +2 -2
- package/dist/cjs/{resolveModelForSyncedSeed-CC6dQctx.js.map → resolveModelForSyncedSeed-CNYaLOir.js.map} +1 -1
- package/dist/cjs/{syncDbWithEas-Dk96sAG-.js → syncDbWithEas-d1iOdTTI.js} +20 -7
- package/dist/cjs/{syncDbWithEas-Dk96sAG-.js.map → syncDbWithEas-d1iOdTTI.js.map} +1 -1
- package/dist/{configurePlatform-BMoPG9vY.js → configurePlatform-CZpjyuCo.js} +4 -4
- package/dist/{configurePlatform-BMoPG9vY.js.map → configurePlatform-CZpjyuCo.js.map} +1 -1
- package/dist/{db-BJZN0a0a.js → db-Lw0KVZmc.js} +11 -11
- package/dist/{db-BJZN0a0a.js.map → db-Lw0KVZmc.js.map} +1 -1
- package/dist/{eas-B0hsMLqt.js → eas-CQ-Smzk2.js} +6 -6
- package/dist/{eas-B0hsMLqt.js.map → eas-CQ-Smzk2.js.map} +1 -1
- package/dist/{getItem-DEh4WfHG.js → getItem-CSfSok9f.js} +5 -5
- package/dist/{getItem-DEh4WfHG.js.map → getItem-CSfSok9f.js.map} +1 -1
- package/dist/{getLatestVersionRow-Brrl1AnW.js → getLatestVersionRow-72Atl9vB.js} +5 -5
- package/dist/{getLatestVersionRow-Brrl1AnW.js.map → getLatestVersionRow-72Atl9vB.js.map} +1 -1
- package/dist/{getPublishPayload-H032DHC7.js → getPublishPayload-76_KfB5Y.js} +155 -200
- package/dist/getPublishPayload-76_KfB5Y.js.map +1 -0
- package/dist/{getPublishUploads-CR66RlGJ.js → getPublishUploads-CqgMBD8f.js} +52 -13
- package/dist/getPublishUploads-CqgMBD8f.js.map +1 -0
- package/dist/{index-B0LgJblD.js → index-5b3JsS55.js} +2 -2
- package/dist/index-5b3JsS55.js.map +1 -0
- package/dist/{index-6bJuv5Tt.js → index-BpgD305l.js} +9 -9
- package/dist/{index-6bJuv5Tt.js.map → index-BpgD305l.js.map} +1 -1
- package/dist/{index-DtfjeuxC.js → index-Y-yYyRBf.js} +166 -75
- package/dist/index-Y-yYyRBf.js.map +1 -0
- package/dist/{index.browser-CNrqhvEA.js → index.browser-DaTzn79x.js} +9 -9
- package/dist/{index.browser-CNrqhvEA.js.map → index.browser-DaTzn79x.js.map} +1 -1
- package/dist/{index.node-DrHiTuOr.js → index.node-NYKqFOoe.js} +5 -5
- package/dist/{index.node-DrHiTuOr.js.map → index.node-NYKqFOoe.js.map} +1 -1
- package/dist/main.cjs +1 -1
- package/dist/main.js +257 -181
- package/dist/main.js.map +1 -1
- package/dist/node.js +12 -12
- package/dist/platform.browser.js +5 -5
- package/dist/platform.node.js +3 -3
- package/dist/{property-D2Nnsmm1.js → property-ByaiSyUK.js} +10 -10
- package/dist/{property-D2Nnsmm1.js.map → property-ByaiSyUK.js.map} +1 -1
- package/dist/publishDraftGraph-BRm6Pq3Q.js +405 -0
- package/dist/publishDraftGraph-BRm6Pq3Q.js.map +1 -0
- package/dist/{resetAmbiguousLegacyItemData-BqbHNUYk.js → resetAmbiguousLegacyItemData-B4dX6ZA1.js} +2 -2
- package/dist/{resetAmbiguousLegacyItemData-BqbHNUYk.js.map → resetAmbiguousLegacyItemData-B4dX6ZA1.js.map} +1 -1
- package/dist/{resolveModelForSyncedSeed-DQK6JfXS.js → resolveModelForSyncedSeed-B0tco3zG.js} +2 -2
- package/dist/{resolveModelForSyncedSeed-DQK6JfXS.js.map → resolveModelForSyncedSeed-B0tco3zG.js.map} +1 -1
- package/dist/src/Item/Item.d.ts +11 -0
- package/dist/src/Item/Item.d.ts.map +1 -1
- package/dist/src/ItemProperty/ItemProperty.d.ts +10 -0
- package/dist/src/ItemProperty/ItemProperty.d.ts.map +1 -1
- package/dist/src/Model/Model.d.ts +15 -2
- package/dist/src/Model/Model.d.ts.map +1 -1
- package/dist/src/Model/service/actors/createModelProperties.d.ts.map +1 -1
- package/dist/src/Model/service/actors/loadOrCreateModel.d.ts.map +1 -1
- package/dist/src/Model/service/actors/validateModel.d.ts.map +1 -1
- package/dist/src/Model/service/modelMachine.d.ts.map +1 -1
- package/dist/src/ModelProperty/ModelProperty.d.ts +9 -1
- package/dist/src/ModelProperty/ModelProperty.d.ts.map +1 -1
- package/dist/src/ModelProperty/service/actors/compareAndMarkDraft.d.ts.map +1 -1
- package/dist/src/ModelProperty/service/actors/saveToSchema.d.ts.map +1 -1
- package/dist/src/ModelProperty/service/actors/validateProperty.d.ts.map +1 -1
- package/dist/src/Schema/Schema.d.ts +7 -0
- package/dist/src/Schema/Schema.d.ts.map +1 -1
- package/dist/src/Schema/service/actors/checkExistingSchema.d.ts.map +1 -1
- package/dist/src/Schema/service/actors/createModelInstances.d.ts.map +1 -1
- package/dist/src/Schema/service/actors/loadOrCreateSchema.d.ts.map +1 -1
- package/dist/src/db/read/getPublishPayload.d.ts +9 -0
- package/dist/src/db/read/getPublishPayload.d.ts.map +1 -1
- package/dist/src/db/read/getPublishUploads.d.ts +5 -0
- package/dist/src/db/read/getPublishUploads.d.ts.map +1 -1
- package/dist/src/db/read/publishDraftGraph.d.ts +57 -0
- package/dist/src/db/read/publishDraftGraph.d.ts.map +1 -0
- package/dist/src/db/read/summarizePublishWork.d.ts.map +1 -1
- package/dist/src/helpers/entity/entityLiveQuery.d.ts.map +1 -1
- package/dist/src/helpers/entity/evictionEpoch.d.ts +18 -0
- package/dist/src/helpers/entity/evictionEpoch.d.ts.map +1 -0
- package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts +28 -6
- package/dist/src/helpers/htmlEmbeddedDataUriPublish.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/services/write/actors/validateEntity.d.ts.map +1 -1
- package/dist/src/types/item.d.ts +7 -8
- package/dist/src/types/item.d.ts.map +1 -1
- package/dist/{syncDbWithEas-LRKr_NZF.js → syncDbWithEas-BPap9Sru.js} +14 -14
- package/dist/{syncDbWithEas-LRKr_NZF.js.map → syncDbWithEas-BPap9Sru.js.map} +1 -1
- package/dist/{tabEvents-DYI2GU7i.js → tabEvents-C6NXS6Jl.js} +6 -6
- package/dist/{tabEvents-DYI2GU7i.js.map → tabEvents-C6NXS6Jl.js.map} +1 -1
- package/dist/{tolerantWebAccess-CzOBz5M6.js → tolerantWebAccess-NBQ1NB4i.js} +6 -6
- package/dist/{tolerantWebAccess-CzOBz5M6.js.map → tolerantWebAccess-NBQ1NB4i.js.map} +1 -1
- package/dist/{updateSeedRevokedAt-B58ORbY3.js → updateSeedRevokedAt-CYwgVNlM.js} +3 -3
- package/dist/{updateSeedRevokedAt-B58ORbY3.js.map → updateSeedRevokedAt-CYwgVNlM.js.map} +1 -1
- package/package.json +8 -10
- package/dist/ModelProperty-lth9L37R.js.map +0 -1
- package/dist/Schema-DOhlrQ-N.js.map +0 -1
- package/dist/cjs/ModelProperty-BEsIHAjk.js.map +0 -1
- package/dist/cjs/Schema-qEp5mH1N.js.map +0 -1
- package/dist/cjs/getPublishPayload-D5-dYtNq.js.map +0 -1
- package/dist/cjs/getPublishUploads-B5Lq6q-_.js.map +0 -1
- package/dist/cjs/getSegmentedItemProperties-giHO7R3d.js +0 -147
- package/dist/cjs/getSegmentedItemProperties-giHO7R3d.js.map +0 -1
- package/dist/cjs/index-B3UDbm1C.js.map +0 -1
- package/dist/cjs/index-C66AfYDG.js.map +0 -1
- package/dist/getPublishPayload-H032DHC7.js.map +0 -1
- package/dist/getPublishUploads-CR66RlGJ.js.map +0 -1
- package/dist/getSegmentedItemProperties-C2EJ2G0N.js +0 -147
- package/dist/getSegmentedItemProperties-C2EJ2G0N.js.map +0 -1
- package/dist/index-B0LgJblD.js.map +0 -1
- package/dist/index-DtfjeuxC.js.map +0 -1
- package/dist/src/browser/helpers/index.d.ts +0 -4
- package/dist/src/browser/helpers/index.d.ts.map +0 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var drizzleOrm = require('drizzle-orm');
|
|
4
4
|
var casing = require('drizzle-orm/casing');
|
|
5
5
|
var debug = require('debug');
|
|
6
|
-
var main_cjs = require('./index-
|
|
6
|
+
var main_cjs = require('./index-Cvvt0-5B.js');
|
|
7
7
|
require('immer');
|
|
8
8
|
require('reflect-metadata');
|
|
9
9
|
require('xstate');
|
|
@@ -113,4 +113,4 @@ const resetAmbiguousLegacyItemData = async () => {
|
|
|
113
113
|
|
|
114
114
|
exports.LEGACY_ITEM_MODEL_CHECK_KEY = LEGACY_ITEM_MODEL_CHECK_KEY;
|
|
115
115
|
exports.resetAmbiguousLegacyItemData = resetAmbiguousLegacyItemData;
|
|
116
|
-
//# sourceMappingURL=resetAmbiguousLegacyItemData-
|
|
116
|
+
//# sourceMappingURL=resetAmbiguousLegacyItemData-CfMhRHwK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resetAmbiguousLegacyItemData-
|
|
1
|
+
{"version":3,"file":"resetAmbiguousLegacyItemData-CfMhRHwK.js","sources":["../../../src/db/resetAmbiguousLegacyItemData.ts"],"sourcesContent":["import { eq, isNotNull, isNull, and } from 'drizzle-orm'\nimport { toSnakeCase } from 'drizzle-orm/casing'\nimport debug from 'debug'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport {\n appState,\n arweaveL1FinalizeJobs,\n easSyncProcesses,\n htmlEmbeddedImageCoPublish,\n metadata,\n models,\n publishProcesses,\n schemas,\n seeds,\n uploadProcesses,\n modelSchemas,\n versions,\n} from '@/seedSchema'\n\nconst logger = debug('seedSdk:db:resetAmbiguousLegacyItemData')\n\n/** appState key recording that the one-time check after migration 0015 has run. */\nexport const LEGACY_ITEM_MODEL_CHECK_KEY = 'legacyItemModelCheck:v1'\n\n/**\n * One-time check after seeds.model_file_id was introduced (migration 0015). Seeds from before then\n * that couldn't be backfilled have no model; if their model name now exists in more than one schema\n * there is no way to tell which model they belong to. In that case the local item data (seeds,\n * versions, metadata and the jobs that reference them) is cleared, keeping schemas and models;\n * published items come back on the next EAS sync.\n *\n * Runs once (not on every start): EAS-synced seeds also lack model_file_id until\n * resolveModelForSyncedSeed exists, and re-checking would clear the DB after every sync.\n * TODO: replace the reset with a migration path once there is real user data at stake.\n *\n * @returns true if item data was cleared\n */\nexport const resetAmbiguousLegacyItemData = async (): Promise<boolean> => {\n const db = BaseDb.getAppDb()\n if (!db) return false\n\n const done = await db.select({ key: appState.key }).from(appState).where(eq(appState.key, LEGACY_ITEM_MODEL_CHECK_KEY)).limit(1)\n if (done.length > 0) return false\n\n const markDone = () =>\n db\n .insert(appState)\n .values({ key: LEGACY_ITEM_MODEL_CHECK_KEY, value: String(Date.now()), createdAt: Date.now(), updatedAt: Date.now() })\n .onConflictDoNothing()\n\n const legacyTypes = (await db\n .selectDistinct({ type: seeds.type })\n .from(seeds)\n .where(and(isNull(seeds.modelFileId), isNotNull(seeds.type)))) as { type: string }[]\n if (legacyTypes.length === 0) {\n await markDone()\n return false\n }\n\n // Which seed types (snake_case model names) map to models in more than one schema\n const linkedModels = (await db\n .select({ modelId: models.id, modelName: models.name, schemaName: schemas.name })\n .from(models)\n .innerJoin(modelSchemas, eq(models.id, modelSchemas.modelId))\n .innerJoin(schemas, eq(modelSchemas.schemaId, schemas.id))) as {\n modelId: number\n modelName: string\n schemaName: string\n }[]\n const byType = new Map<string, { modelIds: Set<number>; schemaNames: Set<string> }>()\n for (const row of linkedModels) {\n const type = toSnakeCase(row.modelName)\n const entry = byType.get(type) ?? { modelIds: new Set(), schemaNames: new Set() }\n entry.modelIds.add(row.modelId)\n entry.schemaNames.add(row.schemaName)\n byType.set(type, entry)\n }\n const ambiguous = legacyTypes\n .map(({ type }) => ({ type, entry: byType.get(type) }))\n .filter(({ entry }) => entry && entry.modelIds.size > 1)\n\n if (ambiguous.length === 0) {\n await markDone()\n return false\n }\n\n const details = ambiguous\n .map(({ type, entry }) => `\"${type}\" (schemas: ${[...entry!.schemaNames].sort().join(', ')})`)\n .join('; ')\n console.warn(\n `[seed-protocol] Clearing local item data: items created before this SDK version don't record ` +\n `which model they belong to, and these model names now exist in more than one schema: ${details}. ` +\n `Schemas and models are kept; published items will be restored by the next EAS sync.`,\n )\n logger(`Clearing item data for ambiguous legacy seed types: ${details}`)\n\n for (const table of [\n htmlEmbeddedImageCoPublish,\n arweaveL1FinalizeJobs,\n uploadProcesses,\n publishProcesses,\n easSyncProcesses,\n metadata,\n versions,\n seeds,\n ]) {\n await db.delete(table)\n }\n await markDone()\n return true\n}\n"],"names":["BaseDb","appState","eq","seeds","and","isNull","isNotNull","models","schemas","modelSchemas","toSnakeCase","htmlEmbeddedImageCoPublish","arweaveL1FinalizeJobs","uploadProcesses","publishProcesses","easSyncProcesses","metadata","versions"],"mappings":"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"}
|
package/dist/cjs/{resolveModelForSyncedSeed-CC6dQctx.js → resolveModelForSyncedSeed-CNYaLOir.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var debug = require('debug');
|
|
4
|
-
var main_cjs = require('./index-
|
|
4
|
+
var main_cjs = require('./index-Cvvt0-5B.js');
|
|
5
5
|
|
|
6
6
|
const logger = debug('seedSdk:db:read:resolveModelForSyncedSeed');
|
|
7
7
|
/** Emitted when background work skips a seed whose model name exists in several schemas. */
|
|
@@ -46,4 +46,4 @@ const skipSeedOnAmbiguousModel = async (seed, context, work) => {
|
|
|
46
46
|
|
|
47
47
|
exports.resolveModelForSyncedSeed = resolveModelForSyncedSeed;
|
|
48
48
|
exports.skipSeedOnAmbiguousModel = skipSeedOnAmbiguousModel;
|
|
49
|
-
//# sourceMappingURL=resolveModelForSyncedSeed-
|
|
49
|
+
//# sourceMappingURL=resolveModelForSyncedSeed-CNYaLOir.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveModelForSyncedSeed-
|
|
1
|
+
{"version":3,"file":"resolveModelForSyncedSeed-CNYaLOir.js","sources":["../../../src/db/read/resolveModelForSyncedSeed.ts"],"sourcesContent":["import debug from 'debug'\nimport { eventEmitter } from '@/eventBus'\nimport { AmbiguousModelError } from '@/Model/errors'\n\nconst logger = debug('seedSdk:db:read:resolveModelForSyncedSeed')\n\n/** Emitted when background work skips a seed whose model name exists in several schemas. */\nexport const MODEL_AMBIGUOUS_EVENT = 'model:ambiguous' as const\n\nexport type ModelAmbiguousEventPayload = {\n modelName: string\n schemaNames: string[]\n seedLocalId?: string\n seedUid?: string\n /** What was being done when the seed was skipped (e.g. 'easSync.metadata'). */\n context: string\n}\n\nexport type SyncedSeedInfo = {\n seedUid?: string | null\n seedLocalId?: string | null\n /** seeds.type as synced from EAS (the EAS schema name, i.e. snake_case model name). */\n modelType?: string | null\n /** EAS schema UID of the seed attestation. */\n schemaUid?: string | null\n}\n\n/**\n * Seam for matching an EAS-synced seed to a local model (its schemaFileId).\n *\n * EAS identifies a seed's model only by name (`bytes32 <model_name>`), so when several local schemas\n * define a model with that name the seed alone can't say which one it is. The plan is to match by\n * the seed's properties and metadata (see docs/EAS_SYNCED_SEED_MODEL_RESOLUTION.md).\n *\n * TODO(eas-synced-seed-model-resolution): not implemented yet. Returns undefined, so callers fall\n * back to the name, which throws AmbiguousModelError when the name is ambiguous.\n */\nexport const resolveModelForSyncedSeed = async (_seed: SyncedSeedInfo): Promise<string | undefined> => {\n return undefined\n}\n\n/**\n * Run background work for one seed; if it hits an ambiguous model name, log, emit\n * MODEL_AMBIGUOUS_EVENT and return undefined (skip) instead of failing the whole job. Loading the\n * item directly still throws, so the problem surfaces where the app touches it.\n */\nexport const skipSeedOnAmbiguousModel = async <T>(\n seed: { seedLocalId?: string | null; seedUid?: string | null },\n context: string,\n work: () => Promise<T>,\n): Promise<T | undefined> => {\n try {\n return await work()\n } catch (error) {\n if (!(error instanceof AmbiguousModelError)) throw error\n logger(`Skipping seed ${seed.seedLocalId ?? seed.seedUid} in ${context}: ${error.message}`)\n const payload: ModelAmbiguousEventPayload = {\n modelName: error.modelName,\n schemaNames: error.schemaNames,\n seedLocalId: seed.seedLocalId ?? undefined,\n seedUid: seed.seedUid ?? undefined,\n context,\n }\n eventEmitter.emit(MODEL_AMBIGUOUS_EVENT, payload)\n return undefined\n }\n}\n"],"names":["AmbiguousModelError","eventEmitter"],"mappings":";;;;;AAIA,MAAM,MAAM,GAAG,KAAK,CAAC,2CAA2C,CAAC;AAEjE;AACO,MAAM,qBAAqB,GAAG,iBAA0B;AAoB/D;;;;;;;;;AASG;MACU,yBAAyB,GAAG,OAAO,KAAqB,KAAiC;AACpG,IAAA,OAAO,SAAS;AAClB;AAEA;;;;AAIG;AACI,MAAM,wBAAwB,GAAG,OACtC,IAA8D,EAC9D,OAAe,EACf,IAAsB,KACI;AAC1B,IAAA,IAAI;QACF,OAAO,MAAM,IAAI,EAAE;IACrB;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,IAAI,EAAE,KAAK,YAAYA,4BAAmB,CAAC;AAAE,YAAA,MAAM,KAAK;AACxD,QAAA,MAAM,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAA,IAAA,EAAO,OAAO,CAAA,EAAA,EAAK,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;AAC3F,QAAA,MAAM,OAAO,GAA+B;YAC1C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;AAC9B,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;AAC1C,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS;YAClC,OAAO;SACR;AACD,QAAAC,qBAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC;AACjD,QAAA,OAAO,SAAS;IAClB;AACF;;;"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var main_cjs = require('./index-
|
|
4
|
-
var resolveModelForSyncedSeed = require('./resolveModelForSyncedSeed-
|
|
3
|
+
var main_cjs = require('./index-Cvvt0-5B.js');
|
|
4
|
+
var resolveModelForSyncedSeed = require('./resolveModelForSyncedSeed-CNYaLOir.js');
|
|
5
5
|
var lodashEs = require('lodash-es');
|
|
6
6
|
var query = require('@seedprotocol/query');
|
|
7
7
|
var drizzleOrm = require('drizzle-orm');
|
|
8
8
|
var eas$1 = require('@seedprotocol/eas');
|
|
9
9
|
var pluralize = require('pluralize');
|
|
10
|
-
var eas = require('./eas-
|
|
10
|
+
var eas = require('./eas-CUYXdr2t.js');
|
|
11
11
|
require('immer');
|
|
12
12
|
require('reflect-metadata');
|
|
13
13
|
require('xstate');
|
|
@@ -39,7 +39,7 @@ require('@seedprotocol/eas/node');
|
|
|
39
39
|
const schemaStringToModelRecord = new Map();
|
|
40
40
|
const getModelSchemas = async () => {
|
|
41
41
|
// Dynamic import to break circular dependency
|
|
42
|
-
const modelMod = await Promise.resolve().then(function () { return require('./index-
|
|
42
|
+
const modelMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
|
|
43
43
|
const { Model } = modelMod;
|
|
44
44
|
const allModels = await Model.all();
|
|
45
45
|
const modelRecords = [];
|
|
@@ -603,7 +603,7 @@ const resolveSyncedSeedModel = async (Model, modelType, seed) => {
|
|
|
603
603
|
const insertSyncedProperties = async ({ newProperties, itemSeeds, state, }) => {
|
|
604
604
|
const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state;
|
|
605
605
|
// Dynamic import to break circular dependency
|
|
606
|
-
const modelMod = await Promise.resolve().then(function () { return require('./index-
|
|
606
|
+
const modelMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Model$1; });
|
|
607
607
|
const { Model } = modelMod;
|
|
608
608
|
// Loads every model into Model's cache, where resolveSyncedSeedModel looks them up.
|
|
609
609
|
await Model.all();
|
|
@@ -799,6 +799,19 @@ const getRelatedSeedsAndVersions = async (state) => {
|
|
|
799
799
|
*/
|
|
800
800
|
const runSyncFromEas = async (options) => {
|
|
801
801
|
let addresses = options?.addresses ?? (await main_cjs.getAllAddressesFromDb());
|
|
802
|
+
const additionalGetter = main_cjs.getGetAdditionalSyncAddresses();
|
|
803
|
+
if (additionalGetter) {
|
|
804
|
+
const additional = await additionalGetter();
|
|
805
|
+
if (additional?.length) {
|
|
806
|
+
const seen = new Set(addresses.map((a) => a.toLowerCase()));
|
|
807
|
+
for (const addr of additional) {
|
|
808
|
+
if (addr && !seen.has(addr.toLowerCase())) {
|
|
809
|
+
seen.add(addr.toLowerCase());
|
|
810
|
+
addresses = [...addresses, addr];
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
}
|
|
802
815
|
if (!addresses || addresses.length === 0) {
|
|
803
816
|
return;
|
|
804
817
|
}
|
|
@@ -857,7 +870,7 @@ const runSyncFromEas = async (options) => {
|
|
|
857
870
|
await getRelatedSeedsAndVersions(state);
|
|
858
871
|
main_cjs.scheduleBulkFilesDownloadFromEasSync(addresses);
|
|
859
872
|
try {
|
|
860
|
-
const itemMod = await Promise.resolve().then(function () { return require('./index-
|
|
873
|
+
const itemMod = await Promise.resolve().then(function () { return require('./index-Cvvt0-5B.js'); }).then(function (n) { return n.Item$1; });
|
|
861
874
|
await itemMod.Item.rehydrateCachedItemsFromDbAfterEasSync();
|
|
862
875
|
}
|
|
863
876
|
catch (err) {
|
|
@@ -870,4 +883,4 @@ const runSyncFromEas = async (options) => {
|
|
|
870
883
|
exports.VERSION_INSERT_BATCH = VERSION_INSERT_BATCH;
|
|
871
884
|
exports.isSqlEscapedAttestationRaw = isSqlEscapedAttestationRaw;
|
|
872
885
|
exports.runSyncFromEas = runSyncFromEas;
|
|
873
|
-
//# sourceMappingURL=syncDbWithEas-
|
|
886
|
+
//# sourceMappingURL=syncDbWithEas-d1iOdTTI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncDbWithEas-Dk96sAG-.js","sources":["../../../src/db/read/getModelSchemas.ts","../../../src/db/write/createSeeds.ts","../../../src/db/write/updateSeedRevokedAt.ts","../../../src/events/item/syncDbWithEas.ts"],"sourcesContent":["// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> getModelSchemas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { models as modelsTable, modelUids } from '@/seedSchema'\nimport { eq } from 'drizzle-orm'\nimport pluralize from 'pluralize'\nimport { toSnakeCase } from '@/helpers'\n\ntype ModelRecord = {\n id: number\n name: string\n uid: string | null\n tableName?: string\n}\n\nconst schemaStringToModelRecord = new Map<string, ModelRecord>()\n\ntype GetModelSchemasReturn = {\n schemaStringToModelRecord: Map<string, ModelRecord>\n modelRecords: ModelRecord[]\n}\n\ntype GetModelSchemas = () => Promise<GetModelSchemasReturn>\n\nexport const getModelSchemas: GetModelSchemas = async () => {\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n const allModels = await Model.all()\n const modelRecords: ModelRecord[] = []\n\n const appDb = BaseDb.getAppDb()\n\n for (const model of allModels) {\n const modelName = model.modelName\n if (!modelName) continue\n const foundModelQuery = await appDb\n .select({\n id: modelsTable.id,\n name: modelsTable.name,\n uid: modelUids.uid,\n })\n .from(modelsTable)\n .leftJoin(modelUids, eq(modelsTable.id, modelUids.modelId))\n // Model names are only unique per schema: use this model's own row\n .where(model.id ? eq(modelsTable.schemaFileId, model.id) : eq(modelsTable.name, modelName))\n .limit(1)\n\n if (!foundModelQuery[0]) {\n console.error(\n `[item/events] [syncDbWithEas] model ${modelName} not found in SDK DB`,\n )\n continue\n }\n\n const foundModel: ModelRecord = {\n id: foundModelQuery[0].id,\n name: foundModelQuery[0].name,\n uid: foundModelQuery[0].uid,\n tableName: pluralize(foundModelQuery[0].name).toLowerCase(),\n }\n\n modelRecords.push(foundModel)\n\n if (modelName === 'Seed') {\n continue\n }\n\n const schemaString = `bytes32 ${toSnakeCase(modelName)}`\n\n schemaStringToModelRecord.set(schemaString, foundModel)\n }\n\n return {\n schemaStringToModelRecord,\n modelRecords,\n }\n}\n","import { seeds, SeedType } from '@/seedSchema'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { normalizePublisher } from '@/helpers/addresses'\nimport { chunkValues, rowsPerInsert } from '@/db/sqlParamBatches'\n\ntype CreateSeeds = (newSeeds: Partial<SeedType>[]) => Promise<void>\n\nexport const createSeeds: CreateSeeds = async (\n newSeeds: Partial<SeedType>[],\n) => {\n const appDb = BaseDb.getAppDb()\n\n const values = newSeeds.map((row) => {\n const publisher = normalizePublisher(row.publisher)\n return {\n ...row,\n ...(publisher ? { publisher } : {}),\n }\n })\n\n // Sync can create thousands of seeds at once: keep each INSERT under SQLite's parameter limit.\n for (const chunk of chunkValues(values, rowsPerInsert(seeds))) {\n await appDb.insert(seeds).values(chunk)\n }\n}\n","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","import { resolveItemModelFileId } from '@/db/read/resolveModelRecord'\nimport { resolveModelForSyncedSeed, skipSeedOnAmbiguousModel } from '@/db/read/resolveModelForSyncedSeed'\nimport { camelCase } from 'lodash-es'\nimport { Attestation, SchemaWhereInput } from '@seedprotocol/eas'\nimport {\n parseEasPropertyMetadata,\n parseEasRelationPropertyName,\n} from '@seedprotocol/query'\nimport {\n metadata,\n MetadataType,\n modelUids,\n seeds,\n SeedType,\n versions,\n VersionsType,\n} from '@/seedSchema'\nimport { and, eq, inArray, isNotNull, isNull, ne, or } from 'drizzle-orm'\nimport {\n generateId,\n} from '@/helpers'\nimport { modelPropertiesToObject } from '@/helpers/model'\nimport { GET_SEEDS } from '@seedprotocol/eas'\nimport {\n getAllAddressesFromDb,\n getItemStoragePropertiesForModel,\n getPropertyIdForModelAndName,\n} from '@/helpers/db'\n// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> syncDbWithEas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { getModelSchemas } from '@/db/read/getModelSchemas'\nimport { ModelSchema } from '@/types'\nimport { createSeeds } from '@/db/write/createSeeds'\nimport { rowsPerInsert, selectInBatches, writeInBatches } from '@/db/sqlParamBatches'\nimport { normalizeHexAddress } from '@/helpers/addresses'\nimport { updateSeedRevokedAt } from '@/db/write/updateSeedRevokedAt'\nimport { setSchemaUidForSchemaDefinition } from '@/stores/eas'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport {\n getItemPropertiesFromEas,\n getItemVersionsFromEas,\n getModelSchemasFromEas,\n getSeedsFromSchemaUids,\n} from '@/eas'\nimport { pickLatestPropertyAttestationsByRefAndSchema } from '@/helpers/easPropertyCanonical'\nimport { getGetAdditionalSyncAddresses } from '@/helpers/publishConfig'\nimport { scheduleBulkFilesDownloadFromEasSync } from '@/events/files/download'\nimport { assertLocalDbChain, waitForEasReadChain } from '@/helpers/localDbChain'\nimport { EAS_SEED_DATA_SYNCED_TO_DB_EVENT } from '@/helpers/constants'\nimport { emitAcrossTabs } from '@/helpers/tabEvents'\n\n/**\n * Sync stores the newest non-revoked attestation per (version, property schema). When every\n * attestation of a property is revoked (e.g. after `item.unpublish()`), keep the newest one so a\n * revoked item synced to a new device still has its last values next to its seed's `revokedAt`.\n */\nconst SYNC_CANONICAL_OPTIONS = { ifAllRevoked: 'newestRevoked' } as const\n\n/**\n * When an attestation was revoked, in Unix seconds: EAS `revocationTime` is a block timestamp in\n * seconds, the same unit local unpublish writes to `seeds.revoked_at`. `undefined` when not revoked.\n * A revoked attestation without a revocation time (0 or not selected) falls back to now.\n */\nconst revokedAtSeconds = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n): number | undefined => {\n if (!attestation.revoked) return undefined\n return attestation.revocationTime != null && attestation.revocationTime > 0\n ? attestation.revocationTime\n : Math.floor(Date.now() / 1000)\n}\n\n/**\n * `revoked_at` to store for an attestation that already has a row (seed, version or metadata), given the\n * stored value. EAS's `revocationTime` wins once EAS reports one. A stored stamp is otherwise kept:\n * local unpublish writes one only after its revoke transactions are mined, and revocation can't be\n * undone, so EAS reporting the attestation as live then just means its index hasn't caught up yet.\n */\nconst syncedRevokedAt = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n stored: number | null | undefined,\n): number | null => {\n if (attestation.revoked && attestation.revocationTime != null && attestation.revocationTime > 0) {\n return attestation.revocationTime\n }\n return stored ?? revokedAtSeconds(attestation) ?? null\n}\n\nconst relationValuesToExclude = [\n '0x0000000000000000000000000000000000000000000000000000000000000020',\n]\n\n\n/**\n * Lookups one `runSyncFromEas` run builds up as it stores seeds and versions, and the relation\n * targets its properties point at. Created per run and passed down, so a run never sees another\n * run's seeds or re-fetches its related seeds, even when runs overlap.\n */\ntype SyncRunState = {\n seedUidToLocalId: Map<string, string>\n seedUidToModelType: Map<string, string>\n versionUidToLocalId: Map<string, string>\n versionUidToSeedUid: Map<string, string>\n relatedSeedUids: Set<string>\n}\n\nconst createSyncRunState = (): SyncRunState => ({\n seedUidToLocalId: new Map(),\n seedUidToModelType: new Map(),\n versionUidToLocalId: new Map(),\n versionUidToSeedUid: new Map(),\n relatedSeedUids: new Set(),\n})\n\nconst isRelationPropertyName = (propertyNameSnake: string): boolean =>\n (propertyNameSnake.endsWith('_id') || propertyNameSnake.endsWith('_ids')) &&\n propertyNameSnake !== 'storage_transaction_id' &&\n propertyNameSnake !== 'storage_provider_transaction_id'\n\n/**\n * Seed UIDs that relation properties point at. Collected from every property the run fetched, not\n * only newly stored ones, so related seeds are refreshed (new versions, revocations) on each sync.\n */\nconst collectRelatedSeedUids = (properties: Attestation[], into: Set<string>): void => {\n for (const property of properties) {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) continue\n const { name, value } = parsed.metadata\n if (!name || !isRelationPropertyName(name)) continue\n const values = Array.isArray(value) ? value : [value]\n for (const v of values) {\n if (typeof v === 'string' && v && !relationValuesToExclude.includes(v)) into.add(v)\n }\n }\n}\n\n/**\n * Earlier syncs SQL-escaped a seed's attestation JSON (`'` -> `''`) and then bound it as a\n * parameter, so stored `seeds.attestation_raw` had every quote doubled. Doubled JSON still parses,\n * so a legacy row is recognized by comparing with the attestation EAS returns now: it is legacy\n * when it equals that attestation with quotes doubled, ignoring the revocation fields (EAS may have\n * revoked it since). A row whose data legitimately contains `''` equals the fresh JSON itself and is\n * left alone.\n */\nexport const isSqlEscapedAttestationRaw = (stored: string, fresh: Attestation): boolean => {\n if (!stored.includes(\"''\")) return false\n const freshJson = JSON.stringify(fresh)\n if (stored === freshJson || !freshJson.includes(\"'\")) return false\n let parsed: unknown\n try {\n parsed = JSON.parse(stored)\n } catch {\n return false\n }\n if (!parsed || typeof parsed !== 'object') return false\n const stored_ = parsed as Record<string, unknown>\n const withStoredRevocation = {\n ...fresh,\n ...('revoked' in stored_ && { revoked: stored_.revoked }),\n ...('revocationTime' in stored_ && { revocationTime: stored_.revocationTime }),\n }\n return stored === JSON.stringify(withStoredRevocation).replace(/'/g, \"''\")\n}\n\ntype SaveEasSeedsToDbProps = {\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasSeedsToDbReturn = {\n /** UIDs of every seed passed in (already stored or newly inserted). */\n seedUids: string[]\n}\n\ntype SaveEasSeedsToDb = (\n props: SaveEasSeedsToDbProps,\n) => Promise<SaveEasSeedsToDbReturn>\n\nconst saveEasSeedsToDb: SaveEasSeedsToDb = async ({ itemSeeds, state }) => {\n const { seedUidToLocalId, seedUidToModelType } = state\n const appDb = BaseDb.getAppDb()\n\n const seedUids = itemSeeds.map((seed) => seed.id)\n\n const existingSeedRecordsRows: SeedType[] = await selectInBatches(seedUids, (chunk) =>\n appDb.select().from(seeds).where(inArray(seeds.uid, chunk)),\n )\n\n const existingSeedUids = new Set<string>()\n\n if (existingSeedRecordsRows && existingSeedRecordsRows.length > 0) {\n for (const row of existingSeedRecordsRows) {\n if (row.uid) {\n existingSeedUids.add(row.uid)\n if (row.localId) {\n seedUidToLocalId.set(row.uid, row.localId)\n }\n if (row.type) {\n seedUidToModelType.set(row.uid, row.type)\n }\n }\n }\n }\n\n const newSeeds = itemSeeds.filter((seed) => !existingSeedUids.has(seed.id))\n\n // Update existing seeds when attestations are revoked on EAS, and replace a local unpublish stamp\n // with EAS's revocationTime once EAS reports one (see `syncedRevokedAt`).\n const seedByUid = new Map(itemSeeds.map((s) => [s.id, s]))\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.localId) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation) continue\n const revokedAt = syncedRevokedAt(attestation, row.revokedAt)\n if (revokedAt == null || revokedAt === row.revokedAt) continue\n await updateSeedRevokedAt({ seedLocalId: row.localId, revokedAt })\n }\n\n // Repair seed rows an earlier sync stored with SQL-escaped (doubled) quotes.\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.attestationRaw) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation || !isSqlEscapedAttestationRaw(row.attestationRaw, attestation)) continue\n await appDb\n .update(seeds)\n .set({ attestationRaw: JSON.stringify(attestation) })\n .where(eq(seeds.uid, row.uid))\n }\n\n if (newSeeds.length === 0) {\n return { seedUids }\n }\n\n const newSeedsData: Partial<SeedType>[] = []\n\n for (let i = 0; i < newSeeds.length; i++) {\n const seed = newSeeds[i]\n seedUidToModelType.set(seed.id, seed.schema.schemaNames[0].name)\n const seedLocalId = generateId()\n seedUidToLocalId.set(seed.id, seedLocalId)\n\n // createSeeds binds parameters: store the JSON as is.\n const attestationRaw = JSON.stringify(seed)\n const revokedAt = revokedAtSeconds(seed)\n\n // EAS only knows the model by name; the seam may match it to a local model (not built yet).\n const modelFileId = await resolveModelForSyncedSeed({\n seedUid: seed.id,\n seedLocalId,\n modelType: seed.schema.schemaNames[0].name,\n schemaUid: seed.schemaId,\n })\n\n newSeedsData.push({\n localId: seedLocalId,\n uid: seed.id,\n schemaUid: seed.schemaId,\n type: seed.schema.schemaNames[0].name,\n ...(modelFileId && { modelFileId }),\n publisher: seed.attester ? normalizeHexAddress(seed.attester) : seed.attester,\n createdAt: Date.now(),\n attestationCreatedAt: seed.timeCreated * 1000,\n attestationRaw,\n ...(revokedAt !== undefined && { revokedAt }),\n })\n }\n\n await createSeeds(newSeedsData)\n\n // All fetched seeds, not only the new ones: existing seeds can have new versions on EAS.\n return { seedUids }\n}\n\ntype SaveEasVersionsToDbParams = {\n itemVersions: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasVersionsToDb = (\n props: SaveEasVersionsToDbParams,\n) => Promise<SaveEasVersionsToDbReturn>\n\ntype SaveEasVersionsToDbReturn = {\n versionUids: string[]\n}\n\n/**\n * Rows per versions INSERT. A row binds at most one parameter per `versions` column (12 today, 10\n * set by sync), so a batch binds at most 600: under SQLite's old default limit of 999 host\n * parameters (sqlite-wasm and libsql allow more). saveEasVersionsBatches.test.ts checks this.\n */\nexport const VERSION_INSERT_BATCH = 50\n\nconst saveEasVersionsToDb: SaveEasVersionsToDb = async ({ itemVersions, state }) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n const versionUids = itemVersions.map((version) => version.id)\n\n const appDb = BaseDb.getAppDb()\n\n const existingVersionRecordsRows: VersionsType[] = await selectInBatches(versionUids, (chunk) =>\n appDb.select().from(versions).where(inArray(versions.uid, chunk)),\n )\n\n const existingVersionUids = new Set<string>()\n const versionByUid = new Map(itemVersions.map((version) => [version.id, version]))\n\n if (existingVersionRecordsRows && existingVersionRecordsRows.length > 0) {\n for (const row of existingVersionRecordsRows) {\n if (row.uid) {\n existingVersionUids.add(row.uid)\n if (row.localId) {\n versionUidToLocalId.set(row.uid, row.localId)\n }\n if (row.seedUid) {\n versionUidToSeedUid.set(row.uid, row.seedUid)\n }\n // Already-stored versions pick up revocations (and EAS's revocation time) too.\n const attestation = versionByUid.get(row.uid)\n const revokedAt = attestation ? syncedRevokedAt(attestation, row.revokedAt) : null\n if (attestation && revokedAt !== (row.revokedAt ?? null)) {\n await appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(versions.uid, row.uid))\n }\n }\n }\n }\n\n const newVersions = itemVersions.filter(\n (version) => !existingVersionUids.has(version.id),\n )\n\n const rows: (typeof versions.$inferInsert)[] = []\n const storedVersionUids = new Set(existingVersionUids)\n for (const version of newVersions) {\n const seedUid = version.refUID\n const seedLocalId = seedUidToLocalId.get(seedUid)\n if (!seedLocalId) {\n // Storing it anyway would orphan the version (and its properties) from any local seed.\n console.warn(\n '[item/events] [syncDbWithEas] skipping version whose seed has no local id: ',\n version.id,\n seedUid,\n )\n continue\n }\n const versionLocalId = generateId()\n versionUidToSeedUid.set(version.id, seedUid)\n versionUidToLocalId.set(version.id, versionLocalId)\n storedVersionUids.add(version.id)\n rows.push({\n localId: versionLocalId,\n uid: version.id,\n seedUid,\n seedLocalId,\n seedType: seedUidToModelType.get(seedUid) ?? null,\n createdAt: Date.now(),\n attestationCreatedAt: version.timeCreated * 1000,\n attestationRaw: JSON.stringify(version),\n publisher: version.attester ? normalizeHexAddress(version.attester) : '',\n revokedAt: revokedAtSeconds(version) ?? null,\n })\n }\n\n // Bound parameters: keep each statement well under SQLite's host-parameter limit.\n for (let i = 0; i < rows.length; i += VERSION_INSERT_BATCH) {\n await appDb.insert(versions).values(rows.slice(i, i + VERSION_INSERT_BATCH))\n }\n\n // Only versions that are stored locally: properties of a skipped version would have no version row.\n return { versionUids: versionUids.filter((uid) => storedVersionUids.has(uid)) }\n}\n\nconst createMetadataRecordsForStorageTransactionId = async (\n storageTransactionIdProperty: Attestation,\n modelSchema: ModelSchema | undefined,\n state: SyncRunState,\n) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(\n storageTransactionIdProperty.decodedDataJson,\n )\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n }\n return\n }\n\n const attestationData = parsed.metadata\n const propertyName = camelCase(attestationData.name)\n const propertyValue =\n typeof attestationData.value === 'string'\n ? attestationData.value\n : JSON.stringify(attestationData.value)\n\n const seedUid = versionUidToSeedUid.get(storageTransactionIdProperty.refUID) as string\n const seedLocalId = seedUidToLocalId.get(seedUid)\n const versionUid = storageTransactionIdProperty.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const modelType = seedUidToModelType.get(seedUid)\n\n // Storage settings come from the `properties` table. The model's property instances (modelSchema)\n // are only a fallback: whether they have loaded, and with storage settings, depends on timing.\n const itemStorageProperties = new Map<\n string,\n { id?: number; localStorageDir?: string | null; filenameSuffix?: string | null }\n >()\n if (modelType != null) {\n const stored =\n (await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getItemStoragePropertiesForModel(modelType, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? []\n for (const property of stored) itemStorageProperties.set(property.name, property)\n }\n if (itemStorageProperties.size === 0 && modelSchema) {\n for (const [_propertyName, propertyDef] of Object.entries(modelSchema)) {\n if (propertyDef?.storageType === 'ItemStorage') {\n itemStorageProperties.set(_propertyName, {\n localStorageDir: propertyDef.localStorageDir,\n filenameSuffix: propertyDef.filenameSuffix,\n })\n }\n }\n }\n\n if (itemStorageProperties.size === 0) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n for (const [_propertyName, propertyDef] of itemStorageProperties.entries()) {\n const existingMetadataRecordRows = await appDb\n .select({ localId: metadata.localId })\n .from(metadata)\n .where(\n and(\n isNotNull(metadata.derivedFromUid),\n eq(metadata.propertyName, _propertyName),\n eq(metadata.propertyValue, propertyValue),\n eq(metadata.versionUid, storageTransactionIdProperty.refUID),\n ),\n )\n\n // Already derived from another attestation carrying this transaction id: syncDerivedStorageRows\n // points that row at the canonical attestation.\n if (existingMetadataRecordRows && existingMetadataRecordRows.length > 0) {\n continue\n }\n\n const propertyId =\n propertyDef.id ??\n (modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getPropertyIdForModelAndName(modelType, _propertyName, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null)\n\n const propertyLocalId = generateId()\n await appDb.insert(metadata).values({\n localId: propertyLocalId,\n propertyId: propertyId ?? undefined,\n propertyName: _propertyName,\n propertyValue,\n localStorageDir: propertyDef.localStorageDir ?? undefined,\n seedLocalId,\n seedUid,\n versionLocalId,\n versionUid,\n refValueType: 'file',\n refResolvedValue: `${propertyValue}${propertyDef.filenameSuffix ?? ''}`,\n modelType: seedUidToModelType.get(seedUid),\n derivedFromUid: storageTransactionIdProperty.id,\n // Ranked like a synced row, at its attestation's time: a local edit made after that\n // publish wins over it, a newer publish wins over an older edit.\n attestationCreatedAt: storageTransactionIdProperty.timeCreated * 1000,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n })\n }\n}\n\ntype SaveEasPropertiesToDbParams = {\n /** Every property attestation fetched for a set of versions, revoked ones included. */\n fetchedProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasPropertiesToDbReturn = {\n propertyUids: string[]\n}\n\ntype SaveEasPropertiesToDb = (\n props: SaveEasPropertiesToDbParams,\n) => Promise<SaveEasPropertiesToDbReturn>\n\n/** Serialize property saves: concurrent `runSyncFromEas` used to hit `isSavingToDb` and return `{}` with no insert. */\nlet saveEasPropertiesDbChain: Promise<unknown> = Promise.resolve()\n\n/**\n * Make local metadata match EAS for every fetched (version, property schema): exactly one synced\n * row, for the canonical attestation (ADR 0006), with `revoked_at` set when that attestation is\n * revoked (which, with `SYNC_CANONICAL_OPTIONS`, means all of the property's attestations on that\n * version are).\n *\n * - Canonical attestation not stored yet: insert it. This also covers an older live attestation\n * taking over from a revoked newer one, and a newer attestation superseding the stored one.\n * - Stored row for a fetched attestation that isn't canonical (revoked, or superseded): delete it,\n * so readers, which take the newest row per property, can't pick it.\n * - Stored canonical row: bring `revoked_at` up to date.\n *\n * Rows without an attestation UID (local edits) and rows for attestations EAS didn't return are\n * left alone.\n */\nconst saveEasPropertiesToDbBody = async ({\n fetchedProperties,\n itemSeeds,\n state,\n}: SaveEasPropertiesToDbParams): Promise<SaveEasPropertiesToDbReturn> => {\n const itemProperties = pickLatestPropertyAttestationsByRefAndSchema(\n fetchedProperties,\n SYNC_CANONICAL_OPTIONS,\n )\n const propertyUids = itemProperties.map((property) => property.id)\n\n collectRelatedSeedUids(itemProperties, state.relatedSeedUids)\n\n const appDb = BaseDb.getAppDb()\n\n const storedRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n fetchedProperties.map((property) => property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n\n const canonicalByUid = new Map(itemProperties.map((property) => [property.id, property]))\n const existingPropertyRecordsUids = new Set<string>()\n const staleUids = new Set<string>()\n const revokedAtUpdates = new Map<string, number | null>()\n\n for (const row of storedRows) {\n if (!row.uid) continue\n const canonical = canonicalByUid.get(row.uid)\n if (!canonical) {\n staleUids.add(row.uid)\n continue\n }\n existingPropertyRecordsUids.add(row.uid)\n // Same policy as seeds and versions: a local unpublish stamp stays until EAS reports a\n // revocationTime, even while EAS (its index lagging) still reports the attestation live.\n const revokedAt = syncedRevokedAt(canonical, row.revokedAt)\n if ((row.revokedAt ?? null) !== revokedAt) {\n revokedAtUpdates.set(row.uid, revokedAt)\n }\n }\n\n const newProperties = itemProperties.filter(\n (property) => !existingPropertyRecordsUids.has(property.id),\n )\n\n // Insert before deleting, so a property never goes without a row in between.\n if (newProperties.length > 0) {\n await insertSyncedProperties({ newProperties, itemSeeds, state })\n }\n\n if (staleUids.size > 0) {\n await writeInBatches([...staleUids], (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.uid, chunk)),\n )\n }\n\n for (const [uid, revokedAt] of revokedAtUpdates) {\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(metadata.uid, uid))\n }\n\n await syncDerivedStorageRows({ fetchedProperties, canonicalProperties: itemProperties })\n\n return { propertyUids }\n}\n\n/** The transaction id a `storage_transaction_id` attestation carries; undefined for other properties. */\nconst storageTransactionIdOf = (property: Attestation): string | undefined => {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok || parsed.metadata.name !== 'storage_transaction_id') return undefined\n const { value } = parsed.metadata\n // Same serialization as the derived rows' property_value.\n return typeof value === 'string' ? value : JSON.stringify(value)\n}\n\n/**\n * Make derived ItemStorage rows follow their `storage_transaction_id` attestation the way synced\n * rows follow theirs. Derived rows are identified by `derived_from_uid`, the attestation they were\n * derived from:\n * - A row derived from another fetched attestation with the canonical one's transaction id (on the\n * same version) is pointed at the canonical one; creation makes one row per transaction id.\n * - Rows derived from a fetched attestation that isn't canonical are deleted.\n * - Rows derived from the canonical one take its `revoked_at` once it has one (a stamp is never\n * cleared, see `syncedRevokedAt`).\n * Local drafts (no uid, no `derived_from_uid`) are never touched.\n */\nconst syncDerivedStorageRows = async ({\n fetchedProperties,\n canonicalProperties,\n}: {\n fetchedProperties: Attestation[]\n canonicalProperties: Attestation[]\n}): Promise<void> => {\n const canonical = canonicalProperties\n .map((property) => ({ property, transactionId: storageTransactionIdOf(property) }))\n .filter((c): c is { property: Attestation; transactionId: string } => !!c.transactionId)\n const canonicalUids = new Set(canonicalProperties.map((property) => property.id))\n\n const appDb = BaseDb.getAppDb()\n\n for (const { property, transactionId } of canonical) {\n const sameTransaction = fetchedProperties\n .filter(\n (other) =>\n other.id !== property.id &&\n other.refUID === property.refUID &&\n storageTransactionIdOf(other) === transactionId,\n )\n .map((other) => other.id)\n if (sameTransaction.length === 0) continue\n // A stamp belongs to the attestation it came from; the new source's is applied below.\n await writeInBatches(sameTransaction, (chunk) =>\n appDb\n .update(metadata)\n .set({\n derivedFromUid: property.id,\n revokedAt: null,\n attestationCreatedAt: property.timeCreated * 1000,\n updatedAt: Date.now(),\n })\n .where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n const staleSourceUids = fetchedProperties\n .filter((property) => !canonicalUids.has(property.id) && storageTransactionIdOf(property))\n .map((property) => property.id)\n if (staleSourceUids.length > 0) {\n await writeInBatches(staleSourceUids, (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n if (canonical.length === 0) return\n\n // The canonical rows' revoked_at as just stored (the saves above already applied EAS's state).\n const sourceRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n canonical.map((c) => c.property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n const revokedAtByUid = new Map(sourceRows.map((row) => [row.uid, row.revokedAt ?? null]))\n\n for (const { property } of canonical) {\n const revokedAt = revokedAtByUid.get(property.id) ?? null\n // The source's revoked_at already follows `syncedRevokedAt`. A live source leaves a derived\n // row's stamp alone: like a stamped synced row, it is only replaced by a revocation time.\n if (revokedAt == null) continue\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n eq(metadata.derivedFromUid, property.id),\n or(isNull(metadata.revokedAt), ne(metadata.revokedAt, revokedAt)),\n ),\n )\n }\n}\n\n/**\n * The cached Model of a synced seed: its own model (seeds.model_file_id) when it has one, else by\n * EAS schema name, the snake_case model name (`sync_storage_post` → SyncStoragePost; a\n * `startCase` lookup never matched multi-word names). Throws AmbiguousModelError when several\n * schemas define a model with that name; callers skip the seed (skipSeedOnAmbiguousModel).\n */\nconst resolveSyncedSeedModel = async (\n Model: typeof import('../../Model/Model').Model,\n modelType: string,\n seed: { seedLocalId?: string | null; seedUid?: string | null },\n) => {\n const modelFileId = await resolveItemModelFileId(seed)\n return (modelFileId ? Model.getById(modelFileId) : undefined) ?? Model.findByModelType(modelType)\n}\n\nconst insertSyncedProperties = async ({\n newProperties,\n itemSeeds,\n state,\n}: {\n newProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n // Loads every model into Model's cache, where resolveSyncedSeedModel looks them up.\n await Model.all()\n\n const appDb = BaseDb.getAppDb()\n\n // Bound as parameters, in batches of rowsPerInsert(metadata) rows, so no statement exceeds\n // SQLite's parameter or statement-length limits however many properties a sync stores.\n const rows: (typeof metadata.$inferInsert)[] = []\n\n for (const property of newProperties) {\n const propertyLocalId = generateId()\n \n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for property: ',\n property.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for property: ',\n property.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for property: ',\n property.id,\n )\n }\n continue\n }\n\n const propertyMetadata = parsed.metadata\n\n let propertyNameSnake = propertyMetadata.name\n\n if (!propertyNameSnake) {\n console.warn(\n '[item/events] [syncDbWithEas] no propertyName found for property: ',\n property,\n )\n continue\n }\n\n let isRelation = false\n let refValueType\n let refSeedType\n let refSchemaUid\n let isList = false\n const schemaUid = property.schemaId\n\n setSchemaUidForSchemaDefinition({\n text: propertyNameSnake,\n schemaUid,\n })\n\n if (isRelationPropertyName(propertyNameSnake)) {\n isRelation = true\n\n if (Array.isArray(propertyMetadata.value)) {\n isList = true\n refValueType = 'list'\n\n const result = parseEasRelationPropertyName(propertyNameSnake)\n\n if (result) {\n propertyNameSnake = result.propertyName\n refSeedType = result.modelName\n }\n\n }\n\n if (!isList) {\n if (relationValuesToExclude.includes(propertyMetadata.value as string)) {\n continue\n }\n }\n }\n\n let propertyValue = propertyMetadata.value\n\n if (typeof propertyValue !== 'string') {\n propertyValue = JSON.stringify(propertyValue)\n }\n\n if (isRelation && !isList) {\n const relatedSeed = itemSeeds.find(\n (seed: Attestation) => seed.id === propertyMetadata.value,\n )\n if (relatedSeed && relatedSeed.schema && relatedSeed.schema.schemaNames) {\n refSeedType = relatedSeed.schema.schemaNames[0].name\n refSchemaUid = relatedSeed.schemaId\n }\n }\n\n if (isRelation && isList) {\n const relatedSeeds = itemSeeds.filter((seed: Attestation) =>\n (propertyMetadata.value as string[]).includes(seed.id),\n )\n if (relatedSeeds && relatedSeeds.length > 0) {\n refSeedType = relatedSeeds[0].schema.schemaNames[0].name\n refSchemaUid = relatedSeeds[0].schemaId\n }\n }\n\n const propertyName = camelCase(propertyNameSnake)\n const easDataType = propertyMetadata.type\n const versionUid = property.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const attestationCreatedAt = property.timeCreated * 1000\n const seedUid = versionUidToSeedUid.get(versionUid)\n const seedLocalId = seedUidToLocalId.get(seedUid!)\n const modelType = seedUidToModelType.get(seedUid!)\n\n const model =\n modelType != null\n ? await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n resolveSyncedSeedModel(Model, modelType, { seedLocalId, seedUid }),\n )\n : undefined\n const modelSchema = model?.properties ? modelPropertiesToObject(model.properties) : undefined\n\n if (propertyNameSnake === 'storage_transaction_id') {\n await createMetadataRecordsForStorageTransactionId(property, modelSchema, state)\n }\n\n const propertyId =\n modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n getPropertyIdForModelAndName(modelType, propertyName, {\n // EAS identifies models by name only; a locally-created seed still knows its model.\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null\n rows.push({\n localId: propertyLocalId,\n uid: property.id,\n schemaUid: property.schemaId,\n propertyId,\n propertyName,\n propertyValue,\n easDataType,\n versionUid,\n versionLocalId: versionLocalId ?? null,\n seedUid: seedUid ?? null,\n seedLocalId: seedLocalId ?? null,\n modelType: modelType ?? null,\n refValueType: refValueType || null,\n refSeedType: refSeedType || null,\n refModelUid: refSchemaUid || null,\n createdAt: Date.now(),\n attestationCreatedAt,\n attestationRaw: JSON.stringify(property),\n publisher: property.attester ? normalizeHexAddress(property.attester) : '',\n revokedAt: revokedAtSeconds(property) ?? null,\n })\n }\n\n // No conflict clause, as before: every row has a fresh local_id, and callers pass only\n // attestations with no stored row.\n const batchSize = rowsPerInsert(metadata)\n for (let i = 0; i < rows.length; i += batchSize) {\n await appDb.insert(metadata).values(rows.slice(i, i + batchSize))\n }\n}\n\nconst saveEasPropertiesToDb: SaveEasPropertiesToDb = (params) => {\n const next = saveEasPropertiesDbChain.then(() => saveEasPropertiesToDbBody(params))\n saveEasPropertiesDbChain = next.then(\n () => undefined,\n () => undefined,\n )\n return next\n}\n\n/**\n * Fetch every version of `seedUids` and every property attestation of those versions, and store\n * them. The main sync and the related-seed fetch both go through here, so they treat revocation\n * the same way: revoked attestations are fetched on purpose (`excludeRevoked: false`), revoked\n * seeds record `revokedAt` (in `saveEasSeedsToDb`), and properties go through the canonical pick\n * (newest non-revoked per version and property schema, see ADR 0006).\n */\nconst syncVersionsAndPropertiesForSeeds = async ({\n seedUids,\n itemSeeds,\n state,\n}: {\n seedUids: string[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n if (seedUids.length === 0) return\n\n const itemVersions = await getItemVersionsFromEas({\n seedUids,\n excludeRevoked: false,\n })\n\n const { versionUids } = await saveEasVersionsToDb({\n itemVersions,\n state,\n })\n if (versionUids.length === 0) return\n\n const fetchedProperties = await getItemPropertiesFromEas({\n versionUids,\n excludeRevoked: false,\n })\n\n // The save makes the canonical pick; it also needs the other attestations to clean up after them.\n await saveEasPropertiesToDb({\n fetchedProperties,\n itemSeeds,\n state,\n })\n}\n\n/**\n * Relation targets of synced properties, fetched by id from any attester (one level deep).\n *\n * This deliberately matches the main sync instead of filtering out revoked attestations: a\n * relation to an unpublished seed should still resolve locally, to the seed's last values next to\n * its `revokedAt`, exactly as if that seed had been synced in its own right. Filtering at the query\n * would also break the canonical pick, which needs the revoked attestations to skip them (or to\n * keep the newest one when all are revoked), and would leave `seeds.revoked_at` unset.\n */\nconst getRelatedSeedsAndVersions = async (state: SyncRunState) => {\n // Snapshot: relations found on the related seeds themselves aren't followed (one level deep).\n const uids = Array.from(state.relatedSeedUids)\n if (uids.length === 0) return\n\n const easClient = BaseEasClient.getEasClient()\n\n // No `revoked` filter, like `getSeedsFromSchemaUids({ excludeRevoked: false })` in the main sync.\n const { itemSeeds } = await easClient.request(GET_SEEDS, {\n where: {\n id: {\n in: uids,\n },\n },\n })\n\n const { seedUids } = await saveEasSeedsToDb({ itemSeeds, state })\n\n // Only seeds EAS returned: a version of an unknown seed would be stored without its seed.\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n}\n\nexport type SyncFromEasOptions = {\n /** Override addresses to sync. Default: owned + watched from DB. */\n addresses?: string[]\n}\n\n/**\n * Core sync logic: fetches item attestations from EAS for configured models and given addresses,\n * then saves seeds, versions, and properties to the local DB.\n * Uses owned + watched addresses from DB when addresses are not provided.\n */\nexport const runSyncFromEas = async (options?: SyncFromEasOptions): Promise<void> => {\n let addresses = options?.addresses ?? (await getAllAddressesFromDb())\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (additionalGetter) {\n const additional = await additionalGetter()\n if (additional?.length) {\n const seen = new Set(addresses.map((a) => a.toLowerCase()))\n for (const addr of additional) {\n if (addr && !seen.has(addr.toLowerCase())) {\n seen.add(addr.toLowerCase())\n addresses = [...addresses, addr]\n }\n }\n }\n }\n if (!addresses || addresses.length === 0) {\n return\n }\n\n // Don't read the default chain while publish is about to configure another one.\n await waitForEasReadChain()\n // Never mix attestations from two chains in one local DB.\n await assertLocalDbChain()\n\n const appDb = BaseDb.getAppDb()\n\n const { schemaStringToModelRecord } = await getModelSchemas()\n\n const modelSchemas = await getModelSchemasFromEas()\n\n const schemaUids: string[] = []\n\n for (const modelSchema of modelSchemas) {\n const foundModel = schemaStringToModelRecord.get(modelSchema.schema)\n\n if (!foundModel) {\n // Skip schemas that don't have a corresponding model in the user's config\n // This can happen with \"bytes32 image\" if there's no Image model defined\n console.warn(\n `[item/events] [syncDbWithEas] Model not found for schema ${modelSchema.schema}, skipping`\n )\n continue\n }\n\n try {\n await appDb\n .insert(modelUids)\n .values({\n modelId: foundModel.id,\n uid: modelSchema.id,\n })\n .onConflictDoNothing()\n } catch (err: unknown) {\n // Model may have been deleted by test teardown or another process; skip to avoid unhandled rejection\n const e = err as { code?: string; rawCode?: number; cause?: { code?: string; rawCode?: number } }\n const code = e?.code ?? e?.rawCode ?? e?.cause?.code ?? e?.cause?.rawCode\n if (code === 'SQLITE_CONSTRAINT_FOREIGNKEY' || code === 787) {\n continue\n }\n throw err\n }\n\n schemaUids.push(modelSchema.id)\n }\n\n // If no schemas were found, skip the rest of the sync process\n // This can happen when models exist but don't have schemas registered in EAS yet\n if (schemaUids.length === 0) {\n return\n }\n\n const itemSeeds = await getSeedsFromSchemaUids({\n schemaUids,\n addresses,\n excludeRevoked: false,\n })\n\n const state = createSyncRunState()\n\n const { seedUids } = await saveEasSeedsToDb({\n itemSeeds,\n state,\n })\n\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n\n await getRelatedSeedsAndVersions(state)\n scheduleBulkFilesDownloadFromEasSync(addresses)\n\n try {\n const itemMod = await import('../../Item/Item')\n await itemMod.Item.rehydrateCachedItemsFromDbAfterEasSync()\n } catch (err) {\n console.warn('[item/events] [syncDbWithEas] rehydrateCachedItemsFromDbAfterEasSync:', err)\n }\n // Other tabs reload their cached Items too (docs/MULTI_TAB.md).\n emitAcrossTabs(EAS_SEED_DATA_SYNCED_TO_DB_EVENT)\n}\n\n"],"names":["BaseDb","modelsTable","modelUids","eq","toSnakeCase","normalizePublisher","chunkValues","rowsPerInsert","seeds","writeInBatches","metadata","and","or","inArray","isNull","versions","parseEasPropertyMetadata","selectInBatches","generateId","resolveModelForSyncedSeed","normalizeHexAddress","camelCase","skipSeedOnAmbiguousModel","getItemStoragePropertiesForModel","resolveItemModelFileId","isNotNull","getPropertyIdForModelAndName","pickLatestPropertyAttestationsByRefAndSchema","ne","setSchemaUidForSchemaDefinition","parseEasRelationPropertyName","modelPropertiesToObject","getItemVersionsFromEas","getItemPropertiesFromEas","BaseEasClient","GET_SEEDS","getAllAddressesFromDb","waitForEasReadChain","assertLocalDbChain","getModelSchemasFromEas","getSeedsFromSchemaUids","scheduleBulkFilesDownloadFromEasSync","emitAcrossTabs","EAS_SEED_DATA_SYNCED_TO_DB_EVENT"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"syncDbWithEas-d1iOdTTI.js","sources":["../../../src/db/read/getModelSchemas.ts","../../../src/db/write/createSeeds.ts","../../../src/db/write/updateSeedRevokedAt.ts","../../../src/events/item/syncDbWithEas.ts"],"sourcesContent":["// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> getModelSchemas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { models as modelsTable, modelUids } from '@/seedSchema'\nimport { eq } from 'drizzle-orm'\nimport pluralize from 'pluralize'\nimport { toSnakeCase } from '@/helpers'\n\ntype ModelRecord = {\n id: number\n name: string\n uid: string | null\n tableName?: string\n}\n\nconst schemaStringToModelRecord = new Map<string, ModelRecord>()\n\ntype GetModelSchemasReturn = {\n schemaStringToModelRecord: Map<string, ModelRecord>\n modelRecords: ModelRecord[]\n}\n\ntype GetModelSchemas = () => Promise<GetModelSchemasReturn>\n\nexport const getModelSchemas: GetModelSchemas = async () => {\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n const allModels = await Model.all()\n const modelRecords: ModelRecord[] = []\n\n const appDb = BaseDb.getAppDb()\n\n for (const model of allModels) {\n const modelName = model.modelName\n if (!modelName) continue\n const foundModelQuery = await appDb\n .select({\n id: modelsTable.id,\n name: modelsTable.name,\n uid: modelUids.uid,\n })\n .from(modelsTable)\n .leftJoin(modelUids, eq(modelsTable.id, modelUids.modelId))\n // Model names are only unique per schema: use this model's own row\n .where(model.id ? eq(modelsTable.schemaFileId, model.id) : eq(modelsTable.name, modelName))\n .limit(1)\n\n if (!foundModelQuery[0]) {\n console.error(\n `[item/events] [syncDbWithEas] model ${modelName} not found in SDK DB`,\n )\n continue\n }\n\n const foundModel: ModelRecord = {\n id: foundModelQuery[0].id,\n name: foundModelQuery[0].name,\n uid: foundModelQuery[0].uid,\n tableName: pluralize(foundModelQuery[0].name).toLowerCase(),\n }\n\n modelRecords.push(foundModel)\n\n if (modelName === 'Seed') {\n continue\n }\n\n const schemaString = `bytes32 ${toSnakeCase(modelName)}`\n\n schemaStringToModelRecord.set(schemaString, foundModel)\n }\n\n return {\n schemaStringToModelRecord,\n modelRecords,\n }\n}\n","import { seeds, SeedType } from '@/seedSchema'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { normalizePublisher } from '@/helpers/addresses'\nimport { chunkValues, rowsPerInsert } from '@/db/sqlParamBatches'\n\ntype CreateSeeds = (newSeeds: Partial<SeedType>[]) => Promise<void>\n\nexport const createSeeds: CreateSeeds = async (\n newSeeds: Partial<SeedType>[],\n) => {\n const appDb = BaseDb.getAppDb()\n\n const values = newSeeds.map((row) => {\n const publisher = normalizePublisher(row.publisher)\n return {\n ...row,\n ...(publisher ? { publisher } : {}),\n }\n })\n\n // Sync can create thousands of seeds at once: keep each INSERT under SQLite's parameter limit.\n for (const chunk of chunkValues(values, rowsPerInsert(seeds))) {\n await appDb.insert(seeds).values(chunk)\n }\n}\n","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","import { resolveItemModelFileId } from '@/db/read/resolveModelRecord'\nimport { resolveModelForSyncedSeed, skipSeedOnAmbiguousModel } from '@/db/read/resolveModelForSyncedSeed'\nimport { camelCase } from 'lodash-es'\nimport { Attestation, SchemaWhereInput } from '@seedprotocol/eas'\nimport {\n parseEasPropertyMetadata,\n parseEasRelationPropertyName,\n} from '@seedprotocol/query'\nimport {\n metadata,\n MetadataType,\n modelUids,\n seeds,\n SeedType,\n versions,\n VersionsType,\n} from '@/seedSchema'\nimport { and, eq, inArray, isNotNull, isNull, ne, or } from 'drizzle-orm'\nimport {\n generateId,\n} from '@/helpers'\nimport { modelPropertiesToObject } from '@/helpers/model'\nimport { GET_SEEDS } from '@seedprotocol/eas'\nimport {\n getAllAddressesFromDb,\n getItemStoragePropertiesForModel,\n getPropertyIdForModelAndName,\n} from '@/helpers/db'\n// Dynamic import to break circular dependency: Model -> BaseItem -> ... -> syncDbWithEas -> Model\n// import { Model } from '@/Model/Model'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { getModelSchemas } from '@/db/read/getModelSchemas'\nimport { ModelSchema } from '@/types'\nimport { createSeeds } from '@/db/write/createSeeds'\nimport { rowsPerInsert, selectInBatches, writeInBatches } from '@/db/sqlParamBatches'\nimport { normalizeHexAddress } from '@/helpers/addresses'\nimport { updateSeedRevokedAt } from '@/db/write/updateSeedRevokedAt'\nimport { setSchemaUidForSchemaDefinition } from '@/stores/eas'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport {\n getItemPropertiesFromEas,\n getItemVersionsFromEas,\n getModelSchemasFromEas,\n getSeedsFromSchemaUids,\n} from '@/eas'\nimport { pickLatestPropertyAttestationsByRefAndSchema } from '@/helpers/easPropertyCanonical'\nimport { getGetAdditionalSyncAddresses } from '@/helpers/publishConfig'\nimport { scheduleBulkFilesDownloadFromEasSync } from '@/events/files/download'\nimport { assertLocalDbChain, waitForEasReadChain } from '@/helpers/localDbChain'\nimport { EAS_SEED_DATA_SYNCED_TO_DB_EVENT } from '@/helpers/constants'\nimport { emitAcrossTabs } from '@/helpers/tabEvents'\n\n/**\n * Sync stores the newest non-revoked attestation per (version, property schema). When every\n * attestation of a property is revoked (e.g. after `item.unpublish()`), keep the newest one so a\n * revoked item synced to a new device still has its last values next to its seed's `revokedAt`.\n */\nconst SYNC_CANONICAL_OPTIONS = { ifAllRevoked: 'newestRevoked' } as const\n\n/**\n * When an attestation was revoked, in Unix seconds: EAS `revocationTime` is a block timestamp in\n * seconds, the same unit local unpublish writes to `seeds.revoked_at`. `undefined` when not revoked.\n * A revoked attestation without a revocation time (0 or not selected) falls back to now.\n */\nconst revokedAtSeconds = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n): number | undefined => {\n if (!attestation.revoked) return undefined\n return attestation.revocationTime != null && attestation.revocationTime > 0\n ? attestation.revocationTime\n : Math.floor(Date.now() / 1000)\n}\n\n/**\n * `revoked_at` to store for an attestation that already has a row (seed, version or metadata), given the\n * stored value. EAS's `revocationTime` wins once EAS reports one. A stored stamp is otherwise kept:\n * local unpublish writes one only after its revoke transactions are mined, and revocation can't be\n * undone, so EAS reporting the attestation as live then just means its index hasn't caught up yet.\n */\nconst syncedRevokedAt = (\n attestation: Pick<Attestation, 'revoked'> & { revocationTime?: number | null },\n stored: number | null | undefined,\n): number | null => {\n if (attestation.revoked && attestation.revocationTime != null && attestation.revocationTime > 0) {\n return attestation.revocationTime\n }\n return stored ?? revokedAtSeconds(attestation) ?? null\n}\n\nconst relationValuesToExclude = [\n '0x0000000000000000000000000000000000000000000000000000000000000020',\n]\n\n\n/**\n * Lookups one `runSyncFromEas` run builds up as it stores seeds and versions, and the relation\n * targets its properties point at. Created per run and passed down, so a run never sees another\n * run's seeds or re-fetches its related seeds, even when runs overlap.\n */\ntype SyncRunState = {\n seedUidToLocalId: Map<string, string>\n seedUidToModelType: Map<string, string>\n versionUidToLocalId: Map<string, string>\n versionUidToSeedUid: Map<string, string>\n relatedSeedUids: Set<string>\n}\n\nconst createSyncRunState = (): SyncRunState => ({\n seedUidToLocalId: new Map(),\n seedUidToModelType: new Map(),\n versionUidToLocalId: new Map(),\n versionUidToSeedUid: new Map(),\n relatedSeedUids: new Set(),\n})\n\nconst isRelationPropertyName = (propertyNameSnake: string): boolean =>\n (propertyNameSnake.endsWith('_id') || propertyNameSnake.endsWith('_ids')) &&\n propertyNameSnake !== 'storage_transaction_id' &&\n propertyNameSnake !== 'storage_provider_transaction_id'\n\n/**\n * Seed UIDs that relation properties point at. Collected from every property the run fetched, not\n * only newly stored ones, so related seeds are refreshed (new versions, revocations) on each sync.\n */\nconst collectRelatedSeedUids = (properties: Attestation[], into: Set<string>): void => {\n for (const property of properties) {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) continue\n const { name, value } = parsed.metadata\n if (!name || !isRelationPropertyName(name)) continue\n const values = Array.isArray(value) ? value : [value]\n for (const v of values) {\n if (typeof v === 'string' && v && !relationValuesToExclude.includes(v)) into.add(v)\n }\n }\n}\n\n/**\n * Earlier syncs SQL-escaped a seed's attestation JSON (`'` -> `''`) and then bound it as a\n * parameter, so stored `seeds.attestation_raw` had every quote doubled. Doubled JSON still parses,\n * so a legacy row is recognized by comparing with the attestation EAS returns now: it is legacy\n * when it equals that attestation with quotes doubled, ignoring the revocation fields (EAS may have\n * revoked it since). A row whose data legitimately contains `''` equals the fresh JSON itself and is\n * left alone.\n */\nexport const isSqlEscapedAttestationRaw = (stored: string, fresh: Attestation): boolean => {\n if (!stored.includes(\"''\")) return false\n const freshJson = JSON.stringify(fresh)\n if (stored === freshJson || !freshJson.includes(\"'\")) return false\n let parsed: unknown\n try {\n parsed = JSON.parse(stored)\n } catch {\n return false\n }\n if (!parsed || typeof parsed !== 'object') return false\n const stored_ = parsed as Record<string, unknown>\n const withStoredRevocation = {\n ...fresh,\n ...('revoked' in stored_ && { revoked: stored_.revoked }),\n ...('revocationTime' in stored_ && { revocationTime: stored_.revocationTime }),\n }\n return stored === JSON.stringify(withStoredRevocation).replace(/'/g, \"''\")\n}\n\ntype SaveEasSeedsToDbProps = {\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasSeedsToDbReturn = {\n /** UIDs of every seed passed in (already stored or newly inserted). */\n seedUids: string[]\n}\n\ntype SaveEasSeedsToDb = (\n props: SaveEasSeedsToDbProps,\n) => Promise<SaveEasSeedsToDbReturn>\n\nconst saveEasSeedsToDb: SaveEasSeedsToDb = async ({ itemSeeds, state }) => {\n const { seedUidToLocalId, seedUidToModelType } = state\n const appDb = BaseDb.getAppDb()\n\n const seedUids = itemSeeds.map((seed) => seed.id)\n\n const existingSeedRecordsRows: SeedType[] = await selectInBatches(seedUids, (chunk) =>\n appDb.select().from(seeds).where(inArray(seeds.uid, chunk)),\n )\n\n const existingSeedUids = new Set<string>()\n\n if (existingSeedRecordsRows && existingSeedRecordsRows.length > 0) {\n for (const row of existingSeedRecordsRows) {\n if (row.uid) {\n existingSeedUids.add(row.uid)\n if (row.localId) {\n seedUidToLocalId.set(row.uid, row.localId)\n }\n if (row.type) {\n seedUidToModelType.set(row.uid, row.type)\n }\n }\n }\n }\n\n const newSeeds = itemSeeds.filter((seed) => !existingSeedUids.has(seed.id))\n\n // Update existing seeds when attestations are revoked on EAS, and replace a local unpublish stamp\n // with EAS's revocationTime once EAS reports one (see `syncedRevokedAt`).\n const seedByUid = new Map(itemSeeds.map((s) => [s.id, s]))\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.localId) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation) continue\n const revokedAt = syncedRevokedAt(attestation, row.revokedAt)\n if (revokedAt == null || revokedAt === row.revokedAt) continue\n await updateSeedRevokedAt({ seedLocalId: row.localId, revokedAt })\n }\n\n // Repair seed rows an earlier sync stored with SQL-escaped (doubled) quotes.\n for (const row of existingSeedRecordsRows) {\n if (!row.uid || !row.attestationRaw) continue\n const attestation = seedByUid.get(row.uid)\n if (!attestation || !isSqlEscapedAttestationRaw(row.attestationRaw, attestation)) continue\n await appDb\n .update(seeds)\n .set({ attestationRaw: JSON.stringify(attestation) })\n .where(eq(seeds.uid, row.uid))\n }\n\n if (newSeeds.length === 0) {\n return { seedUids }\n }\n\n const newSeedsData: Partial<SeedType>[] = []\n\n for (let i = 0; i < newSeeds.length; i++) {\n const seed = newSeeds[i]\n seedUidToModelType.set(seed.id, seed.schema.schemaNames[0].name)\n const seedLocalId = generateId()\n seedUidToLocalId.set(seed.id, seedLocalId)\n\n // createSeeds binds parameters: store the JSON as is.\n const attestationRaw = JSON.stringify(seed)\n const revokedAt = revokedAtSeconds(seed)\n\n // EAS only knows the model by name; the seam may match it to a local model (not built yet).\n const modelFileId = await resolveModelForSyncedSeed({\n seedUid: seed.id,\n seedLocalId,\n modelType: seed.schema.schemaNames[0].name,\n schemaUid: seed.schemaId,\n })\n\n newSeedsData.push({\n localId: seedLocalId,\n uid: seed.id,\n schemaUid: seed.schemaId,\n type: seed.schema.schemaNames[0].name,\n ...(modelFileId && { modelFileId }),\n publisher: seed.attester ? normalizeHexAddress(seed.attester) : seed.attester,\n createdAt: Date.now(),\n attestationCreatedAt: seed.timeCreated * 1000,\n attestationRaw,\n ...(revokedAt !== undefined && { revokedAt }),\n })\n }\n\n await createSeeds(newSeedsData)\n\n // All fetched seeds, not only the new ones: existing seeds can have new versions on EAS.\n return { seedUids }\n}\n\ntype SaveEasVersionsToDbParams = {\n itemVersions: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasVersionsToDb = (\n props: SaveEasVersionsToDbParams,\n) => Promise<SaveEasVersionsToDbReturn>\n\ntype SaveEasVersionsToDbReturn = {\n versionUids: string[]\n}\n\n/**\n * Rows per versions INSERT. A row binds at most one parameter per `versions` column (12 today, 10\n * set by sync), so a batch binds at most 600: under SQLite's old default limit of 999 host\n * parameters (sqlite-wasm and libsql allow more). saveEasVersionsBatches.test.ts checks this.\n */\nexport const VERSION_INSERT_BATCH = 50\n\nconst saveEasVersionsToDb: SaveEasVersionsToDb = async ({ itemVersions, state }) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n const versionUids = itemVersions.map((version) => version.id)\n\n const appDb = BaseDb.getAppDb()\n\n const existingVersionRecordsRows: VersionsType[] = await selectInBatches(versionUids, (chunk) =>\n appDb.select().from(versions).where(inArray(versions.uid, chunk)),\n )\n\n const existingVersionUids = new Set<string>()\n const versionByUid = new Map(itemVersions.map((version) => [version.id, version]))\n\n if (existingVersionRecordsRows && existingVersionRecordsRows.length > 0) {\n for (const row of existingVersionRecordsRows) {\n if (row.uid) {\n existingVersionUids.add(row.uid)\n if (row.localId) {\n versionUidToLocalId.set(row.uid, row.localId)\n }\n if (row.seedUid) {\n versionUidToSeedUid.set(row.uid, row.seedUid)\n }\n // Already-stored versions pick up revocations (and EAS's revocation time) too.\n const attestation = versionByUid.get(row.uid)\n const revokedAt = attestation ? syncedRevokedAt(attestation, row.revokedAt) : null\n if (attestation && revokedAt !== (row.revokedAt ?? null)) {\n await appDb\n .update(versions)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(versions.uid, row.uid))\n }\n }\n }\n }\n\n const newVersions = itemVersions.filter(\n (version) => !existingVersionUids.has(version.id),\n )\n\n const rows: (typeof versions.$inferInsert)[] = []\n const storedVersionUids = new Set(existingVersionUids)\n for (const version of newVersions) {\n const seedUid = version.refUID\n const seedLocalId = seedUidToLocalId.get(seedUid)\n if (!seedLocalId) {\n // Storing it anyway would orphan the version (and its properties) from any local seed.\n console.warn(\n '[item/events] [syncDbWithEas] skipping version whose seed has no local id: ',\n version.id,\n seedUid,\n )\n continue\n }\n const versionLocalId = generateId()\n versionUidToSeedUid.set(version.id, seedUid)\n versionUidToLocalId.set(version.id, versionLocalId)\n storedVersionUids.add(version.id)\n rows.push({\n localId: versionLocalId,\n uid: version.id,\n seedUid,\n seedLocalId,\n seedType: seedUidToModelType.get(seedUid) ?? null,\n createdAt: Date.now(),\n attestationCreatedAt: version.timeCreated * 1000,\n attestationRaw: JSON.stringify(version),\n publisher: version.attester ? normalizeHexAddress(version.attester) : '',\n revokedAt: revokedAtSeconds(version) ?? null,\n })\n }\n\n // Bound parameters: keep each statement well under SQLite's host-parameter limit.\n for (let i = 0; i < rows.length; i += VERSION_INSERT_BATCH) {\n await appDb.insert(versions).values(rows.slice(i, i + VERSION_INSERT_BATCH))\n }\n\n // Only versions that are stored locally: properties of a skipped version would have no version row.\n return { versionUids: versionUids.filter((uid) => storedVersionUids.has(uid)) }\n}\n\nconst createMetadataRecordsForStorageTransactionId = async (\n storageTransactionIdProperty: Attestation,\n modelSchema: ModelSchema | undefined,\n state: SyncRunState,\n) => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(\n storageTransactionIdProperty.decodedDataJson,\n )\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for storageTransactionIdProperty: ',\n storageTransactionIdProperty.id,\n )\n }\n return\n }\n\n const attestationData = parsed.metadata\n const propertyName = camelCase(attestationData.name)\n const propertyValue =\n typeof attestationData.value === 'string'\n ? attestationData.value\n : JSON.stringify(attestationData.value)\n\n const seedUid = versionUidToSeedUid.get(storageTransactionIdProperty.refUID) as string\n const seedLocalId = seedUidToLocalId.get(seedUid)\n const versionUid = storageTransactionIdProperty.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const modelType = seedUidToModelType.get(seedUid)\n\n // Storage settings come from the `properties` table. The model's property instances (modelSchema)\n // are only a fallback: whether they have loaded, and with storage settings, depends on timing.\n const itemStorageProperties = new Map<\n string,\n { id?: number; localStorageDir?: string | null; filenameSuffix?: string | null }\n >()\n if (modelType != null) {\n const stored =\n (await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getItemStoragePropertiesForModel(modelType, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? []\n for (const property of stored) itemStorageProperties.set(property.name, property)\n }\n if (itemStorageProperties.size === 0 && modelSchema) {\n for (const [_propertyName, propertyDef] of Object.entries(modelSchema)) {\n if (propertyDef?.storageType === 'ItemStorage') {\n itemStorageProperties.set(_propertyName, {\n localStorageDir: propertyDef.localStorageDir,\n filenameSuffix: propertyDef.filenameSuffix,\n })\n }\n }\n }\n\n if (itemStorageProperties.size === 0) {\n return\n }\n\n const appDb = BaseDb.getAppDb()\n\n for (const [_propertyName, propertyDef] of itemStorageProperties.entries()) {\n const existingMetadataRecordRows = await appDb\n .select({ localId: metadata.localId })\n .from(metadata)\n .where(\n and(\n isNotNull(metadata.derivedFromUid),\n eq(metadata.propertyName, _propertyName),\n eq(metadata.propertyValue, propertyValue),\n eq(metadata.versionUid, storageTransactionIdProperty.refUID),\n ),\n )\n\n // Already derived from another attestation carrying this transaction id: syncDerivedStorageRows\n // points that row at the canonical attestation.\n if (existingMetadataRecordRows && existingMetadataRecordRows.length > 0) {\n continue\n }\n\n const propertyId =\n propertyDef.id ??\n (modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.storageTransactionId', async () =>\n getPropertyIdForModelAndName(modelType, _propertyName, {\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null)\n\n const propertyLocalId = generateId()\n await appDb.insert(metadata).values({\n localId: propertyLocalId,\n propertyId: propertyId ?? undefined,\n propertyName: _propertyName,\n propertyValue,\n localStorageDir: propertyDef.localStorageDir ?? undefined,\n seedLocalId,\n seedUid,\n versionLocalId,\n versionUid,\n refValueType: 'file',\n refResolvedValue: `${propertyValue}${propertyDef.filenameSuffix ?? ''}`,\n modelType: seedUidToModelType.get(seedUid),\n derivedFromUid: storageTransactionIdProperty.id,\n // Ranked like a synced row, at its attestation's time: a local edit made after that\n // publish wins over it, a newer publish wins over an older edit.\n attestationCreatedAt: storageTransactionIdProperty.timeCreated * 1000,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n })\n }\n}\n\ntype SaveEasPropertiesToDbParams = {\n /** Every property attestation fetched for a set of versions, revoked ones included. */\n fetchedProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}\n\ntype SaveEasPropertiesToDbReturn = {\n propertyUids: string[]\n}\n\ntype SaveEasPropertiesToDb = (\n props: SaveEasPropertiesToDbParams,\n) => Promise<SaveEasPropertiesToDbReturn>\n\n/** Serialize property saves: concurrent `runSyncFromEas` used to hit `isSavingToDb` and return `{}` with no insert. */\nlet saveEasPropertiesDbChain: Promise<unknown> = Promise.resolve()\n\n/**\n * Make local metadata match EAS for every fetched (version, property schema): exactly one synced\n * row, for the canonical attestation (ADR 0006), with `revoked_at` set when that attestation is\n * revoked (which, with `SYNC_CANONICAL_OPTIONS`, means all of the property's attestations on that\n * version are).\n *\n * - Canonical attestation not stored yet: insert it. This also covers an older live attestation\n * taking over from a revoked newer one, and a newer attestation superseding the stored one.\n * - Stored row for a fetched attestation that isn't canonical (revoked, or superseded): delete it,\n * so readers, which take the newest row per property, can't pick it.\n * - Stored canonical row: bring `revoked_at` up to date.\n *\n * Rows without an attestation UID (local edits) and rows for attestations EAS didn't return are\n * left alone.\n */\nconst saveEasPropertiesToDbBody = async ({\n fetchedProperties,\n itemSeeds,\n state,\n}: SaveEasPropertiesToDbParams): Promise<SaveEasPropertiesToDbReturn> => {\n const itemProperties = pickLatestPropertyAttestationsByRefAndSchema(\n fetchedProperties,\n SYNC_CANONICAL_OPTIONS,\n )\n const propertyUids = itemProperties.map((property) => property.id)\n\n collectRelatedSeedUids(itemProperties, state.relatedSeedUids)\n\n const appDb = BaseDb.getAppDb()\n\n const storedRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n fetchedProperties.map((property) => property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n\n const canonicalByUid = new Map(itemProperties.map((property) => [property.id, property]))\n const existingPropertyRecordsUids = new Set<string>()\n const staleUids = new Set<string>()\n const revokedAtUpdates = new Map<string, number | null>()\n\n for (const row of storedRows) {\n if (!row.uid) continue\n const canonical = canonicalByUid.get(row.uid)\n if (!canonical) {\n staleUids.add(row.uid)\n continue\n }\n existingPropertyRecordsUids.add(row.uid)\n // Same policy as seeds and versions: a local unpublish stamp stays until EAS reports a\n // revocationTime, even while EAS (its index lagging) still reports the attestation live.\n const revokedAt = syncedRevokedAt(canonical, row.revokedAt)\n if ((row.revokedAt ?? null) !== revokedAt) {\n revokedAtUpdates.set(row.uid, revokedAt)\n }\n }\n\n const newProperties = itemProperties.filter(\n (property) => !existingPropertyRecordsUids.has(property.id),\n )\n\n // Insert before deleting, so a property never goes without a row in between.\n if (newProperties.length > 0) {\n await insertSyncedProperties({ newProperties, itemSeeds, state })\n }\n\n if (staleUids.size > 0) {\n await writeInBatches([...staleUids], (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.uid, chunk)),\n )\n }\n\n for (const [uid, revokedAt] of revokedAtUpdates) {\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(eq(metadata.uid, uid))\n }\n\n await syncDerivedStorageRows({ fetchedProperties, canonicalProperties: itemProperties })\n\n return { propertyUids }\n}\n\n/** The transaction id a `storage_transaction_id` attestation carries; undefined for other properties. */\nconst storageTransactionIdOf = (property: Attestation): string | undefined => {\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok || parsed.metadata.name !== 'storage_transaction_id') return undefined\n const { value } = parsed.metadata\n // Same serialization as the derived rows' property_value.\n return typeof value === 'string' ? value : JSON.stringify(value)\n}\n\n/**\n * Make derived ItemStorage rows follow their `storage_transaction_id` attestation the way synced\n * rows follow theirs. Derived rows are identified by `derived_from_uid`, the attestation they were\n * derived from:\n * - A row derived from another fetched attestation with the canonical one's transaction id (on the\n * same version) is pointed at the canonical one; creation makes one row per transaction id.\n * - Rows derived from a fetched attestation that isn't canonical are deleted.\n * - Rows derived from the canonical one take its `revoked_at` once it has one (a stamp is never\n * cleared, see `syncedRevokedAt`).\n * Local drafts (no uid, no `derived_from_uid`) are never touched.\n */\nconst syncDerivedStorageRows = async ({\n fetchedProperties,\n canonicalProperties,\n}: {\n fetchedProperties: Attestation[]\n canonicalProperties: Attestation[]\n}): Promise<void> => {\n const canonical = canonicalProperties\n .map((property) => ({ property, transactionId: storageTransactionIdOf(property) }))\n .filter((c): c is { property: Attestation; transactionId: string } => !!c.transactionId)\n const canonicalUids = new Set(canonicalProperties.map((property) => property.id))\n\n const appDb = BaseDb.getAppDb()\n\n for (const { property, transactionId } of canonical) {\n const sameTransaction = fetchedProperties\n .filter(\n (other) =>\n other.id !== property.id &&\n other.refUID === property.refUID &&\n storageTransactionIdOf(other) === transactionId,\n )\n .map((other) => other.id)\n if (sameTransaction.length === 0) continue\n // A stamp belongs to the attestation it came from; the new source's is applied below.\n await writeInBatches(sameTransaction, (chunk) =>\n appDb\n .update(metadata)\n .set({\n derivedFromUid: property.id,\n revokedAt: null,\n attestationCreatedAt: property.timeCreated * 1000,\n updatedAt: Date.now(),\n })\n .where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n const staleSourceUids = fetchedProperties\n .filter((property) => !canonicalUids.has(property.id) && storageTransactionIdOf(property))\n .map((property) => property.id)\n if (staleSourceUids.length > 0) {\n await writeInBatches(staleSourceUids, (chunk) =>\n appDb.delete(metadata).where(inArray(metadata.derivedFromUid, chunk)),\n )\n }\n\n if (canonical.length === 0) return\n\n // The canonical rows' revoked_at as just stored (the saves above already applied EAS's state).\n const sourceRows: Pick<MetadataType, 'uid' | 'revokedAt'>[] = await selectInBatches(\n canonical.map((c) => c.property.id),\n (chunk) =>\n appDb\n .select({ uid: metadata.uid, revokedAt: metadata.revokedAt })\n .from(metadata)\n .where(inArray(metadata.uid, chunk)),\n )\n const revokedAtByUid = new Map(sourceRows.map((row) => [row.uid, row.revokedAt ?? null]))\n\n for (const { property } of canonical) {\n const revokedAt = revokedAtByUid.get(property.id) ?? null\n // The source's revoked_at already follows `syncedRevokedAt`. A live source leaves a derived\n // row's stamp alone: like a stamped synced row, it is only replaced by a revocation time.\n if (revokedAt == null) continue\n await appDb\n .update(metadata)\n .set({ revokedAt, updatedAt: Date.now() })\n .where(\n and(\n eq(metadata.derivedFromUid, property.id),\n or(isNull(metadata.revokedAt), ne(metadata.revokedAt, revokedAt)),\n ),\n )\n }\n}\n\n/**\n * The cached Model of a synced seed: its own model (seeds.model_file_id) when it has one, else by\n * EAS schema name, the snake_case model name (`sync_storage_post` → SyncStoragePost; a\n * `startCase` lookup never matched multi-word names). Throws AmbiguousModelError when several\n * schemas define a model with that name; callers skip the seed (skipSeedOnAmbiguousModel).\n */\nconst resolveSyncedSeedModel = async (\n Model: typeof import('../../Model/Model').Model,\n modelType: string,\n seed: { seedLocalId?: string | null; seedUid?: string | null },\n) => {\n const modelFileId = await resolveItemModelFileId(seed)\n return (modelFileId ? Model.getById(modelFileId) : undefined) ?? Model.findByModelType(modelType)\n}\n\nconst insertSyncedProperties = async ({\n newProperties,\n itemSeeds,\n state,\n}: {\n newProperties: Attestation[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n const { seedUidToLocalId, seedUidToModelType, versionUidToLocalId, versionUidToSeedUid } = state\n\n // Dynamic import to break circular dependency\n const modelMod = await import('../../Model/Model')\n const { Model } = modelMod\n // Loads every model into Model's cache, where resolveSyncedSeedModel looks them up.\n await Model.all()\n\n const appDb = BaseDb.getAppDb()\n\n // Bound as parameters, in batches of rowsPerInsert(metadata) rows, so no statement exceeds\n // SQLite's parameter or statement-length limits however many properties a sync stores.\n const rows: (typeof metadata.$inferInsert)[] = []\n\n for (const property of newProperties) {\n const propertyLocalId = generateId()\n \n // Validate and parse decodedDataJson\n const parsed = parseEasPropertyMetadata(property.decodedDataJson)\n if (!parsed.ok) {\n if (parsed.reason === 'empty') {\n console.warn(\n '[item/events] [syncDbWithEas] empty decodedDataJson for property: ',\n property.id,\n )\n } else if (parsed.reason === 'parse') {\n console.warn(\n '[item/events] [syncDbWithEas] failed to parse decodedDataJson for property: ',\n property.id,\n parsed.error,\n )\n } else {\n console.warn(\n '[item/events] [syncDbWithEas] invalid decodedDataJson structure for property: ',\n property.id,\n )\n }\n continue\n }\n\n const propertyMetadata = parsed.metadata\n\n let propertyNameSnake = propertyMetadata.name\n\n if (!propertyNameSnake) {\n console.warn(\n '[item/events] [syncDbWithEas] no propertyName found for property: ',\n property,\n )\n continue\n }\n\n let isRelation = false\n let refValueType\n let refSeedType\n let refSchemaUid\n let isList = false\n const schemaUid = property.schemaId\n\n setSchemaUidForSchemaDefinition({\n text: propertyNameSnake,\n schemaUid,\n })\n\n if (isRelationPropertyName(propertyNameSnake)) {\n isRelation = true\n\n if (Array.isArray(propertyMetadata.value)) {\n isList = true\n refValueType = 'list'\n\n const result = parseEasRelationPropertyName(propertyNameSnake)\n\n if (result) {\n propertyNameSnake = result.propertyName\n refSeedType = result.modelName\n }\n\n }\n\n if (!isList) {\n if (relationValuesToExclude.includes(propertyMetadata.value as string)) {\n continue\n }\n }\n }\n\n let propertyValue = propertyMetadata.value\n\n if (typeof propertyValue !== 'string') {\n propertyValue = JSON.stringify(propertyValue)\n }\n\n if (isRelation && !isList) {\n const relatedSeed = itemSeeds.find(\n (seed: Attestation) => seed.id === propertyMetadata.value,\n )\n if (relatedSeed && relatedSeed.schema && relatedSeed.schema.schemaNames) {\n refSeedType = relatedSeed.schema.schemaNames[0].name\n refSchemaUid = relatedSeed.schemaId\n }\n }\n\n if (isRelation && isList) {\n const relatedSeeds = itemSeeds.filter((seed: Attestation) =>\n (propertyMetadata.value as string[]).includes(seed.id),\n )\n if (relatedSeeds && relatedSeeds.length > 0) {\n refSeedType = relatedSeeds[0].schema.schemaNames[0].name\n refSchemaUid = relatedSeeds[0].schemaId\n }\n }\n\n const propertyName = camelCase(propertyNameSnake)\n const easDataType = propertyMetadata.type\n const versionUid = property.refUID\n const versionLocalId = versionUidToLocalId.get(versionUid)\n const attestationCreatedAt = property.timeCreated * 1000\n const seedUid = versionUidToSeedUid.get(versionUid)\n const seedLocalId = seedUidToLocalId.get(seedUid!)\n const modelType = seedUidToModelType.get(seedUid!)\n\n const model =\n modelType != null\n ? await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n resolveSyncedSeedModel(Model, modelType, { seedLocalId, seedUid }),\n )\n : undefined\n const modelSchema = model?.properties ? modelPropertiesToObject(model.properties) : undefined\n\n if (propertyNameSnake === 'storage_transaction_id') {\n await createMetadataRecordsForStorageTransactionId(property, modelSchema, state)\n }\n\n const propertyId =\n modelType != null\n ? ((await skipSeedOnAmbiguousModel({ seedLocalId, seedUid }, 'easSync.metadata', async () =>\n getPropertyIdForModelAndName(modelType, propertyName, {\n // EAS identifies models by name only; a locally-created seed still knows its model.\n modelFileId: await resolveItemModelFileId({ seedLocalId, seedUid }),\n }),\n )) ?? null)\n : null\n rows.push({\n localId: propertyLocalId,\n uid: property.id,\n schemaUid: property.schemaId,\n propertyId,\n propertyName,\n propertyValue,\n easDataType,\n versionUid,\n versionLocalId: versionLocalId ?? null,\n seedUid: seedUid ?? null,\n seedLocalId: seedLocalId ?? null,\n modelType: modelType ?? null,\n refValueType: refValueType || null,\n refSeedType: refSeedType || null,\n refModelUid: refSchemaUid || null,\n createdAt: Date.now(),\n attestationCreatedAt,\n attestationRaw: JSON.stringify(property),\n publisher: property.attester ? normalizeHexAddress(property.attester) : '',\n revokedAt: revokedAtSeconds(property) ?? null,\n })\n }\n\n // No conflict clause, as before: every row has a fresh local_id, and callers pass only\n // attestations with no stored row.\n const batchSize = rowsPerInsert(metadata)\n for (let i = 0; i < rows.length; i += batchSize) {\n await appDb.insert(metadata).values(rows.slice(i, i + batchSize))\n }\n}\n\nconst saveEasPropertiesToDb: SaveEasPropertiesToDb = (params) => {\n const next = saveEasPropertiesDbChain.then(() => saveEasPropertiesToDbBody(params))\n saveEasPropertiesDbChain = next.then(\n () => undefined,\n () => undefined,\n )\n return next\n}\n\n/**\n * Fetch every version of `seedUids` and every property attestation of those versions, and store\n * them. The main sync and the related-seed fetch both go through here, so they treat revocation\n * the same way: revoked attestations are fetched on purpose (`excludeRevoked: false`), revoked\n * seeds record `revokedAt` (in `saveEasSeedsToDb`), and properties go through the canonical pick\n * (newest non-revoked per version and property schema, see ADR 0006).\n */\nconst syncVersionsAndPropertiesForSeeds = async ({\n seedUids,\n itemSeeds,\n state,\n}: {\n seedUids: string[]\n itemSeeds: Attestation[]\n state: SyncRunState\n}): Promise<void> => {\n if (seedUids.length === 0) return\n\n const itemVersions = await getItemVersionsFromEas({\n seedUids,\n excludeRevoked: false,\n })\n\n const { versionUids } = await saveEasVersionsToDb({\n itemVersions,\n state,\n })\n if (versionUids.length === 0) return\n\n const fetchedProperties = await getItemPropertiesFromEas({\n versionUids,\n excludeRevoked: false,\n })\n\n // The save makes the canonical pick; it also needs the other attestations to clean up after them.\n await saveEasPropertiesToDb({\n fetchedProperties,\n itemSeeds,\n state,\n })\n}\n\n/**\n * Relation targets of synced properties, fetched by id from any attester (one level deep).\n *\n * This deliberately matches the main sync instead of filtering out revoked attestations: a\n * relation to an unpublished seed should still resolve locally, to the seed's last values next to\n * its `revokedAt`, exactly as if that seed had been synced in its own right. Filtering at the query\n * would also break the canonical pick, which needs the revoked attestations to skip them (or to\n * keep the newest one when all are revoked), and would leave `seeds.revoked_at` unset.\n */\nconst getRelatedSeedsAndVersions = async (state: SyncRunState) => {\n // Snapshot: relations found on the related seeds themselves aren't followed (one level deep).\n const uids = Array.from(state.relatedSeedUids)\n if (uids.length === 0) return\n\n const easClient = BaseEasClient.getEasClient()\n\n // No `revoked` filter, like `getSeedsFromSchemaUids({ excludeRevoked: false })` in the main sync.\n const { itemSeeds } = await easClient.request(GET_SEEDS, {\n where: {\n id: {\n in: uids,\n },\n },\n })\n\n const { seedUids } = await saveEasSeedsToDb({ itemSeeds, state })\n\n // Only seeds EAS returned: a version of an unknown seed would be stored without its seed.\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n}\n\nexport type SyncFromEasOptions = {\n /** Override addresses to sync. Default: owned + watched from DB. */\n addresses?: string[]\n}\n\n/**\n * Core sync logic: fetches item attestations from EAS for configured models and given addresses,\n * then saves seeds, versions, and properties to the local DB.\n * Uses owned + watched addresses from DB when addresses are not provided.\n */\nexport const runSyncFromEas = async (options?: SyncFromEasOptions): Promise<void> => {\n let addresses = options?.addresses ?? (await getAllAddressesFromDb())\n const additionalGetter = getGetAdditionalSyncAddresses()\n if (additionalGetter) {\n const additional = await additionalGetter()\n if (additional?.length) {\n const seen = new Set(addresses.map((a) => a.toLowerCase()))\n for (const addr of additional) {\n if (addr && !seen.has(addr.toLowerCase())) {\n seen.add(addr.toLowerCase())\n addresses = [...addresses, addr]\n }\n }\n }\n }\n if (!addresses || addresses.length === 0) {\n return\n }\n\n // Don't read the default chain while publish is about to configure another one.\n await waitForEasReadChain()\n // Never mix attestations from two chains in one local DB.\n await assertLocalDbChain()\n\n const appDb = BaseDb.getAppDb()\n\n const { schemaStringToModelRecord } = await getModelSchemas()\n\n const modelSchemas = await getModelSchemasFromEas()\n\n const schemaUids: string[] = []\n\n for (const modelSchema of modelSchemas) {\n const foundModel = schemaStringToModelRecord.get(modelSchema.schema)\n\n if (!foundModel) {\n // Skip schemas that don't have a corresponding model in the user's config\n // This can happen with \"bytes32 image\" if there's no Image model defined\n console.warn(\n `[item/events] [syncDbWithEas] Model not found for schema ${modelSchema.schema}, skipping`\n )\n continue\n }\n\n try {\n await appDb\n .insert(modelUids)\n .values({\n modelId: foundModel.id,\n uid: modelSchema.id,\n })\n .onConflictDoNothing()\n } catch (err: unknown) {\n // Model may have been deleted by test teardown or another process; skip to avoid unhandled rejection\n const e = err as { code?: string; rawCode?: number; cause?: { code?: string; rawCode?: number } }\n const code = e?.code ?? e?.rawCode ?? e?.cause?.code ?? e?.cause?.rawCode\n if (code === 'SQLITE_CONSTRAINT_FOREIGNKEY' || code === 787) {\n continue\n }\n throw err\n }\n\n schemaUids.push(modelSchema.id)\n }\n\n // If no schemas were found, skip the rest of the sync process\n // This can happen when models exist but don't have schemas registered in EAS yet\n if (schemaUids.length === 0) {\n return\n }\n\n const itemSeeds = await getSeedsFromSchemaUids({\n schemaUids,\n addresses,\n excludeRevoked: false,\n })\n\n const state = createSyncRunState()\n\n const { seedUids } = await saveEasSeedsToDb({\n itemSeeds,\n state,\n })\n\n await syncVersionsAndPropertiesForSeeds({ seedUids, itemSeeds, state })\n\n await getRelatedSeedsAndVersions(state)\n scheduleBulkFilesDownloadFromEasSync(addresses)\n\n try {\n const itemMod = await import('../../Item/Item')\n await itemMod.Item.rehydrateCachedItemsFromDbAfterEasSync()\n } catch (err) {\n console.warn('[item/events] [syncDbWithEas] rehydrateCachedItemsFromDbAfterEasSync:', err)\n }\n // Other tabs reload their cached Items too (docs/MULTI_TAB.md).\n emitAcrossTabs(EAS_SEED_DATA_SYNCED_TO_DB_EVENT)\n}\n\n"],"names":["BaseDb","modelsTable","modelUids","eq","toSnakeCase","normalizePublisher","chunkValues","rowsPerInsert","seeds","writeInBatches","metadata","and","or","inArray","isNull","versions","parseEasPropertyMetadata","selectInBatches","generateId","resolveModelForSyncedSeed","normalizeHexAddress","camelCase","skipSeedOnAmbiguousModel","getItemStoragePropertiesForModel","resolveItemModelFileId","isNotNull","getPropertyIdForModelAndName","pickLatestPropertyAttestationsByRefAndSchema","ne","setSchemaUidForSchemaDefinition","parseEasRelationPropertyName","modelPropertiesToObject","getItemVersionsFromEas","getItemPropertiesFromEas","BaseEasClient","GET_SEEDS","getAllAddressesFromDb","getGetAdditionalSyncAddresses","waitForEasReadChain","assertLocalDbChain","getModelSchemasFromEas","getSeedsFromSchemaUids","scheduleBulkFilesDownloadFromEasSync","emitAcrossTabs","EAS_SEED_DATA_SYNCED_TO_DB_EVENT"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as BasePathResolver, a as BaseFileManager, B as BaseDb } from './BasePathResolver-
|
|
2
|
-
import './tabEvents-
|
|
1
|
+
import { t as BasePathResolver, a as BaseFileManager, B as BaseDb } from './BasePathResolver-DRT09oVv.js';
|
|
2
|
+
import './tabEvents-C6NXS6Jl.js';
|
|
3
3
|
import { BaseEasClient, BaseQueryClient } from '@seedprotocol/eas';
|
|
4
4
|
import { BaseArweaveClient } from '@seedprotocol/arweave';
|
|
5
5
|
import 'drizzle-orm/sqlite-core';
|
|
@@ -7,7 +7,7 @@ import 'drizzle-orm';
|
|
|
7
7
|
import 'debug';
|
|
8
8
|
import 'xstate';
|
|
9
9
|
import 'pluralize';
|
|
10
|
-
import './db-
|
|
10
|
+
import './db-Lw0KVZmc.js';
|
|
11
11
|
import 'drizzle-orm/casing';
|
|
12
12
|
import 'lodash-es';
|
|
13
13
|
import '@sinclair/typebox';
|
|
@@ -28,4 +28,4 @@ function configurePlatform(services) {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export { configurePlatform };
|
|
31
|
-
//# sourceMappingURL=configurePlatform-
|
|
31
|
+
//# sourceMappingURL=configurePlatform-CZpjyuCo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configurePlatform-
|
|
1
|
+
{"version":3,"file":"configurePlatform-CZpjyuCo.js","sources":["../../src/platform/configurePlatform.ts"],"sourcesContent":["import { BasePathResolver } from '@/helpers/PathResolver/BasePathResolver'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { BaseDb } from '@/db/Db/BaseDb'\nimport { BaseArweaveClient } from '@/helpers'\nimport { BaseEasClient } from '@/helpers/EasClient/BaseEasClient'\nimport { BaseQueryClient } from '@/helpers/QueryClient/BaseQueryClient'\nimport type { PlatformServices } from './types'\n\n/**\n * Wire all platform facades to the given service instances.\n */\nexport function configurePlatform(services: PlatformServices): void {\n BasePathResolver.configure(services.pathResolver)\n BaseFileManager.configure(services.fileManager)\n BaseDb.configure(services.db)\n BaseArweaveClient.configure(services.arweaveClient)\n BaseEasClient.configure(services.easClient)\n BaseQueryClient.configure(services.queryClient)\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAQA;;AAEG;AACG,SAAU,iBAAiB,CAAC,QAA0B,EAAA;AAC1D,IAAA,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AACjD,IAAA,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC/C,IAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC7B,IAAA,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;AACnD,IAAA,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC3C,IAAA,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;AACjD;;"}
|