Files
rea/src/hopper/HopperSocketConnection.ts
T
morlutoandGitHub 735c10059c refactor(domain): split error taxonomy into thematic modules (#636)
Move each error family out of domain/errors.ts into its own module
(base, core, provider selection/adapter, browser observation,
artifact, evidence, unknown registry, hopper, configuration) and
relocate AnalysisErrorProjection to analysisErrorProjection.
Migrate all 162 importers to the owning modules and delete
errors.ts. No re-export shims; behavior is unchanged.
2026-10-06 05:57:38 +08:00

40 lines
1.2 KiB
TypeScript

import { createConnection, type Socket } from "node:net";
import {
HopperCancelledError,
HopperStartError,
} from "../domain/hopperErrors.js";
import { err, ok, type Result } from "../domain/result.js";
/** Open one abort-aware Hopper Unix-socket connection attempt. */
export const connectHopperSocketOnce = (
socketPath: string,
signal: AbortSignal,
): Promise<Result<Socket, HopperStartError | HopperCancelledError>> =>
new Promise((resolve) => {
const socket = createConnection(socketPath);
const detach = (): void => {
socket.off("connect", onConnect);
socket.off("error", onError);
signal.removeEventListener("abort", onAbort);
};
const onConnect = (): void => {
detach();
resolve(ok(socket));
};
const onError = (cause: Error): void => {
detach();
socket.destroy();
resolve(err(new HopperStartError({ cause })));
};
const onAbort = (): void => {
detach();
socket.destroy();
resolve(err(new HopperCancelledError()));
};
socket.once("connect", onConnect);
socket.once("error", onError);
signal.addEventListener("abort", onAbort, { once: true });
if (signal.aborted) onAbort();
});