@livestore/common 0.3.0-dev.47 → 0.3.0-dev.48
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/.tsbuildinfo +1 -1
- package/dist/adapter-types.d.ts +8 -6
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +2 -2
- package/dist/adapter-types.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +25 -25
- package/dist/devtools/devtools-messages-client-session.js +3 -3
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +30 -30
- package/dist/devtools/devtools-messages-leader.js +3 -3
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +27 -25
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +10 -10
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +24 -24
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +1 -1
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +3 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +19 -15
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/types.d.ts +4 -4
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/make-client-session.d.ts +1 -1
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +2 -1
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +4 -2
- package/dist/materializer-helper.js.map +1 -1
- package/dist/rematerialize-from-eventlog.js +9 -9
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventId.d.ts +28 -28
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +9 -9
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/EventId.test.js +5 -5
- package/dist/schema/EventId.test.js.map +1 -1
- package/dist/schema/EventNumber.d.ts +57 -0
- package/dist/schema/EventNumber.d.ts.map +1 -0
- package/dist/schema/EventNumber.js +82 -0
- package/dist/schema/EventNumber.js.map +1 -0
- package/dist/schema/EventNumber.test.d.ts +2 -0
- package/dist/schema/EventNumber.test.d.ts.map +1 -0
- package/dist/schema/EventNumber.test.js +11 -0
- package/dist/schema/EventNumber.test.js.map +1 -0
- package/dist/schema/EventSequenceNumber.d.ts +57 -0
- package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.js +82 -0
- package/dist/schema/EventSequenceNumber.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
- package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +11 -0
- package/dist/schema/EventSequenceNumber.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent.d.ts +81 -79
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent.js +31 -32
- package/dist/schema/LiveStoreEvent.js.map +1 -1
- package/dist/schema/mod.d.ts +1 -1
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +1 -1
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +2 -2
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +3 -3
- package/dist/schema/state/sqlite/query-builder/impl.test.js +9 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables.d.ts +52 -52
- package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables.js +11 -10
- package/dist/schema/state/sqlite/system-tables.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +6 -6
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/compact-events.js +38 -35
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +4 -4
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +8 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +4 -4
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +7 -4
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts +0 -2
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +15 -13
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +10 -4
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +13 -13
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +31 -31
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +10 -0
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +19 -13
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync.d.ts +11 -11
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +5 -5
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +18 -18
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +46 -47
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +110 -110
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +4 -4
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/package.json +4 -4
- package/src/adapter-types.ts +6 -4
- package/src/devtools/devtools-messages-client-session.ts +3 -3
- package/src/devtools/devtools-messages-leader.ts +3 -3
- package/src/leader-thread/LeaderSyncProcessor.ts +36 -29
- package/src/leader-thread/eventlog.ts +36 -31
- package/src/leader-thread/leader-worker-devtools.ts +1 -1
- package/src/leader-thread/materialize-event.ts +21 -17
- package/src/leader-thread/types.ts +4 -4
- package/src/make-client-session.ts +2 -0
- package/src/materializer-helper.ts +5 -2
- package/src/rematerialize-from-eventlog.ts +10 -10
- package/src/schema/EventSequenceNumber.test.ts +12 -0
- package/src/schema/EventSequenceNumber.ts +121 -0
- package/src/schema/LiveStoreEvent.ts +66 -65
- package/src/schema/mod.ts +1 -1
- package/src/schema/state/sqlite/query-builder/impl.test.ts +9 -0
- package/src/schema/state/sqlite/query-builder/impl.ts +3 -2
- package/src/schema/state/sqlite/system-tables.ts +11 -10
- package/src/sync/ClientSessionSyncProcessor.ts +6 -6
- package/src/sync/next/compact-events.ts +38 -35
- package/src/sync/next/facts.ts +12 -9
- package/src/sync/next/history-dag-common.ts +9 -6
- package/src/sync/next/history-dag.ts +15 -16
- package/src/sync/next/rebase-events.ts +10 -4
- package/src/sync/next/test/compact-events.calculator.test.ts +13 -13
- package/src/sync/next/test/compact-events.test.ts +31 -31
- package/src/sync/next/test/event-fixtures.ts +20 -13
- package/src/sync/sync.ts +7 -7
- package/src/sync/syncstate.test.ts +112 -112
- package/src/sync/syncstate.ts +58 -48
- package/src/sync/validate-push-payload.ts +5 -5
- package/src/version.ts +2 -2
- package/src/schema/EventId.test.ts +0 -12
- package/src/schema/EventId.ts +0 -106
@@ -0,0 +1,82 @@
|
|
1
|
+
import { Brand, Schema } from '@livestore/utils/effect';
|
2
|
+
export const localEventSequenceNumber = Brand.nominal();
|
3
|
+
export const ClientEventSequenceNumber = Schema.fromBrand(localEventSequenceNumber)(Schema.Int);
|
4
|
+
export const globalEventSequenceNumber = Brand.nominal();
|
5
|
+
export const GlobalEventSequenceNumber = Schema.fromBrand(globalEventSequenceNumber)(Schema.Int);
|
6
|
+
export const clientDefault = 0;
|
7
|
+
// export const EventSequenceNumber = Schema.Struct({})
|
8
|
+
// export const EventSequenceNumber = Schema.Struct({})
|
9
|
+
// export const ClientEventSequenceNumber = Schema.Struct({})
|
10
|
+
// export const GlobalEventSequenceNumber = Schema.Struct({})
|
11
|
+
/**
|
12
|
+
* NOTE: Client mutation events with a non-0 client id, won't be synced to the sync backend.
|
13
|
+
*/
|
14
|
+
export const EventSequenceNumber = Schema.Struct({
|
15
|
+
global: GlobalEventSequenceNumber,
|
16
|
+
/** Only increments for clientOnly events */
|
17
|
+
client: ClientEventSequenceNumber,
|
18
|
+
// TODO also provide a way to see "confirmation level" of event (e.g. confirmed by leader/sync backend)
|
19
|
+
// TODO: actually add this field
|
20
|
+
// Client only
|
21
|
+
// generation: Schema.Number.pipe(Schema.optional),
|
22
|
+
}).annotations({ title: 'LiveStore.EventSequenceNumber' });
|
23
|
+
/**
|
24
|
+
* Compare two event ids i.e. checks if the first event id is less than the second.
|
25
|
+
*/
|
26
|
+
export const compare = (a, b) => {
|
27
|
+
if (a.global !== b.global) {
|
28
|
+
return a.global - b.global;
|
29
|
+
}
|
30
|
+
return a.client - b.client;
|
31
|
+
};
|
32
|
+
/**
|
33
|
+
* Convert an event id to a string representation.
|
34
|
+
*/
|
35
|
+
export const toString = (seqNum) => seqNum.client === 0 ? `e${seqNum.global}` : `e${seqNum.global}+${seqNum.client}`;
|
36
|
+
/**
|
37
|
+
* Convert a string representation of an event id to an event id.
|
38
|
+
*/
|
39
|
+
export const fromString = (str) => {
|
40
|
+
const [global, client] = str.slice(1, -1).split(',').map(Number);
|
41
|
+
if (global === undefined || client === undefined) {
|
42
|
+
throw new Error('Invalid event id string');
|
43
|
+
}
|
44
|
+
return { global, client };
|
45
|
+
};
|
46
|
+
export const isEqual = (a, b) => a.global === b.global && a.client === b.client;
|
47
|
+
export const ROOT = {
|
48
|
+
global: 0,
|
49
|
+
client: clientDefault,
|
50
|
+
};
|
51
|
+
export const isGreaterThan = (a, b) => {
|
52
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client);
|
53
|
+
};
|
54
|
+
export const isGreaterThanOrEqual = (a, b) => {
|
55
|
+
return a.global > b.global || (a.global === b.global && a.client >= b.client);
|
56
|
+
};
|
57
|
+
export const max = (a, b) => {
|
58
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b;
|
59
|
+
};
|
60
|
+
export const diff = (a, b) => {
|
61
|
+
return {
|
62
|
+
global: a.global - b.global,
|
63
|
+
client: a.client - b.client,
|
64
|
+
};
|
65
|
+
};
|
66
|
+
export const make = (seqNum) => {
|
67
|
+
return Schema.is(EventSequenceNumber)(seqNum) ? seqNum : Schema.decodeSync(EventSequenceNumber)(seqNum);
|
68
|
+
};
|
69
|
+
export const nextPair = (seqNum, isLocal) => {
|
70
|
+
if (isLocal) {
|
71
|
+
return {
|
72
|
+
seqNum: { global: seqNum.global, client: (seqNum.client + 1) },
|
73
|
+
parentSeqNum: seqNum,
|
74
|
+
};
|
75
|
+
}
|
76
|
+
return {
|
77
|
+
seqNum: { global: (seqNum.global + 1), client: clientDefault },
|
78
|
+
// NOTE we always point to `client: 0` for non-clientOnly events
|
79
|
+
parentSeqNum: { global: seqNum.global, client: clientDefault },
|
80
|
+
};
|
81
|
+
};
|
82
|
+
//# sourceMappingURL=EventNumber.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventNumber.js","sourceRoot":"","sources":["../../src/schema/EventNumber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC,OAAO,EAA6B,CAAA;AAClF,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AAG/F,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC,OAAO,EAA6B,CAAA;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAqC,CAAA;AAUlE,uDAAuD;AACvD,uDAAuD;AACvD,6DAA6D;AAC7D,6DAA6D;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,yBAAyB;IACjC,4CAA4C;IAC5C,MAAM,EAAE,yBAAyB;IAEjC,uGAAuG;IAEvG,gCAAgC;IAChC,cAAc;IACd,mDAAmD;CACpD,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAA;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAE,CAAsB,EAAE,EAAE;IACxE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAA;IAC5B,CAAC;IACD,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAA;AAC5B,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAA2B,EAAE,EAAE,CACtD,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAA;AAElF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAuB,EAAE;IAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAyB,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAE,CAAsB,EAAE,EAAE,CACxE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAA;AAIhD,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,MAAM,EAAE,CAAqC;IAC7C,MAAM,EAAE,aAAa;CACQ,CAAA;AAE/B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAsB,EAAE,CAAsB,EAAE,EAAE;IAC9E,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9E,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAsB,EAAE,CAAsB,EAAE,EAAE;IACrF,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;AAC/E,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAsB,EAAE,CAAsB,EAAE,EAAE;IACpE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAsB,EAAE,CAAsB,EAAE,EAAE;IACrE,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;KAC5B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAgE,EAAuB,EAAE;IAC5G,OAAO,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AACzG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAA2B,EAAE,OAAgB,EAA2B,EAAE;IACjG,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAqC,EAAE;YAClG,YAAY,EAAE,MAAM;SACrB,CAAA;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAqC,EAAE,MAAM,EAAE,aAAa,EAAE;QAClG,gEAAgE;QAChE,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE;KAC/D,CAAA;AACH,CAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventNumber.test.d.ts","sourceRoot":"","sources":["../../src/schema/EventNumber.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest';
|
2
|
+
import { expect } from 'vitest';
|
3
|
+
import { EventSequenceNumber } from './mod.js';
|
4
|
+
Vitest.describe('EventSequenceNumber', () => {
|
5
|
+
Vitest.test('nextPair', () => {
|
6
|
+
const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 });
|
7
|
+
expect(EventSequenceNumber.nextPair(e_0_0, false).seqNum).toStrictEqual({ global: 1, client: 0 });
|
8
|
+
expect(EventSequenceNumber.nextPair(e_0_0, true).seqNum).toStrictEqual({ global: 0, client: 1 });
|
9
|
+
});
|
10
|
+
});
|
11
|
+
//# sourceMappingURL=EventNumber.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventNumber.test.js","sourceRoot":"","sources":["../../src/schema/EventNumber.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9C,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAC1C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC3B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QAChE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QACjG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import { Brand, Schema } from '@livestore/utils/effect';
|
2
|
+
export type ClientEventSequenceNumber = Brand.Branded<number, 'ClientEventSequenceNumber'>;
|
3
|
+
export declare const localEventSequenceNumber: Brand.Brand.Constructor<ClientEventSequenceNumber>;
|
4
|
+
export declare const ClientEventSequenceNumber: Schema.BrandSchema<number & Brand.Brand<"ClientEventSequenceNumber">, number, never>;
|
5
|
+
export type GlobalEventSequenceNumber = Brand.Branded<number, 'GlobalEventSequenceNumber'>;
|
6
|
+
export declare const globalEventSequenceNumber: Brand.Brand.Constructor<GlobalEventSequenceNumber>;
|
7
|
+
export declare const GlobalEventSequenceNumber: Schema.BrandSchema<number & Brand.Brand<"GlobalEventSequenceNumber">, number, never>;
|
8
|
+
export declare const clientDefault: ClientEventSequenceNumber;
|
9
|
+
/**
|
10
|
+
* LiveStore event sequence number value consisting of a globally unique event sequence number
|
11
|
+
* and a client sequence number.
|
12
|
+
*
|
13
|
+
* The client sequence number is only used for clientOnly events and starts from 0 for each global sequence number.
|
14
|
+
*/
|
15
|
+
export type EventSequenceNumber = {
|
16
|
+
global: GlobalEventSequenceNumber;
|
17
|
+
client: ClientEventSequenceNumber;
|
18
|
+
};
|
19
|
+
/**
|
20
|
+
* NOTE: Client mutation events with a non-0 client id, won't be synced to the sync backend.
|
21
|
+
*/
|
22
|
+
export declare const EventSequenceNumber: Schema.Struct<{
|
23
|
+
global: Schema.BrandSchema<number & Brand.Brand<"GlobalEventSequenceNumber">, number, never>;
|
24
|
+
/** Only increments for clientOnly events */
|
25
|
+
client: Schema.BrandSchema<number & Brand.Brand<"ClientEventSequenceNumber">, number, never>;
|
26
|
+
}>;
|
27
|
+
/**
|
28
|
+
* Compare two event sequence numbers i.e. checks if the first event sequence number is less than the second.
|
29
|
+
*/
|
30
|
+
export declare const compare: (a: EventSequenceNumber, b: EventSequenceNumber) => number;
|
31
|
+
/**
|
32
|
+
* Convert an event sequence number to a string representation.
|
33
|
+
*/
|
34
|
+
export declare const toString: (seqNum: EventSequenceNumber) => string;
|
35
|
+
/**
|
36
|
+
* Convert a string representation of an event sequence number to an event sequence number.
|
37
|
+
*/
|
38
|
+
export declare const fromString: (str: string) => EventSequenceNumber;
|
39
|
+
export declare const isEqual: (a: EventSequenceNumber, b: EventSequenceNumber) => boolean;
|
40
|
+
export type EventSequenceNumberPair = {
|
41
|
+
seqNum: EventSequenceNumber;
|
42
|
+
parentSeqNum: EventSequenceNumber;
|
43
|
+
};
|
44
|
+
export declare const ROOT: {
|
45
|
+
global: GlobalEventSequenceNumber;
|
46
|
+
client: ClientEventSequenceNumber;
|
47
|
+
};
|
48
|
+
export declare const isGreaterThan: (a: EventSequenceNumber, b: EventSequenceNumber) => boolean;
|
49
|
+
export declare const isGreaterThanOrEqual: (a: EventSequenceNumber, b: EventSequenceNumber) => boolean;
|
50
|
+
export declare const max: (a: EventSequenceNumber, b: EventSequenceNumber) => EventSequenceNumber;
|
51
|
+
export declare const diff: (a: EventSequenceNumber, b: EventSequenceNumber) => {
|
52
|
+
global: number;
|
53
|
+
client: number;
|
54
|
+
};
|
55
|
+
export declare const make: (seqNum: EventSequenceNumber | typeof EventSequenceNumber.Encoded) => EventSequenceNumber;
|
56
|
+
export declare const nextPair: (seqNum: EventSequenceNumber, isLocal: boolean) => EventSequenceNumberPair;
|
57
|
+
//# sourceMappingURL=EventSequenceNumber.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventSequenceNumber.d.ts","sourceRoot":"","sources":["../../src/schema/EventSequenceNumber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEvD,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAA;AAC1F,eAAO,MAAM,wBAAwB,oDAA6C,CAAA;AAClF,eAAO,MAAM,yBAAyB,sFAAyD,CAAA;AAE/F,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAA;AAC1F,eAAO,MAAM,yBAAyB,oDAA6C,CAAA;AACnF,eAAO,MAAM,yBAAyB,sFAA0D,CAAA;AAEhG,eAAO,MAAM,aAAa,EAAe,yBAAyB,CAAA;AAElE;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,yBAAyB,CAAA;IACjC,MAAM,EAAE,yBAAyB,CAAA;CAKlC,CAAA;AAOD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;IAE9B,4CAA4C;;EAQY,CAAA;AAE1D;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,WAKrE,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,QAAQ,mBAAmB,WAC8B,CAAA;AAElF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,mBAMxC,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,YACtB,CAAA;AAEhD,MAAM,MAAM,uBAAuB,GAAG;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAExG,eAAO,MAAM,IAAI;YACK,yBAAyB;;CAEhB,CAAA;AAE/B,eAAO,MAAM,aAAa,GAAI,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,YAE3E,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,YAElF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,GAAG,mBAAmB,EAAE,GAAG,mBAAmB,wBAEjE,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,GAAG,mBAAmB,EAAE,GAAG,mBAAmB;;;CAKlE,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,QAAQ,mBAAmB,GAAG,OAAO,mBAAmB,CAAC,OAAO,KAAG,mBAEvF,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,mBAAmB,EAAE,SAAS,OAAO,KAAG,uBAaxE,CAAA"}
|
@@ -0,0 +1,82 @@
|
|
1
|
+
import { Brand, Schema } from '@livestore/utils/effect';
|
2
|
+
export const localEventSequenceNumber = Brand.nominal();
|
3
|
+
export const ClientEventSequenceNumber = Schema.fromBrand(localEventSequenceNumber)(Schema.Int);
|
4
|
+
export const globalEventSequenceNumber = Brand.nominal();
|
5
|
+
export const GlobalEventSequenceNumber = Schema.fromBrand(globalEventSequenceNumber)(Schema.Int);
|
6
|
+
export const clientDefault = 0;
|
7
|
+
// export const EventSequenceNumber = Schema.Struct({})
|
8
|
+
// export const EventSequenceNumber = Schema.Struct({})
|
9
|
+
// export const ClientEventSequenceNumber = Schema.Struct({})
|
10
|
+
// export const GlobalEventSequenceNumber = Schema.Struct({})
|
11
|
+
/**
|
12
|
+
* NOTE: Client mutation events with a non-0 client id, won't be synced to the sync backend.
|
13
|
+
*/
|
14
|
+
export const EventSequenceNumber = Schema.Struct({
|
15
|
+
global: GlobalEventSequenceNumber,
|
16
|
+
/** Only increments for clientOnly events */
|
17
|
+
client: ClientEventSequenceNumber,
|
18
|
+
// TODO also provide a way to see "confirmation level" of event (e.g. confirmed by leader/sync backend)
|
19
|
+
// TODO: actually add this field
|
20
|
+
// Client only
|
21
|
+
// generation: Schema.Number.pipe(Schema.optional),
|
22
|
+
}).annotations({ title: 'LiveStore.EventSequenceNumber' });
|
23
|
+
/**
|
24
|
+
* Compare two event sequence numbers i.e. checks if the first event sequence number is less than the second.
|
25
|
+
*/
|
26
|
+
export const compare = (a, b) => {
|
27
|
+
if (a.global !== b.global) {
|
28
|
+
return a.global - b.global;
|
29
|
+
}
|
30
|
+
return a.client - b.client;
|
31
|
+
};
|
32
|
+
/**
|
33
|
+
* Convert an event sequence number to a string representation.
|
34
|
+
*/
|
35
|
+
export const toString = (seqNum) => seqNum.client === 0 ? `e${seqNum.global}` : `e${seqNum.global}+${seqNum.client}`;
|
36
|
+
/**
|
37
|
+
* Convert a string representation of an event sequence number to an event sequence number.
|
38
|
+
*/
|
39
|
+
export const fromString = (str) => {
|
40
|
+
const [global, client] = str.slice(1, -1).split(',').map(Number);
|
41
|
+
if (global === undefined || client === undefined) {
|
42
|
+
throw new Error('Invalid event sequence number string');
|
43
|
+
}
|
44
|
+
return { global, client };
|
45
|
+
};
|
46
|
+
export const isEqual = (a, b) => a.global === b.global && a.client === b.client;
|
47
|
+
export const ROOT = {
|
48
|
+
global: 0,
|
49
|
+
client: clientDefault,
|
50
|
+
};
|
51
|
+
export const isGreaterThan = (a, b) => {
|
52
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client);
|
53
|
+
};
|
54
|
+
export const isGreaterThanOrEqual = (a, b) => {
|
55
|
+
return a.global > b.global || (a.global === b.global && a.client >= b.client);
|
56
|
+
};
|
57
|
+
export const max = (a, b) => {
|
58
|
+
return a.global > b.global || (a.global === b.global && a.client > b.client) ? a : b;
|
59
|
+
};
|
60
|
+
export const diff = (a, b) => {
|
61
|
+
return {
|
62
|
+
global: a.global - b.global,
|
63
|
+
client: a.client - b.client,
|
64
|
+
};
|
65
|
+
};
|
66
|
+
export const make = (seqNum) => {
|
67
|
+
return Schema.is(EventSequenceNumber)(seqNum) ? seqNum : Schema.decodeSync(EventSequenceNumber)(seqNum);
|
68
|
+
};
|
69
|
+
export const nextPair = (seqNum, isLocal) => {
|
70
|
+
if (isLocal) {
|
71
|
+
return {
|
72
|
+
seqNum: { global: seqNum.global, client: (seqNum.client + 1) },
|
73
|
+
parentSeqNum: seqNum,
|
74
|
+
};
|
75
|
+
}
|
76
|
+
return {
|
77
|
+
seqNum: { global: (seqNum.global + 1), client: clientDefault },
|
78
|
+
// NOTE we always point to `client: 0` for non-clientOnly events
|
79
|
+
parentSeqNum: { global: seqNum.global, client: clientDefault },
|
80
|
+
};
|
81
|
+
};
|
82
|
+
//# sourceMappingURL=EventSequenceNumber.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventSequenceNumber.js","sourceRoot":"","sources":["../../src/schema/EventSequenceNumber.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventSequenceNumber.test.d.ts","sourceRoot":"","sources":["../../src/schema/EventSequenceNumber.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest';
|
2
|
+
import { expect } from 'vitest';
|
3
|
+
import { EventSequenceNumber } from './mod.js';
|
4
|
+
Vitest.describe('EventSequenceNumber', () => {
|
5
|
+
Vitest.test('nextPair', () => {
|
6
|
+
const e_0_0 = EventSequenceNumber.make({ global: 0, client: 0 });
|
7
|
+
expect(EventSequenceNumber.nextPair(e_0_0, false).seqNum).toStrictEqual({ global: 1, client: 0 });
|
8
|
+
expect(EventSequenceNumber.nextPair(e_0_0, true).seqNum).toStrictEqual({ global: 0, client: 1 });
|
9
|
+
});
|
10
|
+
});
|
11
|
+
//# sourceMappingURL=EventSequenceNumber.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"EventSequenceNumber.test.js","sourceRoot":"","sources":["../../src/schema/EventSequenceNumber.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9C,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAC1C,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QAC3B,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QAChE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QACjG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
@@ -1,57 +1,59 @@
|
|
1
1
|
import { Option, Schema } from '@livestore/utils/effect';
|
2
2
|
import type { EventDef, EventDefRecord } from './EventDef.js';
|
3
|
-
import * as
|
3
|
+
import * as EventSequenceNumber from './EventSequenceNumber.js';
|
4
4
|
import type { LiveStoreSchema } from './schema.js';
|
5
|
-
export
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
5
|
+
export declare namespace ForEventDef {
|
6
|
+
type PartialDecoded<TEventDef extends EventDef.Any> = {
|
7
|
+
name: TEventDef['name'];
|
8
|
+
args: Schema.Schema.Type<TEventDef['schema']>;
|
9
|
+
};
|
10
|
+
type PartialEncoded<TEventDef extends EventDef.Any> = {
|
11
|
+
name: TEventDef['name'];
|
12
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>;
|
13
|
+
};
|
14
|
+
type Decoded<TEventDef extends EventDef.Any> = {
|
15
|
+
name: TEventDef['name'];
|
16
|
+
args: Schema.Schema.Type<TEventDef['schema']>;
|
17
|
+
seqNum: EventSequenceNumber.EventSequenceNumber;
|
18
|
+
parentSeqNum: EventSequenceNumber.EventSequenceNumber;
|
19
|
+
clientId: string;
|
20
|
+
sessionId: string;
|
21
|
+
};
|
22
|
+
type Encoded<TEventDef extends EventDef.Any> = {
|
23
|
+
name: TEventDef['name'];
|
24
|
+
args: Schema.Schema.Encoded<TEventDef['schema']>;
|
25
|
+
seqNum: EventSequenceNumber.EventSequenceNumber;
|
26
|
+
parentSeqNum: EventSequenceNumber.EventSequenceNumber;
|
27
|
+
clientId: string;
|
28
|
+
sessionId: string;
|
29
|
+
};
|
30
|
+
}
|
31
|
+
export type AnyDecoded = ForEventDef.Decoded<EventDef.Any>;
|
30
32
|
export declare const AnyDecoded: Schema.Struct<{
|
31
33
|
name: typeof Schema.String;
|
32
34
|
args: typeof Schema.Any;
|
33
|
-
|
34
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
35
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
35
|
+
seqNum: Schema.Struct<{
|
36
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
37
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
36
38
|
}>;
|
37
|
-
|
38
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
39
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
39
|
+
parentSeqNum: Schema.Struct<{
|
40
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
41
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
40
42
|
}>;
|
41
43
|
clientId: typeof Schema.String;
|
42
44
|
sessionId: typeof Schema.String;
|
43
45
|
}>;
|
44
|
-
export type AnyEncoded =
|
46
|
+
export type AnyEncoded = ForEventDef.Encoded<EventDef.Any>;
|
45
47
|
export declare const AnyEncoded: Schema.Struct<{
|
46
48
|
name: typeof Schema.String;
|
47
49
|
args: typeof Schema.Any;
|
48
|
-
|
49
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
50
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
50
|
+
seqNum: Schema.Struct<{
|
51
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
52
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
51
53
|
}>;
|
52
|
-
|
53
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
54
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
54
|
+
parentSeqNum: Schema.Struct<{
|
55
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
56
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
55
57
|
}>;
|
56
58
|
clientId: typeof Schema.String;
|
57
59
|
sessionId: typeof Schema.String;
|
@@ -59,31 +61,31 @@ export declare const AnyEncoded: Schema.Struct<{
|
|
59
61
|
export declare const AnyEncodedGlobal: Schema.Struct<{
|
60
62
|
name: typeof Schema.String;
|
61
63
|
args: typeof Schema.Any;
|
62
|
-
|
63
|
-
|
64
|
+
seqNum: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
65
|
+
parentSeqNum: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
64
66
|
clientId: typeof Schema.String;
|
65
67
|
sessionId: typeof Schema.String;
|
66
68
|
}>;
|
67
69
|
export type AnyEncodedGlobal = typeof AnyEncodedGlobal.Type;
|
68
|
-
export type PartialAnyDecoded =
|
69
|
-
export type PartialAnyEncoded = PartialEncoded<EventDef.Any>;
|
70
|
+
export type PartialAnyDecoded = ForEventDef.PartialDecoded<EventDef.Any>;
|
71
|
+
export type PartialAnyEncoded = ForEventDef.PartialEncoded<EventDef.Any>;
|
70
72
|
export declare const PartialAnyEncoded: Schema.Struct<{
|
71
73
|
name: typeof Schema.String;
|
72
74
|
args: typeof Schema.Any;
|
73
75
|
}>;
|
74
76
|
export type PartialForSchema<TSchema extends LiveStoreSchema> = {
|
75
|
-
[K in keyof TSchema['_EventDefMapType']]:
|
77
|
+
[K in keyof TSchema['_EventDefMapType']]: ForEventDef.PartialDecoded<TSchema['_EventDefMapType'][K]>;
|
76
78
|
}[keyof TSchema['_EventDefMapType']];
|
77
79
|
export type ForSchema<TSchema extends LiveStoreSchema> = {
|
78
|
-
[K in keyof TSchema['_EventDefMapType']]: ForEventDef<TSchema['_EventDefMapType'][K]>;
|
80
|
+
[K in keyof TSchema['_EventDefMapType']]: ForEventDef.Decoded<TSchema['_EventDefMapType'][K]>;
|
79
81
|
}[keyof TSchema['_EventDefMapType']];
|
80
82
|
export declare const isPartialEventDef: (event: AnyDecoded | PartialAnyDecoded) => event is PartialAnyDecoded;
|
81
83
|
export type ForEventDefRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<{
|
82
84
|
[K in keyof TEventDefRecord]: {
|
83
85
|
name: K;
|
84
86
|
args: Schema.Schema.Type<TEventDefRecord[K]['schema']>;
|
85
|
-
|
86
|
-
|
87
|
+
seqNum: EventSequenceNumber.EventSequenceNumber;
|
88
|
+
parentSeqNum: EventSequenceNumber.EventSequenceNumber;
|
87
89
|
clientId: string;
|
88
90
|
sessionId: string;
|
89
91
|
};
|
@@ -91,8 +93,8 @@ export type ForEventDefRecord<TEventDefRecord extends EventDefRecord> = Schema.S
|
|
91
93
|
[K in keyof TEventDefRecord]: {
|
92
94
|
name: K;
|
93
95
|
args: Schema.Schema.Encoded<TEventDefRecord[K]['schema']>;
|
94
|
-
|
95
|
-
|
96
|
+
seqNum: EventSequenceNumber.EventSequenceNumber;
|
97
|
+
parentSeqNum: EventSequenceNumber.EventSequenceNumber;
|
96
98
|
clientId: string;
|
97
99
|
sessionId: string;
|
98
100
|
};
|
@@ -114,13 +116,13 @@ export declare const makeEventDefSchemaMemo: <TSchema extends LiveStoreSchema>(s
|
|
114
116
|
declare const EncodedWithMeta_base: Schema.Class<EncodedWithMeta, {
|
115
117
|
name: typeof Schema.String;
|
116
118
|
args: typeof Schema.Any;
|
117
|
-
|
118
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
119
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
119
|
+
seqNum: Schema.Struct<{
|
120
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
121
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
120
122
|
}>;
|
121
|
-
|
122
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
123
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
123
|
+
parentSeqNum: Schema.Struct<{
|
124
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
125
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
124
126
|
}>;
|
125
127
|
clientId: typeof Schema.String;
|
126
128
|
sessionId: typeof Schema.String;
|
@@ -155,13 +157,13 @@ declare const EncodedWithMeta_base: Schema.Class<EncodedWithMeta, {
|
|
155
157
|
}, Schema.Struct.Encoded<{
|
156
158
|
name: typeof Schema.String;
|
157
159
|
args: typeof Schema.Any;
|
158
|
-
|
159
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
160
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
160
|
+
seqNum: Schema.Struct<{
|
161
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
162
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
161
163
|
}>;
|
162
|
-
|
163
|
-
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
164
|
-
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"
|
164
|
+
parentSeqNum: Schema.Struct<{
|
165
|
+
global: Schema.BrandSchema<number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">, number, never>;
|
166
|
+
client: Schema.BrandSchema<number & import("effect/Brand").Brand<"ClientEventSequenceNumber">, number, never>;
|
165
167
|
}>;
|
166
168
|
clientId: typeof Schema.String;
|
167
169
|
sessionId: typeof Schema.String;
|
@@ -199,17 +201,17 @@ declare const EncodedWithMeta_base: Schema.Class<EncodedWithMeta, {
|
|
199
201
|
readonly sessionId: string;
|
200
202
|
} & {
|
201
203
|
readonly name: string;
|
202
|
-
} & {
|
203
|
-
readonly id: {
|
204
|
-
readonly global: number & import("effect/Brand").Brand<"GlobalEventId">;
|
205
|
-
readonly client: number & import("effect/Brand").Brand<"ClientEventId">;
|
206
|
-
};
|
207
204
|
} & {
|
208
205
|
readonly args: any;
|
209
206
|
} & {
|
210
|
-
readonly
|
211
|
-
readonly global: number & import("effect/Brand").Brand<"
|
212
|
-
readonly client: number & import("effect/Brand").Brand<"
|
207
|
+
readonly seqNum: {
|
208
|
+
readonly global: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
|
209
|
+
readonly client: number & import("effect/Brand").Brand<"ClientEventSequenceNumber">;
|
210
|
+
};
|
211
|
+
} & {
|
212
|
+
readonly parentSeqNum: {
|
213
|
+
readonly global: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
|
214
|
+
readonly client: number & import("effect/Brand").Brand<"ClientEventSequenceNumber">;
|
213
215
|
};
|
214
216
|
} & {
|
215
217
|
readonly meta?: {
|
@@ -230,22 +232,22 @@ export declare class EncodedWithMeta extends EncodedWithMeta_base {
|
|
230
232
|
toJSON: () => any;
|
231
233
|
/**
|
232
234
|
* Example: (global event)
|
233
|
-
* For event
|
234
|
-
* the resulting event
|
235
|
+
* For event e2 → e1 which should be rebased on event e3 → e2
|
236
|
+
* the resulting event num will be e4 → e3
|
235
237
|
*
|
236
238
|
* Example: (client event)
|
237
|
-
* For event
|
238
|
-
* the resulting event
|
239
|
+
* For event e2+1 → e2 which should be rebased on event e3 → e2
|
240
|
+
* the resulting event num will be e3+1 → e3
|
239
241
|
*
|
240
242
|
* Syntax: e2+2 → e2+1
|
241
243
|
* ^ ^ ^ ^
|
242
|
-
* | | | +- client parent
|
243
|
-
* | | +--- global parent
|
244
|
-
* | +-- client
|
245
|
-
* +---- global
|
246
|
-
* Client
|
244
|
+
* | | | +- client parent number
|
245
|
+
* | | +--- global parent number
|
246
|
+
* | +-- client number
|
247
|
+
* +---- global number
|
248
|
+
* Client num is ommitted for global events
|
247
249
|
*/
|
248
|
-
rebase: (
|
250
|
+
rebase: (parentSeqNum: EventSequenceNumber.EventSequenceNumber, isClient: boolean) => EncodedWithMeta;
|
249
251
|
static fromGlobal: (event: AnyEncodedGlobal, syncMetadata: Option.Option<Schema.JsonValue>) => EncodedWithMeta;
|
250
252
|
toGlobal: () => AnyEncodedGlobal;
|
251
253
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LiveStoreEvent.d.ts","sourceRoot":"","sources":["../../src/schema/LiveStoreEvent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAExD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,
|
1
|
+
{"version":3,"file":"LiveStoreEvent.d.ts","sourceRoot":"","sources":["../../src/schema/LiveStoreEvent.ts"],"names":[],"mappings":"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"}
|