UNPKG

woltage

Version:

A CQRS and Event-Sourcing Framework

47 lines (46 loc) 1.98 kB
import Projection from "./read/Projection.js"; export default class ProjectionMap { constructor() { this.idMap = new Map(); this.activeProjectionMap = new Map(); } add(projection) { this.idMap.set(projection.id, projection); } setActive(projectionName, projectionVersion, force = false) { const projectionId = Projection.getId(projectionName, projectionVersion); if (!this.idMap.has(projectionId)) throw new Error(`Unknown projection '${projectionName}@${projectionVersion}'`); const projection = this.idMap.get(projectionId); if (!projection.isLiveTracking && !force) throw new Error(`Projection '${projectionName}@${projectionVersion}' is not tracking live events.`); this.activeProjectionMap.set(projectionName, projection); } getActive(projectionName) { return this.activeProjectionMap.get(projectionName); } get(nameOrId, projectionVersion) { const projectionId = typeof projectionVersion !== 'number' ? nameOrId : Projection.getId(nameOrId, projectionVersion); return this.idMap.get(projectionId); } async remove(projectionName, projectionVersion, force = false) { const projection = this.get(projectionName, projectionVersion); if (!projection) return; const isActive = this.getActive(projectionName) === projection; if (!force && isActive) throw new Error(`Can not remove active projection '${projectionName}@${projectionVersion}'.`); await projection.stop(); this.idMap.delete(projection.id); if (isActive) this.activeProjectionMap.delete(projectionName); } async init() { await Promise.all([...this.idMap.values()].map(projection => projection.init())); } async stop() { await Promise.all([...this.idMap.values()].map(projection => projection.stop())); } }