/** * 액세스 링크는 주소·1회용 자격·서버 신원·이름을 하나의 봉투에 담아 `fleet://join?code=`로 * 실어 나른다. 주소를 URL 껍데기에 두지 않는 이유는 두 가지다 — 붙여넣는 사람 눈에 사설 IP와 * 포트가 드러나지 않고, 봉투가 버전을 가지므로 나중에 필드를 늘려도 옛 링크를 구분할 수 있다. * * 이 스킴은 브라우저가 따라갈 수 없다. 링크를 여는 주체는 Fleet 네이티브 셸(Desktop과 Mobile)이며, * 브라우저 원격 접속은 별도 결정 전까지 열지 않는다. * * 링크를 신뢰한다는 것이 곧 그 서버를 신뢰한다는 뜻이므로 파싱은 관대할 이유가 없다. 모양이 * 어긋난 링크는 고쳐 쓰지 않고 거절한다. */ interface AccessLinkPayload { readonly v: number; /** `https://host:port`. origin 형태 그대로이며 경로·질의·fragment를 갖지 않는다. */ readonly endpoint: string; readonly token: string; /** 구분자 없는 대문자 SHA-256 hex. */ readonly fingerprint: string; /** 발급한 콘솔이 스스로를 부르는 이름. 목록에서 호스트를 알아보는 유일한 단서다. */ readonly label: string; } interface ValidatedAccessLink { readonly origin: string; /** 인증서 핀의 키. URL이 대괄호로 감싼 IPv6 리터럴은 벗겨서 담는다. */ readonly hostname: string; readonly port: number; readonly label: string; readonly consoleUrl: string; readonly joinUrl: string; readonly token: string; readonly fingerprint: string; } declare const ACCESS_LINK_SCHEME = "fleet:"; declare const ACCESS_LINK_HOST = "join"; declare const ACCESS_LINK_PREFIX = "fleet://join?code="; declare const ACCESS_LINK_VERSION = 1; declare const ACCESS_JOIN_PATH = "/api/v1/join"; declare const MAX_ACCESS_LABEL_LENGTH = 48; /** 링크 후보인지만 가른다 — 유효성은 parseAccessLink가 판정한다. */ declare function isAccessLinkInput(value: string): boolean; declare function encodeAccessLink(payload: Omit): string; declare function parseAccessLink(input: string): ValidatedAccessLink; /** 인증서 핀은 호스트 단위다. Chromium은 검증기에 대괄호 없는 호스트명을 넘긴다. */ declare function pinHostname(hostname: string): string; /** * 링크와 UI가 같은 표기를 쓰도록 지문 비교는 항상 정규화한 뒤 수행한다. 콘솔은 구분자 없이 * 발급하지만 손으로 옮긴 콜론·공백 표기도 같은 값으로 본다. * * 지문 표기의 유일한 정의다 — 두 벌이 되면 한쪽만 고쳐진 채로 갈라진다. */ declare function normalizeFingerprint(value: string): string; /** * 라벨은 목록에 그대로 그려지므로 제어문자와 방향 재정의 문자를 남겨 두지 않는다 — 호스트 * 이름이 옆줄의 주소를 가리는 형태로 읽히면 안 된다. */ declare function sanitizeAccessLabel(value: string): string; export { ACCESS_JOIN_PATH, ACCESS_LINK_HOST, ACCESS_LINK_PREFIX, ACCESS_LINK_SCHEME, ACCESS_LINK_VERSION, type AccessLinkPayload, MAX_ACCESS_LABEL_LENGTH, type ValidatedAccessLink, encodeAccessLink, isAccessLinkInput, normalizeFingerprint, parseAccessLink, pinHostname, sanitizeAccessLabel };