@livestore/adapter-cloudflare 0.4.0-dev.22 → 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/dist/.tsbuildinfo +1 -1
- package/dist/WebSocket.d.ts.map +1 -1
- package/dist/WebSocket.js +6 -4
- package/dist/WebSocket.js.map +1 -1
- package/dist/create-store-do.d.ts +8 -2
- package/dist/create-store-do.d.ts.map +1 -1
- package/dist/create-store-do.js +2 -2
- package/dist/create-store-do.js.map +1 -1
- package/dist/make-adapter.d.ts.map +1 -1
- package/dist/make-adapter.js +25 -26
- package/dist/make-adapter.js.map +1 -1
- package/dist/make-sqlite-db.d.ts.map +1 -1
- package/dist/make-sqlite-db.js +40 -8
- package/dist/make-sqlite-db.js.map +1 -1
- package/dist/mod.d.ts +1 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/mod.js.map +1 -1
- package/package.json +58 -15
- package/src/WebSocket.ts +8 -4
- package/src/create-store-do.ts +10 -2
- package/src/make-adapter.ts +28 -31
- package/src/make-sqlite-db.ts +45 -10
- package/src/mod.ts +1 -6
package/dist/WebSocket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocket.d.ts","sourceRoot":"","sources":["../src/WebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAkB,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAO3D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,oCAK3B;IACD,+CAA+C;IAC/C,aAAa,EAAE,OAAO,CAAC,iBAAiB,CAAA;IACxC,GAAG,EAAE,GAAG,CAAA;IACR,SAAS,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;CAC/C,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"WebSocket.d.ts","sourceRoot":"","sources":["../src/WebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAkB,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAO3D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,oCAK3B;IACD,+CAA+C;IAC/C,aAAa,EAAE,OAAO,CAAC,iBAAiB,CAAA;IACxC,GAAG,EAAE,GAAG,CAAA;IACR,SAAS,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;CAC/C,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAkDtE,CAAA"}
|
package/dist/WebSocket.js
CHANGED
|
@@ -13,14 +13,16 @@ export const makeWebSocket = ({
|
|
|
13
13
|
reconnect, url, durableObject, }) => Effect.gen(function* () {
|
|
14
14
|
// yield* validateUrl(url)
|
|
15
15
|
const socket = yield* Effect.tryPromise({
|
|
16
|
-
try: () =>
|
|
17
|
-
|
|
16
|
+
try: () =>
|
|
17
|
+
// NOTE: .toString() required due to type mismatch between standard URL and CF's URL types
|
|
18
|
+
durableObject.fetch(url.toString(), { headers: { Upgrade: 'websocket' } }).then((res) => {
|
|
19
|
+
if (res.webSocket == null) {
|
|
18
20
|
throw new Error('WebSocket upgrade failed');
|
|
19
21
|
}
|
|
20
22
|
return res.webSocket;
|
|
21
23
|
}),
|
|
22
24
|
catch: (cause) => new WebSocket.WebSocketError({ cause }),
|
|
23
|
-
}).pipe(reconnect ? Effect.retry(reconnect) : identity, Effect.withSpan('make-websocket-durable-object'));
|
|
25
|
+
}).pipe(reconnect !== undefined && reconnect !== false ? Effect.retry(reconnect) : identity, Effect.withSpan('make-websocket-durable-object'));
|
|
24
26
|
socket.accept();
|
|
25
27
|
/**
|
|
26
28
|
* Common WebSocket close codes: https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close
|
|
@@ -38,7 +40,7 @@ reconnect, url, durableObject, }) => Effect.gen(function* () {
|
|
|
38
40
|
yield* Effect.addFinalizer(Effect.fn(function* (exit) {
|
|
39
41
|
yield* Effect.try({
|
|
40
42
|
try: () => {
|
|
41
|
-
if (Exit.isFailure(exit)) {
|
|
43
|
+
if (Exit.isFailure(exit) === true) {
|
|
42
44
|
socket.close(3000);
|
|
43
45
|
}
|
|
44
46
|
else {
|
package/dist/WebSocket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocket.js","sourceRoot":"","sources":["../src/WebSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAA6B,MAAM,yBAAyB,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE3D,mDAAmD;AACnD,0GAA0G;AAC1G,sJAAsJ;AACtJ,2FAA2F;AAE3F;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;AAC5B,MAAM;AACN,SAAS,EACT,GAAG,EACH,aAAa,GAMd,EAA2E,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,0BAA0B;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QACtC,GAAG,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"WebSocket.js","sourceRoot":"","sources":["../src/WebSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAA6B,MAAM,yBAAyB,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE3D,mDAAmD;AACnD,0GAA0G;AAC1G,sJAAsJ;AACtJ,2FAA2F;AAE3F;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;AAC5B,MAAM;AACN,SAAS,EACT,GAAG,EACH,aAAa,GAMd,EAA2E,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,0BAA0B;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QACtC,GAAG,EAAE,GAAG,EAAE;QACR,0FAA0F;QAC1F,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;YAC3F,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC7C,CAAC;YACD,OAAO,GAAG,CAAC,SAA8B,CAAA;QAC3C,CAAC,CAAC;QACJ,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;KAC1D,CAAC,CAAC,IAAI,CACL,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EACnF,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CACjD,CAAA;IAED,MAAM,CAAC,MAAM,EAAE,CAAA;IAEf;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CACxB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI;QACvB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,GAAG,EAAE;gBACR,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACpB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SACjE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC,CAAC,CACH,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogConfig } from '@livestore/common';
|
|
1
|
+
import { LogConfig, type SyncOptions } from '@livestore/common';
|
|
2
2
|
import type { CfTypes, HelperTypes } from '@livestore/common-cf';
|
|
3
3
|
import { type LiveStoreSchema } from '@livestore/livestore';
|
|
4
4
|
import type * as CfSyncBackend from '@livestore/sync-cf/cf-worker';
|
|
@@ -38,6 +38,12 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema, TEnv, TState>
|
|
|
38
38
|
* Note: Only use this for development purposes.
|
|
39
39
|
*/
|
|
40
40
|
resetPersistence?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Controls how initial sync behaves when the store boots.
|
|
43
|
+
*
|
|
44
|
+
* @default { _tag: 'Blocking', timeout: 500 }
|
|
45
|
+
*/
|
|
46
|
+
initialSyncOptions?: SyncOptions['initialSyncOptions'];
|
|
41
47
|
} & LogConfig.WithLoggerOptions;
|
|
42
48
|
/**
|
|
43
49
|
* Creates a LiveStore instance inside a Cloudflare Durable Object.
|
|
@@ -79,7 +85,7 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema, TEnv, TState>
|
|
|
79
85
|
*
|
|
80
86
|
* @see https://livestore.dev/docs/reference/adapters/cloudflare for setup guide
|
|
81
87
|
*/
|
|
82
|
-
export declare const createStoreDo: <TSchema extends LiveStoreSchema, TEnv, TState extends CfTypes.DurableObjectState = CfTypes.DurableObjectState>({ schema, storeId, clientId, sessionId, durableObject, syncBackendStub, livePull, resetPersistence, }: CreateStoreDoOptions<TSchema, TEnv, TState>) => Effect.Effect<import("@livestore/livestore").Store<TSchema, {}>, import("@livestore/common").UnknownError, never>;
|
|
88
|
+
export declare const createStoreDo: <TSchema extends LiveStoreSchema, TEnv, TState extends CfTypes.DurableObjectState = CfTypes.DurableObjectState>({ schema, storeId, clientId, sessionId, durableObject, syncBackendStub, livePull, resetPersistence, initialSyncOptions, }: CreateStoreDoOptions<TSchema, TEnv, TState>) => Effect.Effect<import("@livestore/livestore").Store<TSchema, {}>, import("@livestore/common").UnknownError, never>;
|
|
83
89
|
/**
|
|
84
90
|
* Promise-based wrapper around `createStoreDo` for simpler async/await usage.
|
|
85
91
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-store-do.d.ts","sourceRoot":"","sources":["../src/create-store-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"create-store-do.d.ts","sourceRoot":"","sources":["../src/create-store-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAe,KAAK,eAAe,EAAe,MAAM,sBAAsB,CAAA;AACrF,OAAO,KAAK,KAAK,aAAa,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,MAAM,EAAiB,MAAM,yBAAyB,CAAA;AAI/D,MAAM,MAAM,GAAG,GAAG;IAChB,eAAe,EAAE,OAAO,CAAC,sBAAsB,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAA;CACvF,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,eAAe,EAAE,IAAI,EAAE,MAAM,IAAI;IAChF,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,8HAA8H;IAC9H,aAAa,EAAE;QACb,qDAAqD;QACrD,GAAG,EAAE,MAAM,CAAA;QACX,+DAA+D;QAC/D,GAAG,EAAE,IAAI,CAAA;QACT,oFAAoF;QACpF,WAAW,EAAE,WAAW,CAAC,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;KACjE,CAAA;IACD,iFAAiF;IACjF,eAAe,EAAE,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAA;IACjF;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAA;CACvD,GAAG,SAAS,CAAC,iBAAiB,CAAA;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,eAAO,MAAM,aAAa,GACxB,OAAO,SAAS,eAAe,EAC/B,IAAI,EACJ,MAAM,SAAS,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,EACtE,2HAUC,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,sHAuB1C,CAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,SAAS,eAAe,EAC/B,IAAI,EACJ,MAAM,SAAS,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,EAEtE,SAAS,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,+DASnD,CAAA"}
|
package/dist/create-store-do.js
CHANGED
|
@@ -44,7 +44,7 @@ import { makeAdapter } from "./make-adapter.js";
|
|
|
44
44
|
* @see https://livestore.dev/docs/reference/adapters/cloudflare for setup guide
|
|
45
45
|
*/
|
|
46
46
|
// TODO Also support in Cloudflare workers outside of a durable object context.
|
|
47
|
-
export const createStoreDo = ({ schema, storeId, clientId, sessionId, durableObject, syncBackendStub, livePull = false, resetPersistence = false, }) => Effect.gen(function* () {
|
|
47
|
+
export const createStoreDo = ({ schema, storeId, clientId, sessionId, durableObject, syncBackendStub, livePull = false, resetPersistence = false, initialSyncOptions = { _tag: 'Blocking', timeout: 500 }, }) => Effect.gen(function* () {
|
|
48
48
|
const { ctx, bindingName } = durableObject;
|
|
49
49
|
const storage = ctx.storage;
|
|
50
50
|
const durableObjectId = ctx.id.toString();
|
|
@@ -60,7 +60,7 @@ export const createStoreDo = ({ schema, storeId, clientId, sessionId, durableObj
|
|
|
60
60
|
durableObjectContext: { bindingName, durableObjectId },
|
|
61
61
|
}),
|
|
62
62
|
livePull, // Uses DO RPC callbacks for reactive pull
|
|
63
|
-
initialSyncOptions
|
|
63
|
+
initialSyncOptions,
|
|
64
64
|
},
|
|
65
65
|
});
|
|
66
66
|
return yield* createStore({ schema, adapter, storeId }).pipe(Scope.extend(scope), provideOtel({}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-store-do.js","sourceRoot":"","sources":["../src/create-store-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"create-store-do.js","sourceRoot":"","sources":["../src/create-store-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,mBAAmB,CAAA;AAE/D,OAAO,EAAE,WAAW,EAAwB,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAErF,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AA8C/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAI3B,EACA,MAAM,EACN,OAAO,EACP,QAAQ,EACR,SAAS,EACT,aAAa,EACb,eAAe,EACf,QAAQ,GAAG,KAAK,EAChB,gBAAgB,GAAG,KAAK,EACxB,kBAAkB,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,GACX,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,aAAa,CAAA;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;IAC3B,MAAM,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAA;IACzC,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;gBACf,oBAAoB,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;aACvD,CAAC;YACF,QAAQ,EAAE,0CAA0C;YACpD,kBAAkB;SACnB;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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAKlC,OAAoD,EACpD,EAAE,CACF,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE;IAClC,UAAU,EAAE,UAAU;IACtB,aAAa,EAAE,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC;CACpD,CAAC,EACF,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAA"}
|
|
@@ -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;
|
|
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;AAC1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAcnD,eAAO,MAAM,WAAW,GACrB,kEAME;IACD,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAA;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,KAAG,OA+ID,CAAA"}
|
package/dist/make-adapter.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ClientSessionLeaderThreadProxy, liveStoreStorageFormatVersion, makeClientSession, UnknownError, } from '@livestore/common';
|
|
2
2
|
import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer, streamEventsWithSyncState, } from '@livestore/common/leader-thread';
|
|
3
3
|
import { LiveStoreEvent } from '@livestore/livestore';
|
|
4
|
-
import { sqliteDbFactory } from '@livestore/sqlite-wasm/cf';
|
|
4
|
+
import { CF_SQL_VFS_REQUIRED_PRAGMAS, sqliteDbFactory } from '@livestore/sqlite-wasm/cf';
|
|
5
|
+
import { makeSqliteDb as makeDoSqliteDb } from "./make-sqlite-db.js";
|
|
5
6
|
import { loadSqlite3Wasm } from '@livestore/sqlite-wasm/load-wasm';
|
|
6
7
|
import { Effect, FetchHttpClient, Layer, Schedule, SubscriptionRef, WebChannel } from '@livestore/utils/effect';
|
|
7
8
|
export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, resetPersistence = false, }) => (adapterArgs) => Effect.gen(function* () {
|
|
@@ -13,29 +14,25 @@ export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, resetPe
|
|
|
13
14
|
const makeSqliteDb = sqliteDbFactory({ sqlite3 });
|
|
14
15
|
const syncInMemoryDb = yield* makeSqliteDb({ _tag: 'in-memory', storage, configureDb: () => { } }).pipe(UnknownError.mapToUnknownError);
|
|
15
16
|
const schemaHashSuffix = schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString();
|
|
16
|
-
const stateDbFileName = getStateDbFileName(schemaHashSuffix);
|
|
17
|
-
const eventlogDbFileName = getEventlogDbFileName();
|
|
18
17
|
if (resetPersistence === true) {
|
|
19
|
-
yield* resetDurableObjectPersistence({
|
|
20
|
-
storage,
|
|
21
|
-
storeId,
|
|
22
|
-
dbFileNames: [stateDbFileName, eventlogDbFileName],
|
|
23
|
-
});
|
|
18
|
+
yield* resetDurableObjectPersistence({ storage, storeId });
|
|
24
19
|
}
|
|
20
|
+
const stateDbFileName = getStateDbFileName(schemaHashSuffix);
|
|
25
21
|
const dbState = yield* makeSqliteDb({
|
|
26
22
|
_tag: 'storage',
|
|
27
23
|
storage,
|
|
28
24
|
fileName: stateDbFileName,
|
|
29
|
-
configureDb: () => {
|
|
25
|
+
configureDb: (db) => db.execute([...CF_SQL_VFS_REQUIRED_PRAGMAS, 'cache_size=-8000'].map((p) => `PRAGMA ${p}`).join(';\n')),
|
|
30
26
|
}).pipe(UnknownError.mapToUnknownError);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
// dbEventlog runs on DO SQLite directly (not through the VFS). SQL-level transaction
|
|
28
|
+
// control (BEGIN/COMMIT/ROLLBACK) is silently dropped — see isTransactionControlStatement
|
|
29
|
+
// in make-sqlite-db.ts for details on why this is safe.
|
|
30
|
+
const dbEventlog = yield* makeDoSqliteDb({
|
|
31
|
+
_tag: 'file',
|
|
32
|
+
db: storage.sql,
|
|
35
33
|
configureDb: () => { },
|
|
36
34
|
}).pipe(UnknownError.mapToUnknownError);
|
|
37
35
|
const shutdownChannel = yield* WebChannel.noopChannel();
|
|
38
|
-
// Use Durable Object sync backend if no backend is specified
|
|
39
36
|
const layer = yield* Layer.build(makeLeaderThreadLayer({
|
|
40
37
|
schema,
|
|
41
38
|
storeId,
|
|
@@ -86,7 +83,7 @@ export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, resetPe
|
|
|
86
83
|
sqliteDb: syncInMemoryDb,
|
|
87
84
|
webmeshMode: 'proxy',
|
|
88
85
|
connectWebmeshNode: Effect.fnUntraced(function* ({ webmeshNode }) {
|
|
89
|
-
if (devtoolsOptions.enabled) {
|
|
86
|
+
if (devtoolsOptions.enabled === true) {
|
|
90
87
|
console.log('connectWebmeshNode', { webmeshNode });
|
|
91
88
|
// yield* Webmesh.connectViaWebSocket({
|
|
92
89
|
// node: webmeshNode,
|
|
@@ -107,14 +104,16 @@ export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, resetPe
|
|
|
107
104
|
return clientSession;
|
|
108
105
|
}).pipe(Effect.withSpan('@livestore/adapter-cloudflare:makeAdapter', { attributes: { clientId, sessionId } }), Effect.provide(FetchHttpClient.layer));
|
|
109
106
|
const getStateDbFileName = (suffix) => `state${suffix}@${liveStoreStorageFormatVersion}.db`;
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
107
|
+
const resetDurableObjectPersistence = ({ storage, storeId, }) => Effect.try({
|
|
108
|
+
try: () =>
|
|
109
|
+
// All three tables live in the DO's single storage.sql database but are
|
|
110
|
+
// owned by different layers during normal operation:
|
|
111
|
+
// - vfs_pages: written by the wa-sqlite VFS layer (backs dbState)
|
|
112
|
+
// - eventlog, __livestore_sync_status: written directly by dbEventlog via storage.sql
|
|
113
|
+
storage.transactionSync(() => {
|
|
114
|
+
safeSqlExec(storage, 'DELETE FROM vfs_pages');
|
|
115
|
+
safeSqlExec(storage, 'DELETE FROM eventlog');
|
|
116
|
+
safeSqlExec(storage, 'DELETE FROM __livestore_sync_status');
|
|
118
117
|
}),
|
|
119
118
|
catch: (cause) => new UnknownError({
|
|
120
119
|
cause,
|
|
@@ -123,14 +122,14 @@ const resetDurableObjectPersistence = ({ storage, storeId, dbFileNames, }) => Ef
|
|
|
123
122
|
}).pipe(Effect.retry({ schedule: Schedule.exponentialBackoff10Sec }), Effect.withSpan('@livestore/adapter-cloudflare:resetPersistence', { attributes: { storeId } }));
|
|
124
123
|
const safeSqlExec = (storage, query, binding) => {
|
|
125
124
|
try {
|
|
126
|
-
storage.sql.exec(query, binding);
|
|
125
|
+
binding !== undefined ? storage.sql.exec(query, binding) : storage.sql.exec(query);
|
|
127
126
|
}
|
|
128
127
|
catch (error) {
|
|
129
|
-
if (
|
|
128
|
+
if (isMissingTableError(error) === true) {
|
|
130
129
|
return;
|
|
131
130
|
}
|
|
132
131
|
throw error;
|
|
133
132
|
}
|
|
134
133
|
};
|
|
135
|
-
const
|
|
134
|
+
const isMissingTableError = (error) => error instanceof Error && error.message.toLowerCase().includes('no such table');
|
|
136
135
|
//# 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,YAAY,GACb,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-adapter.js","sourceRoot":"","sources":["../src/make-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAGf,QAAQ,EAGT,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAGf,QAAQ,EAGT,MAAM,mBAAmB,CAAA;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAkEnD,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,KAAK,EAAE,uBAAuB,CAAA;IAC9B,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,CAAA;AAED,KAAK,uBAAuB,GACxB;IACE,IAAI,EAAE,MAAM,CAAA;IAGZ,EAAE,EAAE,OAAO,CAAC,UAAU,CAAA;IACtB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,EAAE,EAAE,OAAO,CAAC,UAAU,CAAA;IACtB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,CAAA;AAEL,MAAM,MAAM,sBAAsB,GAAG,YAAY,CAAC,QAAQ,EAAE,uBAAuB,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG,QAAQ,CAAC,CAAA;AAEvH,eAAO,MAAM,YAAY,EAAE,sBA2BvB,CAAA;AAEJ,eAAO,MAAM,aAAa,GACxB,SAAS,SAAS;IAChB,eAAe,EAAE,eAAe,CAAA;IAChC,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;CAC/C,EACD,2BAGC;IACD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAA;IAC9B,QAAQ,EAAE,SAAS,CAAA;CACpB,KAAG,QAAQ,CAAC,SAAS,CAkHrB,CAAA"}
|
package/dist/make-sqlite-db.js
CHANGED
|
@@ -11,13 +11,15 @@ class CloudflarePreparedStatement {
|
|
|
11
11
|
}
|
|
12
12
|
execute = (bindValues, options) => {
|
|
13
13
|
try {
|
|
14
|
-
|
|
14
|
+
if (isTransactionControlStatement(this.sql) === true)
|
|
15
|
+
return;
|
|
16
|
+
const cursor = this.sqlStorage.exec(this.sql, ...(bindValues !== undefined ? Object.values(bindValues) : []));
|
|
15
17
|
// Count affected rows by iterating through cursor
|
|
16
18
|
let changedCount = 0;
|
|
17
19
|
for (const _row of cursor) {
|
|
18
20
|
changedCount++;
|
|
19
21
|
}
|
|
20
|
-
if (options?.onRowsChanged) {
|
|
22
|
+
if (options?.onRowsChanged !== undefined) {
|
|
21
23
|
options.onRowsChanged(changedCount);
|
|
22
24
|
}
|
|
23
25
|
}
|
|
@@ -31,7 +33,7 @@ class CloudflarePreparedStatement {
|
|
|
31
33
|
};
|
|
32
34
|
select = (bindValues) => {
|
|
33
35
|
try {
|
|
34
|
-
const cursor = this.sqlStorage.exec(this.sql, ...(bindValues ? Object.values(bindValues) : []));
|
|
36
|
+
const cursor = this.sqlStorage.exec(this.sql, ...(bindValues !== undefined ? Object.values(bindValues) : []));
|
|
35
37
|
const results = [];
|
|
36
38
|
for (const row of cursor) {
|
|
37
39
|
results.push(row);
|
|
@@ -51,14 +53,12 @@ class CloudflarePreparedStatement {
|
|
|
51
53
|
};
|
|
52
54
|
}
|
|
53
55
|
export const makeSqliteDb = (input) => Effect.gen(function* () {
|
|
54
|
-
// console.log('makeSqliteDb', input)
|
|
55
56
|
if (input._tag === 'in-memory') {
|
|
56
57
|
return makeSqliteDb_({
|
|
57
58
|
sqlStorage: input.db,
|
|
58
59
|
metadata: {
|
|
59
60
|
_tag: 'file',
|
|
60
61
|
dbPointer: 0,
|
|
61
|
-
// persistenceInfo: { fileName: ':memory:' },
|
|
62
62
|
persistenceInfo: { fileName: 'cf' },
|
|
63
63
|
input,
|
|
64
64
|
configureDb: input.configureDb,
|
|
@@ -71,7 +71,6 @@ export const makeSqliteDb = (input) => Effect.gen(function* () {
|
|
|
71
71
|
metadata: {
|
|
72
72
|
_tag: 'file',
|
|
73
73
|
dbPointer: 0,
|
|
74
|
-
// persistenceInfo: { fileName: `${input.directory}/${input.databaseName}` },
|
|
75
74
|
persistenceInfo: { fileName: 'cf' },
|
|
76
75
|
input,
|
|
77
76
|
configureDb: input.configureDb,
|
|
@@ -126,14 +125,13 @@ export const makeSqliteDb_ = ({ sqlStorage, metadata, }) => {
|
|
|
126
125
|
}),
|
|
127
126
|
destroy: () => {
|
|
128
127
|
sqliteDb.close();
|
|
129
|
-
// metadata.deleteDb()
|
|
130
128
|
throw new SqliteError({
|
|
131
129
|
code: -1,
|
|
132
130
|
cause: 'Database destroy not supported with public SqlStorage API',
|
|
133
131
|
});
|
|
134
132
|
},
|
|
135
133
|
close: () => {
|
|
136
|
-
if (isClosed) {
|
|
134
|
+
if (isClosed === true) {
|
|
137
135
|
return;
|
|
138
136
|
}
|
|
139
137
|
for (const stmt of preparedStmts) {
|
|
@@ -188,4 +186,38 @@ export const makeSqliteDb_ = ({ sqlStorage, metadata, }) => {
|
|
|
188
186
|
metadata.configureDb(sqliteDb);
|
|
189
187
|
return sqliteDb;
|
|
190
188
|
};
|
|
189
|
+
/**
|
|
190
|
+
* CF DO SQLite rejects SQL-level transaction control and requires `storage.transactionSync()` instead.
|
|
191
|
+
* The current adapter only detects and suppresses those SQL statements. It does not yet translate the
|
|
192
|
+
* caller's transaction intent into a shared Durable Object storage transaction.
|
|
193
|
+
*
|
|
194
|
+
* ## Consistency implications
|
|
195
|
+
*
|
|
196
|
+
* `LeaderSyncProcessor.materializeEventsBatch()` wraps both `dbState` and `dbEventlog` in
|
|
197
|
+
* `BEGIN`/`COMMIT` to keep them consistent. Because this adapter drops those statements,
|
|
198
|
+
* eventlog INSERTs are auto-committed individually while `dbState` (VFS-backed) still has
|
|
199
|
+
* real transaction boundaries. If a batch partially fails, earlier eventlog rows survive
|
|
200
|
+
* while `dbState` rolls back.
|
|
201
|
+
*
|
|
202
|
+
* This is safe because:
|
|
203
|
+
* - The eventlog is append-only and idempotent — replaying already-inserted events is a no-op.
|
|
204
|
+
* - State is always rebuildable from the eventlog on cold start (`recreateDb`).
|
|
205
|
+
* - A Durable Object is single-threaded, so no concurrent reader can observe the
|
|
206
|
+
* intermediate inconsistency.
|
|
207
|
+
*
|
|
208
|
+
* Uses prefix matching to cover all SQLite variants:
|
|
209
|
+
* - `BEGIN [DEFERRED | IMMEDIATE | EXCLUSIVE] [TRANSACTION]`
|
|
210
|
+
* - `COMMIT [TRANSACTION]` / `END [TRANSACTION]`
|
|
211
|
+
* - `ROLLBACK [TRANSACTION] [TO [SAVEPOINT] name]`
|
|
212
|
+
* - `SAVEPOINT name` / `RELEASE [SAVEPOINT] name`
|
|
213
|
+
*/
|
|
214
|
+
const isTransactionControlStatement = (sql) => {
|
|
215
|
+
const upper = sql.trim().toUpperCase();
|
|
216
|
+
return (upper.startsWith('BEGIN') === true ||
|
|
217
|
+
upper.startsWith('COMMIT') === true ||
|
|
218
|
+
upper.startsWith('END') === true ||
|
|
219
|
+
upper.startsWith('ROLLBACK') === true ||
|
|
220
|
+
upper.startsWith('SAVEPOINT') === true ||
|
|
221
|
+
upper.startsWith('RELEASE') === true);
|
|
222
|
+
};
|
|
191
223
|
//# sourceMappingURL=make-sqlite-db.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"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"}
|
package/dist/mod.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './polyfill.ts';
|
|
2
2
|
export type { ClientDoWithRpcCallback } from '@livestore/common-cf';
|
|
3
|
-
export { type CreateStoreDoOptions, createStoreDo, createStoreDoPromise, type Env
|
|
3
|
+
export { type CreateStoreDoOptions, createStoreDo, createStoreDoPromise, type Env } from './create-store-do.ts';
|
|
4
4
|
export { makeAdapter } from './make-adapter.ts';
|
|
5
5
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,oBAAoB,EAAE,aAAa,EAAE,oBAAoB,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC/G,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/mod.js
CHANGED
package/dist/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAGtB,OAAO,
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAGtB,OAAO,EAA6B,aAAa,EAAE,oBAAoB,EAAY,MAAM,sBAAsB,CAAA;AAC/G,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/adapter-cloudflare",
|
|
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": [
|
|
6
16
|
"./src/polyfill.ts",
|
|
@@ -10,26 +20,59 @@
|
|
|
10
20
|
".": "./dist/mod.js",
|
|
11
21
|
"./polyfill": "./dist/polyfill.js"
|
|
12
22
|
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
13
26
|
"dependencies": {
|
|
14
27
|
"@cloudflare/workers-types": "4.20251118.0",
|
|
15
|
-
"@livestore/common": "0.4.0-dev.
|
|
16
|
-
"@livestore/
|
|
17
|
-
"@livestore/
|
|
18
|
-
"@livestore/
|
|
19
|
-
"@livestore/
|
|
20
|
-
"@livestore/utils": "0.4.0-dev.
|
|
28
|
+
"@livestore/common-cf": "^0.4.0-dev.23",
|
|
29
|
+
"@livestore/livestore": "^0.4.0-dev.23",
|
|
30
|
+
"@livestore/common": "^0.4.0-dev.23",
|
|
31
|
+
"@livestore/sqlite-wasm": "^0.4.0-dev.23",
|
|
32
|
+
"@livestore/sync-cf": "^0.4.0-dev.23",
|
|
33
|
+
"@livestore/utils": "^0.4.0-dev.23"
|
|
21
34
|
},
|
|
22
35
|
"devDependencies": {
|
|
23
36
|
"wrangler": "4.42.2"
|
|
24
37
|
},
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
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-cloudflare",
|
|
64
|
+
"packages/@livestore/adapter-web",
|
|
65
|
+
"packages/@livestore/common",
|
|
66
|
+
"packages/@livestore/common-cf",
|
|
67
|
+
"packages/@livestore/devtools-web-common",
|
|
68
|
+
"packages/@livestore/livestore",
|
|
69
|
+
"packages/@livestore/sqlite-wasm",
|
|
70
|
+
"packages/@livestore/sync-cf",
|
|
71
|
+
"packages/@livestore/utils",
|
|
72
|
+
"packages/@livestore/utils-dev",
|
|
73
|
+
"packages/@livestore/wa-sqlite",
|
|
74
|
+
"packages/@livestore/webmesh"
|
|
75
|
+
]
|
|
33
76
|
},
|
|
34
77
|
"scripts": {
|
|
35
78
|
"test": "echo No tests yet"
|
package/src/WebSocket.ts
CHANGED
|
@@ -27,14 +27,18 @@ export const makeWebSocket = ({
|
|
|
27
27
|
|
|
28
28
|
const socket = yield* Effect.tryPromise({
|
|
29
29
|
try: () =>
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// NOTE: .toString() required due to type mismatch between standard URL and CF's URL types
|
|
31
|
+
durableObject.fetch(url.toString(), { headers: { Upgrade: 'websocket' } }).then((res: any) => {
|
|
32
|
+
if (res.webSocket == null) {
|
|
32
33
|
throw new Error('WebSocket upgrade failed')
|
|
33
34
|
}
|
|
34
35
|
return res.webSocket as CfTypes.WebSocket
|
|
35
36
|
}),
|
|
36
37
|
catch: (cause) => new WebSocket.WebSocketError({ cause }),
|
|
37
|
-
}).pipe(
|
|
38
|
+
}).pipe(
|
|
39
|
+
reconnect !== undefined && reconnect !== false ? Effect.retry(reconnect) : identity,
|
|
40
|
+
Effect.withSpan('make-websocket-durable-object'),
|
|
41
|
+
)
|
|
38
42
|
|
|
39
43
|
socket.accept()
|
|
40
44
|
|
|
@@ -55,7 +59,7 @@ export const makeWebSocket = ({
|
|
|
55
59
|
Effect.fn(function* (exit) {
|
|
56
60
|
yield* Effect.try({
|
|
57
61
|
try: () => {
|
|
58
|
-
if (Exit.isFailure(exit)) {
|
|
62
|
+
if (Exit.isFailure(exit) === true) {
|
|
59
63
|
socket.close(3000)
|
|
60
64
|
} else {
|
|
61
65
|
socket.close(1000)
|
package/src/create-store-do.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { LogConfig } from '@livestore/common'
|
|
1
|
+
import { LogConfig, type SyncOptions } from '@livestore/common'
|
|
2
2
|
import type { CfTypes, HelperTypes } from '@livestore/common-cf'
|
|
3
3
|
import { createStore, type LiveStoreSchema, provideOtel } from '@livestore/livestore'
|
|
4
4
|
import type * as CfSyncBackend from '@livestore/sync-cf/cf-worker'
|
|
5
5
|
import { makeDoRpcSync } from '@livestore/sync-cf/client'
|
|
6
6
|
import { Effect, Logger, Scope } from '@livestore/utils/effect'
|
|
7
|
+
|
|
7
8
|
import { makeAdapter } from './make-adapter.ts'
|
|
8
9
|
|
|
9
10
|
export type Env = {
|
|
@@ -42,6 +43,12 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema, TEnv, TState>
|
|
|
42
43
|
* Note: Only use this for development purposes.
|
|
43
44
|
*/
|
|
44
45
|
resetPersistence?: boolean
|
|
46
|
+
/**
|
|
47
|
+
* Controls how initial sync behaves when the store boots.
|
|
48
|
+
*
|
|
49
|
+
* @default { _tag: 'Blocking', timeout: 500 }
|
|
50
|
+
*/
|
|
51
|
+
initialSyncOptions?: SyncOptions['initialSyncOptions']
|
|
45
52
|
} & LogConfig.WithLoggerOptions
|
|
46
53
|
|
|
47
54
|
/**
|
|
@@ -98,6 +105,7 @@ export const createStoreDo = <
|
|
|
98
105
|
syncBackendStub,
|
|
99
106
|
livePull = false,
|
|
100
107
|
resetPersistence = false,
|
|
108
|
+
initialSyncOptions = { _tag: 'Blocking', timeout: 500 },
|
|
101
109
|
}: CreateStoreDoOptions<TSchema, TEnv, TState>) =>
|
|
102
110
|
Effect.gen(function* () {
|
|
103
111
|
const { ctx, bindingName } = durableObject
|
|
@@ -116,7 +124,7 @@ export const createStoreDo = <
|
|
|
116
124
|
durableObjectContext: { bindingName, durableObjectId },
|
|
117
125
|
}),
|
|
118
126
|
livePull, // Uses DO RPC callbacks for reactive pull
|
|
119
|
-
initialSyncOptions
|
|
127
|
+
initialSyncOptions,
|
|
120
128
|
},
|
|
121
129
|
})
|
|
122
130
|
|