@cratis/chronicle 4.0.0 → 5.0.0
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/ChronicleClient.ts +3 -3
- package/EventStore.ts +3 -3
- package/connection/ChronicleConnection.ts +6 -0
- package/connection/ChronicleServices.ts +2 -0
- package/connection/callResults.ts +23 -0
- package/dist/ChronicleClient.js +3 -3
- package/dist/ChronicleClient.js.map +1 -1
- package/dist/EventStore.js +3 -3
- package/dist/EventStore.js.map +1 -1
- package/dist/connection/ChronicleConnection.d.ts +1 -0
- package/dist/connection/ChronicleConnection.d.ts.map +1 -1
- package/dist/connection/ChronicleConnection.js +5 -1
- package/dist/connection/ChronicleConnection.js.map +1 -1
- package/dist/connection/ChronicleServices.d.ts +2 -1
- package/dist/connection/ChronicleServices.d.ts.map +1 -1
- package/dist/connection/callResults.d.ts +13 -0
- package/dist/connection/callResults.d.ts.map +1 -1
- package/dist/connection/callResults.js +14 -0
- package/dist/connection/callResults.js.map +1 -1
- package/dist/eventSequences/EventSequence.d.ts +2 -2
- package/dist/eventSequences/EventSequence.d.ts.map +1 -1
- package/dist/eventSequences/EventSequence.js +39 -57
- package/dist/eventSequences/EventSequence.js.map +1 -1
- package/dist/events/EventTypes.d.ts.map +1 -1
- package/dist/events/EventTypes.js +3 -2
- package/dist/events/EventTypes.js.map +1 -1
- package/dist/jobs/Jobs.js +3 -3
- package/dist/jobs/Jobs.js.map +1 -1
- package/dist/observation/toObserverRunningState.js +1 -1
- package/dist/observation/toObserverRunningState.js.map +1 -1
- package/dist/readModels/ReadModels.d.ts.map +1 -1
- package/dist/readModels/ReadModels.js +8 -6
- package/dist/readModels/ReadModels.js.map +1 -1
- package/dist/seeding/EventSeeding.d.ts.map +1 -1
- package/dist/seeding/EventSeeding.js +2 -1
- package/dist/seeding/EventSeeding.js.map +1 -1
- package/dist/webhooks/Webhooks.d.ts.map +1 -1
- package/dist/webhooks/Webhooks.js +22 -10
- package/dist/webhooks/Webhooks.js.map +1 -1
- package/eventSequences/EventSequence.spec.ts +83 -74
- package/eventSequences/EventSequence.ts +44 -63
- package/events/EventTypes.ts +3 -2
- package/jobs/Jobs.ts +3 -3
- package/observation/toObserverRunningState.ts +1 -1
- package/package.json +6 -6
- package/readModels/ReadModels.ts +8 -6
- package/seeding/EventSeeding.ts +2 -1
- package/webhooks/Webhooks.ts +24 -10
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Cratis. All rights reserved.
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
import { diag } from '@opentelemetry/api';
|
|
4
|
+
import { ensureCommandSuccess } from '../connection/callResults';
|
|
4
5
|
import { EventStoreNamespaceName } from '../EventStoreNamespaceName';
|
|
5
6
|
import { getEventTypeFor } from '../events/eventTypeDecorator';
|
|
6
7
|
import { getTagsFor } from '../events/tagDecorator';
|
|
@@ -72,7 +73,7 @@ export class EventSeeding {
|
|
|
72
73
|
ByEventSource: this.toEventSourceSeedEntries(entries)
|
|
73
74
|
}))
|
|
74
75
|
};
|
|
75
|
-
await this._connection.eventSeeding.
|
|
76
|
+
ensureCommandSuccess('seed events', await this._connection.eventSeeding.seedEvents(request));
|
|
76
77
|
this._entries.length = 0;
|
|
77
78
|
}
|
|
78
79
|
addScoped(eventSourceId, events, targetNamespace) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventSeeding.js","sourceRoot":"","sources":["../../seeding/EventSeeding.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"EventSeeding.js","sourceRoot":"","sources":["../../seeding/EventSeeding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Webhooks.d.ts","sourceRoot":"","sources":["../../webhooks/Webhooks.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"Webhooks.d.ts","sourceRoot":"","sources":["../../webhooks/Webhooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD;;GAEG;AACH,qBAAa,QAAS,YAAW,SAAS;IAWlC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAbrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IAEpE;;;;;;OAMG;gBAEkB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,mBAAmB,EAChC,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,wBAAwB;IAG/D,kBAAkB;IACZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,kBAAkB;IACZ,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAezC,kBAAkB;IACZ,QAAQ,CACV,SAAS,EAAE,SAAS,GAAG,MAAM,EAC7B,SAAS,EAAE,gBAAgB,GAAG,MAAM,EACpC,SAAS,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,GACxD,OAAO,CAAC,IAAI,CAAC;IAchB,kBAAkB;IACZ,WAAW,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAoBjD,kBAAkB;IACZ,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1D,OAAO,CAAC,eAAe;CAqB1B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright (c) Cratis. All rights reserved.
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
-
import {
|
|
3
|
+
import { ensureCommandSuccess, ensureQuerySuccess } from '../connection/callResults';
|
|
4
4
|
import { EventSequenceId } from '../eventSequences/EventSequenceId';
|
|
5
5
|
import { WebhookDefinitionBuilder } from './WebhookDefinitionBuilder';
|
|
6
6
|
import { WebhookId } from './WebhookId';
|
|
@@ -48,33 +48,45 @@ export class Webhooks {
|
|
|
48
48
|
if (this._discovered.size === 0) {
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
|
-
await this._connection.webhooks.
|
|
51
|
+
ensureCommandSuccess('register discovered webhooks', await this._connection.webhooks.addWebhooks({
|
|
52
52
|
EventStore: this._eventStore,
|
|
53
|
-
Owner: ObserverOwner.Client,
|
|
54
53
|
Webhooks: [...this._discovered.values()]
|
|
55
|
-
});
|
|
54
|
+
}));
|
|
56
55
|
}
|
|
57
56
|
/** @inheritdoc */
|
|
58
57
|
async register(webhookId, targetUrl, configure) {
|
|
59
58
|
const definition = this.buildDefinition(undefined, typeof webhookId === 'string' ? new WebhookId(webhookId) : webhookId, typeof targetUrl === 'string' ? new WebhookTargetUrl(targetUrl) : targetUrl, configure);
|
|
60
|
-
await this._connection.webhooks.
|
|
59
|
+
ensureCommandSuccess('register webhook', await this._connection.webhooks.addWebhooks({
|
|
61
60
|
EventStore: this._eventStore,
|
|
62
|
-
Owner: ObserverOwner.Client,
|
|
63
61
|
Webhooks: [definition]
|
|
64
|
-
});
|
|
62
|
+
}));
|
|
65
63
|
}
|
|
66
64
|
/** @inheritdoc */
|
|
67
65
|
async getWebhooks() {
|
|
68
66
|
const response = await this._connection.webhooks.getWebhooks({ EventStore: this._eventStore });
|
|
69
|
-
|
|
67
|
+
const details = ensureQuerySuccess('get webhooks', response) ?? [];
|
|
68
|
+
// The kernel does not return authorization details on read-back, so the reconstructed target
|
|
69
|
+
// always carries no authorization, mirroring the C# client's WebhookTarget mapping.
|
|
70
|
+
return details.map(webhook => ({
|
|
71
|
+
EventSequenceId: webhook.EventSequenceId,
|
|
72
|
+
Identifier: webhook.Identifier,
|
|
73
|
+
EventTypes: webhook.EventTypes,
|
|
74
|
+
Target: {
|
|
75
|
+
Url: webhook.Url,
|
|
76
|
+
Authorization: undefined,
|
|
77
|
+
Headers: webhook.Headers
|
|
78
|
+
},
|
|
79
|
+
IsReplayable: webhook.IsReplayable,
|
|
80
|
+
IsActive: webhook.IsActive
|
|
81
|
+
}));
|
|
70
82
|
}
|
|
71
83
|
/** @inheritdoc */
|
|
72
84
|
async remove(webhookId) {
|
|
73
85
|
const id = typeof webhookId === 'string' ? webhookId : webhookId.value;
|
|
74
|
-
await this._connection.webhooks.
|
|
86
|
+
ensureCommandSuccess('remove webhook', await this._connection.webhooks.removeWebhooks({
|
|
75
87
|
EventStore: this._eventStore,
|
|
76
88
|
Webhooks: [id]
|
|
77
|
-
});
|
|
89
|
+
}));
|
|
78
90
|
}
|
|
79
91
|
buildDefinition(type, id, targetUrl, configure, eventSequenceId) {
|
|
80
92
|
const builder = new WebhookDefinitionBuilder(this._eventTypes);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Webhooks.js","sourceRoot":"","sources":["../../webhooks/Webhooks.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;
|
|
1
|
+
{"version":3,"file":"Webhooks.js","sourceRoot":"","sources":["../../webhooks/Webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,12 +27,12 @@ function createEventSequence(
|
|
|
27
27
|
const eventSequences = {
|
|
28
28
|
redact: vi.fn().mockResolvedValue({}),
|
|
29
29
|
redactForEventSource: vi.fn().mockResolvedValue({}),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
completeStream: vi.fn().mockResolvedValue({ IsSuccess: true, SequenceNumber: 3n, Error: 0 }),
|
|
34
|
-
|
|
35
|
-
append: vi.fn().mockResolvedValue({ SequenceNumber: 0n, ConstraintViolations: [], Errors: [] }),
|
|
30
|
+
forEventSourceIdAndEventTypes: vi.fn().mockResolvedValue({ Data: [] }),
|
|
31
|
+
fromSequenceNumber: vi.fn().mockResolvedValue({ Data: [] }),
|
|
32
|
+
tailSequenceNumber: vi.fn().mockResolvedValue({ Data: { SequenceNumber: EventSequenceNumber.unset.value } }),
|
|
33
|
+
completeStream: vi.fn().mockResolvedValue({ Response: { IsSuccess: true, SequenceNumber: 3n, Error: 0 } }),
|
|
34
|
+
appendManyForEventSources: vi.fn().mockResolvedValue({ Response: { SequenceNumbers: [], ConstraintViolations: [], Errors: [] } }),
|
|
35
|
+
append: vi.fn().mockResolvedValue({ Response: { SequenceNumber: 0n, ConstraintViolations: [], Errors: [] } }),
|
|
36
36
|
...overrides
|
|
37
37
|
};
|
|
38
38
|
const observers = {
|
|
@@ -53,11 +53,11 @@ function createEventSequence(
|
|
|
53
53
|
eventSequence,
|
|
54
54
|
redact: eventSequences.redact,
|
|
55
55
|
redactForEventSource: eventSequences.redactForEventSource,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
forEventSourceIdAndEventTypes: eventSequences.forEventSourceIdAndEventTypes,
|
|
57
|
+
fromSequenceNumber: eventSequences.fromSequenceNumber,
|
|
58
|
+
tailSequenceNumber: eventSequences.tailSequenceNumber,
|
|
59
59
|
completeStream: eventSequences.completeStream,
|
|
60
|
-
|
|
60
|
+
appendManyForEventSources: eventSequences.appendManyForEventSources,
|
|
61
61
|
append: eventSequences.append,
|
|
62
62
|
waitForCompletion: observers.waitForCompletion
|
|
63
63
|
};
|
|
@@ -144,24 +144,24 @@ describe('EventSequence', () => {
|
|
|
144
144
|
expect(redactForEventSource).toHaveBeenCalledTimes(1);
|
|
145
145
|
const request = redactForEventSource.mock.calls[0][0];
|
|
146
146
|
expect(request.EventTypes).toEqual([
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
'a3f6a2f0-6f2f-4a3c-9d3f-6f2f4a3c9d3f',
|
|
148
|
+
'b3f6a2f0-6f2f-4a3c-9d3f-6f2f4a3c9d3g'
|
|
149
149
|
]);
|
|
150
150
|
});
|
|
151
151
|
});
|
|
152
152
|
|
|
153
153
|
describe('when getting events for an event source and event types', () => {
|
|
154
|
-
const { eventSequence,
|
|
155
|
-
|
|
154
|
+
const { eventSequence, forEventSourceIdAndEventTypes } = createEventSequence({
|
|
155
|
+
forEventSourceIdAndEventTypes: vi.fn().mockResolvedValue({ Data: [wireAppendedEvent()] })
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
it('should call the RPC with the resolved event type filter and map the response', async () => {
|
|
159
159
|
const result = await eventSequence.getForEventSourceIdAndEventTypes('some-event-source', [SomethingHappened]);
|
|
160
160
|
|
|
161
|
-
expect(
|
|
162
|
-
const request =
|
|
161
|
+
expect(forEventSourceIdAndEventTypes).toHaveBeenCalledTimes(1);
|
|
162
|
+
const request = forEventSourceIdAndEventTypes.mock.calls[0][0];
|
|
163
163
|
expect(request.EventSourceId).toEqual('some-event-source');
|
|
164
|
-
expect(request.
|
|
164
|
+
expect(request.EventTypeIds).toEqual('a3f6a2f0-6f2f-4a3c-9d3f-6f2f4a3c9d3f');
|
|
165
165
|
|
|
166
166
|
expect(result).toHaveLength(1);
|
|
167
167
|
expect(result[0].context.sequenceNumber).toEqual(7n);
|
|
@@ -173,18 +173,18 @@ describe('EventSequence', () => {
|
|
|
173
173
|
});
|
|
174
174
|
|
|
175
175
|
describe('when getting events from a sequence number', () => {
|
|
176
|
-
const { eventSequence,
|
|
177
|
-
|
|
176
|
+
const { eventSequence, fromSequenceNumber } = createEventSequence({
|
|
177
|
+
fromSequenceNumber: vi.fn().mockResolvedValue({ Data: [wireAppendedEvent()] })
|
|
178
178
|
});
|
|
179
179
|
|
|
180
180
|
it('should call the RPC starting from the given sequence number and map the response', async () => {
|
|
181
181
|
const result = await eventSequence.getFromSequenceNumber(new EventSequenceNumber(7n), 'some-event-source', [SomethingHappened]);
|
|
182
182
|
|
|
183
|
-
expect(
|
|
184
|
-
const request =
|
|
183
|
+
expect(fromSequenceNumber).toHaveBeenCalledTimes(1);
|
|
184
|
+
const request = fromSequenceNumber.mock.calls[0][0];
|
|
185
185
|
expect(request.FromEventSequenceNumber).toEqual(7n);
|
|
186
186
|
expect(request.EventSourceId).toEqual('some-event-source');
|
|
187
|
-
expect(request.
|
|
187
|
+
expect(request.EventTypeIds).toEqual('a3f6a2f0-6f2f-4a3c-9d3f-6f2f4a3c9d3f');
|
|
188
188
|
|
|
189
189
|
expect(result).toHaveLength(1);
|
|
190
190
|
expect(result[0].content).toEqual({ value: 'hello' });
|
|
@@ -192,21 +192,21 @@ describe('EventSequence', () => {
|
|
|
192
192
|
});
|
|
193
193
|
|
|
194
194
|
describe('when getting the next sequence number and the sequence is empty', () => {
|
|
195
|
-
const { eventSequence,
|
|
196
|
-
|
|
195
|
+
const { eventSequence, tailSequenceNumber } = createEventSequence({
|
|
196
|
+
tailSequenceNumber: vi.fn().mockResolvedValue({ Data: { SequenceNumber: EventSequenceNumber.unset.value } })
|
|
197
197
|
});
|
|
198
198
|
|
|
199
199
|
it('should return the first sequence number', async () => {
|
|
200
200
|
const result = await eventSequence.getNextSequenceNumber();
|
|
201
201
|
|
|
202
|
-
expect(
|
|
202
|
+
expect(tailSequenceNumber).toHaveBeenCalledTimes(1);
|
|
203
203
|
expect(result.value).toEqual(EventSequenceNumber.first.value);
|
|
204
204
|
});
|
|
205
205
|
});
|
|
206
206
|
|
|
207
207
|
describe('when getting the next sequence number and events already exist', () => {
|
|
208
208
|
const { eventSequence } = createEventSequence({
|
|
209
|
-
|
|
209
|
+
tailSequenceNumber: vi.fn().mockResolvedValue({ Data: { SequenceNumber: 41n } })
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
it('should return one past the tail sequence number', async () => {
|
|
@@ -221,23 +221,23 @@ describe('EventSequence', () => {
|
|
|
221
221
|
async somethingHappened(): Promise<void> {}
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
const { eventSequence,
|
|
225
|
-
|
|
224
|
+
const { eventSequence, tailSequenceNumber } = createEventSequence({
|
|
225
|
+
tailSequenceNumber: vi.fn().mockResolvedValue({ Data: { SequenceNumber: 5n } })
|
|
226
226
|
});
|
|
227
227
|
|
|
228
228
|
it('should filter the tail sequence number lookup to the event types the observer handles', async () => {
|
|
229
229
|
await eventSequence.getTailSequenceNumberForObserver(SomeReactor);
|
|
230
230
|
|
|
231
|
-
expect(
|
|
232
|
-
const request =
|
|
233
|
-
expect(request.
|
|
234
|
-
expect(request.
|
|
231
|
+
expect(tailSequenceNumber).toHaveBeenCalledTimes(1);
|
|
232
|
+
const request = tailSequenceNumber.mock.calls[0][0];
|
|
233
|
+
expect(request.EventTypeIds).toContain('a3f6a2f0-6f2f-4a3c-9d3f-6f2f4a3c9d3f');
|
|
234
|
+
expect(request.EventTypeIds).not.toContain('b3f6a2f0-6f2f-4a3c-9d3f-6f2f4a3c9d3g');
|
|
235
235
|
});
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
describe('when completing a non-default stream successfully', () => {
|
|
239
239
|
const { eventSequence, completeStream } = createEventSequence({
|
|
240
|
-
completeStream: vi.fn().mockResolvedValue({ IsSuccess: true, SequenceNumber: 9n, Error: 0 })
|
|
240
|
+
completeStream: vi.fn().mockResolvedValue({ Response: { IsSuccess: true, SequenceNumber: 9n, Error: 0 } })
|
|
241
241
|
});
|
|
242
242
|
|
|
243
243
|
it('should call the RPC and return the tail sequence number', async () => {
|
|
@@ -257,7 +257,7 @@ describe('EventSequence', () => {
|
|
|
257
257
|
|
|
258
258
|
describe('when completing the default stream', () => {
|
|
259
259
|
const { eventSequence } = createEventSequence({
|
|
260
|
-
completeStream: vi.fn().mockResolvedValue({ IsSuccess: false, SequenceNumber: 0n, Error: 1 })
|
|
260
|
+
completeStream: vi.fn().mockResolvedValue({ Response: { IsSuccess: false, SequenceNumber: 0n, Error: 1 } })
|
|
261
261
|
});
|
|
262
262
|
|
|
263
263
|
it('should return the DefaultStreamCannotBeCompleted error', async () => {
|
|
@@ -272,7 +272,7 @@ describe('EventSequence', () => {
|
|
|
272
272
|
|
|
273
273
|
describe('when completing an already-completed stream', () => {
|
|
274
274
|
const { eventSequence } = createEventSequence({
|
|
275
|
-
completeStream: vi.fn().mockResolvedValue({ IsSuccess: false, SequenceNumber: 0n, Error: 0 })
|
|
275
|
+
completeStream: vi.fn().mockResolvedValue({ Response: { IsSuccess: false, SequenceNumber: 0n, Error: 0 } })
|
|
276
276
|
});
|
|
277
277
|
|
|
278
278
|
it('should return the AlreadyCompleted error', async () => {
|
|
@@ -286,7 +286,7 @@ describe('EventSequence', () => {
|
|
|
286
286
|
});
|
|
287
287
|
|
|
288
288
|
describe('when appending many events for distinct event sources with a shared concurrency scope option', () => {
|
|
289
|
-
const { eventSequence,
|
|
289
|
+
const { eventSequence, appendManyForEventSources } = createEventSequence();
|
|
290
290
|
|
|
291
291
|
it('should apply the same concurrency scope to every distinct event source id', async () => {
|
|
292
292
|
await eventSequence.appendMany(
|
|
@@ -296,15 +296,16 @@ describe('EventSequence', () => {
|
|
|
296
296
|
],
|
|
297
297
|
{ concurrencyScope: { sequenceNumber: 5n } });
|
|
298
298
|
|
|
299
|
-
expect(
|
|
300
|
-
const request =
|
|
301
|
-
|
|
302
|
-
expect(
|
|
299
|
+
expect(appendManyForEventSources).toHaveBeenCalledTimes(1);
|
|
300
|
+
const request = appendManyForEventSources.mock.calls[0][0];
|
|
301
|
+
const scopeFor = (eventSourceId: string) => request.ConcurrencyScopes.find((s: { EventSourceId: string }) => s.EventSourceId === eventSourceId).Scope;
|
|
302
|
+
expect(scopeFor('source-1').SequenceNumber).toEqual(5n);
|
|
303
|
+
expect(scopeFor('source-2').SequenceNumber).toEqual(5n);
|
|
303
304
|
});
|
|
304
305
|
});
|
|
305
306
|
|
|
306
307
|
describe('when appending many events for distinct event sources with a per-event-source-id concurrency scope map', () => {
|
|
307
|
-
const { eventSequence,
|
|
308
|
+
const { eventSequence, appendManyForEventSources } = createEventSequence();
|
|
308
309
|
|
|
309
310
|
it('should apply the distinct concurrency scope for each event source id', async () => {
|
|
310
311
|
await eventSequence.appendMany(
|
|
@@ -319,15 +320,16 @@ describe('EventSequence', () => {
|
|
|
319
320
|
}
|
|
320
321
|
});
|
|
321
322
|
|
|
322
|
-
expect(
|
|
323
|
-
const request =
|
|
324
|
-
|
|
325
|
-
expect(
|
|
323
|
+
expect(appendManyForEventSources).toHaveBeenCalledTimes(1);
|
|
324
|
+
const request = appendManyForEventSources.mock.calls[0][0];
|
|
325
|
+
const scopeFor = (eventSourceId: string) => request.ConcurrencyScopes.find((s: { EventSourceId: string }) => s.EventSourceId === eventSourceId).Scope;
|
|
326
|
+
expect(scopeFor('source-1').SequenceNumber).toEqual(5n);
|
|
327
|
+
expect(scopeFor('source-2').SequenceNumber).toEqual(9n);
|
|
326
328
|
});
|
|
327
329
|
});
|
|
328
330
|
|
|
329
331
|
describe('when appending many events with a per-event-source-id map that only covers some sources', () => {
|
|
330
|
-
const { eventSequence,
|
|
332
|
+
const { eventSequence, appendManyForEventSources } = createEventSequence();
|
|
331
333
|
|
|
332
334
|
it('should fall back to the shared concurrency scope for sources without a map entry', async () => {
|
|
333
335
|
await eventSequence.appendMany(
|
|
@@ -342,15 +344,16 @@ describe('EventSequence', () => {
|
|
|
342
344
|
}
|
|
343
345
|
});
|
|
344
346
|
|
|
345
|
-
expect(
|
|
346
|
-
const request =
|
|
347
|
-
|
|
348
|
-
expect(
|
|
347
|
+
expect(appendManyForEventSources).toHaveBeenCalledTimes(1);
|
|
348
|
+
const request = appendManyForEventSources.mock.calls[0][0];
|
|
349
|
+
const scopeFor = (eventSourceId: string) => request.ConcurrencyScopes.find((s: { EventSourceId: string }) => s.EventSourceId === eventSourceId).Scope;
|
|
350
|
+
expect(scopeFor('source-1').SequenceNumber).toEqual(5n);
|
|
351
|
+
expect(scopeFor('source-2').SequenceNumber).toEqual(1n);
|
|
349
352
|
});
|
|
350
353
|
});
|
|
351
354
|
|
|
352
355
|
describe('when an EventForEventSourceId specifies its own stream targeting', () => {
|
|
353
|
-
const { eventSequence,
|
|
356
|
+
const { eventSequence, appendManyForEventSources } = createEventSequence();
|
|
354
357
|
|
|
355
358
|
it('should use the wrapper\'s own event stream type, id, source type, and subject', async () => {
|
|
356
359
|
await eventSequence.appendMany([
|
|
@@ -364,8 +367,8 @@ describe('EventSequence', () => {
|
|
|
364
367
|
}
|
|
365
368
|
]);
|
|
366
369
|
|
|
367
|
-
expect(
|
|
368
|
-
const request =
|
|
370
|
+
expect(appendManyForEventSources).toHaveBeenCalledTimes(1);
|
|
371
|
+
const request = appendManyForEventSources.mock.calls[0][0];
|
|
369
372
|
const [event] = request.Events;
|
|
370
373
|
expect(event.EventStreamType).toEqual('custom-stream-type');
|
|
371
374
|
expect(event.EventStreamId).toEqual('custom-stream-id');
|
|
@@ -375,15 +378,15 @@ describe('EventSequence', () => {
|
|
|
375
378
|
});
|
|
376
379
|
|
|
377
380
|
describe('when an EventForEventSourceId does not specify stream targeting', () => {
|
|
378
|
-
const { eventSequence,
|
|
381
|
+
const { eventSequence, appendManyForEventSources } = createEventSequence();
|
|
379
382
|
|
|
380
383
|
it('should default to the default stream type, the event source id as stream id, and the event source id as subject', async () => {
|
|
381
384
|
await eventSequence.appendMany([
|
|
382
385
|
{ eventSourceId: 'source-1', event: new SomethingHappened('a') }
|
|
383
386
|
]);
|
|
384
387
|
|
|
385
|
-
expect(
|
|
386
|
-
const request =
|
|
388
|
+
expect(appendManyForEventSources).toHaveBeenCalledTimes(1);
|
|
389
|
+
const request = appendManyForEventSources.mock.calls[0][0];
|
|
387
390
|
const [event] = request.Events;
|
|
388
391
|
expect(event.EventStreamType).toEqual('Default');
|
|
389
392
|
expect(event.EventStreamId).toEqual('source-1');
|
|
@@ -394,7 +397,7 @@ describe('EventSequence', () => {
|
|
|
394
397
|
|
|
395
398
|
describe('when subscribing to appendOperations and appending a single event', () => {
|
|
396
399
|
const { eventSequence } = createEventSequence({
|
|
397
|
-
append: vi.fn().mockResolvedValue({ SequenceNumber: 42n, ConstraintViolations: [], Errors: [] })
|
|
400
|
+
append: vi.fn().mockResolvedValue({ Response: { SequenceNumber: 42n, ConstraintViolations: [], Errors: [] } })
|
|
398
401
|
});
|
|
399
402
|
|
|
400
403
|
it('should publish the appended event and its result to the subscriber', async () => {
|
|
@@ -416,7 +419,7 @@ describe('EventSequence', () => {
|
|
|
416
419
|
|
|
417
420
|
describe('when subscribing to appendOperations and appending many events', () => {
|
|
418
421
|
const { eventSequence } = createEventSequence({
|
|
419
|
-
|
|
422
|
+
appendManyForEventSources: vi.fn().mockResolvedValue({ Response: { SequenceNumbers: [10n, 11n], ConstraintViolations: [], Errors: [] } })
|
|
420
423
|
});
|
|
421
424
|
|
|
422
425
|
it('should publish the full batch to the subscriber', async () => {
|
|
@@ -439,7 +442,7 @@ describe('EventSequence', () => {
|
|
|
439
442
|
|
|
440
443
|
describe('when two subscribers are iterating appendOperations at the same time', () => {
|
|
441
444
|
const { eventSequence } = createEventSequence({
|
|
442
|
-
append: vi.fn().mockResolvedValue({ SequenceNumber: 1n, ConstraintViolations: [], Errors: [] })
|
|
445
|
+
append: vi.fn().mockResolvedValue({ Response: { SequenceNumber: 1n, ConstraintViolations: [], Errors: [] } })
|
|
443
446
|
});
|
|
444
447
|
|
|
445
448
|
it('should multicast the same append to every subscriber', async () => {
|
|
@@ -457,7 +460,7 @@ describe('EventSequence', () => {
|
|
|
457
460
|
|
|
458
461
|
describe('when nobody is subscribed to appendOperations', () => {
|
|
459
462
|
const { eventSequence } = createEventSequence({
|
|
460
|
-
append: vi.fn().mockResolvedValue({ SequenceNumber: 1n, ConstraintViolations: [], Errors: [] })
|
|
463
|
+
append: vi.fn().mockResolvedValue({ Response: { SequenceNumber: 1n, ConstraintViolations: [], Errors: [] } })
|
|
461
464
|
});
|
|
462
465
|
|
|
463
466
|
it('should still complete the append normally', async () => {
|
|
@@ -470,7 +473,7 @@ describe('EventSequence', () => {
|
|
|
470
473
|
|
|
471
474
|
describe('when waiting for completion after a successful append', () => {
|
|
472
475
|
const { eventSequence, waitForCompletion } = createEventSequence(
|
|
473
|
-
{ append: vi.fn().mockResolvedValue({ SequenceNumber: 42n, ConstraintViolations: [], Errors: [] }) },
|
|
476
|
+
{ append: vi.fn().mockResolvedValue({ Response: { SequenceNumber: 42n, ConstraintViolations: [], Errors: [] } }) },
|
|
474
477
|
{ waitForCompletion: vi.fn().mockResolvedValue({ IsSuccess: true, FailedPartitions: [] }) });
|
|
475
478
|
|
|
476
479
|
it('should call the WaitForCompletion RPC with the appended tail sequence number', async () => {
|
|
@@ -498,7 +501,7 @@ describe('EventSequence', () => {
|
|
|
498
501
|
|
|
499
502
|
describe('when waiting for completion and observers report a failed partition', () => {
|
|
500
503
|
const { eventSequence } = createEventSequence(
|
|
501
|
-
{ append: vi.fn().mockResolvedValue({ SequenceNumber: 42n, ConstraintViolations: [], Errors: [] }) },
|
|
504
|
+
{ append: vi.fn().mockResolvedValue({ Response: { SequenceNumber: 42n, ConstraintViolations: [], Errors: [] } }) },
|
|
502
505
|
{
|
|
503
506
|
waitForCompletion: vi.fn().mockResolvedValue({
|
|
504
507
|
IsSuccess: false,
|
|
@@ -525,9 +528,11 @@ describe('EventSequence', () => {
|
|
|
525
528
|
describe('when waiting for completion after an append that itself failed', () => {
|
|
526
529
|
const { eventSequence, waitForCompletion } = createEventSequence({
|
|
527
530
|
append: vi.fn().mockResolvedValue({
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
+
Response: {
|
|
532
|
+
SequenceNumber: 0n,
|
|
533
|
+
ConstraintViolations: [{ ConstraintId: 'unique', Message: 'Value must be unique', Details: {} }],
|
|
534
|
+
Errors: []
|
|
535
|
+
}
|
|
531
536
|
})
|
|
532
537
|
});
|
|
533
538
|
|
|
@@ -544,10 +549,12 @@ describe('EventSequence', () => {
|
|
|
544
549
|
describe('when a single append fails with a concurrency violation', () => {
|
|
545
550
|
const { eventSequence } = createEventSequence({
|
|
546
551
|
append: vi.fn().mockResolvedValue({
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
552
|
+
Response: {
|
|
553
|
+
SequenceNumber: 18446744073709551615n,
|
|
554
|
+
ConstraintViolations: [],
|
|
555
|
+
Errors: [],
|
|
556
|
+
ConcurrencyViolation: { EventSourceId: 'some-event-source', ExpectedSequenceNumber: 1n, ActualSequenceNumber: 2n }
|
|
557
|
+
}
|
|
551
558
|
})
|
|
552
559
|
});
|
|
553
560
|
|
|
@@ -565,11 +572,13 @@ describe('EventSequence', () => {
|
|
|
565
572
|
|
|
566
573
|
describe('when appendMany fails with a concurrency violation', () => {
|
|
567
574
|
const { eventSequence } = createEventSequence({
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
575
|
+
appendManyForEventSources: vi.fn().mockResolvedValue({
|
|
576
|
+
Response: {
|
|
577
|
+
SequenceNumbers: [18446744073709551615n],
|
|
578
|
+
ConstraintViolations: [],
|
|
579
|
+
Errors: [],
|
|
580
|
+
ConcurrencyViolations: [{ EventSourceId: 'some-event-source', ExpectedSequenceNumber: 1n, ActualSequenceNumber: 2n }]
|
|
581
|
+
}
|
|
573
582
|
})
|
|
574
583
|
});
|
|
575
584
|
|