@livestore/adapter-web 0.3.0-dev.27 → 0.3.0-dev.29
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.d.ts.map +1 -1
- package/dist/in-memory/in-memory-adapter.js +3 -4
- package/dist/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.d.ts +1 -1
- package/dist/web-worker/client-session/persisted-adapter.js +6 -6
- package/dist/web-worker/client-session/persisted-adapter.js.map +1 -1
- package/dist/web-worker/common/worker-schema.d.ts +8 -8
- package/dist/web-worker/common/worker-schema.d.ts.map +1 -1
- package/dist/web-worker/common/worker-schema.js +6 -6
- package/dist/web-worker/common/worker-schema.js.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.js +11 -11
- package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.js +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -1
- package/package.json +7 -7
- package/src/in-memory/in-memory-adapter.ts +3 -5
- package/src/web-worker/client-session/persisted-adapter.ts +8 -8
- package/src/web-worker/common/worker-schema.ts +5 -5
- package/src/web-worker/leader-worker/make-leader-worker.ts +15 -20
- package/src/web-worker/shared-worker/make-shared-worker.ts +1 -1
- package/tmp/pack.tgz +0 -0
|
@@ -75,7 +75,7 @@ export type WebAdapterOptions = {
|
|
|
75
75
|
*/
|
|
76
76
|
storage: WorkerSchema.StorageTypeEncoded
|
|
77
77
|
/**
|
|
78
|
-
* Warning: This will reset both the app and
|
|
78
|
+
* Warning: This will reset both the app and eventlog database.
|
|
79
79
|
* This should only be used during development.
|
|
80
80
|
*
|
|
81
81
|
* @default false
|
|
@@ -190,7 +190,7 @@ export const makePersistedAdapter =
|
|
|
190
190
|
|
|
191
191
|
const lockDeferred = yield* Deferred.make<void>()
|
|
192
192
|
// It's important that we resolve the leader election in a blocking way, so there's always a leader.
|
|
193
|
-
// Otherwise
|
|
193
|
+
// Otherwise events could end up being dropped.
|
|
194
194
|
//
|
|
195
195
|
// Sorry for this pun ...
|
|
196
196
|
let gotLocky = yield* WebLock.tryGetDeferredLock(lockDeferred, LIVESTORE_TAB_LOCK)
|
|
@@ -358,8 +358,8 @@ export const makePersistedAdapter =
|
|
|
358
358
|
})
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
-
// We're restoring the leader head from the SESSION_CHANGESET_META_TABLE, not from the
|
|
362
|
-
// in order to avoid exporting/transferring the
|
|
361
|
+
// We're restoring the leader head from the SESSION_CHANGESET_META_TABLE, not from the eventlog db/table
|
|
362
|
+
// in order to avoid exporting/transferring the eventlog db/table, which is important to speed up the fast path.
|
|
363
363
|
const initialLeaderHeadRes = sqliteDb.select<{
|
|
364
364
|
idGlobal: EventId.GlobalEventId
|
|
365
365
|
idClient: EventId.ClientEventId
|
|
@@ -410,7 +410,7 @@ export const makePersistedAdapter =
|
|
|
410
410
|
Effect.withSpan('@livestore/adapter-web:client-session:export'),
|
|
411
411
|
),
|
|
412
412
|
|
|
413
|
-
|
|
413
|
+
events: {
|
|
414
414
|
pull: ({ cursor }) =>
|
|
415
415
|
runInWorkerStream(new WorkerSchema.LeaderWorkerInner.PullStream({ cursor })).pipe(Stream.orDie),
|
|
416
416
|
push: (batch) =>
|
|
@@ -423,10 +423,10 @@ export const makePersistedAdapter =
|
|
|
423
423
|
|
|
424
424
|
initialState: { leaderHead: initialLeaderHead, migrationsReport },
|
|
425
425
|
|
|
426
|
-
|
|
426
|
+
getEventlogData: runInWorker(new WorkerSchema.LeaderWorkerInner.ExportEventlog()).pipe(
|
|
427
427
|
Effect.timeout(10_000),
|
|
428
428
|
UnexpectedError.mapToUnexpectedError,
|
|
429
|
-
Effect.withSpan('@livestore/adapter-web:client-session:
|
|
429
|
+
Effect.withSpan('@livestore/adapter-web:client-session:getEventlogData'),
|
|
430
430
|
),
|
|
431
431
|
|
|
432
432
|
getSyncState: runInWorker(new WorkerSchema.LeaderWorkerInner.GetLeaderSyncState()).pipe(
|
|
@@ -520,7 +520,7 @@ export const makePersistedAdapter =
|
|
|
520
520
|
return clientSession
|
|
521
521
|
}).pipe(UnexpectedError.mapToUnexpectedError)
|
|
522
522
|
|
|
523
|
-
// NOTE for `local` storage we could also use the
|
|
523
|
+
// NOTE for `local` storage we could also use the eventlog db to store the data
|
|
524
524
|
const getPersistedId = (key: string, storageType: 'session' | 'local') => {
|
|
525
525
|
const makeId = () => nanoid(5)
|
|
526
526
|
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
SyncState,
|
|
8
8
|
UnexpectedError,
|
|
9
9
|
} from '@livestore/common'
|
|
10
|
-
import { EventId,
|
|
10
|
+
import { EventId, LiveStoreEvent } from '@livestore/common/schema'
|
|
11
11
|
import * as WebmeshWorker from '@livestore/devtools-web-common/worker'
|
|
12
12
|
import { Schema, Transferable } from '@livestore/utils/effect'
|
|
13
13
|
|
|
@@ -76,7 +76,7 @@ export namespace LeaderWorkerInner {
|
|
|
76
76
|
|
|
77
77
|
export class PushToLeader extends Schema.TaggedRequest<PushToLeader>()('PushToLeader', {
|
|
78
78
|
payload: {
|
|
79
|
-
batch: Schema.Array(
|
|
79
|
+
batch: Schema.Array(LiveStoreEvent.AnyEncoded),
|
|
80
80
|
},
|
|
81
81
|
success: Schema.Void,
|
|
82
82
|
failure: Schema.Union(UnexpectedError, LeaderAheadError),
|
|
@@ -99,7 +99,7 @@ export namespace LeaderWorkerInner {
|
|
|
99
99
|
failure: UnexpectedError,
|
|
100
100
|
}) {}
|
|
101
101
|
|
|
102
|
-
export class
|
|
102
|
+
export class ExportEventlog extends Schema.TaggedRequest<ExportEventlog>()('ExportEventlog', {
|
|
103
103
|
payload: {},
|
|
104
104
|
success: Transferable.Uint8Array,
|
|
105
105
|
failure: UnexpectedError,
|
|
@@ -146,7 +146,7 @@ export namespace LeaderWorkerInner {
|
|
|
146
146
|
PushToLeader,
|
|
147
147
|
PullStream,
|
|
148
148
|
Export,
|
|
149
|
-
|
|
149
|
+
ExportEventlog,
|
|
150
150
|
GetRecreateSnapshot,
|
|
151
151
|
GetLeaderHead,
|
|
152
152
|
GetLeaderSyncState,
|
|
@@ -188,7 +188,7 @@ export namespace SharedWorker {
|
|
|
188
188
|
LeaderWorkerInner.PullStream,
|
|
189
189
|
LeaderWorkerInner.Export,
|
|
190
190
|
LeaderWorkerInner.GetRecreateSnapshot,
|
|
191
|
-
LeaderWorkerInner.
|
|
191
|
+
LeaderWorkerInner.ExportEventlog,
|
|
192
192
|
LeaderWorkerInner.GetLeaderHead,
|
|
193
193
|
LeaderWorkerInner.GetLeaderSyncState,
|
|
194
194
|
LeaderWorkerInner.Shutdown,
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import type { SqliteDb, SyncOptions } from '@livestore/common'
|
|
2
2
|
import { Devtools, UnexpectedError } from '@livestore/common'
|
|
3
3
|
import type { DevtoolsOptions } from '@livestore/common/leader-thread'
|
|
4
|
-
import {
|
|
5
|
-
configureConnection,
|
|
6
|
-
LeaderThreadCtx,
|
|
7
|
-
makeLeaderThreadLayer,
|
|
8
|
-
Mutationlog,
|
|
9
|
-
} from '@livestore/common/leader-thread'
|
|
4
|
+
import { configureConnection, Eventlog, LeaderThreadCtx, makeLeaderThreadLayer } from '@livestore/common/leader-thread'
|
|
10
5
|
import type { LiveStoreSchema } from '@livestore/common/schema'
|
|
11
|
-
import {
|
|
6
|
+
import { LiveStoreEvent } from '@livestore/common/schema'
|
|
12
7
|
import { makeChannelForConnectedMeshNode } from '@livestore/devtools-web-common/web-channel'
|
|
13
8
|
import * as WebmeshWorker from '@livestore/devtools-web-common/worker'
|
|
14
9
|
import { sqliteDbFactory } from '@livestore/sqlite-wasm/browser'
|
|
@@ -113,11 +108,11 @@ const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
|
113
108
|
const makeSqliteDb = sqliteDbFactory({ sqlite3 })
|
|
114
109
|
const runtime = yield* Effect.runtime<never>()
|
|
115
110
|
|
|
116
|
-
const makeDb = (kind: 'app' | '
|
|
111
|
+
const makeDb = (kind: 'app' | 'eventlog') =>
|
|
117
112
|
makeSqliteDb({
|
|
118
113
|
_tag: 'opfs',
|
|
119
114
|
opfsDirectory: sanitizeOpfsDir(storageOptions.directory, storeId),
|
|
120
|
-
fileName: kind === 'app' ? getAppDbFileName(schema) : '
|
|
115
|
+
fileName: kind === 'app' ? getAppDbFileName(schema) : 'eventlog.db',
|
|
121
116
|
configureDb: (db) =>
|
|
122
117
|
configureConnection(db, {
|
|
123
118
|
// The persisted databases use the AccessHandlePoolVFS which always uses a single database connection.
|
|
@@ -130,11 +125,11 @@ const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
|
130
125
|
}).pipe(Effect.acquireRelease((db) => Effect.try(() => db.close()).pipe(Effect.ignoreLogged)))
|
|
131
126
|
|
|
132
127
|
// Might involve some async work, so we're running them concurrently
|
|
133
|
-
const [dbReadModel,
|
|
128
|
+
const [dbReadModel, dbEventlog] = yield* Effect.all([makeDb('app'), makeDb('eventlog')], {
|
|
134
129
|
concurrency: 2,
|
|
135
130
|
})
|
|
136
131
|
|
|
137
|
-
const devtoolsOptions = yield* makeDevtoolsOptions({ devtoolsEnabled, dbReadModel,
|
|
132
|
+
const devtoolsOptions = yield* makeDevtoolsOptions({ devtoolsEnabled, dbReadModel, dbEventlog })
|
|
138
133
|
const shutdownChannel = yield* makeShutdownChannel(storeId)
|
|
139
134
|
|
|
140
135
|
return makeLeaderThreadLayer({
|
|
@@ -144,7 +139,7 @@ const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
|
144
139
|
makeSqliteDb,
|
|
145
140
|
syncOptions,
|
|
146
141
|
dbReadModel,
|
|
147
|
-
|
|
142
|
+
dbEventlog,
|
|
148
143
|
devtoolsOptions,
|
|
149
144
|
shutdownChannel,
|
|
150
145
|
syncPayload,
|
|
@@ -185,7 +180,7 @@ const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
|
185
180
|
PushToLeader: ({ batch }) =>
|
|
186
181
|
Effect.andThen(LeaderThreadCtx, ({ syncProcessor }) =>
|
|
187
182
|
syncProcessor.push(
|
|
188
|
-
batch.map((
|
|
183
|
+
batch.map((event) => new LiveStoreEvent.EncodedWithMeta(event)),
|
|
189
184
|
// We'll wait in order to keep back pressure on the client session
|
|
190
185
|
{ waitForProcessing: true },
|
|
191
186
|
),
|
|
@@ -195,17 +190,17 @@ const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
|
195
190
|
UnexpectedError.mapToUnexpectedError,
|
|
196
191
|
Effect.withSpan('@livestore/adapter-web:worker:Export'),
|
|
197
192
|
),
|
|
198
|
-
|
|
199
|
-
Effect.andThen(LeaderThreadCtx, (_) => _.
|
|
193
|
+
ExportEventlog: () =>
|
|
194
|
+
Effect.andThen(LeaderThreadCtx, (_) => _.dbEventlog.export()).pipe(
|
|
200
195
|
UnexpectedError.mapToUnexpectedError,
|
|
201
|
-
Effect.withSpan('@livestore/adapter-web:worker:
|
|
196
|
+
Effect.withSpan('@livestore/adapter-web:worker:ExportEventlog'),
|
|
202
197
|
),
|
|
203
198
|
BootStatusStream: () =>
|
|
204
199
|
Effect.andThen(LeaderThreadCtx, (_) => Stream.fromQueue(_.bootStatusQueue)).pipe(Stream.unwrap),
|
|
205
200
|
GetLeaderHead: () =>
|
|
206
201
|
Effect.gen(function* () {
|
|
207
202
|
const workerCtx = yield* LeaderThreadCtx
|
|
208
|
-
return
|
|
203
|
+
return Eventlog.getClientHeadFromDb(workerCtx.dbEventlog)
|
|
209
204
|
}).pipe(UnexpectedError.mapToUnexpectedError, Effect.withSpan('@livestore/adapter-web:worker:GetLeaderHead')),
|
|
210
205
|
GetLeaderSyncState: () =>
|
|
211
206
|
Effect.gen(function* () {
|
|
@@ -234,11 +229,11 @@ const makeWorkerRunnerInner = ({ schema, sync: syncOptions }: WorkerOptions) =>
|
|
|
234
229
|
const makeDevtoolsOptions = ({
|
|
235
230
|
devtoolsEnabled,
|
|
236
231
|
dbReadModel,
|
|
237
|
-
|
|
232
|
+
dbEventlog,
|
|
238
233
|
}: {
|
|
239
234
|
devtoolsEnabled: boolean
|
|
240
235
|
dbReadModel: SqliteDb
|
|
241
|
-
|
|
236
|
+
dbEventlog: SqliteDb
|
|
242
237
|
}): Effect.Effect<DevtoolsOptions, UnexpectedError, Scope.Scope | WebmeshWorker.CacheService> =>
|
|
243
238
|
Effect.gen(function* () {
|
|
244
239
|
if (devtoolsEnabled === false) {
|
|
@@ -257,7 +252,7 @@ const makeDevtoolsOptions = ({
|
|
|
257
252
|
}),
|
|
258
253
|
persistenceInfo: {
|
|
259
254
|
readModel: dbReadModel.metadata.persistenceInfo,
|
|
260
|
-
|
|
255
|
+
eventlog: dbEventlog.metadata.persistenceInfo,
|
|
261
256
|
},
|
|
262
257
|
}
|
|
263
258
|
}),
|
|
@@ -226,7 +226,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
226
226
|
PullStream: forwardRequestStream,
|
|
227
227
|
Export: forwardRequest,
|
|
228
228
|
GetRecreateSnapshot: forwardRequest,
|
|
229
|
-
|
|
229
|
+
ExportEventlog: forwardRequest,
|
|
230
230
|
Setup: forwardRequest,
|
|
231
231
|
GetLeaderSyncState: forwardRequest,
|
|
232
232
|
GetLeaderHead: forwardRequest,
|
package/tmp/pack.tgz
CHANGED
|
Binary file
|