@livestore/common 0.3.0-dev.1 → 0.3.0-dev.11

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 (181) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-types.d.ts +47 -35
  3. package/dist/adapter-types.d.ts.map +1 -1
  4. package/dist/adapter-types.js.map +1 -1
  5. package/dist/derived-mutations.d.ts +4 -4
  6. package/dist/derived-mutations.d.ts.map +1 -1
  7. package/dist/derived-mutations.test.js.map +1 -1
  8. package/dist/devtools/devtool-message-leader.d.ts +2 -0
  9. package/dist/devtools/devtool-message-leader.d.ts.map +1 -0
  10. package/dist/devtools/devtool-message-leader.js +2 -0
  11. package/dist/devtools/devtool-message-leader.js.map +1 -0
  12. package/dist/devtools/devtools-bridge.d.ts +2 -1
  13. package/dist/devtools/devtools-bridge.d.ts.map +1 -1
  14. package/dist/devtools/devtools-messages-client-session.d.ts +297 -0
  15. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  16. package/dist/devtools/devtools-messages-client-session.js +61 -0
  17. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  18. package/dist/devtools/devtools-messages-common.d.ts +65 -0
  19. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  20. package/dist/devtools/devtools-messages-common.js +35 -0
  21. package/dist/devtools/devtools-messages-common.js.map +1 -0
  22. package/dist/devtools/devtools-messages-leader.d.ts +261 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  24. package/dist/devtools/devtools-messages-leader.js +85 -0
  25. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  26. package/dist/devtools/devtools-messages.d.ts +3 -592
  27. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  28. package/dist/devtools/devtools-messages.js +3 -171
  29. package/dist/devtools/devtools-messages.js.map +1 -1
  30. package/dist/index.d.ts +0 -4
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/init-singleton-tables.d.ts +2 -2
  33. package/dist/init-singleton-tables.d.ts.map +1 -1
  34. package/dist/init-singleton-tables.js.map +1 -1
  35. package/dist/leader-thread/LeaderSyncProcessor.d.ts +37 -0
  36. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  37. package/dist/leader-thread/LeaderSyncProcessor.js +432 -0
  38. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  39. package/dist/leader-thread/apply-mutation.d.ts +5 -2
  40. package/dist/leader-thread/apply-mutation.d.ts.map +1 -1
  41. package/dist/leader-thread/apply-mutation.js +41 -29
  42. package/dist/leader-thread/apply-mutation.js.map +1 -1
  43. package/dist/leader-thread/connection.d.ts +4 -4
  44. package/dist/leader-thread/connection.d.ts.map +1 -1
  45. package/dist/leader-thread/connection.js +5 -5
  46. package/dist/leader-thread/connection.js.map +1 -1
  47. package/dist/leader-thread/leader-sync-processor.d.ts +2 -2
  48. package/dist/leader-thread/leader-sync-processor.d.ts.map +1 -1
  49. package/dist/leader-thread/leader-sync-processor.js +20 -12
  50. package/dist/leader-thread/leader-sync-processor.js.map +1 -1
  51. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  52. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  53. package/dist/leader-thread/leader-worker-devtools.js +37 -81
  54. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.d.ts +12 -11
  56. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  57. package/dist/leader-thread/make-leader-thread-layer.js +33 -14
  58. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  59. package/dist/leader-thread/mutationlog.d.ts +6 -19
  60. package/dist/leader-thread/mutationlog.d.ts.map +1 -1
  61. package/dist/leader-thread/mutationlog.js +7 -6
  62. package/dist/leader-thread/mutationlog.js.map +1 -1
  63. package/dist/leader-thread/pull-queue-set.d.ts.map +1 -1
  64. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  65. package/dist/leader-thread/recreate-db.js +24 -18
  66. package/dist/leader-thread/recreate-db.js.map +1 -1
  67. package/dist/leader-thread/types.d.ts +36 -16
  68. package/dist/leader-thread/types.d.ts.map +1 -1
  69. package/dist/leader-thread/types.js.map +1 -1
  70. package/dist/mutation.d.ts +9 -2
  71. package/dist/mutation.d.ts.map +1 -1
  72. package/dist/mutation.js +5 -5
  73. package/dist/mutation.js.map +1 -1
  74. package/dist/query-builder/impl.d.ts +1 -1
  75. package/dist/rehydrate-from-mutationlog.d.ts +5 -5
  76. package/dist/rehydrate-from-mutationlog.d.ts.map +1 -1
  77. package/dist/rehydrate-from-mutationlog.js +13 -19
  78. package/dist/rehydrate-from-mutationlog.js.map +1 -1
  79. package/dist/schema/EventId.d.ts +16 -14
  80. package/dist/schema/EventId.d.ts.map +1 -1
  81. package/dist/schema/EventId.js +15 -7
  82. package/dist/schema/EventId.js.map +1 -1
  83. package/dist/schema/EventId.test.d.ts +2 -0
  84. package/dist/schema/EventId.test.d.ts.map +1 -0
  85. package/dist/schema/EventId.test.js +11 -0
  86. package/dist/schema/EventId.test.js.map +1 -0
  87. package/dist/schema/MutationEvent.d.ts +49 -80
  88. package/dist/schema/MutationEvent.d.ts.map +1 -1
  89. package/dist/schema/MutationEvent.js +32 -15
  90. package/dist/schema/MutationEvent.js.map +1 -1
  91. package/dist/schema/MutationEvent.test.d.ts +2 -0
  92. package/dist/schema/MutationEvent.test.d.ts.map +1 -0
  93. package/dist/schema/MutationEvent.test.js +2 -0
  94. package/dist/schema/MutationEvent.test.js.map +1 -0
  95. package/dist/schema/system-tables.d.ts +26 -26
  96. package/dist/schema/system-tables.d.ts.map +1 -1
  97. package/dist/schema/system-tables.js +19 -11
  98. package/dist/schema/system-tables.js.map +1 -1
  99. package/dist/schema-management/common.d.ts +3 -3
  100. package/dist/schema-management/common.d.ts.map +1 -1
  101. package/dist/schema-management/common.js.map +1 -1
  102. package/dist/schema-management/migrations.d.ts +4 -4
  103. package/dist/schema-management/migrations.d.ts.map +1 -1
  104. package/dist/schema-management/migrations.js +6 -6
  105. package/dist/schema-management/migrations.js.map +1 -1
  106. package/dist/sync/ClientSessionSyncProcessor.d.ts +43 -0
  107. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  108. package/dist/sync/ClientSessionSyncProcessor.js +141 -0
  109. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  110. package/dist/sync/client-session-sync-processor.d.ts +4 -4
  111. package/dist/sync/client-session-sync-processor.d.ts.map +1 -1
  112. package/dist/sync/index.d.ts +1 -1
  113. package/dist/sync/index.d.ts.map +1 -1
  114. package/dist/sync/index.js +1 -1
  115. package/dist/sync/index.js.map +1 -1
  116. package/dist/sync/next/history-dag-common.d.ts +1 -4
  117. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  118. package/dist/sync/next/history-dag-common.js +1 -1
  119. package/dist/sync/next/history-dag-common.js.map +1 -1
  120. package/dist/sync/next/rebase-events.d.ts +3 -3
  121. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  122. package/dist/sync/next/rebase-events.js +3 -2
  123. package/dist/sync/next/rebase-events.js.map +1 -1
  124. package/dist/sync/next/test/mutation-fixtures.d.ts +7 -7
  125. package/dist/sync/next/test/mutation-fixtures.d.ts.map +1 -1
  126. package/dist/sync/next/test/mutation-fixtures.js +3 -9
  127. package/dist/sync/next/test/mutation-fixtures.js.map +1 -1
  128. package/dist/sync/sync.d.ts +21 -11
  129. package/dist/sync/sync.d.ts.map +1 -1
  130. package/dist/sync/sync.js.map +1 -1
  131. package/dist/sync/syncstate.d.ts +45 -23
  132. package/dist/sync/syncstate.d.ts.map +1 -1
  133. package/dist/sync/syncstate.js +56 -12
  134. package/dist/sync/syncstate.js.map +1 -1
  135. package/dist/sync/syncstate.test.js +125 -69
  136. package/dist/sync/syncstate.test.js.map +1 -1
  137. package/dist/sync/validate-push-payload.d.ts +2 -2
  138. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  139. package/dist/sync/validate-push-payload.js +2 -2
  140. package/dist/sync/validate-push-payload.js.map +1 -1
  141. package/dist/version.d.ts +1 -1
  142. package/dist/version.d.ts.map +1 -1
  143. package/dist/version.js +1 -1
  144. package/dist/version.js.map +1 -1
  145. package/package.json +6 -5
  146. package/src/adapter-types.ts +39 -40
  147. package/src/derived-mutations.test.ts +1 -1
  148. package/src/derived-mutations.ts +9 -5
  149. package/src/devtools/devtools-bridge.ts +2 -1
  150. package/src/devtools/devtools-messages-client-session.ts +109 -0
  151. package/src/devtools/devtools-messages-common.ts +52 -0
  152. package/src/devtools/devtools-messages-leader.ts +115 -0
  153. package/src/devtools/devtools-messages.ts +3 -243
  154. package/src/index.ts +0 -6
  155. package/src/init-singleton-tables.ts +2 -2
  156. package/src/leader-thread/{leader-sync-processor.ts → LeaderSyncProcessor.ts} +306 -268
  157. package/src/leader-thread/apply-mutation.ts +53 -35
  158. package/src/leader-thread/connection.ts +7 -7
  159. package/src/leader-thread/leader-worker-devtools.ts +52 -124
  160. package/src/leader-thread/make-leader-thread-layer.ts +62 -30
  161. package/src/leader-thread/mutationlog.ts +14 -10
  162. package/src/leader-thread/recreate-db.ts +24 -20
  163. package/src/leader-thread/types.ts +41 -20
  164. package/src/mutation.ts +17 -7
  165. package/src/rehydrate-from-mutationlog.ts +18 -26
  166. package/src/schema/EventId.test.ts +12 -0
  167. package/src/schema/EventId.ts +23 -9
  168. package/src/schema/MutationEvent.ts +46 -24
  169. package/src/schema/system-tables.ts +19 -11
  170. package/src/schema-management/common.ts +3 -3
  171. package/src/schema-management/migrations.ts +10 -10
  172. package/src/sync/{client-session-sync-processor.ts → ClientSessionSyncProcessor.ts} +26 -19
  173. package/src/sync/index.ts +1 -1
  174. package/src/sync/next/history-dag-common.ts +1 -1
  175. package/src/sync/next/rebase-events.ts +7 -7
  176. package/src/sync/next/test/mutation-fixtures.ts +3 -10
  177. package/src/sync/sync.ts +19 -6
  178. package/src/sync/syncstate.test.ts +127 -67
  179. package/src/sync/syncstate.ts +21 -19
  180. package/src/sync/validate-push-payload.ts +7 -4
  181. package/src/version.ts +1 -1
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@livestore/common",
3
- "version": "0.3.0-dev.1",
3
+ "version": "0.3.0-dev.11",
4
4
  "type": "module",
5
+ "sideEffects": false,
5
6
  "exports": {
6
7
  ".": {
7
8
  "types": "./dist/index.d.ts",
@@ -49,12 +50,12 @@
49
50
  }
50
51
  },
51
52
  "dependencies": {
52
- "@opentelemetry/api": "^1.9.0",
53
+ "@opentelemetry/api": "1.9.0",
53
54
  "graphology": "0.26.0-alpha1",
54
55
  "graphology-dag": "0.4.1",
55
- "graphology-types": "0.24.7",
56
- "@livestore/utils": "0.3.0-dev.1",
57
- "@livestore/db-schema": "0.3.0-dev.1"
56
+ "graphology-types": "0.24.8",
57
+ "@livestore/db-schema": "0.3.0-dev.11",
58
+ "@livestore/utils": "0.3.0-dev.11"
58
59
  },
59
60
  "devDependencies": {
60
61
  "vitest": "^2.1.4"
@@ -15,26 +15,51 @@ export interface PreparedStatement {
15
15
  sql: string
16
16
  }
17
17
 
18
- export type SynchronousDatabaseSession = {
18
+ export type SqliteDbSession = {
19
19
  changeset: () => Uint8Array | undefined
20
20
  finish: () => void
21
21
  }
22
22
 
23
- export type SynchronousDatabaseChangeset = {
23
+ export type SqliteDbChangeset = {
24
24
  // TODO combining changesets (requires changes in the SQLite WASM binding)
25
- invert: () => SynchronousDatabaseChangeset
25
+ invert: () => SqliteDbChangeset
26
26
  apply: () => void
27
27
  }
28
28
 
29
29
  export type ClientSession = {
30
30
  /** SQLite database with synchronous API running in the same thread (usually in-memory) */
31
- syncDb: SynchronousDatabase
32
- /** The coordinator is responsible for persisting the database, syncing etc */
33
- coordinator: Coordinator
31
+ sqliteDb: SqliteDb
32
+ devtools: { enabled: false } | { enabled: true; pullLatch: Effect.Latch; pushLatch: Effect.Latch }
33
+ clientId: string
34
+ sessionId: string
35
+ /** Status info whether current session is leader or not */
36
+ lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
37
+ shutdown: (cause: Cause.Cause<UnexpectedError | IntentionalShutdownCause>) => Effect.Effect<void>
38
+ /** A proxy API to communicate with the leader thread */
39
+ leaderThread: ClientSessionLeaderThreadProxy
34
40
  }
35
41
 
36
- export type SynchronousDatabase<TReq = any, TMetadata extends TReq = TReq> = {
37
- _tag: 'SynchronousDatabase'
42
+ export type ClientSessionLeaderThreadProxy = {
43
+ mutations: {
44
+ pull: Stream.Stream<{ payload: PayloadUpstream; remaining: number }, UnexpectedError>
45
+ push(batch: ReadonlyArray<MutationEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | InvalidPushError>
46
+ initialMutationEventId: EventId
47
+ }
48
+ export: Effect.Effect<Uint8Array, UnexpectedError>
49
+ getMutationLogData: Effect.Effect<Uint8Array, UnexpectedError>
50
+ getSyncState: Effect.Effect<SyncState, UnexpectedError>
51
+ networkStatus: SubscriptionRef.SubscriptionRef<NetworkStatus>
52
+ /** For debugging purposes it can be useful to manually trigger devtools messages (e.g. to reset the database) */
53
+ sendDevtoolsMessage: (message: Devtools.MessageToAppLeader) => Effect.Effect<void, UnexpectedError>
54
+ }
55
+
56
+ /**
57
+ * Common interface for SQLite databases used by LiveStore to facilitate a consistent API across different platforms.
58
+ * Always assumes a synchronous SQLite build with the `bytecode` and `session` extensions enabled.
59
+ * Can be either in-memory or persisted to disk.
60
+ */
61
+ export type SqliteDb<TReq = any, TMetadata extends TReq = TReq> = {
62
+ _tag: 'SqliteDb'
38
63
  metadata: TMetadata
39
64
  prepare(queryStr: string): PreparedStatement
40
65
  execute(
@@ -44,14 +69,14 @@ export type SynchronousDatabase<TReq = any, TMetadata extends TReq = TReq> = {
44
69
  ): void
45
70
  select<T>(queryStr: string, bindValues?: PreparedBindValues | undefined): ReadonlyArray<T>
46
71
  export(): Uint8Array
47
- import: (data: Uint8Array | SynchronousDatabase<TReq>) => void
72
+ import: (data: Uint8Array | SqliteDb<TReq>) => void
48
73
  close(): void
49
74
  destroy(): void
50
- session(): SynchronousDatabaseSession
51
- makeChangeset: (data: Uint8Array) => SynchronousDatabaseChangeset
75
+ session(): SqliteDbSession
76
+ makeChangeset: (data: Uint8Array) => SqliteDbChangeset
52
77
  }
53
78
 
54
- export type MakeSynchronousDatabase<
79
+ export type MakeSqliteDb<
55
80
  TReq = { dbPointer: number; persistenceInfo: PersistenceInfo },
56
81
  TInput_ extends { _tag: string } = { _tag: string },
57
82
  TMetadata_ extends TReq = TReq,
@@ -61,11 +86,7 @@ export type MakeSynchronousDatabase<
61
86
  TMetadata extends TMetadata_ & { _tag: TInput['_tag'] } = TMetadata_ & { _tag: TInput['_tag'] },
62
87
  >(
63
88
  input: TInput,
64
- ) => Effect.Effect<
65
- SynchronousDatabase<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>,
66
- SqliteError | UnexpectedError,
67
- R
68
- >
89
+ ) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError | UnexpectedError, R>
69
90
 
70
91
  export const PersistenceInfo = Schema.Struct(
71
92
  {
@@ -103,28 +124,6 @@ export const BootStatus = Schema.Union(
103
124
 
104
125
  export type BootStatus = typeof BootStatus.Type
105
126
 
106
- // TODO refactor `Coordinator` to embrace more of the "leader semantics"
107
- export type Coordinator = {
108
- devtools: {
109
- enabled: boolean
110
- // TODO incorporate sessionId and rethink appHostId
111
- appHostId: string
112
- }
113
- sessionId: string
114
- // TODO is exposing the lock status really needed (or only relevant for web adapter?)
115
- lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
116
- mutations: {
117
- pull: Stream.Stream<{ payload: PayloadUpstream; remaining: number }, UnexpectedError>
118
- push(batch: ReadonlyArray<MutationEvent.AnyEncoded>): Effect.Effect<void, UnexpectedError | InvalidPushError>
119
- initialMutationEventId: EventId
120
- }
121
- export: Effect.Effect<Uint8Array, UnexpectedError>
122
- getMutationLogData: Effect.Effect<Uint8Array, UnexpectedError>
123
- getLeaderSyncState: Effect.Effect<SyncState, UnexpectedError>
124
- networkStatus: SubscriptionRef.SubscriptionRef<NetworkStatus>
125
- shutdown: (cause: Cause.Cause<UnexpectedError | IntentionalShutdownCause>) => Effect.Effect<void>
126
- }
127
-
128
127
  /**
129
128
  * Can be used in queries to refer to the current session id.
130
129
  * Will be replaced with the actual session id at runtime
@@ -198,7 +197,7 @@ export type MigrationHooks = {
198
197
  post: MigrationHook
199
198
  }
200
199
 
201
- export type MigrationHook = (db: SynchronousDatabase) => void | Promise<void> | Effect.Effect<void, unknown>
200
+ export type MigrationHook = (db: SqliteDb) => void | Promise<void> | Effect.Effect<void, unknown>
202
201
 
203
202
  export type MigrationOptionsFromMutationLog<TSchema extends LiveStoreSchema = LiveStoreSchema> = {
204
203
  strategy: 'from-mutation-log'
@@ -94,7 +94,7 @@ describe('derived mutations', () => {
94
94
  })
95
95
  })
96
96
 
97
- const patchId = (muationEvent: MutationEvent.PartialAny) => {
97
+ const patchId = (muationEvent: MutationEvent.PartialAnyDecoded) => {
98
98
  // TODO use new id paradigm
99
99
  const id = `00000000-0000-0000-0000-000000000000`
100
100
  return { ...muationEvent, id }
@@ -136,8 +136,10 @@ export namespace DerivedMutationHelperFns {
136
136
  > = SqliteDsl.AnyIfConstained<
137
137
  TColumns,
138
138
  UseShortcut<TOptions> extends true
139
- ? (values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>) => MutationEvent.PartialAny
140
- : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAny
139
+ ? (
140
+ values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>,
141
+ ) => MutationEvent.PartialAnyDecoded
142
+ : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAnyDecoded
141
143
  >
142
144
 
143
145
  export type UpdateMutationFn<
@@ -146,17 +148,19 @@ export namespace DerivedMutationHelperFns {
146
148
  > = SqliteDsl.AnyIfConstained<
147
149
  TColumns,
148
150
  UseShortcut<TOptions> extends true
149
- ? (values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>) => MutationEvent.PartialAny
151
+ ? (
152
+ values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>,
153
+ ) => MutationEvent.PartialAnyDecoded
150
154
  : (args: {
151
155
  where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>
152
156
  values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>
153
- }) => MutationEvent.PartialAny
157
+ }) => MutationEvent.PartialAnyDecoded
154
158
  >
155
159
 
156
160
  export type DeleteMutationFn<
157
161
  TColumns extends SqliteDsl.ConstraintColumns,
158
162
  _TOptions extends DbSchema.TableOptions,
159
- > = (args: { where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>> }) => MutationEvent.PartialAny
163
+ > = (args: { where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>> }) => MutationEvent.PartialAnyDecoded
160
164
 
161
165
  type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true
162
166
  ? TOptions['isSingleton'] extends true
@@ -6,7 +6,8 @@ export type PrepareDevtoolsBridge = {
6
6
  /** Messages coming from the app host (usually responses to requests) */
7
7
  responsePubSub: PubSub.PubSub<Devtools.MessageFromAppLeader | Devtools.MessageFromAppClientSession>
8
8
  sendToAppHost: (msg: Devtools.MessageToAppLeader | Devtools.MessageToAppClientSession) => Effect.Effect<void>
9
- appHostId: string
9
+ clientId: string
10
+ sessionId: string
10
11
  copyToClipboard: (text: string) => Effect.Effect<void>
11
12
  sendEscapeKey?: Effect.Effect<void>
12
13
  isLeader: boolean
@@ -0,0 +1,109 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+
3
+ import { DebugInfo } from '../debug-info.js'
4
+ import { PreparedBindValues } from '../util.js'
5
+ import { Disconnect, LSDClientSessionReqResMessage } from './devtools-messages-common.js'
6
+
7
+ export class DebugInfoReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoReq', {}) {}
8
+
9
+ export class DebugInfoRes extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoRes', {
10
+ debugInfo: DebugInfo,
11
+ }) {}
12
+
13
+ export class DebugInfoHistorySubscribe extends LSDClientSessionReqResMessage(
14
+ 'LSD.ClientSession.DebugInfoHistorySubscribe',
15
+ {},
16
+ ) {}
17
+
18
+ export class DebugInfoHistoryRes extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoHistoryRes', {
19
+ debugInfoHistory: Schema.Array(DebugInfo),
20
+ }) {}
21
+
22
+ export class DebugInfoHistoryUnsubscribe extends LSDClientSessionReqResMessage(
23
+ 'LSD.ClientSession.DebugInfoHistoryUnsubscribe',
24
+ {},
25
+ ) {}
26
+
27
+ export class DebugInfoResetReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoResetReq', {}) {}
28
+
29
+ export class DebugInfoResetRes extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoResetRes', {}) {}
30
+
31
+ export class DebugInfoRerunQueryReq extends LSDClientSessionReqResMessage('LSD.ClientSession.DebugInfoRerunQueryReq', {
32
+ queryStr: Schema.String,
33
+ bindValues: Schema.UndefinedOr(PreparedBindValues),
34
+ queriedTables: Schema.ReadonlySet(Schema.String),
35
+ }) {}
36
+
37
+ export class DebugInfoRerunQueryRes extends LSDClientSessionReqResMessage(
38
+ 'LSD.ClientSession.DebugInfoRerunQueryRes',
39
+ {},
40
+ ) {}
41
+
42
+ export class ReactivityGraphSubscribe extends LSDClientSessionReqResMessage(
43
+ 'LSD.ClientSession.ReactivityGraphSubscribe',
44
+ {
45
+ includeResults: Schema.Boolean,
46
+ },
47
+ ) {}
48
+
49
+ export class ReactivityGraphUnsubscribe extends LSDClientSessionReqResMessage(
50
+ 'LSD.ClientSession.ReactivityGraphUnsubscribe',
51
+ {},
52
+ ) {}
53
+
54
+ export class ReactivityGraphRes extends LSDClientSessionReqResMessage('LSD.ClientSession.ReactivityGraphRes', {
55
+ reactivityGraph: Schema.Any,
56
+ }) {}
57
+
58
+ export class LiveQueriesSubscribe extends LSDClientSessionReqResMessage('LSD.ClientSession.LiveQueriesSubscribe', {}) {}
59
+
60
+ export class LiveQueriesUnsubscribe extends LSDClientSessionReqResMessage(
61
+ 'LSD.ClientSession.LiveQueriesUnsubscribe',
62
+ {},
63
+ ) {}
64
+
65
+ export class SerializedLiveQuery extends Schema.Struct({
66
+ _tag: Schema.Literal('computed', 'db', 'graphql'),
67
+ id: Schema.Number,
68
+ label: Schema.String,
69
+ runs: Schema.Number,
70
+ executionTimes: Schema.Array(Schema.Number),
71
+ lastestResult: Schema.Any,
72
+ activeSubscriptions: Schema.Array(
73
+ Schema.Struct({ frames: Schema.Array(Schema.Struct({ name: Schema.String, filePath: Schema.String })) }),
74
+ ),
75
+ }) {}
76
+
77
+ export class LiveQueriesRes extends LSDClientSessionReqResMessage('LSD.ClientSession.LiveQueriesRes', {
78
+ liveQueries: Schema.Array(SerializedLiveQuery),
79
+ }) {}
80
+
81
+ export const MessageToAppClientSession = Schema.Union(
82
+ DebugInfoReq,
83
+ DebugInfoHistorySubscribe,
84
+ DebugInfoHistoryUnsubscribe,
85
+ DebugInfoResetReq,
86
+ DebugInfoRerunQueryReq,
87
+ ReactivityGraphSubscribe,
88
+ ReactivityGraphUnsubscribe,
89
+ LiveQueriesSubscribe,
90
+ LiveQueriesUnsubscribe,
91
+ Disconnect,
92
+ // TODO also introduce a ping/pong protocol for the client session <> devtools connection
93
+ // Ping,
94
+ ).annotations({ identifier: 'LSD.MessageToAppClientSession' })
95
+
96
+ export type MessageToAppClientSession = typeof MessageToAppClientSession.Type
97
+
98
+ export const MessageFromAppClientSession = Schema.Union(
99
+ DebugInfoRes,
100
+ DebugInfoHistoryRes,
101
+ DebugInfoResetRes,
102
+ DebugInfoRerunQueryRes,
103
+ ReactivityGraphRes,
104
+ LiveQueriesRes,
105
+ Disconnect,
106
+ // Pong,
107
+ ).annotations({ identifier: 'LSD.MessageFromAppClientSession' })
108
+
109
+ export type MessageFromAppClientSession = typeof MessageFromAppClientSession.Type
@@ -0,0 +1,52 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+
3
+ import { liveStoreVersion as pkgVersion } from '../version.js'
4
+
5
+ const requestId = Schema.String
6
+ const clientId = Schema.String
7
+ const sessionId = Schema.String
8
+ const liveStoreVersion = Schema.Literal(pkgVersion)
9
+
10
+ export const LSDMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
11
+ Schema.TaggedStruct(tag, {
12
+ liveStoreVersion,
13
+ ...fields,
14
+ }).annotations({ identifier: tag })
15
+
16
+ export const LSDChannelMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
17
+ LSDMessage(tag, {
18
+ ...fields,
19
+ })
20
+
21
+ export const LSDClientSessionChannelMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(
22
+ tag: Tag,
23
+ fields: Fields,
24
+ ) =>
25
+ LSDMessage(tag, {
26
+ clientId,
27
+ sessionId,
28
+ ...fields,
29
+ })
30
+
31
+ export const LSDClientSessionReqResMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(
32
+ tag: Tag,
33
+ fields: Fields,
34
+ ) =>
35
+ LSDMessage(tag, {
36
+ clientId,
37
+ sessionId,
38
+ requestId,
39
+ ...fields,
40
+ })
41
+
42
+ export const LSDReqResMessage = <Tag extends string, Fields extends Schema.Struct.Fields>(tag: Tag, fields: Fields) =>
43
+ LSDChannelMessage(tag, {
44
+ requestId,
45
+ ...fields,
46
+ })
47
+
48
+ export class Disconnect extends LSDClientSessionChannelMessage('LSD.Disconnect', {}) {}
49
+
50
+ export class Ping extends LSDReqResMessage('LSD.Ping', {}) {}
51
+
52
+ export class Pong extends LSDReqResMessage('LSD.Pong', {}) {}
@@ -0,0 +1,115 @@
1
+ import { Schema, Transferable } from '@livestore/utils/effect'
2
+
3
+ import { NetworkStatus } from '../adapter-types.js'
4
+ import * as MutationEvent from '../schema/MutationEvent.js'
5
+ import { Disconnect, LSDMessage, LSDReqResMessage, Ping, Pong } from './devtools-messages-common.js'
6
+
7
+ export class ResetAllDataReq extends LSDReqResMessage('LSD.Leader.ResetAllDataReq', {
8
+ mode: Schema.Literal('all-data', 'only-app-db'),
9
+ }) {}
10
+
11
+ export class ResetAllDataRes extends LSDReqResMessage('LSD.Leader.ResetAllDataRes', {}) {}
12
+
13
+ export class DatabaseFileInfoReq extends LSDReqResMessage('LSD.Leader.DatabaseFileInfoReq', {}) {}
14
+
15
+ export class DatabaseFileInfo extends Schema.Struct({
16
+ fileSize: Schema.Number,
17
+ persistenceInfo: Schema.Struct({ fileName: Schema.String }, { key: Schema.String, value: Schema.Any }),
18
+ }) {}
19
+
20
+ export class DatabaseFileInfoRes extends LSDReqResMessage('LSD.Leader.DatabaseFileInfoRes', {
21
+ readModel: DatabaseFileInfo,
22
+ mutationLog: DatabaseFileInfo,
23
+ }) {}
24
+
25
+ export class NetworkStatusSubscribe extends LSDReqResMessage('LSD.Leader.NetworkStatusSubscribe', {}) {}
26
+ export class NetworkStatusUnsubscribe extends LSDReqResMessage('LSD.Leader.NetworkStatusUnsubscribe', {}) {}
27
+
28
+ export class NetworkStatusRes extends LSDReqResMessage('LSD.Leader.NetworkStatusRes', {
29
+ networkStatus: NetworkStatus,
30
+ }) {}
31
+
32
+ export class SyncingInfoReq extends LSDReqResMessage('LSD.Leader.SyncingInfoReq', {}) {}
33
+
34
+ export class SyncingInfo extends Schema.Struct({
35
+ enabled: Schema.Boolean,
36
+ metadata: Schema.Record({ key: Schema.String, value: Schema.Any }),
37
+ }) {}
38
+
39
+ export class SyncingInfoRes extends LSDReqResMessage('LSD.Leader.SyncingInfoRes', {
40
+ syncingInfo: SyncingInfo,
41
+ }) {}
42
+
43
+ export class SyncHistorySubscribe extends LSDReqResMessage('LSD.Leader.SyncHistorySubscribe', {}) {}
44
+ export class SyncHistoryUnsubscribe extends LSDReqResMessage('LSD.Leader.SyncHistoryUnsubscribe', {}) {}
45
+ export class SyncHistoryRes extends LSDReqResMessage('LSD.Leader.SyncHistoryRes', {
46
+ mutationEventEncoded: MutationEvent.AnyEncodedGlobal,
47
+ metadata: Schema.Option(Schema.JsonValue),
48
+ }) {}
49
+
50
+ export class SnapshotReq extends LSDReqResMessage('LSD.Leader.SnapshotReq', {}) {}
51
+
52
+ export class SnapshotRes extends LSDReqResMessage('LSD.Leader.SnapshotRes', {
53
+ snapshot: Transferable.Uint8Array,
54
+ }) {}
55
+
56
+ export class LoadDatabaseFileReq extends LSDReqResMessage('LSD.Leader.LoadDatabaseFileReq', {
57
+ data: Transferable.Uint8Array,
58
+ }) {}
59
+
60
+ export class LoadDatabaseFileRes extends LSDReqResMessage('LSD.Leader.LoadDatabaseFileRes', {
61
+ status: Schema.Literal('ok', 'unsupported-file', 'unsupported-database'),
62
+ }) {}
63
+
64
+ // TODO refactor this to use push/pull semantics
65
+ export class MutationBroadcast extends LSDMessage('LSD.Leader.MutationBroadcast', {
66
+ mutationEventEncoded: MutationEvent.AnyEncoded,
67
+ }) {}
68
+
69
+ // TODO refactor this to use push/pull semantics
70
+ export class RunMutationReq extends LSDReqResMessage('LSD.Leader.RunMutationReq', {
71
+ mutationEventEncoded: MutationEvent.AnyEncoded.pipe(Schema.omit('id', 'parentId')),
72
+ }) {}
73
+
74
+ export class RunMutationRes extends LSDReqResMessage('LSD.Leader.RunMutationRes', {}) {}
75
+
76
+ export class MutationLogReq extends LSDReqResMessage('LSD.Leader.MutationLogReq', {}) {}
77
+
78
+ export class MutationLogRes extends LSDReqResMessage('LSD.Leader.MutationLogRes', {
79
+ mutationLog: Transferable.Uint8Array,
80
+ }) {}
81
+
82
+ export const MessageToAppLeader = Schema.Union(
83
+ SnapshotReq,
84
+ LoadDatabaseFileReq,
85
+ MutationLogReq,
86
+ ResetAllDataReq,
87
+ NetworkStatusSubscribe,
88
+ NetworkStatusUnsubscribe,
89
+ Disconnect,
90
+ RunMutationReq,
91
+ Ping,
92
+ DatabaseFileInfoReq,
93
+ SyncHistorySubscribe,
94
+ SyncHistoryUnsubscribe,
95
+ SyncingInfoReq,
96
+ ).annotations({ identifier: 'LSD.MessageToAppLeader' })
97
+
98
+ export type MessageToAppLeader = typeof MessageToAppLeader.Type
99
+
100
+ export const MessageFromAppLeader = Schema.Union(
101
+ SnapshotRes,
102
+ LoadDatabaseFileRes,
103
+ MutationLogRes,
104
+ ResetAllDataRes,
105
+ Disconnect,
106
+ MutationBroadcast,
107
+ NetworkStatusRes,
108
+ RunMutationRes,
109
+ Pong,
110
+ DatabaseFileInfoRes,
111
+ SyncHistoryRes,
112
+ SyncingInfoRes,
113
+ ).annotations({ identifier: 'LSD.MessageFromAppLeader' })
114
+
115
+ export type MessageFromAppLeader = typeof MessageFromAppLeader.Type