woltage
Version:
A CQRS and Event-Sourcing Framework
47 lines (46 loc) • 1.98 kB
JavaScript
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()));
}
}