Skip to content

Editing 세션의 관찰·오류 복구·History 귀속·구독 수명을 보완한다 #719

Description

@developer-1px

Goal Anchor

  • Outcome: Host가 구독 순서나 별도 방어 코드에 의존하지 않고 EditingSession과 Collaboration History를 안전하게 조합할 수 있게 합니다.
  • Done: 리뷰에서 재현한 알림 누락, 선택 보정 예외 후 외부 변경을 덮어쓰는 undo, 협업 undo의 타 작업 변경 오귀속, 오래된 unsubscribe의 새 구독 제거를 정본 구현에서 수정하고 회귀 테스트·공개 계약·실제 소비자 검증을 갖춘 PR을 엽니다.
  • Don't: Core의 six-member API와 collaboration wire, 정상 편집·선택·로컬/선택적 history 의미를 바꾸지 않습니다. Host 우회 구현, 제품 UI 재설계, 무관한 정리, Database saved-view와 편집 표현 책임을 정본화한다 #587·refactor(annotation): 선택·gesture·출력의 정본 경계 통합 #589 작업, npm 배포는 포함하지 않습니다. 기존 사용자 파일을 보존하며 merge는 별도 승인 대상으로 둡니다.

승인과 근거

사용자는 위 4건의 리뷰와 “이 4건의 회귀 테스트와 정본 구현·계약 보완” 제안 뒤 “응 진행해”라고 실행을 승인했습니다. 기준 main은 08de2da6f45dd42714c89046b95e18963763a62f입니다.

  1. 먼저 등록된 document 구독자가 session.snapshot을 읽으면 상태·revision은 바뀌지만 Editing 구독자 알림이 누락됩니다. Core와 Collaboration 문서 모두 재현했습니다.
  2. 로컬 n: 0 → 1, 외부 1 → 2에서 reconcileSelection 예외를 주입하면 관측값만 갱신되고 local inverse history가 남습니다. 뒤따르는 undo가 외부 값 20으로 덮어씁니다. 관찰 중이면 document의 observer 격리가 예외를 삼킵니다.
  3. 문서 값이 바뀌지 않는 인과적 undo 도중 replica 구독자가 /other = 99를 기록하면 undo 결과의 change와 snapshot이 그 별도 쓰기를 자기 작업으로 흡수합니다. 세션이 첫 document 알림을 자기 변경이라고 추정합니다.
  4. 같은 콜백으로 구독 → 해제 → 재구독 → 이전 해제 함수 재호출을 하면 새 구독까지 제거됩니다. Core의 해제 함수는 재호출을 방어하지만 Editing은 방어하지 않습니다.

완료 조건

  1. 다른 구독자의 snapshot 읽기 순서가 Editing 알림을 누락시키지 않으며 재진입 알림의 revision 순서와 자기 작업 결과를 보존합니다.
  2. 선택 mapping/reconciliation 실패가 부분 상태나 안전하지 않은 local undo를 남기지 않습니다. 실패 후 읽기·편집·undo/redo 및 복구 의미를 정본 계약으로 설명하고 관찰/비관찰 경로에서 검증합니다.
  3. 협업 undo/redo 결과는 자기 작업의 변경만 나타내며, 값이 바뀌지 않는 history 작업과 재진입 외부 쓰기를 구분합니다. 필요한 계약 보완은 기존 Editing/Collaboration owner와 공개 연결부에 둡니다.
  4. 구독 해제는 반복 호출해도 새 구독을 끊지 않으며 마지막 observer 해제, 재구독, editor 재생성의 정상 수명을 보존합니다.
  5. 관련 package 회귀, React 소비자, typecheck/build, 문서/API reference 및 기존 Usage/Source 연결을 검증합니다. 기존의 잘못된 patch·test·validator 거절 원자성과 선택적 undo의 원격 변경 보존도 유지합니다.

범위

주요 owner는 packages/json-document-editing의 session/history와 packages/json-document-collaboration의 history/runtime 공개 연결부입니다. 소비 검증은 기존 React 연결 및 협업 Rich Text Usage를 사용합니다. 수정 책임을 Demo나 Host로 이동하지 않습니다. 전체 저장소의 별도 Host 우회 감사나 새로운 기능은 이 이슈의 완료 조건이 아닙니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions