@enbox/dwn-sdk-js 0.3.0 → 0.3.1
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/browser.mjs +6 -6
- package/dist/browser.mjs.map +3 -3
- package/dist/esm/generated/precompiled-validators.js +704 -342
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +1 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +151 -20
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +7 -0
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +1 -1
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +7 -0
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +3 -2
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +1 -1
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/utils/messages.js +41 -1
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/tests/event-emitter-event-log.spec.js +214 -81
- package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +288 -0
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts +50 -34
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +1 -0
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +34 -4
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +4 -3
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +4 -3
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +14 -4
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +8 -4
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/subscriptions.d.ts +73 -20
- package/dist/types/src/types/subscriptions.d.ts.map +1 -1
- package/dist/types/src/utils/messages.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/utils/test-data-generator.d.ts +5 -4
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/dwn-error.ts +1 -0
- package/src/event-stream/event-emitter-event-log.ts +169 -21
- package/src/handlers/messages-subscribe.ts +8 -1
- package/src/handlers/protocols-configure.ts +1 -1
- package/src/handlers/records-subscribe.ts +8 -1
- package/src/handlers/records-write.ts +3 -2
- package/src/index.ts +1 -1
- package/src/interfaces/messages-subscribe.ts +4 -3
- package/src/interfaces/records-subscribe.ts +4 -3
- package/src/store/storage-controller.ts +1 -1
- package/src/types/messages-types.ts +12 -4
- package/src/types/records-types.ts +6 -4
- package/src/types/subscriptions.ts +78 -20
- package/src/utils/messages.ts +47 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-controller.js","sourceRoot":"","sources":["../../../../src/store/storage-controller.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAanF;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAEpB,YAAY,CAAe;IAC3B,SAAS,CAAY;IACrB,UAAU,CAAa;IACvB,QAAQ,CAAY;IAE5B,YAAmB,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAI3C;QAErB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAA8B;QAC/E,+CAA+C;QAC/C,MAAM,KAAK,GAAG;YACZ,SAAS,EAAG,gBAAgB,CAAC,OAAO;YACpC,QAAQ,EAAI,OAAO,CAAC,UAAU,CAAC,QAAQ;SACxC,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,CAAE,KAAK,CAAE,CAAC,CAAC;QAExF,8EAA8E;QAC9E,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAE/E,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,yIAAyI;QACzI,4FAA4F;QAC5F,2IAA2I;QAE3I,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE1D,oCAAoC;QACpC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"storage-controller.js","sourceRoot":"","sources":["../../../../src/store/storage-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,26 @@ export class Messages {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
messagesQueryFilters.push(this.convertFilter(filter));
|
|
55
|
+
// When protocolPathPrefix is used with a protocol, inject a shadow filter
|
|
56
|
+
// for ProtocolsConfigure events. Without this, protocol metadata updates
|
|
57
|
+
// would be excluded (ProtocolsConfigure indexes have no protocolPath).
|
|
58
|
+
// This mirrors the existing core-protocol additional-filter pattern above.
|
|
59
|
+
// The messageTimestamp constraint is carried over so time-bounded queries
|
|
60
|
+
// (including cursor-based subscriptions) also apply to the shadow filter.
|
|
61
|
+
if ((filter.protocolPathPrefix !== undefined || filter.contextIdPrefix !== undefined) && filter.protocol !== undefined) {
|
|
62
|
+
const metadataFilter = {
|
|
63
|
+
interface: 'Protocols',
|
|
64
|
+
method: 'Configure',
|
|
65
|
+
protocol: filter.protocol,
|
|
66
|
+
};
|
|
67
|
+
if (filter.messageTimestamp !== undefined) {
|
|
68
|
+
const timestampFilter = FilterUtility.convertRangeCriterion(filter.messageTimestamp);
|
|
69
|
+
if (timestampFilter) {
|
|
70
|
+
metadataFilter.messageTimestamp = timestampFilter;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
messagesQueryFilters.push(metadataFilter);
|
|
74
|
+
}
|
|
55
75
|
}
|
|
56
76
|
return messagesQueryFilters;
|
|
57
77
|
}
|
|
@@ -60,12 +80,32 @@ export class Messages {
|
|
|
60
80
|
*/
|
|
61
81
|
static convertFilter(filter) {
|
|
62
82
|
const filterCopy = { ...filter };
|
|
63
|
-
const { messageTimestamp } = filter;
|
|
83
|
+
const { messageTimestamp, protocolPathPrefix, contextIdPrefix } = filter;
|
|
64
84
|
const messageTimestampFilter = messageTimestamp ? FilterUtility.convertRangeCriterion(messageTimestamp) : undefined;
|
|
65
85
|
if (messageTimestampFilter) {
|
|
66
86
|
filterCopy.messageTimestamp = messageTimestampFilter;
|
|
67
87
|
delete filterCopy.dateUpdated;
|
|
68
88
|
}
|
|
89
|
+
// Convert protocolPathPrefix into a protocolPath range filter.
|
|
90
|
+
// The range gte: prefix, lt: prefix + '/\uffff' matches:
|
|
91
|
+
// - exact: 'post' (prefix itself)
|
|
92
|
+
// - children: 'post/attachment', 'post/comment', etc.
|
|
93
|
+
// - NOT siblings: 'poster', 'postfix' (excluded because '/' < any alphanumeric)
|
|
94
|
+
if (protocolPathPrefix !== undefined) {
|
|
95
|
+
delete filterCopy.protocolPathPrefix;
|
|
96
|
+
filterCopy.protocolPath = {
|
|
97
|
+
gte: protocolPathPrefix,
|
|
98
|
+
lt: protocolPathPrefix + '/\uffff',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Convert contextIdPrefix into a contextId range filter (same pattern).
|
|
102
|
+
if (contextIdPrefix !== undefined) {
|
|
103
|
+
delete filterCopy.contextIdPrefix;
|
|
104
|
+
filterCopy.contextId = {
|
|
105
|
+
gte: contextIdPrefix,
|
|
106
|
+
lt: contextIdPrefix + '/\uffff',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
69
109
|
return filterCopy;
|
|
70
110
|
}
|
|
71
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/utils/messages.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAGvE;;GAEG;AACH,MAAM,OAAO,QAAQ;IACnB;;OAEG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAAyB;QAEtD,MAAM,oBAAoB,GAAqB,EAAE,CAAC;QAElD,8EAA8E;QAC9E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAEnG,MAAM,cAAc,GAAG;gBACrB,GAAG,MAAM;gBACT,QAAQ;aACT,CAAC;YAEF,6DAA6D;YAC7D,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;gBACnC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;OAUG;IACI,MAAM,CAAC,cAAc,CAAC,OAAyB,EAAE,aAAoC;QAE1F,MAAM,oBAAoB,GAAa,EAAE,CAAC;QAE1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,sFAAsF;YACtF,yFAAyF;YACzF,wFAAwF;YACxF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,KAAK,MAAM,YAAY,IAAI,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC;oBAC/C,MAAM,gBAAgB,GAAG,YAAY,CAAC,gCAAgC,EAAE,CAAC,MAAM,CAAC,CAAC;oBACjF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;wBACnC,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../src/utils/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,34 +9,44 @@ describe('EventEmitterEventLog', () => {
|
|
|
9
9
|
afterAll(async () => {
|
|
10
10
|
await eventLog.close();
|
|
11
11
|
});
|
|
12
|
+
/** Helper to generate unique messageCids for testing. */
|
|
13
|
+
function cid(n) {
|
|
14
|
+
return `bafy-test-cid-${n}`;
|
|
15
|
+
}
|
|
12
16
|
describe('emit()', () => {
|
|
13
|
-
it('should return
|
|
17
|
+
it('should return ProgressToken objects', async () => {
|
|
14
18
|
const tenant = 'did:example:alice';
|
|
15
19
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
//
|
|
20
|
-
expect(
|
|
21
|
-
expect(
|
|
22
|
-
expect(
|
|
23
|
-
expect(
|
|
20
|
+
const token1 = await eventLog.emit(tenant, event, { key: 'val1' }, cid(1));
|
|
21
|
+
const token2 = await eventLog.emit(tenant, event, { key: 'val2' }, cid(2));
|
|
22
|
+
const token3 = await eventLog.emit(tenant, event, { key: 'val3' }, cid(3));
|
|
23
|
+
// Tokens are ProgressToken objects and should be different for each event.
|
|
24
|
+
expect(token1).toBeDefined();
|
|
25
|
+
expect(token2).toBeDefined();
|
|
26
|
+
expect(typeof token1.streamId).toBe('string');
|
|
27
|
+
expect(typeof token1.epoch).toBe('string');
|
|
28
|
+
expect(typeof token1.position).toBe('string');
|
|
29
|
+
expect(typeof token1.messageCid).toBe('string');
|
|
30
|
+
expect(token1.messageCid).toBe(cid(1));
|
|
31
|
+
expect(token1.position).not.toBe(token2.position);
|
|
32
|
+
expect(token2.position).not.toBe(token3.position);
|
|
24
33
|
});
|
|
25
|
-
it('should maintain independent
|
|
34
|
+
it('should maintain independent positions per tenant', async () => {
|
|
26
35
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
// Both are valid
|
|
30
|
-
expect(
|
|
31
|
-
expect(
|
|
32
|
-
|
|
33
|
-
expect(
|
|
36
|
+
const tokenAlice = await eventLog.emit('did:example:alice', event, {}, cid(1));
|
|
37
|
+
const tokenBob = await eventLog.emit('did:example:bob', event, {}, cid(2));
|
|
38
|
+
// Both are valid tokens (first event for each tenant).
|
|
39
|
+
expect(tokenAlice).toBeDefined();
|
|
40
|
+
expect(tokenBob).toBeDefined();
|
|
41
|
+
// Same position (1) but different streamIds.
|
|
42
|
+
expect(tokenAlice.position).toBe(tokenBob.position);
|
|
43
|
+
expect(tokenAlice.streamId).not.toBe(tokenBob.streamId);
|
|
34
44
|
});
|
|
35
|
-
it('should return
|
|
45
|
+
it('should return undefined when EventLog is closed', async () => {
|
|
36
46
|
await eventLog.close();
|
|
37
47
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
38
|
-
const
|
|
39
|
-
expect(
|
|
48
|
+
const token = await eventLog.emit('did:example:alice', event, {}, cid(1));
|
|
49
|
+
expect(token).toBeUndefined();
|
|
40
50
|
// reopen for afterAll cleanup
|
|
41
51
|
await eventLog.open();
|
|
42
52
|
});
|
|
@@ -45,29 +55,31 @@ describe('EventEmitterEventLog', () => {
|
|
|
45
55
|
it('should read all events for a tenant when no cursor is provided', async () => {
|
|
46
56
|
const tenant = 'did:example:alice';
|
|
47
57
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
48
|
-
await eventLog.emit(tenant, event, { schema: 'http://a' });
|
|
49
|
-
await eventLog.emit(tenant, event, { schema: 'http://b' });
|
|
58
|
+
await eventLog.emit(tenant, event, { schema: 'http://a' }, cid(1));
|
|
59
|
+
await eventLog.emit(tenant, event, { schema: 'http://b' }, cid(2));
|
|
50
60
|
const result = await eventLog.read(tenant);
|
|
51
61
|
expect(result.events.length).toBe(2);
|
|
52
62
|
expect(result.cursor).toBeDefined();
|
|
63
|
+
expect(result.cursor.position).toBe('2');
|
|
53
64
|
});
|
|
54
65
|
it('should read events after a cursor', async () => {
|
|
55
66
|
const tenant = 'did:example:alice';
|
|
56
67
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
57
|
-
await eventLog.emit(tenant, event, { schema: 'http://a' });
|
|
58
|
-
const cursor2 = await eventLog.emit(tenant, event, { schema: 'http://b' });
|
|
59
|
-
await eventLog.emit(tenant, event, { schema: 'http://c' });
|
|
68
|
+
await eventLog.emit(tenant, event, { schema: 'http://a' }, cid(1));
|
|
69
|
+
const cursor2 = await eventLog.emit(tenant, event, { schema: 'http://b' }, cid(2));
|
|
70
|
+
await eventLog.emit(tenant, event, { schema: 'http://c' }, cid(3));
|
|
60
71
|
// Read after cursor2 — should only get the third event.
|
|
61
72
|
const result = await eventLog.read(tenant, { cursor: cursor2 });
|
|
62
73
|
expect(result.events.length).toBe(1);
|
|
63
74
|
expect(result.cursor).toBeDefined();
|
|
75
|
+
expect(result.cursor.position).toBe('3');
|
|
64
76
|
});
|
|
65
77
|
it('should apply filters during read', async () => {
|
|
66
78
|
const tenant = 'did:example:alice';
|
|
67
79
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
68
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
69
|
-
await eventLog.emit(tenant, event, { schema: 'http://other' });
|
|
70
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
80
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(1));
|
|
81
|
+
await eventLog.emit(tenant, event, { schema: 'http://other' }, cid(2));
|
|
82
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(3));
|
|
71
83
|
const result = await eventLog.read(tenant, { filters: [{ schema: 'http://match' }] });
|
|
72
84
|
expect(result.events.length).toBe(2);
|
|
73
85
|
});
|
|
@@ -79,48 +91,52 @@ describe('EventEmitterEventLog', () => {
|
|
|
79
91
|
it('should return the input cursor when no new events match', async () => {
|
|
80
92
|
const tenant = 'did:example:alice';
|
|
81
93
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
82
|
-
const lastCursor = await eventLog.emit(tenant, event, {});
|
|
94
|
+
const lastCursor = await eventLog.emit(tenant, event, {}, cid(1));
|
|
83
95
|
// Read after the last event — nothing new.
|
|
84
96
|
const result = await eventLog.read(tenant, { cursor: lastCursor });
|
|
85
97
|
expect(result.events.length).toBe(0);
|
|
86
|
-
expect(result.cursor).
|
|
98
|
+
expect(result.cursor).toEqual(lastCursor);
|
|
87
99
|
});
|
|
88
100
|
it('should respect the limit option', async () => {
|
|
89
101
|
const tenant = 'did:example:alice';
|
|
90
102
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
91
|
-
await eventLog.emit(tenant, event, {});
|
|
92
|
-
await eventLog.emit(tenant, event, {});
|
|
93
|
-
await eventLog.emit(tenant, event, {});
|
|
103
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
104
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
105
|
+
await eventLog.emit(tenant, event, {}, cid(3));
|
|
94
106
|
const result = await eventLog.read(tenant, { limit: 2 });
|
|
95
107
|
expect(result.events.length).toBe(2);
|
|
96
108
|
expect(result.cursor).toBeDefined();
|
|
97
109
|
});
|
|
98
110
|
});
|
|
99
111
|
describe('subscribe() — live only (no cursor)', () => {
|
|
100
|
-
it('should deliver live events to subscriber with
|
|
112
|
+
it('should deliver live events to subscriber with ProgressTokens', async () => {
|
|
101
113
|
const tenant = 'did:example:alice';
|
|
102
114
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
103
115
|
const received = [];
|
|
104
116
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); });
|
|
105
|
-
await eventLog.emit(tenant, event, {});
|
|
106
|
-
await eventLog.emit(tenant, event, {});
|
|
117
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
118
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
119
|
+
// Allow async token construction to settle.
|
|
120
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
107
121
|
expect(received.length).toBe(2);
|
|
108
122
|
expect(received[0].type).toBe('event');
|
|
109
123
|
expect(received[1].type).toBe('event');
|
|
110
124
|
if (received[0].type === 'event') {
|
|
111
|
-
expect(typeof received[0].cursor).toBe('
|
|
112
|
-
expect(received[0].cursor.length).toBeGreaterThan(0);
|
|
125
|
+
expect(typeof received[0].cursor).toBe('object');
|
|
126
|
+
expect(received[0].cursor.streamId.length).toBeGreaterThan(0);
|
|
113
127
|
}
|
|
114
128
|
});
|
|
115
129
|
it('should NOT deliver EOSE when no cursor is provided', async () => {
|
|
116
130
|
const tenant = 'did:example:alice';
|
|
117
131
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
118
132
|
// Emit some events before subscribing.
|
|
119
|
-
await eventLog.emit(tenant, event, {});
|
|
133
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
120
134
|
const received = [];
|
|
121
135
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); });
|
|
122
136
|
// Emit after subscribing.
|
|
123
|
-
await eventLog.emit(tenant, event, {});
|
|
137
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
138
|
+
// Allow async token construction to settle.
|
|
139
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
124
140
|
// Should only have the live event, no EOSE.
|
|
125
141
|
expect(received.length).toBe(1);
|
|
126
142
|
expect(received[0].type).toBe('event');
|
|
@@ -132,9 +148,11 @@ describe('EventEmitterEventLog', () => {
|
|
|
132
148
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); }, {
|
|
133
149
|
filters: [{ schema: 'http://match' }],
|
|
134
150
|
});
|
|
135
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
136
|
-
await eventLog.emit(tenant, event, { schema: 'http://other' });
|
|
137
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
151
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(1));
|
|
152
|
+
await eventLog.emit(tenant, event, { schema: 'http://other' }, cid(2));
|
|
153
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(3));
|
|
154
|
+
// Allow async token construction to settle.
|
|
155
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
138
156
|
expect(received.length).toBe(2);
|
|
139
157
|
});
|
|
140
158
|
it('should stop delivering events after close', async () => {
|
|
@@ -142,10 +160,12 @@ describe('EventEmitterEventLog', () => {
|
|
|
142
160
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
143
161
|
const received = [];
|
|
144
162
|
const sub = await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); });
|
|
145
|
-
await eventLog.emit(tenant, event, {});
|
|
163
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
164
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
146
165
|
expect(received.length).toBe(1);
|
|
147
166
|
await sub.close();
|
|
148
|
-
await eventLog.emit(tenant, event, {});
|
|
167
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
168
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
149
169
|
expect(received.length).toBe(1); // no new events after close
|
|
150
170
|
});
|
|
151
171
|
});
|
|
@@ -154,9 +174,9 @@ describe('EventEmitterEventLog', () => {
|
|
|
154
174
|
const tenant = 'did:example:alice';
|
|
155
175
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
156
176
|
// Emit 3 events, capture the first cursor.
|
|
157
|
-
const cursor1 = await eventLog.emit(tenant, event, { idx: '1' });
|
|
158
|
-
await eventLog.emit(tenant, event, { idx: '2' });
|
|
159
|
-
await eventLog.emit(tenant, event, { idx: '3' });
|
|
177
|
+
const cursor1 = await eventLog.emit(tenant, event, { idx: '1' }, cid(1));
|
|
178
|
+
await eventLog.emit(tenant, event, { idx: '2' }, cid(2));
|
|
179
|
+
await eventLog.emit(tenant, event, { idx: '3' }, cid(3));
|
|
160
180
|
// Subscribe with cursor from first event — should replay events 2 and 3.
|
|
161
181
|
const received = [];
|
|
162
182
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); }, { cursor: cursor1 });
|
|
@@ -165,17 +185,17 @@ describe('EventEmitterEventLog', () => {
|
|
|
165
185
|
expect(received[0].type).toBe('event');
|
|
166
186
|
expect(received[1].type).toBe('event');
|
|
167
187
|
expect(received[2].type).toBe('eose');
|
|
168
|
-
//
|
|
188
|
+
// Tokens should be different between events.
|
|
169
189
|
if (received[0].type === 'event' && received[1].type === 'event') {
|
|
170
|
-
expect(received[0].cursor).not.toBe(received[1].cursor);
|
|
190
|
+
expect(received[0].cursor.position).not.toBe(received[1].cursor.position);
|
|
171
191
|
}
|
|
172
192
|
});
|
|
173
193
|
it('should deliver EOSE echoing the input cursor when already caught up', async () => {
|
|
174
194
|
const tenant = 'did:example:alice';
|
|
175
195
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
176
196
|
// Emit events and capture last cursor.
|
|
177
|
-
await eventLog.emit(tenant, event, {});
|
|
178
|
-
const lastCursor = await eventLog.emit(tenant, event, {});
|
|
197
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
198
|
+
const lastCursor = await eventLog.emit(tenant, event, {}, cid(2));
|
|
179
199
|
// Subscribe with the last cursor — already caught up, no stored events to replay.
|
|
180
200
|
const received = [];
|
|
181
201
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); }, { cursor: lastCursor });
|
|
@@ -183,36 +203,38 @@ describe('EventEmitterEventLog', () => {
|
|
|
183
203
|
expect(received.length).toBe(1);
|
|
184
204
|
expect(received[0].type).toBe('eose');
|
|
185
205
|
if (received[0].type === 'eose') {
|
|
186
|
-
expect(received[0].cursor).
|
|
206
|
+
expect(received[0].cursor).toEqual(lastCursor);
|
|
187
207
|
}
|
|
188
208
|
});
|
|
189
209
|
it('should continue delivering live events after EOSE', async () => {
|
|
190
210
|
const tenant = 'did:example:alice';
|
|
191
211
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
192
212
|
// Emit 1 event and capture its cursor.
|
|
193
|
-
const cursor1 = await eventLog.emit(tenant, event, { idx: '1' });
|
|
213
|
+
const cursor1 = await eventLog.emit(tenant, event, { idx: '1' }, cid(1));
|
|
194
214
|
const received = [];
|
|
195
215
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); }, { cursor: cursor1 });
|
|
196
216
|
// Already caught up — should have just EOSE.
|
|
197
217
|
expect(received.length).toBe(1);
|
|
198
218
|
expect(received[0].type).toBe('eose');
|
|
199
219
|
// Now emit a live event.
|
|
200
|
-
await eventLog.emit(tenant, event, { idx: '2' });
|
|
220
|
+
await eventLog.emit(tenant, event, { idx: '2' }, cid(2));
|
|
221
|
+
// Allow async token construction to settle.
|
|
222
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
201
223
|
// Should now have the live event appended.
|
|
202
224
|
expect(received.length).toBe(2);
|
|
203
225
|
expect(received[1].type).toBe('event');
|
|
204
226
|
if (received[1].type === 'event') {
|
|
205
|
-
expect(typeof received[1].cursor).toBe('
|
|
227
|
+
expect(typeof received[1].cursor).toBe('object');
|
|
206
228
|
}
|
|
207
229
|
});
|
|
208
230
|
it('should apply filters to both catch-up and live events', async () => {
|
|
209
231
|
const tenant = 'did:example:alice';
|
|
210
232
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
211
233
|
// Emit events with different schemas, capture cursor before the batch.
|
|
212
|
-
const cursorBefore = await eventLog.emit(tenant, event, { schema: 'http://before' });
|
|
213
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
214
|
-
await eventLog.emit(tenant, event, { schema: 'http://other' });
|
|
215
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
234
|
+
const cursorBefore = await eventLog.emit(tenant, event, { schema: 'http://before' }, cid(0));
|
|
235
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(1));
|
|
236
|
+
await eventLog.emit(tenant, event, { schema: 'http://other' }, cid(2));
|
|
237
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(3));
|
|
216
238
|
const received = [];
|
|
217
239
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); }, {
|
|
218
240
|
cursor: cursorBefore,
|
|
@@ -224,33 +246,37 @@ describe('EventEmitterEventLog', () => {
|
|
|
224
246
|
expect(received[1].type).toBe('event');
|
|
225
247
|
expect(received[2].type).toBe('eose');
|
|
226
248
|
// Emit live events — only matching ones should arrive.
|
|
227
|
-
await eventLog.emit(tenant, event, { schema: 'http://other' });
|
|
228
|
-
await eventLog.emit(tenant, event, { schema: 'http://match' });
|
|
249
|
+
await eventLog.emit(tenant, event, { schema: 'http://other' }, cid(4));
|
|
250
|
+
await eventLog.emit(tenant, event, { schema: 'http://match' }, cid(5));
|
|
251
|
+
// Allow async token construction to settle.
|
|
252
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
229
253
|
expect(received.length).toBe(4); // +1 matching live event
|
|
230
254
|
});
|
|
231
255
|
it('should deduplicate live events that arrived during catch-up', async () => {
|
|
232
256
|
const tenant = 'did:example:alice';
|
|
233
257
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
234
258
|
// Emit 2 events, capture cursor before them.
|
|
235
|
-
const cursorBefore = await eventLog.emit(tenant, event, { idx: '0' });
|
|
236
|
-
await eventLog.emit(tenant, event, { idx: '1' });
|
|
237
|
-
await eventLog.emit(tenant, event, { idx: '2' });
|
|
259
|
+
const cursorBefore = await eventLog.emit(tenant, event, { idx: '0' }, cid(0));
|
|
260
|
+
await eventLog.emit(tenant, event, { idx: '1' }, cid(1));
|
|
261
|
+
await eventLog.emit(tenant, event, { idx: '2' }, cid(2));
|
|
238
262
|
const received = [];
|
|
239
263
|
await eventLog.subscribe(tenant, 'sub-1', (msg) => { received.push(msg); }, { cursor: cursorBefore });
|
|
240
264
|
// 2 catch-up events + EOSE.
|
|
241
265
|
expect(received.length).toBe(3);
|
|
242
|
-
// Verify no duplicate
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
|
|
266
|
+
// Verify no duplicate positions.
|
|
267
|
+
const eventPositions = received
|
|
268
|
+
.filter((m) => m.type === 'event')
|
|
269
|
+
.map(m => m.cursor.position);
|
|
270
|
+
const uniquePositions = new Set(eventPositions);
|
|
271
|
+
expect(uniquePositions.size).toBe(eventPositions.length);
|
|
246
272
|
});
|
|
247
273
|
it('should isolate subscriptions between tenants in cursor mode', async () => {
|
|
248
274
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
249
275
|
// Emit for alice, capture first cursor.
|
|
250
|
-
const aliceCursor1 = await eventLog.emit('did:example:alice', event, {});
|
|
251
|
-
await eventLog.emit('did:example:alice', event, {});
|
|
276
|
+
const aliceCursor1 = await eventLog.emit('did:example:alice', event, {}, cid(1));
|
|
277
|
+
await eventLog.emit('did:example:alice', event, {}, cid(2));
|
|
252
278
|
// Emit for bob.
|
|
253
|
-
await eventLog.emit('did:example:bob', event, {});
|
|
279
|
+
await eventLog.emit('did:example:bob', event, {}, cid(3));
|
|
254
280
|
// Subscribe to alice with cursor — should only get alice's second event.
|
|
255
281
|
const aliceReceived = [];
|
|
256
282
|
await eventLog.subscribe('did:example:alice', 'sub-alice', (msg) => { aliceReceived.push(msg); }, { cursor: aliceCursor1 });
|
|
@@ -260,13 +286,120 @@ describe('EventEmitterEventLog', () => {
|
|
|
260
286
|
expect(aliceReceived[1].type).toBe('eose');
|
|
261
287
|
});
|
|
262
288
|
});
|
|
289
|
+
describe('getReplayBounds()', () => {
|
|
290
|
+
it('should return undefined for a tenant with no events', async () => {
|
|
291
|
+
const result = await eventLog.getReplayBounds('did:example:nobody');
|
|
292
|
+
expect(result).toBeUndefined();
|
|
293
|
+
});
|
|
294
|
+
it('should return oldest and latest tokens', async () => {
|
|
295
|
+
const tenant = 'did:example:alice';
|
|
296
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
297
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
298
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
299
|
+
await eventLog.emit(tenant, event, {}, cid(3));
|
|
300
|
+
const bounds = await eventLog.getReplayBounds(tenant);
|
|
301
|
+
expect(bounds).toBeDefined();
|
|
302
|
+
expect(bounds.oldest.position).toBe('1');
|
|
303
|
+
expect(bounds.oldest.messageCid).toBe(cid(1));
|
|
304
|
+
expect(bounds.latest.position).toBe('3');
|
|
305
|
+
expect(bounds.latest.messageCid).toBe(cid(3));
|
|
306
|
+
});
|
|
307
|
+
it('should reflect trimmed state', async () => {
|
|
308
|
+
const tenant = 'did:example:alice';
|
|
309
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
310
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
311
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
312
|
+
await eventLog.emit(tenant, event, {}, cid(3));
|
|
313
|
+
await eventLog.trim(tenant, 3); // trim seq < 3
|
|
314
|
+
const bounds = await eventLog.getReplayBounds(tenant);
|
|
315
|
+
expect(bounds).toBeDefined();
|
|
316
|
+
expect(bounds.oldest.position).toBe('3');
|
|
317
|
+
expect(bounds.latest.position).toBe('3');
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('ProgressGap detection', () => {
|
|
321
|
+
it('should throw EventLogProgressGap with reason epoch_mismatch when epoch differs', async () => {
|
|
322
|
+
const tenant = 'did:example:alice';
|
|
323
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
324
|
+
const token = await eventLog.emit(tenant, event, {}, cid(1));
|
|
325
|
+
// Create a token with a different epoch.
|
|
326
|
+
const staleToken = { ...token, epoch: 'stale-epoch-from-previous-process' };
|
|
327
|
+
await expect(eventLog.read(tenant, { cursor: staleToken }))
|
|
328
|
+
.rejects.toThrow('epoch_mismatch');
|
|
329
|
+
});
|
|
330
|
+
it('should throw EventLogProgressGap with reason stream_mismatch when streamId differs', async () => {
|
|
331
|
+
const tenant = 'did:example:alice';
|
|
332
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
333
|
+
const token = await eventLog.emit(tenant, event, {}, cid(1));
|
|
334
|
+
// Create a token with a wrong streamId.
|
|
335
|
+
const badToken = { ...token, streamId: 'wrong-stream-id' };
|
|
336
|
+
await expect(eventLog.read(tenant, { cursor: badToken }))
|
|
337
|
+
.rejects.toThrow('stream_mismatch');
|
|
338
|
+
});
|
|
339
|
+
it('should throw EventLogProgressGap with reason token_too_old when position is evicted', async () => {
|
|
340
|
+
const smallLog = new EventEmitterEventLog({ maxEventsPerTenant: 2 });
|
|
341
|
+
await smallLog.open();
|
|
342
|
+
const tenant = 'did:example:alice';
|
|
343
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
344
|
+
// Emit 4 events with maxEventsPerTenant=2 — seqs 1 and 2 evicted, only [3,4] remain.
|
|
345
|
+
const firstToken = await smallLog.emit(tenant, event, {}, cid(1));
|
|
346
|
+
await smallLog.emit(tenant, event, {}, cid(2));
|
|
347
|
+
await smallLog.emit(tenant, event, {}, cid(3));
|
|
348
|
+
await smallLog.emit(tenant, event, {}, cid(4));
|
|
349
|
+
// firstToken has position='1', oldest is now seq=3.
|
|
350
|
+
// Cursor 1 means "give me events after seq 1" — but seq 2 is gone. That's a gap.
|
|
351
|
+
await expect(smallLog.read(tenant, { cursor: firstToken }))
|
|
352
|
+
.rejects.toThrow('token_too_old');
|
|
353
|
+
await smallLog.close();
|
|
354
|
+
});
|
|
355
|
+
it('should include ProgressGapInfo metadata on the thrown error', async () => {
|
|
356
|
+
const smallLog = new EventEmitterEventLog({ maxEventsPerTenant: 2 });
|
|
357
|
+
await smallLog.open();
|
|
358
|
+
const tenant = 'did:example:alice';
|
|
359
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
360
|
+
const firstToken = await smallLog.emit(tenant, event, {}, cid(1));
|
|
361
|
+
await smallLog.emit(tenant, event, {}, cid(2));
|
|
362
|
+
await smallLog.emit(tenant, event, {}, cid(3));
|
|
363
|
+
await smallLog.emit(tenant, event, {}, cid(4)); // now only [3,4] remain
|
|
364
|
+
try {
|
|
365
|
+
await smallLog.read(tenant, { cursor: firstToken });
|
|
366
|
+
throw new Error('expected error');
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
expect(error.code).toBe('EventLogProgressGap');
|
|
370
|
+
expect(error.gapInfo).toBeDefined();
|
|
371
|
+
expect(error.gapInfo.requested).toEqual(firstToken);
|
|
372
|
+
expect(error.gapInfo.oldestAvailable.position).toBe('3');
|
|
373
|
+
expect(error.gapInfo.latestAvailable.position).toBe('4');
|
|
374
|
+
expect(error.gapInfo.reason).toBe('token_too_old');
|
|
375
|
+
}
|
|
376
|
+
await smallLog.close();
|
|
377
|
+
});
|
|
378
|
+
it('should throw on subscribe() with stale cursor', async () => {
|
|
379
|
+
const tenant = 'did:example:alice';
|
|
380
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
381
|
+
const token = await eventLog.emit(tenant, event, {}, cid(1));
|
|
382
|
+
const staleToken = { ...token, epoch: 'old-epoch' };
|
|
383
|
+
await expect(eventLog.subscribe(tenant, 'sub-1', () => { }, { cursor: staleToken })).rejects.toThrow('epoch_mismatch');
|
|
384
|
+
});
|
|
385
|
+
it('should accept a valid cursor without throwing', async () => {
|
|
386
|
+
const tenant = 'did:example:alice';
|
|
387
|
+
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
388
|
+
const token1 = await eventLog.emit(tenant, event, {}, cid(1));
|
|
389
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
390
|
+
// Read with a valid cursor — should succeed without throwing.
|
|
391
|
+
const result = await eventLog.read(tenant, { cursor: token1 });
|
|
392
|
+
expect(result.events.length).toBe(1);
|
|
393
|
+
expect(result.cursor.position).toBe('2');
|
|
394
|
+
});
|
|
395
|
+
});
|
|
263
396
|
describe('trim()', () => {
|
|
264
397
|
it('should trim events by sequence number', async () => {
|
|
265
398
|
const tenant = 'did:example:alice';
|
|
266
399
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
267
|
-
await eventLog.emit(tenant, event, {});
|
|
268
|
-
await eventLog.emit(tenant, event, {});
|
|
269
|
-
await eventLog.emit(tenant, event, {});
|
|
400
|
+
await eventLog.emit(tenant, event, {}, cid(1));
|
|
401
|
+
await eventLog.emit(tenant, event, {}, cid(2));
|
|
402
|
+
await eventLog.emit(tenant, event, {}, cid(3));
|
|
270
403
|
await eventLog.trim(tenant, 3); // trim events with seq < 3
|
|
271
404
|
const result = await eventLog.read(tenant);
|
|
272
405
|
expect(result.events.length).toBe(1);
|
|
@@ -277,8 +410,8 @@ describe('EventEmitterEventLog', () => {
|
|
|
277
410
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
278
411
|
const oldTime = '2020-01-01T00:00:00.000000Z';
|
|
279
412
|
const newTime = '2025-01-01T00:00:00.000000Z';
|
|
280
|
-
await eventLog.emit(tenant, event, { messageTimestamp: oldTime });
|
|
281
|
-
await eventLog.emit(tenant, event, { messageTimestamp: newTime });
|
|
413
|
+
await eventLog.emit(tenant, event, { messageTimestamp: oldTime }, cid(1));
|
|
414
|
+
await eventLog.emit(tenant, event, { messageTimestamp: newTime }, cid(2));
|
|
282
415
|
await eventLog.trim(tenant, '2023-01-01T00:00:00.000000Z');
|
|
283
416
|
const result = await eventLog.read(tenant);
|
|
284
417
|
expect(result.events.length).toBe(1);
|
|
@@ -290,10 +423,10 @@ describe('EventEmitterEventLog', () => {
|
|
|
290
423
|
await smallLog.open();
|
|
291
424
|
const tenant = 'did:example:alice';
|
|
292
425
|
const event = { message: { descriptor: { interface: 'Records', method: 'Write' } } };
|
|
293
|
-
await smallLog.emit(tenant, event, { idx: '1' });
|
|
294
|
-
await smallLog.emit(tenant, event, { idx: '2' });
|
|
295
|
-
await smallLog.emit(tenant, event, { idx: '3' });
|
|
296
|
-
await smallLog.emit(tenant, event, { idx: '4' }); // should evict seq=1
|
|
426
|
+
await smallLog.emit(tenant, event, { idx: '1' }, cid(1));
|
|
427
|
+
await smallLog.emit(tenant, event, { idx: '2' }, cid(2));
|
|
428
|
+
await smallLog.emit(tenant, event, { idx: '3' }, cid(3));
|
|
429
|
+
await smallLog.emit(tenant, event, { idx: '4' }, cid(4)); // should evict seq=1
|
|
297
430
|
const result = await smallLog.read(tenant);
|
|
298
431
|
expect(result.events.length).toBe(3);
|
|
299
432
|
expect(result.events[0].seq).toBe(2); // seq=1 was evicted
|