1import { WS_METHODS } from "@t3tools/contracts";
2import { Atom } from "effect/reactivity";
3
4import type { EnvironmentRegistry } from "../connection/registry.ts";
5import {
6 createAtomCommandScheduler,
7 createEnvironmentRpcCommand,
8 createEnvironmentRpcQueryAtomFamily,
9 createEnvironmentRpcSubscriptionAtomFamily,
10} from "./runtime.ts";
11
12export function createPreviewEnvironmentAtoms<R, E>(
13 runtime: Atom.AtomRuntime<EnvironmentRegistry | R, E>,
14) {
15 const lifecycleScheduler = createAtomCommandScheduler();
16 const statusScheduler = createAtomCommandScheduler();
17 const lifecycleConcurrency = {
18 mode: "serial" as const,
19 key: ({ environmentId, input }: { environmentId: string; input: { threadId: string } }) =>
20 JSON.stringify([environmentId, input.threadId]),
21 };
22 return {
23 list: createEnvironmentRpcQueryAtomFamily(runtime, {
24 label: "environment-data:preview:list",
25 tag: WS_METHODS.previewList,
26 staleTimeMs: 5_000,
27 }),
28 events: createEnvironmentRpcSubscriptionAtomFamily(runtime, {
29 label: "environment-data:preview:events",
30 tag: WS_METHODS.subscribePreviewEvents,
31 }),
32 discoveredServers: createEnvironmentRpcSubscriptionAtomFamily(runtime, {
33 label: "environment-data:preview:discovered-servers",
34 tag: WS_METHODS.subscribeDiscoveredLocalServers,
35 // Configured URLs are part of this atom's key. Dispose immediately so
36 // unmounted projects stop contributing probe candidates on the server.
37 idleTtlMs: 0,
38 }),
39 open: createEnvironmentRpcCommand(runtime, {
40 label: "environment-data:preview:open",
41 tag: WS_METHODS.previewOpen,
42 scheduler: lifecycleScheduler,
43 concurrency: lifecycleConcurrency,
44 }),
45 navigate: createEnvironmentRpcCommand(runtime, {
46 label: "environment-data:preview:navigate",
47 tag: WS_METHODS.previewNavigate,
48 scheduler: lifecycleScheduler,
49 concurrency: lifecycleConcurrency,
50 }),
51 resize: createEnvironmentRpcCommand(runtime, {
52 label: "environment-data:preview:resize",
53 tag: WS_METHODS.previewResize,
54 scheduler: lifecycleScheduler,
55 concurrency: lifecycleConcurrency,
56 }),
57 adjust: createEnvironmentRpcCommand(runtime, {
58 label: "environment-data:preview:adjust",
59 tag: WS_METHODS.previewAdjust,
60 scheduler: lifecycleScheduler,
61 concurrency: lifecycleConcurrency,
62 }),
63 refresh: createEnvironmentRpcCommand(runtime, {
64 label: "environment-data:preview:refresh",
65 tag: WS_METHODS.previewRefresh,
66 scheduler: lifecycleScheduler,
67 concurrency: lifecycleConcurrency,
68 }),
69 close: createEnvironmentRpcCommand(runtime, {
70 label: "environment-data:preview:close",
71 tag: WS_METHODS.previewClose,
72 scheduler: lifecycleScheduler,
73 concurrency: lifecycleConcurrency,
74 }),
75 clearProfile: createEnvironmentRpcCommand(runtime, {
76 label: "environment-data:preview:clear-profile",
77 tag: WS_METHODS.previewClearProfile,
78 }),
79 reportProfiles: createEnvironmentRpcCommand(runtime, {
80 label: "environment-data:preview:report-profiles",
81 tag: WS_METHODS.previewReportProfiles,
82 concurrency: { mode: "latest", key: ({ environmentId }) => environmentId },
83 }),
84 reportStatus: createEnvironmentRpcCommand(runtime, {
85 label: "environment-data:preview:report-status",
86 tag: WS_METHODS.previewReportStatus,
87 scheduler: statusScheduler,
88 concurrency: {
89 mode: "latest",
90 key: ({ environmentId, input }) =>
91 JSON.stringify([environmentId, input.threadId, input.tabId]),
92 },
93 }),
94 };
95}