@livestore/adapter-web 0.4.0-dev.21 → 0.4.0-dev.23
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/README.md +5 -5
- 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 +8 -4
- package/dist/in-memory/in-memory-adapter.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/single-tab/mod.d.ts +15 -0
- package/dist/single-tab/mod.d.ts.map +1 -0
- package/dist/single-tab/mod.js +15 -0
- package/dist/single-tab/mod.js.map +1 -0
- package/dist/single-tab/single-tab-adapter.d.ts +108 -0
- package/dist/single-tab/single-tab-adapter.d.ts.map +1 -0
- package/dist/single-tab/single-tab-adapter.js +271 -0
- package/dist/single-tab/single-tab-adapter.js.map +1 -0
- package/dist/web-worker/client-session/client-session-devtools.d.ts +1 -1
- package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -1
- package/dist/web-worker/client-session/client-session-devtools.js +7 -7
- package/dist/web-worker/client-session/client-session-devtools.js.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.d.ts +18 -0
- package/dist/web-worker/client-session/persisted-adapter.d.ts.map +1 -1
- package/dist/web-worker/client-session/persisted-adapter.js +95 -36
- package/dist/web-worker/client-session/persisted-adapter.js.map +1 -1
- package/dist/web-worker/client-session/sqlite-loader.d.ts.map +1 -1
- package/dist/web-worker/client-session/sqlite-loader.js +1 -1
- package/dist/web-worker/client-session/sqlite-loader.js.map +1 -1
- package/dist/web-worker/common/persisted-sqlite.d.ts.map +1 -1
- package/dist/web-worker/common/persisted-sqlite.js +13 -11
- package/dist/web-worker/common/persisted-sqlite.js.map +1 -1
- package/dist/web-worker/common/worker-schema.d.ts +34 -31
- package/dist/web-worker/common/worker-schema.d.ts.map +1 -1
- package/dist/web-worker/common/worker-schema.js +18 -19
- package/dist/web-worker/common/worker-schema.js.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts +2 -2
- package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -1
- package/dist/web-worker/leader-worker/make-leader-worker.js +59 -25
- package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.d.ts.map +1 -1
- package/dist/web-worker/shared-worker/make-shared-worker.js +15 -15
- package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -1
- package/package.json +56 -17
- package/src/in-memory/in-memory-adapter.ts +9 -5
- package/src/index.ts +15 -1
- package/src/single-tab/mod.ts +15 -0
- package/src/single-tab/single-tab-adapter.ts +499 -0
- package/src/web-worker/client-session/client-session-devtools.ts +26 -27
- package/src/web-worker/client-session/persisted-adapter.ts +126 -64
- package/src/web-worker/client-session/sqlite-loader.ts +1 -1
- package/src/web-worker/common/persisted-sqlite.ts +13 -10
- package/src/web-worker/common/worker-schema.ts +19 -18
- package/src/web-worker/leader-worker/make-leader-worker.ts +94 -52
- package/src/web-worker/shared-worker/make-shared-worker.ts +26 -48
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Devtools, LogConfig, liveStoreVersion, UnknownError } from '@livestore/common';
|
|
1
|
+
import { Devtools, isWorkerTransportError, LogConfig, liveStoreVersion, UnknownError } from '@livestore/common';
|
|
2
2
|
import * as DevtoolsWeb from '@livestore/devtools-web-common/web-channel';
|
|
3
3
|
import * as WebmeshWorker from '@livestore/devtools-web-common/worker';
|
|
4
4
|
import { isDevEnv, isNotUndefined, LS_DEV } from '@livestore/utils';
|
|
5
|
-
import { Deferred, Effect, Exit, FetchHttpClient, identity, Layer,
|
|
5
|
+
import { Deferred, Effect, Exit, FetchHttpClient, identity, Layer, Option, Ref, Schema, Scope, Stream, SubscriptionRef, TaskTracing, Worker, WorkerRunner, } from '@livestore/utils/effect';
|
|
6
6
|
import { BrowserWorker, BrowserWorkerRunner } from '@livestore/utils/effect/browser';
|
|
7
7
|
import { makeShutdownChannel } from "../common/shutdown-channel.js";
|
|
8
8
|
import * as WorkerSchema from "../common/worker-schema.js";
|
|
@@ -15,35 +15,32 @@ const LIVESTORE_SHARED_WORKER_TERMINATION_LOCK = `livestore-shared-worker-termin
|
|
|
15
15
|
navigator.locks.request(LIVESTORE_SHARED_WORKER_TERMINATION_LOCK, { steal: true },
|
|
16
16
|
// We use a never-resolving promise to hold the lock
|
|
17
17
|
async () => new Promise(() => { }));
|
|
18
|
-
if (isDevEnv()) {
|
|
18
|
+
if (isDevEnv() === true) {
|
|
19
19
|
globalThis.__debugLiveStoreUtils = {
|
|
20
20
|
blobUrl: (buffer) => URL.createObjectURL(new Blob([buffer], { type: 'application/octet-stream' })),
|
|
21
21
|
runSync: (effect) => Effect.runSync(effect),
|
|
22
22
|
runFork: (effect) => Effect.runFork(effect),
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
// @effect-diagnostics-next-line anyUnknownInErrorContext:off -- `SerializedRunner.Handlers` uses `any` in the R channel, propagating as `unknown` in `HandlersContext`
|
|
25
26
|
const makeWorkerRunner = Effect.gen(function* () {
|
|
26
27
|
const leaderWorkerContextSubRef = yield* SubscriptionRef.make(undefined);
|
|
27
28
|
const waitForWorker = SubscriptionRef.waitUntil(leaderWorkerContextSubRef, isNotUndefined).pipe(Effect.map((_) => _.worker));
|
|
28
29
|
const forwardRequest = (req) =>
|
|
29
|
-
// Forward the request to the active worker and
|
|
30
|
+
// Forward the request to the active worker and convert transport errors to defects.
|
|
30
31
|
waitForWorker.pipe(
|
|
31
32
|
// Effect.logBefore(`forwardRequest: ${req._tag}`),
|
|
32
|
-
Effect.andThen((worker) => worker.executeEffect(req)),
|
|
33
|
+
Effect.andThen((worker) => worker.executeEffect(req)), Effect.catchIf(isWorkerTransportError, (e) => Effect.die(e)),
|
|
33
34
|
// Effect.tap((_) => Effect.log(`forwardRequest: ${req._tag}`, _)),
|
|
34
35
|
// Effect.tapError((cause) => Effect.logError(`forwardRequest err: ${req._tag}`, cause)),
|
|
35
36
|
Effect.interruptible, Effect.logWarnIfTakesLongerThan({
|
|
36
37
|
label: `@livestore/adapter-web:shared-worker:forwardRequest:${req._tag}`,
|
|
37
38
|
duration: 500,
|
|
38
|
-
}), Effect.
|
|
39
|
-
? cause
|
|
40
|
-
: ParseResult.isParseError(cause) || Schema.is(WorkerError.WorkerError)(cause)
|
|
41
|
-
? new UnknownError({ cause })
|
|
42
|
-
: cause), Effect.catchAllDefect((cause) => new UnknownError({ cause })), Effect.tapCauseLogPretty);
|
|
39
|
+
}), Effect.tapCauseLogPretty);
|
|
43
40
|
const forwardRequestStream = (req) => Effect.gen(function* () {
|
|
44
41
|
yield* Effect.logDebug(`forwardRequestStream: ${req._tag}`);
|
|
45
42
|
const { worker, scope } = yield* SubscriptionRef.waitUntil(leaderWorkerContextSubRef, isNotUndefined);
|
|
46
|
-
const stream = worker.execute(req);
|
|
43
|
+
const stream = worker.execute(req).pipe(Stream.refineOrDie((e) => isWorkerTransportError(e) === true ? Option.none() : Option.some(e)));
|
|
47
44
|
// It seems the request stream is not automatically interrupted when the scope shuts down
|
|
48
45
|
// so we need to manually interrupt it when the scope shuts down
|
|
49
46
|
const shutdownDeferred = yield* Deferred.make();
|
|
@@ -54,7 +51,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
54
51
|
return Stream.empty;
|
|
55
52
|
}).pipe(Stream.unwrap);
|
|
56
53
|
return Stream.merge(stream, scopeShutdownStream, { haltStrategy: 'either' });
|
|
57
|
-
}).pipe(Effect.interruptible,
|
|
54
|
+
}).pipe(Effect.interruptible, Effect.tapCauseLogPretty, Stream.unwrap, Stream.ensuring(Effect.logDebug(`shutting down stream for ${req._tag}`)));
|
|
58
55
|
const resetCurrentWorkerCtx = Effect.gen(function* () {
|
|
59
56
|
const prevWorker = yield* SubscriptionRef.get(leaderWorkerContextSubRef);
|
|
60
57
|
if (prevWorker !== undefined) {
|
|
@@ -84,6 +81,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
84
81
|
});
|
|
85
82
|
const invariantsRef = yield* Ref.make(undefined);
|
|
86
83
|
const sameInvariants = Schema.equivalence(InvariantsSchema);
|
|
84
|
+
// @effect-diagnostics-next-line anyUnknownInErrorContext:off -- `SerializedRunner.Handlers` uses `any` in the R channel
|
|
87
85
|
return WorkerRunner.layerSerialized(WorkerSchema.SharedWorkerRequest, {
|
|
88
86
|
// Whenever the client session leader changes (and thus creates a new leader thread), the new client session leader
|
|
89
87
|
// sends a new MessagePort to the shared worker which proxies messages to the new leader thread.
|
|
@@ -98,7 +96,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
98
96
|
};
|
|
99
97
|
const prev = yield* Ref.get(invariantsRef);
|
|
100
98
|
// Early return on mismatch to keep happy path linear
|
|
101
|
-
if (prev !== undefined &&
|
|
99
|
+
if (prev !== undefined && sameInvariants(prev, invariants) === false) {
|
|
102
100
|
const diff = Schema.debugDiff(InvariantsSchema)(prev, invariants);
|
|
103
101
|
return yield* new UnknownError({
|
|
104
102
|
cause: 'Store invariants changed across leader transitions',
|
|
@@ -130,7 +128,7 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
130
128
|
}).pipe(Effect.tapCauseLogPretty, Effect.forkScoped);
|
|
131
129
|
yield* SubscriptionRef.set(leaderWorkerContextSubRef, { worker, scope });
|
|
132
130
|
}).pipe(Effect.tapCauseLogPretty, Scope.extend(scope), Effect.forkIn(scope));
|
|
133
|
-
}).pipe(Effect.withSpan('@livestore/adapter-web:shared-worker:updateMessagePort'),
|
|
131
|
+
}).pipe(Effect.withSpan('@livestore/adapter-web:shared-worker:updateMessagePort'), Effect.tapCauseLogPretty),
|
|
134
132
|
// Proxied requests
|
|
135
133
|
BootStatusStream: forwardRequestStream,
|
|
136
134
|
PushToLeader: forwardRequest,
|
|
@@ -153,10 +151,12 @@ const makeWorkerRunner = Effect.gen(function* () {
|
|
|
153
151
|
}).pipe(Layer.unwrapScoped);
|
|
154
152
|
export const makeWorker = (options) => {
|
|
155
153
|
const runtimeLayer = Layer.mergeAll(FetchHttpClient.layer, WebmeshWorker.CacheService.layer({ nodeName: DevtoolsWeb.makeNodeName.sharedWorker({ storeId }) }));
|
|
154
|
+
// @effect-diagnostics-next-line anyUnknownInErrorContext:off -- propagated from `makeWorkerRunner`
|
|
156
155
|
makeWorkerRunner.pipe(Layer.provide(BrowserWorkerRunner.layer),
|
|
157
156
|
// WorkerRunner.launch,
|
|
158
|
-
Layer.launch, Effect.scoped, Effect.tapCauseLogPretty, Effect.annotateLogs({ thread: self.name }), Effect.provide(runtimeLayer), LS_DEV ? TaskTracing.withAsyncTaggingTracing((name) => console.createTask(name)) : identity,
|
|
157
|
+
Layer.launch, Effect.scoped, Effect.tapCauseLogPretty, Effect.annotateLogs({ thread: self.name }), Effect.provide(runtimeLayer), LS_DEV === true ? TaskTracing.withAsyncTaggingTracing((name) => console.createTask(name)) : identity,
|
|
159
158
|
// TODO remove type-cast (currently needed to silence a tsc bug)
|
|
159
|
+
// @effect-diagnostics-next-line anyUnknownInErrorContext:off -- TSC bug workaround; the cast uses `any` as an intermediate
|
|
160
160
|
(_) => _, LogConfig.withLoggerConfig(options, { threadName: self.name }), Effect.runFork);
|
|
161
161
|
};
|
|
162
162
|
makeWorker();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-shared-worker.js","sourceRoot":"","sources":["../../../src/web-worker/shared-worker/make-shared-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-shared-worker.js","sourceRoot":"","sources":["../../../src/web-worker/shared-worker/make-shared-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,KAAK,WAAW,MAAM,4CAA4C,CAAA;AACzE,OAAO,KAAK,aAAa,MAAM,uCAAuC,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EACL,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,eAAe,EACf,QAAQ,EACR,KAAK,EACL,MAAM,EACN,GAAG,EACH,MAAM,EACN,KAAK,EACL,MAAM,EACN,eAAe,EACf,WAAW,EACX,MAAM,EACN,YAAY,GACb,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,KAAK,YAAY,MAAM,4BAA4B,CAAA;AAE1D,oDAAoD;AACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;AAEjE,yEAAyE;AACzE,gGAAgG;AAChG,4EAA4E;AAC5E,MAAM,wCAAwC,GAAG,4CAA4C,OAAO,EAAE,CAAA;AACtG,SAAS,CAAC,KAAK,CAAC,OAAO,CACrB,wCAAwC,EACxC,EAAE,KAAK,EAAE,IAAI,EAAE;AACf,oDAAoD;AACpD,KAAK,IAAI,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAClC,CAAA;AAED,IAAI,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;IACxB,UAAU,CAAC,qBAAqB,GAAG;QACjC,OAAO,EAAE,CAAC,MAA+B,EAAE,EAAE,CAC3C,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAO,MAA2B,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACtE,OAAO,EAAE,CAAO,MAA2B,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACvE,CAAA;AACH,CAAC;AAED,uKAAuK;AACvK,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC3C,MAAM,yBAAyB,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAM3D,SAAS,CAAC,CAAA;IAEZ,MAAM,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,yBAAyB,EAAE,cAAc,CAAC,CAAC,IAAI,CAC7F,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAC5B,CAAA;IAED,MAAM,cAAc,GAAG,CACrB,GAA8E,EACtD,EAAE;IAC1B,oFAAoF;IACpF,aAAa,CAAC,IAAI;IAChB,mDAAmD;IACnD,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EACrD,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,mEAAmE;IACnE,yFAAyF;IACzF,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,wBAAwB,CAAC;QAC9B,KAAK,EAAE,uDAAuD,GAAG,CAAC,IAAI,EAAE;QACxE,QAAQ,EAAE,GAAG;KACd,CAAC,EACF,MAAM,CAAC,iBAAiB,CACzB,CAAA;IAEH,MAAM,oBAAoB,GAAG,CAC3B,GAA8E,EACtD,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,yBAAyB,EAAE,cAAc,CAAC,CAAA;QACrG,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CACrC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAC/F,CAAA;QACD,yFAAyF;QACzF,gEAAgE;QAChE,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAA;QACrD,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAA;QAE/E,iFAAiF;QACjF,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC9C,KAAK,CAAC,CAAC,gBAAgB,CAAA;YACvB,OAAO,MAAM,CAAC,KAAK,CAAA;QACrB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAEtB,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACzE,CAAA;IAEH,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACxE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,+GAA+G;YAC/G,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAA;YAEhE,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;YAExB,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAClD,MAAM,CAAC,wBAAwB,CAAC;gBAC9B,KAAK,EAAE,4DAA4D;gBACnE,QAAQ,EAAE,GAAG;aACd,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,4DAA4D,CAAC,CAAC,CAAA;IAEtF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC/B,kFAAkF;QAClF,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;QACxC,0CAA0C;QAC1C,KAAK,CAAC,CAAC,qBAAqB,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,cAAc,EAAE,YAAY,CAAC,WAAW;QACxC,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;QACxD,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAClD,eAAe,EAAE,MAAM,CAAC,OAAO;KAChC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAyB,SAAS,CAAC,CAAA;IACxE,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;IAE3D,wHAAwH;IACxH,OAAO,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,mBAAmB,EAAE;QACpE,mHAAmH;QACnH,gGAAgG;QAChG,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,EAAE,EAAE,CACjF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,uGAAuG;YACvG,MAAM,UAAU,GAAe;gBAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,gBAAgB,EAAE,sBAAsB;gBACxC,eAAe,EAAE,OAAO,CAAC,eAAe;aACzC,CAAA;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;YAC1C,qDAAqD;YACrD,IAAI,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,KAAK,EAAE,CAAC;gBACrE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;gBACjE,OAAO,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC;oBAC7B,KAAK,EAAE,oDAAoD;oBAC3D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE;iBACpD,CAAC,CAAA;YACJ,CAAC;YACD,kCAAkC;YAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;YAC3C,CAAC;YAED,KAAK,CAAC,CAAC,qBAAqB,CAAA;YAE5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YAEjC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBAEnE,KAAK,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAChC,MAAM,CAAC,OAAO,EAAE,EAChB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EACvB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA;gBAED,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBAEvE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAwC;oBACrF,IAAI,EAAE,CAAC;oBACP,WAAW,EAAE,GAAG;oBAChB,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO;iBAC9B,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,MAAM,CAAC,QAAQ,CAAC,8DAA8D,CAAC,CAChF,CAAA;gBAED,0FAA0F;gBAC1F,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,YAAY,CAAA;gBAClD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;gBAErC,KAAK,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC;oBAClC,IAAI;oBACJ,MAAM;oBACN,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;iBACnE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;gBAEpD,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YAC1E,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,wDAAwD,CAAC,EACzE,MAAM,CAAC,iBAAiB,CACzB;QAEH,mBAAmB;QACnB,gBAAgB,EAAE,oBAAoB;QACtC,YAAY,EAAE,cAAc;QAC5B,UAAU,EAAE,oBAAoB;QAChC,YAAY,EAAE,oBAAoB;QAClC,MAAM,EAAE,cAAc;QACtB,mBAAmB,EAAE,cAAc;QACnC,cAAc,EAAE,cAAc;QAC9B,KAAK,EAAE,cAAc;QACrB,kBAAkB,EAAE,cAAc;QAClC,eAAe,EAAE,oBAAoB;QACrC,aAAa,EAAE,cAAc;QAC7B,gBAAgB,EAAE,cAAc;QAChC,mBAAmB,EAAE,oBAAoB;QACzC,QAAQ,EAAE,cAAc;QACxB,oBAAoB,EAAE,cAAc;QAEpC,gEAAgE;QAChE,oCAAoC,EAAE,aAAa,CAAC,gBAAgB;KACrE,CAAC,CAAA;AACJ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;AAE3B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAqC,EAAQ,EAAE;IACxE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CACjC,eAAe,CAAC,KAAK,EACrB,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACnG,CAAA;IAED,mGAAmG;IACnG,gBAAgB,CAAC,IAAI,CACnB,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACxC,uBAAuB;IACvB,KAAK,CAAC,MAAM,EACZ,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAC1C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5B,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,OAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;IAC7G,gEAAgE;IAChE,2HAA2H;IAC3H,CAAC,CAAC,EAAE,EAAE,CAAC,CAA+B,EACtC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAC9D,MAAM,CAAC,OAAO,CACf,CAAA;AACH,CAAC,CAAA;AAED,UAAU,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,36 +1,75 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/adapter-web",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.23",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/livestorejs/livestore.git"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"package.json",
|
|
12
|
+
"src"
|
|
13
|
+
],
|
|
4
14
|
"type": "module",
|
|
5
15
|
"sideEffects": false,
|
|
6
16
|
"exports": {
|
|
7
17
|
".": "./dist/index.js",
|
|
8
18
|
"./worker": "./dist/web-worker/leader-worker/make-leader-worker.js",
|
|
9
19
|
"./worker-vite-dev-polyfill": "./dist/web-worker/vite-dev-polyfill.js",
|
|
10
|
-
"./shared-worker": "./dist/web-worker/shared-worker/make-shared-worker.js"
|
|
11
|
-
|
|
20
|
+
"./shared-worker": "./dist/web-worker/shared-worker/make-shared-worker.js"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
12
24
|
},
|
|
13
25
|
"dependencies": {
|
|
14
26
|
"@opentelemetry/api": "1.9.0",
|
|
15
|
-
"@livestore/
|
|
16
|
-
"@livestore/
|
|
17
|
-
"@livestore/
|
|
18
|
-
"@livestore/
|
|
19
|
-
"@livestore/
|
|
27
|
+
"@livestore/common": "^0.4.0-dev.23",
|
|
28
|
+
"@livestore/devtools-web-common": "^0.4.0-dev.23",
|
|
29
|
+
"@livestore/sqlite-wasm": "^0.4.0-dev.23",
|
|
30
|
+
"@livestore/utils": "^0.4.0-dev.23",
|
|
31
|
+
"@livestore/webmesh": "^0.4.0-dev.23"
|
|
20
32
|
},
|
|
21
33
|
"devDependencies": {
|
|
22
34
|
"@types/chrome": "0.1.4",
|
|
23
|
-
"@types/wicg-file-system-access": "
|
|
35
|
+
"@types/wicg-file-system-access": "2023.10.6",
|
|
24
36
|
"vitest": "3.2.4"
|
|
25
37
|
},
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@effect/ai": "^0.35.0",
|
|
40
|
+
"@effect/cli": "^0.75.1",
|
|
41
|
+
"@effect/cluster": "^0.58.2",
|
|
42
|
+
"@effect/experimental": "^0.60.0",
|
|
43
|
+
"@effect/opentelemetry": "^0.63.0",
|
|
44
|
+
"@effect/platform": "^0.96.1",
|
|
45
|
+
"@effect/platform-browser": "^0.76.0",
|
|
46
|
+
"@effect/platform-bun": "^0.89.0",
|
|
47
|
+
"@effect/platform-node": "^0.106.0",
|
|
48
|
+
"@effect/printer": "^0.49.0",
|
|
49
|
+
"@effect/printer-ansi": "^0.49.0",
|
|
50
|
+
"@effect/rpc": "^0.75.1",
|
|
51
|
+
"@effect/sql": "^0.51.1",
|
|
52
|
+
"@effect/typeclass": "^0.40.0",
|
|
53
|
+
"@effect/vitest": "^0.29.0",
|
|
54
|
+
"@opentelemetry/api": "^1.9.0",
|
|
55
|
+
"@opentelemetry/resources": "^2.2.0",
|
|
56
|
+
"@standard-schema/spec": "^1.1.0",
|
|
57
|
+
"effect": "^3.21.2"
|
|
58
|
+
},
|
|
59
|
+
"$genie": {
|
|
60
|
+
"source": "package.json.genie.ts",
|
|
61
|
+
"warning": "DO NOT EDIT - changes will be overwritten",
|
|
62
|
+
"workspaceClosureDirs": [
|
|
63
|
+
"packages/@livestore/adapter-web",
|
|
64
|
+
"packages/@livestore/common",
|
|
65
|
+
"packages/@livestore/common-cf",
|
|
66
|
+
"packages/@livestore/devtools-web-common",
|
|
67
|
+
"packages/@livestore/sqlite-wasm",
|
|
68
|
+
"packages/@livestore/utils",
|
|
69
|
+
"packages/@livestore/utils-dev",
|
|
70
|
+
"packages/@livestore/wa-sqlite",
|
|
71
|
+
"packages/@livestore/webmesh"
|
|
72
|
+
]
|
|
34
73
|
},
|
|
35
74
|
"scripts": {
|
|
36
75
|
"test": "echo No tests yet"
|
|
@@ -115,13 +115,13 @@ export const makeInMemoryAdapter =
|
|
|
115
115
|
const clientId = options.clientId ?? nanoid(6)
|
|
116
116
|
const sessionId = options.sessionId ?? nanoid(6)
|
|
117
117
|
|
|
118
|
-
const sharedWebWorker = options.devtools?.sharedWorker
|
|
118
|
+
const sharedWebWorker = options.devtools?.sharedWorker !== undefined
|
|
119
119
|
? tryAsFunctionAndNew(options.devtools.sharedWorker, {
|
|
120
120
|
name: `livestore-shared-worker-${storeId}`,
|
|
121
121
|
})
|
|
122
122
|
: undefined
|
|
123
123
|
|
|
124
|
-
const sharedWorkerFiber = sharedWebWorker
|
|
124
|
+
const sharedWorkerFiber = sharedWebWorker !== undefined
|
|
125
125
|
? yield* Worker.makePoolSerialized<typeof WebmeshWorker.Schema.Request.Type>({
|
|
126
126
|
size: 1,
|
|
127
127
|
concurrency: 100,
|
|
@@ -211,7 +211,7 @@ const makeLeaderThread = ({
|
|
|
211
211
|
sharedWorkerFiber,
|
|
212
212
|
}: MakeLeaderThreadArgs) =>
|
|
213
213
|
Effect.gen(function* () {
|
|
214
|
-
const runtime = yield* Effect.runtime
|
|
214
|
+
const runtime = yield* Effect.runtime()
|
|
215
215
|
|
|
216
216
|
const makeDb = (_kind: 'state' | 'eventlog') => {
|
|
217
217
|
return makeSqliteDb({
|
|
@@ -226,7 +226,7 @@ const makeLeaderThread = ({
|
|
|
226
226
|
// Might involve some async work, so we're running them concurrently
|
|
227
227
|
const [dbState, dbEventlog] = yield* Effect.all([makeDb('state'), makeDb('eventlog')], { concurrency: 2 })
|
|
228
228
|
|
|
229
|
-
if (importSnapshot) {
|
|
229
|
+
if (importSnapshot !== undefined) {
|
|
230
230
|
dbState.import(importSnapshot)
|
|
231
231
|
|
|
232
232
|
const _migrationsReport = yield* migrateDb({ db: dbState, schema })
|
|
@@ -278,7 +278,11 @@ const makeLeaderThread = ({
|
|
|
278
278
|
options,
|
|
279
279
|
}),
|
|
280
280
|
},
|
|
281
|
-
initialState: {
|
|
281
|
+
initialState: {
|
|
282
|
+
leaderHead: initialLeaderHead,
|
|
283
|
+
migrationsReport: initialState.migrationsReport,
|
|
284
|
+
storageMode: 'in-memory',
|
|
285
|
+
},
|
|
282
286
|
export: Effect.sync(() => dbState.export()),
|
|
283
287
|
getEventlogData: Effect.sync(() => dbEventlog.export()),
|
|
284
288
|
syncState: syncProcessor.syncState,
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
export { makeInMemoryAdapter } from './in-memory/in-memory-adapter.ts'
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Single-tab adapter for browsers without SharedWorker support (e.g. Android Chrome).
|
|
4
|
+
*
|
|
5
|
+
* In most cases, you should use `makePersistedAdapter` instead, which automatically
|
|
6
|
+
* falls back to single-tab mode when SharedWorker is unavailable.
|
|
7
|
+
*
|
|
8
|
+
* @see https://github.com/livestorejs/livestore/issues/321
|
|
9
|
+
* @see https://issues.chromium.org/issues/40290702
|
|
10
|
+
*/
|
|
11
|
+
export { makeSingleTabAdapter, type SingleTabAdapterOptions } from './single-tab/mod.ts'
|
|
12
|
+
export {
|
|
13
|
+
canUseSharedWorker,
|
|
14
|
+
makePersistedAdapter,
|
|
15
|
+
type WebAdapterOptions,
|
|
16
|
+
} from './web-worker/client-session/persisted-adapter.ts'
|
|
3
17
|
export * as WorkerSchema from './web-worker/common/worker-schema.ts'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-tab adapter module for browsers without SharedWorker support.
|
|
3
|
+
*
|
|
4
|
+
* **NOTE**: This module exists as a fallback for Android Chrome and similar browsers
|
|
5
|
+
* that don't support SharedWorker. It is intended to be deprecated and removed once
|
|
6
|
+
* SharedWorker support is available in these browsers.
|
|
7
|
+
*
|
|
8
|
+
* Track progress:
|
|
9
|
+
* - LiveStore issue: https://github.com/livestorejs/livestore/issues/321
|
|
10
|
+
* - Chromium bug: https://issues.chromium.org/issues/40290702
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export { makeSingleTabAdapter, type SingleTabAdapterOptions } from './single-tab-adapter.ts'
|