@livestore/adapter-web 0.3.2-dev.0 → 0.3.2-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/in-memory/in-memory-adapter.js +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.d.ts +2 -2
- package/dist/web-worker/client-session/persisted-adapter.d.ts.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.js +19 -19
- package/dist/web-worker/client-session/persisted-adapter.js.map +1 -1
- package/dist/web-worker/common/persisted-sqlite.d.ts +1 -1
- package/dist/web-worker/common/persisted-sqlite.js +1 -1
- package/dist/web-worker/common/worker-schema.d.ts +179 -187
- package/dist/web-worker/common/worker-schema.d.ts.map +1 -1
- package/dist/web-worker/common/worker-schema.js +120 -146
- package/dist/web-worker/common/worker-schema.js.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.js +6 -6
- package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.js +4 -4
- package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -1
- package/dist/web-worker/vite-dev-polyfill.js +1 -1
- package/dist/web-worker/vite-dev-polyfill.js.map +1 -1
- package/package.json +6 -6
- package/src/in-memory/in-memory-adapter.ts +2 -2
- package/src/index.ts +3 -3
- package/src/web-worker/ambient.d.ts +0 -2
- package/src/web-worker/client-session/persisted-adapter.ts +23 -24
- package/src/web-worker/common/persisted-sqlite.ts +2 -2
- package/src/web-worker/common/worker-schema.ts +126 -102
- package/src/web-worker/leader-worker/make-leader-worker.ts +6 -6
- package/src/web-worker/shared-worker/make-shared-worker.ts +10 -10
- package/src/web-worker/vite-dev-polyfill.ts +1 -1
|
@@ -32,12 +32,12 @@ import {
|
|
|
32
32
|
} from '@livestore/utils/effect'
|
|
33
33
|
import { nanoid } from '@livestore/utils/nanoid'
|
|
34
34
|
|
|
35
|
-
import * as OpfsUtils from '../../opfs-utils.
|
|
36
|
-
import { readPersistedAppDbFromClientSession, resetPersistedDataFromClientSession } from '../common/persisted-sqlite.
|
|
37
|
-
import { makeShutdownChannel } from '../common/shutdown-channel.
|
|
38
|
-
import { DedicatedWorkerDisconnectBroadcast, makeWorkerDisconnectChannel } from '../common/worker-disconnect-channel.
|
|
39
|
-
import * as WorkerSchema from '../common/worker-schema.
|
|
40
|
-
import { connectWebmeshNodeClientSession } from './client-session-devtools.
|
|
35
|
+
import * as OpfsUtils from '../../opfs-utils.ts'
|
|
36
|
+
import { readPersistedAppDbFromClientSession, resetPersistedDataFromClientSession } from '../common/persisted-sqlite.ts'
|
|
37
|
+
import { makeShutdownChannel } from '../common/shutdown-channel.ts'
|
|
38
|
+
import { DedicatedWorkerDisconnectBroadcast, makeWorkerDisconnectChannel } from '../common/worker-disconnect-channel.ts'
|
|
39
|
+
import * as WorkerSchema from '../common/worker-schema.ts'
|
|
40
|
+
import { connectWebmeshNodeClientSession } from './client-session-devtools.ts'
|
|
41
41
|
|
|
42
42
|
// NOTE we're starting to initialize the sqlite wasm binary here to speed things up
|
|
43
43
|
const sqlite3Promise = loadSqlite3Wasm()
|
|
@@ -110,7 +110,7 @@ export type WebAdapterOptions = {
|
|
|
110
110
|
* @example
|
|
111
111
|
* ```ts
|
|
112
112
|
* import { makePersistedAdapter } from '@livestore/adapter-web'
|
|
113
|
-
* import LiveStoreWorker from './livestore.worker?worker'
|
|
113
|
+
* import LiveStoreWorker from './livestore.worker.ts?worker'
|
|
114
114
|
* import LiveStoreSharedWorker from '@livestore/adapter-web/shared-worker?sharedworker'
|
|
115
115
|
*
|
|
116
116
|
* const adapter = makePersistedAdapter({
|
|
@@ -173,15 +173,15 @@ export const makePersistedAdapter =
|
|
|
173
173
|
|
|
174
174
|
const sharedWebWorker = tryAsFunctionAndNew(options.sharedWorker, { name: `livestore-shared-worker-${storeId}` })
|
|
175
175
|
|
|
176
|
-
const sharedWorkerFiber = yield* Worker.makePoolSerialized<typeof WorkerSchema.
|
|
176
|
+
const sharedWorkerFiber = yield* Worker.makePoolSerialized<typeof WorkerSchema.SharedWorkerRequest.Type>({
|
|
177
177
|
size: 1,
|
|
178
178
|
concurrency: 100,
|
|
179
179
|
initialMessage: () =>
|
|
180
|
-
new WorkerSchema.
|
|
180
|
+
new WorkerSchema.SharedWorkerInitialMessage({
|
|
181
181
|
liveStoreVersion,
|
|
182
182
|
payload: {
|
|
183
183
|
_tag: 'FromClientSession',
|
|
184
|
-
initialMessage: new WorkerSchema.
|
|
184
|
+
initialMessage: new WorkerSchema.LeaderWorkerInnerInitialMessage({
|
|
185
185
|
storageOptions,
|
|
186
186
|
storeId,
|
|
187
187
|
clientId,
|
|
@@ -232,9 +232,8 @@ export const makePersistedAdapter =
|
|
|
232
232
|
// and adding the `sessionId` to make it easier to debug which session a worker belongs to in logs
|
|
233
233
|
const worker = tryAsFunctionAndNew(options.worker, { name: `livestore-worker-${storeId}-${sessionId}` })
|
|
234
234
|
|
|
235
|
-
yield* Worker.makeSerialized<WorkerSchema.
|
|
236
|
-
initialMessage: () =>
|
|
237
|
-
new WorkerSchema.LeaderWorkerOuter.InitialMessage({ port: mc.port1, storeId, clientId }),
|
|
235
|
+
yield* Worker.makeSerialized<WorkerSchema.LeaderWorkerOuterRequest>({
|
|
236
|
+
initialMessage: () => new WorkerSchema.LeaderWorkerOuterInitialMessage({ port: mc.port1, storeId, clientId }),
|
|
238
237
|
}).pipe(
|
|
239
238
|
Effect.provide(BrowserWorker.layer(() => worker)),
|
|
240
239
|
UnexpectedError.mapToUnexpectedError,
|
|
@@ -248,7 +247,7 @@ export const makePersistedAdapter =
|
|
|
248
247
|
|
|
249
248
|
const sharedWorker = yield* Fiber.join(sharedWorkerFiber)
|
|
250
249
|
yield* sharedWorker
|
|
251
|
-
.executeEffect(new WorkerSchema.
|
|
250
|
+
.executeEffect(new WorkerSchema.SharedWorkerUpdateMessagePort({ port: mc.port2 }))
|
|
252
251
|
.pipe(UnexpectedError.mapToUnexpectedError, Effect.tapErrorCause(shutdown))
|
|
253
252
|
|
|
254
253
|
yield* Deferred.succeed(waitForSharedWorkerInitialized, undefined)
|
|
@@ -276,7 +275,7 @@ export const makePersistedAdapter =
|
|
|
276
275
|
yield* runLocked.pipe(Effect.interruptible, Effect.tapCauseLogPretty, Effect.forkScoped)
|
|
277
276
|
}
|
|
278
277
|
|
|
279
|
-
const runInWorker = <TReq extends typeof WorkerSchema.
|
|
278
|
+
const runInWorker = <TReq extends typeof WorkerSchema.SharedWorkerRequest.Type>(
|
|
280
279
|
req: TReq,
|
|
281
280
|
): TReq extends Schema.WithResult<infer A, infer _I, infer E, infer _EI, infer R>
|
|
282
281
|
? Effect.Effect<A, UnexpectedError | E, R>
|
|
@@ -303,7 +302,7 @@ export const makePersistedAdapter =
|
|
|
303
302
|
Effect.catchAllDefect((cause) => new UnexpectedError({ cause })),
|
|
304
303
|
) as any
|
|
305
304
|
|
|
306
|
-
const runInWorkerStream = <TReq extends typeof WorkerSchema.
|
|
305
|
+
const runInWorkerStream = <TReq extends typeof WorkerSchema.SharedWorkerRequest.Type>(
|
|
307
306
|
req: TReq,
|
|
308
307
|
): TReq extends Schema.WithResult<infer A, infer _I, infer _E, infer _EI, infer R>
|
|
309
308
|
? Stream.Stream<A, UnexpectedError, R>
|
|
@@ -322,7 +321,7 @@ export const makePersistedAdapter =
|
|
|
322
321
|
)
|
|
323
322
|
}).pipe(Stream.unwrap) as any
|
|
324
323
|
|
|
325
|
-
const bootStatusFiber = yield* runInWorkerStream(new WorkerSchema.
|
|
324
|
+
const bootStatusFiber = yield* runInWorkerStream(new WorkerSchema.LeaderWorkerInnerBootStatusStream()).pipe(
|
|
326
325
|
Stream.tap((_) => Queue.offer(bootStatusQueue, _)),
|
|
327
326
|
Stream.runDrain,
|
|
328
327
|
Effect.tapErrorCause((cause) => (Cause.isInterruptedOnly(cause) ? Effect.void : shutdown(cause))),
|
|
@@ -341,7 +340,7 @@ export const makePersistedAdapter =
|
|
|
341
340
|
// re-exporting the db
|
|
342
341
|
const initialResult =
|
|
343
342
|
dataFromFile === undefined
|
|
344
|
-
? yield* runInWorker(new WorkerSchema.
|
|
343
|
+
? yield* runInWorker(new WorkerSchema.LeaderWorkerInnerGetRecreateSnapshot()).pipe(
|
|
345
344
|
Effect.map(({ snapshot, migrationsReport }) => ({
|
|
346
345
|
_tag: 'from-leader-worker' as const,
|
|
347
346
|
snapshot,
|
|
@@ -403,7 +402,7 @@ export const makePersistedAdapter =
|
|
|
403
402
|
)
|
|
404
403
|
|
|
405
404
|
const leaderThread: ClientSession['leaderThread'] = {
|
|
406
|
-
export: runInWorker(new WorkerSchema.
|
|
405
|
+
export: runInWorker(new WorkerSchema.LeaderWorkerInnerExport()).pipe(
|
|
407
406
|
Effect.timeout(10_000),
|
|
408
407
|
UnexpectedError.mapToUnexpectedError,
|
|
409
408
|
Effect.withSpan('@livestore/adapter-web:client-session:export'),
|
|
@@ -411,9 +410,9 @@ export const makePersistedAdapter =
|
|
|
411
410
|
|
|
412
411
|
events: {
|
|
413
412
|
pull: ({ cursor }) =>
|
|
414
|
-
runInWorkerStream(new WorkerSchema.
|
|
413
|
+
runInWorkerStream(new WorkerSchema.LeaderWorkerInnerPullStream({ cursor })).pipe(Stream.orDie),
|
|
415
414
|
push: (batch) =>
|
|
416
|
-
runInWorker(new WorkerSchema.
|
|
415
|
+
runInWorker(new WorkerSchema.LeaderWorkerInnerPushToLeader({ batch })).pipe(
|
|
417
416
|
Effect.withSpan('@livestore/adapter-web:client-session:pushToLeader', {
|
|
418
417
|
attributes: { batchSize: batch.length },
|
|
419
418
|
}),
|
|
@@ -422,19 +421,19 @@ export const makePersistedAdapter =
|
|
|
422
421
|
|
|
423
422
|
initialState: { leaderHead: initialLeaderHead, migrationsReport },
|
|
424
423
|
|
|
425
|
-
getEventlogData: runInWorker(new WorkerSchema.
|
|
424
|
+
getEventlogData: runInWorker(new WorkerSchema.LeaderWorkerInnerExportEventlog()).pipe(
|
|
426
425
|
Effect.timeout(10_000),
|
|
427
426
|
UnexpectedError.mapToUnexpectedError,
|
|
428
427
|
Effect.withSpan('@livestore/adapter-web:client-session:getEventlogData'),
|
|
429
428
|
),
|
|
430
429
|
|
|
431
|
-
getSyncState: runInWorker(new WorkerSchema.
|
|
430
|
+
getSyncState: runInWorker(new WorkerSchema.LeaderWorkerInnerGetLeaderSyncState()).pipe(
|
|
432
431
|
UnexpectedError.mapToUnexpectedError,
|
|
433
432
|
Effect.withSpan('@livestore/adapter-web:client-session:getLeaderSyncState'),
|
|
434
433
|
),
|
|
435
434
|
|
|
436
435
|
sendDevtoolsMessage: (message) =>
|
|
437
|
-
runInWorker(new WorkerSchema.
|
|
436
|
+
runInWorker(new WorkerSchema.LeaderWorkerInnerExtraDevtoolsMessage({ message })).pipe(
|
|
438
437
|
UnexpectedError.mapToUnexpectedError,
|
|
439
438
|
Effect.withSpan('@livestore/adapter-web:client-session:devtoolsMessageForLeader'),
|
|
440
439
|
),
|
|
@@ -3,8 +3,8 @@ import type { LiveStoreSchema } from '@livestore/common/schema'
|
|
|
3
3
|
import { decodeSAHPoolFilename, HEADER_OFFSET_DATA } from '@livestore/sqlite-wasm/browser'
|
|
4
4
|
import { Effect, Schedule, Schema } from '@livestore/utils/effect'
|
|
5
5
|
|
|
6
|
-
import * as OpfsUtils from '../../opfs-utils.
|
|
7
|
-
import type * as WorkerSchema from './worker-schema.
|
|
6
|
+
import * as OpfsUtils from '../../opfs-utils.ts'
|
|
7
|
+
import type * as WorkerSchema from './worker-schema.ts'
|
|
8
8
|
|
|
9
9
|
export class PersistedSqliteError extends Schema.TaggedError<PersistedSqliteError>()('PersistedSqliteError', {
|
|
10
10
|
cause: Schema.Defect,
|
|
@@ -43,19 +43,21 @@ export type StorageTypeEncoded = typeof StorageType.Encoded
|
|
|
43
43
|
export const SyncBackendOptions = Schema.Record({ key: Schema.String, value: Schema.JsonValue })
|
|
44
44
|
export type SyncBackendOptions = Record<string, Schema.JsonValue>
|
|
45
45
|
|
|
46
|
-
export
|
|
47
|
-
|
|
46
|
+
export class LeaderWorkerOuterInitialMessage extends Schema.TaggedRequest<LeaderWorkerOuterInitialMessage>()(
|
|
47
|
+
'InitialMessage',
|
|
48
|
+
{
|
|
48
49
|
payload: { port: Transferable.MessagePort, storeId: Schema.String, clientId: Schema.String },
|
|
49
50
|
success: Schema.Void,
|
|
50
51
|
failure: UnexpectedError,
|
|
51
|
-
}
|
|
52
|
+
},
|
|
53
|
+
) {}
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
+
export class LeaderWorkerOuterRequest extends Schema.Union(LeaderWorkerOuterInitialMessage) {}
|
|
55
56
|
|
|
56
57
|
// TODO unify this code with schema from node adapter
|
|
57
|
-
export
|
|
58
|
-
|
|
58
|
+
export class LeaderWorkerInnerInitialMessage extends Schema.TaggedRequest<LeaderWorkerInnerInitialMessage>()(
|
|
59
|
+
'InitialMessage',
|
|
60
|
+
{
|
|
59
61
|
payload: {
|
|
60
62
|
storageOptions: StorageType,
|
|
61
63
|
devtoolsEnabled: Schema.Boolean,
|
|
@@ -66,136 +68,158 @@ export namespace LeaderWorkerInner {
|
|
|
66
68
|
},
|
|
67
69
|
success: Schema.Void,
|
|
68
70
|
failure: UnexpectedError,
|
|
69
|
-
}
|
|
71
|
+
},
|
|
72
|
+
) {}
|
|
70
73
|
|
|
71
|
-
|
|
74
|
+
export class LeaderWorkerInnerBootStatusStream extends Schema.TaggedRequest<LeaderWorkerInnerBootStatusStream>()(
|
|
75
|
+
'BootStatusStream',
|
|
76
|
+
{
|
|
72
77
|
payload: {},
|
|
73
78
|
success: BootStatus,
|
|
74
79
|
failure: UnexpectedError,
|
|
75
|
-
}
|
|
80
|
+
},
|
|
81
|
+
) {}
|
|
76
82
|
|
|
77
|
-
|
|
83
|
+
export class LeaderWorkerInnerPushToLeader extends Schema.TaggedRequest<LeaderWorkerInnerPushToLeader>()(
|
|
84
|
+
'PushToLeader',
|
|
85
|
+
{
|
|
78
86
|
payload: {
|
|
79
87
|
batch: Schema.Array(LiveStoreEvent.AnyEncoded),
|
|
80
88
|
},
|
|
81
89
|
success: Schema.Void,
|
|
82
90
|
failure: Schema.Union(UnexpectedError, LeaderAheadError),
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
91
|
+
},
|
|
92
|
+
) {}
|
|
93
|
+
|
|
94
|
+
export class LeaderWorkerInnerPullStream extends Schema.TaggedRequest<LeaderWorkerInnerPullStream>()('PullStream', {
|
|
95
|
+
payload: {
|
|
96
|
+
cursor: EventSequenceNumber.EventSequenceNumber,
|
|
97
|
+
},
|
|
98
|
+
success: Schema.Struct({
|
|
99
|
+
payload: SyncState.PayloadUpstream,
|
|
100
|
+
}),
|
|
101
|
+
failure: UnexpectedError,
|
|
102
|
+
}) {}
|
|
103
|
+
|
|
104
|
+
export class LeaderWorkerInnerExport extends Schema.TaggedRequest<LeaderWorkerInnerExport>()('Export', {
|
|
105
|
+
payload: {},
|
|
106
|
+
success: Transferable.Uint8Array,
|
|
107
|
+
failure: UnexpectedError,
|
|
108
|
+
}) {}
|
|
109
|
+
|
|
110
|
+
export class LeaderWorkerInnerExportEventlog extends Schema.TaggedRequest<LeaderWorkerInnerExportEventlog>()(
|
|
111
|
+
'ExportEventlog',
|
|
112
|
+
{
|
|
102
113
|
payload: {},
|
|
103
114
|
success: Transferable.Uint8Array,
|
|
104
115
|
failure: UnexpectedError,
|
|
105
|
-
}
|
|
116
|
+
},
|
|
117
|
+
) {}
|
|
106
118
|
|
|
107
|
-
|
|
119
|
+
export class LeaderWorkerInnerGetRecreateSnapshot extends Schema.TaggedRequest<LeaderWorkerInnerGetRecreateSnapshot>()(
|
|
120
|
+
'GetRecreateSnapshot',
|
|
121
|
+
{
|
|
108
122
|
payload: {},
|
|
109
123
|
success: Schema.Struct({
|
|
110
124
|
snapshot: Transferable.Uint8Array,
|
|
111
125
|
migrationsReport: MigrationsReport,
|
|
112
126
|
}),
|
|
113
127
|
failure: UnexpectedError,
|
|
114
|
-
}
|
|
128
|
+
},
|
|
129
|
+
) {}
|
|
115
130
|
|
|
116
|
-
|
|
131
|
+
export class LeaderWorkerInnerGetLeaderHead extends Schema.TaggedRequest<LeaderWorkerInnerGetLeaderHead>()(
|
|
132
|
+
'GetLeaderHead',
|
|
133
|
+
{
|
|
117
134
|
payload: {},
|
|
118
135
|
success: EventSequenceNumber.EventSequenceNumber,
|
|
119
136
|
failure: UnexpectedError,
|
|
120
|
-
}
|
|
137
|
+
},
|
|
138
|
+
) {}
|
|
121
139
|
|
|
122
|
-
|
|
140
|
+
export class LeaderWorkerInnerGetLeaderSyncState extends Schema.TaggedRequest<LeaderWorkerInnerGetLeaderSyncState>()(
|
|
141
|
+
'GetLeaderSyncState',
|
|
142
|
+
{
|
|
123
143
|
payload: {},
|
|
124
144
|
success: SyncState.SyncState,
|
|
125
145
|
failure: UnexpectedError,
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
146
|
+
},
|
|
147
|
+
) {}
|
|
148
|
+
|
|
149
|
+
export class LeaderWorkerInnerShutdown extends Schema.TaggedRequest<LeaderWorkerInnerShutdown>()('Shutdown', {
|
|
150
|
+
payload: {},
|
|
151
|
+
success: Schema.Void,
|
|
152
|
+
failure: UnexpectedError,
|
|
153
|
+
}) {}
|
|
154
|
+
|
|
155
|
+
export class LeaderWorkerInnerExtraDevtoolsMessage extends Schema.TaggedRequest<LeaderWorkerInnerExtraDevtoolsMessage>()(
|
|
156
|
+
'ExtraDevtoolsMessage',
|
|
157
|
+
{
|
|
135
158
|
payload: {
|
|
136
159
|
message: Devtools.Leader.MessageToApp,
|
|
137
160
|
},
|
|
138
161
|
success: Schema.Void,
|
|
139
162
|
failure: UnexpectedError,
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
export
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
payload: {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
163
|
+
},
|
|
164
|
+
) {}
|
|
165
|
+
|
|
166
|
+
export const LeaderWorkerInnerRequest = Schema.Union(
|
|
167
|
+
LeaderWorkerInnerInitialMessage,
|
|
168
|
+
LeaderWorkerInnerBootStatusStream,
|
|
169
|
+
LeaderWorkerInnerPushToLeader,
|
|
170
|
+
LeaderWorkerInnerPullStream,
|
|
171
|
+
LeaderWorkerInnerExport,
|
|
172
|
+
LeaderWorkerInnerExportEventlog,
|
|
173
|
+
LeaderWorkerInnerGetRecreateSnapshot,
|
|
174
|
+
LeaderWorkerInnerGetLeaderHead,
|
|
175
|
+
LeaderWorkerInnerGetLeaderSyncState,
|
|
176
|
+
LeaderWorkerInnerShutdown,
|
|
177
|
+
LeaderWorkerInnerExtraDevtoolsMessage,
|
|
178
|
+
WebmeshWorker.Schema.CreateConnection,
|
|
179
|
+
)
|
|
180
|
+
export type LeaderWorkerInnerRequest = typeof LeaderWorkerInnerRequest.Type
|
|
181
|
+
|
|
182
|
+
export class SharedWorkerInitialMessagePayloadFromClientSession extends Schema.TaggedStruct('FromClientSession', {
|
|
183
|
+
initialMessage: LeaderWorkerInnerInitialMessage,
|
|
184
|
+
}) {}
|
|
185
|
+
|
|
186
|
+
export class SharedWorkerInitialMessage extends Schema.TaggedRequest<SharedWorkerInitialMessage>()('InitialMessage', {
|
|
187
|
+
payload: {
|
|
188
|
+
payload: Schema.Union(SharedWorkerInitialMessagePayloadFromClientSession, Schema.TaggedStruct('FromWebBridge', {})),
|
|
189
|
+
// To guard against scenarios where a client session is already running a newer version of LiveStore
|
|
190
|
+
// We should probably find a better way to handle those cases once they become more common.
|
|
191
|
+
liveStoreVersion: Schema.Literal(liveStoreVersion),
|
|
192
|
+
},
|
|
193
|
+
success: Schema.Void,
|
|
194
|
+
failure: UnexpectedError,
|
|
195
|
+
}) {}
|
|
196
|
+
|
|
197
|
+
export class SharedWorkerUpdateMessagePort extends Schema.TaggedRequest<SharedWorkerUpdateMessagePort>()(
|
|
198
|
+
'UpdateMessagePort',
|
|
199
|
+
{
|
|
176
200
|
payload: {
|
|
177
201
|
port: Transferable.MessagePort,
|
|
178
202
|
},
|
|
179
203
|
success: Schema.Void,
|
|
180
204
|
failure: UnexpectedError,
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
205
|
+
},
|
|
206
|
+
) {}
|
|
207
|
+
|
|
208
|
+
export class SharedWorkerRequest extends Schema.Union(
|
|
209
|
+
SharedWorkerInitialMessage,
|
|
210
|
+
SharedWorkerUpdateMessagePort,
|
|
211
|
+
|
|
212
|
+
// Proxied requests
|
|
213
|
+
LeaderWorkerInnerBootStatusStream,
|
|
214
|
+
LeaderWorkerInnerPushToLeader,
|
|
215
|
+
LeaderWorkerInnerPullStream,
|
|
216
|
+
LeaderWorkerInnerExport,
|
|
217
|
+
LeaderWorkerInnerGetRecreateSnapshot,
|
|
218
|
+
LeaderWorkerInnerExportEventlog,
|
|
219
|
+
LeaderWorkerInnerGetLeaderHead,
|
|
220
|
+
LeaderWorkerInnerGetLeaderSyncState,
|
|
221
|
+
LeaderWorkerInnerShutdown,
|
|
222
|
+
LeaderWorkerInnerExtraDevtoolsMessage,
|
|
223
|
+
|
|
224
|
+
WebmeshWorker.Schema.CreateConnection,
|
|
225
|
+
) {}
|
|
@@ -25,10 +25,10 @@ import {
|
|
|
25
25
|
} from '@livestore/utils/effect'
|
|
26
26
|
import type * as otel from '@opentelemetry/api'
|
|
27
27
|
|
|
28
|
-
import * as OpfsUtils from '../../opfs-utils.
|
|
29
|
-
import { getStateDbFileName, sanitizeOpfsDir } from '../common/persisted-sqlite.
|
|
30
|
-
import { makeShutdownChannel } from '../common/shutdown-channel.
|
|
31
|
-
import * as WorkerSchema from '../common/worker-schema.
|
|
28
|
+
import * as OpfsUtils from '../../opfs-utils.ts'
|
|
29
|
+
import { getStateDbFileName, sanitizeOpfsDir } from '../common/persisted-sqlite.ts'
|
|
30
|
+
import { makeShutdownChannel } from '../common/shutdown-channel.ts'
|
|
31
|
+
import * as WorkerSchema from '../common/worker-schema.ts'
|
|
32
32
|
|
|
33
33
|
export type WorkerOptions = {
|
|
34
34
|
schema: LiveStoreSchema
|
|
@@ -81,7 +81,7 @@ export const makeWorkerEffect = (options: WorkerOptions) => {
|
|
|
81
81
|
const makeWorkerRunnerOuter = (
|
|
82
82
|
workerOptions: WorkerOptions,
|
|
83
83
|
): Layer.Layer<never, WorkerError.WorkerError, WorkerRunner.PlatformRunner | HttpClient.HttpClient> =>
|
|
84
|
-
WorkerRunner.layerSerialized(WorkerSchema.
|
|
84
|
+
WorkerRunner.layerSerialized(WorkerSchema.LeaderWorkerOuterInitialMessage, {
|
|
85
85
|
// Port coming from client session and forwarded via the shared worker
|
|
86
86
|
InitialMessage: ({ port: incomingRequestsPort, storeId, clientId }) =>
|
|
87
87
|
Effect.gen(function* () {
|
|
@@ -102,7 +102,7 @@ const makeWorkerRunnerOuter = (
|
|
|
102
102
|
})
|
|
103
103
|
|
|
104
104
|
const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
105
|
-
WorkerRunner.layerSerialized(WorkerSchema.
|
|
105
|
+
WorkerRunner.layerSerialized(WorkerSchema.LeaderWorkerInnerRequest, {
|
|
106
106
|
InitialMessage: ({ storageOptions, storeId, clientId, devtoolsEnabled, debugInstanceId, syncPayload }) =>
|
|
107
107
|
Effect.gen(function* () {
|
|
108
108
|
const sqlite3 = yield* Effect.promise(() => loadSqlite3Wasm())
|
|
@@ -25,8 +25,8 @@ import {
|
|
|
25
25
|
WorkerRunner,
|
|
26
26
|
} from '@livestore/utils/effect'
|
|
27
27
|
|
|
28
|
-
import { makeShutdownChannel } from '../common/shutdown-channel.
|
|
29
|
-
import * as WorkerSchema from '../common/worker-schema.
|
|
28
|
+
import { makeShutdownChannel } from '../common/shutdown-channel.ts'
|
|
29
|
+
import * as WorkerSchema from '../common/worker-schema.ts'
|
|
30
30
|
|
|
31
31
|
if (isDevEnv()) {
|
|
32
32
|
globalThis.__debugLiveStoreUtils = {
|
|
@@ -39,21 +39,21 @@ if (isDevEnv()) {
|
|
|
39
39
|
const makeWorkerRunner = Effect.gen(function* () {
|
|
40
40
|
const leaderWorkerContextSubRef = yield* SubscriptionRef.make<
|
|
41
41
|
| {
|
|
42
|
-
worker: Worker.SerializedWorkerPool<WorkerSchema.
|
|
42
|
+
worker: Worker.SerializedWorkerPool<WorkerSchema.LeaderWorkerInnerRequest>
|
|
43
43
|
scope: Scope.CloseableScope
|
|
44
44
|
}
|
|
45
45
|
| undefined
|
|
46
46
|
>(undefined)
|
|
47
47
|
|
|
48
48
|
const initialMessagePayloadDeferredRef = yield* Deferred.make<
|
|
49
|
-
typeof WorkerSchema.
|
|
49
|
+
typeof WorkerSchema.SharedWorkerInitialMessagePayloadFromClientSession.Type
|
|
50
50
|
>().pipe(Effect.andThen(Ref.make))
|
|
51
51
|
|
|
52
52
|
const waitForWorker = SubscriptionRef.waitUntil(leaderWorkerContextSubRef, isNotUndefined).pipe(
|
|
53
53
|
Effect.map((_) => _.worker),
|
|
54
54
|
)
|
|
55
55
|
|
|
56
|
-
const forwardRequest = <TReq extends WorkerSchema.
|
|
56
|
+
const forwardRequest = <TReq extends WorkerSchema.LeaderWorkerInnerRequest>(
|
|
57
57
|
req: TReq,
|
|
58
58
|
): TReq extends Schema.WithResult<infer A, infer _I, infer _E, infer _EI, infer _R>
|
|
59
59
|
? Effect.Effect<A, UnexpectedError, never>
|
|
@@ -79,7 +79,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
79
79
|
Effect.tapCauseLogPretty,
|
|
80
80
|
) as any
|
|
81
81
|
|
|
82
|
-
const forwardRequestStream = <TReq extends WorkerSchema.
|
|
82
|
+
const forwardRequestStream = <TReq extends WorkerSchema.LeaderWorkerInnerRequest>(
|
|
83
83
|
req: TReq,
|
|
84
84
|
): TReq extends Schema.WithResult<infer A, infer _I, infer _E, infer _EI, infer _R>
|
|
85
85
|
? Stream.Stream<A, UnexpectedError, never>
|
|
@@ -133,14 +133,14 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
133
133
|
yield* Effect.logDebug('reset')
|
|
134
134
|
|
|
135
135
|
const initialMessagePayloadDeferred =
|
|
136
|
-
yield* Deferred.make<typeof WorkerSchema.
|
|
136
|
+
yield* Deferred.make<typeof WorkerSchema.SharedWorkerInitialMessagePayloadFromClientSession.Type>()
|
|
137
137
|
yield* Ref.set(initialMessagePayloadDeferredRef, initialMessagePayloadDeferred)
|
|
138
138
|
|
|
139
139
|
yield* resetCurrentWorkerCtx
|
|
140
140
|
// yield* devtoolsWebBridge.reset
|
|
141
141
|
})
|
|
142
142
|
|
|
143
|
-
return WorkerRunner.layerSerialized(WorkerSchema.
|
|
143
|
+
return WorkerRunner.layerSerialized(WorkerSchema.SharedWorkerRequest, {
|
|
144
144
|
InitialMessage: (message) =>
|
|
145
145
|
Effect.gen(function* () {
|
|
146
146
|
if (message.payload._tag === 'FromWebBridge') return
|
|
@@ -151,7 +151,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
151
151
|
|
|
152
152
|
if (deferredAlreadyDone) {
|
|
153
153
|
const previousInitialMessage = yield* Deferred.await(initialMessagePayloadDeferred)
|
|
154
|
-
const messageSchema = WorkerSchema.
|
|
154
|
+
const messageSchema = WorkerSchema.LeaderWorkerInnerInitialMessage.pipe(
|
|
155
155
|
Schema.omit('devtoolsEnabled', 'debugInstanceId'),
|
|
156
156
|
)
|
|
157
157
|
const isEqual = Schema.equivalence(messageSchema)
|
|
@@ -194,7 +194,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
194
194
|
|
|
195
195
|
const workerLayer = yield* Layer.build(BrowserWorker.layer(() => port))
|
|
196
196
|
|
|
197
|
-
const worker = yield* Worker.makePoolSerialized<WorkerSchema.
|
|
197
|
+
const worker = yield* Worker.makePoolSerialized<WorkerSchema.LeaderWorkerInnerRequest>({
|
|
198
198
|
size: 1,
|
|
199
199
|
concurrency: 100,
|
|
200
200
|
initialMessage: () => initialMessagePayload.initialMessage,
|
|
@@ -5,7 +5,7 @@ globalThis.$RefreshReg$ = () => {}
|
|
|
5
5
|
// @ts-expect-error TODO remove when Vite does proper treeshaking during dev
|
|
6
6
|
globalThis.$RefreshSig$ = () => (type: any) => type
|
|
7
7
|
|
|
8
|
-
// @ts-ignore
|
|
8
|
+
// @ts-ignore
|
|
9
9
|
globalThis.process = globalThis.process ?? { env: {} }
|
|
10
10
|
|
|
11
11
|
globalThis.document = (globalThis as any)?.document ?? {
|