@livestore/sync-cf 0.4.0 → 0.5.0-dev.1
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/README.md +5 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/cf-worker/do/durable-object.d.ts.map +1 -1
- package/dist/cf-worker/do/durable-object.js +53 -36
- package/dist/cf-worker/do/durable-object.js.map +1 -1
- package/dist/cf-worker/do/layer.d.ts +22 -18
- package/dist/cf-worker/do/layer.d.ts.map +1 -1
- package/dist/cf-worker/do/layer.js +45 -35
- package/dist/cf-worker/do/layer.js.map +1 -1
- package/dist/cf-worker/do/observability.d.ts +23 -0
- package/dist/cf-worker/do/observability.d.ts.map +1 -0
- package/dist/cf-worker/do/observability.js +52 -0
- package/dist/cf-worker/do/observability.js.map +1 -0
- package/dist/cf-worker/do/observability.test.d.ts +2 -0
- package/dist/cf-worker/do/observability.test.d.ts.map +1 -0
- package/dist/cf-worker/do/observability.test.js +204 -0
- package/dist/cf-worker/do/observability.test.js.map +1 -0
- package/dist/cf-worker/do/pull.d.ts +3 -3
- package/dist/cf-worker/do/pull.d.ts.map +1 -1
- package/dist/cf-worker/do/pull.js +19 -20
- package/dist/cf-worker/do/pull.js.map +1 -1
- package/dist/cf-worker/do/push.d.ts +16 -3
- package/dist/cf-worker/do/push.d.ts.map +1 -1
- package/dist/cf-worker/do/push.js +74 -53
- package/dist/cf-worker/do/push.js.map +1 -1
- package/dist/cf-worker/do/push.test.d.ts +2 -0
- package/dist/cf-worker/do/push.test.d.ts.map +1 -0
- package/dist/cf-worker/do/push.test.js +30 -0
- package/dist/cf-worker/do/push.test.js.map +1 -0
- package/dist/cf-worker/do/sqlite.d.ts +34 -46
- package/dist/cf-worker/do/sqlite.d.ts.map +1 -1
- package/dist/cf-worker/do/sqlite.js +2 -2
- package/dist/cf-worker/do/sqlite.js.map +1 -1
- package/dist/cf-worker/do/sync-storage.d.ts +7 -6
- package/dist/cf-worker/do/sync-storage.d.ts.map +1 -1
- package/dist/cf-worker/do/sync-storage.js +29 -17
- package/dist/cf-worker/do/sync-storage.js.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.d.ts +17 -2
- package/dist/cf-worker/do/transport/do-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.js +41 -23
- package/dist/cf-worker/do/transport/do-rpc-server.js.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.test.d.ts +2 -0
- package/dist/cf-worker/do/transport/do-rpc-server.test.d.ts.map +1 -0
- package/dist/cf-worker/do/transport/do-rpc-server.test.js +28 -0
- package/dist/cf-worker/do/transport/do-rpc-server.test.js.map +1 -0
- package/dist/cf-worker/do/transport/http-rpc-server.d.ts +2 -2
- package/dist/cf-worker/do/transport/http-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/http-rpc-server.js +12 -12
- package/dist/cf-worker/do/transport/http-rpc-server.js.map +1 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.d.ts +9 -2
- package/dist/cf-worker/do/transport/ws-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.js +37 -29
- package/dist/cf-worker/do/transport/ws-rpc-server.js.map +1 -1
- package/dist/cf-worker/mod.js +3 -3
- package/dist/cf-worker/shared.d.ts +37 -29
- package/dist/cf-worker/shared.d.ts.map +1 -1
- package/dist/cf-worker/shared.js +14 -12
- package/dist/cf-worker/shared.js.map +1 -1
- package/dist/cf-worker/worker.d.ts +9 -9
- package/dist/cf-worker/worker.d.ts.map +1 -1
- package/dist/cf-worker/worker.js +17 -15
- package/dist/cf-worker/worker.js.map +1 -1
- package/dist/client/mod.js +3 -3
- package/dist/client/transport/do-rpc-client.d.ts +18 -6
- package/dist/client/transport/do-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/do-rpc-client.js +112 -38
- package/dist/client/transport/do-rpc-client.js.map +1 -1
- package/dist/client/transport/do-rpc-client.test.d.ts +2 -0
- package/dist/client/transport/do-rpc-client.test.d.ts.map +1 -0
- package/dist/client/transport/do-rpc-client.test.js +268 -0
- package/dist/client/transport/do-rpc-client.test.js.map +1 -0
- package/dist/client/transport/http-rpc-client.d.ts +3 -3
- package/dist/client/transport/http-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/http-rpc-client.js +48 -29
- package/dist/client/transport/http-rpc-client.js.map +1 -1
- package/dist/client/transport/rpc-client-error.d.ts +5 -0
- package/dist/client/transport/rpc-client-error.d.ts.map +1 -0
- package/dist/client/transport/rpc-client-error.js +8 -0
- package/dist/client/transport/rpc-client-error.js.map +1 -0
- package/dist/client/transport/rpc-client-error.test.d.ts +2 -0
- package/dist/client/transport/rpc-client-error.test.d.ts.map +1 -0
- package/dist/client/transport/rpc-client-error.test.js +33 -0
- package/dist/client/transport/rpc-client-error.test.js.map +1 -0
- package/dist/client/transport/ws-rpc-client.d.ts +3 -3
- package/dist/client/transport/ws-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/ws-rpc-client.js +33 -23
- package/dist/client/transport/ws-rpc-client.js.map +1 -1
- package/dist/common/do-rpc-schema.d.ts +53 -41
- package/dist/common/do-rpc-schema.d.ts.map +1 -1
- package/dist/common/do-rpc-schema.js +13 -4
- package/dist/common/do-rpc-schema.js.map +1 -1
- package/dist/common/http-rpc-schema.d.ts +38 -39
- package/dist/common/http-rpc-schema.d.ts.map +1 -1
- package/dist/common/http-rpc-schema.js +6 -6
- package/dist/common/http-rpc-schema.js.map +1 -1
- package/dist/common/mod.d.ts +5 -5
- package/dist/common/mod.d.ts.map +1 -1
- package/dist/common/mod.js +7 -7
- package/dist/common/mod.js.map +1 -1
- package/dist/common/sync-message-types.d.ts +116 -133
- package/dist/common/sync-message-types.d.ts.map +1 -1
- package/dist/common/sync-message-types.js +26 -14
- package/dist/common/sync-message-types.js.map +1 -1
- package/dist/common/ws-rpc-schema.d.ts +33 -34
- package/dist/common/ws-rpc-schema.d.ts.map +1 -1
- package/dist/common/ws-rpc-schema.js +5 -5
- package/dist/common/ws-rpc-schema.js.map +1 -1
- package/package.json +42 -58
- package/src/cf-worker/do/durable-object.ts +70 -64
- package/src/cf-worker/do/layer.ts +142 -99
- package/src/cf-worker/do/observability.test.ts +337 -0
- package/src/cf-worker/do/observability.ts +121 -0
- package/src/cf-worker/do/pull.ts +28 -28
- package/src/cf-worker/do/push.test.ts +40 -0
- package/src/cf-worker/do/push.ts +139 -115
- package/src/cf-worker/do/sqlite.ts +1 -1
- package/src/cf-worker/do/sync-storage.ts +34 -21
- package/src/cf-worker/do/transport/do-rpc-server.test.ts +32 -0
- package/src/cf-worker/do/transport/do-rpc-server.ts +46 -35
- package/src/cf-worker/do/transport/http-rpc-server.ts +7 -10
- package/src/cf-worker/do/transport/ws-rpc-server.ts +52 -28
- package/src/cf-worker/shared.ts +29 -17
- package/src/cf-worker/worker.ts +21 -22
- package/src/client/transport/do-rpc-client.test.ts +411 -0
- package/src/client/transport/do-rpc-client.ts +175 -51
- package/src/client/transport/http-rpc-client.ts +66 -45
- package/src/client/transport/rpc-client-error.test.ts +41 -0
- package/src/client/transport/rpc-client-error.ts +9 -0
- package/src/client/transport/ws-rpc-client.ts +40 -32
- package/src/common/do-rpc-schema.ts +13 -3
- package/src/common/http-rpc-schema.ts +5 -5
- package/src/common/mod.ts +4 -4
- package/src/common/sync-message-types.ts +16 -16
- package/src/common/ws-rpc-schema.ts +4 -4
|
@@ -15,7 +15,7 @@ export type ValidatePayloadContext = {
|
|
|
15
15
|
* Options accepted by {@link makeWorker}. The Durable Object binding has to be
|
|
16
16
|
* supplied explicitly so we never fall back to deprecated defaults when Cloudflare config changes.
|
|
17
17
|
*/
|
|
18
|
-
export type MakeWorkerOptions<TEnv extends Env = Env, TSyncPayload = Schema.
|
|
18
|
+
export type MakeWorkerOptions<TEnv extends Env = Env, TSyncPayload = Schema.Json> = {
|
|
19
19
|
/**
|
|
20
20
|
* Binding name of the sync Durable Object declared in wrangler config.
|
|
21
21
|
*/
|
|
@@ -24,7 +24,7 @@ export type MakeWorkerOptions<TEnv extends Env = Env, TSyncPayload = Schema.Json
|
|
|
24
24
|
* Optionally pass a schema to decode the client-provided payload into a typed object
|
|
25
25
|
* before calling {@link validatePayload}. If omitted, the raw JSON value is forwarded.
|
|
26
26
|
*/
|
|
27
|
-
syncPayloadSchema?: Schema.
|
|
27
|
+
syncPayloadSchema?: Schema.Decoder<TSyncPayload>;
|
|
28
28
|
/**
|
|
29
29
|
* Validates the (optionally decoded) payload during WebSocket connection establishment.
|
|
30
30
|
* If {@link syncPayloadSchema} is provided, `payload` will be of the schema's inferred type.
|
|
@@ -54,13 +54,13 @@ export type MakeWorkerOptions<TEnv extends Env = Env, TSyncPayload = Schema.Json
|
|
|
54
54
|
* For more complex setups prefer implementing a custom `fetch` and call {@link handleSyncRequest}
|
|
55
55
|
* from the branch that handles LiveStore sync requests.
|
|
56
56
|
*/
|
|
57
|
-
export declare const makeWorker: <TEnv extends Env = Env, TDurableObjectRpc extends CfTypes.Rpc.DurableObjectBranded | undefined = undefined, TSyncPayload = Schema.
|
|
57
|
+
export declare const makeWorker: <TEnv extends Env = Env, TDurableObjectRpc extends CfTypes.Rpc.DurableObjectBranded | undefined = undefined, TSyncPayload = Schema.Json>(options: MakeWorkerOptions<TEnv, TSyncPayload>) => CFWorker<TEnv, TDurableObjectRpc>;
|
|
58
58
|
/**
|
|
59
59
|
* Handles LiveStore sync requests (e.g. with search params `?storeId=...&transport=...`).
|
|
60
60
|
*
|
|
61
61
|
* @example Token-based authentication
|
|
62
62
|
* ```ts
|
|
63
|
-
* const validatePayload = (payload: Schema.
|
|
63
|
+
* const validatePayload = (payload: Schema.Json | undefined, context: { storeId: string }) => {
|
|
64
64
|
* if (payload?.authToken !== 'insecure-token-change-me') {
|
|
65
65
|
* throw new Error('Invalid auth token')
|
|
66
66
|
* }
|
|
@@ -69,7 +69,7 @@ export declare const makeWorker: <TEnv extends Env = Env, TDurableObjectRpc exte
|
|
|
69
69
|
*
|
|
70
70
|
* @example Cookie-based authentication
|
|
71
71
|
* ```ts
|
|
72
|
-
* const validatePayload = async (payload: Schema.
|
|
72
|
+
* const validatePayload = async (payload: Schema.Json | undefined, { storeId, headers }) => {
|
|
73
73
|
* const cookie = headers.get('cookie')
|
|
74
74
|
* const session = await validateSessionFromCookie(cookie)
|
|
75
75
|
* if (!session) throw new Error('Unauthorized')
|
|
@@ -78,16 +78,16 @@ export declare const makeWorker: <TEnv extends Env = Env, TDurableObjectRpc exte
|
|
|
78
78
|
*
|
|
79
79
|
* @throws {UnknownError} If the payload is invalid
|
|
80
80
|
*/
|
|
81
|
-
export declare const handleSyncRequest: <TEnv extends Env = Env, TDurableObjectRpc extends CfTypes.Rpc.DurableObjectBranded | undefined = undefined, CFHostMetada = unknown, TSyncPayload = Schema.
|
|
81
|
+
export declare const handleSyncRequest: <TEnv extends Env = Env, TDurableObjectRpc extends CfTypes.Rpc.DurableObjectBranded | undefined = undefined, CFHostMetada = unknown, TSyncPayload = Schema.Json>({ request, searchParams: { storeId, payload, transport }, env: explicitlyProvidedEnv, syncBackendBinding, headers, validatePayload, syncPayloadSchema, }: {
|
|
82
82
|
request: CfTypes.Request<CFHostMetada>;
|
|
83
83
|
searchParams: SearchParams;
|
|
84
84
|
env?: TEnv | undefined;
|
|
85
85
|
/** Only there for type-level reasons */
|
|
86
86
|
ctx: CfTypes.ExecutionContext;
|
|
87
87
|
/** Binding name of the sync backend Durable Object */
|
|
88
|
-
syncBackendBinding: MakeWorkerOptions<TEnv, TSyncPayload>[
|
|
88
|
+
syncBackendBinding: MakeWorkerOptions<TEnv, TSyncPayload>['syncBackendBinding'];
|
|
89
89
|
headers?: CfTypes.HeadersInit | undefined;
|
|
90
|
-
validatePayload?: MakeWorkerOptions<TEnv, TSyncPayload>[
|
|
91
|
-
syncPayloadSchema?: MakeWorkerOptions<TEnv, TSyncPayload>[
|
|
90
|
+
validatePayload?: MakeWorkerOptions<TEnv, TSyncPayload>['validatePayload'];
|
|
91
|
+
syncPayloadSchema?: MakeWorkerOptions<TEnv, TSyncPayload>['syncPayloadSchema'];
|
|
92
92
|
}) => Promise<CfTypes.Response>;
|
|
93
93
|
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cf-worker/worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cf-worker/worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,OAAO,EAAkB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAAoB,MAAM,aAAa,CAAA;AAK/E,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,SAAS,GAAG,SAAS,IAAI;IAClH,KAAK,EAAE,CAAC,YAAY,GAAG,OAAO,EAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,EACtC,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,OAAO,CAAC,gBAAgB,KAC1B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC/B,CAAA;AAED,iDAAiD;AACjD,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,OAAO,EAAE,gBAAgB,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,GAAG,GAAG,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI;IAClF;;OAEG;IACH,kBAAkB,EAAE,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAA;IAC9D;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAChD;;;;;;;;;;;;;;;;;OAiBG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClG,qBAAqB;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GACrB,IAAI,SAAS,GAAG,GAAG,GAAG,EACtB,iBAAiB,SAAS,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,SAAS,GAAG,SAAS,EAClF,YAAY,GAAG,MAAM,CAAC,IAAI,WAEjB,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,KAC7C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAyDlC,CAAA;AAWD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,iBAAiB,GAC5B,IAAI,SAAS,GAAG,GAAG,GAAG,EACtB,iBAAiB,SAAS,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,SAAS,GAAG,SAAS,EAClF,YAAY,GAAG,OAAO,EACtB,YAAY,GAAG,MAAM,CAAC,IAAI,4JASzB;IACD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACtC,YAAY,EAAE,YAAY,CAAA;IAC1B,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;IACtB,wCAAwC;IACxC,GAAG,EAAE,OAAO,CAAC,gBAAgB,CAAA;IAC7B,sDAAsD;IACtD,kBAAkB,EAAE,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,oBAAoB,CAAC,CAAA;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,GAAG,SAAS,CAAA;IACzC,eAAe,CAAC,EAAE,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAA;IAC1E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,mBAAmB,CAAC,CAAA;CAC/E,KAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAiE0B,CAAA"}
|
package/dist/cf-worker/worker.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { env as importedEnv } from 'cloudflare:workers';
|
|
2
2
|
import { UnknownError } from '@livestore/common';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { CfDeclare } from '@livestore/common-cf/declare';
|
|
4
|
+
import { Effect, Result, Schema } from '@livestore/utils/effect';
|
|
5
|
+
import { matchSyncRequest } from './shared.js';
|
|
6
|
+
const Response = CfDeclare.Response;
|
|
5
7
|
/**
|
|
6
8
|
* Produces a Cloudflare Worker `fetch` handler that delegates sync traffic to the
|
|
7
9
|
* Durable Object identified by `syncBackendBinding`.
|
|
@@ -72,7 +74,7 @@ const requestHeadersToMap = (request) => {
|
|
|
72
74
|
*
|
|
73
75
|
* @example Token-based authentication
|
|
74
76
|
* ```ts
|
|
75
|
-
* const validatePayload = (payload: Schema.
|
|
77
|
+
* const validatePayload = (payload: Schema.Json | undefined, context: { storeId: string }) => {
|
|
76
78
|
* if (payload?.authToken !== 'insecure-token-change-me') {
|
|
77
79
|
* throw new Error('Invalid auth token')
|
|
78
80
|
* }
|
|
@@ -81,7 +83,7 @@ const requestHeadersToMap = (request) => {
|
|
|
81
83
|
*
|
|
82
84
|
* @example Cookie-based authentication
|
|
83
85
|
* ```ts
|
|
84
|
-
* const validatePayload = async (payload: Schema.
|
|
86
|
+
* const validatePayload = async (payload: Schema.Json | undefined, { storeId, headers }) => {
|
|
85
87
|
* const cookie = headers.get('cookie')
|
|
86
88
|
* const session = await validateSessionFromCookie(cookie)
|
|
87
89
|
* if (!session) throw new Error('Unauthorized')
|
|
@@ -97,23 +99,23 @@ export const handleSyncRequest = ({ request, searchParams: { storeId, payload, t
|
|
|
97
99
|
// Always decode with the supplied schema when present, even if payload is undefined.
|
|
98
100
|
// This ensures required payloads are enforced by the schema.
|
|
99
101
|
if (syncPayloadSchema !== undefined) {
|
|
100
|
-
const
|
|
101
|
-
if (
|
|
102
|
-
const message =
|
|
102
|
+
const decodedResult = Schema.decodeResult(syncPayloadSchema)(payload);
|
|
103
|
+
if (Result.isFailure(decodedResult) === true) {
|
|
104
|
+
const message = decodedResult.failure.toString();
|
|
103
105
|
console.error('Invalid payload (decode failed)', message);
|
|
104
106
|
return new Response(message, { status: 400, ...(headers !== undefined ? { headers } : {}) });
|
|
105
107
|
}
|
|
106
|
-
const result = yield* Effect.promise(async () => validatePayload(
|
|
107
|
-
if (result
|
|
108
|
-
console.error('Invalid payload (validation failed)', result.
|
|
109
|
-
return new Response(result.
|
|
108
|
+
const result = yield* Effect.promise(async () => validatePayload(decodedResult.success, { storeId, headers: requestHeaders })).pipe(UnknownError.mapToUnknownError, Effect.result);
|
|
109
|
+
if (Result.isFailure(result) === true) {
|
|
110
|
+
console.error('Invalid payload (validation failed)', result.failure);
|
|
111
|
+
return new Response(result.failure.toString(), { status: 400, ...(headers !== undefined ? { headers } : {}) });
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
114
|
else {
|
|
113
|
-
const result = yield* Effect.promise(async () => validatePayload(payload, { storeId, headers: requestHeaders })).pipe(UnknownError.mapToUnknownError, Effect.
|
|
114
|
-
if (result
|
|
115
|
-
console.error('Invalid payload (validation failed)', result.
|
|
116
|
-
return new Response(result.
|
|
115
|
+
const result = yield* Effect.promise(async () => validatePayload(payload, { storeId, headers: requestHeaders })).pipe(UnknownError.mapToUnknownError, Effect.result);
|
|
116
|
+
if (Result.isFailure(result) === true) {
|
|
117
|
+
console.error('Invalid payload (validation failed)', result.failure);
|
|
118
|
+
return new Response(result.failure.toString(), { status: 400, ...(headers !== undefined ? { headers } : {}) });
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/cf-worker/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/cf-worker/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/client/mod.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
1
|
+
export * from './transport/do-rpc-client.js';
|
|
2
|
+
export * from './transport/http-rpc-client.js';
|
|
3
|
+
export * from './transport/ws-rpc-client.js';
|
|
4
4
|
//# sourceMappingURL=mod.js.map
|
|
@@ -5,8 +5,16 @@ import type { SyncMetadata } from '../../common/sync-message-types.ts';
|
|
|
5
5
|
export interface SyncBackendRpcStub extends CfTypes.DurableObjectStub, SyncBackendRpcInterface {
|
|
6
6
|
}
|
|
7
7
|
export interface DoRpcSyncOptions {
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Returns a stub for the sync backend Durable Object. Called for every RPC call, because Cloudflare leaves a stub
|
|
10
|
+
* broken after many exceptions, so a retry needs a fresh one.
|
|
11
|
+
*/
|
|
12
|
+
getSyncBackendStub: () => SyncBackendRpcStub;
|
|
13
|
+
/**
|
|
14
|
+
* State handle of the client DurableObject running this sync backend. Scopes live-pull routing to
|
|
15
|
+
* this instance so it resets when the DO is reconstructed (see {@link handleSyncUpdateRpc}).
|
|
16
|
+
*/
|
|
17
|
+
durableObjectState: CfTypes.DurableObjectState;
|
|
10
18
|
/** Information about this DurableObject instance so the Sync DO instance can call back to this instance */
|
|
11
19
|
durableObjectContext: {
|
|
12
20
|
/** See `wrangler.toml` for the binding name */
|
|
@@ -20,8 +28,11 @@ export interface DoRpcSyncOptions {
|
|
|
20
28
|
*
|
|
21
29
|
* Used internally by `@livestore/adapter-cf` to connect to the sync backend.
|
|
22
30
|
*/
|
|
23
|
-
export declare const makeDoRpcSync: ({
|
|
31
|
+
export declare const makeDoRpcSync: ({ getSyncBackendStub, durableObjectState, durableObjectContext, }: DoRpcSyncOptions) => SyncBackend.SyncBackendConstructor<SyncMetadata>;
|
|
24
32
|
/**
|
|
33
|
+
* Routes an update from the sync backend into this client's live pull.
|
|
34
|
+
*
|
|
35
|
+
* Only `ctx` and `payload` go here; `storeId` is for reloading your store on a rebuilt DO (see example).
|
|
25
36
|
*
|
|
26
37
|
* ```ts
|
|
27
38
|
* import { DurableObject } from 'cloudflare:workers'
|
|
@@ -30,11 +41,12 @@ export declare const makeDoRpcSync: ({ syncBackendStub, durableObjectContext }:
|
|
|
30
41
|
* export class MyDurableObject extends DurableObject implements ClientDoWithRpcCallback {
|
|
31
42
|
* // ...
|
|
32
43
|
*
|
|
33
|
-
* async syncUpdateRpc(payload:
|
|
34
|
-
*
|
|
44
|
+
* async syncUpdateRpc(payload: Uint8Array<ArrayBuffer>, storeId: string) {
|
|
45
|
+
* await this.getStore(storeId)
|
|
46
|
+
* return handleSyncUpdateRpc(this.ctx, payload)
|
|
35
47
|
* }
|
|
36
48
|
* }
|
|
37
49
|
* ```
|
|
38
50
|
*/
|
|
39
|
-
export declare const handleSyncUpdateRpc: (payload:
|
|
51
|
+
export declare const handleSyncUpdateRpc: (ctx: CfTypes.DurableObjectState, payload: Uint8Array<ArrayBuffer>) => Promise<void>;
|
|
40
52
|
//# sourceMappingURL=do-rpc-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"do-rpc-client.d.ts","sourceRoot":"","sources":["../../../src/client/transport/do-rpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"do-rpc-client.d.ts","sourceRoot":"","sources":["../../../src/client/transport/do-rpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAgB,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EAAE,KAAK,OAAO,EAA8C,MAAM,sBAAsB,CAAA;AAuB/F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAIxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAItE,MAAM,WAAW,kBAAmB,SAAQ,OAAO,CAAC,iBAAiB,EAAE,uBAAuB;CAAG;AAEjG,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;IAC5C;;;OAGG;IACH,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,CAAA;IAC9C,2GAA2G;IAC3G,oBAAoB,EAAE;QACpB,+CAA+C;QAC/C,WAAW,EAAE,MAAM,CAAA;QACnB,sCAAsC;QACtC,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;CACF;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,sEAKrB,gBAAgB,KAAG,WAAW,CAAC,sBAAsB,CAAC,YAAY,CAgJV,CAAA;AAE7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,QAAS,OAAO,CAAC,kBAAkB,WAAW,UAAU,CAAC,WAAW,CAAC,kBAwBlG,CAAA"}
|
|
@@ -1,44 +1,59 @@
|
|
|
1
|
-
import { SyncBackend, UnknownError } from '@livestore/common';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { MAX_DO_RPC_REQUEST_BYTES, MAX_PUSH_EVENTS_PER_REQUEST } from
|
|
7
|
-
import { SyncDoRpc } from
|
|
8
|
-
import { SyncMessage } from
|
|
9
|
-
const requestIdMailboxMap = new Map();
|
|
1
|
+
import { IsOfflineError, SyncBackend, UnknownError } from '@livestore/common';
|
|
2
|
+
import { DoRpcReadError, layerProtocolDurableObject } from '@livestore/common-cf';
|
|
3
|
+
import { splitArrayBySize } from '@livestore/common/sync';
|
|
4
|
+
import { shouldNeverHappen } from '@livestore/utils';
|
|
5
|
+
import { Duration, Effect, identity, Layer, Match, Option, Predicate, Queue, Random, ReadonlyArray as EffectArray, Ref, RpcClient, RpcSerialization, Schema, Stream, Struct, SubscriptionRef, } from '@livestore/utils/effect';
|
|
6
|
+
import { MAX_DO_RPC_REQUEST_BYTES, MAX_PUSH_EVENTS_PER_REQUEST } from '../../common/constants.js';
|
|
7
|
+
import { SyncDoRpc } from '../../common/do-rpc-schema.js';
|
|
8
|
+
import { SyncMessage } from '../../common/mod.js';
|
|
10
9
|
/**
|
|
11
10
|
* Creates a sync backend that uses Durable Object RPC to communicate with the sync backend.
|
|
12
11
|
*
|
|
13
12
|
* Used internally by `@livestore/adapter-cf` to connect to the sync backend.
|
|
14
13
|
*/
|
|
15
|
-
export const makeDoRpcSync = ({
|
|
14
|
+
export const makeDoRpcSync = ({ getSyncBackendStub, durableObjectState, durableObjectContext, }) => ({ storeId, payload }) => Effect.gen(function* () {
|
|
16
15
|
const isConnected = yield* SubscriptionRef.make(true);
|
|
17
16
|
const ProtocolLive = layerProtocolDurableObject({
|
|
18
|
-
callRpc: (payload) =>
|
|
17
|
+
callRpc: (payload) => getSyncBackendStub().rpc(payload),
|
|
19
18
|
callerContext: durableObjectContext,
|
|
20
|
-
})
|
|
19
|
+
});
|
|
21
20
|
const context = yield* Layer.build(ProtocolLive);
|
|
22
21
|
const rpcClient = yield* RpcClient.make(SyncDoRpc).pipe(Effect.provide(context));
|
|
22
|
+
const pullBackoff = yield* makePullBackoff;
|
|
23
23
|
// Nothing to do here
|
|
24
24
|
const connect = Effect.void;
|
|
25
25
|
const backendIdHelper = yield* SyncBackend.makeBackendIdHelper;
|
|
26
|
-
const pull = (cursor, options) => rpcClient
|
|
26
|
+
const pull = (cursor, options) => rpcClient['SyncDoRpc.Pull']({
|
|
27
27
|
cursor: cursor.pipe(Option.map((a) => ({
|
|
28
28
|
eventSequenceNumber: a.eventSequenceNumber,
|
|
29
29
|
backendId: backendIdHelper.get().pipe(Option.getOrThrow),
|
|
30
30
|
}))),
|
|
31
31
|
storeId,
|
|
32
32
|
rpcContext: options?.live === true ? { callerContext: durableObjectContext } : undefined,
|
|
33
|
-
}).pipe(
|
|
33
|
+
}).pipe(
|
|
34
|
+
// Catch-up must make progress. Live callbacks below may legitimately remain idle indefinitely.
|
|
35
|
+
Stream.timeoutOrElse({
|
|
36
|
+
duration: '60 seconds',
|
|
37
|
+
orElse: () => Stream.fail(new IsOfflineError({ cause: new Error('DO-RPC pull made no progress for 60 seconds') })),
|
|
38
|
+
}), options?.live === true
|
|
34
39
|
? Stream.concatWithLastElement((res) => Effect.gen(function* () {
|
|
35
40
|
if (res._tag === 'None')
|
|
36
41
|
return shouldNeverHappen('There should at least be a no-more page info response');
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
const requestId = res.value.rpcRequestId;
|
|
43
|
+
const routing = pullRoutingFor(durableObjectState);
|
|
44
|
+
const queue = yield* Effect.acquireRelease(Queue.unbounded(), (queue) =>
|
|
45
|
+
// Drop the routing entry on release so it can't outlive its (now shut-down) queue
|
|
46
|
+
Effect.sync(() => routing.delete(requestId)).pipe(Effect.andThen(Queue.shutdown(queue))));
|
|
47
|
+
routing.set(requestId, queue);
|
|
48
|
+
// Graceful shutdown only (eviction runs no finalizers); matched on requestId so a late send can't drop a newer pull's row
|
|
49
|
+
yield* Effect.addFinalizer(() => rpcClient['SyncDoRpc.Unsubscribe']({
|
|
50
|
+
storeId,
|
|
51
|
+
durableObjectId: durableObjectContext.durableObjectId,
|
|
52
|
+
requestId,
|
|
53
|
+
}).pipe(Effect.timeout('5 seconds'), Effect.tapCauseLogPretty, Effect.ignore));
|
|
54
|
+
return Stream.fromQueue(queue);
|
|
55
|
+
}).pipe(Stream.unwrap))
|
|
56
|
+
: identity, Stream.catchReason('RpcClientError', 'RpcClientDefect', (reason) => Stream.fromEffect(classifyTransportFailure(reason.cause))), Stream.tapError((error) => (error._tag === 'IsOfflineError' ? pullBackoff.wait : Effect.void)), Stream.tap((res) => (res.pageInfo._tag === 'NoMore' ? pullBackoff.reset : Effect.void)), Stream.tap((res) => backendIdHelper.lazySet(res.backendId)), Stream.map((res) => Struct.omit(res, ['backendId'])), Stream.mapError((cause) => cause._tag === 'UnknownError' || cause._tag === 'BackendIdMismatchError' || cause._tag === 'IsOfflineError'
|
|
42
57
|
? cause
|
|
43
58
|
: new UnknownError({ cause })), Stream.withSpan('rpc-sync-client:pull'));
|
|
44
59
|
const push = Effect.fn('rpc-sync-client:push')(function* (batch) {
|
|
@@ -46,7 +61,10 @@ export const makeDoRpcSync = ({ syncBackendStub, durableObjectContext }) => ({ s
|
|
|
46
61
|
return;
|
|
47
62
|
}
|
|
48
63
|
const backendId = backendIdHelper.get();
|
|
49
|
-
|
|
64
|
+
if (EffectArray.isReadonlyArrayNonEmpty(batch) === false) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const batchChunks = yield* splitArrayBySize({
|
|
50
68
|
maxItems: MAX_PUSH_EVENTS_PER_REQUEST,
|
|
51
69
|
maxBytes: MAX_DO_RPC_REQUEST_BYTES,
|
|
52
70
|
encode: (items) => ({
|
|
@@ -54,18 +72,20 @@ export const makeDoRpcSync = ({ syncBackendStub, durableObjectContext }) => ({ s
|
|
|
54
72
|
storeId,
|
|
55
73
|
backendId,
|
|
56
74
|
}),
|
|
57
|
-
})
|
|
58
|
-
for (const
|
|
59
|
-
|
|
60
|
-
yield* rpcClient.SyncDoRpc.Push({ batch: chunkArray, storeId, backendId });
|
|
75
|
+
})(batch).pipe(Effect.mapError((cause) => new UnknownError({ cause })));
|
|
76
|
+
for (const batchChunk of batchChunks) {
|
|
77
|
+
yield* rpcClient['SyncDoRpc.Push']({ batch: batchChunk, storeId, backendId });
|
|
61
78
|
}
|
|
62
|
-
}, Effect.
|
|
79
|
+
}, Effect.catchReason('RpcClientError', 'RpcClientDefect', (reason) => classifyTransportFailure(reason.cause)), Effect.mapError((cause) => cause._tag === 'UnknownError' ||
|
|
80
|
+
cause._tag === 'ServerAheadError' ||
|
|
81
|
+
cause._tag === 'BackendIdMismatchError' ||
|
|
82
|
+
cause._tag === 'IsOfflineError'
|
|
63
83
|
? cause
|
|
64
84
|
: new UnknownError({ cause })));
|
|
65
|
-
const ping = rpcClient
|
|
85
|
+
const ping = rpcClient['SyncDoRpc.Ping']({
|
|
66
86
|
storeId,
|
|
67
87
|
payload,
|
|
68
|
-
}).pipe(
|
|
88
|
+
}).pipe(Effect.catchReason('RpcClientError', 'RpcClientDefect', (reason) => classifyTransportFailure(reason.cause)), Effect.mapError((cause) => (cause._tag === 'IsOfflineError' ? cause : new UnknownError({ cause }))), Effect.withSpan('rpc-sync-client:ping'));
|
|
69
89
|
return SyncBackend.of({
|
|
70
90
|
connect,
|
|
71
91
|
isConnected,
|
|
@@ -85,6 +105,9 @@ export const makeDoRpcSync = ({ syncBackendStub, durableObjectContext }) => ({ s
|
|
|
85
105
|
});
|
|
86
106
|
}).pipe(Effect.withSpan('rpc-sync-client:makeDoRpcSync'));
|
|
87
107
|
/**
|
|
108
|
+
* Routes an update from the sync backend into this client's live pull.
|
|
109
|
+
*
|
|
110
|
+
* Only `ctx` and `payload` go here; `storeId` is for reloading your store on a rebuilt DO (see example).
|
|
88
111
|
*
|
|
89
112
|
* ```ts
|
|
90
113
|
* import { DurableObject } from 'cloudflare:workers'
|
|
@@ -93,27 +116,78 @@ export const makeDoRpcSync = ({ syncBackendStub, durableObjectContext }) => ({ s
|
|
|
93
116
|
* export class MyDurableObject extends DurableObject implements ClientDoWithRpcCallback {
|
|
94
117
|
* // ...
|
|
95
118
|
*
|
|
96
|
-
* async syncUpdateRpc(payload:
|
|
97
|
-
*
|
|
119
|
+
* async syncUpdateRpc(payload: Uint8Array<ArrayBuffer>, storeId: string) {
|
|
120
|
+
* await this.getStore(storeId)
|
|
121
|
+
* return handleSyncUpdateRpc(this.ctx, payload)
|
|
98
122
|
* }
|
|
99
123
|
* }
|
|
100
124
|
* ```
|
|
101
125
|
*/
|
|
102
|
-
export const handleSyncUpdateRpc = (payload) => Effect.gen(function* () {
|
|
103
|
-
const
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
|
|
126
|
+
export const handleSyncUpdateRpc = (ctx, payload) => Effect.gen(function* () {
|
|
127
|
+
const serialization = yield* RpcSerialization.RpcSerialization;
|
|
128
|
+
const parser = serialization.makeUnsafe();
|
|
129
|
+
const [response] = parser.decode(payload);
|
|
130
|
+
const decodedPayload = yield* Schema.decodeUnknownEffect(ResponseChunkEncoded)(response);
|
|
131
|
+
const decoded = yield* Schema.decodeEffect(serialization.codecFor(Schema.NonEmptyArray(SyncMessage.PullResponse)))(decodedPayload.values);
|
|
132
|
+
const pullStreamQueue = pullRoutingFor(ctx).get(decodedPayload.requestId);
|
|
133
|
+
if (pullStreamQueue === undefined) {
|
|
107
134
|
// Case: DO was hibernated, so we need to manually update the store
|
|
108
|
-
yield* Effect.log(`No
|
|
135
|
+
yield* Effect.log(`No pull stream queue found for ${decodedPayload.requestId}`);
|
|
109
136
|
}
|
|
110
137
|
else {
|
|
111
138
|
// Case: DO was still alive, so the existing `pull` will pick up the new events
|
|
112
|
-
yield*
|
|
139
|
+
yield* Queue.offerAll(pullStreamQueue, decoded);
|
|
113
140
|
}
|
|
114
|
-
}).pipe(Effect.withSpan('rpc-sync-client:rpcCallback'), Effect.tapCauseLogPretty, Effect.runPromise);
|
|
141
|
+
}).pipe(Effect.provide(RpcSerialization.layerSchemaBinary()), Effect.withSpan('rpc-sync-client:rpcCallback'), Effect.tapCauseLogPretty, Effect.runPromise);
|
|
115
142
|
const ResponseChunkEncoded = Schema.Struct({
|
|
116
143
|
requestId: Schema.String,
|
|
117
|
-
values: Schema.
|
|
144
|
+
values: Schema.Uint8Array,
|
|
145
|
+
});
|
|
146
|
+
/**
|
|
147
|
+
* Per-instance map from a live pull's request id to its response queue, keyed off the client DO's
|
|
148
|
+
* `DurableObjectState` (not a module global) for two independent reasons:
|
|
149
|
+
* - Per-instance: a reconstructed DO starts empty, so a reverse-RPC whose store is gone hits the
|
|
150
|
+
* `handleSyncUpdateRpc` drop branch (the recovery hook) instead of a stale queue that outlived it.
|
|
151
|
+
* - Keyed by request id: a late chunk from a superseded pull generation finds no entry and is
|
|
152
|
+
* dropped here — never reaching `SyncState.merge`, which dies on an event at/below the upstream head.
|
|
153
|
+
*/
|
|
154
|
+
const pullRoutingByInstance = new WeakMap();
|
|
155
|
+
const pullRoutingFor = (ctx) => {
|
|
156
|
+
const existing = pullRoutingByInstance.get(ctx);
|
|
157
|
+
if (existing !== undefined)
|
|
158
|
+
return existing;
|
|
159
|
+
const routing = new Map();
|
|
160
|
+
pullRoutingByInstance.set(ctx, routing);
|
|
161
|
+
return routing;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Calls require Cloudflare's retryable flag. Transferred streams can lose those flags, so unflagged read
|
|
165
|
+
* failures are also offline (application failures arrive as encoded RPC exits). Explicit overload and
|
|
166
|
+
* non-retryable remote errors stay terminal.
|
|
167
|
+
* https://developers.cloudflare.com/durable-objects/best-practices/error-handling/
|
|
168
|
+
*/
|
|
169
|
+
const classifyTransportFailure = (failure) => {
|
|
170
|
+
const cause = failure instanceof DoRpcReadError ? failure.cause : failure;
|
|
171
|
+
return Match.value({
|
|
172
|
+
retryable: hasTrueFlag(cause, 'retryable') || (failure instanceof DoRpcReadError && hasTrueFlag(cause, 'remote') === false),
|
|
173
|
+
overloaded: hasTrueFlag(cause, 'overloaded'),
|
|
174
|
+
}).pipe(Match.when({ overloaded: true }, () => Effect.die(cause)), Match.when({ retryable: true }, () => Effect.fail(new IsOfflineError({ cause }))), Match.orElse(() => Effect.die(cause)));
|
|
175
|
+
};
|
|
176
|
+
const hasTrueFlag = (cause, flag) => Predicate.hasProperty(cause, flag) === true && cause[flag] === true;
|
|
177
|
+
/**
|
|
178
|
+
* This transport delays retryable failures before surfacing them, independently of the leader's connectivity gate.
|
|
179
|
+
* The attempt count spans pull calls and resets only when a pull completes its catch-up, so a pull that delivers a
|
|
180
|
+
* page and then fails does not reset it.
|
|
181
|
+
*/
|
|
182
|
+
const makePullBackoff = Effect.gen(function* () {
|
|
183
|
+
const attempt = yield* Ref.make(0);
|
|
184
|
+
return {
|
|
185
|
+
wait: Effect.gen(function* () {
|
|
186
|
+
const n = yield* Ref.getAndUpdate(attempt, (n) => n + 1);
|
|
187
|
+
const jitter = yield* Random.nextBetween(0.8, 1.2);
|
|
188
|
+
yield* Effect.sleep(Duration.millis(Math.min(1_000 * 2 ** n, 30_000) * jitter));
|
|
189
|
+
}),
|
|
190
|
+
reset: Ref.set(attempt, 0),
|
|
191
|
+
};
|
|
118
192
|
});
|
|
119
193
|
//# sourceMappingURL=do-rpc-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"do-rpc-client.js","sourceRoot":"","sources":["../../../src/client/transport/do-rpc-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"do-rpc-client.js","sourceRoot":"","sources":["../../../src/client/transport/do-rpc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"do-rpc-client.test.d.ts","sourceRoot":"","sources":["../../../src/client/transport/do-rpc-client.test.ts"],"names":[],"mappings":""}
|