@livestore/common 0.3.0-dev.37 → 0.3.0-dev.39

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 (203) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-types.d.ts +3 -2
  3. package/dist/adapter-types.d.ts.map +1 -1
  4. package/dist/adapter-types.js.map +1 -1
  5. package/dist/devtools/devtools-messages-client-session.d.ts +29 -29
  6. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  7. package/dist/devtools/devtools-messages-leader.d.ts +24 -24
  8. package/dist/devtools/devtools-sessioninfo.d.ts +2 -0
  9. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
  10. package/dist/devtools/devtools-sessioninfo.js +1 -0
  11. package/dist/devtools/devtools-sessioninfo.js.map +1 -1
  12. package/dist/devtools/mod.d.ts +48 -32
  13. package/dist/devtools/mod.d.ts.map +1 -1
  14. package/dist/devtools/mod.js +27 -21
  15. package/dist/devtools/mod.js.map +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  21. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  22. package/dist/leader-thread/leader-worker-devtools.js +21 -13
  23. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  24. package/dist/leader-thread/types.d.ts +6 -4
  25. package/dist/leader-thread/types.d.ts.map +1 -1
  26. package/dist/leader-thread/types.js.map +1 -1
  27. package/dist/make-client-session.d.ts +21 -0
  28. package/dist/make-client-session.d.ts.map +1 -0
  29. package/dist/make-client-session.js +51 -0
  30. package/dist/make-client-session.js.map +1 -0
  31. package/dist/materializer-helper.d.ts.map +1 -1
  32. package/dist/materializer-helper.js +1 -1
  33. package/dist/materializer-helper.js.map +1 -1
  34. package/dist/schema/EventDef.d.ts +2 -2
  35. package/dist/schema/LiveStoreEvent.d.ts +6 -6
  36. package/dist/schema/state/sqlite/system-tables.d.ts +2 -2
  37. package/dist/sync/next/test/event-fixtures.d.ts +7 -7
  38. package/dist/sync/syncstate.d.ts +2 -2
  39. package/dist/version.d.ts +1 -1
  40. package/dist/version.js +1 -1
  41. package/package.json +4 -3
  42. package/src/adapter-types.ts +4 -2
  43. package/src/devtools/devtools-sessioninfo.ts +1 -0
  44. package/src/devtools/mod.ts +44 -21
  45. package/src/index.ts +1 -0
  46. package/src/leader-thread/leader-worker-devtools.ts +40 -22
  47. package/src/leader-thread/types.ts +5 -4
  48. package/src/make-client-session.ts +119 -0
  49. package/src/materializer-helper.ts +2 -1
  50. package/src/version.ts +1 -1
  51. package/dist/derived-mutations.d.ts +0 -77
  52. package/dist/derived-mutations.d.ts.map +0 -1
  53. package/dist/derived-mutations.js +0 -54
  54. package/dist/derived-mutations.js.map +0 -1
  55. package/dist/derived-mutations.test.d.ts +0 -2
  56. package/dist/derived-mutations.test.d.ts.map +0 -1
  57. package/dist/derived-mutations.test.js +0 -93
  58. package/dist/derived-mutations.test.js.map +0 -1
  59. package/dist/devtools/devtools-bridge.d.ts +0 -12
  60. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  61. package/dist/devtools/devtools-bridge.js +0 -2
  62. package/dist/devtools/devtools-bridge.js.map +0 -1
  63. package/dist/devtools/devtools-window-message.d.ts +0 -29
  64. package/dist/devtools/devtools-window-message.d.ts.map +0 -1
  65. package/dist/devtools/devtools-window-message.js +0 -33
  66. package/dist/devtools/devtools-window-message.js.map +0 -1
  67. package/dist/devtools/index.d.ts +0 -42
  68. package/dist/devtools/index.d.ts.map +0 -1
  69. package/dist/devtools/index.js +0 -49
  70. package/dist/devtools/index.js.map +0 -1
  71. package/dist/init-singleton-tables.d.ts +0 -4
  72. package/dist/init-singleton-tables.d.ts.map +0 -1
  73. package/dist/init-singleton-tables.js +0 -16
  74. package/dist/init-singleton-tables.js.map +0 -1
  75. package/dist/leader-thread/apply-event.d.ts +0 -16
  76. package/dist/leader-thread/apply-event.d.ts.map +0 -1
  77. package/dist/leader-thread/apply-event.js +0 -103
  78. package/dist/leader-thread/apply-event.js.map +0 -1
  79. package/dist/mutation.d.ts +0 -14
  80. package/dist/mutation.d.ts.map +0 -1
  81. package/dist/mutation.js +0 -71
  82. package/dist/mutation.js.map +0 -1
  83. package/dist/query-builder/api.d.ts +0 -293
  84. package/dist/query-builder/api.d.ts.map +0 -1
  85. package/dist/query-builder/api.js +0 -6
  86. package/dist/query-builder/api.js.map +0 -1
  87. package/dist/query-builder/astToSql.d.ts +0 -7
  88. package/dist/query-builder/astToSql.d.ts.map +0 -1
  89. package/dist/query-builder/astToSql.js +0 -190
  90. package/dist/query-builder/astToSql.js.map +0 -1
  91. package/dist/query-builder/impl.d.ts +0 -7
  92. package/dist/query-builder/impl.d.ts.map +0 -1
  93. package/dist/query-builder/impl.js +0 -286
  94. package/dist/query-builder/impl.js.map +0 -1
  95. package/dist/query-builder/impl.test.d.ts +0 -87
  96. package/dist/query-builder/impl.test.d.ts.map +0 -1
  97. package/dist/query-builder/impl.test.js +0 -554
  98. package/dist/query-builder/impl.test.js.map +0 -1
  99. package/dist/query-builder/mod.d.ts +0 -17
  100. package/dist/query-builder/mod.d.ts.map +0 -1
  101. package/dist/query-builder/mod.js +0 -17
  102. package/dist/query-builder/mod.js.map +0 -1
  103. package/dist/query-info.d.ts +0 -38
  104. package/dist/query-info.d.ts.map +0 -1
  105. package/dist/query-info.js +0 -7
  106. package/dist/query-info.js.map +0 -1
  107. package/dist/rehydrate-from-eventlog.d.ts +0 -14
  108. package/dist/rehydrate-from-eventlog.d.ts.map +0 -1
  109. package/dist/rehydrate-from-eventlog.js +0 -64
  110. package/dist/rehydrate-from-eventlog.js.map +0 -1
  111. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  112. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  113. package/dist/rehydrate-from-mutationlog.js +0 -72
  114. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  115. package/dist/schema/client-document-def.d.ts +0 -223
  116. package/dist/schema/client-document-def.d.ts.map +0 -1
  117. package/dist/schema/client-document-def.js +0 -170
  118. package/dist/schema/client-document-def.js.map +0 -1
  119. package/dist/schema/client-document-def.test.d.ts +0 -2
  120. package/dist/schema/client-document-def.test.d.ts.map +0 -1
  121. package/dist/schema/client-document-def.test.js +0 -201
  122. package/dist/schema/client-document-def.test.js.map +0 -1
  123. package/dist/schema/db-schema/ast/sqlite.d.ts +0 -69
  124. package/dist/schema/db-schema/ast/sqlite.d.ts.map +0 -1
  125. package/dist/schema/db-schema/ast/sqlite.js +0 -71
  126. package/dist/schema/db-schema/ast/sqlite.js.map +0 -1
  127. package/dist/schema/db-schema/ast/validate.d.ts +0 -3
  128. package/dist/schema/db-schema/ast/validate.d.ts.map +0 -1
  129. package/dist/schema/db-schema/ast/validate.js +0 -12
  130. package/dist/schema/db-schema/ast/validate.js.map +0 -1
  131. package/dist/schema/db-schema/dsl/field-defs.d.ts +0 -90
  132. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +0 -1
  133. package/dist/schema/db-schema/dsl/field-defs.js +0 -87
  134. package/dist/schema/db-schema/dsl/field-defs.js.map +0 -1
  135. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +0 -2
  136. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +0 -1
  137. package/dist/schema/db-schema/dsl/field-defs.test.js +0 -29
  138. package/dist/schema/db-schema/dsl/field-defs.test.js.map +0 -1
  139. package/dist/schema/db-schema/dsl/mod.d.ts +0 -90
  140. package/dist/schema/db-schema/dsl/mod.d.ts.map +0 -1
  141. package/dist/schema/db-schema/dsl/mod.js +0 -41
  142. package/dist/schema/db-schema/dsl/mod.js.map +0 -1
  143. package/dist/schema/db-schema/hash.d.ts +0 -2
  144. package/dist/schema/db-schema/hash.d.ts.map +0 -1
  145. package/dist/schema/db-schema/hash.js +0 -14
  146. package/dist/schema/db-schema/hash.js.map +0 -1
  147. package/dist/schema/db-schema/mod.d.ts +0 -3
  148. package/dist/schema/db-schema/mod.d.ts.map +0 -1
  149. package/dist/schema/db-schema/mod.js +0 -3
  150. package/dist/schema/db-schema/mod.js.map +0 -1
  151. package/dist/schema/index.d.ts +0 -62
  152. package/dist/schema/index.d.ts.map +0 -1
  153. package/dist/schema/index.js +0 -67
  154. package/dist/schema/index.js.map +0 -1
  155. package/dist/schema/mutations.d.ts +0 -227
  156. package/dist/schema/mutations.d.ts.map +0 -1
  157. package/dist/schema/mutations.js +0 -68
  158. package/dist/schema/mutations.js.map +0 -1
  159. package/dist/schema/schema-helpers.d.ts +0 -4
  160. package/dist/schema/schema-helpers.d.ts.map +0 -1
  161. package/dist/schema/schema-helpers.js +0 -30
  162. package/dist/schema/schema-helpers.js.map +0 -1
  163. package/dist/schema/sqlite-state.d.ts +0 -12
  164. package/dist/schema/sqlite-state.d.ts.map +0 -1
  165. package/dist/schema/sqlite-state.js +0 -36
  166. package/dist/schema/sqlite-state.js.map +0 -1
  167. package/dist/schema/state/sqlite/sqlite-state.d.ts +0 -12
  168. package/dist/schema/state/sqlite/sqlite-state.d.ts.map +0 -1
  169. package/dist/schema/state/sqlite/sqlite-state.js +0 -36
  170. package/dist/schema/state/sqlite/sqlite-state.js.map +0 -1
  171. package/dist/schema/state/state.d.ts +0 -3
  172. package/dist/schema/state/state.d.ts.map +0 -1
  173. package/dist/schema/state/state.js +0 -3
  174. package/dist/schema/state/state.js.map +0 -1
  175. package/dist/schema/state.d.ts +0 -3
  176. package/dist/schema/state.d.ts.map +0 -1
  177. package/dist/schema/state.js +0 -3
  178. package/dist/schema/state.js.map +0 -1
  179. package/dist/schema/system-tables.d.ts +0 -27
  180. package/dist/schema/system-tables.d.ts.map +0 -1
  181. package/dist/schema/system-tables.js +0 -86
  182. package/dist/schema/system-tables.js.map +0 -1
  183. package/dist/schema/table-def.d.ts +0 -84
  184. package/dist/schema/table-def.d.ts.map +0 -1
  185. package/dist/schema/table-def.js +0 -36
  186. package/dist/schema/table-def.js.map +0 -1
  187. package/dist/schema/view.d.ts +0 -3
  188. package/dist/schema/view.d.ts.map +0 -1
  189. package/dist/schema/view.js +0 -3
  190. package/dist/schema/view.js.map +0 -1
  191. package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
  192. package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
  193. package/dist/schema-management/validate-mutation-defs.js +0 -39
  194. package/dist/schema-management/validate-mutation-defs.js.map +0 -1
  195. package/dist/sync/next/test/mutation-fixtures.d.ts +0 -73
  196. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  197. package/dist/sync/next/test/mutation-fixtures.js +0 -161
  198. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  199. package/dist/sync/next-mutation-event-id-pair.d.ts +0 -14
  200. package/dist/sync/next-mutation-event-id-pair.d.ts.map +0 -1
  201. package/dist/sync/next-mutation-event-id-pair.js +0 -13
  202. package/dist/sync/next-mutation-event-id-pair.js.map +0 -1
  203. package/src/devtools/devtools-window-message.ts +0 -27
@@ -222,9 +222,9 @@ declare const MergeResultUnexpectedError_base: Schema.Class<MergeResultUnexpecte
222
222
  _tag: Schema.Literal<["unexpected-error"]>;
223
223
  cause: typeof UnexpectedError;
224
224
  }>, never, {
225
- readonly cause: UnexpectedError;
226
- } & {
227
225
  readonly _tag: "unexpected-error";
226
+ } & {
227
+ readonly cause: UnexpectedError;
228
228
  }, {}, {}>;
229
229
  export declare class MergeResultUnexpectedError extends MergeResultUnexpectedError_base {
230
230
  }
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const liveStoreVersion: "0.3.0-dev.37";
1
+ export declare const liveStoreVersion: "0.3.0-dev.39";
2
2
  /**
3
3
  * This version number is incremented whenever the internal storage format changes in a breaking way.
4
4
  * Whenever this version changes, LiveStore will start with fresh database files. Old database files are not deleted.
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // TODO bring back when Expo and Playwright supports `with` imports
2
2
  // import packageJson from '../package.json' with { type: 'json' }
3
3
  // export const liveStoreVersion = packageJson.version
4
- export const liveStoreVersion = '0.3.0-dev.37';
4
+ export const liveStoreVersion = '0.3.0-dev.39';
5
5
  /**
6
6
  * This version number is incremented whenever the internal storage format changes in a breaking way.
7
7
  * Whenever this version changes, LiveStore will start with fresh database files. Old database files are not deleted.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/common",
3
- "version": "0.3.0-dev.37",
3
+ "version": "0.3.0-dev.39",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -54,11 +54,12 @@
54
54
  "graphology": "0.26.0-alpha1",
55
55
  "graphology-dag": "0.4.1",
56
56
  "graphology-types": "0.24.8",
57
- "@livestore/utils": "0.3.0-dev.37"
57
+ "@livestore/utils": "0.3.0-dev.39",
58
+ "@livestore/webmesh": "0.3.0-dev.39"
58
59
  },
59
60
  "devDependencies": {
60
61
  "vitest": "^3.1.1",
61
- "@livestore/utils-dev": "0.3.0-dev.37"
62
+ "@livestore/utils-dev": "0.3.0-dev.39"
62
63
  },
63
64
  "files": [
64
65
  "package.json",
@@ -232,7 +232,9 @@ export type ConnectDevtoolsToStore = (
232
232
  storeDevtoolsChannel: ClientSessionDevtoolsChannel,
233
233
  ) => Effect.Effect<void, UnexpectedError, Scope.Scope>
234
234
 
235
- export type Adapter = (opts: {
235
+ export type Adapter = (args: AdapterArgs) => Effect.Effect<ClientSession, UnexpectedError, Scope.Scope>
236
+
237
+ export interface AdapterArgs {
236
238
  schema: LiveStoreSchema
237
239
  storeId: string
238
240
  devtoolsEnabled: boolean
@@ -246,7 +248,7 @@ export type Adapter = (opts: {
246
248
  * @default undefined
247
249
  */
248
250
  syncPayload: Schema.JsonValue | undefined
249
- }) => Effect.Effect<ClientSession, UnexpectedError, Scope.Scope>
251
+ }
250
252
 
251
253
  export const MigrationsReportEntry = Schema.Struct({
252
254
  tableName: Schema.String,
@@ -20,6 +20,7 @@ export const SessionInfo = Schema.TaggedStruct('SessionInfo', {
20
20
  clientId: Schema.String,
21
21
  sessionId: Schema.String,
22
22
  schemaAlias: Schema.String,
23
+ isLeader: Schema.Boolean,
23
24
  })
24
25
  export type SessionInfo = typeof SessionInfo.Type
25
26
 
@@ -1,36 +1,59 @@
1
+ import type { Effect, Scope, WebChannel } from '@livestore/utils/effect'
1
2
  import { Schema } from '@livestore/utils/effect'
3
+ import { nanoid } from '@livestore/utils/nanoid'
4
+ import type { MeshNode } from '@livestore/webmesh'
5
+
6
+ import * as SessionInfo from './devtools-sessioninfo.js'
2
7
 
3
8
  export * from './devtools-messages.js'
4
- export * from './devtools-window-message.js'
5
9
  export * as SessionInfo from './devtools-sessioninfo.js'
6
- export const ClientSessionInfo = Schema.Struct({
7
- storeId: Schema.String,
8
- clientId: Schema.String,
9
- sessionId: Schema.String,
10
- })
11
10
 
12
11
  export const DevtoolsMode = Schema.Union(
13
- Schema.TaggedStruct('expo', {
14
- // TODO get rid of embedded `clientSessionInfo`
15
- clientSessionInfo: Schema.optional(ClientSessionInfo),
16
- }),
17
- // TODO add storeId, clientId and sessionId for Node
18
12
  Schema.TaggedStruct('node', {
19
- // TODO get rid of embedded `clientSessionInfo`
20
- clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
13
+ /** WebSocket URL */
21
14
  url: Schema.String,
22
15
  }),
23
- Schema.TaggedStruct('web', {
24
- // TODO get rid of embedded `clientSessionInfo`
25
- clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
26
- }),
27
- Schema.TaggedStruct('browser-extension', {
28
- // TODO get rid of embedded `clientSessionInfo`
29
- clientSessionInfo: Schema.UndefinedOr(ClientSessionInfo),
30
- }),
16
+ Schema.TaggedStruct('web', {}),
17
+ Schema.TaggedStruct('browser-extension', {}),
31
18
  )
32
19
 
33
20
  export type DevtoolsMode = typeof DevtoolsMode.Type
34
21
 
35
22
  export const DevtoolsModeTag = DevtoolsMode.pipe(Schema.pluck('_tag'), Schema.typeSchema)
36
23
  export type DevtoolsModeTag = typeof DevtoolsModeTag.Type
24
+
25
+ export const makeNodeName = {
26
+ devtools: {
27
+ random: () => `devtools-session-info-${nanoid()}`,
28
+ },
29
+ client: {
30
+ session: ({ storeId, clientId, sessionId }: { storeId: string; clientId: string; sessionId: string }) =>
31
+ `client-session-${storeId}-${clientId}-${sessionId}`,
32
+ leader: ({ storeId, clientId }: { storeId: string; clientId: string }) => `client-leader-${storeId}-${clientId}`,
33
+ },
34
+ }
35
+
36
+ export const makeChannelName = {
37
+ sessionInfo: () => `session-info`,
38
+ devtoolsClientSession: ({ storeId, clientId, sessionId }: { storeId: string; clientId: string; sessionId: string }) =>
39
+ `devtools-channel(client-session-${storeId}-${clientId}-${sessionId})`,
40
+ devtoolsClientLeader: ({ storeId, clientId, sessionId }: { storeId: string; clientId: string; sessionId: string }) =>
41
+ `devtools-channel(client-leader-${storeId}-${clientId}-${sessionId})`,
42
+ }
43
+
44
+ export const isChannelName = {
45
+ devtoolsClientSession: (
46
+ channelName: string,
47
+ { storeId, clientId, sessionId }: { storeId: string; clientId: string; sessionId: string },
48
+ ) => channelName === makeChannelName.devtoolsClientSession({ storeId, clientId, sessionId }),
49
+ devtoolsClientLeader: (channelName: string, { storeId, clientId }: { storeId: string; clientId: string }) =>
50
+ channelName.startsWith(`devtools-channel(client-leader-${storeId}-${clientId}`),
51
+ }
52
+
53
+ export const makeSessionInfoBroadcastChannel = (
54
+ webmeshNode: MeshNode,
55
+ ): Effect.Effect<WebChannel.WebChannel<SessionInfo.Message, SessionInfo.Message>, never, Scope.Scope> =>
56
+ webmeshNode.makeBroadcastChannel({
57
+ channelName: makeChannelName.sessionInfo(),
58
+ schema: SessionInfo.Message,
59
+ })
package/src/index.ts CHANGED
@@ -12,3 +12,4 @@ export * from './version.js'
12
12
  export * from './schema/state/sqlite/query-builder/mod.js'
13
13
  export * as SyncState from './sync/syncstate.js'
14
14
  export * from './otel.js'
15
+ export * from './make-client-session.js'
@@ -15,38 +15,56 @@ export const bootDevtools = (options: DevtoolsOptions) =>
15
15
  return
16
16
  }
17
17
 
18
- const { syncProcessor, extraIncomingMessagesQueue } = yield* LeaderThreadCtx
18
+ const { syncProcessor, extraIncomingMessagesQueue, clientId, storeId } = yield* LeaderThreadCtx
19
19
 
20
20
  yield* listenToDevtools({
21
21
  incomingMessages: Stream.fromQueue(extraIncomingMessagesQueue),
22
22
  sendMessage: () => Effect.void,
23
23
  }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
24
24
 
25
- const { persistenceInfo, devtoolsWebChannel } = yield* options.makeBootContext
25
+ const { node, persistenceInfo, mode } = yield* options.boot
26
26
 
27
- const sendMessage: SendMessageToDevtools = (message) =>
28
- devtoolsWebChannel
29
- .send(message)
30
- .pipe(
31
- Effect.withSpan('@livestore/common:leader-thread:devtools:sendToDevtools'),
32
- Effect.interruptible,
33
- Effect.ignoreLogged,
34
- )
35
-
36
- const syncState = yield* syncProcessor.syncState
37
- const mergeCounter = syncProcessor.getMergeCounter()
27
+ yield* node.listenForChannel.pipe(
28
+ Stream.filter(
29
+ (res) =>
30
+ Devtools.isChannelName.devtoolsClientLeader(res.channelName, { storeId, clientId }) && res.mode === mode,
31
+ ),
32
+ Stream.tap(({ channelName, source }) =>
33
+ Effect.gen(function* () {
34
+ const channel = yield* node.makeChannel({
35
+ target: source,
36
+ channelName,
37
+ schema: { listen: Devtools.Leader.MessageToApp, send: Devtools.Leader.MessageFromApp },
38
+ mode,
39
+ })
40
+
41
+ const sendMessage: SendMessageToDevtools = (message) =>
42
+ channel
43
+ .send(message)
44
+ .pipe(
45
+ Effect.withSpan('@livestore/common:leader-thread:devtools:sendToDevtools'),
46
+ Effect.interruptible,
47
+ Effect.ignoreLogged,
48
+ )
38
49
 
39
- yield* syncProcessor.pull({ cursor: { mergeCounter, eventId: syncState.localHead } }).pipe(
40
- Stream.tap(({ payload }) => sendMessage(Devtools.Leader.SyncPull.make({ payload, liveStoreVersion }))),
50
+ const syncState = yield* syncProcessor.syncState
51
+ const mergeCounter = syncProcessor.getMergeCounter()
52
+
53
+ yield* syncProcessor.pull({ cursor: { mergeCounter, eventId: syncState.localHead } }).pipe(
54
+ Stream.tap(({ payload }) => sendMessage(Devtools.Leader.SyncPull.make({ payload, liveStoreVersion }))),
55
+ Stream.runDrain,
56
+ Effect.forkScoped,
57
+ )
58
+
59
+ yield* listenToDevtools({
60
+ incomingMessages: channel.listen.pipe(Stream.flatten(), Stream.orDie),
61
+ sendMessage,
62
+ persistenceInfo,
63
+ })
64
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped),
65
+ ),
41
66
  Stream.runDrain,
42
- Effect.forkScoped,
43
67
  )
44
-
45
- yield* listenToDevtools({
46
- incomingMessages: devtoolsWebChannel.listen.pipe(Stream.flatten(), Stream.orDie),
47
- sendMessage,
48
- persistenceInfo,
49
- }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
50
68
  }).pipe(Effect.withSpan('@livestore/common:leader-thread:devtools:boot'))
51
69
 
52
70
  const listenToDevtools = ({
@@ -8,9 +8,9 @@ import type {
8
8
  Stream,
9
9
  Subscribable,
10
10
  SubscriptionRef,
11
- WebChannel,
12
11
  } from '@livestore/utils/effect'
13
12
  import { Context, Schema } from '@livestore/utils/effect'
13
+ import type { MeshNode } from '@livestore/webmesh'
14
14
 
15
15
  import type { LeaderPullCursor, SqliteError } from '../adapter-types.js'
16
16
  import type {
@@ -60,13 +60,14 @@ export type DevtoolsOptions =
60
60
  }
61
61
  | {
62
62
  enabled: true
63
- makeBootContext: Effect.Effect<
63
+ boot: Effect.Effect<
64
64
  {
65
- devtoolsWebChannel: WebChannel.WebChannel<Devtools.Leader.MessageToApp, Devtools.Leader.MessageFromApp>
65
+ node: MeshNode
66
66
  persistenceInfo: PersistenceInfoPair
67
+ mode: 'proxy' | 'direct'
67
68
  },
68
69
  UnexpectedError,
69
- Scope.Scope
70
+ Scope.Scope | HttpClient.HttpClient | LeaderThreadCtx
70
71
  >
71
72
  }
72
73
 
@@ -0,0 +1,119 @@
1
+ import type { Scope, SubscriptionRef } from '@livestore/utils/effect'
2
+ import { Effect, Stream } from '@livestore/utils/effect'
3
+ import * as Webmesh from '@livestore/webmesh'
4
+
5
+ import type {
6
+ AdapterArgs,
7
+ ClientSession,
8
+ ClientSessionLeaderThreadProxy,
9
+ LockStatus,
10
+ SqliteDb,
11
+ UnexpectedError,
12
+ } from './adapter-types.js'
13
+ import * as Devtools from './devtools/mod.js'
14
+
15
+ declare global {
16
+ // eslint-disable-next-line no-var
17
+ var __debugWebmeshNode: any
18
+ }
19
+
20
+ export const makeClientSession = <R>({
21
+ storeId,
22
+ clientId,
23
+ sessionId,
24
+ devtoolsEnabled,
25
+ connectDevtoolsToStore,
26
+ lockStatus,
27
+ leaderThread,
28
+ schema,
29
+ sqliteDb,
30
+ shutdown,
31
+ connectWebmeshNode,
32
+ webmeshMode,
33
+ }: AdapterArgs & {
34
+ clientId: string
35
+ sessionId: string
36
+ lockStatus: SubscriptionRef.SubscriptionRef<LockStatus>
37
+ leaderThread: ClientSessionLeaderThreadProxy
38
+ sqliteDb: SqliteDb
39
+ connectWebmeshNode: (args: {
40
+ webmeshNode: Webmesh.MeshNode
41
+ sessionInfo: Devtools.SessionInfo.SessionInfo
42
+ }) => Effect.Effect<void, UnexpectedError, Scope.Scope | R>
43
+ webmeshMode: 'direct' | 'proxy'
44
+ }): Effect.Effect<ClientSession, never, Scope.Scope | R> =>
45
+ Effect.gen(function* () {
46
+ const devtools: ClientSession['devtools'] = devtoolsEnabled
47
+ ? { enabled: true, pullLatch: yield* Effect.makeLatch(true), pushLatch: yield* Effect.makeLatch(true) }
48
+ : { enabled: false }
49
+
50
+ if (devtoolsEnabled) {
51
+ yield* Effect.gen(function* () {
52
+ const webmeshNode = yield* Webmesh.makeMeshNode(
53
+ Devtools.makeNodeName.client.session({ storeId, clientId, sessionId }),
54
+ )
55
+
56
+ globalThis.__debugWebmeshNode = webmeshNode
57
+
58
+ const schemaAlias = schema.devtools.alias
59
+ const sessionInfo = Devtools.SessionInfo.SessionInfo.make({
60
+ storeId,
61
+ clientId,
62
+ sessionId,
63
+ schemaAlias,
64
+ isLeader: true, // TODO actually check if we are leader
65
+ })
66
+
67
+ yield* connectWebmeshNode({ webmeshNode, sessionInfo })
68
+
69
+ const sessionInfoBroadcastChannel = yield* Devtools.makeSessionInfoBroadcastChannel(webmeshNode)
70
+
71
+ yield* Devtools.SessionInfo.provideSessionInfo({
72
+ webChannel: sessionInfoBroadcastChannel,
73
+ sessionInfo,
74
+ }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
75
+
76
+ yield* webmeshNode.listenForChannel.pipe(
77
+ Stream.filter(
78
+ (res) =>
79
+ Devtools.isChannelName.devtoolsClientSession(res.channelName, { storeId, clientId, sessionId }) &&
80
+ res.mode === webmeshMode,
81
+ ),
82
+ Stream.tap(
83
+ Effect.fnUntraced(
84
+ function* ({ channelName, source }) {
85
+ const clientSessionDevtoolsChannel = yield* webmeshNode.makeChannel({
86
+ target: source,
87
+ channelName,
88
+ schema: {
89
+ listen: Devtools.ClientSession.MessageToApp,
90
+ send: Devtools.ClientSession.MessageFromApp,
91
+ },
92
+ mode: webmeshMode,
93
+ })
94
+
95
+ yield* connectDevtoolsToStore(clientSessionDevtoolsChannel)
96
+ },
97
+ Effect.tapCauseLogPretty,
98
+ Effect.forkScoped,
99
+ ),
100
+ ),
101
+ Stream.runDrain,
102
+ )
103
+ }).pipe(
104
+ Effect.withSpan('@livestore/common:make-client-session:devtools'),
105
+ Effect.tapCauseLogPretty,
106
+ Effect.forkScoped,
107
+ )
108
+ }
109
+
110
+ return {
111
+ sqliteDb,
112
+ leaderThread,
113
+ devtools,
114
+ lockStatus,
115
+ clientId,
116
+ sessionId,
117
+ shutdown,
118
+ } satisfies ClientSession
119
+ })
@@ -36,7 +36,8 @@ export const getExecArgsFromEvent = ({
36
36
  bindValues: PreparedBindValues
37
37
  writeTables: ReadonlySet<string> | undefined
38
38
  }> => {
39
- const eventArgsDecoded = event.decoded?.args ?? Schema.decodeUnknownSync(eventDef.schema)(event.encoded!.args)
39
+ const eventArgsDecoded =
40
+ event.decoded === undefined ? Schema.decodeUnknownSync(eventDef.schema)(event.encoded!.args) : event.decoded.args
40
41
 
41
42
  const query: MaterializerContextQuery = (
42
43
  rawQueryOrQueryBuilder:
package/src/version.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // import packageJson from '../package.json' with { type: 'json' }
3
3
  // export const liveStoreVersion = packageJson.version
4
4
 
5
- export const liveStoreVersion = '0.3.0-dev.37' as const
5
+ export const liveStoreVersion = '0.3.0-dev.39' as const
6
6
 
7
7
  /**
8
8
  * This version number is incremented whenever the internal storage format changes in a breaking way.
@@ -1,77 +0,0 @@
1
- import type { SqliteDsl } from '@livestore/db-schema';
2
- import type { GetValForKey } from '@livestore/utils';
3
- import type { MutationEvent } from './schema/mutations.js';
4
- import type * as DbSchema from './schema/table-def.js';
5
- export declare const makeDerivedMutationDefsForTable: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
6
- deriveMutations: {
7
- enabled: true;
8
- };
9
- }>>(table: TTableDef) => {
10
- insert: import("./schema/mutations.js").MutationDef<`_Derived_Create_${any}`, {
11
- readonly [x: string]: any;
12
- } & {
13
- readonly [x: string]: any;
14
- }, any>;
15
- update: import("./schema/mutations.js").MutationDef<`_Derived_Update_${any}`, {
16
- readonly values: {};
17
- readonly where: {};
18
- }, {
19
- readonly values: {};
20
- readonly where: {};
21
- }>;
22
- delete: import("./schema/mutations.js").MutationDef<`_Derived_Delete_${any}`, {
23
- readonly where: {};
24
- }, {
25
- readonly where: {};
26
- }>;
27
- };
28
- export declare const deriveCreateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
29
- deriveMutations: {
30
- enabled: true;
31
- };
32
- }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Create_${any}`, {
33
- readonly [x: string]: any;
34
- } & {
35
- readonly [x: string]: any;
36
- }, any>;
37
- export declare const deriveUpdateMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
38
- deriveMutations: {
39
- enabled: true;
40
- };
41
- }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Update_${any}`, {
42
- readonly values: {};
43
- readonly where: {};
44
- }, {
45
- readonly values: {};
46
- readonly where: {};
47
- }>;
48
- export declare const deriveDeleteMutationDef: <TTableDef extends DbSchema.TableDefBase<DbSchema.DefaultSqliteTableDefConstrained, DbSchema.TableOptions & {
49
- deriveMutations: {
50
- enabled: true;
51
- };
52
- }>>(table: TTableDef) => import("./schema/mutations.js").MutationDef<`_Derived_Delete_${any}`, {
53
- readonly where: {};
54
- }, {
55
- readonly where: {};
56
- }>;
57
- /**
58
- * Convenience helper functions on top of the derived mutation definitions.
59
- */
60
- export type DerivedMutationHelperFns<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = {
61
- insert: DerivedMutationHelperFns.InsertMutationFn<TColumns, TOptions>;
62
- update: DerivedMutationHelperFns.UpdateMutationFn<TColumns, TOptions>;
63
- delete: DerivedMutationHelperFns.DeleteMutationFn<TColumns, TOptions>;
64
- };
65
- export declare namespace DerivedMutationHelperFns {
66
- export type InsertMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values?: GetValForKey<SqliteDsl.FromColumns.InsertRowDecoded<TColumns>, 'value'>) => MutationEvent.PartialAny : (values: SqliteDsl.FromColumns.InsertRowDecoded<TColumns>) => MutationEvent.PartialAny>;
67
- export type UpdateMutationFn<TColumns extends SqliteDsl.ConstraintColumns, TOptions extends DbSchema.TableOptions> = SqliteDsl.AnyIfConstained<TColumns, UseShortcut<TOptions> extends true ? (values: Partial<GetValForKey<SqliteDsl.FromColumns.RowDecoded<TColumns>, 'value'>>) => MutationEvent.PartialAny : (args: {
68
- where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
69
- values: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
70
- }) => MutationEvent.PartialAny>;
71
- export type DeleteMutationFn<TColumns extends SqliteDsl.ConstraintColumns, _TOptions extends DbSchema.TableOptions> = (args: {
72
- where: Partial<SqliteDsl.FromColumns.RowDecoded<TColumns>>;
73
- }) => MutationEvent.PartialAny;
74
- type UseShortcut<TOptions extends DbSchema.TableOptions> = TOptions['isSingleColumn'] extends true ? TOptions['isSingleton'] extends true ? true : false : false;
75
- export {};
76
- }
77
- //# sourceMappingURL=derived-mutations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derived-mutations.d.ts","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
@@ -1,54 +0,0 @@
1
- import { ReadonlyRecord, Schema } from '@livestore/utils/effect';
2
- import { defineMutation } from './schema/mutations.js';
3
- import { getDefaultValuesDecoded } from './schema/schema-helpers.js';
4
- import { deleteRows, insertRow, updateRows } from './sql-queries/sql-queries.js';
5
- export const makeDerivedMutationDefsForTable = (table) => ({
6
- insert: deriveCreateMutationDef(table),
7
- update: deriveUpdateMutationDef(table),
8
- delete: deriveDeleteMutationDef(table),
9
- });
10
- export const deriveCreateMutationDef = (table) => {
11
- const tableName = table.sqliteDef.name;
12
- const [optionalFields, requiredColumns] = ReadonlyRecord.partition(table.sqliteDef.columns, (col) => col.nullable === false && col.default._tag === 'None');
13
- const insertSchema = Schema.Struct(ReadonlyRecord.map(requiredColumns, (col) => col.schema))
14
- .pipe(Schema.extend(Schema.partial(Schema.Struct(ReadonlyRecord.map(optionalFields, (col) => col.schema)))))
15
- .annotations({ title: `${tableName}:Insert` });
16
- return defineMutation(`_Derived_Create_${tableName}`, insertSchema, ({ id, ...explicitDefaultValues }) => {
17
- const defaultValues = getDefaultValuesDecoded(table, explicitDefaultValues);
18
- const [sql, bindValues] = insertRow({
19
- tableName: table.sqliteDef.name,
20
- columns: table.sqliteDef.columns,
21
- values: { ...defaultValues, id },
22
- });
23
- return { sql, bindValues, writeTables: new Set([tableName]) };
24
- }, { localOnly: table.options.deriveMutations.localOnly });
25
- };
26
- export const deriveUpdateMutationDef = (table) => {
27
- const tableName = table.sqliteDef.name;
28
- return defineMutation(`_Derived_Update_${tableName}`, Schema.Struct({
29
- where: Schema.partial(table.schema),
30
- values: Schema.partial(table.schema),
31
- }).annotations({ title: `${tableName}:Update` }), ({ where, values }) => {
32
- const [sql, bindValues] = updateRows({
33
- tableName: table.sqliteDef.name,
34
- columns: table.sqliteDef.columns,
35
- where,
36
- updateValues: values,
37
- });
38
- return { sql, bindValues, writeTables: new Set([tableName]) };
39
- }, { localOnly: table.options.deriveMutations.localOnly });
40
- };
41
- export const deriveDeleteMutationDef = (table) => {
42
- const tableName = table.sqliteDef.name;
43
- return defineMutation(`_Derived_Delete_${tableName}`, Schema.Struct({
44
- where: Schema.partial(table.schema),
45
- }), ({ where }) => {
46
- const [sql, bindValues] = deleteRows({
47
- tableName: table.sqliteDef.name,
48
- columns: table.sqliteDef.columns,
49
- where,
50
- });
51
- return { sql, bindValues, writeTables: new Set([tableName]) };
52
- }, { localOnly: table.options.deriveMutations.localOnly });
53
- };
54
- //# sourceMappingURL=derived-mutations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derived-mutations.js","sourceRoot":"","sources":["../src/derived-mutations.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=derived-mutations.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"derived-mutations.test.d.ts","sourceRoot":"","sources":["../src/derived-mutations.test.ts"],"names":[],"mappings":""}