@effect/platform-cloudflare 0.0.0-stage → 4.1.3
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/AGENTS.md +434 -0
- package/CLAUDE.md +434 -0
- package/LICENSE +21 -0
- package/README.md +505 -2
- package/ai-docs/README.md +44 -0
- package/ai-docs/package.json +36 -0
- package/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
- package/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +52 -0
- package/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
- package/ai-docs/src/01_effect/01_basics/index.md +7 -0
- package/ai-docs/src/01_effect/02_schema/10_schema-basics.ts +43 -0
- package/ai-docs/src/01_effect/02_schema/index.md +7 -0
- package/ai-docs/src/01_effect/03_services/01_service.ts +45 -0
- package/ai-docs/src/01_effect/03_services/10_reference.ts +10 -0
- package/ai-docs/src/01_effect/03_services/20_layer-composition.ts +70 -0
- package/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts +66 -0
- package/ai-docs/src/01_effect/03_services/index.md +5 -0
- package/ai-docs/src/01_effect/04_errors/01_error-handling.ts +30 -0
- package/ai-docs/src/01_effect/04_errors/10_catch-tags.ts +24 -0
- package/ai-docs/src/01_effect/04_errors/20_reason-errors.ts +64 -0
- package/ai-docs/src/01_effect/04_errors/index.md +1 -0
- package/ai-docs/src/01_effect/05_resources/10_acquire-release.ts +105 -0
- package/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts +31 -0
- package/ai-docs/src/01_effect/05_resources/30_layer-map.ts +86 -0
- package/ai-docs/src/01_effect/05_resources/index.md +3 -0
- package/ai-docs/src/01_effect/06_running/10_run-main.ts +30 -0
- package/ai-docs/src/01_effect/06_running/20_layer-launch.ts +27 -0
- package/ai-docs/src/01_effect/06_running/index.md +1 -0
- package/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts +56 -0
- package/ai-docs/src/01_effect/07_pubsub/index.md +3 -0
- package/ai-docs/src/03_stream/10_creating-streams.ts +103 -0
- package/ai-docs/src/03_stream/20_consuming-streams.ts +137 -0
- package/ai-docs/src/03_stream/30_encoding.ts +163 -0
- package/ai-docs/src/03_stream/index.md +4 -0
- package/ai-docs/src/04_integration/10_managed-runtime.ts +129 -0
- package/ai-docs/src/04_integration/index.md +5 -0
- package/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
- package/ai-docs/src/05_batching/index.md +3 -0
- package/ai-docs/src/06_schedule/10_schedules.ts +111 -0
- package/ai-docs/src/06_schedule/index.md +3 -0
- package/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
- package/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
- package/ai-docs/src/07_datetime/index.md +5 -0
- package/ai-docs/src/08_observability/10_logging.ts +66 -0
- package/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
- package/ai-docs/src/08_observability/index.md +7 -0
- package/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
- package/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
- package/ai-docs/src/09_testing/index.md +1 -0
- package/ai-docs/src/10_predicate/01_basics.ts +14 -0
- package/ai-docs/src/10_predicate/index.md +9 -0
- package/ai-docs/src/40_sql/10_basics.ts +175 -0
- package/ai-docs/src/40_sql/index.md +6 -0
- package/ai-docs/src/50_http-client/10_basics.ts +102 -0
- package/ai-docs/src/50_http-client/index.md +3 -0
- package/ai-docs/src/51_http-server/10_basics.ts +118 -0
- package/ai-docs/src/51_http-server/20_testing.ts +100 -0
- package/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
- package/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
- package/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
- package/ai-docs/src/51_http-server/fixtures/api/Users.ts +107 -0
- package/ai-docs/src/51_http-server/fixtures/domain/User.ts +21 -0
- package/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
- package/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +37 -0
- package/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +80 -0
- package/ai-docs/src/51_http-server/fixtures/server/Users.ts +183 -0
- package/ai-docs/src/51_http-server/index.md +3 -0
- package/ai-docs/src/52_graphql/10_basics.ts +117 -0
- package/ai-docs/src/52_graphql/20_testing.ts +45 -0
- package/ai-docs/src/52_graphql/30_batching.ts +118 -0
- package/ai-docs/src/52_graphql/40_aliased-batching.ts +124 -0
- package/ai-docs/src/52_graphql/50_errors-and-retries.ts +74 -0
- package/ai-docs/src/52_graphql/index.md +6 -0
- package/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
- package/ai-docs/src/60_child-process/index.md +3 -0
- package/ai-docs/src/70_cli/10_basics.ts +162 -0
- package/ai-docs/src/70_cli/index.md +5 -0
- package/ai-docs/src/71_ai/10_language-model.ts +156 -0
- package/ai-docs/src/71_ai/20_tools.ts +226 -0
- package/ai-docs/src/71_ai/30_chat.ts +158 -0
- package/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
- package/ai-docs/src/71_ai/index.md +5 -0
- package/ai-docs/src/80_cluster/10_entities.ts +97 -0
- package/ai-docs/src/80_cluster/index.md +4 -0
- package/ai-docs/src/index.md +10 -0
- package/ai-docs/tsconfig.json +28 -0
- package/dist/AlchemyCloudflareCluster.d.ts +134 -0
- package/dist/AlchemyCloudflareCluster.d.ts.map +1 -0
- package/dist/AlchemyCloudflareCluster.js +111 -0
- package/dist/AlchemyCloudflareCluster.js.map +1 -0
- package/dist/CloudflareCluster.d.ts +196 -0
- package/dist/CloudflareCluster.d.ts.map +1 -0
- package/dist/CloudflareCluster.js +533 -0
- package/dist/CloudflareCluster.js.map +1 -0
- package/dist/CloudflareDurableObjectPrograms.d.ts +279 -0
- package/dist/CloudflareDurableObjectPrograms.d.ts.map +1 -0
- package/dist/CloudflareDurableObjectPrograms.js +295 -0
- package/dist/CloudflareDurableObjectPrograms.js.map +1 -0
- package/dist/CloudflareDurableObjects.d.ts +149 -0
- package/dist/CloudflareDurableObjects.d.ts.map +1 -0
- package/dist/CloudflareDurableObjects.js +337 -0
- package/dist/CloudflareDurableObjects.js.map +1 -0
- package/dist/CloudflarePersistedQueue.d.ts +36 -0
- package/dist/CloudflarePersistedQueue.d.ts.map +1 -0
- package/dist/CloudflarePersistedQueue.js +122 -0
- package/dist/CloudflarePersistedQueue.js.map +1 -0
- package/dist/CloudflareWorkflowEngine.d.ts +72 -0
- package/dist/CloudflareWorkflowEngine.d.ts.map +1 -0
- package/dist/CloudflareWorkflowEngine.js +187 -0
- package/dist/CloudflareWorkflowEngine.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/alchemyCluster.d.ts +2 -0
- package/dist/internal/alchemyCluster.d.ts.map +1 -0
- package/dist/internal/alchemyCluster.js +75 -0
- package/dist/internal/alchemyCluster.js.map +1 -0
- package/dist/internal/boundedMap.d.ts +3 -0
- package/dist/internal/boundedMap.d.ts.map +1 -0
- package/dist/internal/boundedMap.js +15 -0
- package/dist/internal/boundedMap.js.map +1 -0
- package/dist/internal/cluster.d.ts +57 -0
- package/dist/internal/cluster.d.ts.map +1 -0
- package/dist/internal/cluster.js +2 -0
- package/dist/internal/cluster.js.map +1 -0
- package/dist/internal/clusterName.d.ts +2 -0
- package/dist/internal/clusterName.d.ts.map +1 -0
- package/dist/internal/clusterName.js +16 -0
- package/dist/internal/clusterName.js.map +1 -0
- package/dist/internal/entityKeepAlive.d.ts +2 -0
- package/dist/internal/entityKeepAlive.d.ts.map +1 -0
- package/dist/internal/entityKeepAlive.js +73 -0
- package/dist/internal/entityKeepAlive.js.map +1 -0
- package/dist/internal/entityMailbox.d.ts +2 -0
- package/dist/internal/entityMailbox.d.ts.map +1 -0
- package/dist/internal/entityMailbox.js +160 -0
- package/dist/internal/entityMailbox.js.map +1 -0
- package/dist/internal/entityRegistry.d.ts +16 -0
- package/dist/internal/entityRegistry.d.ts.map +1 -0
- package/dist/internal/entityRegistry.js +22 -0
- package/dist/internal/entityRegistry.js.map +1 -0
- package/dist/internal/entityReply.d.ts +2 -0
- package/dist/internal/entityReply.d.ts.map +1 -0
- package/dist/internal/entityReply.js +35 -0
- package/dist/internal/entityReply.js.map +1 -0
- package/dist/internal/entityRuntime.d.ts +2 -0
- package/dist/internal/entityRuntime.d.ts.map +1 -0
- package/dist/internal/entityRuntime.js +823 -0
- package/dist/internal/entityRuntime.js.map +1 -0
- package/dist/internal/entitySql.d.ts +2 -0
- package/dist/internal/entitySql.d.ts.map +1 -0
- package/dist/internal/entitySql.js +29 -0
- package/dist/internal/entitySql.js.map +1 -0
- package/dist/internal/entityStorage.d.ts +2 -0
- package/dist/internal/entityStorage.d.ts.map +1 -0
- package/dist/internal/entityStorage.js +98 -0
- package/dist/internal/entityStorage.js.map +1 -0
- package/dist/internal/entityWire.d.ts +2 -0
- package/dist/internal/entityWire.d.ts.map +1 -0
- package/dist/internal/entityWire.js +146 -0
- package/dist/internal/entityWire.js.map +1 -0
- package/dist/internal/queueRuntime.d.ts +2 -0
- package/dist/internal/queueRuntime.d.ts.map +1 -0
- package/dist/internal/queueRuntime.js +88 -0
- package/dist/internal/queueRuntime.js.map +1 -0
- package/dist/internal/queueStorage.d.ts +2 -0
- package/dist/internal/queueStorage.d.ts.map +1 -0
- package/dist/internal/queueStorage.js +129 -0
- package/dist/internal/queueStorage.js.map +1 -0
- package/dist/internal/registry.d.ts +10 -0
- package/dist/internal/registry.d.ts.map +1 -0
- package/dist/internal/registry.js +24 -0
- package/dist/internal/registry.js.map +1 -0
- package/dist/internal/singletonRegistry.d.ts +2 -0
- package/dist/internal/singletonRegistry.d.ts.map +1 -0
- package/dist/internal/singletonRegistry.js +9 -0
- package/dist/internal/singletonRegistry.js.map +1 -0
- package/dist/internal/singletonRuntime.d.ts +2 -0
- package/dist/internal/singletonRuntime.d.ts.map +1 -0
- package/dist/internal/singletonRuntime.js +42 -0
- package/dist/internal/singletonRuntime.js.map +1 -0
- package/dist/internal/singletonStorage.d.ts +2 -0
- package/dist/internal/singletonStorage.d.ts.map +1 -0
- package/dist/internal/singletonStorage.js +34 -0
- package/dist/internal/singletonStorage.js.map +1 -0
- package/dist/internal/transport.d.ts +2 -0
- package/dist/internal/transport.d.ts.map +1 -0
- package/dist/internal/transport.js +49 -0
- package/dist/internal/transport.js.map +1 -0
- package/dist/internal/workflowRegistry.d.ts +2 -0
- package/dist/internal/workflowRegistry.d.ts.map +1 -0
- package/dist/internal/workflowRegistry.js +29 -0
- package/dist/internal/workflowRegistry.js.map +1 -0
- package/dist/internal/workflowRuntime.d.ts +2 -0
- package/dist/internal/workflowRuntime.d.ts.map +1 -0
- package/dist/internal/workflowRuntime.js +322 -0
- package/dist/internal/workflowRuntime.js.map +1 -0
- package/dist/internal/workflowStorage.d.ts +2 -0
- package/dist/internal/workflowStorage.d.ts.map +1 -0
- package/dist/internal/workflowStorage.js +113 -0
- package/dist/internal/workflowStorage.js.map +1 -0
- package/dist/internal/workflowWire.d.ts +2 -0
- package/dist/internal/workflowWire.d.ts.map +1 -0
- package/dist/internal/workflowWire.js +52 -0
- package/dist/internal/workflowWire.js.map +1 -0
- package/package.json +74 -3
- package/src/AlchemyCloudflareCluster.ts +200 -0
- package/src/CloudflareCluster.ts +704 -0
- package/src/CloudflareDurableObjectPrograms.ts +543 -0
- package/src/CloudflareDurableObjects.ts +430 -0
- package/src/CloudflarePersistedQueue.ts +189 -0
- package/src/CloudflareWorkflowEngine.ts +220 -0
- package/src/index.ts +38 -0
- package/src/internal/alchemyCluster.ts +120 -0
- package/src/internal/boundedMap.ts +15 -0
- package/src/internal/cluster.ts +57 -0
- package/src/internal/clusterName.ts +19 -0
- package/src/internal/entityKeepAlive.ts +121 -0
- package/src/internal/entityMailbox.ts +324 -0
- package/src/internal/entityRegistry.ts +46 -0
- package/src/internal/entityReply.ts +54 -0
- package/src/internal/entityRuntime.ts +1318 -0
- package/src/internal/entitySql.ts +60 -0
- package/src/internal/entityStorage.ts +168 -0
- package/src/internal/entityWire.ts +204 -0
- package/src/internal/queueRuntime.ts +174 -0
- package/src/internal/queueStorage.ts +255 -0
- package/src/internal/registry.ts +31 -0
- package/src/internal/singletonRegistry.ts +21 -0
- package/src/internal/singletonRuntime.ts +88 -0
- package/src/internal/singletonStorage.ts +64 -0
- package/src/internal/transport.ts +67 -0
- package/src/internal/workflowRegistry.ts +78 -0
- package/src/internal/workflowRuntime.ts +443 -0
- package/src/internal/workflowStorage.ts +234 -0
- package/src/internal/workflowWire.ts +123 -0
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs Effect Cluster entities on Cloudflare Durable Objects.
|
|
3
|
+
*
|
|
4
|
+
* On this path every entity instance is one Durable Object: the Worker encodes
|
|
5
|
+
* an `(entityType, entityId)` address into a Durable Object name, resolves the
|
|
6
|
+
* object stub with `getByName`, and the object's SQLite storage is the system
|
|
7
|
+
* of record. There is no shard routing, no runner fleet, and no external
|
|
8
|
+
* message storage; `layer` provides the cluster `Sharding` service on top of
|
|
9
|
+
* the Durable Object namespace bindings instead of `Sharding.layer`.
|
|
10
|
+
*
|
|
11
|
+
* @stability experimental
|
|
12
|
+
* @since 4.1.3
|
|
13
|
+
*/
|
|
14
|
+
import * as Cause from "effect/Cause";
|
|
15
|
+
import { Clock } from "effect/Clock";
|
|
16
|
+
import { MailboxFull, PersistenceError } from "effect/cluster/ClusterError";
|
|
17
|
+
import { isUninterruptibleForClient, Persisted, Uninterruptible } from "effect/cluster/ClusterSchema";
|
|
18
|
+
import * as DeliverAt from "effect/cluster/DeliverAt";
|
|
19
|
+
import * as EntityAddress from "effect/cluster/EntityAddress";
|
|
20
|
+
import * as EntityId from "effect/cluster/EntityId";
|
|
21
|
+
import * as Envelope from "effect/cluster/Envelope";
|
|
22
|
+
import * as ShardId from "effect/cluster/ShardId";
|
|
23
|
+
import { Sharding } from "effect/cluster/Sharding";
|
|
24
|
+
import * as Context from "effect/Context";
|
|
25
|
+
import * as Deferred from "effect/Deferred";
|
|
26
|
+
import * as Duration from "effect/Duration";
|
|
27
|
+
import * as Effect from "effect/Effect";
|
|
28
|
+
import * as Exit from "effect/Exit";
|
|
29
|
+
import * as Layer from "effect/Layer";
|
|
30
|
+
import * as Option from "effect/Option";
|
|
31
|
+
import * as RpcClient from "effect/rpc/RpcClient";
|
|
32
|
+
import { RequestId } from "effect/rpc/RpcMessage";
|
|
33
|
+
import * as RpcSchema from "effect/rpc/RpcSchema";
|
|
34
|
+
import * as Schema from "effect/Schema";
|
|
35
|
+
import * as Scope from "effect/Scope";
|
|
36
|
+
import * as Stream from "effect/Stream";
|
|
37
|
+
import * as CloudflarePersistedQueue from "./CloudflarePersistedQueue.js";
|
|
38
|
+
import * as CloudflareWorkflowEngine from "./CloudflareWorkflowEngine.js";
|
|
39
|
+
import { setWithEviction } from "./internal/boundedMap.js";
|
|
40
|
+
import * as Internal from "./internal/clusterName.js";
|
|
41
|
+
import { defaultKeepAliveHeartbeatMillis, registerEntity as registerEntityHandler, unregisterEntity } from "./internal/entityRegistry.js";
|
|
42
|
+
import { CurrentEntityName, CurrentReplyRegistry } from "./internal/entityReply.js";
|
|
43
|
+
import { decodeInvokeResult, decodeReplyFor, encodeRequest } from "./internal/entityWire.js";
|
|
44
|
+
import { registerSingleton as registerSingletonHandler, unregisterSingleton } from "./internal/singletonRegistry.js";
|
|
45
|
+
import { boundedRetry, callDurableObject } from "./internal/transport.js";
|
|
46
|
+
/**
|
|
47
|
+
* Encodes an entity address into the Durable Object name used with
|
|
48
|
+
* `getByName`.
|
|
49
|
+
*
|
|
50
|
+
* **Details**
|
|
51
|
+
*
|
|
52
|
+
* The name is the entity type length-prefixed as `` `${type.length}:${type}${id}` ``,
|
|
53
|
+
* which keeps `(type, id)` pairs collision-free without restricting the
|
|
54
|
+
* characters an entity id may contain. Workflow, queue, and singleton names use
|
|
55
|
+
* the same scheme on their own namespaces.
|
|
56
|
+
*
|
|
57
|
+
* @stability experimental
|
|
58
|
+
* @category encoding
|
|
59
|
+
* @since 4.1.3
|
|
60
|
+
*/
|
|
61
|
+
export const encodeName = Internal.encodeName;
|
|
62
|
+
/**
|
|
63
|
+
* Decodes a Durable Object name produced by {@link encodeName} back into its
|
|
64
|
+
* entity address parts.
|
|
65
|
+
*
|
|
66
|
+
* **Details**
|
|
67
|
+
*
|
|
68
|
+
* Returns `undefined` for names that were not produced by {@link encodeName},
|
|
69
|
+
* including non-canonical length prefixes. A Durable Object uses this to
|
|
70
|
+
* recover its own address from `ctx.id.name`.
|
|
71
|
+
*
|
|
72
|
+
* @stability experimental
|
|
73
|
+
* @category decoding
|
|
74
|
+
* @since 4.1.3
|
|
75
|
+
*/
|
|
76
|
+
export const decodeName = Internal.decodeName;
|
|
77
|
+
/**
|
|
78
|
+
* Returns the singleton name of the seed singleton that `ClusterCron.make`
|
|
79
|
+
* registers for the cron job with the given name.
|
|
80
|
+
*
|
|
81
|
+
* **When to use**
|
|
82
|
+
*
|
|
83
|
+
* Use to wake a `ClusterCron` from a Worker Cron Trigger, by passing the
|
|
84
|
+
* result to `cluster.wake` with Alchemy or by prefixing it with `Singleton/`
|
|
85
|
+
* for `getByName` on the singleton namespace with Wrangler.
|
|
86
|
+
*
|
|
87
|
+
* **Details**
|
|
88
|
+
*
|
|
89
|
+
* The result is `"ClusterCron/<name>"`, the singleton name without the
|
|
90
|
+
* `Singleton/` Durable Object name prefix.
|
|
91
|
+
*
|
|
92
|
+
* **Gotchas**
|
|
93
|
+
*
|
|
94
|
+
* A singleton runs only when its Durable Object is woken, so a `ClusterCron`
|
|
95
|
+
* never schedules its first run until a Cron Trigger wakes this singleton.
|
|
96
|
+
* Each later run is scheduled through a destination alarm.
|
|
97
|
+
*
|
|
98
|
+
* @stability experimental
|
|
99
|
+
* @category encoding
|
|
100
|
+
* @since 4.1.3
|
|
101
|
+
*/
|
|
102
|
+
export const clusterCronSingletonName = name => `ClusterCron/${name}`;
|
|
103
|
+
const notImplemented = method => Effect.die(new Error(`CloudflareCluster: ${method} is not implemented yet on the Cloudflare Durable Object path`));
|
|
104
|
+
const notSupported = method => Effect.die(new Error(`CloudflareCluster: ${method} is not supported on the Cloudflare Durable Object path`));
|
|
105
|
+
class ClientTarget extends /*#__PURE__*/Context.Service()("@effect/platform-cloudflare/CloudflareCluster/ClientTarget") {}
|
|
106
|
+
const uuidV7 = timestamp => {
|
|
107
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
108
|
+
bytes[0] = Math.floor(timestamp / 2 ** 40);
|
|
109
|
+
bytes[1] = Math.floor(timestamp / 2 ** 32) & 0xff;
|
|
110
|
+
bytes[2] = Math.floor(timestamp / 2 ** 24) & 0xff;
|
|
111
|
+
bytes[3] = Math.floor(timestamp / 2 ** 16) & 0xff;
|
|
112
|
+
bytes[4] = Math.floor(timestamp / 2 ** 8) & 0xff;
|
|
113
|
+
bytes[5] = timestamp & 0xff;
|
|
114
|
+
bytes[6] = bytes[6] & 0x0f | 0x70;
|
|
115
|
+
bytes[8] = bytes[8] & 0x3f | 0x80;
|
|
116
|
+
const hex = byte => byte.toString(16).padStart(2, "0");
|
|
117
|
+
return [bytes.subarray(0, 4), bytes.subarray(4, 6), bytes.subarray(6, 8), bytes.subarray(8, 10), bytes.subarray(10)].map(part => Array.from(part, hex).join("")).join("-");
|
|
118
|
+
};
|
|
119
|
+
const requestTargetCapacity = 4096;
|
|
120
|
+
// ClusterCron owns this entity inside its layer, so callers cannot include it
|
|
121
|
+
// in LayerOptions.entities. Its reserved shape is the only implicit entity.
|
|
122
|
+
const isClusterCronEntity = entity => {
|
|
123
|
+
if (!entity.type.startsWith("ClusterCron/") || entity.protocol.requests.size !== 2) return false;
|
|
124
|
+
const run = entity.protocol.requests.get("run");
|
|
125
|
+
const start = entity.protocol.requests.get("start");
|
|
126
|
+
return run !== undefined && start !== undefined && Context.get(run.annotations, Persisted) && Context.get(run.annotations, Uninterruptible) === true && Context.get(start.annotations, Persisted);
|
|
127
|
+
};
|
|
128
|
+
const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {
|
|
129
|
+
const layerScope = yield* Effect.scope;
|
|
130
|
+
const layerContext = yield* Effect.context();
|
|
131
|
+
const entities = new Map();
|
|
132
|
+
for (const entity of options.entities) {
|
|
133
|
+
entities.set(entity.type, entity);
|
|
134
|
+
}
|
|
135
|
+
const clock = yield* Clock;
|
|
136
|
+
const keepAliveHeartbeat = Duration.toMillis(options.keepAliveHeartbeat ?? defaultKeepAliveHeartbeatMillis);
|
|
137
|
+
const requestTargets = new Map();
|
|
138
|
+
const unknownEntity = entity => Effect.die(new Error(`CloudflareCluster: entity type "${entity.type}" is not part of the entities bound at Worker init`));
|
|
139
|
+
const buildClient = Effect.fnUntraced(function* (entity) {
|
|
140
|
+
const entries = new Map();
|
|
141
|
+
// `handleFromClient` is hoisted and only invoked once requests are made,
|
|
142
|
+
// after `client` is constructed.
|
|
143
|
+
const client = yield* RpcClient.makeNoSerialization(entity.protocol, {
|
|
144
|
+
spanPrefix: `${entity.type}.client`,
|
|
145
|
+
supportsAck: true,
|
|
146
|
+
generateRequestId: () => RequestId(uuidV7(clock.currentTimeMillisUnsafe())),
|
|
147
|
+
flatten: true,
|
|
148
|
+
onFromClient: options => handleFromClient(options)
|
|
149
|
+
});
|
|
150
|
+
const deliverReplies = (entry, replyTexts) => Effect.forEach(replyTexts, replyText => Effect.flatMap(decodeReplyFor(entry.rpc, entry.context, replyText), reply => {
|
|
151
|
+
if (reply._tag === "Chunk") {
|
|
152
|
+
entry.lastChunkId = String(reply.id);
|
|
153
|
+
return client.write({
|
|
154
|
+
_tag: "Chunk",
|
|
155
|
+
clientId: 0,
|
|
156
|
+
requestId: RequestId(entry.clientRequestId),
|
|
157
|
+
values: reply.values
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
entries.delete(entry.clientRequestId);
|
|
161
|
+
return client.write({
|
|
162
|
+
_tag: "Exit",
|
|
163
|
+
clientId: 0,
|
|
164
|
+
requestId: RequestId(entry.clientRequestId),
|
|
165
|
+
exit: reply.exit
|
|
166
|
+
});
|
|
167
|
+
}), {
|
|
168
|
+
discard: true
|
|
169
|
+
});
|
|
170
|
+
function handleFromClient({
|
|
171
|
+
context,
|
|
172
|
+
message
|
|
173
|
+
}) {
|
|
174
|
+
const target = Context.getUnsafe(context, ClientTarget);
|
|
175
|
+
switch (message._tag) {
|
|
176
|
+
case "Request":
|
|
177
|
+
{
|
|
178
|
+
const discard = message.discard === true;
|
|
179
|
+
const rpc = entity.protocol.requests.get(message.tag);
|
|
180
|
+
const clientRequestId = String(message.id);
|
|
181
|
+
const encode = Schema.encodeUnknownEffect(Schema.toCodecJson(rpc.payloadSchema))(message.payload).pipe(Effect.provideContext(context), Effect.orDie);
|
|
182
|
+
return Effect.flatMap(encode, payload => {
|
|
183
|
+
const envelope = encodeRequest({
|
|
184
|
+
requestId: clientRequestId,
|
|
185
|
+
address: target.address,
|
|
186
|
+
tag: message.tag,
|
|
187
|
+
payload,
|
|
188
|
+
headers: message.headers,
|
|
189
|
+
...(message.traceId === undefined ? undefined : {
|
|
190
|
+
traceId: message.traceId,
|
|
191
|
+
spanId: message.spanId,
|
|
192
|
+
sampled: message.sampled
|
|
193
|
+
})
|
|
194
|
+
});
|
|
195
|
+
const entry = {
|
|
196
|
+
rpc,
|
|
197
|
+
context,
|
|
198
|
+
clientRequestId,
|
|
199
|
+
storageRequestId: clientRequestId
|
|
200
|
+
};
|
|
201
|
+
if (!discard) entries.set(clientRequestId, entry);
|
|
202
|
+
const deliverAt = DeliverAt.toMillis(message.payload);
|
|
203
|
+
const delayed = deliverAt !== null && deliverAt > clock.currentTimeMillisUnsafe();
|
|
204
|
+
const persisted = Context.get(rpc.annotations, Persisted);
|
|
205
|
+
const primaryKey = Envelope.primaryKey({
|
|
206
|
+
...message,
|
|
207
|
+
requestId: message.id,
|
|
208
|
+
address: target.address,
|
|
209
|
+
headers: message.headers
|
|
210
|
+
});
|
|
211
|
+
const replyTo = discard ? undefined : Option.getOrUndefined(Context.getOption(context, CurrentEntityName));
|
|
212
|
+
const replyRegistry = discard ? undefined : Option.getOrUndefined(Context.getOption(context, CurrentReplyRegistry));
|
|
213
|
+
if (delayed && (!persisted || !discard && primaryKey === null)) {
|
|
214
|
+
entries.delete(clientRequestId);
|
|
215
|
+
return Effect.fail(new PersistenceError({
|
|
216
|
+
cause: new Error(!persisted ? "Future DeliverAt requests must be persisted" : "Future DeliverAt asks must define a PrimaryKey")
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
if (delayed && RpcSchema.isStreamSchema(rpc.successSchema)) {
|
|
220
|
+
entries.delete(clientRequestId);
|
|
221
|
+
return Effect.fail(new PersistenceError({
|
|
222
|
+
cause: new Error("Stream asks with a future DeliverAt are not supported")
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
const delivery = delayed ? {
|
|
226
|
+
deliverAt: deliverAt,
|
|
227
|
+
primaryKey,
|
|
228
|
+
...(replyTo === undefined ? undefined : {
|
|
229
|
+
replyTo
|
|
230
|
+
})
|
|
231
|
+
} : replyTo === undefined ? undefined : {
|
|
232
|
+
replyTo
|
|
233
|
+
};
|
|
234
|
+
// A pinned caller receives the scheduled reply pushed over its own
|
|
235
|
+
// Durable Object's `deliverReply` RPC, which completes this waiter.
|
|
236
|
+
// The destination stores this request id with the reply target and
|
|
237
|
+
// pushes under it, so registering before the send closes the race.
|
|
238
|
+
const pushedReply = delivery?.replyTo !== undefined && replyRegistry !== undefined ? Deferred.makeUnsafe() : undefined;
|
|
239
|
+
if (pushedReply !== undefined) replyRegistry.register(clientRequestId, pushedReply);
|
|
240
|
+
// The mailbox dedupes on the request id, so a persisted request is
|
|
241
|
+
// safe to retry. A non-persisted one may already be running.
|
|
242
|
+
const send = callDurableObject({
|
|
243
|
+
resolve: target.resolve,
|
|
244
|
+
call: stub => stub.invoke(envelope, discard, delivery),
|
|
245
|
+
retry: persisted ? boundedRetry : undefined
|
|
246
|
+
}).pipe(Effect.flatMap(decodeInvokeResult), Effect.flatMap(result => {
|
|
247
|
+
switch (result._tag) {
|
|
248
|
+
case "MailboxFull":
|
|
249
|
+
return Effect.fail(new MailboxFull({
|
|
250
|
+
address: target.address
|
|
251
|
+
}));
|
|
252
|
+
case "EncodedMessageTooLarge":
|
|
253
|
+
return Effect.fail(new PersistenceError({
|
|
254
|
+
cause: new Error("Encoded entity message exceeds 2 MB")
|
|
255
|
+
}));
|
|
256
|
+
case "AskDeduplicatedToTell":
|
|
257
|
+
return Effect.fail(new PersistenceError({
|
|
258
|
+
cause: new Error("Cannot deduplicate an ask onto a tell with the same PrimaryKey")
|
|
259
|
+
}));
|
|
260
|
+
case "Success":
|
|
261
|
+
{
|
|
262
|
+
entry.storageRequestId = result.requestId;
|
|
263
|
+
if (!discard && persisted) {
|
|
264
|
+
setWithEviction(requestTargets, clientRequestId, {
|
|
265
|
+
resolve: target.resolve,
|
|
266
|
+
storageRequestId: result.requestId
|
|
267
|
+
}, requestTargetCapacity);
|
|
268
|
+
}
|
|
269
|
+
// A discarded call is acknowledged once its message is delivered.
|
|
270
|
+
if (discard) {
|
|
271
|
+
return client.write({
|
|
272
|
+
_tag: "Exit",
|
|
273
|
+
clientId: 0,
|
|
274
|
+
requestId: RequestId(clientRequestId),
|
|
275
|
+
exit: Exit.void
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
if (pushedReply !== undefined && result.replies.length === 0) {
|
|
279
|
+
return Effect.flatMap(Deferred.await(pushedReply), replyText => deliverReplies(entry, [replyText]));
|
|
280
|
+
}
|
|
281
|
+
return deliverReplies(entry, result.replies);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}),
|
|
285
|
+
// A failed send gets no `Exit` reply, so release its entry here.
|
|
286
|
+
// An interrupt releases it in the `Interrupt` case instead, which
|
|
287
|
+
// still needs it to reach the Durable Object.
|
|
288
|
+
Effect.onExit(exit => Exit.isFailure(exit) && !Cause.hasInterruptsOnly(exit.cause) ? Effect.sync(() => entries.delete(clientRequestId)) : Effect.void));
|
|
289
|
+
return pushedReply === undefined ? send : Effect.ensuring(send, Effect.sync(() => replyRegistry.unregister(clientRequestId, pushedReply)));
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
case "Ack":
|
|
293
|
+
{
|
|
294
|
+
const entry = entries.get(String(message.requestId));
|
|
295
|
+
if (entry === undefined || entry.lastChunkId === undefined) return Effect.void;
|
|
296
|
+
const lastChunkId = entry.lastChunkId;
|
|
297
|
+
return callDurableObject({
|
|
298
|
+
resolve: target.resolve,
|
|
299
|
+
call: stub => stub.acknowledge(entry.storageRequestId, lastChunkId),
|
|
300
|
+
retry: boundedRetry
|
|
301
|
+
}).pipe(Effect.flatMap(replies => deliverReplies(entry, replies)));
|
|
302
|
+
}
|
|
303
|
+
case "Interrupt":
|
|
304
|
+
{
|
|
305
|
+
const clientRequestId = String(message.requestId);
|
|
306
|
+
const entry = entries.get(clientRequestId);
|
|
307
|
+
entries.delete(clientRequestId);
|
|
308
|
+
requestTargets.delete(clientRequestId);
|
|
309
|
+
if (entry === undefined) return Effect.void;
|
|
310
|
+
if (isUninterruptibleForClient(entry.rpc.annotations)) return Effect.void;
|
|
311
|
+
return callDurableObject({
|
|
312
|
+
resolve: target.resolve,
|
|
313
|
+
call: stub => stub.interrupt(entry.storageRequestId, clientRequestId),
|
|
314
|
+
retry: boundedRetry
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
default:
|
|
318
|
+
return Effect.void;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return entityId => {
|
|
322
|
+
const id = EntityId.make(entityId);
|
|
323
|
+
const name = Internal.encodeName(entity.type, entityId);
|
|
324
|
+
const target = ClientTarget.context({
|
|
325
|
+
address: EntityAddress.make({
|
|
326
|
+
shardId: ShardId.make(entity.getShardGroup(id), 1),
|
|
327
|
+
entityId: id,
|
|
328
|
+
entityType: entity.type
|
|
329
|
+
}),
|
|
330
|
+
resolve: () => options.entityNamespace.getByName(name)
|
|
331
|
+
});
|
|
332
|
+
const result = {};
|
|
333
|
+
for (const tag of entity.protocol.requests.keys()) {
|
|
334
|
+
const rpc = entity.protocol.requests.get(tag);
|
|
335
|
+
const isStream = RpcSchema.isStreamSchema(rpc.successSchema);
|
|
336
|
+
const contextFor = (ambient, methodOptions) => {
|
|
337
|
+
const currentEntityName = Option.getOrUndefined(Context.getOption(ambient, CurrentEntityName));
|
|
338
|
+
const replyRegistry = Option.getOrUndefined(Context.getOption(ambient, CurrentReplyRegistry));
|
|
339
|
+
let requestContext = currentEntityName === undefined ? target : Context.add(target, CurrentEntityName, currentEntityName);
|
|
340
|
+
if (replyRegistry !== undefined) {
|
|
341
|
+
requestContext = Context.add(requestContext, CurrentReplyRegistry, replyRegistry);
|
|
342
|
+
}
|
|
343
|
+
if (methodOptions?.context !== undefined) {
|
|
344
|
+
requestContext = Context.merge(methodOptions.context, requestContext);
|
|
345
|
+
}
|
|
346
|
+
return requestContext;
|
|
347
|
+
};
|
|
348
|
+
result[tag] = (payload, methodOptions) => {
|
|
349
|
+
// The caller's context is read when the request runs, so it carries
|
|
350
|
+
// the calling entity's reply target. The untyped protocol erases
|
|
351
|
+
// the stream/queue return shape, hence `any`.
|
|
352
|
+
const call = ambient => client.client(tag, payload, {
|
|
353
|
+
...methodOptions,
|
|
354
|
+
context: contextFor(ambient, methodOptions)
|
|
355
|
+
});
|
|
356
|
+
// With `asQueue`, a stream RPC yields its Dequeue as an Effect.
|
|
357
|
+
return isStream && methodOptions?.asQueue !== true ? Stream.unwrap(Effect.map(Effect.context(), call)) : Effect.contextWith(call);
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
return result;
|
|
361
|
+
};
|
|
362
|
+
});
|
|
363
|
+
// Like `Sharding`, each entity's base client is built once from the layer
|
|
364
|
+
// context and scope, so it needs no caller Scope, outlives the scope it was
|
|
365
|
+
// first requested in, and resolves client middleware from the layer rather
|
|
366
|
+
// than from whichever caller asked first.
|
|
367
|
+
const clientContext = Context.add(layerContext, Scope.Scope, layerScope);
|
|
368
|
+
const clients = new Map();
|
|
369
|
+
const makeClient = entity => Effect.suspend(() => {
|
|
370
|
+
if (!entities.has(entity.type)) return unknownEntity(entity);
|
|
371
|
+
const existing = clients.get(entity);
|
|
372
|
+
if (existing !== undefined) return Deferred.await(existing);
|
|
373
|
+
const deferred = Deferred.makeUnsafe();
|
|
374
|
+
clients.set(entity, deferred);
|
|
375
|
+
return buildClient(entity).pipe(Effect.provideContext(clientContext), Effect.tap(factory => Deferred.succeed(deferred, factory)), Effect.uninterruptible);
|
|
376
|
+
});
|
|
377
|
+
const registerEntity = Effect.fnUntraced(function* (entity, build, buildOptions) {
|
|
378
|
+
const declared = entities.has(entity.type);
|
|
379
|
+
if (!declared && !isClusterCronEntity(entity)) {
|
|
380
|
+
return yield* unknownEntity(entity);
|
|
381
|
+
}
|
|
382
|
+
const context = yield* Effect.context();
|
|
383
|
+
const registration = {
|
|
384
|
+
entity,
|
|
385
|
+
build: build,
|
|
386
|
+
options: buildOptions,
|
|
387
|
+
context,
|
|
388
|
+
keepAliveHeartbeat
|
|
389
|
+
};
|
|
390
|
+
if (!registerEntityHandler(entity.type, registration)) return;
|
|
391
|
+
if (!declared) entities.set(entity.type, entity);
|
|
392
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
393
|
+
unregisterEntity(entity.type, registration);
|
|
394
|
+
if (!declared && entities.get(entity.type) === entity) entities.delete(entity.type);
|
|
395
|
+
}));
|
|
396
|
+
});
|
|
397
|
+
const registerSingleton = Effect.fnUntraced(function* (name, run) {
|
|
398
|
+
// Fails fast at registration when the singleton namespace binding is
|
|
399
|
+
// missing, before any Cron Trigger fires.
|
|
400
|
+
options.singletonNamespace.getByName(`Singleton/${name}`);
|
|
401
|
+
const context = yield* Effect.context();
|
|
402
|
+
const registration = {
|
|
403
|
+
run: run,
|
|
404
|
+
context
|
|
405
|
+
};
|
|
406
|
+
if (!registerSingletonHandler(name, registration)) {
|
|
407
|
+
return yield* Effect.die(`Singleton '${name}' is already registered`);
|
|
408
|
+
}
|
|
409
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
410
|
+
unregisterSingleton(name, registration);
|
|
411
|
+
}));
|
|
412
|
+
});
|
|
413
|
+
return Sharding.of({
|
|
414
|
+
getRegistrationEvents: Stream.never,
|
|
415
|
+
getShardId: (_entityId, group) => ShardId.make(group, 1),
|
|
416
|
+
hasShardId: () => true,
|
|
417
|
+
// A Snowflake needs a machine id unique across the fleet, which isolates
|
|
418
|
+
// do not have.
|
|
419
|
+
getSnowflake: notSupported("Sharding.getSnowflake"),
|
|
420
|
+
isShutdown: Effect.succeed(false),
|
|
421
|
+
makeClient: makeClient,
|
|
422
|
+
registerEntity: registerEntity,
|
|
423
|
+
registerSingleton: registerSingleton,
|
|
424
|
+
send: () => notImplemented("Sharding.send"),
|
|
425
|
+
sendOutgoing: () => notImplemented("Sharding.sendOutgoing"),
|
|
426
|
+
notify: () => notImplemented("Sharding.notify"),
|
|
427
|
+
reset: requestId => {
|
|
428
|
+
const target = requestTargets.get(String(requestId));
|
|
429
|
+
if (target === undefined) return Effect.succeed(false);
|
|
430
|
+
return callDurableObject({
|
|
431
|
+
resolve: target.resolve,
|
|
432
|
+
call: stub => stub.reset(target.storageRequestId),
|
|
433
|
+
retry: boundedRetry
|
|
434
|
+
}).pipe(Effect.orDie, Effect.as(true));
|
|
435
|
+
},
|
|
436
|
+
pollStorage: notImplemented("Sharding.pollStorage"),
|
|
437
|
+
activeEntityCount: Effect.succeed(0)
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
/**
|
|
441
|
+
* Builds the cluster on Cloudflare Durable Objects.
|
|
442
|
+
*
|
|
443
|
+
* **Details**
|
|
444
|
+
*
|
|
445
|
+
* Provides the cluster `Sharding` service on top of the four same-Worker
|
|
446
|
+
* Durable Object namespace bindings, plus the `WorkflowEngine` backed by the
|
|
447
|
+
* workflow class and the `PersistedQueueFactory` backed by the queue class, so
|
|
448
|
+
* the `DurableQueue` user API works out of the box. `Entity.client` resolves
|
|
449
|
+
* an entity to its Durable Object by
|
|
450
|
+
* encoding `(type, id)` with {@link encodeName} and calling `getByName`; an
|
|
451
|
+
* unknown entity type or a bad encode fails at the Worker before any Durable
|
|
452
|
+
* Object is contacted. Entity handlers registered with `Entity.toLayer` are
|
|
453
|
+
* recorded per `EntityType` at Worker init and built once per Durable Object
|
|
454
|
+
* wake; workflow handlers registered with `Workflow.toLayer` follow the same
|
|
455
|
+
* pattern on the workflow class.
|
|
456
|
+
*
|
|
457
|
+
* @stability experimental
|
|
458
|
+
* @category layers
|
|
459
|
+
* @since 4.1.3
|
|
460
|
+
*/
|
|
461
|
+
export const layer = options => Layer.mergeAll(Layer.effect(Sharding, make(options)), CloudflareWorkflowEngine.layer({
|
|
462
|
+
workflowNamespace: options.workflowNamespace
|
|
463
|
+
}), CloudflarePersistedQueue.layer({
|
|
464
|
+
queueNamespace: options.queueNamespace
|
|
465
|
+
}));
|
|
466
|
+
/**
|
|
467
|
+
* An `SqlClient` on the current entity Durable Object's own SQLite storage.
|
|
468
|
+
*
|
|
469
|
+
* **When to use**
|
|
470
|
+
*
|
|
471
|
+
* Use to keep rows next to the entity's mailbox from an entity handler build
|
|
472
|
+
* or handler, such as state that must survive eviction and commit atomically
|
|
473
|
+
* with each step. Register the handlers with `Entity.toLayer` and read the
|
|
474
|
+
* client with {@link DurableObjectSqlClient.orDie} in the build.
|
|
475
|
+
*
|
|
476
|
+
* **Details**
|
|
477
|
+
*
|
|
478
|
+
* Each entity Durable Object provides this service, an `@effect/sql-sqlite-do`
|
|
479
|
+
* client, to its handler build and handlers, including handlers registered
|
|
480
|
+
* with `Entity.toLayerQueue`. Yielding the tag directly leaves it as a layer
|
|
481
|
+
* requirement; `orDie` has none. It is a separate tag, so any
|
|
482
|
+
* `SqlClient` from the Worker layer (a D1 database, say) stays reachable inside
|
|
483
|
+
* the handlers. To run code written against `SqlClient.SqlClient`, provide this
|
|
484
|
+
* client as that service locally.
|
|
485
|
+
*
|
|
486
|
+
* `withTransaction` uses the object's storage transaction, so several rows
|
|
487
|
+
* commit or roll back together. Rows live and die with the entity's Durable
|
|
488
|
+
* Object and cannot be queried from outside it.
|
|
489
|
+
*
|
|
490
|
+
* **Gotchas**
|
|
491
|
+
*
|
|
492
|
+
* - Outside an entity Durable Object, `orDie` dies on the first handler build.
|
|
493
|
+
* In tests, provide this service from any SQL layer.
|
|
494
|
+
* - Table names starting with `cluster_` are reserved for the entity mailbox.
|
|
495
|
+
* - A row, like an encoded message, cannot exceed 2 MB.
|
|
496
|
+
* - A storage transaction closes the Durable Object's input gate until it
|
|
497
|
+
* finishes, so timers and I/O awaited inside `withTransaction` never
|
|
498
|
+
* resume. Keep transactions to SQL work.
|
|
499
|
+
* - Mailbox writes wait for an open transaction to finish, so a rollback never
|
|
500
|
+
* takes another handler's stored reply with it.
|
|
501
|
+
*
|
|
502
|
+
* **Example** (Storing rows from entity handlers)
|
|
503
|
+
*
|
|
504
|
+
* ```ts
|
|
505
|
+
* import { CloudflareCluster } from "@effect/platform-cloudflare"
|
|
506
|
+
* import { Effect } from "effect"
|
|
507
|
+
*
|
|
508
|
+
* const JournalLayer = Journal.toLayer(Effect.gen(function*() {
|
|
509
|
+
* const sql = yield* CloudflareCluster.DurableObjectSqlClient.orDie
|
|
510
|
+
* yield* sql`CREATE TABLE IF NOT EXISTS journal (entry TEXT NOT NULL)`.pipe(Effect.orDie)
|
|
511
|
+
* return Journal.of({
|
|
512
|
+
* Append: ({ payload }) => sql`INSERT INTO journal (entry) VALUES (${payload.entry})`.pipe(Effect.orDie)
|
|
513
|
+
* })
|
|
514
|
+
* }))
|
|
515
|
+
* ```
|
|
516
|
+
*
|
|
517
|
+
* @stability experimental
|
|
518
|
+
* @category services
|
|
519
|
+
* @since 4.1.3
|
|
520
|
+
*/
|
|
521
|
+
export class DurableObjectSqlClient extends /*#__PURE__*/Context.Service()("@effect/platform-cloudflare/CloudflareCluster/DurableObjectSqlClient") {
|
|
522
|
+
/**
|
|
523
|
+
* Gets the current entity's SQL client, or dies if no client is provided.
|
|
524
|
+
*
|
|
525
|
+
* @stability experimental
|
|
526
|
+
* @since 4.1.3
|
|
527
|
+
*/
|
|
528
|
+
static orDie = /*#__PURE__*/Effect.flatMap(/*#__PURE__*/Effect.serviceOption(DurableObjectSqlClient), /*#__PURE__*/Option.match({
|
|
529
|
+
onNone: () => Effect.die(new Error("DurableObjectSqlClient is not available outside an entity Durable Object; provide it from a SQL layer in tests")),
|
|
530
|
+
onSome: Effect.succeed
|
|
531
|
+
}));
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=CloudflareCluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CloudflareCluster.js","names":[],"sources":["../src/CloudflareCluster.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|