effect-cf 0.39.1 → 0.40.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +9 -1
  3. package/dist/AiGateway.d.mts +86 -0
  4. package/dist/AiGateway.mjs +178 -0
  5. package/dist/AnalyticsEngine.d.mts +170 -0
  6. package/dist/AnalyticsEngine.mjs +275 -0
  7. package/dist/{Artifacts-B3r3RuTB.d.mts → Artifacts.d.mts} +8 -5
  8. package/dist/{Artifacts-CBxWGeZB.mjs → Artifacts.mjs} +9 -5
  9. package/dist/Binding.d.mts +45 -0
  10. package/dist/{Binding-C82jRhdr.mjs → Binding.mjs} +8 -4
  11. package/dist/BrowserRendering.d.mts +85 -0
  12. package/dist/BrowserRendering.mjs +81 -0
  13. package/dist/Cache.d.mts +40 -0
  14. package/dist/Cache.mjs +51 -0
  15. package/dist/CloudflareOtlp.d.mts +95 -0
  16. package/dist/CloudflareOtlp.mjs +125 -0
  17. package/dist/CloudflareTracer.d.mts +20 -0
  18. package/dist/CloudflareTracer.mjs +69 -0
  19. package/dist/ComputerArtifacts.d.mts +2 -2
  20. package/dist/ComputerArtifacts.mjs +3 -2
  21. package/dist/ComputerWorkspace.d.mts +36 -31
  22. package/dist/ComputerWorkspace.mjs +8 -3
  23. package/dist/ComputerWorkspaceHost.d.mts +1 -1
  24. package/dist/ComputerWorkspaceHost.mjs +1 -1
  25. package/dist/{ContainerNamespace-DbLaeFhN.d.mts → ContainerNamespace.d.mts} +16 -12
  26. package/dist/ContainerNamespace.mjs +165 -0
  27. package/dist/D1.d.mts +33 -0
  28. package/dist/D1.mjs +32 -0
  29. package/dist/DurableObject.d.mts +103 -0
  30. package/dist/DurableObject.mjs +77 -0
  31. package/dist/DurableObjectAlarm.d.mts +187 -0
  32. package/dist/DurableObjectAlarm.mjs +344 -0
  33. package/dist/DurableObjectDefinition.d.mts +87 -0
  34. package/dist/DurableObjectDefinition.mjs +125 -0
  35. package/dist/DurableObjectNamespace.d.mts +154 -0
  36. package/dist/DurableObjectNamespace.mjs +144 -0
  37. package/dist/DurableObjectRpcWebSocket.d.mts +112 -0
  38. package/dist/DurableObjectRpcWebSocket.mjs +547 -0
  39. package/dist/DurableObjectSqlite.d.mts +11 -0
  40. package/dist/DurableObjectSqlite.mjs +16 -0
  41. package/dist/DurableObjectState.d.mts +65 -0
  42. package/dist/DurableObjectState.mjs +47 -0
  43. package/dist/DurableObjectStorage.d.mts +112 -0
  44. package/dist/{DurableObjectState-DLL0YgBd.mjs → DurableObjectStorage.mjs} +19 -157
  45. package/dist/DurableObjectWebSocket.d.mts +83 -0
  46. package/dist/DurableObjectWebSocket.mjs +120 -0
  47. package/dist/Email.d.mts +106 -0
  48. package/dist/Email.mjs +247 -0
  49. package/dist/Environment.d.mts +59 -0
  50. package/dist/{ErrorMessage-Byx2OgNd.mjs → Environment.mjs} +7 -18
  51. package/dist/{Hyperdrive-HrwFlZ6x.d.mts → Hyperdrive.d.mts} +8 -5
  52. package/dist/Hyperdrive.mjs +32 -0
  53. package/dist/HyperdrivePg.d.mts +4 -3
  54. package/dist/HyperdrivePg.mjs +3 -1
  55. package/dist/Images.d.mts +191 -0
  56. package/dist/Images.mjs +112 -0
  57. package/dist/Kv.d.mts +84 -0
  58. package/dist/Kv.mjs +132 -0
  59. package/dist/Mcp.d.mts +5 -3
  60. package/dist/Mcp.mjs +13 -4
  61. package/dist/Queue.d.mts +68 -0
  62. package/dist/Queue.mjs +54 -0
  63. package/dist/QueueBinding.d.mts +42 -0
  64. package/dist/QueueBinding.mjs +69 -0
  65. package/dist/QueueDefinition.d.mts +48 -0
  66. package/dist/QueueDefinition.mjs +63 -0
  67. package/dist/R2.d.mts +89 -0
  68. package/dist/R2.mjs +117 -0
  69. package/dist/Rpc.d.mts +29 -0
  70. package/dist/Rpc.mjs +28 -0
  71. package/dist/RpcDefinition.d.mts +116 -0
  72. package/dist/RpcDefinition.mjs +184 -0
  73. package/dist/RpcTracing.d.mts +52 -0
  74. package/dist/RpcTracing.mjs +77 -0
  75. package/dist/Sandbox.d.mts +10 -5
  76. package/dist/Sandbox.mjs +9 -3
  77. package/dist/ServiceBinding.d.mts +112 -0
  78. package/dist/ServiceBinding.mjs +145 -0
  79. package/dist/Vectorize.d.mts +68 -0
  80. package/dist/Vectorize.mjs +76 -0
  81. package/dist/Vitest.d.mts +6 -4
  82. package/dist/Vitest.mjs +8 -4
  83. package/dist/WebTransport.d.mts +66 -0
  84. package/dist/WebTransport.mjs +63 -0
  85. package/dist/Worker.d.mts +139 -0
  86. package/dist/Worker.mjs +141 -0
  87. package/dist/WorkerDefinition.d.mts +100 -0
  88. package/dist/WorkerDefinition.mjs +103 -0
  89. package/dist/WorkersAi.d.mts +84 -0
  90. package/dist/WorkersAi.mjs +84 -0
  91. package/dist/Workflow.d.mts +91 -0
  92. package/dist/Workflow.mjs +139 -0
  93. package/dist/{WorkflowBinding-DtVykUCz.d.mts → WorkflowBinding.d.mts} +14 -10
  94. package/dist/WorkflowBinding.mjs +100 -0
  95. package/dist/WorkflowDefinition.d.mts +51 -0
  96. package/dist/WorkflowDefinition.mjs +69 -0
  97. package/dist/{rolldown-runtime-D7D4PA-g.mjs → _virtual/_rolldown/runtime.mjs} +1 -1
  98. package/dist/index.d.mts +40 -1800
  99. package/dist/index.mjs +40 -3123
  100. package/dist/{ComputerWorkspaceHostRegistry-CY5Fv4Ng.mjs → internal/ComputerWorkspaceHostRegistry.mjs} +1 -1
  101. package/dist/internal/Entrypoint.mjs +37 -0
  102. package/dist/internal/ErrorMessage.mjs +17 -0
  103. package/dist/internal/NativeCallback.mjs +33 -0
  104. package/dist/internal/RpcInvocation.d.mts +13 -0
  105. package/dist/internal/RpcInvocation.mjs +34 -0
  106. package/dist/internal/Runtime.mjs +31 -0
  107. package/dist/internal/Telemetry.mjs +20 -0
  108. package/dist/{WorkerContext-Yobnfw-K.mjs → internal/WorkerContext.mjs} +4 -31
  109. package/package.json +1 -1
  110. package/src/AiGateway.ts +5 -1
  111. package/src/AnalyticsEngine.ts +14 -19
  112. package/src/Artifacts.ts +6 -1
  113. package/src/Binding.ts +5 -1
  114. package/src/BrowserRendering.ts +5 -1
  115. package/src/Cache.ts +5 -1
  116. package/src/CloudflareOtlp.ts +12 -10
  117. package/src/CloudflareTracer.ts +7 -1
  118. package/src/ComputerArtifacts.ts +2 -1
  119. package/src/ComputerWorkspace.ts +7 -1
  120. package/src/ContainerNamespace.ts +6 -1
  121. package/src/D1.ts +4 -1
  122. package/src/DurableObject.ts +122 -29
  123. package/src/DurableObjectAlarm.ts +185 -52
  124. package/src/DurableObjectDefinition.ts +22 -22
  125. package/src/DurableObjectNamespace.ts +4 -1
  126. package/src/DurableObjectRpcWebSocket.ts +7 -1
  127. package/src/DurableObjectSqlite.ts +2 -1
  128. package/src/DurableObjectState.ts +4 -1
  129. package/src/DurableObjectStorage.ts +11 -13
  130. package/src/DurableObjectWebSocket.ts +5 -1
  131. package/src/Email.ts +5 -1
  132. package/src/Environment.ts +6 -1
  133. package/src/Hyperdrive.ts +4 -1
  134. package/src/HyperdrivePg.ts +3 -1
  135. package/src/Images.ts +7 -1
  136. package/src/Kv.ts +7 -1
  137. package/src/Mcp.ts +13 -13
  138. package/src/Queue.ts +3 -1
  139. package/src/QueueBinding.ts +5 -1
  140. package/src/QueueDefinition.ts +4 -1
  141. package/src/R2.ts +7 -1
  142. package/src/Rpc.ts +4 -1
  143. package/src/RpcDefinition.ts +4 -1
  144. package/src/RpcTracing.ts +9 -1
  145. package/src/Sandbox.ts +7 -1
  146. package/src/ServiceBinding.ts +6 -1
  147. package/src/Vectorize.ts +7 -1
  148. package/src/Vitest.ts +5 -1
  149. package/src/WebTransport.ts +6 -1
  150. package/src/Worker.ts +10 -16
  151. package/src/WorkerDefinition.ts +3 -1
  152. package/src/WorkersAi.ts +7 -1
  153. package/src/Workflow.ts +8 -11
  154. package/src/WorkflowBinding.ts +6 -1
  155. package/src/WorkflowDefinition.ts +4 -1
  156. package/src/internal/Entrypoint.ts +3 -1
  157. package/src/internal/ErrorMessage.ts +1 -1
  158. package/src/internal/NativeCallback.ts +3 -1
  159. package/src/internal/RpcInvocation.ts +5 -1
  160. package/src/internal/Runtime.ts +5 -1
  161. package/src/internal/Telemetry.ts +4 -3
  162. package/src/internal/WorkerContext.ts +3 -1
  163. package/dist/Binding-DKcLrQCM.d.mts +0 -94
  164. package/dist/DurableObjectState-DJ0K-zyd.d.mts +0 -244
  165. package/dist/Worker-XsGJsCJX.mjs +0 -885
  166. package/dist/Worker-gV4mDqIs.d.mts +0 -641
@@ -0,0 +1,63 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.mjs";
2
+ import { layer } from "./QueueBinding.mjs";
3
+ import { decodeBatch } from "./Queue.mjs";
4
+ import { make as make$1 } from "./Worker.mjs";
5
+ import * as Context from "effect/Context";
6
+ import * as Effect from "effect/Effect";
7
+ import * as S from "effect/Schema";
8
+ //#region src/QueueDefinition.ts
9
+ var QueueDefinition_exports = /* @__PURE__ */ __exportAll({
10
+ Queue: () => Queue,
11
+ Tag: () => Tag,
12
+ implement: () => implement,
13
+ make: () => make
14
+ });
15
+ const makeDefinition = (id, definition) => {
16
+ const queueDefinition = {
17
+ id,
18
+ message: definition.message
19
+ };
20
+ return Object.assign(queueDefinition, { make: (layer, options) => make$1(layer, {
21
+ ...options,
22
+ queue: wrapHandler(queueDefinition, options.queue)
23
+ }) });
24
+ };
25
+ const make = (id, definition) => Tag()(id, definition);
26
+ const Tag = () => (id, definition) => {
27
+ const queueDefinition = makeDefinition(id, definition);
28
+ const tag = Context.Service()(`effect-cf/Queue/${id}`);
29
+ const layer$1 = (binding) => layer(tag, {
30
+ ...binding,
31
+ message: definition.message
32
+ });
33
+ const send = Effect.fnUntraced(function* (message, options) {
34
+ yield* (yield* tag).send(message, options);
35
+ });
36
+ const sendBatch = Effect.fnUntraced(function* (messages, options) {
37
+ yield* (yield* tag).sendBatch(messages, options);
38
+ });
39
+ const metrics = Effect.fnUntraced(function* () {
40
+ return yield* (yield* tag).metrics();
41
+ });
42
+ const rawUnsafe = Effect.flatMap(tag, (queue) => queue.rawUnsafe);
43
+ return Object.assign(tag, {
44
+ id: queueDefinition.id,
45
+ message: queueDefinition.message,
46
+ make: queueDefinition.make,
47
+ layer: layer$1,
48
+ send,
49
+ sendBatch,
50
+ metrics,
51
+ rawUnsafe
52
+ });
53
+ };
54
+ const Queue = Tag;
55
+ const wrapHandler = (definition, handler) => {
56
+ const decodeBody = S.decodeUnknownEffect(definition.message);
57
+ return Effect.fnUntraced(function* (batch) {
58
+ yield* handler(yield* decodeBatch(batch.raw, decodeBody));
59
+ });
60
+ };
61
+ const implement = (_definition, handler) => handler;
62
+ //#endregion
63
+ export { Queue, QueueDefinition_exports, Tag, implement, make };
package/dist/R2.d.mts ADDED
@@ -0,0 +1,89 @@
1
+ import { WorkerEnvironment } from "./Environment.mjs";
2
+ import { BindingNotFoundError, BindingValidationError } from "./Binding.mjs";
3
+ import * as Context$1 from "effect/Context";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Schema$1 from "effect/Schema";
6
+ import * as Option from "effect/Option";
7
+ import { Layer } from "effect";
8
+ declare namespace R2_d_exports {
9
+ export { LayerOptions, R2Client, R2Definition, R2GetOptions, R2ListOptions, R2MultipartOptions, R2MultipartUploadClient, R2ObjectBodyClient, R2Operation, R2OperationError, R2PutOptions, R2PutValue, R2Service, R2UploadPartOptions, R2UploadPartValue, Tag, TagClass, isR2Bucket, layer, make, makeClient };
10
+ }
11
+ type R2Operation = "head" | "get" | "put" | "delete" | "list" | "createMultipartUpload" | "resumeMultipartUpload" | "uploadPart" | "abortMultipartUpload" | "completeMultipartUpload" | "arrayBuffer" | "bytes" | "text" | "json" | "blob";
12
+ declare const R2OperationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
13
+ readonly _tag: "R2OperationError";
14
+ } & Readonly<A>;
15
+ declare class R2OperationError extends R2OperationError_base<{
16
+ readonly binding: string;
17
+ readonly operation: R2Operation;
18
+ readonly cause: unknown;
19
+ }> {
20
+ get message(): string;
21
+ }
22
+ interface R2Definition {
23
+ readonly binding: string;
24
+ }
25
+ type R2GetOptions = CloudflareR2GetOptions;
26
+ type R2PutOptions = CloudflareR2PutOptions;
27
+ type R2ListOptions = CloudflareR2ListOptions;
28
+ type R2MultipartOptions = CloudflareR2MultipartOptions;
29
+ type R2UploadPartOptions = CloudflareR2UploadPartOptions;
30
+ type R2PutValue = ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob;
31
+ type R2UploadPartValue = ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob;
32
+ interface R2ObjectBodyClient extends Omit<CloudflareR2ObjectBody, "arrayBuffer" | "blob" | "bytes" | "json" | "text"> {
33
+ readonly raw: CloudflareR2ObjectBody;
34
+ readonly arrayBuffer: Effect.Effect<ArrayBuffer, R2OperationError>;
35
+ readonly bytes: Effect.Effect<Uint8Array, R2OperationError>;
36
+ readonly text: Effect.Effect<string, R2OperationError>;
37
+ readonly json: <T = unknown>() => Effect.Effect<T, R2OperationError>;
38
+ readonly blob: Effect.Effect<Blob, R2OperationError>;
39
+ }
40
+ interface R2MultipartUploadClient {
41
+ readonly raw: CloudflareR2MultipartUpload;
42
+ readonly key: string;
43
+ readonly uploadId: string;
44
+ readonly uploadPart: (partNumber: number, value: R2UploadPartValue, options?: R2UploadPartOptions) => Effect.Effect<CloudflareR2UploadedPart, R2OperationError>;
45
+ readonly abort: Effect.Effect<void, R2OperationError>;
46
+ readonly complete: (uploadedParts: ReadonlyArray<CloudflareR2UploadedPart>) => Effect.Effect<CloudflareR2Object, R2OperationError>;
47
+ }
48
+ interface R2Client {
49
+ readonly head: (key: string) => Effect.Effect<Option.Option<CloudflareR2Object>, R2OperationError>;
50
+ readonly get: {
51
+ (key: string, options: R2GetOptions & {
52
+ readonly onlyIf: CloudflareR2Conditional | Headers;
53
+ }): Effect.Effect<Option.Option<R2ObjectBodyClient | CloudflareR2Object>, R2OperationError>;
54
+ (key: string, options?: R2GetOptions): Effect.Effect<Option.Option<R2ObjectBodyClient>, R2OperationError>;
55
+ };
56
+ readonly put: {
57
+ (key: string, value: R2PutValue, options: R2PutOptions & {
58
+ readonly onlyIf: CloudflareR2Conditional | Headers;
59
+ }): Effect.Effect<Option.Option<CloudflareR2Object>, R2OperationError>;
60
+ (key: string, value: R2PutValue, options?: R2PutOptions): Effect.Effect<CloudflareR2Object, R2OperationError>;
61
+ };
62
+ readonly createMultipartUpload: (key: string, options?: R2MultipartOptions) => Effect.Effect<R2MultipartUploadClient, R2OperationError>;
63
+ readonly resumeMultipartUpload: (key: string, uploadId: string) => Effect.Effect<R2MultipartUploadClient, R2OperationError>;
64
+ readonly delete: (keys: string | ReadonlyArray<string>) => Effect.Effect<void, R2OperationError>;
65
+ readonly list: (options?: R2ListOptions) => Effect.Effect<CloudflareR2Objects, R2OperationError>;
66
+ readonly rawUnsafe: Effect.Effect<CloudflareR2Bucket>;
67
+ readonly definition: R2Definition;
68
+ }
69
+ declare const R2ServiceTypeId: unique symbol;
70
+ interface R2Service<Id extends string> {
71
+ readonly [R2ServiceTypeId]: {
72
+ readonly id: Id;
73
+ };
74
+ }
75
+ type LayerOptions = {
76
+ readonly binding: string;
77
+ };
78
+ interface TagClass<Self, Id extends string> extends Context$1.ServiceClass<Self, Id, R2Client> {
79
+ readonly id: Id;
80
+ readonly layer: (options: LayerOptions) => Layer.Layer<Self, BindingNotFoundError | BindingValidationError, WorkerEnvironment>;
81
+ }
82
+ type R2BindingValue = Schema$1.Schema.Type<typeof Schema$1.Unknown>;
83
+ declare const isR2Bucket: (value: R2BindingValue) => value is CloudflareR2Bucket;
84
+ declare const makeClient: (definition: R2Definition) => ((bucket: CloudflareR2Bucket) => R2Client);
85
+ declare const layer: <Self>(tag: Context$1.Service<Self, R2Client>, definition: R2Definition) => Layer.Layer<Self, BindingNotFoundError | BindingValidationError, WorkerEnvironment>;
86
+ declare const make: <Id extends string>(id: Id) => TagClass<R2Service<Id>, Id>;
87
+ declare const Tag: <Self>() => <Id extends string>(id: Id) => TagClass<Self, Id>;
88
+ //#endregion
89
+ export { LayerOptions, R2Client, R2Definition, R2GetOptions, R2ListOptions, R2MultipartOptions, R2MultipartUploadClient, R2ObjectBodyClient, R2Operation, R2OperationError, R2PutOptions, R2PutValue, R2Service, R2UploadPartOptions, R2UploadPartValue, R2_d_exports, Tag, TagClass, isR2Bucket, layer, make, makeClient };
package/dist/R2.mjs ADDED
@@ -0,0 +1,117 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.mjs";
2
+ import { layer as layer$1 } from "./Binding.mjs";
3
+ import { causeMessage } from "./internal/ErrorMessage.mjs";
4
+ import * as Context from "effect/Context";
5
+ import * as Data from "effect/Data";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Schema from "effect/Schema";
8
+ import * as Predicate from "effect/Predicate";
9
+ import * as Option from "effect/Option";
10
+ //#region src/R2.ts
11
+ var R2_exports = /* @__PURE__ */ __exportAll({
12
+ R2OperationError: () => R2OperationError,
13
+ Tag: () => Tag,
14
+ isR2Bucket: () => isR2Bucket,
15
+ layer: () => layer,
16
+ make: () => make,
17
+ makeClient: () => makeClient
18
+ });
19
+ const expectedR2Bucket = "R2 bucket binding with head(), get(), put(), createMultipartUpload(), resumeMultipartUpload(), delete(), and list()";
20
+ var R2OperationError = class extends Data.TaggedError("R2OperationError") {
21
+ get message() {
22
+ return `R2 ${this.operation} failed for binding "${this.binding}": ${causeMessage(this.cause)}`;
23
+ }
24
+ };
25
+ const r2Error = (binding, operation, cause) => new R2OperationError({
26
+ binding,
27
+ operation,
28
+ cause
29
+ });
30
+ const tryR2Promise = (binding, operation, evaluate) => Effect.tryPromise({
31
+ try: evaluate,
32
+ catch: (cause) => r2Error(binding, operation, cause)
33
+ });
34
+ const tryR2Sync = (binding, operation, evaluate) => Effect.try({
35
+ try: evaluate,
36
+ catch: (cause) => r2Error(binding, operation, cause)
37
+ });
38
+ const spanOptions = (binding, operation) => ({ attributes: {
39
+ binding,
40
+ operation
41
+ } });
42
+ const isR2ObjectBody = (value) => "body" in value && Predicate.isFunction(value.arrayBuffer) && Predicate.isFunction(value.bytes) && Predicate.isFunction(value.text) && Predicate.isFunction(value.json) && Predicate.isFunction(value.blob);
43
+ const wrapObjectBody = (binding, object) => ({
44
+ key: object.key,
45
+ version: object.version,
46
+ size: object.size,
47
+ etag: object.etag,
48
+ httpEtag: object.httpEtag,
49
+ checksums: object.checksums,
50
+ uploaded: object.uploaded,
51
+ httpMetadata: object.httpMetadata,
52
+ customMetadata: object.customMetadata,
53
+ range: object.range,
54
+ storageClass: object.storageClass,
55
+ ssecKeyMd5: object.ssecKeyMd5,
56
+ writeHttpMetadata: (headers) => object.writeHttpMetadata(headers),
57
+ raw: object,
58
+ body: object.body,
59
+ get bodyUsed() {
60
+ return object.bodyUsed;
61
+ },
62
+ arrayBuffer: tryR2Promise(binding, "arrayBuffer", () => object.arrayBuffer()).pipe(Effect.withSpan("R2.arrayBuffer", spanOptions(binding, "arrayBuffer"))),
63
+ bytes: tryR2Promise(binding, "bytes", () => object.bytes()).pipe(Effect.withSpan("R2.bytes", spanOptions(binding, "bytes"))),
64
+ text: tryR2Promise(binding, "text", () => object.text()).pipe(Effect.withSpan("R2.text", spanOptions(binding, "text"))),
65
+ json: () => tryR2Promise(binding, "json", () => object.json()).pipe(Effect.withSpan("R2.json", spanOptions(binding, "json"))),
66
+ blob: tryR2Promise(binding, "blob", () => object.blob()).pipe(Effect.withSpan("R2.blob", spanOptions(binding, "blob")))
67
+ });
68
+ const wrapGetResult = (binding, object) => {
69
+ if (object === null || !isR2ObjectBody(object)) return object;
70
+ return wrapObjectBody(binding, object);
71
+ };
72
+ const R2BucketSchema = Schema.declare((value) => Predicate.hasProperty(value, "head") && Predicate.isFunction(value.head) && Predicate.hasProperty(value, "get") && Predicate.isFunction(value.get) && Predicate.hasProperty(value, "put") && Predicate.isFunction(value.put) && Predicate.hasProperty(value, "createMultipartUpload") && Predicate.isFunction(value.createMultipartUpload) && Predicate.hasProperty(value, "resumeMultipartUpload") && Predicate.isFunction(value.resumeMultipartUpload) && Predicate.hasProperty(value, "delete") && Predicate.isFunction(value.delete) && Predicate.hasProperty(value, "list") && Predicate.isFunction(value.list));
73
+ const decodeR2Bucket = Schema.decodeUnknownOption(R2BucketSchema);
74
+ const isR2Bucket = (value) => Option.isSome(decodeR2Bucket(value));
75
+ const makeClient = (definition) => {
76
+ const wrapUpload = (upload) => ({
77
+ raw: upload,
78
+ key: upload.key,
79
+ uploadId: upload.uploadId,
80
+ uploadPart: Effect.fn("R2.uploadPart", spanOptions(definition.binding, "uploadPart"))((partNumber, value, options) => tryR2Promise(definition.binding, "uploadPart", () => upload.uploadPart(partNumber, value, options))),
81
+ abort: tryR2Promise(definition.binding, "abortMultipartUpload", () => upload.abort()).pipe(Effect.withSpan("R2.abortMultipartUpload", spanOptions(definition.binding, "abortMultipartUpload"))),
82
+ complete: Effect.fn("R2.completeMultipartUpload", spanOptions(definition.binding, "completeMultipartUpload"))((uploadedParts) => tryR2Promise(definition.binding, "completeMultipartUpload", () => upload.complete([...uploadedParts])))
83
+ });
84
+ return (bucket) => {
85
+ const get = Effect.fn("R2.get", spanOptions(definition.binding, "get"))((key, options) => tryR2Promise(definition.binding, "get", () => bucket.get(key, options)).pipe(Effect.map((object) => Option.fromNullOr(wrapGetResult(definition.binding, object)))));
86
+ return {
87
+ definition,
88
+ head: Effect.fn("R2.head", spanOptions(definition.binding, "head"))((key) => tryR2Promise(definition.binding, "head", () => bucket.head(key)).pipe(Effect.map(Option.fromNullOr))),
89
+ get,
90
+ put: Effect.fn("R2.put", spanOptions(definition.binding, "put"))((key, value, options) => tryR2Promise(definition.binding, "put", () => bucket.put(key, value, options)).pipe(Effect.map((object) => {
91
+ if (object === null) return Option.none();
92
+ if (options !== void 0 && "onlyIf" in options) return Option.some(object);
93
+ return object;
94
+ }))),
95
+ createMultipartUpload: Effect.fn("R2.createMultipartUpload", spanOptions(definition.binding, "createMultipartUpload"))((key, options) => tryR2Promise(definition.binding, "createMultipartUpload", () => bucket.createMultipartUpload(key, options)).pipe(Effect.map(wrapUpload))),
96
+ resumeMultipartUpload: Effect.fn("R2.resumeMultipartUpload", spanOptions(definition.binding, "resumeMultipartUpload"))((key, uploadId) => tryR2Sync(definition.binding, "resumeMultipartUpload", () => wrapUpload(bucket.resumeMultipartUpload(key, uploadId)))),
97
+ delete: Effect.fn("R2.delete", spanOptions(definition.binding, "delete"))((keys) => {
98
+ const nativeKeys = Predicate.isString(keys) ? keys : [...keys];
99
+ return tryR2Promise(definition.binding, "delete", () => bucket.delete(nativeKeys));
100
+ }),
101
+ list: Effect.fn("R2.list", spanOptions(definition.binding, "list"))((options) => tryR2Promise(definition.binding, "list", () => bucket.list(options))),
102
+ rawUnsafe: Effect.succeed(bucket)
103
+ };
104
+ };
105
+ };
106
+ const layer = (tag, definition) => layer$1(tag, definition.binding, isR2Bucket, makeClient(definition), { expected: expectedR2Bucket });
107
+ const make = (id) => Tag()(id);
108
+ const Tag = () => (id) => {
109
+ const tag = Context.Service()(id);
110
+ const makeLayer = (definition) => layer(tag, definition);
111
+ return Object.assign(tag, {
112
+ id,
113
+ layer: makeLayer
114
+ });
115
+ };
116
+ //#endregion
117
+ export { R2OperationError, R2_exports, Tag, isR2Bucket, layer, make, makeClient };
package/dist/Rpc.d.mts ADDED
@@ -0,0 +1,29 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema$1 from "effect/Schema";
3
+ import { RpcStub, RpcTarget } from "cloudflare:workers";
4
+ import { Scope } from "effect";
5
+ declare namespace Rpc_d_exports {
6
+ export { DisposableValue, MethodArgs, MethodKey, MethodReturn, Provider, Result, RpcStub, RpcTarget, Serializable, Stub, Stubable, Stubify, dispose, isDisposable, resolve, scoped };
7
+ }
8
+ type Stubable = Rpc.Stubable;
9
+ type Stub<T extends Stubable> = Rpc.Stub<T>;
10
+ type Provider<T extends object, Reserved extends string = never> = Rpc.Provider<T, Reserved>;
11
+ type BaseType = void | undefined | null | boolean | number | bigint | string | TypedArray | ArrayBuffer | DataView | Date | Error | RegExp | ReadableStream<Uint8Array> | WritableStream<Uint8Array> | Request | Response | Headers;
12
+ type Serializable<T> = BaseType | Map<T extends Map<infer Key, unknown> ? Serializable<Key> : never, T extends Map<unknown, infer Value> ? Serializable<Value> : never> | Set<T extends Set<infer Value> ? Serializable<Value> : never> | ReadonlyArray<T extends ReadonlyArray<infer Value> ? Serializable<Value> : never> | { [Key in keyof T]: Key extends number | string ? Serializable<T[Key]> : never; } | Stub<Stubable> | Stubable;
13
+ type Stubify<T> = T extends Stubable ? Stub<T> : T extends Map<infer Key, infer Value> ? Map<Stubify<Key>, Stubify<Value>> : T extends Set<infer Value> ? Set<Stubify<Value>> : T extends Array<infer Value> ? Array<Stubify<Value>> : T extends ReadonlyArray<infer Value> ? ReadonlyArray<Stubify<Value>> : T extends BaseType ? T : T extends Record<string | number, infer _Value> ? { [Key in keyof T]: Stubify<T[Key]>; } : T;
14
+ type MaybeProvider<T> = T extends object ? Provider<T> : unknown;
15
+ type MaybeDisposable<T> = T extends object ? Disposable : unknown;
16
+ type Result<T> = T extends Stubable ? Promise<Stub<T>> & Provider<T> : T extends Serializable<T> ? Promise<Stubify<T> & MaybeDisposable<T>> & MaybeProvider<T> : never;
17
+ type MethodKey<Api> = { [Key in keyof Api]-?: Key extends string ? Api[Key] extends ((...args: Array<any>) => any) ? Key : never : never; }[keyof Api];
18
+ type MethodArgs<Api, Method extends keyof Api> = Api[Method] extends ((...args: infer Args) => any) ? Args : never;
19
+ type MethodReturn<Api, Method extends keyof Api> = Api[Method] extends ((...args: Array<any>) => infer Return) ? Return : never;
20
+ type DisposableValue = {
21
+ [Symbol.dispose](): void;
22
+ };
23
+ type RpcBoundaryValue = Schema$1.Schema.Type<typeof Schema$1.Unknown>;
24
+ declare const isDisposable: (value: RpcBoundaryValue) => value is DisposableValue;
25
+ declare const dispose: (value: RpcBoundaryValue) => Effect.Effect<void>;
26
+ declare const resolve: <A>(value: A) => Effect.Effect<Awaited<A>, unknown>;
27
+ declare const scoped: <A>(value: A) => Effect.Effect<Awaited<A>, unknown, Scope.Scope>;
28
+ //#endregion
29
+ export { DisposableValue, MethodArgs, MethodKey, MethodReturn, Provider, Result, RpcStub, RpcTarget, Rpc_d_exports, Serializable, Stub, Stubable, Stubify, dispose, isDisposable, resolve, scoped };
package/dist/Rpc.mjs ADDED
@@ -0,0 +1,28 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.mjs";
2
+ import { decodeWireError } from "./RpcDefinition.mjs";
3
+ import * as Effect from "effect/Effect";
4
+ import "effect/Schema";
5
+ import * as Predicate from "effect/Predicate";
6
+ import { RpcStub, RpcTarget } from "cloudflare:workers";
7
+ //#region src/Rpc.ts
8
+ var Rpc_exports = /* @__PURE__ */ __exportAll({
9
+ RpcStub: () => RpcStub,
10
+ RpcTarget: () => RpcTarget,
11
+ dispose: () => dispose,
12
+ isDisposable: () => isDisposable,
13
+ resolve: () => resolve,
14
+ scoped: () => scoped
15
+ });
16
+ const isDisposable = (value) => Predicate.hasProperty(value, Symbol.dispose) && Predicate.isFunction(value[Symbol.dispose]);
17
+ const dispose = (value) => Effect.sync(() => {
18
+ if (isDisposable(value)) value[Symbol.dispose]();
19
+ });
20
+ const resolve = (value) => Predicate.isPromiseLike(value) ? Effect.tryPromise({
21
+ try: () => Promise.resolve(value),
22
+ catch: (cause) => decodeWireError(cause)
23
+ }) : Effect.sync(() => {
24
+ return value;
25
+ });
26
+ const scoped = (value) => Effect.acquireRelease(resolve(value), (resolved) => dispose(resolved));
27
+ //#endregion
28
+ export { RpcStub, RpcTarget, Rpc_exports, dispose, isDisposable, resolve, scoped };
@@ -0,0 +1,116 @@
1
+ import { Provider } from "./Rpc.mjs";
2
+ import * as Effect from "effect/Effect";
3
+ import * as S from "effect/Schema";
4
+ declare namespace RpcDefinition_d_exports {
5
+ export { Definition, Method, Methods, NoReservedMethods, ReservedMethodName, RpcArgumentCountError, RpcArgumentDecodeError, RpcArgumentEncodeError, RpcReservedMethodNameError, RpcSuccessDecodeError, RpcSuccessEncodeError, ServiceFreeSchema, WireError, assertNoReservedMethods, decodeArgs, decodeSuccess, decodeWireError, encodeArgs, encodeSuccess, encodeWireError, isWireError, make, method, reservedMethodNames };
6
+ }
7
+ declare const RpcReservedMethodNameError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
8
+ readonly _tag: "RpcReservedMethodNameError";
9
+ } & Readonly<A>;
10
+ declare class RpcReservedMethodNameError extends RpcReservedMethodNameError_base<{
11
+ readonly definition: string;
12
+ readonly method: string;
13
+ }> {
14
+ get message(): string;
15
+ }
16
+ declare const RpcArgumentCountError_base: S.Class<RpcArgumentCountError, S.TaggedStruct<"RpcArgumentCountError", {
17
+ readonly definition: S.String;
18
+ readonly method: S.String;
19
+ readonly expected: S.Number;
20
+ readonly actual: S.Number;
21
+ }>, import("effect/Cause").YieldableError>;
22
+ declare class RpcArgumentCountError extends RpcArgumentCountError_base {
23
+ get message(): string;
24
+ }
25
+ declare const RpcArgumentDecodeError_base: S.Class<RpcArgumentDecodeError, S.TaggedStruct<"RpcArgumentDecodeError", {
26
+ readonly definition: S.String;
27
+ readonly method: S.String;
28
+ readonly cause: S.Defect;
29
+ }>, import("effect/Cause").YieldableError>;
30
+ declare class RpcArgumentDecodeError extends RpcArgumentDecodeError_base {
31
+ get message(): string;
32
+ }
33
+ declare const RpcArgumentEncodeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
34
+ readonly _tag: "RpcArgumentEncodeError";
35
+ } & Readonly<A>;
36
+ declare class RpcArgumentEncodeError extends RpcArgumentEncodeError_base<{
37
+ readonly definition: string;
38
+ readonly method: string;
39
+ readonly cause: unknown;
40
+ }> {
41
+ get message(): string;
42
+ }
43
+ declare const RpcSuccessDecodeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
44
+ readonly _tag: "RpcSuccessDecodeError";
45
+ } & Readonly<A>;
46
+ declare class RpcSuccessDecodeError extends RpcSuccessDecodeError_base<{
47
+ readonly definition: string;
48
+ readonly method: string;
49
+ readonly cause: unknown;
50
+ }> {
51
+ get message(): string;
52
+ }
53
+ declare const RpcSuccessEncodeError_base: S.Class<RpcSuccessEncodeError, S.TaggedStruct<"RpcSuccessEncodeError", {
54
+ readonly definition: S.String;
55
+ readonly method: S.String;
56
+ readonly cause: S.Defect;
57
+ }>, import("effect/Cause").YieldableError>;
58
+ declare class RpcSuccessEncodeError extends RpcSuccessEncodeError_base {
59
+ get message(): string;
60
+ }
61
+ /** Errors raised server-side that must survive the Cloudflare RPC wire. */
62
+ type WireError = RpcArgumentCountError | RpcArgumentDecodeError | RpcSuccessEncodeError;
63
+ type WireValue = S.Schema.Type<typeof S.Unknown>;
64
+ declare const isWireError: (error: WireValue) => error is WireError;
65
+ /**
66
+ * Encodes package RPC errors into a plain `Error` envelope so their tags
67
+ * survive Cloudflare RPC serialization, which drops custom error properties.
68
+ */
69
+ declare const encodeWireError: (error: WireValue) => WireValue;
70
+ declare const decodeWireError: (cause: WireValue) => WireValue;
71
+ declare const reservedMethodNameValues: readonly ["constructor", "fetch", "connect", "alarm", "webSocketMessage", "webSocketClose", "webSocketError", "then", "dup", "dispose", "serialize", "deserialize"];
72
+ declare const reservedMethodNames: Set<string>;
73
+ type ReservedMethodName = (typeof reservedMethodNameValues)[number];
74
+ type ServiceFreeSchema = S.Codec<any, any, never, never>;
75
+ interface Method<Args extends ReadonlyArray<ServiceFreeSchema> = ReadonlyArray<ServiceFreeSchema>, Success extends ServiceFreeSchema = ServiceFreeSchema> {
76
+ readonly args: Args;
77
+ readonly success: Success;
78
+ }
79
+ declare namespace Method {
80
+ export type Any = Method<ReadonlyArray<ServiceFreeSchema>, ServiceFreeSchema>;
81
+ type ArgsFromSchemas<Args extends ReadonlyArray<ServiceFreeSchema>> = Args extends readonly [] ? [] : Args extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends ReadonlyArray<ServiceFreeSchema>] ? [S.Schema.Type<Head>, ...ArgsFromSchemas<Tail>] : Array<S.Schema.Type<Args[number]>>;
82
+ type EncodedArgsFromSchemas<Args extends ReadonlyArray<ServiceFreeSchema>> = { [Index in keyof Args]: S.Json; };
83
+ export type Args<Self extends Any> = ArgsFromSchemas<Self["args"]>;
84
+ export type EncodedArgs<Self extends Any> = EncodedArgsFromSchemas<Self["args"]>;
85
+ export type Success<Self extends Any> = S.Schema.Type<Self["success"]>;
86
+ export type EncodedSuccess<_Self extends Any> = S.Json;
87
+ export {};
88
+ }
89
+ type Methods = Record<string, Method.Any>;
90
+ type NoReservedMethods<MethodDefinitions extends Methods, Reserved extends string = ReservedMethodName> = Extract<keyof MethodDefinitions, Reserved> extends never ? MethodDefinitions : never;
91
+ interface Definition<Id extends string = string, MethodDefinitions extends Methods = Methods> {
92
+ readonly id: Id;
93
+ readonly methods: MethodDefinitions;
94
+ }
95
+ declare namespace Definition {
96
+ type Any = Definition<string, Methods>;
97
+ type ServerApi<Self extends Any> = { readonly [Key in keyof Self["methods"]]: (...args: Method.Args<Self["methods"][Key]>) => Promise<Method.Success<Self["methods"][Key]>>; };
98
+ type Api<Self extends Any, Reserved extends string = never> = Provider<ServerApi<Self>, Reserved>;
99
+ type MethodNames<Self extends Any> = Extract<keyof Self["methods"], string>;
100
+ }
101
+ type ReservedMethodValue = S.Schema.Type<typeof S.Unknown>;
102
+ declare const assertNoReservedMethods: <MethodDefinitions extends Readonly<Record<string, ReservedMethodValue>>>(target: string, methods: MethodDefinitions, reserved: ReadonlySet<string>) => void;
103
+ declare function method<Success extends ServiceFreeSchema>(definition: {
104
+ readonly success: Success;
105
+ }): Method<readonly [], Success>;
106
+ declare function method<const Args extends ReadonlyArray<ServiceFreeSchema>, Success extends ServiceFreeSchema>(definition: {
107
+ readonly args: Args;
108
+ readonly success: Success;
109
+ }): Method<Args, Success>;
110
+ declare const decodeArgs: <const Self extends Definition.Any, MethodName extends Definition.MethodNames<Self>>(definition: Self, methodName: MethodName, args: readonly unknown[]) => Effect.Effect<Self["methods"][MethodName]["args"] extends (infer T) ? T extends Self["methods"][MethodName]["args"] ? T extends readonly [] ? [] : T extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ... /*elided*/ any] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<T[number]>[] : never : never, RpcArgumentCountError | RpcArgumentDecodeError, never>;
111
+ declare const encodeArgs: <const Self extends Definition.Any, MethodName extends Definition.MethodNames<Self>>(definition: Self, methodName: MethodName, args: Self["methods"][MethodName]["args"] extends (infer T) ? T extends Self["methods"][MethodName]["args"] ? T extends readonly [] ? [] : T extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ...Tail extends readonly [] ? [] : Tail extends readonly [infer Head extends ServiceFreeSchema, ...infer Tail extends readonly ServiceFreeSchema[]] ? [S.Schema.Type<Head>, ... /*elided*/ any] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<Tail[number]>[]] : S.Schema.Type<T[number]>[] : never : never) => Effect.Effect<Self["methods"][MethodName]["args"] extends (infer T_1 extends readonly ServiceFreeSchema[]) ? { [Index in keyof T_1]: S.Json; } : never, RpcArgumentCountError | RpcArgumentEncodeError, never>;
112
+ declare const encodeSuccess: <const Self extends Definition.Any, MethodName extends Definition.MethodNames<Self>>(definition: Self, methodName: MethodName, value: Method.Success<Self["methods"][MethodName]>) => Effect.Effect<Method.EncodedSuccess<Self["methods"][MethodName]>, RpcSuccessEncodeError>;
113
+ declare const decodeSuccess: <const Self extends Definition.Any, MethodName extends Definition.MethodNames<Self>>(definition: Self, methodName: MethodName, value: WireValue) => Effect.Effect<Method.Success<Self["methods"][MethodName]>, RpcSuccessDecodeError>;
114
+ declare const make: <Id extends string, const MethodDefinitions extends Methods>(id: Id, methods: MethodDefinitions) => Definition<Id, MethodDefinitions>;
115
+ //#endregion
116
+ export { Definition, Method, Methods, NoReservedMethods, ReservedMethodName, RpcArgumentCountError, RpcArgumentDecodeError, RpcArgumentEncodeError, RpcDefinition_d_exports, RpcReservedMethodNameError, RpcSuccessDecodeError, RpcSuccessEncodeError, ServiceFreeSchema, WireError, assertNoReservedMethods, decodeArgs, decodeSuccess, decodeWireError, encodeArgs, encodeSuccess, encodeWireError, isWireError, make, method, reservedMethodNames };
@@ -0,0 +1,184 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.mjs";
2
+ import { causeMessage } from "./internal/ErrorMessage.mjs";
3
+ import * as Data from "effect/Data";
4
+ import * as Effect from "effect/Effect";
5
+ import * as S from "effect/Schema";
6
+ import * as Predicate from "effect/Predicate";
7
+ //#region src/RpcDefinition.ts
8
+ var RpcDefinition_exports = /* @__PURE__ */ __exportAll({
9
+ RpcArgumentCountError: () => RpcArgumentCountError,
10
+ RpcArgumentDecodeError: () => RpcArgumentDecodeError,
11
+ RpcArgumentEncodeError: () => RpcArgumentEncodeError,
12
+ RpcReservedMethodNameError: () => RpcReservedMethodNameError,
13
+ RpcSuccessDecodeError: () => RpcSuccessDecodeError,
14
+ RpcSuccessEncodeError: () => RpcSuccessEncodeError,
15
+ assertNoReservedMethods: () => assertNoReservedMethods,
16
+ decodeArgs: () => decodeArgs,
17
+ decodeSuccess: () => decodeSuccess,
18
+ decodeWireError: () => decodeWireError,
19
+ encodeArgs: () => encodeArgs,
20
+ encodeSuccess: () => encodeSuccess,
21
+ encodeWireError: () => encodeWireError,
22
+ isWireError: () => isWireError,
23
+ make: () => make,
24
+ method: () => method,
25
+ reservedMethodNames: () => reservedMethodNames
26
+ });
27
+ var RpcReservedMethodNameError = class extends Data.TaggedError("RpcReservedMethodNameError") {
28
+ get message() {
29
+ return `${this.definition} RPC method "${this.method}" is reserved by Cloudflare Workers RPC`;
30
+ }
31
+ };
32
+ var RpcArgumentCountError = class extends S.TaggedError()("RpcArgumentCountError", {
33
+ definition: S.String,
34
+ method: S.String,
35
+ expected: S.Number,
36
+ actual: S.Number
37
+ }) {
38
+ get message() {
39
+ return `${this.definition} RPC method "${this.method}" expected ${this.expected} arguments but received ${this.actual}`;
40
+ }
41
+ };
42
+ var RpcArgumentDecodeError = class extends S.TaggedError()("RpcArgumentDecodeError", {
43
+ definition: S.String,
44
+ method: S.String,
45
+ cause: S.Defect()
46
+ }) {
47
+ get message() {
48
+ return `${this.definition} RPC method "${this.method}" argument decode failed: ${causeMessage(this.cause)}`;
49
+ }
50
+ };
51
+ var RpcArgumentEncodeError = class extends Data.TaggedError("RpcArgumentEncodeError") {
52
+ get message() {
53
+ return `${this.definition} RPC method "${this.method}" argument encode failed: ${causeMessage(this.cause)}`;
54
+ }
55
+ };
56
+ var RpcSuccessDecodeError = class extends Data.TaggedError("RpcSuccessDecodeError") {
57
+ get message() {
58
+ return `${this.definition} RPC method "${this.method}" success decode failed: ${causeMessage(this.cause)}`;
59
+ }
60
+ };
61
+ var RpcSuccessEncodeError = class extends S.TaggedError()("RpcSuccessEncodeError", {
62
+ definition: S.String,
63
+ method: S.String,
64
+ cause: S.Defect()
65
+ }) {
66
+ get message() {
67
+ return `${this.definition} RPC method "${this.method}" success encode failed: ${causeMessage(this.cause)}`;
68
+ }
69
+ };
70
+ const WireErrorSchema = S.Union([
71
+ RpcArgumentCountError,
72
+ RpcArgumentDecodeError,
73
+ RpcSuccessEncodeError
74
+ ]);
75
+ const wireErrorKey = "effect-cf/RpcDefinition/wireError";
76
+ const isWireError = (error) => error instanceof RpcArgumentCountError || error instanceof RpcArgumentDecodeError || error instanceof RpcSuccessEncodeError;
77
+ /**
78
+ * Encodes package RPC errors into a plain `Error` envelope so their tags
79
+ * survive Cloudflare RPC serialization, which drops custom error properties.
80
+ */
81
+ const encodeWireError = (error) => {
82
+ if (!isWireError(error)) return error;
83
+ try {
84
+ return new Error(JSON.stringify({ [wireErrorKey]: S.encodeSync(WireErrorSchema)(error) }));
85
+ } catch {
86
+ return error;
87
+ }
88
+ };
89
+ const decodeWireError = (cause) => {
90
+ if (!(cause instanceof Error)) return cause;
91
+ try {
92
+ const parsed = S.decodeUnknownSync(S.Unknown)(JSON.parse(cause.message));
93
+ if (!Predicate.hasProperty(parsed, wireErrorKey)) return cause;
94
+ return S.decodeUnknownSync(WireErrorSchema)(parsed[wireErrorKey]);
95
+ } catch {
96
+ return cause;
97
+ }
98
+ };
99
+ const reservedMethodNames = /* @__PURE__ */ new Set([
100
+ "constructor",
101
+ "fetch",
102
+ "connect",
103
+ "alarm",
104
+ "webSocketMessage",
105
+ "webSocketClose",
106
+ "webSocketError",
107
+ "then",
108
+ "dup",
109
+ "dispose",
110
+ "serialize",
111
+ "deserialize"
112
+ ]);
113
+ /**
114
+ * Workers RPC structured-clones every value that crosses an isolate boundary
115
+ * and rejects class instances. Declaration schemas such as `Schema.Result`
116
+ * keep their container instance in their `Encoded` form, so the declared
117
+ * schemas are lowered to their canonical JSON codec before touching the wire.
118
+ */
119
+ const wireCodec = (schema) => S.toCodecJson(schema);
120
+ const assertNoReservedMethods = (target, methods, reserved) => {
121
+ for (const method of Object.keys(methods)) if (reserved.has(method)) throw new RpcReservedMethodNameError({
122
+ definition: target,
123
+ method
124
+ });
125
+ };
126
+ function method(definition) {
127
+ return {
128
+ args: definition.args ?? [],
129
+ success: definition.success
130
+ };
131
+ }
132
+ const decodeArgs = Effect.fnUntraced(function* (definition, methodName, args) {
133
+ const methodDefinition = definition.methods[methodName];
134
+ if (args.length !== methodDefinition.args.length) return yield* new RpcArgumentCountError({
135
+ definition: definition.id,
136
+ method: methodName,
137
+ expected: methodDefinition.args.length,
138
+ actual: args.length
139
+ });
140
+ return yield* S.decodeUnknownEffect(wireCodec(S.Tuple(methodDefinition.args)))(args).pipe(Effect.mapError((cause) => new RpcArgumentDecodeError({
141
+ definition: definition.id,
142
+ method: methodName,
143
+ cause
144
+ })));
145
+ });
146
+ const encodeArgs = Effect.fnUntraced(function* (definition, methodName, args) {
147
+ const methodDefinition = definition.methods[methodName];
148
+ if (args.length !== methodDefinition.args.length) return yield* new RpcArgumentCountError({
149
+ definition: definition.id,
150
+ method: methodName,
151
+ expected: methodDefinition.args.length,
152
+ actual: args.length
153
+ });
154
+ return yield* S.encodeUnknownEffect(wireCodec(S.Tuple(methodDefinition.args)))(args).pipe(Effect.mapError((cause) => new RpcArgumentEncodeError({
155
+ definition: definition.id,
156
+ method: methodName,
157
+ cause
158
+ })));
159
+ });
160
+ const encodeSuccess = (definition, methodName, value) => {
161
+ const methodDefinition = definition.methods[methodName];
162
+ return S.encodeUnknownEffect(wireCodec(methodDefinition.success))(value).pipe(Effect.mapError((cause) => new RpcSuccessEncodeError({
163
+ definition: definition.id,
164
+ method: methodName,
165
+ cause
166
+ })));
167
+ };
168
+ const decodeSuccess = (definition, methodName, value) => {
169
+ const methodDefinition = definition.methods[methodName];
170
+ return S.decodeUnknownEffect(wireCodec(methodDefinition.success))(value).pipe(Effect.mapError((cause) => new RpcSuccessDecodeError({
171
+ definition: definition.id,
172
+ method: methodName,
173
+ cause
174
+ })));
175
+ };
176
+ const make = (id, methods) => {
177
+ assertNoReservedMethods(id, methods, reservedMethodNames);
178
+ return {
179
+ id,
180
+ methods
181
+ };
182
+ };
183
+ //#endregion
184
+ export { RpcArgumentCountError, RpcArgumentDecodeError, RpcArgumentEncodeError, RpcDefinition_exports, RpcReservedMethodNameError, RpcSuccessDecodeError, RpcSuccessEncodeError, assertNoReservedMethods, decodeArgs, decodeSuccess, decodeWireError, encodeArgs, encodeSuccess, encodeWireError, isWireError, make, method, reservedMethodNames };