본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

와이어 하나, 표면 둘

~12 min · wire, appkit, daemon, ios, shared-types

Level 0불씨
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

맥 앱도 클라이언트야

폰이 생기면 맥 앱을 진짜 주인으로, 폰을 덧붙인 특수한 경우로 치고 싶어져. 그 갈라짐은 붙인 공장을 다시 만들어. 데스크톱 타입이 대화로 새고, 폰이 몰래 맥인 프로그램이 되고, AppKit 을 가져오는 타입은 여행하지 못해. Smolder 의 대답은 와이어 하나야. 공유 와이어 타입은 AppKit 없이, 로컬 프로세스 검사 없이, 로컬 파일시스템 가정 없이 컴파일돼. 맥 앱은 폰이 붙을 그 데몬의 클라이언트로 그 와이어 위에 붙어. 표면 둘. 대화 하나. 둘 뒤의 주인 하나.

"AppKit 없이"는 미학이 아니야. NSView 를 이름 붙인 타입은 iOS 에서 빌드가 안 돼. "이 판의 로컬 PID 가 뭐야"라고 묻는 타입은 판 PID 가 없는 폰에서 못 돌아. /Users/... 가 여기라고 가정하는 타입은 폰이 보기만 하는 호스트의 폴더를 못 말해. 그 가정들은 공유 모듈이 #if os 옷을 입은 맥 모듈이 되는 길이야. 옷은 폰이 채울 수 없는 필드가 필요한 날에 항상 찢어져.

와이어가 해도 되는 말

세션 정체성, 판 정체성, 저널 덩어리, 조종 행위로서의 리사이즈, 리스 잡힌 행위로서의 입력, 실행의 영수증. 데몬이 아는 것. 픽셀은 아니야. NSFont 도 아니야. 맥의 열기 패널로 들어가는 북마크도 아니야. 각 표면의 에뮬레이터가 같은 핀으로 바이트를 글리프로 바꿔. 와이어는 스크린샷을 실어 나르지 않아. 와이어 위에 스크린샷이 있으면, 에뮬레이터를 포기하고 원격 데스크톱을 시작한 거야. 그건 리사이즈가 틀리고 복사가 틀리고 구경꾼이랑 치는 사람을 구분을 못 해.

나중 트랙의 게이트웨이는 승인된 기기와 한도 있는 WebSocket 으로 말해. 입은 다르고 언어는 같아. 게이트웨이가 있기 전에 언어가 AppKit 없어야 해. 아니면 게이트웨이가 데스크톱 타입을 "폰 안전한" 그림자로 번역하기 시작하고, 번역은 두 번째 프로토콜이야. 프로토콜 하나. 입 둘 (맥 앱의 루프백 부착, 폰의 게이트웨이). 건너는 타입 위에 AppKit 은 영.

로컬 검사는 로컬에 남아

맥 위의 데몬은 자기 프로세스를 검사할 수 있어. 그 검사는 여행하지 않아. 제목을 보여야 하는 폰은 데몬이 이미 쥔 제목을 와이어에 묻지, 실행할 수 없는 sysctl 을 묻지 않아. 크롬을 그려야 하는 맥 창은 AppKit 에 묻고, 데몬이 알아야 하는 사실만 보내 (포커스된 판, 조종하는 표면이 요청한 크기). 그 층을 섞으면 구경꾼의 리사이즈가 "그냥 창 콜백"으로 새어 들어와.

이 레슨은 셸은 호스트에 남나의 타입 층 버전이야. 와이어가 iOS 에서 컴파일 못 하면 폰은 표면이 아니야. 모델을 공유하는 척하는 원격 조종 스크립트야. 컴파일러를 정직하게 두면 소유도 정직하게 남아.

공유 와이어 타입은 AppKit 없이 컴파일돼. 맥 앱은 같은 데몬의 클라이언트야. 로컬 프로세스 검사와 로컬 파일시스템 가정은 와이어 밖에 남아. 아니면 폰이 몰래 맥인 프로그램이 돼.

Code

여행할 수 있는 와이어 타입, 가면 안 되는 맥 타입·swift
// Shared wire — must compile for the daemon, the gateway, and iOS.
struct WirePane: Sendable, Codable {
    var id: PaneID
    var title: String
    var cols: Int
    var rows: Int
    var focused: Bool
}

struct WireChunk: Sendable, Codable {
    var pane: PaneID
    var bytes: Data          // journal / live output, not pixels
}

// Illegal on the wire
// import AppKit
// var view: NSView
// var localPID: pid_t
// var bookmark: URL        // assumes this device's filesystem

// Mac app (client, like iOS)
//   attaches, draws with SwiftTerm, sends leased input
// Daemon (owner)
//   may inspect local processes; that inspection does not travel

External links

Exercise

폰이 원할 사실 다섯을 적어 (판 제목, 글리프 픽셀, 로컬 PID, 호스트의 폴더 경로, 지금 저널 덩어리). 각각을 와이어에 둘지 밖에 둘지. 밖 항목마다, 그래도 와이어에 넣으면 하게 될 거짓말 한 문장.
Hint
픽셀이랑 PID 는 쉬운 거절이야. 폴더 경로는 데몬이 이미 아는 호스트 이름 문자열로서만 합법이지, 폰의 파일 앱 북마크가 맥인 척하는 게 아니야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.