@livestore/adapter-cloudflare 0.0.0-snapshot-bf20ca212edd811e56de17588ed01bef281fb19f → 0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7
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 +2 -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 +7 -7
- package/src/make-adapter.ts +61 -3
- package/src/make-client-durable-object.ts +3 -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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"}
|
|
@@ -28,7 +28,8 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema = LiveStoreSche
|
|
|
28
28
|
durableObjectId: string;
|
|
29
29
|
bindingName: string;
|
|
30
30
|
livePull?: boolean;
|
|
31
|
+
resetPersistence?: boolean;
|
|
31
32
|
};
|
|
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>;
|
|
33
|
+
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
34
|
export declare const createStoreDoPromise: <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>(options: CreateStoreDoOptions<TSchema>) => Promise<Store<TSchema, {}>>;
|
|
34
35
|
//# 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,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;IAClB,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;AA4C/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.0.0-snapshot-
|
|
3
|
+
"version": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./src/polyfill.ts",
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@cloudflare/workers-types": "4.20250823.0",
|
|
15
|
-
"@livestore/common": "0.0.0-snapshot-
|
|
16
|
-
"@livestore/common-cf": "0.0.0-snapshot-
|
|
17
|
-
"@livestore/livestore": "0.0.0-snapshot-
|
|
18
|
-
"@livestore/sqlite-wasm": "0.0.0-snapshot-
|
|
19
|
-
"@livestore/sync-cf": "0.0.0-snapshot-
|
|
20
|
-
"@livestore/utils": "0.0.0-snapshot-
|
|
15
|
+
"@livestore/common": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7",
|
|
16
|
+
"@livestore/common-cf": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7",
|
|
17
|
+
"@livestore/livestore": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7",
|
|
18
|
+
"@livestore/sqlite-wasm": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7",
|
|
19
|
+
"@livestore/sync-cf": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7",
|
|
20
|
+
"@livestore/utils": "0.0.0-snapshot-8cfa1e9bf27b6516d1134ebe846dc727f8f45ac7"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"wrangler": "4.32.0"
|
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')
|
|
@@ -45,6 +45,7 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema = LiveStoreSche
|
|
|
45
45
|
durableObjectId: string
|
|
46
46
|
bindingName: string
|
|
47
47
|
livePull?: boolean
|
|
48
|
+
resetPersistence?: boolean
|
|
48
49
|
}
|
|
49
50
|
|
|
50
51
|
export const createStoreDo = <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>({
|
|
@@ -57,6 +58,7 @@ export const createStoreDo = <TSchema extends LiveStoreSchema = LiveStoreSchema.
|
|
|
57
58
|
durableObjectId,
|
|
58
59
|
bindingName,
|
|
59
60
|
livePull = false,
|
|
61
|
+
resetPersistence = false,
|
|
60
62
|
}: CreateStoreDoOptions<TSchema>) =>
|
|
61
63
|
Effect.gen(function* () {
|
|
62
64
|
const scope = yield* Scope.make()
|
|
@@ -65,6 +67,7 @@ export const createStoreDo = <TSchema extends LiveStoreSchema = LiveStoreSchema.
|
|
|
65
67
|
clientId,
|
|
66
68
|
sessionId,
|
|
67
69
|
storage,
|
|
70
|
+
resetPersistence,
|
|
68
71
|
syncOptions: {
|
|
69
72
|
backend: makeDoRpcSync({
|
|
70
73
|
syncBackendStub: syncBackendDurableObject,
|