@magek/core 0.0.5 → 0.0.7

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.
Files changed (100) hide show
  1. package/dist/authorizer.js +1 -1
  2. package/dist/command-dispatcher.js +47 -41
  3. package/dist/core-concepts/data-migration/entities/data-migration-entity.js +5 -2
  4. package/dist/core-concepts/data-migration/events/data-migration-finished.js +3 -1
  5. package/dist/core-concepts/data-migration/events/data-migration-started.js +3 -1
  6. package/dist/core-concepts/data-migration/events/entity-migrated.js +4 -0
  7. package/dist/core-concepts/touch-entity/events/entity-touched.js +2 -0
  8. package/dist/data-migrations.js +59 -54
  9. package/dist/decorators/command.d.ts +4 -11
  10. package/dist/decorators/command.js +10 -18
  11. package/dist/decorators/data-migration.d.ts +4 -1
  12. package/dist/decorators/data-migration.js +3 -1
  13. package/dist/decorators/decorator-types.d.ts +50 -0
  14. package/dist/decorators/decorator-types.js +11 -0
  15. package/dist/decorators/decorator-utils.d.ts +1 -0
  16. package/dist/decorators/decorator-utils.js +2 -0
  17. package/dist/decorators/entity.d.ts +7 -15
  18. package/dist/decorators/entity.js +27 -37
  19. package/dist/decorators/event-handler.d.ts +11 -1
  20. package/dist/decorators/event-handler.js +13 -1
  21. package/dist/decorators/event.d.ts +4 -1
  22. package/dist/decorators/event.js +3 -2
  23. package/dist/decorators/field-metadata-reader.d.ts +8 -3
  24. package/dist/decorators/field-metadata-reader.js +50 -62
  25. package/dist/decorators/field.d.ts +23 -0
  26. package/dist/decorators/field.js +41 -0
  27. package/dist/decorators/global-error-handler.d.ts +10 -1
  28. package/dist/decorators/global-error-handler.js +9 -1
  29. package/dist/decorators/global-event-handler.d.ts +10 -1
  30. package/dist/decorators/global-event-handler.js +9 -1
  31. package/dist/decorators/health-sensor.d.ts +4 -1
  32. package/dist/decorators/health-sensor.js +3 -2
  33. package/dist/decorators/index.d.ts +3 -0
  34. package/dist/decorators/index.js +2 -0
  35. package/dist/decorators/metadata.d.ts +17 -1
  36. package/dist/decorators/metadata.js +22 -22
  37. package/dist/decorators/non-exposed.d.ts +13 -2
  38. package/dist/decorators/non-exposed.js +22 -20
  39. package/dist/decorators/notification.d.ts +6 -18
  40. package/dist/decorators/notification.js +10 -50
  41. package/dist/decorators/projects.d.ts +5 -18
  42. package/dist/decorators/projects.js +23 -54
  43. package/dist/decorators/query.d.ts +11 -1
  44. package/dist/decorators/query.js +18 -4
  45. package/dist/decorators/read-model.d.ts +13 -27
  46. package/dist/decorators/read-model.js +45 -77
  47. package/dist/decorators/role.d.ts +9 -3
  48. package/dist/decorators/role.js +8 -3
  49. package/dist/decorators/scheduled-command.d.ts +4 -1
  50. package/dist/decorators/scheduled-command.js +3 -1
  51. package/dist/decorators/schema-migration.d.ts +11 -27
  52. package/dist/decorators/schema-migration.js +32 -77
  53. package/dist/decorators/sequenced-by.d.ts +7 -25
  54. package/dist/decorators/sequenced-by.js +11 -71
  55. package/dist/event-dispatcher.js +29 -24
  56. package/dist/event-processor.js +106 -103
  57. package/dist/event-stream-consumer.js +25 -20
  58. package/dist/event-stream-producer.js +22 -17
  59. package/dist/events-reader.js +1 -0
  60. package/dist/global-error-dispatcher.js +3 -2
  61. package/dist/graphql-dispatcher.js +161 -156
  62. package/dist/index.js +4 -0
  63. package/dist/instrumentation/decorator/trace.d.ts +11 -3
  64. package/dist/instrumentation/decorator/trace.js +17 -71
  65. package/dist/magek.js +2 -2
  66. package/dist/query-dispatcher.js +2 -0
  67. package/dist/read-model-schema-migrator.js +71 -68
  68. package/dist/read-models-reader.js +178 -180
  69. package/dist/register-handler.js +3 -3
  70. package/dist/scheduled-command-dispatcher.js +48 -42
  71. package/dist/schema-migrator.js +63 -59
  72. package/dist/sensor/health/health-service.js +2 -1
  73. package/dist/services/event-store.js +221 -224
  74. package/dist/services/graphql/graphql-generator.js +11 -8
  75. package/dist/services/graphql/graphql-mutation-generator.js +4 -0
  76. package/dist/services/graphql/graphql-query-generator.js +14 -0
  77. package/dist/services/graphql/graphql-subcriptions-generator.js +7 -0
  78. package/dist/services/graphql/graphql-type-informer.js +4 -3
  79. package/dist/services/graphql/query-generators/graphql-query-by-keys-generator.js +4 -0
  80. package/dist/services/graphql/query-generators/graphql-query-events-generator.js +3 -0
  81. package/dist/services/graphql/query-generators/graphql-query-filters-generator.js +6 -0
  82. package/dist/services/graphql/query-generators/graphql-query-generator.js +4 -0
  83. package/dist/services/graphql/query-generators/graphql-query-listed-generator.js +7 -0
  84. package/dist/services/graphql/query-helpers/graphql-handled-fields-generator.js +5 -2
  85. package/dist/services/graphql/query-helpers/graphql-query-filter-arguments-builder.js +3 -0
  86. package/dist/services/graphql/query-helpers/graphql-query-filter-fields-builder.js +4 -0
  87. package/dist/services/graphql/query-helpers/graphql-query-sort-builder.js +4 -2
  88. package/dist/services/graphql/websocket-protocol/graphql-websocket-protocol.js +5 -3
  89. package/dist/services/pub-sub/read-model-pub-sub.js +1 -0
  90. package/dist/services/raw-events-parser.js +1 -1
  91. package/dist/services/read-model-store.js +16 -17
  92. package/dist/services/token-verifiers/jwks-uri-token-verifier.js +8 -4
  93. package/dist/services/token-verifiers/public-key-token-verifier.js +4 -2
  94. package/dist/services/token-verifiers/role-based-token-verifier.js +2 -1
  95. package/dist/services/token-verifiers/utilities.js +1 -1
  96. package/dist/subscribers-notifier.js +98 -92
  97. package/dist/token-verifier.js +2 -1
  98. package/package.json +4 -4
  99. package/dist/decorators/stage3-utils.d.ts +0 -6
  100. package/dist/decorators/stage3-utils.js +0 -25
@@ -10,251 +10,248 @@ const entity_touched_1 = require("../core-concepts/touch-entity/events/entity-to
10
10
  const instrumentation_1 = require("../instrumentation");
11
11
  const originOfTime = new Date(0).toISOString(); // Unix epoch
12
12
  const reducibleEventsTypesNames = [entity_migrated_1.MagekEntityMigrated.name, entity_touched_1.MagekEntityTouched.name];
13
- class EventStore {
14
- constructor(config) {
15
- this.config = config;
16
- }
17
- /**
18
- * Will fetch the latest snapshot for an entity by applying a reduction
19
- * since the time of creation of the last snapshot or from the origin of time
20
- * if no snapshot is found.
21
- *
22
- * Also, in order to make next calls faster, this method caches the newly calculated
23
- * snapshot storing it at the end of the process.
24
- */
25
- async fetchEntitySnapshot(entityName, entityID) {
26
- var _a;
27
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#fetchEntitySnapshot');
28
- logger.debug(`Fetching snapshot for entity ${entityName} with ID ${entityID}`);
29
- const latestSnapshotEnvelope = await this.loadLatestSnapshot(entityName, entityID);
30
- const lastVisitedTime = (_a = latestSnapshotEnvelope === null || latestSnapshotEnvelope === void 0 ? void 0 : latestSnapshotEnvelope.snapshottedEventCreatedAt) !== null && _a !== void 0 ? _a : originOfTime;
31
- const pendingEvents = await this.loadEventStreamSince(entityName, entityID, lastVisitedTime);
32
- if (pendingEvents.length <= 0) {
33
- return latestSnapshotEnvelope;
13
+ let EventStore = (() => {
14
+ let _instanceExtraInitializers = [];
15
+ let _fetchEntitySnapshot_decorators;
16
+ let _storeDispatchedEvent_decorators;
17
+ let _storeSnapshot_decorators;
18
+ let _loadLatestSnapshot_decorators;
19
+ let _loadEventStreamSince_decorators;
20
+ let _entityReducer_decorators;
21
+ return class EventStore {
22
+ static {
23
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
24
+ _fetchEntitySnapshot_decorators = [(0, instrumentation_1.trace)(common_1.TraceActionTypes.FETCH_ENTITY_SNAPSHOT)];
25
+ _storeDispatchedEvent_decorators = [(0, instrumentation_1.trace)(common_1.TraceActionTypes.CUSTOM)];
26
+ _storeSnapshot_decorators = [(0, instrumentation_1.trace)(common_1.TraceActionTypes.STORE_SNAPSHOT)];
27
+ _loadLatestSnapshot_decorators = [(0, instrumentation_1.trace)(common_1.TraceActionTypes.LOAD_LATEST_SNAPSHOT)];
28
+ _loadEventStreamSince_decorators = [(0, instrumentation_1.trace)(common_1.TraceActionTypes.LOAD_EVENT_STREAM_SINCE)];
29
+ _entityReducer_decorators = [(0, instrumentation_1.trace)(common_1.TraceActionTypes.ENTITY_REDUCER)];
30
+ tslib_1.__esDecorate(this, null, _fetchEntitySnapshot_decorators, { kind: "method", name: "fetchEntitySnapshot", static: false, private: false, access: { has: obj => "fetchEntitySnapshot" in obj, get: obj => obj.fetchEntitySnapshot }, metadata: _metadata }, null, _instanceExtraInitializers);
31
+ tslib_1.__esDecorate(this, null, _storeDispatchedEvent_decorators, { kind: "method", name: "storeDispatchedEvent", static: false, private: false, access: { has: obj => "storeDispatchedEvent" in obj, get: obj => obj.storeDispatchedEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
32
+ tslib_1.__esDecorate(this, null, _storeSnapshot_decorators, { kind: "method", name: "storeSnapshot", static: false, private: false, access: { has: obj => "storeSnapshot" in obj, get: obj => obj.storeSnapshot }, metadata: _metadata }, null, _instanceExtraInitializers);
33
+ tslib_1.__esDecorate(this, null, _loadLatestSnapshot_decorators, { kind: "method", name: "loadLatestSnapshot", static: false, private: false, access: { has: obj => "loadLatestSnapshot" in obj, get: obj => obj.loadLatestSnapshot }, metadata: _metadata }, null, _instanceExtraInitializers);
34
+ tslib_1.__esDecorate(this, null, _loadEventStreamSince_decorators, { kind: "method", name: "loadEventStreamSince", static: false, private: false, access: { has: obj => "loadEventStreamSince" in obj, get: obj => obj.loadEventStreamSince }, metadata: _metadata }, null, _instanceExtraInitializers);
35
+ tslib_1.__esDecorate(this, null, _entityReducer_decorators, { kind: "method", name: "entityReducer", static: false, private: false, access: { has: obj => "entityReducer" in obj, get: obj => obj.entityReducer }, metadata: _metadata }, null, _instanceExtraInitializers);
36
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
34
37
  }
35
- else {
36
- logger.debug(`Looking for the reducer for entity ${entityName} with ID ${entityID}`);
37
- // In this assignment we discard the `createdAt` field because it's not needed in the reduction process
38
- let newEntitySnapshot = latestSnapshotEnvelope;
39
- for (const pendingEvent of pendingEvents) {
40
- // We double-check that what we are reducing is an event
41
- if (pendingEvent.kind === 'event') {
42
- try {
43
- newEntitySnapshot = await this.entityReducer(pendingEvent, newEntitySnapshot);
44
- }
45
- catch (e) {
46
- if (e instanceof common_1.InvalidEventError) {
47
- const globalErrorDispatcher = new global_error_dispatcher_1.MagekGlobalErrorDispatcher(this.config);
48
- const error = await globalErrorDispatcher.dispatch(new common_1.EventGlobalError(pendingEvent, e));
49
- if (error)
50
- throw error;
51
- continue;
38
+ config = tslib_1.__runInitializers(this, _instanceExtraInitializers);
39
+ constructor(config) {
40
+ this.config = config;
41
+ }
42
+ /**
43
+ * Will fetch the latest snapshot for an entity by applying a reduction
44
+ * since the time of creation of the last snapshot or from the origin of time
45
+ * if no snapshot is found.
46
+ *
47
+ * Also, in order to make next calls faster, this method caches the newly calculated
48
+ * snapshot storing it at the end of the process.
49
+ */
50
+ async fetchEntitySnapshot(entityName, entityID) {
51
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#fetchEntitySnapshot');
52
+ logger.debug(`Fetching snapshot for entity ${entityName} with ID ${entityID}`);
53
+ const latestSnapshotEnvelope = await this.loadLatestSnapshot(entityName, entityID);
54
+ const lastVisitedTime = latestSnapshotEnvelope?.snapshottedEventCreatedAt ?? originOfTime;
55
+ const pendingEvents = await this.loadEventStreamSince(entityName, entityID, lastVisitedTime);
56
+ if (pendingEvents.length <= 0) {
57
+ return latestSnapshotEnvelope;
58
+ }
59
+ else {
60
+ logger.debug(`Looking for the reducer for entity ${entityName} with ID ${entityID}`);
61
+ // In this assignment we discard the `createdAt` field because it's not needed in the reduction process
62
+ let newEntitySnapshot = latestSnapshotEnvelope;
63
+ for (const pendingEvent of pendingEvents) {
64
+ // We double-check that what we are reducing is an event
65
+ if (pendingEvent.kind === 'event') {
66
+ try {
67
+ const reducerResult = await this.entityReducer(pendingEvent, newEntitySnapshot);
68
+ // If reducer returns ReducerAction.Skip, keep the current snapshot unchanged
69
+ if (reducerResult !== common_1.ReducerAction.Skip) {
70
+ newEntitySnapshot = reducerResult;
71
+ }
52
72
  }
53
- else if (e instanceof common_1.InvalidReducerError) {
54
- const globalErrorDispatcher = new global_error_dispatcher_1.MagekGlobalErrorDispatcher(this.config);
55
- const reducerMetadata = this.config.reducers[pendingEvent.typeName];
56
- const error = await globalErrorDispatcher.dispatch(new common_1.ReducerGlobalError(pendingEvent, e.eventInstance, e.snapshotInstance, reducerMetadata, e));
57
- if (error)
58
- throw error;
59
- continue;
73
+ catch (e) {
74
+ if (e instanceof common_1.InvalidEventError) {
75
+ const globalErrorDispatcher = new global_error_dispatcher_1.MagekGlobalErrorDispatcher(this.config);
76
+ const error = await globalErrorDispatcher.dispatch(new common_1.EventGlobalError(pendingEvent, e));
77
+ if (error)
78
+ throw error;
79
+ continue;
80
+ }
81
+ else if (e instanceof common_1.InvalidReducerError) {
82
+ const globalErrorDispatcher = new global_error_dispatcher_1.MagekGlobalErrorDispatcher(this.config);
83
+ const reducerMetadata = this.config.reducers[pendingEvent.typeName];
84
+ const error = await globalErrorDispatcher.dispatch(new common_1.ReducerGlobalError(pendingEvent, e.eventInstance, e.snapshotInstance, reducerMetadata, e));
85
+ if (error)
86
+ throw error;
87
+ continue;
88
+ }
89
+ throw e;
60
90
  }
61
- throw e;
62
91
  }
63
92
  }
93
+ if (!newEntitySnapshot) {
94
+ logger.debug('No snapshot was found or reduced, returning');
95
+ return newEntitySnapshot;
96
+ }
97
+ if (newEntitySnapshot.entityID !== entityID) {
98
+ logger.debug(`Migrated entity ${entityName} with previous ID ${entityID} to ${newEntitySnapshot?.typeName} with the new ID ${newEntitySnapshot?.entityID}`, newEntitySnapshot);
99
+ }
100
+ else {
101
+ logger.debug(`Reduced new snapshot for entity ${entityName} with ID ${entityID}: `, newEntitySnapshot);
102
+ }
103
+ return await this.storeSnapshot(newEntitySnapshot);
64
104
  }
65
- if (!newEntitySnapshot) {
66
- logger.debug('No snapshot was found or reduced, returning');
67
- return newEntitySnapshot;
68
- }
69
- if (newEntitySnapshot.entityID !== entityID) {
70
- logger.debug(`Migrated entity ${entityName} with previous ID ${entityID} to ${newEntitySnapshot === null || newEntitySnapshot === void 0 ? void 0 : newEntitySnapshot.typeName} with the new ID ${newEntitySnapshot === null || newEntitySnapshot === void 0 ? void 0 : newEntitySnapshot.entityID}`, newEntitySnapshot);
105
+ }
106
+ async storeDispatchedEvent(eventEnvelope) {
107
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#storeDispatchedEvent');
108
+ try {
109
+ logger.debug('Storing event in the dispatched event store:', eventEnvelope);
110
+ return await this.config.eventStore.storeDispatched(eventEnvelope, this.config);
71
111
  }
72
- else {
73
- logger.debug(`Reduced new snapshot for entity ${entityName} with ID ${entityID}: `, newEntitySnapshot);
112
+ catch (e) {
113
+ logger.debug('Could not store dispatched event. Continue its processing.', { error: e, eventEnvelope });
114
+ return true;
74
115
  }
75
- return await this.storeSnapshot(newEntitySnapshot);
76
- }
77
- }
78
- async storeDispatchedEvent(eventEnvelope) {
79
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#storeDispatchedEvent');
80
- try {
81
- logger.debug('Storing event in the dispatched event store:', eventEnvelope);
82
- return await this.config.eventStore.storeDispatched(eventEnvelope, this.config);
83
- }
84
- catch (e) {
85
- logger.debug('Could not store dispatched event. Continue its processing.', { error: e, eventEnvelope });
86
- return true;
87
116
  }
88
- }
89
- async storeSnapshot(snapshot) {
90
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#storeSnapshot');
91
- try {
92
- logger.debug('Storing snapshot in the event store:', snapshot);
93
- return await this.config.eventStore.storeSnapshot(snapshot, this.config);
117
+ async storeSnapshot(snapshot) {
118
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#storeSnapshot');
119
+ try {
120
+ logger.debug('Storing snapshot in the event store:', snapshot);
121
+ return await this.config.eventStore.storeSnapshot(snapshot, this.config);
122
+ }
123
+ catch (e) {
124
+ logger.error(`The snapshot for entity ${snapshot.typeName} with ID ${snapshot.entityID} couldn't be stored (Tried on ${new Date()})`, snapshot, '\nError:', e);
125
+ return;
126
+ }
94
127
  }
95
- catch (e) {
96
- logger.error(`The snapshot for entity ${snapshot.typeName} with ID ${snapshot.entityID} couldn't be stored (Tried on ${new Date()})`, snapshot, '\nError:', e);
97
- return;
128
+ async loadLatestSnapshot(entityName, entityID) {
129
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#loadLatestSnapshot');
130
+ logger.debug(`Loading latest snapshot for entity ${entityName} and ID ${entityID}`);
131
+ const latestSnapshot = await this.config.eventStore.latestEntitySnapshot(this.config, entityName, entityID);
132
+ if (latestSnapshot) {
133
+ return new schema_migrator_1.SchemaMigrator(this.config).migrate(latestSnapshot);
134
+ }
135
+ return undefined;
98
136
  }
99
- }
100
- async loadLatestSnapshot(entityName, entityID) {
101
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#loadLatestSnapshot');
102
- logger.debug(`Loading latest snapshot for entity ${entityName} and ID ${entityID}`);
103
- const latestSnapshot = await this.config.eventStore.latestEntitySnapshot(this.config, entityName, entityID);
104
- if (latestSnapshot) {
105
- return new schema_migrator_1.SchemaMigrator(this.config).migrate(latestSnapshot);
137
+ async loadEventStreamSince(entityTypeName, entityID, timestamp) {
138
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#loadEventStreamSince');
139
+ logger.debug(`Loading list of pending events for entity ${entityTypeName} with ID ${entityID} since ${timestamp}`);
140
+ return this.config.eventStore.forEntitySince(this.config, entityTypeName, entityID, timestamp);
106
141
  }
107
- return undefined;
108
- }
109
- async loadEventStreamSince(entityTypeName, entityID, timestamp) {
110
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#loadEventStreamSince');
111
- logger.debug(`Loading list of pending events for entity ${entityTypeName} with ID ${entityID} since ${timestamp}`);
112
- return this.config.eventStore.forEntitySince(this.config, entityTypeName, entityID, timestamp);
113
- }
114
- async entityReducer(eventEnvelope, latestSnapshot) {
115
- const logger = (0, common_1.getLogger)(this.config, 'entityReducer');
116
- logger.debug('Calling reducer with event: ', eventEnvelope, ' and entity snapshot ', latestSnapshot);
117
- if (this.shouldReduceMagekSuperKind(eventEnvelope)) {
118
- return this.reduceSuperKind(eventEnvelope, latestSnapshot);
142
+ async entityReducer(eventEnvelope, latestSnapshot) {
143
+ const logger = (0, common_1.getLogger)(this.config, 'entityReducer');
144
+ logger.debug('Calling reducer with event: ', eventEnvelope, ' and entity snapshot ', latestSnapshot);
145
+ if (this.shouldReduceMagekSuperKind(eventEnvelope)) {
146
+ return this.reduceSuperKind(eventEnvelope, latestSnapshot);
147
+ }
148
+ const eventMetadata = this.eventMetadataFor(eventEnvelope);
149
+ const migratedEventEnvelope = await new schema_migrator_1.SchemaMigrator(this.config).migrate(eventEnvelope);
150
+ const eventInstance = (0, common_1.createInstance)(eventMetadata.class, migratedEventEnvelope.value);
151
+ const entityMetadata = this.config.entities[migratedEventEnvelope.entityTypeName];
152
+ const reducerMetadata = this.config.reducers[eventEnvelope.typeName];
153
+ const snapshotInstance = latestSnapshot ? (0, common_1.createInstance)(entityMetadata.class, latestSnapshot.value) : null;
154
+ return this.createNewSnapshot(migratedEventEnvelope, eventInstance, snapshotInstance, eventEnvelope, reducerMetadata);
119
155
  }
120
- const eventMetadata = this.eventMetadataFor(eventEnvelope);
121
- const migratedEventEnvelope = await new schema_migrator_1.SchemaMigrator(this.config).migrate(eventEnvelope);
122
- const eventInstance = (0, common_1.createInstance)(eventMetadata.class, migratedEventEnvelope.value);
123
- const entityMetadata = this.config.entities[migratedEventEnvelope.entityTypeName];
124
- const reducerMetadata = this.config.reducers[eventEnvelope.typeName];
125
- const snapshotInstance = latestSnapshot ? (0, common_1.createInstance)(entityMetadata.class, latestSnapshot.value) : null;
126
- return this.createNewSnapshot(migratedEventEnvelope, eventInstance, snapshotInstance, eventEnvelope, reducerMetadata);
127
- }
128
- shouldReduceMagekSuperKind(eventEnvelope) {
129
- const reducible = reducibleEventsTypesNames.includes(eventEnvelope.typeName);
130
- return eventEnvelope.superKind && eventEnvelope.superKind === common_1.MAGEK_SUPER_KIND && reducible;
131
- }
132
- eventMetadataFor(eventEnvelope) {
133
- const logger = (0, common_1.getLogger)(this.config, 'eventMetadataFor');
134
- const eventMetadata = this.config.events[eventEnvelope.typeName];
135
- if (!eventMetadata) {
136
- logger.error(`No event registered for event ${eventEnvelope.typeName}`);
137
- throw new common_1.InvalidEventError(`No event registered for event ${eventEnvelope.typeName}`);
156
+ shouldReduceMagekSuperKind(eventEnvelope) {
157
+ const reducible = reducibleEventsTypesNames.includes(eventEnvelope.typeName);
158
+ return eventEnvelope.superKind && eventEnvelope.superKind === common_1.MAGEK_SUPER_KIND && reducible;
138
159
  }
139
- return eventMetadata;
140
- }
141
- async createNewSnapshot(migratedEventEnvelope, eventInstance, snapshotInstance, eventEnvelope, reducerMetadata) {
142
- const logger = (0, common_1.getLogger)(this.config, 'createNewSnapshot');
143
- try {
144
- const newEntity = this.reducerForEvent(migratedEventEnvelope.typeName, eventInstance, snapshotInstance)(eventInstance, snapshotInstance);
145
- const newSnapshot = {
146
- version: this.config.currentVersionFor(eventEnvelope.entityTypeName),
147
- kind: 'snapshot',
148
- superKind: migratedEventEnvelope.superKind,
149
- requestID: migratedEventEnvelope.requestID,
150
- entityID: migratedEventEnvelope.entityID,
151
- entityTypeName: migratedEventEnvelope.entityTypeName,
152
- typeName: migratedEventEnvelope.entityTypeName,
153
- value: newEntity,
154
- snapshottedEventCreatedAt: migratedEventEnvelope.createdAt,
155
- };
156
- logger.debug('Reducer result: ', newSnapshot);
157
- return newSnapshot;
160
+ eventMetadataFor(eventEnvelope) {
161
+ const logger = (0, common_1.getLogger)(this.config, 'eventMetadataFor');
162
+ const eventMetadata = this.config.events[eventEnvelope.typeName];
163
+ if (!eventMetadata) {
164
+ logger.error(`No event registered for event ${eventEnvelope.typeName}`);
165
+ throw new common_1.InvalidEventError(`No event registered for event ${eventEnvelope.typeName}`);
166
+ }
167
+ return eventMetadata;
158
168
  }
159
- catch (e) {
160
- const globalErrorDispatcher = new global_error_dispatcher_1.MagekGlobalErrorDispatcher(this.config);
161
- throw await globalErrorDispatcher.dispatch(new common_1.ReducerGlobalError(migratedEventEnvelope, eventInstance, snapshotInstance, reducerMetadata, e));
169
+ async createNewSnapshot(migratedEventEnvelope, eventInstance, snapshotInstance, eventEnvelope, reducerMetadata) {
170
+ const logger = (0, common_1.getLogger)(this.config, 'createNewSnapshot');
171
+ try {
172
+ const reducerResult = this.reducerForEvent(migratedEventEnvelope.typeName, eventInstance, snapshotInstance)(eventInstance, snapshotInstance);
173
+ if (reducerResult === common_1.ReducerAction.Skip) {
174
+ logger.debug('Reducer returned ReducerAction.Skip, skipping snapshot creation');
175
+ return common_1.ReducerAction.Skip;
176
+ }
177
+ const newSnapshot = {
178
+ version: this.config.currentVersionFor(eventEnvelope.entityTypeName),
179
+ kind: 'snapshot',
180
+ superKind: migratedEventEnvelope.superKind,
181
+ requestID: migratedEventEnvelope.requestID,
182
+ entityID: migratedEventEnvelope.entityID,
183
+ entityTypeName: migratedEventEnvelope.entityTypeName,
184
+ typeName: migratedEventEnvelope.entityTypeName,
185
+ value: reducerResult,
186
+ snapshottedEventCreatedAt: migratedEventEnvelope.createdAt,
187
+ };
188
+ logger.debug('Reducer result: ', newSnapshot);
189
+ return newSnapshot;
190
+ }
191
+ catch (e) {
192
+ const globalErrorDispatcher = new global_error_dispatcher_1.MagekGlobalErrorDispatcher(this.config);
193
+ throw await globalErrorDispatcher.dispatch(new common_1.ReducerGlobalError(migratedEventEnvelope, eventInstance, snapshotInstance, reducerMetadata, e));
194
+ }
162
195
  }
163
- }
164
- async reduceSuperKind(eventEnvelope, latestSnapshot) {
165
- if (eventEnvelope.typeName === entity_touched_1.MagekEntityTouched.name) {
166
- return this.reduceEntityTouched(eventEnvelope, latestSnapshot);
196
+ async reduceSuperKind(eventEnvelope, latestSnapshot) {
197
+ if (eventEnvelope.typeName === entity_touched_1.MagekEntityTouched.name) {
198
+ return this.reduceEntityTouched(eventEnvelope, latestSnapshot);
199
+ }
200
+ if (eventEnvelope.typeName === entity_migrated_1.MagekEntityMigrated.name) {
201
+ return this.reduceEntityMigrated(eventEnvelope);
202
+ }
203
+ throw new common_1.InvalidParameterError(`Unexpected super kind ${eventEnvelope.superKind} to be reduced`);
167
204
  }
168
- if (eventEnvelope.typeName === entity_migrated_1.MagekEntityMigrated.name) {
169
- return this.reduceEntityMigrated(eventEnvelope);
205
+ reduceEntityMigrated(eventEnvelope) {
206
+ const event = eventEnvelope.value;
207
+ return this.toMagekEntitySnapshot(eventEnvelope, event.newEntity, event.newEntityName);
170
208
  }
171
- throw new common_1.InvalidParameterError(`Unexpected super kind ${eventEnvelope.superKind} to be reduced`);
172
- }
173
- reduceEntityMigrated(eventEnvelope) {
174
- const event = eventEnvelope.value;
175
- return this.toMagekEntitySnapshot(eventEnvelope, event.newEntity, event.newEntityName);
176
- }
177
- reduceEntityTouched(eventEnvelope, latestSnapshot) {
178
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#reduceEntityTouched');
179
- logger.debug('Reducing ', eventEnvelope, ' with latestSnapshot');
180
- if (!latestSnapshot) {
181
- logger.debug('Latest snapshot not found, returning');
182
- return;
209
+ reduceEntityTouched(eventEnvelope, latestSnapshot) {
210
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#reduceEntityTouched');
211
+ logger.debug('Reducing ', eventEnvelope, ' with latestSnapshot');
212
+ if (!latestSnapshot) {
213
+ logger.debug('Latest snapshot not found, returning Skip');
214
+ return common_1.ReducerAction.Skip;
215
+ }
216
+ const event = eventEnvelope.value;
217
+ const entityMetadata = this.config.entities[event.entityName];
218
+ const snapshotInstance = (0, common_1.createInstance)(entityMetadata.class, latestSnapshot.value);
219
+ return this.toMagekEntitySnapshot(eventEnvelope, snapshotInstance, event.entityName);
183
220
  }
184
- const event = eventEnvelope.value;
185
- const entityMetadata = this.config.entities[event.entityName];
186
- const snapshotInstance = (0, common_1.createInstance)(entityMetadata.class, latestSnapshot.value);
187
- return this.toMagekEntitySnapshot(eventEnvelope, snapshotInstance, event.entityName);
188
- }
189
- toMagekEntitySnapshot(eventEnvelope, entity, className) {
190
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#toMagekEntitySnapshot');
191
- const migratedSnapshot = {
192
- version: this.config.currentVersionFor(className),
193
- kind: 'snapshot',
194
- superKind: eventEnvelope.superKind,
195
- requestID: eventEnvelope.requestID,
196
- entityID: entity.id,
197
- entityTypeName: className,
198
- typeName: className,
199
- value: entity,
200
- snapshottedEventCreatedAt: eventEnvelope.createdAt,
201
- };
202
- logger.debug('MagekEntitySnapshot result: ', migratedSnapshot);
203
- return migratedSnapshot;
204
- }
205
- reducerForEvent(eventName, eventInstance, snapshotInstance) {
206
- const logger = (0, common_1.getLogger)(this.config, 'EventStore#reducerForEvent');
207
- const reducerMetadata = this.config.reducers[eventName];
208
- if (!reducerMetadata) {
209
- throw new common_1.InvalidReducerError(`No reducer registered for event ${eventName}`, eventInstance, snapshotInstance);
221
+ toMagekEntitySnapshot(eventEnvelope, entity, className) {
222
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#toMagekEntitySnapshot');
223
+ const migratedSnapshot = {
224
+ version: this.config.currentVersionFor(className),
225
+ kind: 'snapshot',
226
+ superKind: eventEnvelope.superKind,
227
+ requestID: eventEnvelope.requestID,
228
+ entityID: entity.id,
229
+ entityTypeName: className,
230
+ typeName: className,
231
+ value: entity,
232
+ snapshottedEventCreatedAt: eventEnvelope.createdAt,
233
+ };
234
+ logger.debug('MagekEntitySnapshot result: ', migratedSnapshot);
235
+ return migratedSnapshot;
210
236
  }
211
- else {
212
- try {
213
- const methodName = reducerMetadata.methodName;
214
- const reducer = reducerMetadata.class[methodName];
215
- logger.debug(`Found reducer for event ${eventName}: "${reducerMetadata.class.name}.${methodName}"`);
216
- return reducer;
237
+ reducerForEvent(eventName, eventInstance, snapshotInstance) {
238
+ const logger = (0, common_1.getLogger)(this.config, 'EventStore#reducerForEvent');
239
+ const reducerMetadata = this.config.reducers[eventName];
240
+ if (!reducerMetadata) {
241
+ throw new common_1.InvalidReducerError(`No reducer registered for event ${eventName}`, eventInstance, snapshotInstance);
217
242
  }
218
- catch {
219
- throw new Error(`Couldn't load the Entity class ${reducerMetadata.class.name}`);
243
+ else {
244
+ try {
245
+ const methodName = reducerMetadata.methodName;
246
+ const reducer = reducerMetadata.class[methodName];
247
+ logger.debug(`Found reducer for event ${eventName}: "${reducerMetadata.class.name}.${methodName}"`);
248
+ return reducer;
249
+ }
250
+ catch {
251
+ throw new Error(`Couldn't load the Entity class ${reducerMetadata.class.name}`);
252
+ }
220
253
  }
221
254
  }
222
- }
223
- }
255
+ };
256
+ })();
224
257
  exports.EventStore = EventStore;
225
- tslib_1.__decorate([
226
- (0, instrumentation_1.Trace)(common_1.TraceActionTypes.FETCH_ENTITY_SNAPSHOT),
227
- tslib_1.__metadata("design:type", Function),
228
- tslib_1.__metadata("design:paramtypes", [String, common_1.UUID]),
229
- tslib_1.__metadata("design:returntype", Promise)
230
- ], EventStore.prototype, "fetchEntitySnapshot", null);
231
- tslib_1.__decorate([
232
- (0, instrumentation_1.Trace)(common_1.TraceActionTypes.CUSTOM),
233
- tslib_1.__metadata("design:type", Function),
234
- tslib_1.__metadata("design:paramtypes", [Object]),
235
- tslib_1.__metadata("design:returntype", Promise)
236
- ], EventStore.prototype, "storeDispatchedEvent", null);
237
- tslib_1.__decorate([
238
- (0, instrumentation_1.Trace)(common_1.TraceActionTypes.STORE_SNAPSHOT),
239
- tslib_1.__metadata("design:type", Function),
240
- tslib_1.__metadata("design:paramtypes", [Object]),
241
- tslib_1.__metadata("design:returntype", Promise)
242
- ], EventStore.prototype, "storeSnapshot", null);
243
- tslib_1.__decorate([
244
- (0, instrumentation_1.Trace)(common_1.TraceActionTypes.LOAD_LATEST_SNAPSHOT),
245
- tslib_1.__metadata("design:type", Function),
246
- tslib_1.__metadata("design:paramtypes", [String, common_1.UUID]),
247
- tslib_1.__metadata("design:returntype", Promise)
248
- ], EventStore.prototype, "loadLatestSnapshot", null);
249
- tslib_1.__decorate([
250
- (0, instrumentation_1.Trace)(common_1.TraceActionTypes.LOAD_EVENT_STREAM_SINCE),
251
- tslib_1.__metadata("design:type", Function),
252
- tslib_1.__metadata("design:paramtypes", [String, common_1.UUID, String]),
253
- tslib_1.__metadata("design:returntype", Promise)
254
- ], EventStore.prototype, "loadEventStreamSince", null);
255
- tslib_1.__decorate([
256
- (0, instrumentation_1.Trace)(common_1.TraceActionTypes.ENTITY_REDUCER),
257
- tslib_1.__metadata("design:type", Function),
258
- tslib_1.__metadata("design:paramtypes", [Object, Object]),
259
- tslib_1.__metadata("design:returntype", Promise)
260
- ], EventStore.prototype, "entityReducer", null);
@@ -13,6 +13,11 @@ const graphql_subcriptions_generator_1 = require("./graphql-subcriptions-generat
13
13
  const graphql_type_informer_1 = require("./graphql-type-informer");
14
14
  const query_dispatcher_1 = require("../../query-dispatcher");
15
15
  class GraphQLGenerator {
16
+ static commandsDispatcher;
17
+ static queriesDispatcher;
18
+ static readModelsReader;
19
+ static eventsReader;
20
+ static schema;
16
21
  static generateSchema(config) {
17
22
  const logger = (0, common_1.getLogger)(config, 'GraphQLGenerator#generateSchema');
18
23
  if (!this.schema) {
@@ -40,7 +45,7 @@ class GraphQLGenerator {
40
45
  let isPaginated = false;
41
46
  const fields = this.getFields(info);
42
47
  let select = fields.length > 0 ? fields : undefined;
43
- if ((info === null || info === void 0 ? void 0 : info.fieldName) === `List${(0, inflected_1.pluralize)(readModelClass.name)}`) {
48
+ if (info?.fieldName === `List${(0, inflected_1.pluralize)(readModelClass.name)}`) {
44
49
  isPaginated = true;
45
50
  if (select) {
46
51
  // In paginated queries, the `items[].` field needs to be removed from the select fields before querying the database
@@ -72,7 +77,7 @@ class GraphQLGenerator {
72
77
  const result = await this.commandsDispatcher.dispatchCommand(commandEnvelope, context);
73
78
  // It could be that the command didn't return anything
74
79
  // so in that case we return `true`, as GraphQL doesn't have a `null` type
75
- return result !== null && result !== void 0 ? result : true;
80
+ return result ?? true;
76
81
  };
77
82
  }
78
83
  static queriesResolverBuilder(queryClass) {
@@ -228,14 +233,13 @@ class GraphQLGenerator {
228
233
  }
229
234
  exports.GraphQLGenerator = GraphQLGenerator;
230
235
  function toReadModelRequestEnvelope(readModelClass, args, context, paginatedVersion = false, select) {
231
- var _a, _b;
232
236
  return {
233
237
  requestID: context.requestID,
234
238
  currentUser: context.user,
235
239
  class: readModelClass,
236
240
  className: readModelClass.name,
237
- filters: (_a = args.filter) !== null && _a !== void 0 ? _a : {},
238
- sortBy: (_b = args.sortBy) !== null && _b !== void 0 ? _b : {},
241
+ filters: args.filter ?? {},
242
+ sortBy: args.sortBy ?? {},
239
243
  limit: args.limit,
240
244
  afterCursor: args.afterCursor,
241
245
  paginatedVersion,
@@ -251,7 +255,6 @@ function toEventSearchRequest(args, context) {
251
255
  };
252
256
  }
253
257
  function toEnvelope(typeName, value, context) {
254
- var _a, _b;
255
258
  return {
256
259
  requestID: context.requestID,
257
260
  currentUser: context.user,
@@ -260,8 +263,8 @@ function toEnvelope(typeName, value, context) {
260
263
  version: 1, // TODO: How to pass the version through GraphQL?
261
264
  context: {
262
265
  request: {
263
- body: (_a = context.context) === null || _a === void 0 ? void 0 : _a.request.body,
264
- headers: (_b = context.context) === null || _b === void 0 ? void 0 : _b.request.headers,
266
+ body: context.context?.request.body,
267
+ headers: context.context?.request.headers,
265
268
  },
266
269
  rawContext: context,
267
270
  },
@@ -4,6 +4,10 @@ exports.GraphQLMutationGenerator = void 0;
4
4
  const graphql_1 = require("graphql");
5
5
  const graphql_handled_fields_generator_1 = require("./query-helpers/graphql-handled-fields-generator");
6
6
  class GraphQLMutationGenerator {
7
+ targetTypes;
8
+ typeInformer;
9
+ mutationResolver;
10
+ config;
7
11
  constructor(targetTypes, typeInformer, mutationResolver, config) {
8
12
  this.targetTypes = targetTypes;
9
13
  this.typeInformer = typeInformer;
@@ -8,6 +8,20 @@ const graphql_query_filters_generator_1 = require("./query-generators/graphql-qu
8
8
  const graphql_query_listed_generator_1 = require("./query-generators/graphql-query-listed-generator");
9
9
  const graphql_query_generator_1 = require("./query-generators/graphql-query-generator");
10
10
  class GraphQLQueryGenerator {
11
+ config;
12
+ readModels;
13
+ targetTypes;
14
+ typeInformer;
15
+ byIDResolverBuilder;
16
+ queryResolverBuilder;
17
+ filterResolverBuilder;
18
+ eventsResolver;
19
+ generatedFiltersByTypeName;
20
+ graphqlQueryByKeysGenerator;
21
+ graphqlQueryGenerator;
22
+ graphqlQueryFiltersGenerator;
23
+ graphqlQueryListedGenerator;
24
+ graphqlQueryEventsGenerator;
11
25
  constructor(config, readModels, targetTypes, typeInformer, byIDResolverBuilder, queryResolverBuilder, filterResolverBuilder, eventsResolver, generatedFiltersByTypeName = {}) {
12
26
  this.config = config;
13
27
  this.readModels = readModels;
@@ -5,6 +5,13 @@ const graphql_1 = require("graphql");
5
5
  const inflected = require("inflected");
6
6
  const graphql_query_filter_fields_builder_1 = require("./query-helpers/graphql-query-filter-fields-builder");
7
7
  class GraphQLSubscriptionGenerator {
8
+ readModels;
9
+ typeInformer;
10
+ byIDResolverBuilder;
11
+ filterResolverBuilder;
12
+ generatedFiltersByTypeName;
13
+ config;
14
+ graphqlQueryFilterFieldsBuilder;
8
15
  constructor(readModels, typeInformer, byIDResolverBuilder, filterResolverBuilder, generatedFiltersByTypeName = {}, config) {
9
16
  this.readModels = readModels;
10
17
  this.typeInformer = typeInformer;
@@ -6,9 +6,10 @@ const graphql_1 = require("graphql");
6
6
  const graphql_scalars_1 = require("graphql-scalars");
7
7
  const common_1 = require("./common");
8
8
  class GraphQLTypeInformer {
9
+ logger;
10
+ graphQLTypes = {};
9
11
  constructor(logger) {
10
12
  this.logger = logger;
11
- this.graphQLTypes = {};
12
13
  }
13
14
  generateGraphQLTypeForClass(type, excludeProps, inputType = false) {
14
15
  this.logger.debug(`Generate GraphQL ${inputType ? 'input' : 'output'} type for class ${type.name}`);
@@ -123,7 +124,7 @@ class GraphQLTypeInformer {
123
124
  if (inputType) {
124
125
  return new graphql_1.GraphQLInputObjectType({
125
126
  name: classMetadata.name + 'Input',
126
- fields: finalFields === null || finalFields === void 0 ? void 0 : finalFields.reduce((obj, prop) => {
127
+ fields: finalFields?.reduce((obj, prop) => {
127
128
  this.logger.debug(`Get or create GraphQL input type for property ${prop.name}`);
128
129
  return {
129
130
  ...obj,
@@ -147,7 +148,7 @@ class GraphQLTypeInformer {
147
148
  const finalFields = (0, common_1.nonExcludedFields)(classMetadata.fields, excludeProps);
148
149
  return new graphql_1.GraphQLObjectType({
149
150
  name: classMetadata.name,
150
- fields: finalFields === null || finalFields === void 0 ? void 0 : finalFields.reduce((obj, prop) => {
151
+ fields: finalFields?.reduce((obj, prop) => {
151
152
  this.logger.debug(`Get or create GraphQL output type for property ${prop.name}`);
152
153
  return {
153
154
  ...obj,