1import * as Cloudflare from "@/Cloudflare";
2import { normalizeTransferredFrom } from "@/Cloudflare/Workers/DurableObject";
3import type { PlatformIdentity } from "@/Platform.ts";
4import { expect, test } from "alchemy-test";
5import * as Effect from "effect/Effect";
6import * as Schema from "effect/Schema";
7import * as Rpc from "effect/rpc/Rpc";
8import * as RpcGroup from "effect/rpc/RpcGroup";
9import * as RpcServer from "effect/rpc/RpcServer";
10
11const ping = Rpc.make("ping", {
12 success: Schema.Void,
13 payload: {},
14});
15
16class PingRpcs extends RpcGroup.make(ping) {}
17
18class ModularRpcWorker extends Cloudflare.RpcWorker<ModularRpcWorker>()(
19 "ModularRpcWorker",
20 { schema: PingRpcs },
21) {}
22
23class InlineRpcWorker extends Cloudflare.RpcWorker<InlineRpcWorker>()(
24 "InlineRpcWorker",
25 { main: import.meta.url, schema: PingRpcs },
26 Effect.succeed(RpcServer.toHttpEffect(PingRpcs)),
27) {}
28
29const identity = <const Id extends string>(
30 declaration: PlatformIdentity<Id>,
31): Id => declaration.LogicalId;
32
33class OrdinaryWorker extends Cloudflare.Worker<OrdinaryWorker>()(
34 "OrdinaryWorker",
35 {},
36) {}
37
38test(
39 "ordinary and RPC Workers share a native identity reader",
40 () => {
41 expect(identity(OrdinaryWorker)).toBe("OrdinaryWorker");
42 expect(identity(ModularRpcWorker)).toBe("ModularRpcWorker");
43 expect(identity(InlineRpcWorker)).toBe("InlineRpcWorker");
44 },
45 {
46 tags: [
47 "unit",
48 "provider:cloudflare",
49 "provider:cloudflare:worker",
50 "local",
51 ],
52 },
53);
54
55test(
56 "RpcWorker modular class copies LogicalId from the underlying Worker",
57 () => {
58 expect(ModularRpcWorker.LogicalId).toBe("ModularRpcWorker");
59 },
60 {
61 tags: [
62 "unit",
63 "provider:cloudflare",
64 "provider:cloudflare:worker",
65 "local",
66 ],
67 },
68);
69
70test(
71 "RpcWorker inline class copies LogicalId from the underlying Worker",
72 () => {
73 expect(InlineRpcWorker.LogicalId).toBe("InlineRpcWorker");
74 },
75 {
76 tags: [
77 "unit",
78 "provider:cloudflare",
79 "provider:cloudflare:worker",
80 "local",
81 ],
82 },
83);
84
85test(
86 "RpcWorker class is a transferredFrom source by logical id",
87 () => {
88 expect(normalizeTransferredFrom(ModularRpcWorker)).toEqual([
89 "ModularRpcWorker",
90 ]);
91 expect(normalizeTransferredFrom(InlineRpcWorker)).toEqual([
92 "InlineRpcWorker",
93 ]);
94 },
95 {
96 tags: [
97 "unit",
98 "provider:cloudflare",
99 "provider:cloudflare:worker",
100 "local",
101 ],
102 },
103);