@effect/platform-cloudflare 0.0.0 → 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.
Files changed (237) hide show
  1. package/AGENTS.md +434 -0
  2. package/CLAUDE.md +434 -0
  3. package/LICENSE +21 -0
  4. package/README.md +506 -0
  5. package/ai-docs/README.md +44 -0
  6. package/ai-docs/package.json +36 -0
  7. package/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
  8. package/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +52 -0
  9. package/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
  10. package/ai-docs/src/01_effect/01_basics/index.md +7 -0
  11. package/ai-docs/src/01_effect/02_schema/10_schema-basics.ts +43 -0
  12. package/ai-docs/src/01_effect/02_schema/index.md +7 -0
  13. package/ai-docs/src/01_effect/03_services/01_service.ts +45 -0
  14. package/ai-docs/src/01_effect/03_services/10_reference.ts +10 -0
  15. package/ai-docs/src/01_effect/03_services/20_layer-composition.ts +70 -0
  16. package/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts +66 -0
  17. package/ai-docs/src/01_effect/03_services/index.md +5 -0
  18. package/ai-docs/src/01_effect/04_errors/01_error-handling.ts +30 -0
  19. package/ai-docs/src/01_effect/04_errors/10_catch-tags.ts +24 -0
  20. package/ai-docs/src/01_effect/04_errors/20_reason-errors.ts +64 -0
  21. package/ai-docs/src/01_effect/04_errors/index.md +1 -0
  22. package/ai-docs/src/01_effect/05_resources/10_acquire-release.ts +105 -0
  23. package/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts +31 -0
  24. package/ai-docs/src/01_effect/05_resources/30_layer-map.ts +86 -0
  25. package/ai-docs/src/01_effect/05_resources/index.md +3 -0
  26. package/ai-docs/src/01_effect/06_running/10_run-main.ts +30 -0
  27. package/ai-docs/src/01_effect/06_running/20_layer-launch.ts +27 -0
  28. package/ai-docs/src/01_effect/06_running/index.md +1 -0
  29. package/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts +56 -0
  30. package/ai-docs/src/01_effect/07_pubsub/index.md +3 -0
  31. package/ai-docs/src/03_stream/10_creating-streams.ts +103 -0
  32. package/ai-docs/src/03_stream/20_consuming-streams.ts +137 -0
  33. package/ai-docs/src/03_stream/30_encoding.ts +163 -0
  34. package/ai-docs/src/03_stream/index.md +4 -0
  35. package/ai-docs/src/04_integration/10_managed-runtime.ts +129 -0
  36. package/ai-docs/src/04_integration/index.md +5 -0
  37. package/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
  38. package/ai-docs/src/05_batching/index.md +3 -0
  39. package/ai-docs/src/06_schedule/10_schedules.ts +111 -0
  40. package/ai-docs/src/06_schedule/index.md +3 -0
  41. package/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
  42. package/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
  43. package/ai-docs/src/07_datetime/index.md +5 -0
  44. package/ai-docs/src/08_observability/10_logging.ts +66 -0
  45. package/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
  46. package/ai-docs/src/08_observability/index.md +7 -0
  47. package/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
  48. package/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
  49. package/ai-docs/src/09_testing/index.md +1 -0
  50. package/ai-docs/src/10_predicate/01_basics.ts +14 -0
  51. package/ai-docs/src/10_predicate/index.md +9 -0
  52. package/ai-docs/src/40_sql/10_basics.ts +175 -0
  53. package/ai-docs/src/40_sql/index.md +6 -0
  54. package/ai-docs/src/50_http-client/10_basics.ts +102 -0
  55. package/ai-docs/src/50_http-client/index.md +3 -0
  56. package/ai-docs/src/51_http-server/10_basics.ts +118 -0
  57. package/ai-docs/src/51_http-server/20_testing.ts +100 -0
  58. package/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
  59. package/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
  60. package/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
  61. package/ai-docs/src/51_http-server/fixtures/api/Users.ts +107 -0
  62. package/ai-docs/src/51_http-server/fixtures/domain/User.ts +21 -0
  63. package/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
  64. package/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +37 -0
  65. package/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +80 -0
  66. package/ai-docs/src/51_http-server/fixtures/server/Users.ts +183 -0
  67. package/ai-docs/src/51_http-server/index.md +3 -0
  68. package/ai-docs/src/52_graphql/10_basics.ts +117 -0
  69. package/ai-docs/src/52_graphql/20_testing.ts +45 -0
  70. package/ai-docs/src/52_graphql/30_batching.ts +118 -0
  71. package/ai-docs/src/52_graphql/40_aliased-batching.ts +124 -0
  72. package/ai-docs/src/52_graphql/50_errors-and-retries.ts +74 -0
  73. package/ai-docs/src/52_graphql/index.md +6 -0
  74. package/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
  75. package/ai-docs/src/60_child-process/index.md +3 -0
  76. package/ai-docs/src/70_cli/10_basics.ts +162 -0
  77. package/ai-docs/src/70_cli/index.md +5 -0
  78. package/ai-docs/src/71_ai/10_language-model.ts +156 -0
  79. package/ai-docs/src/71_ai/20_tools.ts +226 -0
  80. package/ai-docs/src/71_ai/30_chat.ts +158 -0
  81. package/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
  82. package/ai-docs/src/71_ai/index.md +5 -0
  83. package/ai-docs/src/80_cluster/10_entities.ts +97 -0
  84. package/ai-docs/src/80_cluster/index.md +4 -0
  85. package/ai-docs/src/index.md +10 -0
  86. package/ai-docs/tsconfig.json +28 -0
  87. package/dist/AlchemyCloudflareCluster.d.ts +134 -0
  88. package/dist/AlchemyCloudflareCluster.d.ts.map +1 -0
  89. package/dist/AlchemyCloudflareCluster.js +111 -0
  90. package/dist/AlchemyCloudflareCluster.js.map +1 -0
  91. package/dist/CloudflareCluster.d.ts +196 -0
  92. package/dist/CloudflareCluster.d.ts.map +1 -0
  93. package/dist/CloudflareCluster.js +533 -0
  94. package/dist/CloudflareCluster.js.map +1 -0
  95. package/dist/CloudflareDurableObjectPrograms.d.ts +279 -0
  96. package/dist/CloudflareDurableObjectPrograms.d.ts.map +1 -0
  97. package/dist/CloudflareDurableObjectPrograms.js +295 -0
  98. package/dist/CloudflareDurableObjectPrograms.js.map +1 -0
  99. package/dist/CloudflareDurableObjects.d.ts +149 -0
  100. package/dist/CloudflareDurableObjects.d.ts.map +1 -0
  101. package/dist/CloudflareDurableObjects.js +337 -0
  102. package/dist/CloudflareDurableObjects.js.map +1 -0
  103. package/dist/CloudflarePersistedQueue.d.ts +36 -0
  104. package/dist/CloudflarePersistedQueue.d.ts.map +1 -0
  105. package/dist/CloudflarePersistedQueue.js +122 -0
  106. package/dist/CloudflarePersistedQueue.js.map +1 -0
  107. package/dist/CloudflareWorkflowEngine.d.ts +72 -0
  108. package/dist/CloudflareWorkflowEngine.d.ts.map +1 -0
  109. package/dist/CloudflareWorkflowEngine.js +187 -0
  110. package/dist/CloudflareWorkflowEngine.js.map +1 -0
  111. package/dist/index.d.ts +29 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +33 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/internal/alchemyCluster.d.ts +2 -0
  116. package/dist/internal/alchemyCluster.d.ts.map +1 -0
  117. package/dist/internal/alchemyCluster.js +75 -0
  118. package/dist/internal/alchemyCluster.js.map +1 -0
  119. package/dist/internal/boundedMap.d.ts +3 -0
  120. package/dist/internal/boundedMap.d.ts.map +1 -0
  121. package/dist/internal/boundedMap.js +15 -0
  122. package/dist/internal/boundedMap.js.map +1 -0
  123. package/dist/internal/cluster.d.ts +57 -0
  124. package/dist/internal/cluster.d.ts.map +1 -0
  125. package/dist/internal/cluster.js +2 -0
  126. package/dist/internal/cluster.js.map +1 -0
  127. package/dist/internal/clusterName.d.ts +2 -0
  128. package/dist/internal/clusterName.d.ts.map +1 -0
  129. package/dist/internal/clusterName.js +16 -0
  130. package/dist/internal/clusterName.js.map +1 -0
  131. package/dist/internal/entityKeepAlive.d.ts +2 -0
  132. package/dist/internal/entityKeepAlive.d.ts.map +1 -0
  133. package/dist/internal/entityKeepAlive.js +73 -0
  134. package/dist/internal/entityKeepAlive.js.map +1 -0
  135. package/dist/internal/entityMailbox.d.ts +2 -0
  136. package/dist/internal/entityMailbox.d.ts.map +1 -0
  137. package/dist/internal/entityMailbox.js +160 -0
  138. package/dist/internal/entityMailbox.js.map +1 -0
  139. package/dist/internal/entityRegistry.d.ts +16 -0
  140. package/dist/internal/entityRegistry.d.ts.map +1 -0
  141. package/dist/internal/entityRegistry.js +22 -0
  142. package/dist/internal/entityRegistry.js.map +1 -0
  143. package/dist/internal/entityReply.d.ts +2 -0
  144. package/dist/internal/entityReply.d.ts.map +1 -0
  145. package/dist/internal/entityReply.js +35 -0
  146. package/dist/internal/entityReply.js.map +1 -0
  147. package/dist/internal/entityRuntime.d.ts +2 -0
  148. package/dist/internal/entityRuntime.d.ts.map +1 -0
  149. package/dist/internal/entityRuntime.js +823 -0
  150. package/dist/internal/entityRuntime.js.map +1 -0
  151. package/dist/internal/entitySql.d.ts +2 -0
  152. package/dist/internal/entitySql.d.ts.map +1 -0
  153. package/dist/internal/entitySql.js +29 -0
  154. package/dist/internal/entitySql.js.map +1 -0
  155. package/dist/internal/entityStorage.d.ts +2 -0
  156. package/dist/internal/entityStorage.d.ts.map +1 -0
  157. package/dist/internal/entityStorage.js +98 -0
  158. package/dist/internal/entityStorage.js.map +1 -0
  159. package/dist/internal/entityWire.d.ts +2 -0
  160. package/dist/internal/entityWire.d.ts.map +1 -0
  161. package/dist/internal/entityWire.js +146 -0
  162. package/dist/internal/entityWire.js.map +1 -0
  163. package/dist/internal/queueRuntime.d.ts +2 -0
  164. package/dist/internal/queueRuntime.d.ts.map +1 -0
  165. package/dist/internal/queueRuntime.js +88 -0
  166. package/dist/internal/queueRuntime.js.map +1 -0
  167. package/dist/internal/queueStorage.d.ts +2 -0
  168. package/dist/internal/queueStorage.d.ts.map +1 -0
  169. package/dist/internal/queueStorage.js +129 -0
  170. package/dist/internal/queueStorage.js.map +1 -0
  171. package/dist/internal/registry.d.ts +10 -0
  172. package/dist/internal/registry.d.ts.map +1 -0
  173. package/dist/internal/registry.js +24 -0
  174. package/dist/internal/registry.js.map +1 -0
  175. package/dist/internal/singletonRegistry.d.ts +2 -0
  176. package/dist/internal/singletonRegistry.d.ts.map +1 -0
  177. package/dist/internal/singletonRegistry.js +9 -0
  178. package/dist/internal/singletonRegistry.js.map +1 -0
  179. package/dist/internal/singletonRuntime.d.ts +2 -0
  180. package/dist/internal/singletonRuntime.d.ts.map +1 -0
  181. package/dist/internal/singletonRuntime.js +42 -0
  182. package/dist/internal/singletonRuntime.js.map +1 -0
  183. package/dist/internal/singletonStorage.d.ts +2 -0
  184. package/dist/internal/singletonStorage.d.ts.map +1 -0
  185. package/dist/internal/singletonStorage.js +34 -0
  186. package/dist/internal/singletonStorage.js.map +1 -0
  187. package/dist/internal/transport.d.ts +2 -0
  188. package/dist/internal/transport.d.ts.map +1 -0
  189. package/dist/internal/transport.js +49 -0
  190. package/dist/internal/transport.js.map +1 -0
  191. package/dist/internal/workflowRegistry.d.ts +2 -0
  192. package/dist/internal/workflowRegistry.d.ts.map +1 -0
  193. package/dist/internal/workflowRegistry.js +29 -0
  194. package/dist/internal/workflowRegistry.js.map +1 -0
  195. package/dist/internal/workflowRuntime.d.ts +2 -0
  196. package/dist/internal/workflowRuntime.d.ts.map +1 -0
  197. package/dist/internal/workflowRuntime.js +322 -0
  198. package/dist/internal/workflowRuntime.js.map +1 -0
  199. package/dist/internal/workflowStorage.d.ts +2 -0
  200. package/dist/internal/workflowStorage.d.ts.map +1 -0
  201. package/dist/internal/workflowStorage.js +113 -0
  202. package/dist/internal/workflowStorage.js.map +1 -0
  203. package/dist/internal/workflowWire.d.ts +2 -0
  204. package/dist/internal/workflowWire.d.ts.map +1 -0
  205. package/dist/internal/workflowWire.js +52 -0
  206. package/dist/internal/workflowWire.js.map +1 -0
  207. package/package.json +77 -1
  208. package/src/AlchemyCloudflareCluster.ts +200 -0
  209. package/src/CloudflareCluster.ts +704 -0
  210. package/src/CloudflareDurableObjectPrograms.ts +543 -0
  211. package/src/CloudflareDurableObjects.ts +430 -0
  212. package/src/CloudflarePersistedQueue.ts +189 -0
  213. package/src/CloudflareWorkflowEngine.ts +220 -0
  214. package/src/index.ts +38 -0
  215. package/src/internal/alchemyCluster.ts +120 -0
  216. package/src/internal/boundedMap.ts +15 -0
  217. package/src/internal/cluster.ts +57 -0
  218. package/src/internal/clusterName.ts +19 -0
  219. package/src/internal/entityKeepAlive.ts +121 -0
  220. package/src/internal/entityMailbox.ts +324 -0
  221. package/src/internal/entityRegistry.ts +46 -0
  222. package/src/internal/entityReply.ts +54 -0
  223. package/src/internal/entityRuntime.ts +1318 -0
  224. package/src/internal/entitySql.ts +60 -0
  225. package/src/internal/entityStorage.ts +168 -0
  226. package/src/internal/entityWire.ts +204 -0
  227. package/src/internal/queueRuntime.ts +174 -0
  228. package/src/internal/queueStorage.ts +255 -0
  229. package/src/internal/registry.ts +31 -0
  230. package/src/internal/singletonRegistry.ts +21 -0
  231. package/src/internal/singletonRuntime.ts +88 -0
  232. package/src/internal/singletonStorage.ts +64 -0
  233. package/src/internal/transport.ts +67 -0
  234. package/src/internal/workflowRegistry.ts +78 -0
  235. package/src/internal/workflowRuntime.ts +443 -0
  236. package/src/internal/workflowStorage.ts +234 -0
  237. 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":[]}