@livestore/common 0.3.0-dev.14 → 0.3.0-dev.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +6 -6
  3. package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
  4. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  5. package/dist/devtools/devtools-messages-leader.d.ts +28 -28
  6. package/dist/devtools/index.d.ts +17 -0
  7. package/dist/devtools/index.d.ts.map +1 -1
  8. package/dist/devtools/index.js +20 -0
  9. package/dist/devtools/index.js.map +1 -1
  10. package/dist/schema/table-def.d.ts +2 -5
  11. package/dist/schema/table-def.d.ts.map +1 -1
  12. package/dist/schema/table-def.js.map +1 -1
  13. package/dist/version.d.ts +1 -1
  14. package/dist/version.js +1 -1
  15. package/package.json +2 -2
  16. package/src/devtools/index.ts +27 -0
  17. package/src/schema/table-def.ts +2 -3
  18. package/src/version.ts +1 -1
  19. package/dist/db-schema/ast/sqlite.d.ts +0 -69
  20. package/dist/db-schema/ast/sqlite.d.ts.map +0 -1
  21. package/dist/db-schema/ast/sqlite.js +0 -71
  22. package/dist/db-schema/ast/sqlite.js.map +0 -1
  23. package/dist/db-schema/ast/validate.d.ts +0 -3
  24. package/dist/db-schema/ast/validate.d.ts.map +0 -1
  25. package/dist/db-schema/ast/validate.js +0 -12
  26. package/dist/db-schema/ast/validate.js.map +0 -1
  27. package/dist/db-schema/dsl/field-defs.d.ts +0 -90
  28. package/dist/db-schema/dsl/field-defs.d.ts.map +0 -1
  29. package/dist/db-schema/dsl/field-defs.js +0 -87
  30. package/dist/db-schema/dsl/field-defs.js.map +0 -1
  31. package/dist/db-schema/dsl/field-defs.test.d.ts +0 -2
  32. package/dist/db-schema/dsl/field-defs.test.d.ts.map +0 -1
  33. package/dist/db-schema/dsl/field-defs.test.js +0 -29
  34. package/dist/db-schema/dsl/field-defs.test.js.map +0 -1
  35. package/dist/db-schema/dsl/index.d.ts +0 -88
  36. package/dist/db-schema/dsl/index.d.ts.map +0 -1
  37. package/dist/db-schema/dsl/index.js +0 -35
  38. package/dist/db-schema/dsl/index.js.map +0 -1
  39. package/dist/db-schema/dsl/mod.d.ts +0 -90
  40. package/dist/db-schema/dsl/mod.d.ts.map +0 -1
  41. package/dist/db-schema/dsl/mod.js +0 -35
  42. package/dist/db-schema/dsl/mod.js.map +0 -1
  43. package/dist/db-schema/dsl/sqlite/field-defs.d.ts +0 -90
  44. package/dist/db-schema/dsl/sqlite/field-defs.d.ts.map +0 -1
  45. package/dist/db-schema/dsl/sqlite/field-defs.js +0 -86
  46. package/dist/db-schema/dsl/sqlite/field-defs.js.map +0 -1
  47. package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts +0 -2
  48. package/dist/db-schema/dsl/sqlite/field-defs.test.d.ts.map +0 -1
  49. package/dist/db-schema/dsl/sqlite/field-defs.test.js +0 -29
  50. package/dist/db-schema/dsl/sqlite/field-defs.test.js.map +0 -1
  51. package/dist/db-schema/dsl/sqlite/index.d.ts +0 -88
  52. package/dist/db-schema/dsl/sqlite/index.d.ts.map +0 -1
  53. package/dist/db-schema/dsl/sqlite/index.js +0 -35
  54. package/dist/db-schema/dsl/sqlite/index.js.map +0 -1
  55. package/dist/db-schema/hash.d.ts +0 -2
  56. package/dist/db-schema/hash.d.ts.map +0 -1
  57. package/dist/db-schema/hash.js +0 -14
  58. package/dist/db-schema/hash.js.map +0 -1
  59. package/dist/db-schema/index.d.ts +0 -4
  60. package/dist/db-schema/index.d.ts.map +0 -1
  61. package/dist/db-schema/index.js +0 -6
  62. package/dist/db-schema/index.js.map +0 -1
  63. package/dist/db-schema/mod.d.ts +0 -3
  64. package/dist/db-schema/mod.d.ts.map +0 -1
  65. package/dist/db-schema/mod.js +0 -3
  66. package/dist/db-schema/mod.js.map +0 -1
  67. package/dist/devtools/devtool-message-leader.d.ts +0 -2
  68. package/dist/devtools/devtool-message-leader.d.ts.map +0 -1
  69. package/dist/devtools/devtool-message-leader.js +0 -2
  70. package/dist/devtools/devtool-message-leader.js.map +0 -1
  71. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  72. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  73. package/dist/leader-thread/leader-sync-processor.js +0 -430
  74. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  75. package/dist/schema/MutationEvent.test.d.ts +0 -2
  76. package/dist/schema/MutationEvent.test.d.ts.map +0 -1
  77. package/dist/schema/MutationEvent.test.js +0 -2
  78. package/dist/schema/MutationEvent.test.js.map +0 -1
  79. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  80. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  81. package/dist/sync/client-session-sync-processor.js +0 -131
  82. package/dist/sync/client-session-sync-processor.js.map +0 -1
@@ -1,131 +0,0 @@
1
- import { LS_DEV, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils';
2
- import { Effect, Schema, Stream } from '@livestore/utils/effect';
3
- import * as otel from '@opentelemetry/api';
4
- import * as EventId from '../schema/EventId.js';
5
- import * as MutationEvent from '../schema/MutationEvent.js';
6
- import { updateSyncState } from './syncstate.js';
7
- /**
8
- * Rebase behaviour:
9
- * - We continously pull mutations from the leader and apply them to the local store.
10
- * - If there was a race condition (i.e. the leader and client session have both advacned),
11
- * we'll need to rebase the local pending mutations on top of the leader's head.
12
- * - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
13
- * - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
14
- * - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
15
- */
16
- export const makeClientSessionSyncProcessor = ({ schema, initialLeaderHead, pushToLeader, pullFromLeader, applyMutation, rollback, refreshTables, span, }) => {
17
- const mutationEventSchema = MutationEvent.makeMutationEventSchemaMemo(schema);
18
- const syncStateRef = {
19
- current: {
20
- localHead: initialLeaderHead,
21
- upstreamHead: initialLeaderHead,
22
- pending: [],
23
- // TODO init rollbackTail from leader to be ready for backend rebasing
24
- rollbackTail: [],
25
- },
26
- };
27
- const isLocalEvent = (mutationEventEncoded) => {
28
- const mutationDef = schema.mutations.get(mutationEventEncoded.mutation);
29
- return mutationDef.options.localOnly;
30
- };
31
- const push = (batch, { otelContext }) => {
32
- // TODO validate batch
33
- let baseEventId = syncStateRef.current.localHead;
34
- const encodedMutationEvents = batch.map((mutationEvent) => {
35
- const mutationDef = schema.mutations.get(mutationEvent.mutation);
36
- const nextIdPair = EventId.nextPair(baseEventId, mutationDef.options.localOnly);
37
- baseEventId = nextIdPair.id;
38
- return new MutationEvent.EncodedWithMeta(Schema.encodeUnknownSync(mutationEventSchema)({ ...mutationEvent, ...nextIdPair }));
39
- });
40
- const updateResult = updateSyncState({
41
- syncState: syncStateRef.current,
42
- payload: { _tag: 'local-push', newEvents: encodedMutationEvents },
43
- isLocalEvent,
44
- isEqualEvent: MutationEvent.isEqualEncoded,
45
- });
46
- span.addEvent('local-push', {
47
- batchSize: encodedMutationEvents.length,
48
- updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
49
- });
50
- if (updateResult._tag !== 'advance') {
51
- return shouldNeverHappen(`Expected advance, got ${updateResult._tag}`);
52
- }
53
- syncStateRef.current = updateResult.newSyncState;
54
- const writeTables = new Set();
55
- for (const mutationEvent of updateResult.newEvents) {
56
- // TODO avoid encoding and decoding here again
57
- const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
58
- const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
59
- for (const table of res.writeTables) {
60
- writeTables.add(table);
61
- }
62
- mutationEvent.meta.sessionChangeset = res.sessionChangeset;
63
- }
64
- pushToLeader(encodedMutationEvents);
65
- return { writeTables };
66
- };
67
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
68
- const boot = Effect.gen(function* () {
69
- yield* pullFromLeader.pipe(Stream.tap(({ payload, remaining }) => Effect.gen(function* () {
70
- // console.log('pulled payload from leader', { payload, remaining })
71
- const updateResult = updateSyncState({
72
- syncState: syncStateRef.current,
73
- payload,
74
- isLocalEvent,
75
- isEqualEvent: MutationEvent.isEqualEncoded,
76
- });
77
- if (updateResult._tag === 'reject') {
78
- debugger;
79
- throw new Error('TODO: implement reject in client-session-sync-queue for pull');
80
- }
81
- syncStateRef.current = updateResult.newSyncState;
82
- if (updateResult._tag === 'rebase') {
83
- span.addEvent('pull:rebase', {
84
- payloadTag: payload._tag,
85
- payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
86
- newEventsCount: updateResult.newEvents.length,
87
- rollbackCount: updateResult.eventsToRollback.length,
88
- res: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
89
- remaining,
90
- });
91
- if (LS_DEV) {
92
- console.debug('pull:rebase: rollback', updateResult.eventsToRollback.length, ...updateResult.eventsToRollback.map((_) => _.toJSON()));
93
- }
94
- for (let i = updateResult.eventsToRollback.length - 1; i >= 0; i--) {
95
- const event = updateResult.eventsToRollback[i];
96
- if (event.meta.sessionChangeset) {
97
- rollback(event.meta.sessionChangeset);
98
- event.meta.sessionChangeset = undefined;
99
- }
100
- }
101
- }
102
- else {
103
- span.addEvent('pull:advance', {
104
- payloadTag: payload._tag,
105
- payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
106
- newEventsCount: updateResult.newEvents.length,
107
- res: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
108
- remaining,
109
- });
110
- }
111
- if (updateResult.newEvents.length === 0)
112
- return;
113
- const writeTables = new Set();
114
- for (const mutationEvent of updateResult.newEvents) {
115
- const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent);
116
- const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true });
117
- for (const table of res.writeTables) {
118
- writeTables.add(table);
119
- }
120
- mutationEvent.meta.sessionChangeset = res.sessionChangeset;
121
- }
122
- refreshTables(writeTables);
123
- })), Stream.runDrain, Effect.tapCauseLogPretty, Effect.forkScoped);
124
- });
125
- return {
126
- push,
127
- boot,
128
- syncStateRef,
129
- };
130
- };
131
- //# sourceMappingURL=client-session-sync-processor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-session-sync-processor.js","sourceRoot":"","sources":["../../src/sync/client-session-sync-processor.ts"],"names":[],"mappings":"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"}