@livestore/adapter-cloudflare 0.4.0-dev.20 → 0.4.0-dev.22
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/create-store-do.d.ts +65 -0
- package/dist/create-store-do.d.ts.map +1 -1
- package/dist/create-store-do.js +65 -0
- package/dist/create-store-do.js.map +1 -1
- package/dist/make-adapter.d.ts.map +1 -1
- package/dist/make-adapter.js +11 -2
- package/dist/make-adapter.js.map +1 -1
- package/package.json +7 -7
- package/src/create-store-do.ts +65 -0
- package/src/make-adapter.ts +18 -2
|
@@ -39,6 +39,71 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema, TEnv, TState>
|
|
|
39
39
|
*/
|
|
40
40
|
resetPersistence?: boolean;
|
|
41
41
|
} & LogConfig.WithLoggerOptions;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a LiveStore instance inside a Cloudflare Durable Object.
|
|
44
|
+
*
|
|
45
|
+
* This function bootstraps a full LiveStore client within a Durable Object, enabling
|
|
46
|
+
* persistent state management with automatic sync to a sync backend. Use this when you
|
|
47
|
+
* need server-side LiveStore instances that can communicate with other clients.
|
|
48
|
+
*
|
|
49
|
+
* Returns an Effect that resolves to a Store instance. For a Promise-based API,
|
|
50
|
+
* use `createStoreDoPromise` instead.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { createStoreDo } from '@livestore/adapter-cloudflare'
|
|
55
|
+
* import { schema } from './schema'
|
|
56
|
+
*
|
|
57
|
+
* export class MyDurableObject extends DurableObject {
|
|
58
|
+
* store: Store | undefined
|
|
59
|
+
*
|
|
60
|
+
* async fetch(request: Request) {
|
|
61
|
+
* if (!this.store) {
|
|
62
|
+
* this.store = await createStoreDo({
|
|
63
|
+
* schema,
|
|
64
|
+
* storeId: 'my-store',
|
|
65
|
+
* clientId: this.ctx.id.toString(),
|
|
66
|
+
* sessionId: 'do-session',
|
|
67
|
+
* durableObject: {
|
|
68
|
+
* ctx: this.ctx,
|
|
69
|
+
* env: this.env,
|
|
70
|
+
* bindingName: 'MY_DO',
|
|
71
|
+
* },
|
|
72
|
+
* syncBackendStub: this.env.SYNC_BACKEND_DO.get(syncBackendId),
|
|
73
|
+
* }).pipe(Effect.runPromise)
|
|
74
|
+
* }
|
|
75
|
+
* // Use this.store...
|
|
76
|
+
* }
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* @see https://livestore.dev/docs/reference/adapters/cloudflare for setup guide
|
|
81
|
+
*/
|
|
42
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>;
|
|
83
|
+
/**
|
|
84
|
+
* Promise-based wrapper around `createStoreDo` for simpler async/await usage.
|
|
85
|
+
*
|
|
86
|
+
* Equivalent to calling `createStoreDo(options).pipe(Effect.runPromise)` with
|
|
87
|
+
* logging configured automatically.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* import { createStoreDoPromise } from '@livestore/adapter-cloudflare'
|
|
92
|
+
*
|
|
93
|
+
* export class MyDurableObject extends DurableObject {
|
|
94
|
+
* async fetch(request: Request) {
|
|
95
|
+
* const store = await createStoreDoPromise({
|
|
96
|
+
* schema,
|
|
97
|
+
* storeId: 'my-store',
|
|
98
|
+
* clientId: this.ctx.id.toString(),
|
|
99
|
+
* sessionId: 'do-session',
|
|
100
|
+
* durableObject: { ctx: this.ctx, env: this.env, bindingName: 'MY_DO' },
|
|
101
|
+
* syncBackendStub: this.env.SYNC_BACKEND_DO.get(syncBackendId),
|
|
102
|
+
* })
|
|
103
|
+
* // Use store...
|
|
104
|
+
* }
|
|
105
|
+
* }
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
43
108
|
export declare const createStoreDoPromise: <TSchema extends LiveStoreSchema, TEnv, TState extends CfTypes.DurableObjectState = CfTypes.DurableObjectState>(options: CreateStoreDoOptions<TSchema, TEnv, TState>) => Promise<import("@livestore/livestore").Store<TSchema, {}>>;
|
|
44
109
|
//# sourceMappingURL=create-store-do.d.ts.map
|
|
@@ -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;AAC7C,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;AAG/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;CAC3B,GAAG,SAAS,CAAC,iBAAiB,CAAA;
|
|
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;AAC7C,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;AAG/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;CAC3B,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,uGASC,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
|
@@ -3,6 +3,46 @@ import { createStore, provideOtel } from '@livestore/livestore';
|
|
|
3
3
|
import { makeDoRpcSync } from '@livestore/sync-cf/client';
|
|
4
4
|
import { Effect, Logger, Scope } from '@livestore/utils/effect';
|
|
5
5
|
import { makeAdapter } from "./make-adapter.js";
|
|
6
|
+
/**
|
|
7
|
+
* Creates a LiveStore instance inside a Cloudflare Durable Object.
|
|
8
|
+
*
|
|
9
|
+
* This function bootstraps a full LiveStore client within a Durable Object, enabling
|
|
10
|
+
* persistent state management with automatic sync to a sync backend. Use this when you
|
|
11
|
+
* need server-side LiveStore instances that can communicate with other clients.
|
|
12
|
+
*
|
|
13
|
+
* Returns an Effect that resolves to a Store instance. For a Promise-based API,
|
|
14
|
+
* use `createStoreDoPromise` instead.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { createStoreDo } from '@livestore/adapter-cloudflare'
|
|
19
|
+
* import { schema } from './schema'
|
|
20
|
+
*
|
|
21
|
+
* export class MyDurableObject extends DurableObject {
|
|
22
|
+
* store: Store | undefined
|
|
23
|
+
*
|
|
24
|
+
* async fetch(request: Request) {
|
|
25
|
+
* if (!this.store) {
|
|
26
|
+
* this.store = await createStoreDo({
|
|
27
|
+
* schema,
|
|
28
|
+
* storeId: 'my-store',
|
|
29
|
+
* clientId: this.ctx.id.toString(),
|
|
30
|
+
* sessionId: 'do-session',
|
|
31
|
+
* durableObject: {
|
|
32
|
+
* ctx: this.ctx,
|
|
33
|
+
* env: this.env,
|
|
34
|
+
* bindingName: 'MY_DO',
|
|
35
|
+
* },
|
|
36
|
+
* syncBackendStub: this.env.SYNC_BACKEND_DO.get(syncBackendId),
|
|
37
|
+
* }).pipe(Effect.runPromise)
|
|
38
|
+
* }
|
|
39
|
+
* // Use this.store...
|
|
40
|
+
* }
|
|
41
|
+
* }
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @see https://livestore.dev/docs/reference/adapters/cloudflare for setup guide
|
|
45
|
+
*/
|
|
6
46
|
// TODO Also support in Cloudflare workers outside of a durable object context.
|
|
7
47
|
export const createStoreDo = ({ schema, storeId, clientId, sessionId, durableObject, syncBackendStub, livePull = false, resetPersistence = false, }) => Effect.gen(function* () {
|
|
8
48
|
const { ctx, bindingName } = durableObject;
|
|
@@ -25,6 +65,31 @@ export const createStoreDo = ({ schema, storeId, clientId, sessionId, durableObj
|
|
|
25
65
|
});
|
|
26
66
|
return yield* createStore({ schema, adapter, storeId }).pipe(Scope.extend(scope), provideOtel({}));
|
|
27
67
|
});
|
|
68
|
+
/**
|
|
69
|
+
* Promise-based wrapper around `createStoreDo` for simpler async/await usage.
|
|
70
|
+
*
|
|
71
|
+
* Equivalent to calling `createStoreDo(options).pipe(Effect.runPromise)` with
|
|
72
|
+
* logging configured automatically.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* import { createStoreDoPromise } from '@livestore/adapter-cloudflare'
|
|
77
|
+
*
|
|
78
|
+
* export class MyDurableObject extends DurableObject {
|
|
79
|
+
* async fetch(request: Request) {
|
|
80
|
+
* const store = await createStoreDoPromise({
|
|
81
|
+
* schema,
|
|
82
|
+
* storeId: 'my-store',
|
|
83
|
+
* clientId: this.ctx.id.toString(),
|
|
84
|
+
* sessionId: 'do-session',
|
|
85
|
+
* durableObject: { ctx: this.ctx, env: this.env, bindingName: 'MY_DO' },
|
|
86
|
+
* syncBackendStub: this.env.SYNC_BACKEND_DO.get(syncBackendId),
|
|
87
|
+
* })
|
|
88
|
+
* // Use store...
|
|
89
|
+
* }
|
|
90
|
+
* }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
28
93
|
export const createStoreDoPromise = (options) => createStoreDo(options).pipe(LogConfig.withLoggerConfig(options, {
|
|
29
94
|
threadName: 'DoClient',
|
|
30
95
|
defaultLogger: Logger.consoleWithThread('DoClient'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-store-do.js","sourceRoot":"","sources":["../src/create-store-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,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;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAwC/C,+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,GACoB,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,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;SACvD;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,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
|
+
{"version":3,"file":"create-store-do.js","sourceRoot":"","sources":["../src/create-store-do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,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;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAwC/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,GACoB,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,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;SACvD;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;AAQ1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAMnD,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,OAiJD,CAAA"}
|
package/dist/make-adapter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ClientSessionLeaderThreadProxy, liveStoreStorageFormatVersion, makeClientSession, UnknownError, } from '@livestore/common';
|
|
2
|
-
import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer } from '@livestore/common/leader-thread';
|
|
2
|
+
import { Eventlog, LeaderThreadCtx, makeLeaderThreadLayer, streamEventsWithSyncState, } from '@livestore/common/leader-thread';
|
|
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';
|
|
@@ -57,8 +57,17 @@ export const makeAdapter = ({ storage, clientId, syncOptions, sessionId, resetPe
|
|
|
57
57
|
events: {
|
|
58
58
|
pull: ({ cursor }) => syncProcessor.pull({ cursor }),
|
|
59
59
|
push: (batch) => syncProcessor.push(batch.map((item) => new LiveStoreEvent.Client.EncodedWithMeta(item)), { waitForProcessing: true }),
|
|
60
|
+
stream: (options) => streamEventsWithSyncState({
|
|
61
|
+
dbEventlog,
|
|
62
|
+
syncState: syncProcessor.syncState,
|
|
63
|
+
options,
|
|
64
|
+
}),
|
|
65
|
+
},
|
|
66
|
+
initialState: {
|
|
67
|
+
leaderHead: initialLeaderHead,
|
|
68
|
+
migrationsReport: initialState.migrationsReport,
|
|
69
|
+
storageMode: 'persisted',
|
|
60
70
|
},
|
|
61
|
-
initialState: { leaderHead: initialLeaderHead, migrationsReport: initialState.migrationsReport },
|
|
62
71
|
export: Effect.sync(() => dbState.export()),
|
|
63
72
|
getEventlogData: Effect.sync(() => dbEventlog.export()),
|
|
64
73
|
syncState: syncProcessor.syncState,
|
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;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"make-adapter.js","sourceRoot":"","sources":["../src/make-adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/adapter-cloudflare",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.22",
|
|
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.20251118.0",
|
|
15
|
-
"@livestore/common": "0.4.0-dev.
|
|
16
|
-
"@livestore/common-cf": "0.4.0-dev.
|
|
17
|
-
"@livestore/sqlite-wasm": "0.4.0-dev.
|
|
18
|
-
"@livestore/
|
|
19
|
-
"@livestore/
|
|
20
|
-
"@livestore/utils": "0.4.0-dev.
|
|
15
|
+
"@livestore/common": "0.4.0-dev.22",
|
|
16
|
+
"@livestore/common-cf": "0.4.0-dev.22",
|
|
17
|
+
"@livestore/sqlite-wasm": "0.4.0-dev.22",
|
|
18
|
+
"@livestore/sync-cf": "0.4.0-dev.22",
|
|
19
|
+
"@livestore/livestore": "0.4.0-dev.22",
|
|
20
|
+
"@livestore/utils": "0.4.0-dev.22"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"wrangler": "4.42.2"
|
package/src/create-store-do.ts
CHANGED
|
@@ -44,6 +44,46 @@ export type CreateStoreDoOptions<TSchema extends LiveStoreSchema, TEnv, TState>
|
|
|
44
44
|
resetPersistence?: boolean
|
|
45
45
|
} & LogConfig.WithLoggerOptions
|
|
46
46
|
|
|
47
|
+
/**
|
|
48
|
+
* Creates a LiveStore instance inside a Cloudflare Durable Object.
|
|
49
|
+
*
|
|
50
|
+
* This function bootstraps a full LiveStore client within a Durable Object, enabling
|
|
51
|
+
* persistent state management with automatic sync to a sync backend. Use this when you
|
|
52
|
+
* need server-side LiveStore instances that can communicate with other clients.
|
|
53
|
+
*
|
|
54
|
+
* Returns an Effect that resolves to a Store instance. For a Promise-based API,
|
|
55
|
+
* use `createStoreDoPromise` instead.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { createStoreDo } from '@livestore/adapter-cloudflare'
|
|
60
|
+
* import { schema } from './schema'
|
|
61
|
+
*
|
|
62
|
+
* export class MyDurableObject extends DurableObject {
|
|
63
|
+
* store: Store | undefined
|
|
64
|
+
*
|
|
65
|
+
* async fetch(request: Request) {
|
|
66
|
+
* if (!this.store) {
|
|
67
|
+
* this.store = await createStoreDo({
|
|
68
|
+
* schema,
|
|
69
|
+
* storeId: 'my-store',
|
|
70
|
+
* clientId: this.ctx.id.toString(),
|
|
71
|
+
* sessionId: 'do-session',
|
|
72
|
+
* durableObject: {
|
|
73
|
+
* ctx: this.ctx,
|
|
74
|
+
* env: this.env,
|
|
75
|
+
* bindingName: 'MY_DO',
|
|
76
|
+
* },
|
|
77
|
+
* syncBackendStub: this.env.SYNC_BACKEND_DO.get(syncBackendId),
|
|
78
|
+
* }).pipe(Effect.runPromise)
|
|
79
|
+
* }
|
|
80
|
+
* // Use this.store...
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @see https://livestore.dev/docs/reference/adapters/cloudflare for setup guide
|
|
86
|
+
*/
|
|
47
87
|
// TODO Also support in Cloudflare workers outside of a durable object context.
|
|
48
88
|
export const createStoreDo = <
|
|
49
89
|
TSchema extends LiveStoreSchema,
|
|
@@ -83,6 +123,31 @@ export const createStoreDo = <
|
|
|
83
123
|
return yield* createStore({ schema, adapter, storeId }).pipe(Scope.extend(scope), provideOtel({}))
|
|
84
124
|
})
|
|
85
125
|
|
|
126
|
+
/**
|
|
127
|
+
* Promise-based wrapper around `createStoreDo` for simpler async/await usage.
|
|
128
|
+
*
|
|
129
|
+
* Equivalent to calling `createStoreDo(options).pipe(Effect.runPromise)` with
|
|
130
|
+
* logging configured automatically.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* import { createStoreDoPromise } from '@livestore/adapter-cloudflare'
|
|
135
|
+
*
|
|
136
|
+
* export class MyDurableObject extends DurableObject {
|
|
137
|
+
* async fetch(request: Request) {
|
|
138
|
+
* const store = await createStoreDoPromise({
|
|
139
|
+
* schema,
|
|
140
|
+
* storeId: 'my-store',
|
|
141
|
+
* clientId: this.ctx.id.toString(),
|
|
142
|
+
* sessionId: 'do-session',
|
|
143
|
+
* durableObject: { ctx: this.ctx, env: this.env, bindingName: 'MY_DO' },
|
|
144
|
+
* syncBackendStub: this.env.SYNC_BACKEND_DO.get(syncBackendId),
|
|
145
|
+
* })
|
|
146
|
+
* // Use store...
|
|
147
|
+
* }
|
|
148
|
+
* }
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
86
151
|
export const createStoreDoPromise = <
|
|
87
152
|
TSchema extends LiveStoreSchema,
|
|
88
153
|
TEnv,
|
package/src/make-adapter.ts
CHANGED
|
@@ -7,7 +7,13 @@ import {
|
|
|
7
7
|
type SyncOptions,
|
|
8
8
|
UnknownError,
|
|
9
9
|
} from '@livestore/common'
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
type DevtoolsOptions,
|
|
12
|
+
Eventlog,
|
|
13
|
+
LeaderThreadCtx,
|
|
14
|
+
makeLeaderThreadLayer,
|
|
15
|
+
streamEventsWithSyncState,
|
|
16
|
+
} from '@livestore/common/leader-thread'
|
|
11
17
|
import type { CfTypes } from '@livestore/common-cf'
|
|
12
18
|
import { LiveStoreEvent } from '@livestore/livestore'
|
|
13
19
|
import { sqliteDbFactory } from '@livestore/sqlite-wasm/cf'
|
|
@@ -112,8 +118,18 @@ export const makeAdapter =
|
|
|
112
118
|
batch.map((item) => new LiveStoreEvent.Client.EncodedWithMeta(item)),
|
|
113
119
|
{ waitForProcessing: true },
|
|
114
120
|
),
|
|
121
|
+
stream: (options) =>
|
|
122
|
+
streamEventsWithSyncState({
|
|
123
|
+
dbEventlog,
|
|
124
|
+
syncState: syncProcessor.syncState,
|
|
125
|
+
options,
|
|
126
|
+
}),
|
|
127
|
+
},
|
|
128
|
+
initialState: {
|
|
129
|
+
leaderHead: initialLeaderHead,
|
|
130
|
+
migrationsReport: initialState.migrationsReport,
|
|
131
|
+
storageMode: 'persisted',
|
|
115
132
|
},
|
|
116
|
-
initialState: { leaderHead: initialLeaderHead, migrationsReport: initialState.migrationsReport },
|
|
117
133
|
export: Effect.sync(() => dbState.export()),
|
|
118
134
|
getEventlogData: Effect.sync(() => dbEventlog.export()),
|
|
119
135
|
syncState: syncProcessor.syncState,
|