History

Use schema guards for desktop SSH errors

Cursor Agent committed 4 months ago

Commit 7ce32a81 parent b8090463 files · +10 −6Browse files

Unified · Split

3 files
  1. apps/desktop/src/ipc/methods/sshEnvironment.test.ts +4 −1
  2. apps/desktop/src/ipc/methods/sshEnvironment.ts +2 −4
  3. apps/desktop/src/ssh/DesktopSshEnvironment.ts +4 −1
apps/desktop/src/ipc/methods/sshEnvironment.test.ts+4−1
@@ -5,6 +5,7 @@ import * as Effect from "effect/Effect"; · 4 unmodified lines
55 import * as Exit from "effect/Exit";
66 import * as Layer from "effect/Layer";
77 import * as Option from "effect/Option";
8+import * as Schema from "effect/Schema";
89 import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
910
1011 import {
@@ -12,6 +13,8 @@ import { · 1 unmodified line
1213 fetchSshEnvironmentDescriptor,
1314 } from "./sshEnvironment.ts";
1415
16+const isSshHttpBridgeError = Schema.is(SshHttpBridgeError);
17+
1518 function jsonResponse(request: HttpClientRequest.HttpClientRequest, body: unknown, status = 200) {
1619 return HttpClientResponse.fromWeb(
1720 request,
@@ -83,7 +86,7 @@ describe("SSH environment IPC", () => { · 65 unmodified lines
8386
8487 assert.instanceOf(error, DesktopSshEnvironmentRequestError);
8588 assert.equal(error.operation, "fetch-environment-descriptor");
86− assert.equal(error.cause instanceof SshHttpBridgeError, false);
89+ assert.equal(isSshHttpBridgeError(error.cause), false);
8790 }).pipe(Effect.provide(layer));
8891 });
8992
apps/desktop/src/ipc/methods/sshEnvironment.ts+2−4
@@ -50,12 +50,10 @@ const isEnvironmentInternalError = Schema.is(EnvironmentInternalError); · 49 unmodified lines
5050 const isEnvironmentOperationForbiddenError = Schema.is(EnvironmentOperationForbiddenError);
5151 const isEnvironmentRequestInvalidError = Schema.is(EnvironmentRequestInvalidError);
5252 const isEnvironmentScopeRequiredError = Schema.is(EnvironmentScopeRequiredError);
53+const isSshHttpBridgeError = Schema.is(SshHttpBridgeError);
5354
5455 function readSshHttpStatus(cause: DesktopSshEnvironmentRequestCause): number | null {
55− if (
56− cause instanceof RemoteEnvironmentAuthUndeclaredStatusError ||
57− cause instanceof SshHttpBridgeError
58− ) {
56+ if (cause instanceof RemoteEnvironmentAuthUndeclaredStatusError || isSshHttpBridgeError(cause)) {
5957 return cause.status ?? null;
6058 }
6159 if (isEnvironmentRequestInvalidError(cause)) {
apps/desktop/src/ssh/DesktopSshEnvironment.ts+4−1
@@ -21,6 +21,7 @@ import * as Effect from "effect/Effect"; · 20 unmodified lines
2121 import * as FileSystem from "effect/FileSystem";
2222 import * as Layer from "effect/Layer";
2323 import * as Path from "effect/Path";
24+import * as Schema from "effect/Schema";
2425 import * as HttpClient from "effect/unstable/http/HttpClient";
2526 import * as ChildProcessSpawner from "effect/unstable/process/ChildProcessSpawner";
2627
@@ -69,6 +70,8 @@ export interface DesktopSshEnvironmentLayerOptions { · 42 unmodified lines
6970 readonly resolveCliRunner?: Effect.Effect<SshTunnel.RemoteT3RunnerOptions>;
7071 }
7172
73+const isSshPasswordPromptError = Schema.is(SshPasswordPromptError);
74+
7275 function discoverDesktopSshHostsEffect(input?: { readonly homeDir?: string }) {
7376 return discoverSshHosts(input ?? {});
7477 }
@@ -77,7 +80,7 @@ export function isDesktopSshPasswordPromptCancellation( · 2 unmodified lines
7780 error: unknown,
7881 ): error is SshPasswordPromptError {
7982 return (
80− error instanceof SshPasswordPromptError &&
83+ isSshPasswordPromptError(error) &&
8184 DesktopSshPasswordPrompts.isDesktopSshPasswordPromptCancellation(error.cause)
8285 );
8386 }