Native Messaging — 확장이 로컬 바이너리를 실행하는 법
Native Messaging = “샌드박스는 유지하되, 등록된 외부 프로세스 하나와 stdio로만 대화한다”. Chrome이 호스트를 별도 자식 프로세스로 spawn하고, 그 프로세스가 yt-dlp를 실행한다.
통신은 stdio 위 길이접두 JSON — 소켓/HTTP 아님. 메시지마다 4바이트 길이 헤더(네이티브 바이트 순서) + UTF-8 JSON.
raw_length = sys.stdin.buffer.read(4)
message_length = struct.unpack('<I', raw_length)[0] # 길이 먼저
message = sys.stdin.buffer.read(message_length) # 그만큼 본문
→ 호스트는 stdout에 print 금지(곧 프로토콜 깨짐). 로그는 stderr로.
content script는 통로 밖 — sendNativeMessage/connectNative는 background(service worker)에서만 호출 가능. 그래서 흐름이 content.js(ID 추출) → background.js(네이티브 통신)로 갈라진다.
프로세스 수명은 호출 방식이 결정 — sendNativeMessage는 단발(첫 응답 후 종료, “ID 던지고 끝”에 적합), connectNative는 Port 유지(진행률 스트리밍).
macOS PATH 함정 — GUI Chrome은 .zshrc를 안 읽는다. 호스트가 독립 프로세스라 사용자 셸 환경을 미상속 → yt-dlp는 절대경로로.