Files
makelore/electron/robot-hotspot/adapter.ts

37 lines
1.1 KiB
TypeScript

export interface RobotHotspotAdapterCandidate {
ssid: string;
signalPercent: number;
connected: boolean;
open: boolean;
nativeKey: unknown;
}
export interface RobotHotspotAdapter {
scan(signal: AbortSignal): Promise<RobotHotspotAdapterCandidate[]>;
connect(candidate: RobotHotspotAdapterCandidate, signal: AbortSignal): Promise<void>;
currentSsid(signal: AbortSignal): Promise<string | null>;
clear(): void;
}
export class RobotHotspotAdapterError extends Error {
constructor(public readonly reason: 'unsupported' | 'permission_denied' | 'scan_failed' | 'connect_failed') {
super(reason);
this.name = 'RobotHotspotAdapterError';
}
}
export function throwIfAborted(signal: AbortSignal): void {
if (signal.aborted) throw signal.reason;
}
export function abortableDelay(milliseconds: number, signal: AbortSignal): Promise<void> {
if (signal.aborted) return Promise.reject(signal.reason);
return new Promise((resolve, reject) => {
const timer = setTimeout(resolve, milliseconds);
signal.addEventListener('abort', () => {
clearTimeout(timer);
reject(signal.reason);
}, { once: true });
});
}