From 91c24ed8e9d55d70e68cacc5cfd4cf9bcdcd2240 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 14 May 2026 22:52:03 -0400 Subject: [PATCH] core: fix event projector lookup to use versioned type keys Fixes a bug where projectors were stored with Definition object references as Map keys but lookups were failing due to object identity mismatches. Now uses versioned type strings as keys, ensuring events are correctly matched to their projectors during sync processing. This fixes issues where certain events would not be properly projected to the read model, causing stale or missing data in views. --- packages/opencode/src/sync/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/sync/index.ts b/packages/opencode/src/sync/index.ts index 0a143c2ebd..d5bca45b16 100644 --- a/packages/opencode/src/sync/index.ts +++ b/packages/opencode/src/sync/index.ts @@ -214,7 +214,7 @@ export const defaultLayer = layer.pipe(Layer.provide(RuntimeFlags.defaultLayer)) export const use = serviceUse(Service) export const registry = new Map() -let projectors: Map | undefined +let projectors: Map | undefined const versions = new Map() let frozen = false let convertEvent: ConvertEvent @@ -226,7 +226,7 @@ export function reset() { } export function init(input: { projectors: Array<[Definition, ProjectorFunc]>; convertEvent?: ConvertEvent }) { - projectors = new Map(input.projectors) + projectors = new Map(input.projectors.map(([def, func]) => [versionedType(def.type, def.version), func])) for (let entry of EventV2.registry.values()) { if (!entry.version || !entry.aggregate) continue register({ @@ -309,7 +309,7 @@ function process( throw new Error("No projectors available. Call `SyncEvent.init` to install projectors") } - const projector = projectors.get(def) + const projector = projectors.get(versionedType(def.type, def.version)) if (!projector) { if (!def.type.includes("next")) throw new Error(`Projector not found for event: ${def.type}`) return