@livestore/adapter-cloudflare 0.0.0-snapshot-8452e32b7fbfc129741b253b9c853f866b52129f

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.
Files changed (50) hide show
  1. package/LICENSE +201 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/WebSocket.d.ts +14 -0
  4. package/dist/WebSocket.d.ts.map +1 -0
  5. package/dist/WebSocket.js +52 -0
  6. package/dist/WebSocket.js.map +1 -0
  7. package/dist/cf-types.d.ts +2 -0
  8. package/dist/cf-types.d.ts.map +1 -0
  9. package/dist/cf-types.js +2 -0
  10. package/dist/cf-types.js.map +1 -0
  11. package/dist/make-adapter.d.ts +9 -0
  12. package/dist/make-adapter.d.ts.map +1 -0
  13. package/dist/make-adapter.js +87 -0
  14. package/dist/make-adapter.js.map +1 -0
  15. package/dist/make-client-durable-object.d.ts +34 -0
  16. package/dist/make-client-durable-object.d.ts.map +1 -0
  17. package/dist/make-client-durable-object.js +25 -0
  18. package/dist/make-client-durable-object.js.map +1 -0
  19. package/dist/make-sqlite-db.d.ts +31 -0
  20. package/dist/make-sqlite-db.d.ts.map +1 -0
  21. package/dist/make-sqlite-db.js +194 -0
  22. package/dist/make-sqlite-db.js.map +1 -0
  23. package/dist/mod.d.ts +5 -0
  24. package/dist/mod.d.ts.map +1 -0
  25. package/dist/mod.js +4 -0
  26. package/dist/mod.js.map +1 -0
  27. package/dist/polyfill.d.ts +2 -0
  28. package/dist/polyfill.d.ts.map +1 -0
  29. package/dist/polyfill.js +40 -0
  30. package/dist/polyfill.js.map +1 -0
  31. package/dist/sync-provider-client.d.ts +12 -0
  32. package/dist/sync-provider-client.d.ts.map +1 -0
  33. package/dist/sync-provider-client.js +24 -0
  34. package/dist/sync-provider-client.js.map +1 -0
  35. package/dist/sync-provider-rpc-client.d.ts +2 -0
  36. package/dist/sync-provider-rpc-client.d.ts.map +1 -0
  37. package/dist/sync-provider-rpc-client.js +139 -0
  38. package/dist/sync-provider-rpc-client.js.map +1 -0
  39. package/dist/sync-provider-ws-client.d.ts +2 -0
  40. package/dist/sync-provider-ws-client.d.ts.map +1 -0
  41. package/dist/sync-provider-ws-client.js +40 -0
  42. package/dist/sync-provider-ws-client.js.map +1 -0
  43. package/package.json +38 -0
  44. package/src/WebSocket.ts +69 -0
  45. package/src/cf-types.ts +20 -0
  46. package/src/make-adapter.ts +144 -0
  47. package/src/make-client-durable-object.ts +91 -0
  48. package/src/make-sqlite-db.ts +261 -0
  49. package/src/mod.ts +12 -0
  50. package/src/polyfill.ts +44 -0
@@ -0,0 +1,14 @@
1
+ import type { Schedule, Scope } from '@livestore/utils/effect';
2
+ import { Effect, WebSocket } from '@livestore/utils/effect';
3
+ import type * as CfWorker from './cf-types.ts';
4
+ /**
5
+ * Creates a WebSocket connection and waits for the connection to be established.
6
+ * Automatically closes the connection when the scope is closed.
7
+ */
8
+ export declare const makeWebSocket: ({ reconnect, url, durableObject, }: {
9
+ /** CF Sync Backend DO with `/sync` endpoint */
10
+ durableObject: CfWorker.DurableObjectStub;
11
+ url: URL;
12
+ reconnect?: Schedule.Schedule<unknown> | false;
13
+ }) => Effect.Effect<CfWorker.WebSocket, WebSocket.WebSocketError, Scope.Scope>;
14
+ //# sourceMappingURL=WebSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocket.d.ts","sourceRoot":"","sources":["../src/WebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAO9C;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,oCAK3B;IACD,+CAA+C;IAC/C,aAAa,EAAE,QAAQ,CAAC,iBAAiB,CAAA;IACzC,GAAG,EAAE,GAAG,CAAA;IACR,SAAS,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAA;CAC/C,KAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CA6CvE,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { Effect, Exit, identity, WebSocket } from '@livestore/utils/effect';
2
+ // TODO refactor using Effect socket implementation
3
+ // https://github.com/Effect-TS/effect/blob/main/packages%2Fexperimental%2Fsrc%2FDevTools%2FClient.ts#L113
4
+ // "In a Stream pipeline everything above the pipeThrough is the outgoing (send) messages. Everything below is the incoming (message event) messages."
5
+ // https://github.com/Effect-TS/effect/blob/main/packages%2Fplatform%2Fsrc%2FSocket.ts#L451
6
+ /**
7
+ * Creates a WebSocket connection and waits for the connection to be established.
8
+ * Automatically closes the connection when the scope is closed.
9
+ */
10
+ export const makeWebSocket = ({
11
+ // do,
12
+ reconnect, url, durableObject, }) => Effect.gen(function* () {
13
+ // yield* validateUrl(url)
14
+ const socket = yield* Effect.tryPromise({
15
+ try: () => durableObject.fetch(url, { headers: { Upgrade: 'websocket' } }).then((res) => {
16
+ if (!res.webSocket) {
17
+ throw new Error('WebSocket upgrade failed');
18
+ }
19
+ return res.webSocket;
20
+ }),
21
+ catch: (cause) => new WebSocket.WebSocketError({ cause }),
22
+ }).pipe(reconnect ? Effect.retry(reconnect) : identity, Effect.withSpan('make-websocket-durable-object'));
23
+ socket.accept();
24
+ /**
25
+ * Common WebSocket close codes: https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close
26
+ * 1000: Normal closure
27
+ * 1001: Endpoint is going away, a server is terminating the connection because it has received a request that indicates the client is ending the connection.
28
+ * 1002: Protocol error, a server is terminating the connection because it has received data on the connection that was not consistent with the type of the connection.
29
+ * 1011: Internal server error, a server is terminating the connection because it encountered an unexpected condition that prevented it from fulfilling the request.
30
+ *
31
+ * For reference, here are the valid WebSocket close code ranges:
32
+ * 1000-1999: Reserved for protocol usage
33
+ * 2000-2999: Reserved for WebSocket extensions
34
+ * 3000-3999: Available for libraries and frameworks
35
+ * 4000-4999: Available for applications
36
+ */
37
+ yield* Effect.addFinalizer(Effect.fn(function* (exit) {
38
+ try {
39
+ if (Exit.isFailure(exit)) {
40
+ socket.close(3000);
41
+ }
42
+ else {
43
+ socket.close(1000);
44
+ }
45
+ }
46
+ catch (error) {
47
+ yield* Effect.die(new WebSocket.WebSocketError({ cause: error }));
48
+ }
49
+ }));
50
+ return socket;
51
+ });
52
+ //# sourceMappingURL=WebSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocket.js","sourceRoot":"","sources":["../src/WebSocket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAG3E,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,EAA4E,EAAE,CAC7E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,0BAA0B;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QACtC,GAAG,EAAE,GAAG,EAAE,CACR,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE;YAChF,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;YAC7C,CAAC;YACD,OAAO,GAAG,CAAC,SAA+B,CAAA;QAC5C,CAAC,CAAC;QACJ,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC;KAC1D,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAA;IAEzG,MAAM,CAAC,MAAM,EAAE,CAAA;IAEf;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CACxB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI;QACvB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QACnE,CAAC;IACH,CAAC,CAAC,CACH,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { type D1Database, type D1Result, type DurableObject, type DurableObjectNamespace, type DurableObjectState, type DurableObjectStorage, type DurableObjectStub, type MessageEvent, Request, Response, Rpc, type SqlStorage, SqlStorageCursor, SqlStorageStatement, type SqlStorageValue, WebSocket, WebSocketPair, WebSocketRequestResponsePair, } from '@cloudflare/workers-types';
2
+ //# sourceMappingURL=cf-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-types.d.ts","sourceRoot":"","sources":["../src/cf-types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,OAAO,EACP,QAAQ,EACR,GAAG,EACH,KAAK,UAAU,EACf,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,eAAe,EACpB,SAAS,EACT,aAAa,EACb,4BAA4B,GAC7B,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { Request, Response, Rpc, SqlStorageCursor, SqlStorageStatement, WebSocket, WebSocketPair, WebSocketRequestResponsePair, } from '@cloudflare/workers-types';
2
+ //# sourceMappingURL=cf-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-types.js","sourceRoot":"","sources":["../src/cf-types.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,OAAO,EACP,QAAQ,EACR,GAAG,EAEH,gBAAgB,EAChB,mBAAmB,EAEnB,SAAS,EACT,aAAa,EACb,4BAA4B,GAC7B,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { type Adapter, type SyncOptions } from '@livestore/common';
2
+ import type * as CfWorker from './cf-types.ts';
3
+ export declare const makeAdapter: ({ storage, clientId, syncOptions, sessionId, }: {
4
+ storage: CfWorker.DurableObjectStorage;
5
+ clientId: string;
6
+ syncOptions: SyncOptions;
7
+ sessionId: string;
8
+ }) => Adapter;
9
+ //# sourceMappingURL=make-adapter.d.ts.map
@@ -0,0 +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,gDAKE;IACD,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAA;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB,KAAG,OAkHD,CAAA"}
@@ -0,0 +1,87 @@
1
+ import { ClientSessionLeaderThreadProxy, liveStoreStorageFormatVersion, makeClientSession, UnexpectedError, } from '@livestore/common';
2
+ import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer } from '@livestore/common/leader-thread';
3
+ import { LiveStoreEvent } from '@livestore/livestore';
4
+ import { sqliteDbFactory } from '@livestore/sqlite-wasm/cf';
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* () {
8
+ const { storeId, /* devtoolsEnabled, shutdown, bootStatusQueue, */ syncPayload, schema } = adapterArgs;
9
+ const devtoolsOptions = { enabled: false };
10
+ const sqlite3 = yield* Effect.promise(() => loadSqlite3Wasm());
11
+ const makeSqliteDb = sqliteDbFactory({ sqlite3 });
12
+ const syncInMemoryDb = yield* makeSqliteDb({ _tag: 'in-memory', storage, configureDb: () => { } }).pipe(UnexpectedError.mapToUnexpectedError);
13
+ const schemaHashSuffix = schema.state.sqlite.migrations.strategy === 'manual' ? 'fixed' : schema.state.sqlite.hash.toString();
14
+ const dbState = yield* makeSqliteDb({
15
+ _tag: 'storage',
16
+ storage,
17
+ fileName: getStateDbFileName(schemaHashSuffix),
18
+ configureDb: () => { },
19
+ }).pipe(UnexpectedError.mapToUnexpectedError);
20
+ const dbEventlog = yield* makeSqliteDb({
21
+ _tag: 'storage',
22
+ storage,
23
+ fileName: `eventlog@${liveStoreStorageFormatVersion}.db`,
24
+ configureDb: () => { },
25
+ }).pipe(UnexpectedError.mapToUnexpectedError);
26
+ const shutdownChannel = yield* WebChannel.noopChannel();
27
+ // Use Durable Object sync backend if no backend is specified
28
+ const layer = yield* Layer.build(makeLeaderThreadLayer({
29
+ schema,
30
+ storeId,
31
+ clientId,
32
+ makeSqliteDb,
33
+ syncOptions,
34
+ dbState,
35
+ dbEventlog,
36
+ devtoolsOptions,
37
+ shutdownChannel,
38
+ syncPayload,
39
+ }));
40
+ const { leaderThread, initialSnapshot } = yield* Effect.gen(function* () {
41
+ const { dbState, dbEventlog, syncProcessor, extraIncomingMessagesQueue, initialState } = yield* LeaderThreadCtx;
42
+ const initialLeaderHead = Eventlog.getClientHeadFromDb(dbEventlog);
43
+ // const initialLeaderHead = EventSequenceNumber.ROOT
44
+ const leaderThread = ClientSessionLeaderThreadProxy.of({
45
+ events: {
46
+ pull: ({ cursor }) => syncProcessor.pull({ cursor }),
47
+ push: (batch) => syncProcessor.push(batch.map((item) => new LiveStoreEvent.EncodedWithMeta(item)), { waitForProcessing: true }),
48
+ },
49
+ initialState: { leaderHead: initialLeaderHead, migrationsReport: initialState.migrationsReport },
50
+ export: Effect.sync(() => dbState.export()),
51
+ getEventlogData: Effect.sync(() => dbEventlog.export()),
52
+ getSyncState: syncProcessor.syncState,
53
+ sendDevtoolsMessage: (message) => extraIncomingMessagesQueue.offer(message),
54
+ }, {
55
+ // overrides: testing?.overrides?.clientSession?.leaderThreadProxy
56
+ });
57
+ const initialSnapshot = dbState.export();
58
+ return { leaderThread, initialSnapshot };
59
+ }).pipe(Effect.provide(layer));
60
+ syncInMemoryDb.import(initialSnapshot);
61
+ const lockStatus = yield* SubscriptionRef.make('has-lock');
62
+ const clientSession = yield* makeClientSession({
63
+ ...adapterArgs,
64
+ sqliteDb: syncInMemoryDb,
65
+ webmeshMode: 'proxy',
66
+ connectWebmeshNode: Effect.fnUntraced(function* ({ webmeshNode }) {
67
+ console.log('connectWebmeshNode', { webmeshNode });
68
+ // if (devtoolsOptions.enabled) {
69
+ // yield* Webmesh.connectViaWebSocket({
70
+ // node: webmeshNode,
71
+ // url: `ws://${devtoolsOptions.host}:${devtoolsOptions.port}`,
72
+ // openTimeout: 500,
73
+ // }).pipe(Effect.tapCauseLogPretty, Effect.forkScoped)
74
+ // }
75
+ }),
76
+ leaderThread,
77
+ lockStatus,
78
+ clientId,
79
+ sessionId,
80
+ isLeader: true,
81
+ // Not really applicable for node as there is no "reload the app" concept
82
+ registerBeforeUnload: (_onBeforeUnload) => () => { },
83
+ });
84
+ return clientSession;
85
+ }).pipe(Effect.withSpan('@livestore/adapter-cloudflare:makeAdapter', { attributes: { clientId, sessionId } }), Effect.provide(FetchHttpClient.layer));
86
+ const getStateDbFileName = (suffix) => `state${suffix}@${liveStoreStorageFormatVersion}.db`;
87
+ //# sourceMappingURL=make-adapter.js.map
@@ -0,0 +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;AAGrG,MAAM,CAAC,MAAM,WAAW,GACtB,CAAC,EACC,OAAO,EACP,QAAQ,EACR,WAAW,EACX,SAAS,GAMV,EAAW,EAAE,CACd,CAAC,WAAW,EAAE,EAAE,CACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,kDAAkD,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,CAAA;IAEvG,MAAM,eAAe,GAAG,EAAE,OAAO,EAAE,KAAK,EAAqB,CAAA;IAE7D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAA;IAE9D,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAEjD,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CACpG,eAAe,CAAC,oBAAoB,CACrC,CAAA;IAED,MAAM,gBAAgB,GACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;IAEtG,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;QAClC,IAAI,EAAE,SAAS;QACf,OAAO;QACP,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,CAAC;QAC9C,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;KACtB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;IAE7C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;QACrC,IAAI,EAAE,SAAS;QACf,OAAO;QACP,QAAQ,EAAE,YAAY,6BAA6B,KAAK;QACxD,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;KACtB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAA;IAE7C,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,EAAY,CAAA;IAEjE,6DAA6D;IAE7D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAC9B,qBAAqB,CAAC;QACpB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,UAAU;QACV,eAAe;QACf,eAAe;QACf,WAAW;KACZ,CAAC,CACH,CAAA;IAED,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,0BAA0B,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;QAE/G,MAAM,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;QAClE,qDAAqD;QAErD,MAAM,YAAY,GAAG,8BAA8B,CAAC,EAAE,CACpD;YACE,MAAM,EAAE;gBACN,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBACpD,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CACd,aAAa,CAAC,IAAI,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAC7D,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;aACJ;YACD,YAAY,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,EAAE;YAChG,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3C,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvD,YAAY,EAAE,aAAa,CAAC,SAAS;YACrC,mBAAmB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC;SAC5E,EACD;QACE,kEAAkE;SACnE,CACF,CAAA;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAExC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAE9B,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IAEtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAa,UAAU,CAAC,CAAA;IAEtE,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC7C,GAAG,WAAW;QACd,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,OAAO;QACpB,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE;YAC9D,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;YAClD,iCAAiC;YACjC,yCAAyC;YACzC,yBAAyB;YACzB,mEAAmE;YACnE,wBAAwB;YACxB,yDAAyD;YACzD,IAAI;QACN,CAAC,CAAC;QACF,YAAY;QACZ,UAAU;QACV,QAAQ;QACR,SAAS;QACT,QAAQ,EAAE,IAAI;QACd,yEAAyE;QACzE,oBAAoB,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;KACpD,CAAC,CAAA;IAEF,OAAO,aAAa,CAAA;AACtB,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CAAC,2CAA2C,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,EACrG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CACtC,CAAA;AAEL,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,QAAQ,MAAM,IAAI,6BAA6B,KAAK,CAAA"}
@@ -0,0 +1,34 @@
1
+ import type { UnexpectedError } from '@livestore/common';
2
+ import { type LiveStoreSchema, type Store, type Unsubscribe } from '@livestore/livestore';
3
+ import type * as CfSyncBackend from '@livestore/sync-cf/cf-worker';
4
+ import { Effect } from '@livestore/utils/effect';
5
+ import type * as CfWorker from './cf-types.ts';
6
+ export type MakeDurableObjectClassOptions<TSchema extends LiveStoreSchema = LiveStoreSchema.Any> = {
7
+ schema: TSchema;
8
+ clientId: string;
9
+ sessionId: string;
10
+ onStoreReady?: (store: Store<TSchema>) => Effect.SyncOrPromiseOrEffect<void, UnexpectedError>;
11
+ registerQueries?: (store: Store<TSchema>) => Effect.SyncOrPromiseOrEffect<ReadonlyArray<Unsubscribe>>;
12
+ syncBackendUrl?: string;
13
+ handleCustomRequest?: (request: CfWorker.Request, ensureStore: Effect.Effect<Store<TSchema>, UnexpectedError, never>) => Effect.SyncOrPromiseOrEffect<CfWorker.Response | undefined, UnexpectedError>;
14
+ };
15
+ export type Env = {
16
+ SYNC_BACKEND_DO: CfWorker.DurableObjectNamespace;
17
+ };
18
+ export type MakeDurableObjectClass = <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>(options: MakeDurableObjectClassOptions<TSchema>) => {
19
+ new (ctx: CfWorker.DurableObjectState, env: Env): CfWorker.DurableObject & CfWorker.Rpc.DurableObjectBranded;
20
+ };
21
+ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema = LiveStoreSchema.Any> = {
22
+ schema: TSchema;
23
+ storeId: string;
24
+ clientId: string;
25
+ sessionId: string;
26
+ storage: CfWorker.DurableObjectStorage;
27
+ syncBackendDurableObject: CfWorker.DurableObjectStub<CfSyncBackend.SyncBackendRpcInterface>;
28
+ durableObjectId: string;
29
+ bindingName: string;
30
+ livePull?: boolean;
31
+ };
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 createStoreDoPromise: <TSchema extends LiveStoreSchema = LiveStoreSchema.Any>(options: CreateStoreDoOptions<TSchema>) => Promise<Store<TSchema, {}>>;
34
+ //# sourceMappingURL=make-client-durable-object.d.ts.map
@@ -0,0 +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;CACnB,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EAAE,sHAUlF,oBAAoB,CAAC,OAAO,CAAC,8DAqB5B,CAAA;AAEJ,eAAO,MAAM,oBAAoB,GAAI,OAAO,SAAS,eAAe,GAAG,eAAe,CAAC,GAAG,EACxF,SAAS,oBAAoB,CAAC,OAAO,CAAC,gCAOrC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { createStore, provideOtel } from '@livestore/livestore';
2
+ import { makeDoRpcSync } from '@livestore/sync-cf/client';
3
+ import { Effect, Logger, LogLevel, Scope } from '@livestore/utils/effect';
4
+ import { makeAdapter } from "./make-adapter.js";
5
+ export const createStoreDo = ({ schema, storeId, clientId, sessionId, storage, syncBackendDurableObject, durableObjectId, bindingName, livePull = false, }) => Effect.gen(function* () {
6
+ const scope = yield* Scope.make();
7
+ const adapter = makeAdapter({
8
+ clientId,
9
+ sessionId,
10
+ storage,
11
+ syncOptions: {
12
+ backend: makeDoRpcSync({
13
+ syncBackendStub: syncBackendDurableObject,
14
+ durableObjectContext: { bindingName, durableObjectId },
15
+ }),
16
+ livePull, // Uses DO RPC callbacks for reactive pull
17
+ // backend: makeHttpSync({ url: `http://localhost:8787`, livePull: { pollInterval: 500 } }),
18
+ initialSyncOptions: { _tag: 'Blocking', timeout: 500 },
19
+ // backend: makeWsSyncProviderClient({ durableObject: syncBackendDurableObject }),
20
+ },
21
+ });
22
+ return yield* createStore({ schema, adapter, storeId }).pipe(Scope.extend(scope), provideOtel({}));
23
+ });
24
+ export const createStoreDoPromise = (options) => createStoreDo(options).pipe(Logger.withMinimumLogLevel(LogLevel.Debug), Effect.provide(Logger.consoleWithThread('DoClient')), Effect.tapCauseLogPretty, Effect.runPromise);
25
+ //# sourceMappingURL=make-client-durable-object.js.map
@@ -0,0 +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;AA2C/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,GACc,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,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"}
@@ -0,0 +1,31 @@
1
+ import type { MakeSqliteDb, PersistenceInfo, SqliteDb } from '@livestore/common';
2
+ import type * as CfWorker from './cf-types.ts';
3
+ type Metadata = {
4
+ _tag: 'file';
5
+ dbPointer: number;
6
+ persistenceInfo: PersistenceInfo;
7
+ input: CloudflareDatabaseInput;
8
+ configureDb: (db: SqliteDb) => void;
9
+ };
10
+ type CloudflareDatabaseInput = {
11
+ _tag: 'file';
12
+ db: CfWorker.SqlStorage;
13
+ configureDb: (db: SqliteDb) => void;
14
+ } | {
15
+ _tag: 'in-memory';
16
+ db: CfWorker.SqlStorage;
17
+ configureDb: (db: SqliteDb) => void;
18
+ };
19
+ export type MakeCloudflareSqliteDb = MakeSqliteDb<Metadata, CloudflareDatabaseInput, {
20
+ _tag: 'cloudflare';
21
+ } & Metadata>;
22
+ export declare const makeSqliteDb: MakeCloudflareSqliteDb;
23
+ export declare const makeSqliteDb_: <TMetadata extends {
24
+ persistenceInfo: PersistenceInfo;
25
+ configureDb: (db: SqliteDb<TMetadata>) => void;
26
+ }>({ sqlStorage, metadata, }: {
27
+ sqlStorage: CfWorker.SqlStorage;
28
+ metadata: TMetadata;
29
+ }) => SqliteDb<TMetadata>;
30
+ export {};
31
+ //# sourceMappingURL=make-sqlite-db.d.ts.map
@@ -0,0 +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;AAI1B,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AA6D9C,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,QAAQ,CAAC,UAAU,CAAA;IACvB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAA;CACpC,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAA;IACvB,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,sBA8BvB,CAAA;AAEJ,eAAO,MAAM,aAAa,GACxB,SAAS,SAAS;IAChB,eAAe,EAAE,eAAe,CAAA;IAEhC,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;CAC/C,EACD,2BAGC;IACD,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAA;IAC/B,QAAQ,EAAE,SAAS,CAAA;CACpB,KAAG,QAAQ,CAAC,SAAS,CAuHrB,CAAA"}
@@ -0,0 +1,194 @@
1
+ import { SqliteDbHelper, SqliteError } from '@livestore/common';
2
+ import { EventSequenceNumber } from '@livestore/common/schema';
3
+ import { Effect } from '@livestore/utils/effect';
4
+ // Simplified prepared statement implementation using only public API
5
+ class CloudflarePreparedStatement {
6
+ sqlStorage;
7
+ sql;
8
+ constructor(sqlStorage, sql) {
9
+ this.sqlStorage = sqlStorage;
10
+ this.sql = sql;
11
+ }
12
+ execute = (bindValues, options) => {
13
+ try {
14
+ const cursor = this.sqlStorage.exec(this.sql, ...(bindValues ? Object.values(bindValues) : []));
15
+ // Count affected rows by iterating through cursor
16
+ let changedCount = 0;
17
+ for (const _row of cursor) {
18
+ changedCount++;
19
+ }
20
+ if (options?.onRowsChanged) {
21
+ options.onRowsChanged(changedCount);
22
+ }
23
+ }
24
+ catch (e) {
25
+ throw new SqliteError({
26
+ query: { bindValues: bindValues ?? {}, sql: this.sql },
27
+ code: e.code ?? -1,
28
+ cause: e,
29
+ });
30
+ }
31
+ };
32
+ select = (bindValues) => {
33
+ try {
34
+ const cursor = this.sqlStorage.exec(this.sql, ...(bindValues ? Object.values(bindValues) : []));
35
+ const results = [];
36
+ for (const row of cursor) {
37
+ results.push(row);
38
+ }
39
+ return results;
40
+ }
41
+ catch (e) {
42
+ throw new SqliteError({
43
+ query: { bindValues: bindValues ?? {}, sql: this.sql },
44
+ code: e.code ?? -1,
45
+ cause: e,
46
+ });
47
+ }
48
+ };
49
+ finalize = () => {
50
+ // No-op for public API - statements are automatically cleaned up
51
+ };
52
+ }
53
+ export const makeSqliteDb = (input) => Effect.gen(function* () {
54
+ // console.log('makeSqliteDb', input)
55
+ if (input._tag === 'in-memory') {
56
+ return makeSqliteDb_({
57
+ sqlStorage: input.db,
58
+ metadata: {
59
+ _tag: 'file',
60
+ dbPointer: 0,
61
+ // persistenceInfo: { fileName: ':memory:' },
62
+ persistenceInfo: { fileName: 'cf' },
63
+ input,
64
+ configureDb: input.configureDb,
65
+ },
66
+ });
67
+ }
68
+ if (input._tag === 'file') {
69
+ return makeSqliteDb_({
70
+ sqlStorage: input.db,
71
+ metadata: {
72
+ _tag: 'file',
73
+ dbPointer: 0,
74
+ // persistenceInfo: { fileName: `${input.directory}/${input.databaseName}` },
75
+ persistenceInfo: { fileName: 'cf' },
76
+ input,
77
+ configureDb: input.configureDb,
78
+ },
79
+ });
80
+ }
81
+ });
82
+ export const makeSqliteDb_ = ({ sqlStorage, metadata, }) => {
83
+ const preparedStmts = [];
84
+ let isClosed = false;
85
+ const sqliteDb = {
86
+ _tag: 'SqliteDb',
87
+ metadata,
88
+ debug: {
89
+ // Setting initially to root but will be set to correct value shortly after
90
+ head: EventSequenceNumber.ROOT,
91
+ },
92
+ prepare: (queryStr) => {
93
+ try {
94
+ const preparedStmt = new CloudflarePreparedStatement(sqlStorage, queryStr.trim());
95
+ preparedStmts.push(preparedStmt);
96
+ return preparedStmt;
97
+ }
98
+ catch (e) {
99
+ throw new SqliteError({
100
+ query: { sql: queryStr, bindValues: {} },
101
+ code: e.code ?? -1,
102
+ cause: e,
103
+ });
104
+ }
105
+ },
106
+ export: () => {
107
+ // NOTE: Database export not supported with public API
108
+ // This functionality requires undocumented serialize() method
109
+ // throw new SqliteError({
110
+ // query: { sql: 'export', bindValues: {} },
111
+ // code: -1,
112
+ // cause: 'Database export not supported with public SqlStorage API',
113
+ // })
114
+ return new Uint8Array();
115
+ },
116
+ execute: SqliteDbHelper.makeExecute((queryStr, bindValues, options) => {
117
+ const stmt = sqliteDb.prepare(queryStr);
118
+ stmt.execute(bindValues, options);
119
+ stmt.finalize();
120
+ }),
121
+ select: SqliteDbHelper.makeSelect((queryStr, bindValues) => {
122
+ const stmt = sqliteDb.prepare(queryStr);
123
+ const results = stmt.select(bindValues);
124
+ stmt.finalize();
125
+ return results;
126
+ }),
127
+ destroy: () => {
128
+ sqliteDb.close();
129
+ // metadata.deleteDb()
130
+ throw new SqliteError({
131
+ code: -1,
132
+ cause: 'Database destroy not supported with public SqlStorage API',
133
+ });
134
+ // if (metadata._tag === 'opfs') {
135
+ // metadata.vfs.resetAccessHandle(metadata.fileName)
136
+ // }
137
+ },
138
+ close: () => {
139
+ if (isClosed) {
140
+ return;
141
+ }
142
+ for (const stmt of preparedStmts) {
143
+ stmt.finalize();
144
+ }
145
+ // NOTE: Database close not supported with public API
146
+ // The database is automatically cleaned up by the runtime
147
+ isClosed = true;
148
+ },
149
+ import: (_source) => {
150
+ // NOTE: Database import not supported with public API
151
+ // This functionality requires undocumented deserialize() and backup() methods
152
+ // throw new SqliteError({
153
+ // query: { sql: 'import', bindValues: {} },
154
+ // code: -1,
155
+ // cause: 'Database import not supported with public SqlStorage API',
156
+ // })
157
+ },
158
+ session: () => {
159
+ // NOTE: Session tracking not supported with public API
160
+ // This functionality requires undocumented session_* methods
161
+ // throw new SqliteError({
162
+ // query: { sql: 'session', bindValues: {} },
163
+ // code: -1,
164
+ // cause: 'Session tracking not supported with public SqlStorage API',
165
+ // })
166
+ return {
167
+ changeset: () => new Uint8Array(),
168
+ finish: () => { },
169
+ };
170
+ },
171
+ makeChangeset: (_data) => {
172
+ // NOTE: Changeset operations not supported with public API
173
+ // This functionality requires undocumented changeset_* methods
174
+ const changeset = {
175
+ invert: () => {
176
+ throw new SqliteError({
177
+ code: -1,
178
+ cause: 'Changeset invert not supported with public SqlStorage API',
179
+ });
180
+ },
181
+ apply: () => {
182
+ throw new SqliteError({
183
+ code: -1,
184
+ cause: 'Changeset apply not supported with public SqlStorage API',
185
+ });
186
+ },
187
+ };
188
+ return changeset;
189
+ },
190
+ };
191
+ metadata.configureDb(sqliteDb);
192
+ return sqliteDb;
193
+ };
194
+ //# sourceMappingURL=make-sqlite-db.js.map
@@ -0,0 +1 @@
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 ADDED
@@ -0,0 +1,5 @@
1
+ import './polyfill.ts';
2
+ export type { ClientDoWithRpcCallback } from '@livestore/common-cf';
3
+ export { makeAdapter } from './make-adapter.ts';
4
+ export { type CreateStoreDoOptions, createStoreDo, createStoreDoPromise, type Env, type MakeDurableObjectClass, type MakeDurableObjectClassOptions, } from './make-client-durable-object.ts';
5
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +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,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,EACb,oBAAoB,EACpB,KAAK,GAAG,EACR,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,GACnC,MAAM,iCAAiC,CAAA"}
package/dist/mod.js ADDED
@@ -0,0 +1,4 @@
1
+ import "./polyfill.js";
2
+ export { makeAdapter } from "./make-adapter.js";
3
+ export { createStoreDo, createStoreDoPromise, } from "./make-client-durable-object.js";
4
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAGtB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAEL,aAAa,EACb,oBAAoB,GAIrB,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=polyfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ /// <reference lib="dom" />
2
+ // TODO remove all unused polyfills once we're closer to the release
3
+ globalThis.performance = globalThis.performance ?? {};
4
+ globalThis.performance.mark = globalThis.performance.mark ?? (() => { });
5
+ globalThis.performance.measure = globalThis.performance.measure ?? (() => { });
6
+ globalThis.performance.now = globalThis.performance.now ?? (() => -1);
7
+ if (typeof globalThis.location === 'undefined') {
8
+ globalThis.location = {
9
+ href: 'https://worker.cloudflare.com/',
10
+ origin: 'https://worker.cloudflare.com',
11
+ protocol: 'https:',
12
+ host: 'worker.cloudflare.com',
13
+ hostname: 'worker.cloudflare.com',
14
+ port: '',
15
+ pathname: '/',
16
+ search: '',
17
+ hash: '',
18
+ };
19
+ }
20
+ if (typeof globalThis.document === 'undefined') {
21
+ globalThis.document = {
22
+ createElement: () => ({ href: '', pathname: '', search: '', origin: '' }),
23
+ head: { appendChild: () => { } },
24
+ };
25
+ }
26
+ // WeakRef polyfill for Cloudflare Workers
27
+ if (typeof WeakRef === 'undefined') {
28
+ // @ts-expect-error
29
+ globalThis.WeakRef = class WeakRef {
30
+ target;
31
+ constructor(target) {
32
+ this.target = target;
33
+ }
34
+ deref() {
35
+ return this.target;
36
+ }
37
+ };
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=polyfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfill.js","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,oEAAoE;AACpE,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAA;AACrD,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AACvE,UAAU,CAAC,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AAC7E,UAAU,CAAC,WAAW,CAAC,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAErE,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;IAC/C,UAAU,CAAC,QAAQ,GAAG;QACpB,IAAI,EAAE,gCAAgC;QACtC,MAAM,EAAE,+BAA+B;QACvC,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,uBAAuB;QACjC,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,GAAG;QACb,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,EAAE;KACG,CAAA;AACf,CAAC;AAED,IAAI,OAAO,UAAU,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;IAC/C,UAAU,CAAC,QAAQ,GAAG;QACpB,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACzE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;KACzB,CAAA;AACV,CAAC;AAED,0CAA0C;AAC1C,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;IACnC,mBAAmB;IACnB,UAAU,CAAC,OAAO,GAAG,MAAM,OAAO;QACxB,MAAM,CAAe;QAE7B,YAAY,MAAS;YACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACtB,CAAC;QAED,KAAK;YACH,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SyncBackendConstructor } from '@livestore/common';
2
+ import type { WSMessage } from '@livestore/sync-cf/common';
3
+ import type * as CfWorker from './cf-types.ts';
4
+ export type MakeDurableObjectSyncBackendOptions = {
5
+ /** WebSocket URL to connect to the sync backend Durable Object */
6
+ durableObject: CfWorker.DurableObjectStub;
7
+ };
8
+ /**
9
+ * Specialized sync backend used for Cloudflare Workers compatible only with `@livestore/sync-cf`
10
+ */
11
+ export declare const makeSyncProviderClient: ({ durableObject }: MakeDurableObjectSyncBackendOptions) => SyncBackendConstructor<WSMessage.SyncMetadata>;
12
+ //# sourceMappingURL=sync-provider-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-provider-client.d.ts","sourceRoot":"","sources":["../src/sync-provider-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAA;AAG9C,MAAM,MAAM,mCAAmC,GAAG;IAChD,kEAAkE;IAClE,aAAa,EAAE,QAAQ,CAAC,iBAAiB,CAAA;CAC1C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,GAChC,mBAAmB,mCAAmC,KAAG,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAqBtG,CAAA"}