@livestore/adapter-node 0.4.0-dev.9 → 0.4.0

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 (39) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/client-session/adapter.d.ts +68 -2
  3. package/dist/client-session/adapter.d.ts.map +1 -1
  4. package/dist/client-session/adapter.js +121 -42
  5. package/dist/client-session/adapter.js.map +1 -1
  6. package/dist/devtools/devtools-server.d.ts.map +1 -1
  7. package/dist/devtools/devtools-server.js +14 -6
  8. package/dist/devtools/devtools-server.js.map +1 -1
  9. package/dist/devtools/mod.d.ts +1 -1
  10. package/dist/devtools/mod.d.ts.map +1 -1
  11. package/dist/devtools/mod.js +1 -1
  12. package/dist/devtools/mod.js.map +1 -1
  13. package/dist/devtools/vite-dev-server.d.ts +26 -4
  14. package/dist/devtools/vite-dev-server.d.ts.map +1 -1
  15. package/dist/devtools/vite-dev-server.js +43 -8
  16. package/dist/devtools/vite-dev-server.js.map +1 -1
  17. package/dist/leader-thread-shared.d.ts +5 -4
  18. package/dist/leader-thread-shared.d.ts.map +1 -1
  19. package/dist/leader-thread-shared.js +8 -6
  20. package/dist/leader-thread-shared.js.map +1 -1
  21. package/dist/make-leader-worker.d.ts +4 -2
  22. package/dist/make-leader-worker.d.ts.map +1 -1
  23. package/dist/make-leader-worker.js +45 -20
  24. package/dist/make-leader-worker.js.map +1 -1
  25. package/dist/shutdown-channel.d.ts.map +1 -1
  26. package/dist/shutdown-channel.js.map +1 -1
  27. package/dist/worker-schema.d.ts +141 -41
  28. package/dist/worker-schema.d.ts.map +1 -1
  29. package/dist/worker-schema.js +43 -18
  30. package/dist/worker-schema.js.map +1 -1
  31. package/package.json +59 -19
  32. package/src/client-session/adapter.ts +149 -72
  33. package/src/devtools/devtools-server.ts +22 -10
  34. package/src/devtools/mod.ts +1 -1
  35. package/src/devtools/vite-dev-server.ts +63 -11
  36. package/src/leader-thread-shared.ts +17 -13
  37. package/src/make-leader-worker.ts +80 -67
  38. package/src/shutdown-channel.ts +1 -0
  39. package/src/worker-schema.ts +67 -18
@@ -1,13 +1,13 @@
1
1
  import inspector from 'node:inspector'
2
2
  import path from 'node:path'
3
3
 
4
- if (process.execArgv.includes('--inspect')) {
4
+ if (process.execArgv.includes('--inspect') === true) {
5
5
  inspector.open()
6
6
  inspector.waitForDebugger()
7
7
  }
8
8
 
9
9
  import type { ClientSessionLeaderThreadProxy, MakeSqliteDb, SqliteDb, SyncOptions } from '@livestore/common'
10
- import { Devtools, liveStoreStorageFormatVersion, migrateDb, UnexpectedError } from '@livestore/common'
10
+ import { Devtools, liveStoreStorageFormatVersion, migrateDb, UnknownError } from '@livestore/common'
11
11
  import type { DevtoolsOptions, LeaderSqliteDb, LeaderThreadCtx } from '@livestore/common/leader-thread'
12
12
  import { configureConnection, makeLeaderThreadLayer } from '@livestore/common/leader-thread'
13
13
  import type { LiveStoreSchema } from '@livestore/common/schema'
@@ -30,7 +30,7 @@ export type TestingOverrides = {
30
30
  dbEventlog: SqliteDb
31
31
  dbState: SqliteDb
32
32
  },
33
- UnexpectedError
33
+ UnknownError
34
34
  >
35
35
  }
36
36
 
@@ -42,7 +42,8 @@ export interface MakeLeaderThreadArgs {
42
42
  makeSqliteDb: MakeNodeSqliteDb
43
43
  devtools: WorkerSchema.LeaderWorkerInnerInitialMessage['devtools']
44
44
  schema: LiveStoreSchema
45
- syncPayload: Schema.JsonValue | undefined
45
+ syncPayloadEncoded: Schema.JsonValue | undefined
46
+ syncPayloadSchema: Schema.Schema<any> | undefined
46
47
  testing: TestingOverrides | undefined
47
48
  }
48
49
 
@@ -54,21 +55,22 @@ export const makeLeaderThread = ({
54
55
  storage,
55
56
  devtools,
56
57
  schema,
57
- syncPayload,
58
+ syncPayloadEncoded,
59
+ syncPayloadSchema,
58
60
  testing,
59
61
  }: MakeLeaderThreadArgs): Effect.Effect<
60
- Layer.Layer<LeaderThreadCtx, UnexpectedError, Scope.Scope | HttpClient.HttpClient | FileSystem.FileSystem>,
61
- UnexpectedError,
62
+ Layer.Layer<LeaderThreadCtx, UnknownError, Scope.Scope | HttpClient.HttpClient | FileSystem.FileSystem>,
63
+ UnknownError,
62
64
  Scope.Scope
63
65
  > =>
64
66
  Effect.gen(function* () {
65
- const runtime = yield* Effect.runtime<never>()
67
+ const runtime = yield* Effect.runtime()
66
68
 
67
69
  const schemaHashSuffix =
68
70
  schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString()
69
71
 
70
72
  const makeDb = (kind: 'state' | 'eventlog') => {
71
- if (testing?.makeLeaderThread) {
73
+ if (testing?.makeLeaderThread !== undefined) {
72
74
  return testing
73
75
  .makeLeaderThread(makeSqliteDb)
74
76
  .pipe(Effect.map(({ dbEventlog, dbState }) => (kind === 'state' ? dbState : dbEventlog)))
@@ -113,11 +115,12 @@ export const makeLeaderThread = ({
113
115
  dbEventlog,
114
116
  devtoolsOptions,
115
117
  shutdownChannel,
116
- syncPayload,
118
+ syncPayloadEncoded,
119
+ syncPayloadSchema,
117
120
  })
118
121
  }).pipe(
119
122
  Effect.tapCauseLogPretty,
120
- UnexpectedError.mapToUnexpectedError,
123
+ UnknownError.mapToUnknownError,
121
124
  Effect.withSpan('@livestore/adapter-node:makeLeaderThread', {
122
125
  attributes: { storeId, clientId, storage, devtools, syncOptions },
123
126
  }),
@@ -137,7 +140,7 @@ const makeDevtoolsOptions = ({
137
140
  storeId: string
138
141
  clientId: string
139
142
  devtools: WorkerSchema.LeaderWorkerInnerInitialMessage['devtools']
140
- }): Effect.Effect<DevtoolsOptions, UnexpectedError, Scope.Scope> =>
143
+ }): Effect.Effect<DevtoolsOptions, UnknownError, Scope.Scope> =>
141
144
  Effect.gen(function* () {
142
145
  if (devtools.enabled === false) {
143
146
  return {
@@ -161,6 +164,7 @@ const makeDevtoolsOptions = ({
161
164
  sessionId: 'static', // TODO make this dynamic
162
165
  schemaAlias: devtools.schemaAlias,
163
166
  isLeader: true,
167
+ origin: undefined,
164
168
  }),
165
169
  port: devtools.port,
166
170
  host: devtools.host,
@@ -180,7 +184,7 @@ const makeDevtoolsOptions = ({
180
184
  eventlog: dbEventlog.metadata.persistenceInfo,
181
185
  }
182
186
 
183
- return { node, persistenceInfo, mode: 'proxy' }
187
+ return { node, persistenceInfo, mode: 'proxy' as const }
184
188
  }),
185
189
  }
186
190
  })
@@ -1,33 +1,23 @@
1
1
  import './thread-polyfill.ts'
2
-
3
2
  import inspector from 'node:inspector'
4
3
 
5
- if (process.execArgv.includes('--inspect')) {
4
+ if (process.execArgv.includes('--inspect') === true) {
6
5
  inspector.open()
7
6
  inspector.waitForDebugger()
8
7
  }
9
8
 
9
+ import type * as otel from '@opentelemetry/api'
10
+
10
11
  import type { SyncOptions } from '@livestore/common'
11
- import { UnexpectedError } from '@livestore/common'
12
- import { Eventlog, LeaderThreadCtx } from '@livestore/common/leader-thread'
12
+ import { LogConfig, UnknownError } from '@livestore/common'
13
+ import type { StreamEventsOptions } from '@livestore/common/leader-thread'
14
+ import { Eventlog, LeaderThreadCtx, streamEventsWithSyncState } from '@livestore/common/leader-thread'
13
15
  import type { LiveStoreSchema } from '@livestore/common/schema'
14
16
  import { LiveStoreEvent } from '@livestore/common/schema'
15
17
  import { loadSqlite3Wasm } from '@livestore/sqlite-wasm/load-wasm'
16
18
  import { sqliteDbFactory } from '@livestore/sqlite-wasm/node'
17
- import {
18
- Effect,
19
- FetchHttpClient,
20
- identity,
21
- Layer,
22
- Logger,
23
- LogLevel,
24
- OtelTracer,
25
- Schema,
26
- Stream,
27
- WorkerRunner,
28
- } from '@livestore/utils/effect'
19
+ import { Effect, FetchHttpClient, Layer, OtelTracer, Schema, Stream, WorkerRunner } from '@livestore/utils/effect'
29
20
  import { PlatformNode } from '@livestore/utils/node'
30
- import type * as otel from '@opentelemetry/api'
31
21
 
32
22
  import type { TestingOverrides } from './leader-thread-shared.ts'
33
23
  import { makeLeaderThread } from './leader-thread-shared.ts'
@@ -36,30 +26,35 @@ import * as WorkerSchema from './worker-schema.ts'
36
26
  export type WorkerOptions = {
37
27
  schema: LiveStoreSchema
38
28
  sync?: SyncOptions
29
+ syncPayloadSchema?: Schema.Schema<any>
39
30
  otelOptions?: {
40
31
  tracer?: otel.Tracer
41
32
  /** @default 'livestore-node-leader-thread' */
42
33
  serviceName?: string
43
34
  }
44
35
  testing?: TestingOverrides
45
- }
36
+ } & LogConfig.WithLoggerOptions
46
37
 
47
38
  export const getWorkerArgs = () => Schema.decodeSync(WorkerSchema.WorkerArgv)(process.argv[2]!)
48
39
 
49
40
  export const makeWorker = (options: WorkerOptions) => {
50
- makeWorkerEffect(options).pipe(
51
- Effect.provide(Logger.prettyWithThread(options.otelOptions?.serviceName ?? 'livestore-node-leader-thread')),
52
- PlatformNode.NodeRuntime.runMain,
53
- )
41
+ makeWorkerEffect(options).pipe(PlatformNode.NodeRuntime.runMain)
54
42
  }
55
43
 
56
44
  export const makeWorkerEffect = (options: WorkerOptions) => {
57
- const TracingLive = options.otelOptions?.tracer
45
+ const TracingLive = options.otelOptions?.tracer !== undefined
58
46
  ? Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
59
47
  Layer.provideMerge(Layer.succeed(OtelTracer.OtelTracer, options.otelOptions.tracer)),
60
48
  )
61
49
  : undefined
62
50
 
51
+ // Merge the runtime dependencies once so we can provide them together without chaining Effect.provide.
52
+ const runtimeLayer = Layer.mergeAll(
53
+ FetchHttpClient.layer,
54
+ PlatformNode.NodeFileSystem.layer,
55
+ TracingLive ?? Layer.empty,
56
+ )
57
+
63
58
  return WorkerRunner.layerSerialized(WorkerSchema.LeaderWorkerInnerRequest, {
64
59
  InitialMessage: (args) =>
65
60
  Effect.gen(function* () {
@@ -73,12 +68,14 @@ export const makeWorkerEffect = (options: WorkerOptions) => {
73
68
  schema: options.schema,
74
69
  testing: options.testing,
75
70
  makeSqliteDb,
71
+ syncPayloadEncoded: args.syncPayloadEncoded,
72
+ syncPayloadSchema: options.syncPayloadSchema,
76
73
  })
77
74
  }).pipe(Layer.unwrapScoped),
78
75
  PushToLeader: ({ batch }) =>
79
76
  Effect.andThen(LeaderThreadCtx, (_) =>
80
77
  _.syncProcessor.push(
81
- batch.map((item) => new LiveStoreEvent.EncodedWithMeta(item)),
78
+ batch.map((item) => new LiveStoreEvent.Client.EncodedWithMeta(item)),
82
79
  // We'll wait in order to keep back pressure on the client session
83
80
  { waitForProcessing: true },
84
81
  ),
@@ -90,61 +87,76 @@ export const makeWorkerEffect = (options: WorkerOptions) => {
90
87
  const { syncProcessor } = yield* LeaderThreadCtx
91
88
  return syncProcessor.pull({ cursor })
92
89
  }).pipe(Stream.unwrapScoped),
90
+ StreamEvents: (options: WorkerSchema.LeaderWorkerInnerStreamEvents) =>
91
+ LeaderThreadCtx.pipe(
92
+ Effect.map(({ dbEventlog, syncProcessor }) => {
93
+ const { _tag: _ignored, ...payload } = options
94
+ const streamOptions = payload as StreamEventsOptions
95
+ return streamEventsWithSyncState({
96
+ dbEventlog,
97
+ syncState: syncProcessor.syncState,
98
+ options: streamOptions,
99
+ })
100
+ }),
101
+ Stream.unwrapScoped,
102
+ Stream.withSpan('@livestore/adapter-node:worker:StreamEvents'),
103
+ ),
93
104
  Export: () =>
94
105
  Effect.andThen(LeaderThreadCtx, (_) => _.dbState.export()).pipe(
95
- UnexpectedError.mapToUnexpectedError,
96
106
  Effect.withSpan('@livestore/adapter-node:worker:Export'),
97
107
  ),
98
108
  ExportEventlog: () =>
99
109
  Effect.andThen(LeaderThreadCtx, (_) => _.dbEventlog.export()).pipe(
100
- UnexpectedError.mapToUnexpectedError,
101
110
  Effect.withSpan('@livestore/adapter-node:worker:ExportEventlog'),
102
111
  ),
103
- GetLeaderHead: () =>
104
- Effect.gen(function* () {
105
- const workerCtx = yield* LeaderThreadCtx
106
- return Eventlog.getClientHeadFromDb(workerCtx.dbEventlog)
107
- }).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('@livestore/adapter-node:worker:GetLeaderHead')),
108
- GetLeaderSyncState: () =>
112
+ GetLeaderHead: Effect.fn('@livestore/adapter-node:worker:GetLeaderHead')(function* () {
113
+ const workerCtx = yield* LeaderThreadCtx
114
+ return Eventlog.getClientHeadFromDb(workerCtx.dbEventlog)
115
+ }),
116
+ GetLeaderSyncState: Effect.fn('@livestore/adapter-node:worker:GetLeaderSyncState')(function* () {
117
+ const workerCtx = yield* LeaderThreadCtx
118
+ return yield* workerCtx.syncProcessor.syncState
119
+ }),
120
+ SyncStateStream: () =>
109
121
  Effect.gen(function* () {
110
122
  const workerCtx = yield* LeaderThreadCtx
111
- return yield* workerCtx.syncProcessor.syncState
112
- }).pipe(
113
- UnexpectedError.mapToUnexpectedError,
114
- Effect.withSpan('@livestore/adapter-node:worker:GetLeaderSyncState'),
115
- ),
116
- GetRecreateSnapshot: () =>
123
+ return workerCtx.syncProcessor.syncState.changes
124
+ }).pipe(Stream.unwrapScoped),
125
+ GetNetworkStatus: Effect.fn('@livestore/adapter-node:worker:GetNetworkStatus')(function* () {
126
+ const workerCtx = yield* LeaderThreadCtx
127
+ return yield* workerCtx.networkStatus
128
+ }),
129
+ NetworkStatusStream: () =>
117
130
  Effect.gen(function* () {
118
131
  const workerCtx = yield* LeaderThreadCtx
119
- // const result = yield* Deferred.await(workerCtx.initialSetupDeferred)
120
- // NOTE we can only return the cached snapshot once as it's transferred (i.e. disposed), so we need to set it to undefined
121
- // const cachedSnapshot =
122
- // result._tag === 'Recreate' ? yield* Ref.getAndSet(result.snapshotRef, undefined) : undefined
123
- // return cachedSnapshot ?? workerCtx.db.export()
124
- const snapshot = workerCtx.dbState.export()
125
- return { snapshot, migrationsReport: workerCtx.initialState.migrationsReport }
126
- }).pipe(
127
- UnexpectedError.mapToUnexpectedError,
128
- Effect.withSpan('@livestore/adapter-node:worker:GetRecreateSnapshot'),
129
- ),
130
- Shutdown: () =>
131
- Effect.gen(function* () {
132
- // const { db, dbEventlog } = yield* LeaderThreadCtx
133
- yield* Effect.logDebug('[@livestore/adapter-node:worker] Shutdown')
132
+ return workerCtx.networkStatus.changes
133
+ }).pipe(Stream.unwrapScoped),
134
+ GetRecreateSnapshot: Effect.fn('@livestore/adapter-node:worker:GetRecreateSnapshot')(function* () {
135
+ const workerCtx = yield* LeaderThreadCtx
136
+ // const result = yield* Deferred.await(workerCtx.initialSetupDeferred)
137
+ // NOTE we can only return the cached snapshot once as it's transferred (i.e. disposed), so we need to set it to undefined
138
+ // const cachedSnapshot =
139
+ // result._tag === 'Recreate' ? yield* Ref.getAndSet(result.snapshotRef, undefined) : undefined
140
+ // return cachedSnapshot ?? workerCtx.db.export()
141
+ const snapshot = workerCtx.dbState.export()
142
+ return { snapshot, migrationsReport: workerCtx.initialState.migrationsReport }
143
+ }),
144
+ Shutdown: Effect.fn('@livestore/adapter-node:worker:Shutdown')(function* () {
145
+ // const { db, dbEventlog } = yield* LeaderThreadCtx
146
+ yield* Effect.logDebug('[@livestore/adapter-node:worker] Shutdown')
134
147
 
135
- // if (devtools.enabled) {
136
- // yield* FiberSet.clear(devtools.connections)
137
- // }
138
- // db.close()
139
- // dbEventlog.close()
148
+ // if (devtools.enabled) {
149
+ // yield* FiberSet.clear(devtools.connections)
150
+ // }
151
+ // db.close()
152
+ // dbEventlog.close()
140
153
 
141
- // Buy some time for Otel to flush
142
- // TODO find a cleaner way to do this
143
- // yield* Effect.sleep(1000)
144
- }).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('@livestore/adapter-node:worker:Shutdown')),
154
+ // Buy some time for Otel to flush
155
+ // TODO find a cleaner way to do this
156
+ // yield* Effect.sleep(1000)
157
+ }),
145
158
  ExtraDevtoolsMessage: ({ message }) =>
146
159
  Effect.andThen(LeaderThreadCtx, (_) => _.extraIncomingMessagesQueue.offer(message)).pipe(
147
- UnexpectedError.mapToUnexpectedError,
148
160
  Effect.withSpan('@livestore/adapter-node:worker:ExtraDevtoolsMessage'),
149
161
  ),
150
162
  }).pipe(
@@ -156,12 +168,13 @@ export const makeWorkerEffect = (options: WorkerOptions) => {
156
168
  thread: options.otelOptions?.serviceName ?? 'livestore-node-leader-thread',
157
169
  processId: process.pid,
158
170
  }),
171
+ LogConfig.withLoggerConfig(
172
+ { logger: options.logger, logLevel: options.logLevel },
173
+ { threadName: options.otelOptions?.serviceName ?? 'livestore-node-leader-thread' },
174
+ ),
159
175
  // TODO bring back with Effect 4 once it's easier to work with replacing loggers.
160
176
  // We basically only want to provide this logger if it's replacing the default logger, not if there's a custom logger already provided.
161
177
  // Effect.provide(Logger.prettyWithThread(options.otelOptions?.serviceName ?? 'livestore-node-leader-thread')),
162
- Effect.provide(FetchHttpClient.layer),
163
- Effect.provide(PlatformNode.NodeFileSystem.layer),
164
- TracingLive ? Effect.provide(TracingLive) : identity,
165
- Logger.withMinimumLogLevel(LogLevel.Debug),
178
+ Effect.provide(runtimeLayer),
166
179
  )
167
180
  }
@@ -1,5 +1,6 @@
1
1
  import { ShutdownChannel } from '@livestore/common/leader-thread'
2
2
  import type { Effect, Scope } from '@livestore/utils/effect'
3
+
3
4
  import { makeBroadcastChannel } from './webchannel.ts'
4
5
 
5
6
  export const makeShutdownChannel = (
@@ -1,4 +1,13 @@
1
- import { BootStatus, Devtools, LeaderAheadError, MigrationsReport, SyncState, UnexpectedError } from '@livestore/common'
1
+ import {
2
+ BootStatus,
3
+ Devtools,
4
+ RejectedPushError,
5
+ MigrationsReport,
6
+ SyncBackend,
7
+ SyncState,
8
+ UnknownError,
9
+ } from '@livestore/common'
10
+ import { StreamEventsOptionsFields } from '@livestore/common/leader-thread'
2
11
  import { EventSequenceNumber, LiveStoreEvent } from '@livestore/common/schema'
3
12
  import { Schema, Transferable } from '@livestore/utils/effect'
4
13
 
@@ -53,7 +62,7 @@ export class LeaderWorkerOuterInitialMessage extends Schema.TaggedRequest<Leader
53
62
  {
54
63
  payload: { port: Transferable.MessagePort },
55
64
  success: Schema.Void,
56
- failure: UnexpectedError,
65
+ failure: Schema.Never,
57
66
  },
58
67
  ) {}
59
68
 
@@ -66,7 +75,7 @@ export class LeaderWorkerInnerInitialMessage extends Schema.TaggedRequest<Leader
66
75
  storeId: Schema.String,
67
76
  clientId: Schema.String,
68
77
  storage: StorageType,
69
- syncPayload: Schema.UndefinedOr(Schema.JsonValue),
78
+ syncPayloadEncoded: Schema.UndefinedOr(Schema.JsonValue),
70
79
  devtools: Schema.Union(
71
80
  Schema.Struct({
72
81
  enabled: Schema.Literal(true),
@@ -80,7 +89,7 @@ export class LeaderWorkerInnerInitialMessage extends Schema.TaggedRequest<Leader
80
89
  ),
81
90
  },
82
91
  success: Schema.Void,
83
- failure: UnexpectedError,
92
+ failure: UnknownError,
84
93
  },
85
94
  ) {}
86
95
 
@@ -89,35 +98,44 @@ export class LeaderWorkerInnerBootStatusStream extends Schema.TaggedRequest<Lead
89
98
  {
90
99
  payload: {},
91
100
  success: BootStatus,
92
- failure: UnexpectedError,
101
+ failure: Schema.Never,
93
102
  },
94
103
  ) {}
95
104
 
96
105
  export class LeaderWorkerInnerPullStream extends Schema.TaggedRequest<LeaderWorkerInnerPullStream>()('PullStream', {
97
106
  payload: {
98
- cursor: EventSequenceNumber.EventSequenceNumber,
107
+ cursor: Schema.typeSchema(EventSequenceNumber.Client.Composite),
99
108
  },
100
109
  success: Schema.Struct({
101
110
  payload: SyncState.PayloadUpstream,
102
111
  }),
103
- failure: UnexpectedError,
112
+ failure: Schema.Never,
104
113
  }) {}
105
114
 
115
+ export class LeaderWorkerInnerStreamEvents extends Schema.TaggedRequest<LeaderWorkerInnerStreamEvents>()(
116
+ 'StreamEvents',
117
+ {
118
+ payload: StreamEventsOptionsFields,
119
+ success: LiveStoreEvent.Client.Encoded,
120
+ failure: Schema.Never,
121
+ },
122
+ ) {}
123
+
106
124
  export class LeaderWorkerInnerPushToLeader extends Schema.TaggedRequest<LeaderWorkerInnerPushToLeader>()(
107
125
  'PushToLeader',
108
126
  {
109
127
  payload: {
110
- batch: Schema.Array(LiveStoreEvent.AnyEncoded),
128
+ batch: Schema.Array(Schema.typeSchema(LiveStoreEvent.Client.Encoded)),
111
129
  },
112
- success: Schema.Void,
113
- failure: Schema.Union(UnexpectedError, LeaderAheadError),
130
+ success: Schema.Void as Schema.Schema<void>,
131
+ failure: RejectedPushError,
114
132
  },
115
133
  ) {}
116
134
 
117
135
  export class LeaderWorkerInnerExport extends Schema.TaggedRequest<LeaderWorkerInnerExport>()('Export', {
118
136
  payload: {},
119
137
  success: Transferable.Uint8Array as Schema.Schema<Uint8Array<ArrayBuffer>>,
120
- failure: UnexpectedError,
138
+ failure: Schema.Never,
121
139
  }) {}
122
140
 
123
141
  export class LeaderWorkerInnerGetRecreateSnapshot extends Schema.TaggedRequest<LeaderWorkerInnerGetRecreateSnapshot>()(
@@ -128,7 +146,7 @@ export class LeaderWorkerInnerGetRecreateSnapshot extends Schema.TaggedRequest<L
128
146
  snapshot: Transferable.Uint8Array as Schema.Schema<Uint8Array<ArrayBuffer>>,
129
147
  migrationsReport: MigrationsReport,
130
148
  }),
131
- failure: UnexpectedError,
149
+ failure: Schema.Never,
132
150
  },
133
151
  ) {}
134
152
 
@@ -137,7 +155,7 @@ export class LeaderWorkerInnerExportEventlog extends Schema.TaggedRequest<Leader
137
155
  {
138
156
  payload: {},
139
157
  success: Transferable.Uint8Array as Schema.Schema<Uint8Array<ArrayBuffer>>,
140
- failure: UnexpectedError,
158
+ failure: Schema.Never,
141
159
  },
142
160
  ) {}
143
161
 
@@ -145,8 +163,8 @@ export class LeaderWorkerInnerGetLeaderHead extends Schema.TaggedRequest<LeaderW
145
163
  'GetLeaderHead',
146
164
  {
147
165
  payload: {},
148
- success: EventSequenceNumber.EventSequenceNumber,
149
- failure: UnexpectedError,
166
+ success: Schema.typeSchema(EventSequenceNumber.Client.Composite),
167
+ failure: Schema.Never,
150
168
  },
151
169
  ) {}
152
170
 
@@ -155,14 +173,41 @@ export class LeaderWorkerInnerGetLeaderSyncState extends Schema.TaggedRequest<Le
155
173
  {
156
174
  payload: {},
157
175
  success: SyncState.SyncState,
158
- failure: UnexpectedError,
176
+ failure: Schema.Never,
177
+ },
178
+ ) {}
179
+
180
+ export class LeaderWorkerInnerSyncStateStream extends Schema.TaggedRequest<LeaderWorkerInnerSyncStateStream>()(
181
+ 'SyncStateStream',
182
+ {
183
+ payload: {},
184
+ success: SyncState.SyncState,
185
+ failure: Schema.Never,
186
+ },
187
+ ) {}
188
+
189
+ export class LeaderWorkerInnerGetNetworkStatus extends Schema.TaggedRequest<LeaderWorkerInnerGetNetworkStatus>()(
190
+ 'GetNetworkStatus',
191
+ {
192
+ payload: {},
193
+ success: SyncBackend.NetworkStatus,
194
+ failure: Schema.Never,
195
+ },
196
+ ) {}
197
+
198
+ export class LeaderWorkerInnerNetworkStatusStream extends Schema.TaggedRequest<LeaderWorkerInnerNetworkStatusStream>()(
199
+ 'NetworkStatusStream',
200
+ {
201
+ payload: {},
202
+ success: SyncBackend.NetworkStatus,
203
+ failure: Schema.Never,
159
204
  },
160
205
  ) {}
161
206
 
162
207
  export class LeaderWorkerInnerShutdown extends Schema.TaggedRequest<LeaderWorkerInnerShutdown>()('Shutdown', {
163
208
  payload: {},
164
209
  success: Schema.Void,
165
- failure: UnexpectedError,
210
+ failure: Schema.Never,
166
211
  }) {}
167
212
 
168
213
  export class LeaderWorkerInnerExtraDevtoolsMessage extends Schema.TaggedRequest<LeaderWorkerInnerExtraDevtoolsMessage>()(
@@ -172,7 +217,7 @@ export class LeaderWorkerInnerExtraDevtoolsMessage extends Schema.TaggedRequest<
172
217
  message: Devtools.Leader.MessageToApp,
173
218
  },
174
219
  success: Schema.Void,
175
- failure: UnexpectedError,
220
+ failure: Schema.Never,
176
221
  },
177
222
  ) {}
178
223
 
@@ -180,12 +225,16 @@ export const LeaderWorkerInnerRequest = Schema.Union(
180
225
  LeaderWorkerInnerInitialMessage,
181
226
  LeaderWorkerInnerBootStatusStream,
182
227
  LeaderWorkerInnerPullStream,
228
+ LeaderWorkerInnerStreamEvents,
183
229
  LeaderWorkerInnerPushToLeader,
184
230
  LeaderWorkerInnerExport,
185
231
  LeaderWorkerInnerGetRecreateSnapshot,
186
232
  LeaderWorkerInnerExportEventlog,
187
233
  LeaderWorkerInnerGetLeaderHead,
188
234
  LeaderWorkerInnerGetLeaderSyncState,
235
+ LeaderWorkerInnerSyncStateStream,
236
+ LeaderWorkerInnerGetNetworkStatus,
237
+ LeaderWorkerInnerNetworkStatusStream,
189
238
  LeaderWorkerInnerShutdown,
190
239
  LeaderWorkerInnerExtraDevtoolsMessage,
191
240
  )