@livestore/sync-cf 0.4.0-dev.8 → 0.4.0
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 +7 -8
- package/dist/.tsbuildinfo +1 -1
- package/dist/cf-worker/do/durable-object.d.ts +1 -1
- package/dist/cf-worker/do/durable-object.d.ts.map +1 -1
- package/dist/cf-worker/do/durable-object.js +15 -14
- package/dist/cf-worker/do/durable-object.js.map +1 -1
- package/dist/cf-worker/do/layer.d.ts +6 -6
- package/dist/cf-worker/do/layer.d.ts.map +1 -1
- package/dist/cf-worker/do/layer.js +32 -9
- package/dist/cf-worker/do/layer.js.map +1 -1
- package/dist/cf-worker/do/pull.d.ts +8 -3
- package/dist/cf-worker/do/pull.d.ts.map +1 -1
- package/dist/cf-worker/do/pull.js +22 -10
- package/dist/cf-worker/do/pull.js.map +1 -1
- package/dist/cf-worker/do/push.d.ts +5 -4
- package/dist/cf-worker/do/push.d.ts.map +1 -1
- package/dist/cf-worker/do/push.js +80 -41
- package/dist/cf-worker/do/push.js.map +1 -1
- package/dist/cf-worker/do/sqlite.d.ts +10 -1
- package/dist/cf-worker/do/sqlite.d.ts.map +1 -1
- package/dist/cf-worker/do/sqlite.js +13 -4
- package/dist/cf-worker/do/sqlite.js.map +1 -1
- package/dist/cf-worker/do/sync-storage.d.ts +14 -9
- package/dist/cf-worker/do/sync-storage.d.ts.map +1 -1
- package/dist/cf-worker/do/sync-storage.js +92 -18
- package/dist/cf-worker/do/sync-storage.js.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.d.ts +2 -1
- package/dist/cf-worker/do/transport/do-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/do-rpc-server.js +13 -7
- package/dist/cf-worker/do/transport/do-rpc-server.js.map +1 -1
- package/dist/cf-worker/do/transport/http-rpc-server.d.ts +3 -1
- package/dist/cf-worker/do/transport/http-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/http-rpc-server.js +24 -15
- package/dist/cf-worker/do/transport/http-rpc-server.js.map +1 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.d.ts +2 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.d.ts.map +1 -1
- package/dist/cf-worker/do/transport/ws-rpc-server.js +30 -8
- package/dist/cf-worker/do/transport/ws-rpc-server.js.map +1 -1
- package/dist/cf-worker/shared.d.ts +123 -30
- package/dist/cf-worker/shared.d.ts.map +1 -1
- package/dist/cf-worker/shared.js +50 -6
- package/dist/cf-worker/shared.js.map +1 -1
- package/dist/cf-worker/worker.d.ts +64 -71
- package/dist/cf-worker/worker.d.ts.map +1 -1
- package/dist/cf-worker/worker.js +70 -48
- package/dist/cf-worker/worker.js.map +1 -1
- package/dist/client/transport/do-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/do-rpc-client.js +27 -10
- package/dist/client/transport/do-rpc-client.js.map +1 -1
- package/dist/client/transport/http-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/http-rpc-client.js +29 -9
- package/dist/client/transport/http-rpc-client.js.map +1 -1
- package/dist/client/transport/ws-rpc-client.d.ts +2 -1
- package/dist/client/transport/ws-rpc-client.d.ts.map +1 -1
- package/dist/client/transport/ws-rpc-client.js +31 -17
- package/dist/client/transport/ws-rpc-client.js.map +1 -1
- package/dist/common/constants.d.ts +7 -0
- package/dist/common/constants.d.ts.map +1 -0
- package/dist/common/constants.js +17 -0
- package/dist/common/constants.js.map +1 -0
- package/dist/common/do-rpc-schema.d.ts +6 -6
- package/dist/common/do-rpc-schema.d.ts.map +1 -1
- package/dist/common/do-rpc-schema.js +4 -4
- package/dist/common/do-rpc-schema.js.map +1 -1
- package/dist/common/http-rpc-schema.d.ts +4 -4
- package/dist/common/http-rpc-schema.d.ts.map +1 -1
- package/dist/common/http-rpc-schema.js +4 -4
- package/dist/common/http-rpc-schema.js.map +1 -1
- package/dist/common/mod.d.ts +4 -1
- package/dist/common/mod.d.ts.map +1 -1
- package/dist/common/mod.js +4 -1
- package/dist/common/mod.js.map +1 -1
- package/dist/common/sync-message-types.d.ts +2 -2
- package/dist/common/sync-message-types.js +3 -3
- package/dist/common/sync-message-types.js.map +1 -1
- package/dist/common/ws-rpc-schema.d.ts +3 -3
- package/dist/common/ws-rpc-schema.d.ts.map +1 -1
- package/dist/common/ws-rpc-schema.js +3 -3
- package/dist/common/ws-rpc-schema.js.map +1 -1
- package/package.json +72 -14
- package/src/cf-worker/do/durable-object.ts +23 -18
- package/src/cf-worker/do/layer.ts +35 -13
- package/src/cf-worker/do/pull.ts +43 -14
- package/src/cf-worker/do/push.ts +107 -46
- package/src/cf-worker/do/sqlite.ts +14 -4
- package/src/cf-worker/do/sync-storage.ts +151 -31
- package/src/cf-worker/do/transport/do-rpc-server.ts +22 -9
- package/src/cf-worker/do/transport/http-rpc-server.ts +33 -13
- package/src/cf-worker/do/transport/ws-rpc-server.ts +40 -12
- package/src/cf-worker/shared.ts +149 -25
- package/src/cf-worker/worker.ts +138 -108
- package/src/client/transport/do-rpc-client.ts +41 -17
- package/src/client/transport/http-rpc-client.ts +43 -17
- package/src/client/transport/ws-rpc-client.ts +42 -19
- package/src/common/constants.ts +18 -0
- package/src/common/do-rpc-schema.ts +5 -4
- package/src/common/http-rpc-schema.ts +5 -4
- package/src/common/mod.ts +4 -2
- package/src/common/sync-message-types.ts +3 -3
- package/src/common/ws-rpc-schema.ts +4 -3
|
@@ -7,7 +7,7 @@ export type MakeDurableObjectClass = (options?: MakeDurableObjectClassOptions) =
|
|
|
7
7
|
};
|
|
8
8
|
/**
|
|
9
9
|
* Creates a Durable Object class for handling WebSocket-based sync.
|
|
10
|
-
* A sync
|
|
10
|
+
* A sync Durable Object is uniquely scoped to a specific `storeId`.
|
|
11
11
|
*
|
|
12
12
|
* The sync DO supports 3 transport modes:
|
|
13
13
|
* - HTTP JSON-RPC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-object.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/durable-object.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"durable-object.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/durable-object.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAkC,MAAM,sBAAsB,CAAA;AAcnF,OAAO,EACL,KAAK,GAAG,EAER,KAAK,6BAA6B,EAElC,KAAK,uBAAuB,EAE7B,MAAM,cAAc,CAAA;AAmBrB,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAA;AAChD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC,CAAA;AAEnD,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,CAAC,EAAE,6BAA6B,KAAK;IAChF,KAAK,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAAA;CAChE,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,iBAAiB,EAAE,sBA8J/B,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { DurableObject } from 'cloudflare:workers';
|
|
|
3
3
|
import { setupDurableObjectWebSocketRpc } from '@livestore/common-cf';
|
|
4
4
|
import { CfDeclare } from '@livestore/common-cf/declare';
|
|
5
5
|
import { Effect, FetchHttpClient, Layer, Logger, LogLevel, Otlp, RpcMessage, Schema, } from '@livestore/utils/effect';
|
|
6
|
-
import {
|
|
6
|
+
import { extractForwardedHeaders, matchSyncRequest, WebSocketAttachmentSchema, } from "../shared.js";
|
|
7
7
|
import { DoCtx } from "./layer.js";
|
|
8
8
|
import { createDoRpcHandler } from "./transport/do-rpc-server.js";
|
|
9
9
|
import { createHttpRpcHandler } from "./transport/http-rpc-server.js";
|
|
@@ -11,7 +11,7 @@ import { makeRpcServer } from "./transport/ws-rpc-server.js";
|
|
|
11
11
|
const DurableObjectBase = DurableObject;
|
|
12
12
|
/**
|
|
13
13
|
* Creates a Durable Object class for handling WebSocket-based sync.
|
|
14
|
-
* A sync
|
|
14
|
+
* A sync Durable Object is uniquely scoped to a specific `storeId`.
|
|
15
15
|
*
|
|
16
16
|
* The sync DO supports 3 transport modes:
|
|
17
17
|
* - HTTP JSON-RPC
|
|
@@ -48,7 +48,7 @@ const DurableObjectBase = DurableObject;
|
|
|
48
48
|
export const makeDurableObject = (options) => {
|
|
49
49
|
const enabledTransports = options?.enabledTransports ?? new Set(['http', 'ws', 'do-rpc']);
|
|
50
50
|
const Logging = Logger.consoleWithThread('SyncDo');
|
|
51
|
-
const Observability = options?.otel?.baseUrl
|
|
51
|
+
const Observability = options?.otel?.baseUrl !== undefined
|
|
52
52
|
? Otlp.layer({
|
|
53
53
|
baseUrl: options.otel.baseUrl,
|
|
54
54
|
tracerExportInterval: 50,
|
|
@@ -59,15 +59,11 @@ export const makeDurableObject = (options) => {
|
|
|
59
59
|
: Layer.empty;
|
|
60
60
|
return class SyncBackendDOBase extends DurableObjectBase {
|
|
61
61
|
__DURABLE_OBJECT_BRAND = 'SyncBackendDOBase';
|
|
62
|
-
ctx;
|
|
63
|
-
env;
|
|
64
62
|
constructor(ctx, env) {
|
|
65
63
|
super(ctx, env);
|
|
66
|
-
this.ctx = ctx;
|
|
67
|
-
this.env = env;
|
|
68
64
|
const WebSocketRpcServerLive = makeRpcServer({ doSelf: this, doOptions: options });
|
|
69
65
|
// This registers the `webSocketMessage` and `webSocketClose` handlers
|
|
70
|
-
if (enabledTransports.has('ws')) {
|
|
66
|
+
if (enabledTransports.has('ws') === true) {
|
|
71
67
|
setupDurableObjectWebSocketRpc({
|
|
72
68
|
doSelf: this,
|
|
73
69
|
rpcLayer: WebSocketRpcServerLive,
|
|
@@ -100,21 +96,24 @@ export const makeDurableObject = (options) => {
|
|
|
100
96
|
}
|
|
101
97
|
}
|
|
102
98
|
fetch = async (request) => Effect.gen(this, function* () {
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
99
|
+
const searchParams = matchSyncRequest(request);
|
|
100
|
+
if (searchParams === undefined) {
|
|
105
101
|
throw new Error('No search params found in request URL');
|
|
106
102
|
}
|
|
107
|
-
const { storeId, payload, transport } =
|
|
103
|
+
const { storeId, payload, transport } = searchParams;
|
|
108
104
|
if (enabledTransports.has(transport) === false) {
|
|
109
105
|
throw new Error(`Transport ${transport} is not enabled (based on \`options.enabledTransports\`)`);
|
|
110
106
|
}
|
|
107
|
+
// Extract headers to forward based on configuration (available for all transports)
|
|
108
|
+
const headers = extractForwardedHeaders(request, options?.forwardHeaders);
|
|
111
109
|
if (transport === 'http') {
|
|
112
|
-
return yield* this.handleHttp(request);
|
|
110
|
+
return yield* this.handleHttp(request, headers);
|
|
113
111
|
}
|
|
114
112
|
if (transport === 'ws') {
|
|
115
113
|
const { 0: client, 1: server } = new WebSocketPair();
|
|
116
114
|
// Since we're using websocket hibernation, we need to remember the storeId for subsequent `webSocketMessage` calls
|
|
117
|
-
|
|
115
|
+
// Also store forwarded headers so they're available after hibernation resume
|
|
116
|
+
server.serializeAttachment(Schema.encodeSync(WebSocketAttachmentSchema)({ storeId, payload, pullRequestIds: [], headers }));
|
|
118
117
|
// See https://developers.cloudflare.com/durable-objects/examples/websocket-hibernation-server
|
|
119
118
|
this.ctx.acceptWebSocket(server);
|
|
120
119
|
// Ping requests are sent by Effect RPC internally
|
|
@@ -145,8 +144,10 @@ export const makeDurableObject = (options) => {
|
|
|
145
144
|
*
|
|
146
145
|
* Requires the `enable_request_signal` compatibility flag to properly support `pull` streaming responses
|
|
147
146
|
*/
|
|
148
|
-
handleHttp = (request) => createHttpRpcHandler({
|
|
147
|
+
handleHttp = (request, forwardedHeaders) => createHttpRpcHandler({
|
|
149
148
|
request,
|
|
149
|
+
...(options?.http?.responseHeaders !== undefined ? { responseHeaders: options.http.responseHeaders } : {}),
|
|
150
|
+
...(forwardedHeaders !== undefined ? { forwardedHeaders } : {}),
|
|
150
151
|
}).pipe(Effect.withSpan('@livestore/sync-cf:durable-object:handleHttp'));
|
|
151
152
|
runEffectAsPromise = (effect) => effect.pipe(Effect.tapCauseLogPretty, Logger.withMinimumLogLevel(LogLevel.Debug), Effect.provide(Layer.mergeAll(Observability, Logging)), Effect.scoped, Effect.runPromise);
|
|
152
153
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../../src/cf-worker/do/durable-object.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"durable-object.js","sourceRoot":"","sources":["../../../src/cf-worker/do/durable-object.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { EventSequenceNumber } from '@livestore/common/schema';
|
|
1
|
+
import { UnknownError } from '@livestore/common';
|
|
3
2
|
import type { CfTypes } from '@livestore/common-cf';
|
|
3
|
+
import { EventSequenceNumber } from '@livestore/common/schema';
|
|
4
4
|
import { Effect } from '@livestore/utils/effect';
|
|
5
5
|
import type { Env, MakeDurableObjectClassOptions, RpcSubscription } from '../shared.ts';
|
|
6
6
|
export interface DoCtxInput {
|
|
@@ -14,19 +14,19 @@ export interface DoCtxInput {
|
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
declare const DoCtx_base: Effect.Service.Class<DoCtx, "DoCtx", {
|
|
17
|
-
readonly effect: (args_0: DoCtxInput) => Effect.Effect
|
|
17
|
+
readonly effect: (args_0: DoCtxInput) => Effect.Effect<{
|
|
18
18
|
storeId: string;
|
|
19
19
|
backendId: string;
|
|
20
20
|
currentHeadRef: {
|
|
21
21
|
current: number & import("effect/Brand").Brand<"GlobalEventSequenceNumber">;
|
|
22
22
|
};
|
|
23
|
-
updateCurrentHead: (currentHead: EventSequenceNumber.
|
|
23
|
+
updateCurrentHead: (currentHead: EventSequenceNumber.Global.Type) => void;
|
|
24
24
|
storage: import("./sync-storage.ts").SyncStorage;
|
|
25
25
|
doOptions: MakeDurableObjectClassOptions | undefined;
|
|
26
26
|
env: Env;
|
|
27
|
-
ctx: CfTypes.DurableObjectState
|
|
27
|
+
ctx: CfTypes.DurableObjectState<unknown>;
|
|
28
28
|
rpcSubscriptions: Map<string, RpcSubscription>;
|
|
29
|
-
},
|
|
29
|
+
}, UnknownError, never>;
|
|
30
30
|
}>;
|
|
31
31
|
export declare class DoCtx extends DoCtx_base {
|
|
32
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAS,MAAM,0BAA0B,CAAA;AAErE,OAAO,EAAE,MAAM,EAAa,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAAE,GAAG,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAMvF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC,aAAa,GAAG;QAC9B,GAAG,EAAE,OAAO,CAAC,kBAAkB,CAAA;QAC/B,GAAG,EAAE,GAAG,CAAA;KACT,CAAA;IACD,SAAS,EAAE,6BAA6B,GAAG,SAAS,CAAA;IACpD,IAAI,EAAE,OAAO,CAAC,OAAO,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5C;;;;;;;;yCAmE6C,mBAAmB,CAAC,MAAM,CAAC,IAAI;;;;;;;;AAjE7E,qBAAa,KAAM,SAAQ,UA0GzB;CAAG"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UnknownError } from '@livestore/common';
|
|
2
2
|
import { EventSequenceNumber, State } from '@livestore/common/schema';
|
|
3
3
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
4
4
|
import { Effect, Predicate } from '@livestore/utils/effect';
|
|
@@ -12,19 +12,42 @@ export class DoCtx extends Effect.Service()('DoCtx', {
|
|
|
12
12
|
return doSelf[CacheSymbol];
|
|
13
13
|
}
|
|
14
14
|
const getStoreId = (from) => {
|
|
15
|
-
if (Predicate.hasProperty(from, 'url')) {
|
|
15
|
+
if (Predicate.hasProperty(from, 'url') === true) {
|
|
16
16
|
const url = new URL(from.url);
|
|
17
17
|
return (url.searchParams.get('storeId') ?? shouldNeverHappen(`No storeId provided in request URL search params`));
|
|
18
18
|
}
|
|
19
19
|
return from.storeId;
|
|
20
20
|
};
|
|
21
21
|
const storeId = getStoreId(from);
|
|
22
|
-
|
|
22
|
+
// Resolve storage engine
|
|
23
|
+
const makeEngine = Effect.gen(function* () {
|
|
24
|
+
const opt = doOptions?.storage;
|
|
25
|
+
if (opt?._tag === 'd1') {
|
|
26
|
+
const db = doSelf.env[opt.binding];
|
|
27
|
+
if (db == null) {
|
|
28
|
+
return yield* UnknownError.make({ cause: new Error(`D1 binding '${opt.binding}' not found on env`) });
|
|
29
|
+
}
|
|
30
|
+
return { _tag: 'd1', db };
|
|
31
|
+
}
|
|
32
|
+
else if (opt?._tag === 'do-sqlite' || opt === undefined) {
|
|
33
|
+
return { _tag: 'do-sqlite' };
|
|
34
|
+
}
|
|
35
|
+
else
|
|
36
|
+
return shouldNeverHappen(`Invalid storage engine`, opt);
|
|
37
|
+
});
|
|
38
|
+
const engine = yield* makeEngine;
|
|
39
|
+
const storage = makeStorage(doSelf.ctx, storeId, engine);
|
|
23
40
|
// Initialize database tables
|
|
24
41
|
{
|
|
25
42
|
const colSpec = State.SQLite.makeColumnSpec(eventlogTable.sqliteDef.ast);
|
|
26
|
-
|
|
27
|
-
|
|
43
|
+
if (engine._tag === 'd1') {
|
|
44
|
+
// D1 database is async, so we need to use a promise
|
|
45
|
+
yield* Effect.promise(() => engine.db.exec(`CREATE TABLE IF NOT EXISTS "${storage.dbName}" (${colSpec}) strict`));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// DO SQLite table lives in Durable Object storage
|
|
49
|
+
doSelf.ctx.storage.sql.exec(`CREATE TABLE IF NOT EXISTS "${storage.dbName}" (${colSpec}) strict`);
|
|
50
|
+
}
|
|
28
51
|
}
|
|
29
52
|
{
|
|
30
53
|
const colSpec = State.SQLite.makeColumnSpec(contextTable.sqliteDef.ast);
|
|
@@ -33,9 +56,9 @@ export class DoCtx extends Effect.Service()('DoCtx', {
|
|
|
33
56
|
const storageRow = doSelf.ctx.storage.sql
|
|
34
57
|
.exec(`SELECT * FROM "${contextTable.sqliteDef.name}" WHERE storeId = ?`, storeId)
|
|
35
58
|
.toArray()[0];
|
|
36
|
-
const currentHeadRef = { current: storageRow?.currentHead ?? EventSequenceNumber.ROOT.global };
|
|
59
|
+
const currentHeadRef = { current: storageRow?.currentHead ?? EventSequenceNumber.Client.ROOT.global };
|
|
37
60
|
// TODO do concistency check with eventlog table to make sure the head is consistent
|
|
38
|
-
// Should be the same backendId for lifetime of the
|
|
61
|
+
// Should be the same backendId for lifetime of the Durable Object
|
|
39
62
|
const backendId = storageRow?.backendId ?? nanoid();
|
|
40
63
|
const updateCurrentHead = (currentHead) => {
|
|
41
64
|
doSelf.ctx.storage.sql.exec(`INSERT OR REPLACE INTO "${contextTable.sqliteDef.name}" (storeId, currentHead, backendId) VALUES (?, ?, ?)`, storeId, currentHead, backendId);
|
|
@@ -59,10 +82,10 @@ export class DoCtx extends Effect.Service()('DoCtx', {
|
|
|
59
82
|
doSelf[CacheSymbol] = storageCache;
|
|
60
83
|
// Set initial current head to root
|
|
61
84
|
if (storageRow === undefined) {
|
|
62
|
-
updateCurrentHead(EventSequenceNumber.ROOT.global);
|
|
85
|
+
updateCurrentHead(EventSequenceNumber.Client.ROOT.global);
|
|
63
86
|
}
|
|
64
87
|
return storageCache;
|
|
65
|
-
},
|
|
88
|
+
}, UnknownError.mapToUnknownError, Effect.withSpan('@livestore/sync-cf:durable-object:makeDoCtx')),
|
|
66
89
|
}) {
|
|
67
90
|
}
|
|
68
91
|
//# sourceMappingURL=layer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../../../src/cf-worker/do/layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../../../src/cf-worker/do/layer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { BackendIdMismatchError, UnknownError } from '@livestore/common';
|
|
2
|
+
import { Schema, Stream } from '@livestore/utils/effect';
|
|
3
3
|
import { SyncMessage } from '../../common/mod.ts';
|
|
4
|
+
import type { ForwardedHeaders } from '../shared.ts';
|
|
4
5
|
import { DoCtx } from './layer.ts';
|
|
5
|
-
export declare const makeEndingPullStream: (req
|
|
6
|
+
export declare const makeEndingPullStream: ({ req, payload, headers, }: {
|
|
7
|
+
req: SyncMessage.PullRequest;
|
|
8
|
+
payload: Schema.JsonValue | undefined;
|
|
9
|
+
headers: ForwardedHeaders | undefined;
|
|
10
|
+
}) => Stream.Stream<SyncMessage.PullResponse, UnknownError | BackendIdMismatchError, DoCtx>;
|
|
6
11
|
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/pull.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErF,OAAO,EAAyB,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAG/E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAalC,eAAO,MAAM,oBAAoB,GAAI,4BAIlC;IACD,GAAG,EAAE,WAAW,CAAC,WAAW,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;IACrC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAA;CACtC,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,GAAG,sBAAsB,EAAE,KAAK,CAiErF,CAAA"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { BackendIdMismatchError,
|
|
2
|
-
import {
|
|
1
|
+
import { BackendIdMismatchError, SyncBackend, UnknownError } from '@livestore/common';
|
|
2
|
+
import { splitChunkBySize } from '@livestore/common/sync';
|
|
3
|
+
import { Chunk, Effect, Option, Schema, Stream } from '@livestore/utils/effect';
|
|
4
|
+
import { MAX_PULL_EVENTS_PER_MESSAGE, MAX_WS_MESSAGE_BYTES } from "../../common/constants.js";
|
|
3
5
|
import { SyncMessage } from "../../common/mod.js";
|
|
4
|
-
import { PULL_CHUNK_SIZE } from "../shared.js";
|
|
5
6
|
import { DoCtx } from "./layer.js";
|
|
7
|
+
const encodePullResponse = Schema.encodeSync(SyncMessage.PullResponse);
|
|
6
8
|
// Notes on stream handling:
|
|
7
9
|
// We're intentionally closing the stream once we've read all existing events
|
|
8
10
|
//
|
|
@@ -12,16 +14,24 @@ import { DoCtx } from "./layer.js";
|
|
|
12
14
|
// DO RPC:
|
|
13
15
|
// - Further chunks will be emitted manually in `push.ts`
|
|
14
16
|
// - If the client sends a `Interrupt` RPC message, TODO
|
|
15
|
-
export const makeEndingPullStream = (req, payload) => Effect.gen(function* () {
|
|
17
|
+
export const makeEndingPullStream = ({ req, payload, headers, }) => Effect.gen(function* () {
|
|
16
18
|
const { doOptions, backendId, storeId, storage } = yield* DoCtx;
|
|
17
|
-
if (doOptions?.onPull) {
|
|
18
|
-
yield* Effect.tryAll(() => doOptions.onPull(req, {
|
|
19
|
+
if (doOptions?.onPull !== undefined) {
|
|
20
|
+
yield* Effect.tryAll(() => doOptions.onPull(req, {
|
|
21
|
+
storeId,
|
|
22
|
+
...(payload !== undefined ? { payload } : {}),
|
|
23
|
+
...(headers !== undefined ? { headers } : {}),
|
|
24
|
+
})).pipe(UnknownError.mapToUnknownError);
|
|
19
25
|
}
|
|
20
26
|
if (req.cursor._tag === 'Some' && req.cursor.value.backendId !== backendId) {
|
|
21
27
|
return yield* new BackendIdMismatchError({ expected: backendId, received: req.cursor.value.backendId });
|
|
22
28
|
}
|
|
23
29
|
const { stream: storedEvents, total } = yield* storage.getEvents(Option.getOrUndefined(req.cursor)?.eventSequenceNumber);
|
|
24
|
-
return storedEvents.pipe(Stream.
|
|
30
|
+
return storedEvents.pipe(Stream.mapChunksEffect(splitChunkBySize({
|
|
31
|
+
maxItems: MAX_PULL_EVENTS_PER_MESSAGE,
|
|
32
|
+
maxBytes: MAX_WS_MESSAGE_BYTES,
|
|
33
|
+
encode: (batch) => encodePullResponse(SyncMessage.PullResponse.make({ batch, pageInfo: SyncBackend.pageInfoNoMore, backendId })),
|
|
34
|
+
})), Stream.mapAccum(total, (remaining, chunk) => {
|
|
25
35
|
const asArray = Chunk.toReadonlyArray(chunk);
|
|
26
36
|
const nextRemaining = Math.max(0, remaining - asArray.length);
|
|
27
37
|
return [
|
|
@@ -33,9 +43,11 @@ export const makeEndingPullStream = (req, payload) => Effect.gen(function* () {
|
|
|
33
43
|
}),
|
|
34
44
|
];
|
|
35
45
|
}), Stream.tap(Effect.fn(function* (res) {
|
|
36
|
-
if (doOptions?.onPullRes) {
|
|
37
|
-
yield* Effect.tryAll(() => doOptions.onPullRes(res)).pipe(
|
|
46
|
+
if (doOptions?.onPullRes !== undefined) {
|
|
47
|
+
yield* Effect.tryAll(() => doOptions.onPullRes(res)).pipe(UnknownError.mapToUnknownError);
|
|
38
48
|
}
|
|
39
49
|
})), Stream.emitIfEmpty(SyncMessage.emptyPullResponse(backendId)));
|
|
40
|
-
}).pipe(Stream.unwrap, Stream.mapError((cause) =>
|
|
50
|
+
}).pipe(Stream.unwrap, Stream.mapError((cause) => cause._tag === 'BackendIdMismatchError' || cause._tag === 'UnknownError'
|
|
51
|
+
? cause
|
|
52
|
+
: new UnknownError({ cause })), Stream.withSpan('cloudflare-provider:pull'));
|
|
41
53
|
//# sourceMappingURL=pull.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cf-worker/do/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/cf-worker/do/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BackendIdMismatchError, ServerAheadError, UnknownError } from '@livestore/common';
|
|
2
2
|
import { type CfTypes } from '@livestore/common-cf';
|
|
3
3
|
import { Effect, Schema } from '@livestore/utils/effect';
|
|
4
4
|
import { SyncMessage } from '../../common/mod.ts';
|
|
5
|
-
import { type Env, type MakeDurableObjectClassOptions, type StoreId } from '../shared.ts';
|
|
5
|
+
import { type Env, type ForwardedHeaders, type MakeDurableObjectClassOptions, type StoreId } from '../shared.ts';
|
|
6
6
|
import { DoCtx } from './layer.ts';
|
|
7
|
-
export declare const makePush: ({ payload, options, storeId, ctx, env, }: {
|
|
7
|
+
export declare const makePush: ({ payload, headers, options, storeId, ctx, env, }: {
|
|
8
8
|
payload: Schema.JsonValue | undefined;
|
|
9
|
+
headers: ForwardedHeaders | undefined;
|
|
9
10
|
options: MakeDurableObjectClassOptions | undefined;
|
|
10
11
|
storeId: StoreId;
|
|
11
12
|
ctx: CfTypes.DurableObjectState;
|
|
12
13
|
env: Env;
|
|
13
|
-
}) => (pushRequest: Omit<SyncMessage.PushRequest, "_tag">) => Effect.Effect<{},
|
|
14
|
+
}) => (pushRequest: Omit<SyncMessage.PushRequest, "_tag">) => Effect.Effect<{}, UnknownError | BackendIdMismatchError | ServerAheadError, DoCtx>;
|
|
14
15
|
//# sourceMappingURL=push.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/push.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/cf-worker/do/push.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAEhB,YAAY,EACb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,KAAK,OAAO,EAAsB,MAAM,sBAAsB,CAAA;AAEvE,OAAO,EAAS,MAAM,EAA2B,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGxF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EACL,KAAK,GAAG,EACR,KAAK,gBAAgB,EACrB,KAAK,6BAA6B,EAClC,KAAK,OAAO,EAEb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAMlC,eAAO,MAAM,QAAQ,GAClB,mDAOE;IACD,OAAO,EAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;IACrC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAA;IACrC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CAAA;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,OAAO,CAAC,kBAAkB,CAAA;IAC/B,GAAG,EAAE,GAAG,CAAA;CACT,MACA,aAAa,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,uFAuKhD,CAAA"}
|
|
@@ -1,17 +1,25 @@
|
|
|
1
|
-
import { BackendIdMismatchError,
|
|
1
|
+
import { BackendIdMismatchError, ServerAheadError, SyncBackend, UnknownError, } from '@livestore/common';
|
|
2
2
|
import { emitStreamResponse } from '@livestore/common-cf';
|
|
3
|
-
import {
|
|
3
|
+
import { splitChunkBySize } from '@livestore/common/sync';
|
|
4
|
+
import { Chunk, Effect, Option, Schema } from '@livestore/utils/effect';
|
|
5
|
+
import { MAX_PUSH_EVENTS_PER_REQUEST, MAX_WS_MESSAGE_BYTES } from "../../common/constants.js";
|
|
4
6
|
import { SyncMessage } from "../../common/mod.js";
|
|
5
|
-
import { WebSocketAttachmentSchema } from "../shared.js";
|
|
7
|
+
import { WebSocketAttachmentSchema, } from "../shared.js";
|
|
6
8
|
import { DoCtx } from "./layer.js";
|
|
7
|
-
|
|
9
|
+
const encodePullResponse = Schema.encodeSync(SyncMessage.PullResponse);
|
|
10
|
+
const jsonStringify = Schema.encodeSync(Schema.parseJson());
|
|
11
|
+
export const makePush = ({ payload, headers, options, storeId, ctx, env, }) => (pushRequest) => Effect.gen(function* () {
|
|
8
12
|
// yield* Effect.log(`Pushing ${decodedMessage.batch.length} events`, decodedMessage.batch)
|
|
9
13
|
const { backendId, storage, currentHeadRef, updateCurrentHead, rpcSubscriptions } = yield* DoCtx;
|
|
10
14
|
if (pushRequest.batch.length === 0) {
|
|
11
15
|
return SyncMessage.PushAck.make({});
|
|
12
16
|
}
|
|
13
|
-
if (options?.onPush) {
|
|
14
|
-
yield* Effect.tryAll(() => options.onPush(pushRequest, {
|
|
17
|
+
if (options?.onPush !== undefined) {
|
|
18
|
+
yield* Effect.tryAll(() => options.onPush(pushRequest, {
|
|
19
|
+
storeId,
|
|
20
|
+
...(payload !== undefined ? { payload } : {}),
|
|
21
|
+
...(headers !== undefined ? { headers } : {}),
|
|
22
|
+
})).pipe(UnknownError.mapToUnknownError);
|
|
15
23
|
}
|
|
16
24
|
if (pushRequest.backendId._tag === 'Some' && pushRequest.backendId.value !== backendId) {
|
|
17
25
|
return yield* new BackendIdMismatchError({ expected: backendId, received: pushRequest.backendId.value });
|
|
@@ -23,6 +31,12 @@ export const makePush = ({ payload, options, storeId, ctx, env, }) => (pushReque
|
|
|
23
31
|
// Validate the batch
|
|
24
32
|
const firstEventParent = pushRequest.batch[0].parentSeqNum;
|
|
25
33
|
if (firstEventParent !== currentHead) {
|
|
34
|
+
// yield* Effect.logDebug('ServerAheadError: backend head mismatch', {
|
|
35
|
+
// expectedHead: currentHead,
|
|
36
|
+
// providedHead: firstEventParent,
|
|
37
|
+
// batchSize: pushRequest.batch.length,
|
|
38
|
+
// backendId,
|
|
39
|
+
// })
|
|
26
40
|
return yield* new ServerAheadError({ minimumExpectedNum: currentHead, providedNum: firstEventParent });
|
|
27
41
|
}
|
|
28
42
|
const createdAt = new Date().toISOString();
|
|
@@ -34,48 +48,71 @@ export const makePush = ({ payload, options, storeId, ctx, env, }) => (pushReque
|
|
|
34
48
|
// Run in background but already return the push ack to the client
|
|
35
49
|
yield* Effect.gen(function* () {
|
|
36
50
|
const connectedClients = ctx.getWebSockets();
|
|
37
|
-
//
|
|
38
|
-
const
|
|
39
|
-
|
|
51
|
+
// Preparing chunks of responses to make sure we don't exceed the WS message size limit.
|
|
52
|
+
const responses = yield* Chunk.fromIterable(pushRequest.batch).pipe(splitChunkBySize({
|
|
53
|
+
maxItems: MAX_PUSH_EVENTS_PER_REQUEST,
|
|
54
|
+
maxBytes: MAX_WS_MESSAGE_BYTES,
|
|
55
|
+
encode: (items) => encodePullResponse(SyncMessage.PullResponse.make({
|
|
56
|
+
batch: items.map((eventEncoded) => ({
|
|
57
|
+
eventEncoded,
|
|
58
|
+
metadata: Option.some(SyncMessage.SyncMetadata.make({ createdAt })),
|
|
59
|
+
})),
|
|
60
|
+
pageInfo: SyncBackend.pageInfoNoMore,
|
|
61
|
+
backendId,
|
|
62
|
+
})),
|
|
63
|
+
}), Effect.map(Chunk.map((eventsChunk) => {
|
|
64
|
+
const batchWithMetadata = Chunk.toReadonlyArray(eventsChunk).map((eventEncoded) => ({
|
|
40
65
|
eventEncoded,
|
|
41
66
|
metadata: Option.some(SyncMessage.SyncMetadata.make({ createdAt })),
|
|
42
|
-
}))
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
67
|
+
}));
|
|
68
|
+
const response = SyncMessage.PullResponse.make({
|
|
69
|
+
batch: batchWithMetadata,
|
|
70
|
+
pageInfo: SyncBackend.pageInfoNoMore,
|
|
71
|
+
backendId,
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
response,
|
|
75
|
+
encoded: Schema.encodeSync(SyncMessage.PullResponse)(response),
|
|
76
|
+
};
|
|
77
|
+
})));
|
|
78
|
+
// Dual broadcasting: WebSocket + RPC clients
|
|
47
79
|
// Broadcast to WebSocket clients
|
|
48
80
|
if (connectedClients.length > 0) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
81
|
+
for (const { response, encoded } of responses) {
|
|
82
|
+
// Only calling once for now.
|
|
83
|
+
if (options?.onPullRes !== undefined) {
|
|
84
|
+
yield* Effect.tryAll(() => options.onPullRes(response)).pipe(UnknownError.mapToUnknownError);
|
|
85
|
+
}
|
|
86
|
+
// NOTE we're also sending the pullRes chunk to the pushing ws client as confirmation
|
|
87
|
+
for (const conn of connectedClients) {
|
|
88
|
+
const attachment = yield* Schema.decode(WebSocketAttachmentSchema)(conn.deserializeAttachment());
|
|
89
|
+
// We're doing something a bit "advanced" here as we're directly emitting Effect RPC-compatible
|
|
90
|
+
// response messsages on the Effect RPC-managed websocket connection to the WS client.
|
|
91
|
+
// For this we need to get the RPC `requestId` from the WebSocket attachment.
|
|
92
|
+
for (const requestId of attachment.pullRequestIds) {
|
|
93
|
+
const res = {
|
|
94
|
+
_tag: 'Chunk',
|
|
95
|
+
requestId,
|
|
96
|
+
values: [encoded],
|
|
97
|
+
};
|
|
98
|
+
conn.send(jsonStringify(res));
|
|
99
|
+
}
|
|
67
100
|
}
|
|
68
101
|
}
|
|
69
102
|
yield* Effect.logDebug(`Broadcasted to ${connectedClients.length} WebSocket clients`);
|
|
70
103
|
}
|
|
71
104
|
// RPC broadcasting would require reconstructing client stubs from clientIds
|
|
72
105
|
if (rpcSubscriptions.size > 0) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
106
|
+
for (const subscription of rpcSubscriptions.values()) {
|
|
107
|
+
for (const { encoded } of responses) {
|
|
108
|
+
yield* emitStreamResponse({
|
|
109
|
+
callerContext: subscription.callerContext,
|
|
110
|
+
env,
|
|
111
|
+
requestId: subscription.requestId,
|
|
112
|
+
values: [encoded],
|
|
113
|
+
}).pipe(Effect.tapCauseLogPretty, Effect.exit);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
79
116
|
yield* Effect.logDebug(`Broadcasted to ${rpcSubscriptions.size} RPC clients`);
|
|
80
117
|
}
|
|
81
118
|
}).pipe(Effect.tapCauseLogPretty, Effect.withSpan('push-rpc-broadcast'), Effect.uninterruptible, // We need to make sure Effect RPC doesn't interrupt this fiber
|
|
@@ -84,10 +121,12 @@ export const makePush = ({ payload, options, storeId, ctx, env, }) => (pushReque
|
|
|
84
121
|
yield* Effect.yieldNow();
|
|
85
122
|
return SyncMessage.PushAck.make({});
|
|
86
123
|
}).pipe(Effect.tap(Effect.fn(function* (message) {
|
|
87
|
-
if (options?.onPushRes) {
|
|
88
|
-
yield* Effect.tryAll(() => options.onPushRes(message)).pipe(
|
|
124
|
+
if (options?.onPushRes !== undefined) {
|
|
125
|
+
yield* Effect.tryAll(() => options.onPushRes(message)).pipe(UnknownError.mapToUnknownError);
|
|
89
126
|
}
|
|
90
|
-
})), Effect.mapError((cause) =>
|
|
127
|
+
})), Effect.mapError((cause) => cause._tag === 'BackendIdMismatchError' || cause._tag === 'ServerAheadError' || cause._tag === 'UnknownError'
|
|
128
|
+
? cause
|
|
129
|
+
: new UnknownError({ cause })), Effect.withSpan('sync-cf:do:push', { attributes: { storeId, batchSize: pushRequest.batch.length } }));
|
|
91
130
|
/**
|
|
92
131
|
* @see https://developers.cloudflare.com/durable-objects/api/state/#blockconcurrencywhile
|
|
93
132
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cf-worker/do/push.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/cf-worker/do/push.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAgB,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAExF,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAKL,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;AACtE,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;AAG3D,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,EACC,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,GAAG,EACH,GAAG,GAQJ,EAAE,EAAE,CACL,CAAC,WAAkD,EAAE,EAAE,CACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,2FAA2F;IAC3F,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAA;IAEhG,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CACxB,OAAO,CAAC,MAAO,CAAC,WAAW,EAAE;YAC3B,OAAO;YACP,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CACH,CAAC,IAAI,CACJ,YAAY,CAAC,iBAAiB,CAC/B,CAAA;IACH,CAAC;IAED,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACvF,OAAO,KAAK,CAAC,CAAC,IAAI,sBAAsB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAA;IAC1G,CAAC;IAED,2EAA2E;IAC3E,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAA;QAC1C,uCAAuC;QACvC,qBAAqB;QACrB,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,YAAY,CAAA;QAC3D,IAAI,gBAAgB,KAAK,WAAW,EAAE,CAAC;YACrC,sEAAsE;YACtE,+BAA+B;YAC/B,oCAAoC;YACpC,yCAAyC;YACzC,eAAe;YACf,KAAK;YAEL,OAAO,KAAK,CAAC,CAAC,IAAI,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAA;QACxG,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAE1C,6EAA6E;QAC7E,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAEzD,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAA;QAEnD,OAAO,EAAE,SAAS,EAAE,CAAA;IACtB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAA;IAEnC,kEAAkE;IAClE,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,gBAAgB,GAAG,GAAG,CAAC,aAAa,EAAE,CAAA;QAE5C,wFAAwF;QACxF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CACjE,gBAAgB,CAAC;YACf,QAAQ,EAAE,2BAA2B;YACrC,QAAQ,EAAE,oBAAoB;YAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,kBAAkB,CAChB,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,CACd,CAAC,YAAY,EAAiB,EAAE,CAAC,CAAC;oBAChC,YAAY;oBACZ,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;iBACpE,CAAC,CACH;gBACD,QAAQ,EAAE,WAAW,CAAC,cAAc;gBACpC,SAAS;aACV,CAAC,CACH;SACJ,CAAC,EACF,MAAM,CAAC,GAAG,CACR,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;YACxB,MAAM,iBAAiB,GAAG,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAClF,YAAY;gBACZ,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;aACpE,CAAC,CAAC,CAAA;YAEH,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC;gBAC7C,KAAK,EAAE,iBAAiB;gBACxB,QAAQ,EAAE,WAAW,CAAC,cAAc;gBACpC,SAAS;aACV,CAAC,CAAA;YAEF,OAAO;gBACL,QAAQ;gBACR,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC;aAC/D,CAAA;QACH,CAAC,CAAC,CACH,CACF,CAAA;QAED,6CAA6C;QAE7C,iCAAiC;QACjC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC9C,6BAA6B;gBAC7B,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;oBACrC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAA;gBAC/F,CAAC;gBAED,qFAAqF;gBACrF,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;oBACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAA;oBAEhG,+FAA+F;oBAC/F,sFAAsF;oBACtF,6EAA6E;oBAC7E,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;wBAClD,MAAM,GAAG,GAAoC;4BAC3C,IAAI,EAAE,OAAO;4BACb,SAAS;4BACT,MAAM,EAAE,CAAC,OAAO,CAAC;yBAClB,CAAA;wBACD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,gBAAgB,CAAC,MAAM,oBAAoB,CAAC,CAAA;QACvF,CAAC;QAED,4EAA4E;QAC5E,IAAI,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,MAAM,YAAY,IAAI,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrD,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,CAAC;oBACpC,KAAK,CAAC,CAAC,kBAAkB,CAAC;wBACxB,aAAa,EAAE,YAAY,CAAC,aAAa;wBACzC,GAAG;wBACH,SAAS,EAAE,YAAY,CAAC,SAAS;wBACjC,MAAM,EAAE,CAAC,OAAO,CAAC;qBAClB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;gBAChD,CAAC;YACH,CAAC;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,gBAAgB,CAAC,IAAI,cAAc,CAAC,CAAA;QAC/E,CAAC;IACH,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EACrC,MAAM,CAAC,eAAe,EAAE,+DAA+D;IACvF,MAAM,CAAC,IAAI,CACZ,CAAA;IAED,8GAA8G;IAC9G,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;IAExB,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACrC,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CACR,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO;IAC1B,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAA;IAC9F,CAAC;AACH,CAAC,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,KAAK,CAAC,IAAI,KAAK,wBAAwB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;IAC3G,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAChC,EACD,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CACrG,CAAA;AAEL;;GAEG;AACH,MAAM,qBAAqB,GACzB,CAAC,GAA+B,EAAE,EAAE,CACpC,CAAU,GAA2B,EAAE,EAAE,CACvC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAK,CAAA;IAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CACtC,GAAG,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAC1F,CAAA;IAED,OAAO,KAAK,CAAC,CAAC,IAAI,CAAA;AACpB,CAAC,CAAC,CAAA"}
|