@livestore/adapter-cloudflare 0.4.0-dev.6 → 0.4.0-dev.8
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/make-adapter.d.ts +2 -1
- package/dist/make-adapter.d.ts.map +1 -1
- package/dist/make-adapter.js +39 -4
- package/dist/make-adapter.js.map +1 -1
- package/dist/make-client-durable-object.d.ts +15 -1
- package/dist/make-client-durable-object.d.ts.map +1 -1
- package/dist/make-client-durable-object.js +2 -1
- package/dist/make-client-durable-object.js.map +1 -1
- package/package.json +8 -8
- package/src/make-adapter.ts +61 -3
- package/src/make-client-durable-object.ts +16 -0
package/dist/make-adapter.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type Adapter, type SyncOptions } from '@livestore/common';
|
|
2
2
|
import type * as CfWorker from './cf-types.ts';
|
|
3
|
-
export declare const makeAdapter: ({ storage, clientId, syncOptions, sessionId, }: {
|
|
3
|
+
export declare const makeAdapter: ({ storage, clientId, syncOptions, sessionId, resetPersistence, }: {
|
|
4
4
|
storage: CfWorker.DurableObjectStorage;
|
|
5
5
|
clientId: string;
|
|
6
6
|
syncOptions: SyncOptions;
|
|
7
7
|
sessionId: string;
|
|
8
|
+
resetPersistence?: boolean;
|
|
8
9
|
}) => Adapter;
|
|
9
10
|
//# sourceMappingURL=make-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-adapter.d.ts","sourceRoot":"","sources":["../src/make-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAA;AAM1B,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAE9C,eAAO,MAAM,WAAW,GACrB,
|
|
1
|
+
{"version":3,"file":"make-adapter.d.ts","sourceRoot":"","sources":["../src/make-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,WAAW,EAEjB,MAAM,mBAAmB,CAAA;AAM1B,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAE9C,eAAO,MAAM,WAAW,GACrB,kEAME;IACD,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAA;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,KAAG,OA6HD,CAAA"}
|
package/dist/make-adapter.js
CHANGED
|
@@ -3,24 +3,33 @@ import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer } from '@livestore/com
|
|
|
3
3
|
import { LiveStoreEvent } from '@livestore/livestore';
|
|
4
4
|
import { sqliteDbFactory } from '@livestore/sqlite-wasm/cf';
|
|
5
5
|
import { loadSqlite3Wasm } from '@livestore/sqlite-wasm/load-wasm';
|
|
6
|
-
import { Effect, FetchHttpClient, Layer, SubscriptionRef, WebChannel } from '@livestore/utils/effect';
|
|
7
|
-
export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, }) => (adapterArgs) => Effect.gen(function* () {
|
|
6
|
+
import { Effect, FetchHttpClient, Layer, Schedule, SubscriptionRef, WebChannel } from '@livestore/utils/effect';
|
|
7
|
+
export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, resetPersistence = false, }) => (adapterArgs) => Effect.gen(function* () {
|
|
8
8
|
const { storeId, /* devtoolsEnabled, shutdown, bootStatusQueue, */ syncPayload, schema } = adapterArgs;
|
|
9
9
|
const devtoolsOptions = { enabled: false };
|
|
10
10
|
const sqlite3 = yield* Effect.promise(() => loadSqlite3Wasm());
|
|
11
11
|
const makeSqliteDb = sqliteDbFactory({ sqlite3 });
|
|
12
12
|
const syncInMemoryDb = yield* makeSqliteDb({ _tag: 'in-memory', storage, configureDb: () => { } }).pipe(UnexpectedError.mapToUnexpectedError);
|
|
13
13
|
const schemaHashSuffix = schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString();
|
|
14
|
+
const stateDbFileName = getStateDbFileName(schemaHashSuffix);
|
|
15
|
+
const eventlogDbFileName = getEventlogDbFileName();
|
|
16
|
+
if (resetPersistence === true) {
|
|
17
|
+
yield* resetDurableObjectPersistence({
|
|
18
|
+
storage,
|
|
19
|
+
storeId,
|
|
20
|
+
dbFileNames: [stateDbFileName, eventlogDbFileName],
|
|
21
|
+
});
|
|
22
|
+
}
|
|
14
23
|
const dbState = yield* makeSqliteDb({
|
|
15
24
|
_tag: 'storage',
|
|
16
25
|
storage,
|
|
17
|
-
fileName:
|
|
26
|
+
fileName: stateDbFileName,
|
|
18
27
|
configureDb: () => { },
|
|
19
28
|
}).pipe(UnexpectedError.mapToUnexpectedError);
|
|
20
29
|
const dbEventlog = yield* makeSqliteDb({
|
|
21
30
|
_tag: 'storage',
|
|
22
31
|
storage,
|
|
23
|
-
fileName:
|
|
32
|
+
fileName: eventlogDbFileName,
|
|
24
33
|
configureDb: () => { },
|
|
25
34
|
}).pipe(UnexpectedError.mapToUnexpectedError);
|
|
26
35
|
const shutdownChannel = yield* WebChannel.noopChannel();
|
|
@@ -84,4 +93,30 @@ export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, }) => (
|
|
|
84
93
|
return clientSession;
|
|
85
94
|
}).pipe(Effect.withSpan('@livestore/adapter-cloudflare:makeAdapter', { attributes: { clientId, sessionId } }), Effect.provide(FetchHttpClient.layer));
|
|
86
95
|
const getStateDbFileName = (suffix) => `state${suffix}@${liveStoreStorageFormatVersion}.db`;
|
|
96
|
+
const getEventlogDbFileName = () => `eventlog@${liveStoreStorageFormatVersion}.db`;
|
|
97
|
+
const resetDurableObjectPersistence = ({ storage, storeId, dbFileNames, }) => Effect.try({
|
|
98
|
+
try: () => storage.transactionSync(() => {
|
|
99
|
+
for (const baseName of dbFileNames) {
|
|
100
|
+
const likePattern = `${baseName}%`;
|
|
101
|
+
safeSqlExec(storage, 'DELETE FROM vfs_blocks WHERE file_path LIKE ?', likePattern);
|
|
102
|
+
safeSqlExec(storage, 'DELETE FROM vfs_files WHERE file_path LIKE ?', likePattern);
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
catch: (cause) => new UnexpectedError({
|
|
106
|
+
cause,
|
|
107
|
+
note: `@livestore/adapter-cloudflare: Failed to reset persistence for store ${storeId}`,
|
|
108
|
+
}),
|
|
109
|
+
}).pipe(Effect.retry({ schedule: Schedule.exponentialBackoff10Sec }), Effect.withSpan('@livestore/adapter-cloudflare:resetPersistence', { attributes: { storeId } }));
|
|
110
|
+
const safeSqlExec = (storage, query, binding) => {
|
|
111
|
+
try {
|
|
112
|
+
storage.sql.exec(query, binding);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (isMissingVfsTableError(error)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const isMissingVfsTableError = (error) => error instanceof Error && error.message.toLowerCase().includes('no such table');
|
|
87
122
|
//# sourceMappingURL=make-adapter.js.map
|
package/dist/make-adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-adapter.js","sourceRoot":"","sources":["../src/make-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,8BAA8B,EAE9B,6BAA6B,EAC7B,iBAAiB,EAEjB,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAwB,QAAQ,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AACxH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-adapter.js","sourceRoot":"","sources":["../src/make-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,17 +18,31 @@ export type Env = {
|
|
|
18
18
|
export type MakeDurableObjectClass = <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>(options: MakeDurableObjectClassOptions<TSchema>) => {
|
|
19
19
|
new (ctx: CfWorker.DurableObjectState, env: Env): CfWorker.DurableObject & CfWorker.Rpc.DurableObjectBranded;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* Options used to initialize the LiveStore Durable Object runtime.
|
|
23
|
+
*/
|
|
21
24
|
export type CreateStoreDoOptions<TSchema extends LiveStoreSchema = LiveStoreSchema.Any> = {
|
|
25
|
+
/** LiveStore schema that defines state, migrations, and validators. */
|
|
22
26
|
schema: TSchema;
|
|
27
|
+
/** Logical identifier for the store instance persisted inside the Durable Object. */
|
|
23
28
|
storeId: string;
|
|
29
|
+
/** Unique identifier for the client that owns the Durable Object instance. */
|
|
24
30
|
clientId: string;
|
|
31
|
+
/** Identifier for the LiveStore session running inside the Durable Object. */
|
|
25
32
|
sessionId: string;
|
|
33
|
+
/** Cloudflare Durable Object storage binding backing the local SQLite files. */
|
|
26
34
|
storage: CfWorker.DurableObjectStorage;
|
|
35
|
+
/** RPC stub pointing at the sync backend Durable Object used for replication. */
|
|
27
36
|
syncBackendDurableObject: CfWorker.DurableObjectStub<CfSyncBackend.SyncBackendRpcInterface>;
|
|
37
|
+
/** Durable Object identifier for the current instance, forwarded to the sync backend. */
|
|
28
38
|
durableObjectId: string;
|
|
39
|
+
/** Binding name Cloudflare uses to reach this Durable Object from other workers. */
|
|
29
40
|
bindingName: string;
|
|
41
|
+
/** Enables live pull mode to receive sync updates via Durable Object RPC callbacks. */
|
|
30
42
|
livePull?: boolean;
|
|
43
|
+
/** Clears existing Durable Object persistence before bootstrapping the store. */
|
|
44
|
+
resetPersistence?: boolean;
|
|
31
45
|
};
|
|
32
|
-
export declare const createStoreDo: <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>({ schema, storeId, clientId, sessionId, storage, syncBackendDurableObject, durableObjectId, bindingName, livePull, }: CreateStoreDoOptions<TSchema>) => Effect.Effect<Store<TSchema, {}>, UnexpectedError, never>;
|
|
46
|
+
export declare const createStoreDo: <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>({ schema, storeId, clientId, sessionId, storage, syncBackendDurableObject, durableObjectId, bindingName, livePull, resetPersistence, }: CreateStoreDoOptions<TSchema>) => Effect.Effect<Store<TSchema, {}>, UnexpectedError, never>;
|
|
33
47
|
export declare const createStoreDoPromise: <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>(options: CreateStoreDoOptions<TSchema>) => Promise<Store<TSchema, {}>>;
|
|
34
48
|
//# sourceMappingURL=make-client-durable-object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-client-durable-object.d.ts","sourceRoot":"","sources":["../src/make-client-durable-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAe,KAAK,eAAe,EAAe,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnH,OAAO,KAAK,KAAK,aAAa,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,MAAM,EAA2B,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAK9C,MAAM,MAAM,6BAA6B,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,IAAI;IACjG,MAAM,EAAE,OAAO,CAAA;IAEf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IAG7F,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,qBAAqB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;IACrG,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,EACzB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,KAC/D,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,eAAe,CAAC,CAAA;CAClF,CAAA;AAED,MAAM,MAAM,GAAG,GAAG;IAChB,eAAe,EAAE,QAAQ,CAAC,sBAAsB,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EACzF,OAAO,EAAE,6BAA6B,CAAC,OAAO,CAAC,KAC5C;IACH,KAAK,GAAG,EAAE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAA;CAC7G,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,IAAI;IACxF,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAA;IACtC,wBAAwB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAA;IAC3F,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"make-client-durable-object.d.ts","sourceRoot":"","sources":["../src/make-client-durable-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAe,KAAK,eAAe,EAAe,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnH,OAAO,KAAK,KAAK,aAAa,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,MAAM,EAA2B,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAK9C,MAAM,MAAM,6BAA6B,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,IAAI;IACjG,MAAM,EAAE,OAAO,CAAA;IAEf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IAG7F,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,qBAAqB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;IACrG,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,EACzB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,KAC/D,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,eAAe,CAAC,CAAA;CAClF,CAAA;AAED,MAAM,MAAM,GAAG,GAAG;IAChB,eAAe,EAAE,QAAQ,CAAC,sBAAsB,CAAA;CACjD,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EACzF,OAAO,EAAE,6BAA6B,CAAC,OAAO,CAAC,KAC5C;IACH,KAAK,GAAG,EAAE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAA;CAC7G,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,IAAI;IACxF,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAA;IACf,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAA;IACf,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAA;IACtC,iFAAiF;IACjF,wBAAwB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAA;IAC3F,yFAAyF;IACzF,eAAe,EAAE,MAAM,CAAA;IACvB,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAA;IACnB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EAAE,wIAWlF,oBAAoB,CAAC,OAAO,CAAC,8DAsB5B,CAAA;AAEJ,eAAO,MAAM,oBAAoB,GAAI,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EACxF,SAAS,oBAAoB,CAAC,OAAO,CAAC,gCAOrC,CAAA"}
|
|
@@ -2,12 +2,13 @@ import { createStore, provideOtel } from '@livestore/livestore';
|
|
|
2
2
|
import { makeDoRpcSync } from '@livestore/sync-cf/client';
|
|
3
3
|
import { Effect, Logger, LogLevel, Scope } from '@livestore/utils/effect';
|
|
4
4
|
import { makeAdapter } from "./make-adapter.js";
|
|
5
|
-
export const createStoreDo = ({ schema, storeId, clientId, sessionId, storage, syncBackendDurableObject, durableObjectId, bindingName, livePull = false, }) => Effect.gen(function* () {
|
|
5
|
+
export const createStoreDo = ({ schema, storeId, clientId, sessionId, storage, syncBackendDurableObject, durableObjectId, bindingName, livePull = false, resetPersistence = false, }) => Effect.gen(function* () {
|
|
6
6
|
const scope = yield* Scope.make();
|
|
7
7
|
const adapter = makeAdapter({
|
|
8
8
|
clientId,
|
|
9
9
|
sessionId,
|
|
10
10
|
storage,
|
|
11
|
+
resetPersistence,
|
|
11
12
|
syncOptions: {
|
|
12
13
|
backend: makeDoRpcSync({
|
|
13
14
|
syncBackendStub: syncBackendDurableObject,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-client-durable-object.js","sourceRoot":"","sources":["../src/make-client-durable-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAwB,WAAW,EAAgC,MAAM,sBAAsB,CAAA;AAEnH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-client-durable-object.js","sourceRoot":"","sources":["../src/make-client-durable-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAwB,WAAW,EAAgC,MAAM,sBAAsB,CAAA;AAEnH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAyD/C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAwD,EACnF,MAAM,EACN,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,wBAAwB,EACxB,eAAe,EACf,WAAW,EACX,QAAQ,GAAG,KAAK,EAChB,gBAAgB,GAAG,KAAK,GACM,EAAE,EAAE,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IAEjC,MAAM,OAAO,GAAG,WAAW,CAAC;QAC1B,QAAQ;QACR,SAAS;QACT,OAAO;QACP,gBAAgB;QAChB,WAAW,EAAE;YACX,OAAO,EAAE,aAAa,CAAC;gBACrB,eAAe,EAAE,wBAAwB;gBACzC,oBAAoB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;aACvD,CAAC;YACF,QAAQ,EAAE,0CAA0C;YACpD,4FAA4F;YAC5F,kBAAkB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;YACtD,kFAAkF;SACnF;KACF,CAAC,CAAA;IAEF,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;AACpG,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAsC,EACtC,EAAE,CACF,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,EACpD,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/adapter-cloudflare",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./src/polyfill.ts",
|
|
@@ -12,15 +12,15 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@cloudflare/workers-types": "4.20250823.0",
|
|
15
|
-
"@livestore/common": "0.4.0-dev.
|
|
16
|
-
"@livestore/common-cf": "0.4.0-dev.
|
|
17
|
-
"@livestore/
|
|
18
|
-
"@livestore/
|
|
19
|
-
"@livestore/livestore": "0.4.0-dev.
|
|
20
|
-
"@livestore/utils": "0.4.0-dev.
|
|
15
|
+
"@livestore/common": "0.4.0-dev.8",
|
|
16
|
+
"@livestore/common-cf": "0.4.0-dev.8",
|
|
17
|
+
"@livestore/sync-cf": "0.4.0-dev.8",
|
|
18
|
+
"@livestore/sqlite-wasm": "0.4.0-dev.8",
|
|
19
|
+
"@livestore/livestore": "0.4.0-dev.8",
|
|
20
|
+
"@livestore/utils": "0.4.0-dev.8"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"wrangler": "
|
|
23
|
+
"wrangler": "4.32.0"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
26
|
"package.json",
|
package/src/make-adapter.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { type DevtoolsOptions, Eventlog, LeaderThreadCtx, makeLeaderThreadLayer
|
|
|
11
11
|
import { LiveStoreEvent } from '@livestore/livestore'
|
|
12
12
|
import { sqliteDbFactory } from '@livestore/sqlite-wasm/cf'
|
|
13
13
|
import { loadSqlite3Wasm } from '@livestore/sqlite-wasm/load-wasm'
|
|
14
|
-
import { Effect, FetchHttpClient, Layer, SubscriptionRef, WebChannel } from '@livestore/utils/effect'
|
|
14
|
+
import { Effect, FetchHttpClient, Layer, Schedule, SubscriptionRef, WebChannel } from '@livestore/utils/effect'
|
|
15
15
|
import type * as CfWorker from './cf-types.ts'
|
|
16
16
|
|
|
17
17
|
export const makeAdapter =
|
|
@@ -20,11 +20,13 @@ export const makeAdapter =
|
|
|
20
20
|
clientId,
|
|
21
21
|
syncOptions,
|
|
22
22
|
sessionId,
|
|
23
|
+
resetPersistence = false,
|
|
23
24
|
}: {
|
|
24
25
|
storage: CfWorker.DurableObjectStorage
|
|
25
26
|
clientId: string
|
|
26
27
|
syncOptions: SyncOptions
|
|
27
28
|
sessionId: string
|
|
29
|
+
resetPersistence?: boolean
|
|
28
30
|
}): Adapter =>
|
|
29
31
|
(adapterArgs) =>
|
|
30
32
|
Effect.gen(function* () {
|
|
@@ -43,17 +45,28 @@ export const makeAdapter =
|
|
|
43
45
|
const schemaHashSuffix =
|
|
44
46
|
schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString()
|
|
45
47
|
|
|
48
|
+
const stateDbFileName = getStateDbFileName(schemaHashSuffix)
|
|
49
|
+
const eventlogDbFileName = getEventlogDbFileName()
|
|
50
|
+
|
|
51
|
+
if (resetPersistence === true) {
|
|
52
|
+
yield* resetDurableObjectPersistence({
|
|
53
|
+
storage,
|
|
54
|
+
storeId,
|
|
55
|
+
dbFileNames: [stateDbFileName, eventlogDbFileName],
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
|
|
46
59
|
const dbState = yield* makeSqliteDb({
|
|
47
60
|
_tag: 'storage',
|
|
48
61
|
storage,
|
|
49
|
-
fileName:
|
|
62
|
+
fileName: stateDbFileName,
|
|
50
63
|
configureDb: () => {},
|
|
51
64
|
}).pipe(UnexpectedError.mapToUnexpectedError)
|
|
52
65
|
|
|
53
66
|
const dbEventlog = yield* makeSqliteDb({
|
|
54
67
|
_tag: 'storage',
|
|
55
68
|
storage,
|
|
56
|
-
fileName:
|
|
69
|
+
fileName: eventlogDbFileName,
|
|
57
70
|
configureDb: () => {},
|
|
58
71
|
}).pipe(UnexpectedError.mapToUnexpectedError)
|
|
59
72
|
|
|
@@ -142,3 +155,48 @@ export const makeAdapter =
|
|
|
142
155
|
)
|
|
143
156
|
|
|
144
157
|
const getStateDbFileName = (suffix: string) => `state${suffix}@${liveStoreStorageFormatVersion}.db`
|
|
158
|
+
|
|
159
|
+
const getEventlogDbFileName = () => `eventlog@${liveStoreStorageFormatVersion}.db`
|
|
160
|
+
|
|
161
|
+
const resetDurableObjectPersistence = ({
|
|
162
|
+
storage,
|
|
163
|
+
storeId,
|
|
164
|
+
dbFileNames,
|
|
165
|
+
}: {
|
|
166
|
+
storage: CfWorker.DurableObjectStorage
|
|
167
|
+
storeId: string
|
|
168
|
+
dbFileNames: ReadonlyArray<string>
|
|
169
|
+
}) =>
|
|
170
|
+
Effect.try({
|
|
171
|
+
try: () =>
|
|
172
|
+
storage.transactionSync(() => {
|
|
173
|
+
for (const baseName of dbFileNames) {
|
|
174
|
+
const likePattern = `${baseName}%`
|
|
175
|
+
safeSqlExec(storage, 'DELETE FROM vfs_blocks WHERE file_path LIKE ?', likePattern)
|
|
176
|
+
safeSqlExec(storage, 'DELETE FROM vfs_files WHERE file_path LIKE ?', likePattern)
|
|
177
|
+
}
|
|
178
|
+
}),
|
|
179
|
+
catch: (cause) =>
|
|
180
|
+
new UnexpectedError({
|
|
181
|
+
cause,
|
|
182
|
+
note: `@livestore/adapter-cloudflare: Failed to reset persistence for store ${storeId}`,
|
|
183
|
+
}),
|
|
184
|
+
}).pipe(
|
|
185
|
+
Effect.retry({ schedule: Schedule.exponentialBackoff10Sec }),
|
|
186
|
+
Effect.withSpan('@livestore/adapter-cloudflare:resetPersistence', { attributes: { storeId } }),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
const safeSqlExec = (storage: CfWorker.DurableObjectStorage, query: string, binding: string) => {
|
|
190
|
+
try {
|
|
191
|
+
storage.sql.exec(query, binding)
|
|
192
|
+
} catch (error) {
|
|
193
|
+
if (isMissingVfsTableError(error)) {
|
|
194
|
+
return
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
throw error
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const isMissingVfsTableError = (error: unknown): boolean =>
|
|
202
|
+
error instanceof Error && error.message.toLowerCase().includes('no such table')
|
|
@@ -35,16 +35,30 @@ export type MakeDurableObjectClass = <TSchema extends LiveStoreSchema = LiveStor
|
|
|
35
35
|
new (ctx: CfWorker.DurableObjectState, env: Env): CfWorker.DurableObject & CfWorker.Rpc.DurableObjectBranded
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Options used to initialize the LiveStore Durable Object runtime.
|
|
40
|
+
*/
|
|
38
41
|
export type CreateStoreDoOptions<TSchema extends LiveStoreSchema = LiveStoreSchema.Any> = {
|
|
42
|
+
/** LiveStore schema that defines state, migrations, and validators. */
|
|
39
43
|
schema: TSchema
|
|
44
|
+
/** Logical identifier for the store instance persisted inside the Durable Object. */
|
|
40
45
|
storeId: string
|
|
46
|
+
/** Unique identifier for the client that owns the Durable Object instance. */
|
|
41
47
|
clientId: string
|
|
48
|
+
/** Identifier for the LiveStore session running inside the Durable Object. */
|
|
42
49
|
sessionId: string
|
|
50
|
+
/** Cloudflare Durable Object storage binding backing the local SQLite files. */
|
|
43
51
|
storage: CfWorker.DurableObjectStorage
|
|
52
|
+
/** RPC stub pointing at the sync backend Durable Object used for replication. */
|
|
44
53
|
syncBackendDurableObject: CfWorker.DurableObjectStub<CfSyncBackend.SyncBackendRpcInterface>
|
|
54
|
+
/** Durable Object identifier for the current instance, forwarded to the sync backend. */
|
|
45
55
|
durableObjectId: string
|
|
56
|
+
/** Binding name Cloudflare uses to reach this Durable Object from other workers. */
|
|
46
57
|
bindingName: string
|
|
58
|
+
/** Enables live pull mode to receive sync updates via Durable Object RPC callbacks. */
|
|
47
59
|
livePull?: boolean
|
|
60
|
+
/** Clears existing Durable Object persistence before bootstrapping the store. */
|
|
61
|
+
resetPersistence?: boolean
|
|
48
62
|
}
|
|
49
63
|
|
|
50
64
|
export const createStoreDo = <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>({
|
|
@@ -57,6 +71,7 @@ export const createStoreDo = <TSchema extends LiveStoreSchema = LiveStoreSchema.
|
|
|
57
71
|
durableObjectId,
|
|
58
72
|
bindingName,
|
|
59
73
|
livePull = false,
|
|
74
|
+
resetPersistence = false,
|
|
60
75
|
}: CreateStoreDoOptions<TSchema>) =>
|
|
61
76
|
Effect.gen(function* () {
|
|
62
77
|
const scope = yield* Scope.make()
|
|
@@ -65,6 +80,7 @@ export const createStoreDo = <TSchema extends LiveStoreSchema = LiveStoreSchema.
|
|
|
65
80
|
clientId,
|
|
66
81
|
sessionId,
|
|
67
82
|
storage,
|
|
83
|
+
resetPersistence,
|
|
68
84
|
syncOptions: {
|
|
69
85
|
backend: makeDoRpcSync({
|
|
70
86
|
syncBackendStub: syncBackendDurableObject,
|