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.
This commit is contained in:
@@ -214,7 +214,7 @@ export const defaultLayer = layer.pipe(Layer.provide(RuntimeFlags.defaultLayer))
|
|||||||
export const use = serviceUse(Service)
|
export const use = serviceUse(Service)
|
||||||
|
|
||||||
export const registry = new Map<string, Definition>()
|
export const registry = new Map<string, Definition>()
|
||||||
let projectors: Map<Definition, ProjectorFunc> | undefined
|
let projectors: Map<string, ProjectorFunc> | undefined
|
||||||
const versions = new Map<string, number>()
|
const versions = new Map<string, number>()
|
||||||
let frozen = false
|
let frozen = false
|
||||||
let convertEvent: ConvertEvent
|
let convertEvent: ConvertEvent
|
||||||
@@ -226,7 +226,7 @@ export function reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function init(input: { projectors: Array<[Definition, ProjectorFunc]>; convertEvent?: ConvertEvent }) {
|
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()) {
|
for (let entry of EventV2.registry.values()) {
|
||||||
if (!entry.version || !entry.aggregate) continue
|
if (!entry.version || !entry.aggregate) continue
|
||||||
register({
|
register({
|
||||||
@@ -309,7 +309,7 @@ function process<Def extends Definition>(
|
|||||||
throw new Error("No projectors available. Call `SyncEvent.init` to install projectors")
|
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 (!projector) {
|
||||||
if (!def.type.includes("next")) throw new Error(`Projector not found for event: ${def.type}`)
|
if (!def.type.includes("next")) throw new Error(`Projector not found for event: ${def.type}`)
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user