OxideTerm 노드 세션 소유권
변경 사항이 원격 세션이나 백그라운드 작업을 생성, 공유, 종료, 재연결 또는 관찰하는 구성 요소를 변경할 수 있을 때 이 스킬을 사용하세요.
핵심 불변 조건
연결된 SSH 노드는 이를 소비하는 모든 터미널 패널과 독립적입니다. UI 수명이 백엔드 수명으로 암묵적으로 이어져서는 안 됩니다.
flowchart TD
W["워크스페이스 또는 애플리케이션 수명"] --> R["NodeRouter 및 연결 레지스트리"]
R --> N["물리적 SSH 노드 연결"]
N --> T["터미널 소비자"]
N --> S["SFTP 소비자"]
N --> F["포워딩 소비자"]
R --> H["상태 확인 및 재연결 작업"]
필수 규칙
- 노드 활성 상태는 연결 레지스트리,
NodeRouter또는 명시적 노드 연결 해제 작업에 속합니다. - 터미널 패널을 닫으면 해당 터미널 소비자는 제거됩니다. 공유 노드를 연결 해제해서는 안 됩니다.
- SFTP는 실제 노드 기반 SFTP 세션을 획득해야 합니다. 파일 전송을 흉내내는 셸 명령어는 문서화된 호환성 대체 수단으로만 허용됩니다.
- 포트 포워딩은 자체 리스너 및 브리지 작업을 소유합니다. 이러한 작업은 열려 있는 터미널 패널 없이도 활성 상태를 유지해야 하며, 포워딩 규칙이나 소유 노드가 중지되면 중지되어야 합니다.
- 재연결, 상태 확인, 유예 기간 및 자식 프로세스 브리지에는 노드, 워크스페이스 또는 애플리케이션 수명에 연결된 명시적 소유자와 취소 경로가 필요합니다.
- 장기 실행 작업은 명령 핸들러가 반환될 때 드롭되는 일회성 런타임에서 실행되어서는 안 됩니다.
- 점프 호스트를 통해 연결된 자식 노드는 자식 전송이 필요로 하는 동안 부모 연결을 유지해야 합니다.
- UI 구성 요소는 라우터 또는 레지스트리 이벤트를 통해 런타임 상태를 관찰합니다. 터미널 존재 여부에서 노드 활성 상태를 유추해서는 안 됩니다.
- 소유권 이전(생성, 공유, 무효화, 재획득, 취소 및 UI 해체 후 의도적인 생존) 시 간결한 영어 주석을 추가하세요.
금지된 우회 방법
- 노드 기반 API가 불편하다고 해서 관리되지 않는 두 번째 SSH 전송을 열지 마세요.
- 호스트와 연결된 첫 번째 터미널 패널을 선택하여 연결을 찾지 마세요.
- 장기 실행 작업을 임시 대화 상자, 명령 핸들러 또는 터미널 뷰에만 저장하지 마세요.
- 하나의 채널, 패널, SFTP 요청 또는 포워딩 소비자가 닫혔다고 해서 노드가 연결 해제된 것으로 표시하지 마세요.
- 생성된 자식 프로세스 또는 Tokio 작업을 종료 신호 및 제한된 완료 경로 없이 분리된 상태로 두지 마세요.
권장 사례
- 우연한
Arc유지에 의존하는 대신 각 백엔드 종속성을 레지스트리에서 소비자 또는 소유자로 표현하세요. - 물리적 전송 상태는 연결 항목에, 논리적 토폴로지는
NodeRouter에 유지하세요. - 연결 해제 캐스케이드가 호스트 문자열 일치가 아닌 기록된 부모-자식 연결 ID를 따르도록 하세요.
- 작업 핸들 또는 취소 발신자를 작업 수명을 정의하는 객체에 유지하세요.
- 터미널 상태를 폴링하는 것보다 이벤트 기반 UI 업데이트를 선호하세요.
호환성 경로
호환성 대체 수단은 명시적이고 제한적이며 정확하게 보고되는 경우에만 허용됩니다. 네이티브 SFTP, 포워딩 또는 노드 세션 구현으로 설명되어서는 안 됩니다. 임시 대체 수단의 경우에도 소유자와 정리 경로를 기록하세요.
예제
올바르지 않음:
// 패널을 닫으면 실수로 공유 노드의 유일한 소유자가 사라집니다.
struct TerminalPane {
ssh_transport: SshTransport,
}
올바른 형태:
// 패널은 소비자 등록만 소유합니다. 레지스트리가 전송 활성 상태를 소유합니다.
struct TerminalPane {
connection_id: String,
terminal_consumer: ConnectionConsumer,
}
올바르지 않음:
tokio::runtime::Runtime::new()?.spawn(run_forward_listener());
// 명령이 반환되면 런타임이 드롭됩니다.
올바른 형태:
// 포워딩 소유자는 취소 핸들과 완료 핸들을 모두 유지합니다.
struct ForwardingJob {
shutdown_tx: Option<oneshot::Sender<()>>,
worker: JoinHandle<()>,
}
검토 체크리스트
- 물리적 연결 소유자를 식별하세요.
- 모든 터미널, SFTP, 포워딩, 재연결, 상태 확인 및 자식 노드 소비자를 나열하세요.
- 하나의 소비자를 닫아도 관련 없는 소비자가 닫히지 않는지 확인하세요.
- 명시적 노드 연결 해제가 종속 작업 및 자식 전송을 중지하는지 확인하세요.
- 생성된 모든 작업 또는 프로세스에 대해 유지된 소유자, 취소 신호 및 정리 경로를 검사하세요.
- UI 상태가 터미널에서 파생된 활성 상태가 아닌 노드 이벤트를 소비하는지 확인하세요.
- 남아 있는 모든 호환성 대체 수단을 정확히 명시하세요.
검증
- 마지막 터미널을 닫고 노드가 다른 등록된 소비자에 의해 계속 사용 가능한지 증명하세요.
- 터미널 패널 없이 SFTP를 여세요.
- 로컬, 원격 및 동적 포워딩을 시작하고 리스너가 패널 종료 후에도 살아남는지 확인하세요.
- 부모 노드를 연결 해제하고 종속 자식 노드 및 작업이 일관되게 전환되는지 확인하세요.
- 유예 기간 내에 재연결하고 관련 없는 UI 상태가 손실되지 않는지 확인하세요.
- 명시적 연결 해제 및 애플리케이션 종료 후 작업/프로세스 정리가 완료되는지 확인하세요.