Unified · Split
| @@ -50,11 +50,7 @@ export function makeComponentLogger(component: string): DesktopComponentLogger { · 49 unmodified lines | ||
| 50 | 50 | }; |
| 51 | 51 | } |
| 52 | 52 | |
| 53 | −const readPersistedOtlpTracesUrl: Effect.Effect< | |
| 54 | − Option.Option<string>, | |
| 55 | − never, | |
| 56 | − FileSystem.FileSystem | DesktopEnvironment.DesktopEnvironment | |
| 57 | −> = Effect.gen(function* () { | |
| 53 | +const readPersistedOtlpTracesUrl = Effect.gen(function* () { | |
| 58 | 54 | const fileSystem = yield* FileSystem.FileSystem; |
| 59 | 55 | const environment = yield* DesktopEnvironment.DesktopEnvironment; |
| 60 | 56 | const raw = yield* fileSystem.readFileString(environment.serverSettingsPath).pipe(Effect.option); |
| @@ -54,11 +54,7 @@ const { logWarning: logBackendConfigurationWarning } = DesktopObservability.make · 53 unmodified lines | ||
| 54 | 54 | "desktop-backend-configuration", |
| 55 | 55 | ); |
| 56 | 56 | |
| 57 | −const readPersistedBackendObservabilitySettings: Effect.Effect< | |
| 58 | − BackendObservabilitySettings, | |
| 59 | − never, | |
| 60 | − FileSystem.FileSystem | DesktopEnvironment.DesktopEnvironment | |
| 61 | −> = Effect.gen(function* () { | |
| 57 | +const readPersistedBackendObservabilitySettings = Effect.gen(function* () { | |
| 62 | 58 | const fileSystem = yield* FileSystem.FileSystem; |
| 63 | 59 | const environment = yield* DesktopEnvironment.DesktopEnvironment; |
| 64 | 60 | const exists = yield* fileSystem |
| @@ -211,11 +211,7 @@ const readLoginShellEnvironment = ( · 210 unmodified lines | ||
| 211 | 211 | timeout: LOGIN_SHELL_TIMEOUT, |
| 212 | 212 | }).pipe(Effect.map((output) => extractEnvironment(output, names))); |
| 213 | 213 | |
| 214 | −const readLaunchctlPath: Effect.Effect< | |
| 215 | − Option.Option<string>, | |
| 216 | − never, | |
| 217 | − ChildProcessSpawner.ChildProcessSpawner | |
| 218 | −> = runCommandOutput({ | |
| 214 | +const readLaunchctlPath = runCommandOutput({ | |
| 219 | 215 | command: "/bin/launchctl", |
| 220 | 216 | args: ["getenv", "PATH"], |
| 221 | 217 | timeout: LAUNCHCTL_TIMEOUT, |
| @@ -37,11 +37,7 @@ const dispatchMenuAction = Effect.fn("desktop.menu.dispatchMenuAction")(function · 36 unmodified lines | ||
| 37 | 37 | yield* desktopWindow.dispatchMenuAction(action); |
| 38 | 38 | }); |
| 39 | 39 | |
| 40 | −const checkForUpdatesFromMenu: Effect.Effect< | |
| 41 | − void, | |
| 42 | − never, | |
| 43 | − DesktopUpdates.DesktopUpdates | ElectronDialog.ElectronDialog | |
| 44 | −> = Effect.gen(function* () { | |
| 40 | +const checkForUpdatesFromMenu = Effect.gen(function* () { | |
| 45 | 41 | const updates = yield* DesktopUpdates.DesktopUpdates; |
| 46 | 42 | const electronDialog = yield* ElectronDialog.ElectronDialog; |
| 47 | 43 | const result = yield* updates.check("menu"); |
| @@ -65,11 +61,7 @@ const checkForUpdatesFromMenu: Effect.Effect< · 17 unmodified lines | ||
| 65 | 61 | } |
| 66 | 62 | }).pipe(Effect.withSpan("desktop.menu.checkForUpdates")); |
| 67 | 63 | |
| 68 | −const handleCheckForUpdatesMenuClick: Effect.Effect< | |
| 69 | − void, | |
| 70 | − DesktopWindow.DesktopWindowError, | |
| 71 | − DesktopUpdates.DesktopUpdates | ElectronDialog.ElectronDialog | DesktopWindow.DesktopWindow | |
| 72 | −> = Effect.gen(function* () { | |
| 64 | +const handleCheckForUpdatesMenuClick = Effect.gen(function* () { | |
| 73 | 65 | const updates = yield* DesktopUpdates.DesktopUpdates; |
| 74 | 66 | const electronDialog = yield* ElectronDialog.ElectronDialog; |
| 75 | 67 | const disabledReason = yield* updates.disabledReason; |
| @@ -5,24 +5,20 @@ import { Atom } from "effect/unstable/reactivity"; · 4 unmodified lines | ||
| 5 | 5 | import { runtimeContextLayer } from "../lib/runtime"; |
| 6 | 6 | import { connectionPlatformLayer } from "./platform"; |
| 7 | 7 | |
| 8 | −const providedConnectionPlatformLayer: Layer.Layer< | |
| 9 | − Layer.Success<typeof connectionPlatformLayer>, | |
| 10 | − Layer.Error<typeof connectionPlatformLayer> | |
| 11 | −> = connectionPlatformLayer.pipe(Layer.provide(runtimeContextLayer)); | |
| 8 | +const providedConnectionPlatformLayer = connectionPlatformLayer.pipe( | |
| 9 | + Layer.provide(runtimeContextLayer), | |
| 10 | +); | |
| 12 | 11 | |
| 13 | 12 | type ConnectionLayerSource = |
| 14 | 13 | | typeof Connection.layer |
| 15 | 14 | | typeof runtimeContextLayer |
| 16 | − | typeof providedConnectionPlatformLayer; | |
| 15 | + | typeof connectionPlatformLayer; | |
| 17 | 16 | |
| 18 | −export const connectionLayer: Layer.Layer< | |
| 19 | − Layer.Success<ConnectionLayerSource>, | |
| 20 | − Layer.Error<ConnectionLayerSource> | |
| 21 | −> = Connection.layer.pipe( | |
| 17 | +const connectionLayer = Connection.layer.pipe( | |
| 22 | 18 | Layer.provideMerge(Layer.mergeAll(runtimeContextLayer, providedConnectionPlatformLayer)), |
| 23 | 19 | ); |
| 24 | 20 | |
| 25 | 21 | export const connectionAtomRuntime: Atom.AtomRuntime< |
| 26 | − Layer.Success<typeof connectionLayer>, | |
| 27 | − Layer.Error<typeof connectionLayer> | |
| 22 | + Layer.Success<ConnectionLayerSource>, | |
| 23 | + Layer.Error<ConnectionLayerSource> | |
| 28 | 24 | > = Atom.runtime(connectionLayer); |
| @@ -22,10 +22,7 @@ type RuntimeLayerSource = · 21 unmodified lines | ||
| 22 | 22 | | typeof httpClientLayer |
| 23 | 23 | | typeof tracingLayer; |
| 24 | 24 | |
| 25 | −export const runtimeLayer: Layer.Layer< | |
| 26 | − Layer.Success<RuntimeLayerSource>, | |
| 27 | − Layer.Error<RuntimeLayerSource> | |
| 28 | −> = Layer.merge( | |
| 25 | +const runtimeLayer = Layer.merge( | |
| 29 | 26 | managedRelayClientLayer(configuredRelayUrl()), |
| 30 | 27 | Socket.layerWebSocketConstructorGlobal, |
| 31 | 28 | ).pipe( |
| @@ -35,11 +32,11 @@ export const runtimeLayer: Layer.Layer< · 3 unmodified lines | ||
| 35 | 32 | ); |
| 36 | 33 | |
| 37 | 34 | export const runtime: ManagedRuntime.ManagedRuntime< |
| 38 | − Layer.Success<typeof runtimeLayer>, | |
| 39 | − Layer.Error<typeof runtimeLayer> | |
| 35 | + Layer.Success<RuntimeLayerSource>, | |
| 36 | + Layer.Error<RuntimeLayerSource> | |
| 40 | 37 | > = ManagedRuntime.make(runtimeLayer); |
| 41 | 38 | |
| 42 | 39 | export const runtimeContextLayer: Layer.Layer< |
| 43 | − Layer.Success<typeof runtimeLayer>, | |
| 44 | − Layer.Error<typeof runtimeLayer> | |
| 40 | + Layer.Success<RuntimeLayerSource>, | |
| 41 | + Layer.Error<RuntimeLayerSource> | |
| 45 | 42 | > = Layer.effectContext(runtime.contextEffect); |
| @@ -2,5 +2,5 @@ import { createRelayEnvironmentDiscoveryAtoms } from "@t3tools/client-runtime/st · 1 unmodified line | ||
| 2 | 2 | |
| 3 | 3 | import { connectionAtomRuntime } from "../connection/runtime"; |
| 4 | 4 | |
| 5 | −export const relayEnvironmentDiscovery: ReturnType<typeof createRelayEnvironmentDiscoveryAtoms> = | |
| 5 | +export const relayEnvironmentDiscovery = | |
| 6 | 6 | createRelayEnvironmentDiscoveryAtoms(connectionAtomRuntime); |
| @@ -191,11 +191,7 @@ const make = Effect.acquireRelease( · 190 unmodified lines | ||
| 191 | 191 | }), |
| 192 | 192 | ); |
| 193 | 193 | |
| 194 | −export const layer: Layer.Layer< | |
| 195 | − McpSessionRegistry, | |
| 196 | − never, | |
| 197 | − Crypto.Crypto | ServerEnvironment.ServerEnvironment | HttpServer.HttpServer | |
| 198 | −> = Layer.effect(McpSessionRegistry, make); | |
| 194 | +export const layer = Layer.effect(McpSessionRegistry, make); | |
| 199 | 195 | |
| 200 | 196 | export const issueActiveMcpCredential = ( |
| 201 | 197 | request: McpCredentialRequest, |
| @@ -114,11 +114,7 @@ export const deriveProviderInstanceConfigMap = ( · 113 unmodified lines | ||
| 114 | 114 | * configs, so the only way the watcher could fail is a settings stream |
| 115 | 115 | * tear-down, which logs and exits cleanly. |
| 116 | 116 | */ |
| 117 | −const SettingsWatcherLive: Layer.Layer< | |
| 118 | − never, | |
| 119 | − never, | |
| 120 | − ProviderInstanceRegistryMutator | ServerSettingsService | |
| 121 | −> = Layer.effectDiscard( | |
| 117 | +const SettingsWatcherLive = Layer.effectDiscard( | |
| 122 | 118 | Effect.gen(function* () { |
| 123 | 119 | const mutator = yield* ProviderInstanceRegistryMutator; |
| 124 | 120 | const serverSettings = yield* ServerSettingsService; |
| @@ -107,43 +107,40 @@ export function writeStoredBrowserDpopKey( · 106 unmodified lines | ||
| 107 | 107 | ); |
| 108 | 108 | } |
| 109 | 109 | |
| 110 | −export const generateBrowserDpopKey: Effect.Effect<BrowserDpopKey, BrowserDpopError> = Effect.gen( | |
| 111 | − function* () { | |
| 112 | − const generated = yield* Effect.tryPromise({ | |
| 113 | − try: () => | |
| 114 | − crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [ | |
| 115 | − "sign", | |
| 116 | − "verify", | |
| 117 | − ]) as Promise<CryptoKeyPair>, | |
| 118 | − catch: (cause) => dpopError("Could not generate DPoP proof key.", cause), | |
| 119 | − }); | |
| 120 | − const privateJwk = yield* Effect.tryPromise({ | |
| 121 | − try: () => crypto.subtle.exportKey("jwk", generated.privateKey), | |
| 122 | − catch: (cause) => dpopError("Could not export DPoP private key.", cause), | |
| 123 | − }); | |
| 124 | − const publicJwk = yield* Effect.tryPromise({ | |
| 125 | − try: () => crypto.subtle.exportKey("jwk", generated.publicKey), | |
| 126 | − catch: (cause) => dpopError("Could not export DPoP public key.", cause), | |
| 127 | − }).pipe( | |
| 128 | − Effect.flatMap((jwk) => decodeDpopPublicJwk(jwk)), | |
| 129 | − Effect.mapError((cause) => | |
| 130 | − cause instanceof BrowserDpopError | |
| 131 | − ? cause | |
| 132 | − : dpopError("Generated DPoP public key is invalid.", cause), | |
| 133 | − ), | |
| 134 | − ); | |
| 135 | − const privateKey = yield* Effect.tryPromise({ | |
| 136 | − try: () => | |
| 137 | − importJWK(privateJwk as JWK, "ES256", { extractable: false }) as Promise<CryptoKey>, | |
| 138 | − catch: (cause) => dpopError("Could not import DPoP private key.", cause), | |
| 139 | − }); | |
| 140 | − return { | |
| 141 | − privateKey, | |
| 142 | − publicJwk, | |
| 143 | − thumbprint: computeDpopJwkThumbprint(publicJwk), | |
| 144 | − }; | |
| 145 | − }, | |
| 146 | −); | |
| 110 | +export const generateBrowserDpopKey = Effect.gen(function* () { | |
| 111 | + const generated = yield* Effect.tryPromise({ | |
| 112 | + try: () => | |
| 113 | + crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [ | |
| 114 | + "sign", | |
| 115 | + "verify", | |
| 116 | + ]) as Promise<CryptoKeyPair>, | |
| 117 | + catch: (cause) => dpopError("Could not generate DPoP proof key.", cause), | |
| 118 | + }); | |
| 119 | + const privateJwk = yield* Effect.tryPromise({ | |
| 120 | + try: () => crypto.subtle.exportKey("jwk", generated.privateKey), | |
| 121 | + catch: (cause) => dpopError("Could not export DPoP private key.", cause), | |
| 122 | + }); | |
| 123 | + const publicJwk = yield* Effect.tryPromise({ | |
| 124 | + try: () => crypto.subtle.exportKey("jwk", generated.publicKey), | |
| 125 | + catch: (cause) => dpopError("Could not export DPoP public key.", cause), | |
| 126 | + }).pipe( | |
| 127 | + Effect.flatMap((jwk) => decodeDpopPublicJwk(jwk)), | |
| 128 | + Effect.mapError((cause) => | |
| 129 | + cause instanceof BrowserDpopError | |
| 130 | + ? cause | |
| 131 | + : dpopError("Generated DPoP public key is invalid.", cause), | |
| 132 | + ), | |
| 133 | + ); | |
| 134 | + const privateKey = yield* Effect.tryPromise({ | |
| 135 | + try: () => importJWK(privateJwk as JWK, "ES256", { extractable: false }) as Promise<CryptoKey>, | |
| 136 | + catch: (cause) => dpopError("Could not import DPoP private key.", cause), | |
| 137 | + }); | |
| 138 | + return { | |
| 139 | + privateKey, | |
| 140 | + publicJwk, | |
| 141 | + thumbprint: computeDpopJwkThumbprint(publicJwk), | |
| 142 | + }; | |
| 143 | +}); | |
| 147 | 144 | |
| 148 | 145 | export function createBrowserDpopProof(input: { |
| 149 | 146 | readonly method: string; |
| @@ -5,24 +5,20 @@ import { Atom } from "effect/unstable/reactivity"; · 4 unmodified lines | ||
| 5 | 5 | import { runtimeContextLayer } from "../lib/runtime"; |
| 6 | 6 | import { connectionPlatformLayer } from "./platform"; |
| 7 | 7 | |
| 8 | −const providedConnectionPlatformLayer: Layer.Layer< | |
| 9 | − Layer.Success<typeof connectionPlatformLayer>, | |
| 10 | − Layer.Error<typeof connectionPlatformLayer> | |
| 11 | −> = connectionPlatformLayer.pipe(Layer.provide(runtimeContextLayer)); | |
| 8 | +const providedConnectionPlatformLayer = connectionPlatformLayer.pipe( | |
| 9 | + Layer.provide(runtimeContextLayer), | |
| 10 | +); | |
| 12 | 11 | |
| 13 | 12 | type ConnectionLayerSource = |
| 14 | 13 | | typeof Connection.layer |
| 15 | 14 | | typeof runtimeContextLayer |
| 16 | − | typeof providedConnectionPlatformLayer; | |
| 15 | + | typeof connectionPlatformLayer; | |
| 17 | 16 | |
| 18 | −export const connectionLayer: Layer.Layer< | |
| 19 | − Layer.Success<ConnectionLayerSource>, | |
| 20 | − Layer.Error<ConnectionLayerSource> | |
| 21 | −> = Connection.layer.pipe( | |
| 17 | +const connectionLayer = Connection.layer.pipe( | |
| 22 | 18 | Layer.provideMerge(Layer.mergeAll(runtimeContextLayer, providedConnectionPlatformLayer)), |
| 23 | 19 | ); |
| 24 | 20 | |
| 25 | 21 | export const connectionAtomRuntime: Atom.AtomRuntime< |
| 26 | − Layer.Success<typeof connectionLayer>, | |
| 27 | − Layer.Error<typeof connectionLayer> | |
| 22 | + Layer.Success<ConnectionLayerSource>, | |
| 23 | + Layer.Error<ConnectionLayerSource> | |
| 28 | 24 | > = Atom.runtime(connectionLayer); |
| @@ -54,10 +54,7 @@ export function __setPrimaryHttpRunnerForTests(runner?: PrimaryHttpEffectRunner) · 53 unmodified lines | ||
| 54 | 54 | primaryHttpRunner = runner ?? livePrimaryHttpRunner; |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | −export const runtimeLayer: Layer.Layer< | |
| 58 | − Layer.Success<RuntimeLayerSource>, | |
| 59 | − Layer.Error<RuntimeLayerSource> | |
| 60 | −> = Layer.mergeAll( | |
| 57 | +const runtimeLayer = Layer.mergeAll( | |
| 61 | 58 | httpClientLayer, |
| 62 | 59 | browserCryptoLayer, |
| 63 | 60 | Socket.layerWebSocketConstructorGlobal, |
| @@ -68,11 +65,11 @@ export const runtimeLayer: Layer.Layer< · 4 unmodified lines | ||
| 68 | 65 | ); |
| 69 | 66 | |
| 70 | 67 | export const runtime: ManagedRuntime.ManagedRuntime< |
| 71 | − Layer.Success<typeof runtimeLayer>, | |
| 72 | − Layer.Error<typeof runtimeLayer> | |
| 68 | + Layer.Success<RuntimeLayerSource>, | |
| 69 | + Layer.Error<RuntimeLayerSource> | |
| 73 | 70 | > = ManagedRuntime.make(runtimeLayer); |
| 74 | 71 | |
| 75 | 72 | export const runtimeContextLayer: Layer.Layer< |
| 76 | − Layer.Success<typeof runtimeLayer>, | |
| 77 | − Layer.Error<typeof runtimeLayer> | |
| 73 | + Layer.Success<RuntimeLayerSource>, | |
| 74 | + Layer.Error<RuntimeLayerSource> | |
| 78 | 75 | > = Layer.effectContext(runtime.contextEffect); |
| @@ -1,4 +1,4 @@ | ||
| 1 | −import { ORCHESTRATION_WS_METHODS, type ServerConfig, WS_METHODS } from "@t3tools/contracts"; | |
| 1 | +import { ORCHESTRATION_WS_METHODS, WS_METHODS } from "@t3tools/contracts"; | |
| 2 | 2 | import * as Cause from "effect/Cause"; |
| 3 | 3 | import * as Context from "effect/Context"; |
| 4 | 4 | import type * as Duration from "effect/Duration"; |
| @@ -9,7 +9,6 @@ import * as Stream from "effect/Stream"; · 4 unmodified lines | ||
| 9 | 9 | import * as SubscriptionRef from "effect/SubscriptionRef"; |
| 10 | 10 | import { RpcClientError } from "effect/unstable/rpc"; |
| 11 | 11 | |
| 12 | −import type { ConnectionAttemptError } from "../connection/model.ts"; | |
| 13 | 12 | import { EnvironmentSupervisor } from "../connection/supervisor.ts"; |
| 14 | 13 | import type { WsRpcProtocolClient } from "../rpc/protocol.ts"; |
| 15 | 14 | |
| @@ -237,11 +236,7 @@ export function subscribe<TTag extends EnvironmentSubscriptionRpcTag>( · 221 unmodified lines | ||
| 237 | 236 | ); |
| 238 | 237 | } |
| 239 | 238 | |
| 240 | −export const config: Effect.Effect< | |
| 241 | − ServerConfig, | |
| 242 | − EnvironmentRpcUnavailableError | ConnectionAttemptError, | |
| 243 | − EnvironmentSupervisor | |
| 244 | −> = Effect.gen(function* () { | |
| 239 | +export const config = Effect.gen(function* () { | |
| 245 | 240 | const session = yield* currentSession(); |
| 246 | 241 | return yield* session.initialConfig; |
| 247 | 242 | }).pipe(Effect.withSpan("EnvironmentRpc.config")); |
| @@ -135,11 +135,7 @@ export const parseTailscaleStatus = ( · 134 unmodified lines | ||
| 135 | 135 | }), |
| 136 | 136 | ); |
| 137 | 137 | |
| 138 | −export const readTailscaleStatus: Effect.Effect< | |
| 139 | − TailscaleStatus, | |
| 140 | − TailscaleCommandError | TailscaleStatusParseError, | |
| 141 | − ChildProcessSpawner.ChildProcessSpawner | |
| 142 | −> = Effect.gen(function* () { | |
| 138 | +export const readTailscaleStatus = Effect.gen(function* () { | |
| 143 | 139 | const args = ["status", "--json"]; |
| 144 | 140 | const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; |
| 145 | 141 | const hostPlatform = yield* HostProcessPlatform; |