Open History to see the last commit
1import { createEnvironmentProjectAtoms } from "@t3tools/client-runtime/state/projects";
2import { createProjectEnvironmentAtoms } from "@t3tools/client-runtime/state/projects";
3import { createEnvironmentRpcQueryAtomFamily } from "@t3tools/client-runtime/state/runtime";
4import { WS_METHODS } from "@t3tools/contracts";
5
6import { environmentCatalog } from "../connection/catalog";
7import { connectionAtomRuntime } from "../connection/runtime";
8import { environmentShell, environmentSnapshotAtom, expectsPrimaryEnvironment } from "./shell";
9import { parseScopedProjectKey } from "@t3tools/client-runtime/environment";
10import { AVAILABLE_CONNECTION_STATE } from "@t3tools/client-runtime/connection";
11import { AsyncResult, Atom } from "effect/reactivity";
12import { serverEnvironment } from "./server";
13
14export const environmentProjects = createEnvironmentProjectAtoms({
15 catalogValueAtom: environmentCatalog.catalogValueAtom,
16 snapshotAtom: environmentSnapshotAtom,
17 serverConfigValueAtom: serverEnvironment.configValueAtom,
18});
19export const projectEnvironment = createProjectEnvironmentAtoms(connectionAtomRuntime, {
20 projectAtom: environmentProjects.projectAtom,
21});
22export const projectContentSearch = createEnvironmentRpcQueryAtomFamily(connectionAtomRuntime, {
23 label: "environment-data:projects:search-contents",
24 tag: WS_METHODS.projectsSearchContents,
25 staleTimeMs: 5_000,
26 idleTtlMs: 60_000,
27});
28
29export const defaultProjectFallbackReadyAtom = Atom.family((projectKey: string | null) =>
30 Atom.make((get) => {
31 const remembered = projectKey === null ? null : parseScopedProjectKey(projectKey);
32 if (!remembered) return true;
33 const catalog = get(environmentCatalog.catalogValueAtom);
34 if (!catalog.isReady) return false;
35 if (
36 expectsPrimaryEnvironment() &&
37 !Array.from(catalog.entries.values()).some(
38 (entry) => entry.target._tag === "PrimaryConnectionTarget",
39 )
40 )
41 return false;
42 const entry = catalog.entries.get(remembered.environmentId);
43 if (!entry?.enabled || entry.unsupportedReason !== undefined) return true;
44 if (get(environmentShell.statusAtom(remembered.environmentId)) === "live") return true;
45 const connection = AsyncResult.getOrElse(
46 get(environmentCatalog.stateAtom(remembered.environmentId)),
47 () => AVAILABLE_CONNECTION_STATE,
48 );
49 return (
50 connection.phase === "offline" ||
51 connection.phase === "blocked" ||
52 (connection.phase === "backoff" && connection.attempt > 2)
53 );
54 }).pipe(Atom.withLabel(`web-default-project-fallback-ready:${projectKey}`)),
55);