export interface TunnelProvider { /** 실행 파일 이름 */ command: string; args(port: number): string[]; /** 사람이 읽을 이름 */ label: string; /** 설치 안내 */ install: string; } export declare const TUNNEL_PROVIDERS: TunnelProvider[]; /** * 출력 한 줄에서 터널 주소를 뽑는다. * * 두 제공자의 형태가 달라서 하나의 정규식으로 본다 — cloudflared는 사람이 읽는 배너에 * 주소를 섞어 찍고, ngrok은 JSON 안에 담는다. 형태를 가정하지 않고 **주소 자체를** 찾으면 * 배너 레이아웃이나 JSON 키가 바뀌어도 계속 동작한다. */ export declare function extractTunnelUrl(line: string): string | undefined; export interface Tunnel { url: string; provider: string; /** 재시작해도 같은 주소인지 — 배포된 앱에 쓸 수 있는지를 결정한다 */ stable: boolean; stop(): void; } /** cloudflared 로그인 자격 파일 — 없으면 named 터널을 만들 수 없다 */ export declare const CLOUDFLARED_CERT = ".cloudflared/cert.pem"; /** * named 터널 준비 명령들 (실행 순서대로). 마지막이 장기 실행이다. * * 매번 돌려도 되도록 만들었다 — 이미 있으면 cloudflared가 "already exists"로 끝내고, * 그건 `isBenignSetupError`가 성공으로 본다. 그래서 이 함수의 결과가 **매일 쓰는 명령**이 * 될 수 있다: 사용자는 터널이 처음인지 아닌지 신경 쓰지 않는다. */ export declare function namedTunnelSteps(name: string, hostname: string, port: number): { setup: string[][]; run: string[]; }; /** * 이미 준비된 상태를 나타내는 실패인지 — 그렇다면 성공으로 본다. * * cloudflared는 "이미 존재한다"를 0이 아닌 종료 코드로 알린다. 그걸 실패로 다루면 * 두 번째 실행부터 못 뜨고, 사용자는 첫 실행인지 기억해야 한다. */ export declare function isBenignSetupError(output: string): boolean; /** 호스트명에서 터널 이름을 만든다 — 사람이 이름을 정하게 만들 이유가 없다 */ export declare function tunnelNameFor(hostname: string): string; /** 사용 가능한 첫 제공자 (없으면 undefined) */ export declare function pickProvider(available: (command: string) => boolean, providers?: TunnelProvider[]): TunnelProvider | undefined; /** * 터널을 띄우고 주소를 받아 온다. 실패는 던진다 — `--tunnel`을 줬는데 조용히 터널 없이 * 뜨면 `https://` 페이지에서 왜 안 붙는지 추적할 방법이 없다. */ export declare function startTunnel(provider: TunnelProvider, port: number): Promise; export interface NamedTunnelOptions { hostname: string; port: number; /** cloudflared 실행 경로 (기본 'cloudflared') — 테스트에서 대역으로 바꾼다 */ command?: string; /** 로그인 자격이 있는지. 기본은 `~/.cloudflared/cert.pem` 존재 여부 */ loggedIn?: () => boolean; /** * 인자 변형 (테스트 전용). 대역 실행 파일에 스크립트 경로를 앞에 붙이기 위해 존재한다 — * 셸 스크립트를 대역으로 쓰면 Windows에서 실행되지 않는다(실측). */ wrapArgs?: (args: string[]) => string[]; } /** * 고정 주소 named 터널 — 준비(create·route)까지 우리가 하고, 그 다음 run을 띄운다. * * `--hostname`을 주면 배포된 앱 케이스가 로컬 케이스만큼 단순해진다: 매일 `crosspane` * 한 줄이고, 앱의 배포 설정에는 그 호스트명이 영구히 그대로 있다. * * 로그인만 사람 몫이다(브라우저 OAuth). 그것 없이 진행하면 create가 알 수 없는 오류로 * 죽으므로, 먼저 확인해서 정확한 조치를 알려 준다. */ export declare function startNamedTunnel(options: NamedTunnelOptions): Promise;