@robinmalfait/event-source 0.0.11 → 0.0.12

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/index.d.mts CHANGED
@@ -43,18 +43,6 @@ declare function abort<T>(message: string, attributes?: T): void;
43
43
 
44
44
  declare function objectToYaml<T extends Object>(object: T): string;
45
45
 
46
- interface Job {
47
- handle: () => void;
48
- resolve: (value: unknown) => unknown;
49
- reject: (value: unknown) => unknown;
50
- }
51
- declare class Queue {
52
- constructor();
53
- get length(): number;
54
- start(): Promise<void>;
55
- push(handle: Job['handle']): Promise<unknown>;
56
- }
57
-
58
46
  type MaybePromise<T> = T | Promise<T>;
59
47
  interface EventStore {
60
48
  persist(events: EventType[]): MaybePromise<void>;
@@ -74,10 +62,22 @@ type ApplyLazyProjectorEvents<Events extends Lazy<EventType>> = ApplyConcretePro
74
62
  type MaybeLazy<T> = T | Lazy<T>;
75
63
  type ApplyProjectorEvents<Events extends MaybeLazy<EventType> = any> = Events extends Lazy<EventType> ? ApplyLazyProjectorEvents<Events> : Events extends EventType ? ApplyConcreteProjectorEvents<Events> : never;
76
64
  declare abstract class Projector<T extends ApplyProjectorEvents<any> = any> {
65
+ #private;
66
+ /**
67
+ * Name of the projector
68
+ */
77
69
  abstract name: string;
78
- abstract apply?: T;
70
+ /**
71
+ * Map from event name to projection to apply an individual event.
72
+ */
73
+ apply?: T;
74
+ /**
75
+ * Initialize the projector.
76
+ *
77
+ * Executed before loading all existing events to get the projection up to
78
+ * date.
79
+ */
79
80
  initializer?(): void | Promise<void>;
80
- q: Queue;
81
81
  init(es: EventSource): Promise<void>;
82
82
  applyEvent(event: EventType): Promise<void>;
83
83
  project(event: EventType): void | Promise<void>;
package/dist/index.d.ts CHANGED
@@ -43,18 +43,6 @@ declare function abort<T>(message: string, attributes?: T): void;
43
43
 
44
44
  declare function objectToYaml<T extends Object>(object: T): string;
45
45
 
46
- interface Job {
47
- handle: () => void;
48
- resolve: (value: unknown) => unknown;
49
- reject: (value: unknown) => unknown;
50
- }
51
- declare class Queue {
52
- constructor();
53
- get length(): number;
54
- start(): Promise<void>;
55
- push(handle: Job['handle']): Promise<unknown>;
56
- }
57
-
58
46
  type MaybePromise<T> = T | Promise<T>;
59
47
  interface EventStore {
60
48
  persist(events: EventType[]): MaybePromise<void>;
@@ -74,10 +62,22 @@ type ApplyLazyProjectorEvents<Events extends Lazy<EventType>> = ApplyConcretePro
74
62
  type MaybeLazy<T> = T | Lazy<T>;
75
63
  type ApplyProjectorEvents<Events extends MaybeLazy<EventType> = any> = Events extends Lazy<EventType> ? ApplyLazyProjectorEvents<Events> : Events extends EventType ? ApplyConcreteProjectorEvents<Events> : never;
76
64
  declare abstract class Projector<T extends ApplyProjectorEvents<any> = any> {
65
+ #private;
66
+ /**
67
+ * Name of the projector
68
+ */
77
69
  abstract name: string;
78
- abstract apply?: T;
70
+ /**
71
+ * Map from event name to projection to apply an individual event.
72
+ */
73
+ apply?: T;
74
+ /**
75
+ * Initialize the projector.
76
+ *
77
+ * Executed before loading all existing events to get the projection up to
78
+ * date.
79
+ */
79
80
  initializer?(): void | Promise<void>;
80
- q: Queue;
81
81
  init(es: EventSource): Promise<void>;
82
82
  applyEvent(event: EventType): Promise<void>;
83
83
  project(event: EventType): void | Promise<void>;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var O=Object.create;var h=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var F=(r,e)=>{for(var t in e)h(r,t,{get:e[t],enumerable:!0})},z=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of q(e))!R.call(r,o)&&o!==t&&h(r,o,{get:()=>e[o],enumerable:!(n=_(e,o))||n.enumerable});return r};var V=(r,e,t)=>(t=r!=null?O(Q(r)):{},z(e||!r||!r.__esModule?h(t,"default",{value:r,enumerable:!0}):t,r)),Y=r=>z(h({},"__esModule",{value:!0}),r);var G={};F(G,{Aggregate:()=>A,Command:()=>U,Event:()=>W,EventSource:()=>v,Projector:()=>E,abort:()=>i,createEventMapper:()=>M,createTestEventStore:()=>B,objectToYaml:()=>T});module.exports=Y(G);function w(r,e){let t=Object.assign(new Error(r),e);return t.stack,Error.captureStackTrace&&Error.captureStackTrace(t,w),t}function i(r,e){let t=w(r,e);throw Error.captureStackTrace&&Error.captureStackTrace(t,i),t}function j(r){Object.freeze(r);for(let e of Object.getOwnPropertyNames(r))r.hasOwnProperty(e)&&r[e]!==null&&(typeof r[e]=="object"||typeof r[e]=="function")&&!Object.isFrozen(r[e])&&j(r[e]);return r}var J={NODE_ENV:process.env.NODE_ENV},A=class{#e=0;#t=[];replayEvents(e=[]){for(let t of e)this.applyAnEvent(t);return this}applyAnEvent(e){J.NODE_ENV==="test"&&j(e);let t=this.apply[e.eventName];t==null&&(e.eventName.match(/^[$A-Z_][0-9A-Z_$]*$/i)?i(`Aggregate "${this.constructor.name}" has no method:
1
+ "use strict";var O=Object.create;var h=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var F=(r,e)=>{for(var t in e)h(r,t,{get:e[t],enumerable:!0})},z=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Q(e))!q.call(r,o)&&o!==t&&h(r,o,{get:()=>e[o],enumerable:!(n=_(e,o))||n.enumerable});return r};var V=(r,e,t)=>(t=r!=null?O(R(r)):{},z(e||!r||!r.__esModule?h(t,"default",{value:r,enumerable:!0}):t,r)),Y=r=>z(h({},"__esModule",{value:!0}),r);var G={};F(G,{Aggregate:()=>A,Command:()=>U,Event:()=>W,EventSource:()=>v,Projector:()=>E,abort:()=>i,createEventMapper:()=>M,createTestEventStore:()=>B,objectToYaml:()=>T});module.exports=Y(G);function w(r,e){let t=Object.assign(new Error(r),e);return t.stack,Error.captureStackTrace&&Error.captureStackTrace(t,w),t}function i(r,e){let t=w(r,e);throw Error.captureStackTrace&&Error.captureStackTrace(t,i),t}function j(r){Object.freeze(r);for(let e of Object.getOwnPropertyNames(r))r.hasOwnProperty(e)&&r[e]!==null&&(typeof r[e]=="object"||typeof r[e]=="function")&&!Object.isFrozen(r[e])&&j(r[e]);return r}var J={NODE_ENV:process.env.NODE_ENV},A=class{#e=0;#t=[];replayEvents(e=[]){for(let t of e)this.applyAnEvent(t);return this}applyAnEvent(e){J.NODE_ENV==="test"&&j(e);let t=this.apply[e.eventName];t==null&&(e.eventName.match(/^[$A-Z_][0-9A-Z_$]*$/i)?i(`Aggregate "${this.constructor.name}" has no method:
2
2
 
3
3
  apply = {
4
4
  ${e.eventName}(event) {
@@ -17,7 +17,7 @@ apply = {
17
17
  `).map(o=>` ${o}`).join(`
18
18
  `))}finally{this.#e++}return this}recordThat(e){let t={...e,version:this.#e};return this.applyAnEvent(t),this.#t.push(t),this}releaseEvents(){return this.#t.splice(0)}};function U(r,e=null){return{type:r,payload:e}}var L=require("crypto");function W(r,e,t=null){return{aggregateId:e,eventId:(0,L.randomUUID)(),eventName:r,payload:t,recordedAt:new Date,version:-1}}var I=V(require("yamlify-object")),Z={indent:" ",colors:{date:c,error:c,symbol:c,string:c,number:c,boolean:c,null:c,undefined:c}};function c(r){return r}function T(r){return r instanceof Error?T({...r}):(0,I.default)(r,Z).split(`
19
19
  `).slice(1).join(`
20
- `)}var f=new WeakMap;function g(r,e){if(f.has(r)){let t=f.get(r);for(let n in e)t[n]=e[n]}else f.set(r,e)}function x(r){return f.get(r)}var b=class{constructor(){g(this,{jobs:[],state:0})}get length(){return x(this).jobs.length}async start(){let{state:e,jobs:t}=x(this);if(!(e===1||t.length<=0)){for(g(this,{state:1});t.length>0;){let n=t.shift();await Promise.resolve().then(n.handle).then(n.resolve,n.reject)}g(this,{state:0})}}push(e){return new Promise((t,n)=>{let{jobs:o}=x(this);o.push({handle:e,resolve:t,reject:n}),setImmediate(()=>this.start())})}};var E=class{initializer(){}q=new b;async init(e){this.initializer&&await this.q.push(()=>this.initializer?.());let t=await e.loadEvents();await Promise.all(t.map(n=>this.applyEvent(n)))}async applyEvent(e){await this.q.push(()=>this.apply?.[e.eventName]?.(e)),await this.q.push(()=>this.project(e))}project(e){}},v=class r{constructor(e,t,n,o){this.store=e;this.commandHandlers=t;this.projectors=n;this.eventHandlers=o}static builder(e){return new S(e)}static new(e,t,n,o){return new r(e,t,n,o)}async resetProjections(){await Promise.all(this.projectors.map(e=>e.init(this)))}async dispatch(e){return this.commandHandlers.has(e.type)||i(`There is no command handler for the "${e.type}" command`),await this.commandHandlers.get(e.type)(e,this),e}async loadEvents(){return this.store.loadEvents()}async load(e,t){let n=await this.store.load(t);return n.length<=0&&i(`Aggregate(${e.constructor.name}) with ID(${t}) does not exist.`,{aggregate:e.constructor.name,aggregateId:t}),e.replayEvents(n)}async persist(e){let t=e.releaseEvents();await this.store.persist(t);for(let n of t)await Promise.all(this.projectors.map(async o=>{try{await o.applyEvent(n)}catch(s){throw s instanceof Error&&console.error(`An error occurred in one of your projections: ${o.name}, given an event`,s.stack?.split(`
20
+ `)}var f=new WeakMap;function g(r,e){if(f.has(r)){let t=f.get(r);for(let n in e)t[n]=e[n]}else f.set(r,e)}function x(r){return f.get(r)}var b=class{constructor(){g(this,{jobs:[],state:0})}get length(){return x(this).jobs.length}async start(){let{state:e,jobs:t}=x(this);if(!(e===1||t.length<=0)){for(g(this,{state:1});t.length>0;){let n=t.shift();await Promise.resolve().then(n.handle).then(n.resolve,n.reject)}g(this,{state:0})}}push(e){return new Promise((t,n)=>{let{jobs:o}=x(this);o.push({handle:e,resolve:t,reject:n}),setImmediate(()=>this.start())})}};var E=class{apply;initializer(){}#e=new b;async init(e){this.initializer&&await this.#e.push(()=>this.initializer?.());let t=await e.loadEvents();await Promise.all(t.map(n=>this.applyEvent(n)))}async applyEvent(e){await this.#e.push(()=>this.apply?.[e.eventName]?.(e)),await this.#e.push(()=>this.project(e))}project(e){}},v=class r{constructor(e,t,n,o){this.store=e;this.commandHandlers=t;this.projectors=n;this.eventHandlers=o}static builder(e){return new S(e)}static new(e,t,n,o){return new r(e,t,n,o)}async resetProjections(){await Promise.all(this.projectors.map(e=>e.init(this)))}async dispatch(e){return this.commandHandlers.has(e.type)||i(`There is no command handler for the "${e.type}" command`),await this.commandHandlers.get(e.type)(e,this),e}async loadEvents(){return this.store.loadEvents()}async load(e,t){let n=await this.store.load(t);return n.length<=0&&i(`Aggregate(${e.constructor.name}) with ID(${t}) does not exist.`,{aggregate:e.constructor.name,aggregateId:t}),e.replayEvents(n)}async persist(e){let t=e.releaseEvents();await this.store.persist(t);for(let n of t)await Promise.all(this.projectors.map(async o=>{try{await o.applyEvent(n)}catch(s){throw s instanceof Error&&console.error(`An error occurred in one of your projections: ${o.name}, given an event`,s.stack?.split(`
21
21
  `).map(d=>` ${d}`).join(`
22
22
  `)),s}})),await Promise.all(this.eventHandlers.map(async o=>{try{await o(n,this)}catch(s){throw s instanceof Error&&console.error(`An error occurred in one of your event handlers: ${o.name}, given an event`,s.stack?.split(`
23
23
  `).map(d=>` ${d}`).join(`
package/dist/index.mjs CHANGED
@@ -17,7 +17,7 @@ apply = {
17
17
  `).map(a=>` ${a}`).join(`
18
18
  `))}finally{this.#e++}return this}recordThat(e){let t={...e,version:this.#e};return this.applyAnEvent(t),this.#t.push(t),this}releaseEvents(){return this.#t.splice(0)}};function Y(r,e=null){return{type:r,payload:e}}import{randomUUID as M}from"crypto";function W(r,e,t=null){return{aggregateId:e,eventId:M(),eventName:r,payload:t,recordedAt:new Date,version:-1}}import k from"yamlify-object";var $={indent:" ",colors:{date:c,error:c,symbol:c,string:c,number:c,boolean:c,null:c,undefined:c}};function c(r){return r}function w(r){return r instanceof Error?w({...r}):k(r,$).split(`
19
19
  `).slice(1).join(`
20
- `)}var u=new WeakMap;function h(r,e){if(u.has(r)){let t=u.get(r);for(let n in e)t[n]=e[n]}else u.set(r,e)}function T(r){return u.get(r)}var f=class{constructor(){h(this,{jobs:[],state:0})}get length(){return T(this).jobs.length}async start(){let{state:e,jobs:t}=T(this);if(!(e===1||t.length<=0)){for(h(this,{state:1});t.length>0;){let n=t.shift();await Promise.resolve().then(n.handle).then(n.resolve,n.reject)}h(this,{state:0})}}push(e){return new Promise((t,n)=>{let{jobs:a}=T(this);a.push({handle:e,resolve:t,reject:n}),setImmediate(()=>this.start())})}};var g=class{initializer(){}q=new f;async init(e){this.initializer&&await this.q.push(()=>this.initializer?.());let t=await e.loadEvents();await Promise.all(t.map(n=>this.applyEvent(n)))}async applyEvent(e){await this.q.push(()=>this.apply?.[e.eventName]?.(e)),await this.q.push(()=>this.project(e))}project(e){}},y=class r{constructor(e,t,n,a){this.store=e;this.commandHandlers=t;this.projectors=n;this.eventHandlers=a}static builder(e){return new j(e)}static new(e,t,n,a){return new r(e,t,n,a)}async resetProjections(){await Promise.all(this.projectors.map(e=>e.init(this)))}async dispatch(e){return this.commandHandlers.has(e.type)||p(`There is no command handler for the "${e.type}" command`),await this.commandHandlers.get(e.type)(e,this),e}async loadEvents(){return this.store.loadEvents()}async load(e,t){let n=await this.store.load(t);return n.length<=0&&p(`Aggregate(${e.constructor.name}) with ID(${t}) does not exist.`,{aggregate:e.constructor.name,aggregateId:t}),e.replayEvents(n)}async persist(e){let t=e.releaseEvents();await this.store.persist(t);for(let n of t)await Promise.all(this.projectors.map(async a=>{try{await a.applyEvent(n)}catch(s){throw s instanceof Error&&console.error(`An error occurred in one of your projections: ${a.name}, given an event`,s.stack?.split(`
20
+ `)}var u=new WeakMap;function h(r,e){if(u.has(r)){let t=u.get(r);for(let n in e)t[n]=e[n]}else u.set(r,e)}function T(r){return u.get(r)}var f=class{constructor(){h(this,{jobs:[],state:0})}get length(){return T(this).jobs.length}async start(){let{state:e,jobs:t}=T(this);if(!(e===1||t.length<=0)){for(h(this,{state:1});t.length>0;){let n=t.shift();await Promise.resolve().then(n.handle).then(n.resolve,n.reject)}h(this,{state:0})}}push(e){return new Promise((t,n)=>{let{jobs:a}=T(this);a.push({handle:e,resolve:t,reject:n}),setImmediate(()=>this.start())})}};var g=class{apply;initializer(){}#e=new f;async init(e){this.initializer&&await this.#e.push(()=>this.initializer?.());let t=await e.loadEvents();await Promise.all(t.map(n=>this.applyEvent(n)))}async applyEvent(e){await this.#e.push(()=>this.apply?.[e.eventName]?.(e)),await this.#e.push(()=>this.project(e))}project(e){}},y=class r{constructor(e,t,n,a){this.store=e;this.commandHandlers=t;this.projectors=n;this.eventHandlers=a}static builder(e){return new j(e)}static new(e,t,n,a){return new r(e,t,n,a)}async resetProjections(){await Promise.all(this.projectors.map(e=>e.init(this)))}async dispatch(e){return this.commandHandlers.has(e.type)||p(`There is no command handler for the "${e.type}" command`),await this.commandHandlers.get(e.type)(e,this),e}async loadEvents(){return this.store.loadEvents()}async load(e,t){let n=await this.store.load(t);return n.length<=0&&p(`Aggregate(${e.constructor.name}) with ID(${t}) does not exist.`,{aggregate:e.constructor.name,aggregateId:t}),e.replayEvents(n)}async persist(e){let t=e.releaseEvents();await this.store.persist(t);for(let n of t)await Promise.all(this.projectors.map(async a=>{try{await a.applyEvent(n)}catch(s){throw s instanceof Error&&console.error(`An error occurred in one of your projections: ${a.name}, given an event`,s.stack?.split(`
21
21
  `).map(d=>` ${d}`).join(`
22
22
  `)),s}})),await Promise.all(this.eventHandlers.map(async a=>{try{await a(n,this)}catch(s){throw s instanceof Error&&console.error(`An error occurred in one of your event handlers: ${a.name}, given an event`,s.stack?.split(`
23
23
  `).map(d=>` ${d}`).join(`
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.0.11",
2
+ "version": "0.0.12",
3
3
  "name": "@robinmalfait/event-source",
4
4
  "publishConfig": {
5
5
  "access": "public"