@yorkie-js/react 0.7.9 → 0.7.10-rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5869,7 +5869,7 @@
5869
5869
  DocEventType2[DocEventType2["DOCUMENT_BROADCAST"] = 3] = "DOCUMENT_BROADCAST";
5870
5870
  return DocEventType2;
5871
5871
  })(DocEventType$1 || {});
5872
- const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlImoKFUF0dGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxISCgpzY2hlbWFfa2V5GAMgASgJIp8BChZBdHRhY2hEb2N1bWVudFJlc3BvbnNlEhMKC2RvY3VtZW50X2lkGAEgASgJEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSHQoVbWF4X3NpemVfcGVyX2RvY3VtZW50GAMgASgFEiUKDHNjaGVtYV9ydWxlcxgEIAMoCzIPLnlvcmtpZS52MS5SdWxlIosBChVEZXRhY2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSHgoWcmVtb3ZlX2lmX25vdF9hdHRhY2hlZBgEIAEoCCJEChZEZXRhY2hEb2N1bWVudFJlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siUwoMV2F0Y2hSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRIwCglyZXNvdXJjZXMYAiADKAsyHS55b3JraWUudjEuUmVzb3VyY2VEZXNjcmlwdG9yIoQBChJSZXNvdXJjZURlc2NyaXB0b3ISMQoIZG9jdW1lbnQYASABKAsyHS55b3JraWUudjEuRG9jdW1lbnREZXNjcmlwdG9ySAASLwoHY2hhbm5lbBgCIAEoCzIcLnlvcmtpZS52MS5DaGFubmVsRGVzY3JpcHRvckgAQgoKCHJlc291cmNlIikKEkRvY3VtZW50RGVzY3JpcHRvchITCgtkb2N1bWVudF9pZBgBIAEoCSIoChFDaGFubmVsRGVzY3JpcHRvchITCgtjaGFubmVsX2tleRgBIAEoCSJ5Cg1XYXRjaFJlc3BvbnNlEjgKDmluaXRpYWxpemF0aW9uGAEgASgLMh4ueW9ya2llLnYxLldhdGNoSW5pdGlhbGl6YXRpb25IABImCgVldmVudBgCIAEoCzIVLnlvcmtpZS52MS5XYXRjaEV2ZW50SABCBgoEYm9keSJGChNXYXRjaEluaXRpYWxpemF0aW9uEi8KDnJlc291cmNlX2luaXRzGAEgAygLMhcueW9ya2llLnYxLlJlc291cmNlSW5pdCJ4CgxSZXNvdXJjZUluaXQSMAoNZG9jdW1lbnRfaW5pdBgBIAEoCzIXLnlvcmtpZS52MS5Eb2N1bWVudEluaXRIABIuCgxjaGFubmVsX2luaXQYAiABKAsyFi55b3JraWUudjEuQ2hhbm5lbEluaXRIAEIGCgRpbml0IjcKDERvY3VtZW50SW5pdBITCgtkb2N1bWVudF9pZBgBIAEoCRISCgpjbGllbnRfaWRzGAIgAygJIkYKC0NoYW5uZWxJbml0EhMKC2NoYW5uZWxfa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAMSCwoDc2VxGAMgASgDInsKCldhdGNoRXZlbnQSLQoJZG9jX2V2ZW50GAEgASgLMhgueW9ya2llLnYxLkRvY1dhdGNoRXZlbnRIABI1Cg1jaGFubmVsX2V2ZW50GAIgASgLMhwueW9ya2llLnYxLkNoYW5uZWxXYXRjaEV2ZW50SABCBwoFZXZlbnQiSAoNRG9jV2F0Y2hFdmVudBITCgtkb2N1bWVudF9pZBgBIAEoCRIiCgVldmVudBgCIAEoCzITLnlvcmtpZS52MS5Eb2NFdmVudCJQChFDaGFubmVsV2F0Y2hFdmVudBITCgtjaGFubmVsX2tleRgBIAEoCRImCgVldmVudBgCIAEoCzIXLnlvcmtpZS52MS5DaGFubmVsRXZlbnQiPgoUV2F0Y2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJIrYBChVXYXRjaERvY3VtZW50UmVzcG9uc2USSQoOaW5pdGlhbGl6YXRpb24YASABKAsyLy55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlc3BvbnNlLkluaXRpYWxpemF0aW9uSAASJAoFZXZlbnQYAiABKAsyEy55b3JraWUudjEuRG9jRXZlbnRIABokCg5Jbml0aWFsaXphdGlvbhISCgpjbGllbnRfaWRzGAEgAygJQgYKBGJvZHkiPQoTV2F0Y2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkigwEKFFdhdGNoQ2hhbm5lbFJlc3BvbnNlEjkKC2luaXRpYWxpemVkGAEgASgLMiIueW9ya2llLnYxLldhdGNoQ2hhbm5lbEluaXRpYWxpemVkSAASKAoFZXZlbnQYAiABKAsyFy55b3JraWUudjEuQ2hhbm5lbEV2ZW50SABCBgoEYm9keSI9ChdXYXRjaENoYW5uZWxJbml0aWFsaXplZBIVCg1zZXNzaW9uX2NvdW50GAEgASgDEgsKA3NlcRgCIAEoAyJrChVSZW1vdmVEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siRAoWUmVtb3ZlRG9jdW1lbnRSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgBIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIn8KFlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEQoJcHVzaF9vbmx5GAQgASgIIkUKF1B1c2hQdWxsQ2hhbmdlc1Jlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAEgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siYwoVQ3JlYXRlUmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRINCgVsYWJlbBgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCSJGChZDcmVhdGVSZXZpc2lvblJlc3BvbnNlEiwKCHJldmlzaW9uGAEgASgLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJRChJHZXRSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhMKC3JldmlzaW9uX2lkGAMgASgJIkMKE0dldFJldmlzaW9uUmVzcG9uc2USLAoIcmV2aXNpb24YASABKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5InUKFExpc3RSZXZpc2lvbnNSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIRCglwYWdlX3NpemUYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKCmlzX2ZvcndhcmQYBSABKAgiRgoVTGlzdFJldmlzaW9uc1Jlc3BvbnNlEi0KCXJldmlzaW9ucxgBIAMoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkiVQoWUmVzdG9yZVJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEwoLcmV2aXNpb25faWQYBCABKAkiGQoXUmVzdG9yZVJldmlzaW9uUmVzcG9uc2UiPgoUQXR0YWNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJIkIKFUF0dGFjaENoYW5uZWxSZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAMiUgoURGV0YWNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkiLgoVRGV0YWNoQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMiUwoVUmVmcmVzaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIi8KFlJlZnJlc2hDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAyIpChJQZWVrQ2hhbm5lbFJlcXVlc3QSEwoLY2hhbm5lbF9rZXkYASABKAkiLAoTUGVla0NoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDIloKEEJyb2FkY2FzdFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEg0KBXRvcGljGAMgASgJEg8KB3BheWxvYWQYBCABKAwiEwoRQnJvYWRjYXN0UmVzcG9uc2UylQwKDVlvcmtpZVNlcnZpY2USVwoOQWN0aXZhdGVDbGllbnQSIC55b3JraWUudjEuQWN0aXZhdGVDbGllbnRSZXF1ZXN0GiEueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVzcG9uc2UiABJdChBEZWFjdGl2YXRlQ2xpZW50EiIueW9ya2llLnYxLkRlYWN0aXZhdGVDbGllbnRSZXF1ZXN0GiMueW9ya2llLnYxLkRlYWN0aXZhdGVDbGllbnRSZXNwb25zZSIAElcKDkF0dGFjaERvY3VtZW50EiAueW9ya2llLnYxLkF0dGFjaERvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5BdHRhY2hEb2N1bWVudFJlc3BvbnNlIgASVwoORGV0YWNoRG9jdW1lbnQSIC55b3JraWUudjEuRGV0YWNoRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLkRldGFjaERvY3VtZW50UmVzcG9uc2UiABJXCg5SZW1vdmVEb2N1bWVudBIgLnlvcmtpZS52MS5SZW1vdmVEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuUmVtb3ZlRG9jdW1lbnRSZXNwb25zZSIAEloKD1B1c2hQdWxsQ2hhbmdlcxIhLnlvcmtpZS52MS5QdXNoUHVsbENoYW5nZXNSZXF1ZXN0GiIueW9ya2llLnYxLlB1c2hQdWxsQ2hhbmdlc1Jlc3BvbnNlIgASPgoFV2F0Y2gSFy55b3JraWUudjEuV2F0Y2hSZXF1ZXN0GhgueW9ya2llLnYxLldhdGNoUmVzcG9uc2UiADABElYKDVdhdGNoRG9jdW1lbnQSHy55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlcXVlc3QaIC55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlc3BvbnNlIgAwARJTCgxXYXRjaENoYW5uZWwSHi55b3JraWUudjEuV2F0Y2hDaGFubmVsUmVxdWVzdBofLnlvcmtpZS52MS5XYXRjaENoYW5uZWxSZXNwb25zZSIAMAESVwoOQ3JlYXRlUmV2aXNpb24SIC55b3JraWUudjEuQ3JlYXRlUmV2aXNpb25SZXF1ZXN0GiEueW9ya2llLnYxLkNyZWF0ZVJldmlzaW9uUmVzcG9uc2UiABJOCgtHZXRSZXZpc2lvbhIdLnlvcmtpZS52MS5HZXRSZXZpc2lvblJlcXVlc3QaHi55b3JraWUudjEuR2V0UmV2aXNpb25SZXNwb25zZSIAElQKDUxpc3RSZXZpc2lvbnMSHy55b3JraWUudjEuTGlzdFJldmlzaW9uc1JlcXVlc3QaIC55b3JraWUudjEuTGlzdFJldmlzaW9uc1Jlc3BvbnNlIgASWgoPUmVzdG9yZVJldmlzaW9uEiEueW9ya2llLnYxLlJlc3RvcmVSZXZpc2lvblJlcXVlc3QaIi55b3JraWUudjEuUmVzdG9yZVJldmlzaW9uUmVzcG9uc2UiABJUCg1BdHRhY2hDaGFubmVsEh8ueW9ya2llLnYxLkF0dGFjaENoYW5uZWxSZXF1ZXN0GiAueW9ya2llLnYxLkF0dGFjaENoYW5uZWxSZXNwb25zZSIAElQKDURldGFjaENoYW5uZWwSHy55b3JraWUudjEuRGV0YWNoQ2hhbm5lbFJlcXVlc3QaIC55b3JraWUudjEuRGV0YWNoQ2hhbm5lbFJlc3BvbnNlIgASVwoOUmVmcmVzaENoYW5uZWwSIC55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXF1ZXN0GiEueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVzcG9uc2UiABJOCgtQZWVrQ2hhbm5lbBIdLnlvcmtpZS52MS5QZWVrQ2hhbm5lbFJlcXVlc3QaHi55b3JraWUudjEuUGVla0NoYW5uZWxSZXNwb25zZSIAEkgKCUJyb2FkY2FzdBIbLnlvcmtpZS52MS5Ccm9hZGNhc3RSZXF1ZXN0GhwueW9ya2llLnYxLkJyb2FkY2FzdFJlc3BvbnNlIgBCRQoRZGV2LnlvcmtpZS5hcGkudjFQAVouZ2l0aHViLmNvbS95b3JraWUtdGVhbS95b3JraWUvYXBpL3lvcmtpZS92MTt2MWIGcHJvdG8z", [file_yorkie_v1_resources]);
5872
+ const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlImoKFUF0dGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxISCgpzY2hlbWFfa2V5GAMgASgJIp8BChZBdHRhY2hEb2N1bWVudFJlc3BvbnNlEhMKC2RvY3VtZW50X2lkGAEgASgJEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSHQoVbWF4X3NpemVfcGVyX2RvY3VtZW50GAMgASgFEiUKDHNjaGVtYV9ydWxlcxgEIAMoCzIPLnlvcmtpZS52MS5SdWxlIosBChVEZXRhY2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSHgoWcmVtb3ZlX2lmX25vdF9hdHRhY2hlZBgEIAEoCCJEChZEZXRhY2hEb2N1bWVudFJlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siUwoMV2F0Y2hSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRIwCglyZXNvdXJjZXMYAiADKAsyHS55b3JraWUudjEuUmVzb3VyY2VEZXNjcmlwdG9yIoQBChJSZXNvdXJjZURlc2NyaXB0b3ISMQoIZG9jdW1lbnQYASABKAsyHS55b3JraWUudjEuRG9jdW1lbnREZXNjcmlwdG9ySAASLwoHY2hhbm5lbBgCIAEoCzIcLnlvcmtpZS52MS5DaGFubmVsRGVzY3JpcHRvckgAQgoKCHJlc291cmNlIikKEkRvY3VtZW50RGVzY3JpcHRvchITCgtkb2N1bWVudF9pZBgBIAEoCSIoChFDaGFubmVsRGVzY3JpcHRvchITCgtjaGFubmVsX2tleRgBIAEoCSJ5Cg1XYXRjaFJlc3BvbnNlEjgKDmluaXRpYWxpemF0aW9uGAEgASgLMh4ueW9ya2llLnYxLldhdGNoSW5pdGlhbGl6YXRpb25IABImCgVldmVudBgCIAEoCzIVLnlvcmtpZS52MS5XYXRjaEV2ZW50SABCBgoEYm9keSJGChNXYXRjaEluaXRpYWxpemF0aW9uEi8KDnJlc291cmNlX2luaXRzGAEgAygLMhcueW9ya2llLnYxLlJlc291cmNlSW5pdCJ4CgxSZXNvdXJjZUluaXQSMAoNZG9jdW1lbnRfaW5pdBgBIAEoCzIXLnlvcmtpZS52MS5Eb2N1bWVudEluaXRIABIuCgxjaGFubmVsX2luaXQYAiABKAsyFi55b3JraWUudjEuQ2hhbm5lbEluaXRIAEIGCgRpbml0IjcKDERvY3VtZW50SW5pdBITCgtkb2N1bWVudF9pZBgBIAEoCRISCgpjbGllbnRfaWRzGAIgAygJIkYKC0NoYW5uZWxJbml0EhMKC2NoYW5uZWxfa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAMSCwoDc2VxGAMgASgDInsKCldhdGNoRXZlbnQSLQoJZG9jX2V2ZW50GAEgASgLMhgueW9ya2llLnYxLkRvY1dhdGNoRXZlbnRIABI1Cg1jaGFubmVsX2V2ZW50GAIgASgLMhwueW9ya2llLnYxLkNoYW5uZWxXYXRjaEV2ZW50SABCBwoFZXZlbnQiSAoNRG9jV2F0Y2hFdmVudBITCgtkb2N1bWVudF9pZBgBIAEoCRIiCgVldmVudBgCIAEoCzITLnlvcmtpZS52MS5Eb2NFdmVudCJQChFDaGFubmVsV2F0Y2hFdmVudBITCgtjaGFubmVsX2tleRgBIAEoCRImCgVldmVudBgCIAEoCzIXLnlvcmtpZS52MS5DaGFubmVsRXZlbnQiPgoUV2F0Y2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJIrYBChVXYXRjaERvY3VtZW50UmVzcG9uc2USSQoOaW5pdGlhbGl6YXRpb24YASABKAsyLy55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlc3BvbnNlLkluaXRpYWxpemF0aW9uSAASJAoFZXZlbnQYAiABKAsyEy55b3JraWUudjEuRG9jRXZlbnRIABokCg5Jbml0aWFsaXphdGlvbhISCgpjbGllbnRfaWRzGAEgAygJQgYKBGJvZHkiPQoTV2F0Y2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkigwEKFFdhdGNoQ2hhbm5lbFJlc3BvbnNlEjkKC2luaXRpYWxpemVkGAEgASgLMiIueW9ya2llLnYxLldhdGNoQ2hhbm5lbEluaXRpYWxpemVkSAASKAoFZXZlbnQYAiABKAsyFy55b3JraWUudjEuQ2hhbm5lbEV2ZW50SABCBgoEYm9keSI9ChdXYXRjaENoYW5uZWxJbml0aWFsaXplZBIVCg1zZXNzaW9uX2NvdW50GAEgASgDEgsKA3NlcRgCIAEoAyJrChVSZW1vdmVEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siRAoWUmVtb3ZlRG9jdW1lbnRSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgBIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIn8KFlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEQoJcHVzaF9vbmx5GAQgASgIIkUKF1B1c2hQdWxsQ2hhbmdlc1Jlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAEgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siYwoVQ3JlYXRlUmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRINCgVsYWJlbBgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCSJGChZDcmVhdGVSZXZpc2lvblJlc3BvbnNlEiwKCHJldmlzaW9uGAEgASgLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJRChJHZXRSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhMKC3JldmlzaW9uX2lkGAMgASgJIkMKE0dldFJldmlzaW9uUmVzcG9uc2USLAoIcmV2aXNpb24YASABKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5InUKFExpc3RSZXZpc2lvbnNSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIRCglwYWdlX3NpemUYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKCmlzX2ZvcndhcmQYBSABKAgiRgoVTGlzdFJldmlzaW9uc1Jlc3BvbnNlEi0KCXJldmlzaW9ucxgBIAMoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkiVQoWUmVzdG9yZVJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEwoLcmV2aXNpb25faWQYBCABKAkiGQoXUmVzdG9yZVJldmlzaW9uUmVzcG9uc2UiPgoUQXR0YWNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJIkIKFUF0dGFjaENoYW5uZWxSZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAMiUgoURGV0YWNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkiLgoVRGV0YWNoQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMi2gEKFVJlZnJlc2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCRISCgpjbGllbnRfa2V5GAQgASgJEkAKCG1ldGFkYXRhGAUgAygLMi4ueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJWChZSZWZyZXNoQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMSEQoJY2xpZW50X2lkGAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkiKQoSUGVla0NoYW5uZWxSZXF1ZXN0EhMKC2NoYW5uZWxfa2V5GAEgASgJIiwKE1BlZWtDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAyJaChBCcm9hZGNhc3RSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRINCgV0b3BpYxgDIAEoCRIPCgdwYXlsb2FkGAQgASgMIhMKEUJyb2FkY2FzdFJlc3BvbnNlMpUMCg1Zb3JraWVTZXJ2aWNlElcKDkFjdGl2YXRlQ2xpZW50EiAueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdBohLnlvcmtpZS52MS5BY3RpdmF0ZUNsaWVudFJlc3BvbnNlIgASXQoQRGVhY3RpdmF0ZUNsaWVudBIiLnlvcmtpZS52MS5EZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBojLnlvcmtpZS52MS5EZWFjdGl2YXRlQ2xpZW50UmVzcG9uc2UiABJXCg5BdHRhY2hEb2N1bWVudBIgLnlvcmtpZS52MS5BdHRhY2hEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuQXR0YWNoRG9jdW1lbnRSZXNwb25zZSIAElcKDkRldGFjaERvY3VtZW50EiAueW9ya2llLnYxLkRldGFjaERvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5EZXRhY2hEb2N1bWVudFJlc3BvbnNlIgASVwoOUmVtb3ZlRG9jdW1lbnQSIC55b3JraWUudjEuUmVtb3ZlRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLlJlbW92ZURvY3VtZW50UmVzcG9uc2UiABJaCg9QdXNoUHVsbENoYW5nZXMSIS55b3JraWUudjEuUHVzaFB1bGxDaGFuZ2VzUmVxdWVzdBoiLnlvcmtpZS52MS5QdXNoUHVsbENoYW5nZXNSZXNwb25zZSIAEj4KBVdhdGNoEhcueW9ya2llLnYxLldhdGNoUmVxdWVzdBoYLnlvcmtpZS52MS5XYXRjaFJlc3BvbnNlIgAwARJWCg1XYXRjaERvY3VtZW50Eh8ueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXF1ZXN0GiAueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXNwb25zZSIAMAESUwoMV2F0Y2hDaGFubmVsEh4ueW9ya2llLnYxLldhdGNoQ2hhbm5lbFJlcXVlc3QaHy55b3JraWUudjEuV2F0Y2hDaGFubmVsUmVzcG9uc2UiADABElcKDkNyZWF0ZVJldmlzaW9uEiAueW9ya2llLnYxLkNyZWF0ZVJldmlzaW9uUmVxdWVzdBohLnlvcmtpZS52MS5DcmVhdGVSZXZpc2lvblJlc3BvbnNlIgASTgoLR2V0UmV2aXNpb24SHS55b3JraWUudjEuR2V0UmV2aXNpb25SZXF1ZXN0Gh4ueW9ya2llLnYxLkdldFJldmlzaW9uUmVzcG9uc2UiABJUCg1MaXN0UmV2aXNpb25zEh8ueW9ya2llLnYxLkxpc3RSZXZpc2lvbnNSZXF1ZXN0GiAueW9ya2llLnYxLkxpc3RSZXZpc2lvbnNSZXNwb25zZSIAEloKD1Jlc3RvcmVSZXZpc2lvbhIhLnlvcmtpZS52MS5SZXN0b3JlUmV2aXNpb25SZXF1ZXN0GiIueW9ya2llLnYxLlJlc3RvcmVSZXZpc2lvblJlc3BvbnNlIgASVAoNQXR0YWNoQ2hhbm5lbBIfLnlvcmtpZS52MS5BdHRhY2hDaGFubmVsUmVxdWVzdBogLnlvcmtpZS52MS5BdHRhY2hDaGFubmVsUmVzcG9uc2UiABJUCg1EZXRhY2hDaGFubmVsEh8ueW9ya2llLnYxLkRldGFjaENoYW5uZWxSZXF1ZXN0GiAueW9ya2llLnYxLkRldGFjaENoYW5uZWxSZXNwb25zZSIAElcKDlJlZnJlc2hDaGFubmVsEiAueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVxdWVzdBohLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlc3BvbnNlIgASTgoLUGVla0NoYW5uZWwSHS55b3JraWUudjEuUGVla0NoYW5uZWxSZXF1ZXN0Gh4ueW9ya2llLnYxLlBlZWtDaGFubmVsUmVzcG9uc2UiABJICglCcm9hZGNhc3QSGy55b3JraWUudjEuQnJvYWRjYXN0UmVxdWVzdBocLnlvcmtpZS52MS5Ccm9hZGNhc3RSZXNwb25zZSIAQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_yorkie_v1_resources]);
5873
5873
  const YorkieService = /* @__PURE__ */ serviceDesc(file_yorkie_v1_yorkie, 0);
5874
5874
  const file_google_rpc_error_details = /* @__PURE__ */ fileDesc("Ch5nb29nbGUvcnBjL2Vycm9yX2RldGFpbHMucHJvdG8SCmdvb2dsZS5ycGMikwEKCUVycm9ySW5mbxIOCgZyZWFzb24YASABKAkSDgoGZG9tYWluGAIgASgJEjUKCG1ldGFkYXRhGAMgAygLMiMuZ29vZ2xlLnJwYy5FcnJvckluZm8uTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiOwoJUmV0cnlJbmZvEi4KC3JldHJ5X2RlbGF5GAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIjIKCURlYnVnSW5mbxIVCg1zdGFja19lbnRyaWVzGAEgAygJEg4KBmRldGFpbBgCIAEoCSKPAwoMUXVvdGFGYWlsdXJlEjYKCnZpb2xhdGlvbnMYASADKAsyIi5nb29nbGUucnBjLlF1b3RhRmFpbHVyZS5WaW9sYXRpb24axgIKCVZpb2xhdGlvbhIPCgdzdWJqZWN0GAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhMKC2FwaV9zZXJ2aWNlGAMgASgJEhQKDHF1b3RhX21ldHJpYxgEIAEoCRIQCghxdW90YV9pZBgFIAEoCRJRChBxdW90YV9kaW1lbnNpb25zGAYgAygLMjcuZ29vZ2xlLnJwYy5RdW90YUZhaWx1cmUuVmlvbGF0aW9uLlF1b3RhRGltZW5zaW9uc0VudHJ5EhMKC3F1b3RhX3ZhbHVlGAcgASgDEh8KEmZ1dHVyZV9xdW90YV92YWx1ZRgIIAEoA0gAiAEBGjYKFFF1b3RhRGltZW5zaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCFQoTX2Z1dHVyZV9xdW90YV92YWx1ZSKVAQoTUHJlY29uZGl0aW9uRmFpbHVyZRI9Cgp2aW9sYXRpb25zGAEgAygLMikuZ29vZ2xlLnJwYy5QcmVjb25kaXRpb25GYWlsdXJlLlZpb2xhdGlvbho/CglWaW9sYXRpb24SDAoEdHlwZRgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJIswBCgpCYWRSZXF1ZXN0Ej8KEGZpZWxkX3Zpb2xhdGlvbnMYASADKAsyJS5nb29nbGUucnBjLkJhZFJlcXVlc3QuRmllbGRWaW9sYXRpb24afQoORmllbGRWaW9sYXRpb24SDQoFZmllbGQYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSDgoGcmVhc29uGAMgASgJEjcKEWxvY2FsaXplZF9tZXNzYWdlGAQgASgLMhwuZ29vZ2xlLnJwYy5Mb2NhbGl6ZWRNZXNzYWdlIjcKC1JlcXVlc3RJbmZvEhIKCnJlcXVlc3RfaWQYASABKAkSFAoMc2VydmluZ19kYXRhGAIgASgJImAKDFJlc291cmNlSW5mbxIVCg1yZXNvdXJjZV90eXBlGAEgASgJEhUKDXJlc291cmNlX25hbWUYAiABKAkSDQoFb3duZXIYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiVgoESGVscBIkCgVsaW5rcxgBIAMoCzIVLmdvb2dsZS5ycGMuSGVscC5MaW5rGigKBExpbmsSEwoLZGVzY3JpcHRpb24YASABKAkSCwoDdXJsGAIgASgJIjMKEExvY2FsaXplZE1lc3NhZ2USDgoGbG9jYWxlGAEgASgJEg8KB21lc3NhZ2UYAiABKAlCbAoOY29tLmdvb2dsZS5ycGNCEUVycm9yRGV0YWlsc1Byb3RvUAFaP2dvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvcnBjL2VycmRldGFpbHM7ZXJyZGV0YWlsc6ICA1JQQ2IGcHJvdG8z", [file_google_protobuf_duration]);
5875
5875
  const ErrorInfoSchema = /* @__PURE__ */ messageDesc(file_google_rpc_error_details, 0);
@@ -5882,6 +5882,7 @@
5882
5882
  Code2["ErrDummy"] = "ErrDummy";
5883
5883
  Code2["ErrNotAttached"] = "ErrNotAttached";
5884
5884
  Code2["ErrNotDetached"] = "ErrNotDetached";
5885
+ Code2["ErrSessionNotFound"] = "ErrSessionNotFound";
5885
5886
  Code2["ErrDocumentRemoved"] = "ErrDocumentRemoved";
5886
5887
  Code2["ErrDocumentSizeExceedsLimit"] = "ErrDocumentSizeExceedsLimit";
5887
5888
  Code2["ErrDocumentSchemaValidationFailed"] = "ErrDocumentSchemaValidationFailed";
@@ -20780,12 +20781,25 @@
20780
20781
  }
20781
20782
  class Attachment {
20782
20783
  resource;
20784
+ /**
20785
+ * For Documents: the document's resourceID, available at attach time.
20786
+ * For Channels: the server-issued session_id. Starts empty and is
20787
+ * populated after the first `RefreshChannel` first-call response.
20788
+ */
20783
20789
  resourceID;
20784
20790
  syncMode;
20785
20791
  changeEventReceived;
20786
20792
  lastHeartbeatTime;
20787
20793
  pollInterval;
20788
20794
  pollIntervalPinned;
20795
+ /**
20796
+ * `unsubscribeLocalBroadcast` is set by `attachChannel` when it forwards
20797
+ * a Channel's `local-broadcast` events to the RPC client, and consumed
20798
+ * by `detachInternal` so the subscription does not survive a detach.
20799
+ * Without this, re-attaching a channel accumulates duplicate handlers
20800
+ * on each attach cycle.
20801
+ */
20802
+ unsubscribeLocalBroadcast;
20789
20803
  reconnectStreamDelay;
20790
20804
  cancelled;
20791
20805
  watchStream;
@@ -20793,13 +20807,13 @@
20793
20807
  watchAbortController;
20794
20808
  syncPromise;
20795
20809
  _detaching = false;
20796
- constructor(reconnectStreamDelay, resource, resourceID, syncMode, pollInterval = 0, pollIntervalPinned = false) {
20810
+ constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false) {
20797
20811
  this.reconnectStreamDelay = reconnectStreamDelay;
20798
20812
  this.resource = resource;
20799
20813
  this.resourceID = resourceID;
20800
20814
  this.syncMode = syncMode;
20801
20815
  this.changeEventReceived = syncMode !== void 0 ? false : void 0;
20802
- this.lastHeartbeatTime = Date.now();
20816
+ this.lastHeartbeatTime = 0;
20803
20817
  this.pollInterval = pollInterval;
20804
20818
  this.pollIntervalPinned = pollIntervalPinned;
20805
20819
  this.cancelled = false;
@@ -20961,7 +20975,7 @@
20961
20975
  };
20962
20976
  }
20963
20977
  const name$1 = "@yorkie-js/sdk";
20964
- const version$1 = "0.7.9";
20978
+ const version$1 = "0.7.10-rc2";
20965
20979
  const pkg$1 = {
20966
20980
  name: name$1,
20967
20981
  version: version$1
@@ -20999,6 +21013,7 @@
20999
21013
  ChannelEventType2["Broadcast"] = "broadcast";
21000
21014
  ChannelEventType2["LocalBroadcast"] = "local-broadcast";
21001
21015
  ChannelEventType2["AuthError"] = "auth-error";
21016
+ ChannelEventType2["SyncError"] = "sync-error";
21002
21017
  return ChannelEventType2;
21003
21018
  })(ChannelEventType || {});
21004
21019
  const KeyPathSeparator = ".";
@@ -21138,6 +21153,13 @@
21138
21153
  }
21139
21154
  });
21140
21155
  }
21156
+ if (typeOrTopic === "sync-error") {
21157
+ return this.eventStream.subscribe((event) => {
21158
+ if (event.type === "sync-error") {
21159
+ callback(event);
21160
+ }
21161
+ });
21162
+ }
21141
21163
  if (typeOrTopic === "presence") {
21142
21164
  return this.eventStream.subscribe((event) => {
21143
21165
  if (event.type === "presence-changed" || event.type === "initialized") {
@@ -21247,13 +21269,14 @@
21247
21269
  SyncMode2["Polling"] = "polling";
21248
21270
  return SyncMode2;
21249
21271
  })(SyncMode || {});
21250
- const DefaultPollingIntervalMs = 3e3;
21272
+ const DefaultDocumentPollIntervalMs = 3e3;
21273
+ const DefaultChannelHeartbeatMs = 5e3;
21251
21274
  const DefaultClientOptions = {
21252
21275
  rpcAddr: "https://api.yorkie.dev",
21253
21276
  syncLoopDuration: 50,
21254
21277
  retrySyncLoopDelay: 1e3,
21255
21278
  reconnectStreamDelay: 1e3,
21256
- channelHeartbeatInterval: 3e4
21279
+ channelHeartbeatInterval: DefaultChannelHeartbeatMs
21257
21280
  };
21258
21281
  const DefaultBroadcastOptions = {
21259
21282
  maxRetries: Infinity,
@@ -21312,10 +21335,43 @@
21312
21335
  baseUrl: rpcAddr,
21313
21336
  interceptors: [authInterceptor, createMetricInterceptor(opts?.userAgent)],
21314
21337
  fetch: (input, init) => {
21338
+ const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
21339
+ if (/\/yorkie\.v1\.YorkieService\/Watch/.test(url)) {
21340
+ return fetch(input, {
21341
+ ...init,
21342
+ keepalive: this.keepalive
21343
+ });
21344
+ }
21345
+ const callerSignal = init?.signal ?? (input instanceof Request ? input.signal : void 0);
21346
+ const innerAC = new AbortController();
21347
+ let onCallerAbort;
21348
+ if (callerSignal) {
21349
+ if (callerSignal.aborted) {
21350
+ innerAC.abort(callerSignal.reason);
21351
+ } else {
21352
+ onCallerAbort = () => innerAC.abort(callerSignal.reason);
21353
+ callerSignal.addEventListener("abort", onCallerAbort);
21354
+ }
21355
+ }
21356
+ const detach = () => {
21357
+ if (callerSignal && onCallerAbort) {
21358
+ callerSignal.removeEventListener("abort", onCallerAbort);
21359
+ }
21360
+ };
21315
21361
  return fetch(input, {
21316
21362
  ...init,
21363
+ signal: innerAC.signal,
21317
21364
  keepalive: this.keepalive
21318
- });
21365
+ }).then(
21366
+ (res) => {
21367
+ detach();
21368
+ return res;
21369
+ },
21370
+ (err) => {
21371
+ detach();
21372
+ throw err;
21373
+ }
21374
+ );
21319
21375
  }
21320
21376
  };
21321
21377
  this.rpcClient = createClient(
@@ -21450,7 +21506,7 @@
21450
21506
  );
21451
21507
  }
21452
21508
  const pollIntervalPinned = opts.documentPollInterval !== void 0;
21453
- const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21509
+ const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21454
21510
  return this.enqueueTask(async () => {
21455
21511
  try {
21456
21512
  const res = await this.rpcClient.attachDocument(
@@ -21579,127 +21635,88 @@
21579
21635
  return this.enqueueTask(task);
21580
21636
  }
21581
21637
  /**
21582
- * `attach` attaches the given channel to this client.
21583
- * It tells the server that this client will track the channel.
21638
+ * `attachChannel` attaches the given channel to this client. The channel is
21639
+ * registered locally and the server is notified on the next RefreshChannel
21640
+ * heartbeat.
21584
21641
  */
21585
21642
  async attachChannel(channel, opts = {}) {
21586
- if (!this.isActive()) {
21587
- throw new YorkieError(
21588
- Code.ErrClientNotActivated,
21589
- `${this.key} is not active`
21590
- );
21591
- }
21592
21643
  if (channel.getStatus() !== ChannelStatus.Detached) {
21593
21644
  throw new YorkieError(
21594
21645
  Code.ErrNotDetached,
21595
21646
  `${channel.getKey()} is not detached`
21596
21647
  );
21597
21648
  }
21598
- channel.setActor(this.id);
21649
+ const syncMode = opts.syncMode ?? "realtime";
21650
+ this.assertValidChannelSyncMode(syncMode);
21651
+ if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
21652
+ throw new YorkieError(
21653
+ Code.ErrInvalidArgument,
21654
+ "channelHeartbeatInterval must be greater than 0"
21655
+ );
21656
+ }
21657
+ const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
21658
+ const pollInterval = opts.channelHeartbeatInterval ?? this.channelHeartbeatInterval;
21599
21659
  const task = async () => {
21600
- try {
21601
- const res = await this.rpcClient.attachChannel(
21602
- {
21603
- clientId: this.id,
21604
- channelKey: channel.getKey()
21605
- },
21606
- {
21607
- headers: {
21608
- "x-shard-key": `${this.apiKey}/${channel.getFirstKeyPath()}`
21609
- }
21610
- }
21611
- );
21612
- channel.setSessionID(res.sessionId);
21613
- channel.updateSessionCount(Number(res.sessionCount), 0);
21614
- channel.applyStatus(ChannelStatus.Attached);
21615
- const syncMode = opts.syncMode ?? "realtime";
21616
- this.assertValidChannelSyncMode(syncMode);
21617
- if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
21618
- throw new YorkieError(
21619
- Code.ErrInvalidArgument,
21620
- "channelHeartbeatInterval must be greater than 0"
21621
- );
21622
- }
21623
- const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
21624
- const pollInterval = pollIntervalPinned ? opts.channelHeartbeatInterval : syncMode === "polling" ? DefaultPollingIntervalMs : this.channelHeartbeatInterval;
21625
- const attachment = new Attachment(
21626
- this.reconnectStreamDelay,
21627
- channel,
21628
- res.sessionId,
21629
- syncMode,
21630
- pollInterval,
21631
- pollIntervalPinned
21632
- );
21633
- channel.subscribe("local-broadcast", (event) => {
21660
+ if (this.id) {
21661
+ channel.setActor(this.id);
21662
+ }
21663
+ const attachment = new Attachment(
21664
+ this.reconnectStreamDelay,
21665
+ channel,
21666
+ "",
21667
+ // sessionID populated on first refresh response
21668
+ syncMode,
21669
+ pollInterval,
21670
+ pollIntervalPinned
21671
+ );
21672
+ attachment.unsubscribeLocalBroadcast = channel.subscribe(
21673
+ "local-broadcast",
21674
+ (event) => {
21634
21675
  const { topic, payload, options } = event;
21635
21676
  this.broadcast(channel.getKey(), topic, payload, options).catch(
21636
21677
  (error) => {
21637
- if (options?.error) {
21638
- options.error(error);
21639
- }
21678
+ if (options?.error) options.error(error);
21640
21679
  logger.error(`[BC] c:"${this.getKey()}" failed: ${error}`);
21641
21680
  }
21642
21681
  );
21643
- });
21644
- this.attachmentMap.set(channel.getKey(), attachment);
21645
- if (syncMode === "realtime") {
21646
- await this.runWatchLoop(channel.getKey());
21647
21682
  }
21648
- logger.info(
21649
- `[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode} count:${channel.getSessionCount()}`
21650
- );
21651
- return channel;
21652
- } catch (err) {
21653
- logger.error(`[AP] c:"${this.getKey()}" err :`, err);
21654
- await this.handleConnectError(err);
21655
- throw err;
21683
+ );
21684
+ this.attachmentMap.set(channel.getKey(), attachment);
21685
+ if (!this.conditions[
21686
+ "SyncLoop"
21687
+ /* SyncLoop */
21688
+ ]) {
21689
+ this.runSyncLoop();
21656
21690
  }
21691
+ logger.info(
21692
+ `[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode}`
21693
+ );
21694
+ return channel;
21657
21695
  };
21658
21696
  return this.enqueueTask(task);
21659
21697
  }
21660
21698
  /**
21661
- * `detachChannel` detaches the given channel from this client.
21662
- * It tells the server that this client will no longer track the channel.
21699
+ * `detachChannel` detaches the given channel from this client. The detach
21700
+ * is a local cleanup; the server reclaims the session via TTL when
21701
+ * heartbeats stop.
21663
21702
  */
21664
21703
  async detachChannel(channel) {
21665
- if (!this.isActive()) {
21666
- throw new YorkieError(
21667
- Code.ErrClientNotActivated,
21668
- `${this.key} is not active`
21669
- );
21670
- }
21671
- if (!this.attachmentMap.has(channel.getKey())) {
21704
+ const attachment = this.attachmentMap.get(channel.getKey());
21705
+ if (!attachment) {
21672
21706
  throw new YorkieError(
21673
21707
  Code.ErrNotAttached,
21674
21708
  `${channel.getKey()} is not attached`
21675
21709
  );
21676
21710
  }
21711
+ attachment.markDetaching();
21712
+ await attachment.waitForSyncComplete();
21677
21713
  const task = async () => {
21678
- try {
21679
- const res = await this.rpcClient.detachChannel(
21680
- {
21681
- clientId: this.id,
21682
- channelKey: channel.getKey(),
21683
- sessionId: channel.getSessionID()
21684
- },
21685
- {
21686
- headers: {
21687
- "x-shard-key": `${this.apiKey}/${channel.getFirstKeyPath()}`
21688
- }
21689
- }
21690
- );
21691
- channel.updateSessionCount(Number(res.sessionCount), 0);
21692
- channel.applyStatus(ChannelStatus.Detached);
21693
- this.detachInternal(channel.getKey());
21694
- logger.info(
21695
- `[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" count:${channel.getSessionCount()}`
21696
- );
21697
- return channel;
21698
- } catch (err) {
21699
- logger.error(`[DP] c:"${this.getKey()}" err :`, err);
21700
- await this.handleConnectError(err);
21701
- throw err;
21702
- }
21714
+ channel.applyStatus(ChannelStatus.Detached);
21715
+ this.detachInternal(channel.getKey());
21716
+ logger.info(
21717
+ `[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" (local)`
21718
+ );
21719
+ return channel;
21703
21720
  };
21704
21721
  return this.enqueueTask(task);
21705
21722
  }
@@ -21740,7 +21757,7 @@
21740
21757
  attachment.changeEventReceived = true;
21741
21758
  }
21742
21759
  if (!attachment.pollIntervalPinned) {
21743
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21760
+ attachment.pollInterval = syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21744
21761
  }
21745
21762
  if ((prevSyncMode === "manual" || prevSyncMode === "polling") && syncMode !== "manual" && syncMode !== "polling") {
21746
21763
  attachment.resetCancelled();
@@ -21761,12 +21778,6 @@
21761
21778
  }
21762
21779
  }
21763
21780
  async changeChannelSyncMode(channel, syncMode) {
21764
- if (!this.isActive()) {
21765
- throw new YorkieError(
21766
- Code.ErrClientNotActivated,
21767
- `${this.key} is not active`
21768
- );
21769
- }
21770
21781
  const attachment = this.attachmentMap.get(channel.getKey());
21771
21782
  if (!attachment) {
21772
21783
  throw new YorkieError(
@@ -21784,7 +21795,7 @@
21784
21795
  }
21785
21796
  attachment.changeSyncMode(syncMode);
21786
21797
  if (!attachment.pollIntervalPinned) {
21787
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : syncMode === "realtime" ? this.channelHeartbeatInterval : 0;
21798
+ attachment.pollInterval = syncMode === "manual" ? 0 : this.channelHeartbeatInterval;
21788
21799
  }
21789
21800
  if (syncMode === "realtime") {
21790
21801
  attachment.resetCancelled();
@@ -21796,7 +21807,7 @@
21796
21807
  * `sync` implementation that handles both Document and Channel.
21797
21808
  */
21798
21809
  sync(resource) {
21799
- if (!this.isActive()) {
21810
+ if (!(resource instanceof Channel) && !this.isActive()) {
21800
21811
  throw new YorkieError(
21801
21812
  Code.ErrClientNotActivated,
21802
21813
  `${this.key} is not active`
@@ -22123,12 +22134,6 @@
22123
22134
  * subscribe to channel events. Polling is the caller's responsibility.
22124
22135
  */
22125
22136
  async peekChannel(channelKey) {
22126
- if (!this.isActive()) {
22127
- throw new YorkieError(
22128
- Code.ErrClientNotActivated,
22129
- `${this.key} is not active`
22130
- );
22131
- }
22132
22137
  return this.enqueueTask(async () => {
22133
22138
  const firstKeyPath = channelKey.split(".")[0];
22134
22139
  const res = await this.rpcClient.peekChannel(
@@ -22146,12 +22151,6 @@
22146
22151
  * `broadcast` broadcasts the given payload to the given topic.
22147
22152
  */
22148
22153
  async broadcast(key, topic, payload, options) {
22149
- if (!this.isActive()) {
22150
- throw new YorkieError(
22151
- Code.ErrClientNotActivated,
22152
- `${this.key} is not active`
22153
- );
22154
- }
22155
22154
  const attachment = this.attachmentMap.get(key);
22156
22155
  if (!attachment) {
22157
22156
  throw new YorkieError(Code.ErrNotAttached, `${key} is not attached`);
@@ -22228,8 +22227,16 @@
22228
22227
  */
22229
22228
  runSyncLoop() {
22230
22229
  const doLoop = async () => {
22231
- if (!this.isActive() || this.deactivating) {
22232
- logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
22230
+ if (this.deactivating) {
22231
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (deactivating)`);
22232
+ this.conditions[
22233
+ "SyncLoop"
22234
+ /* SyncLoop */
22235
+ ] = false;
22236
+ return;
22237
+ }
22238
+ if (!this.isActive() && this.attachmentMap.size === 0) {
22239
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (idle)`);
22233
22240
  this.conditions[
22234
22241
  "SyncLoop"
22235
22242
  /* SyncLoop */
@@ -22615,6 +22622,10 @@
22615
22622
  return;
22616
22623
  }
22617
22624
  attachment.cancelWatchStream();
22625
+ if (attachment.unsubscribeLocalBroadcast) {
22626
+ attachment.unsubscribeLocalBroadcast();
22627
+ attachment.unsubscribeLocalBroadcast = void 0;
22628
+ }
22618
22629
  if (attachment.resource instanceof Document) {
22619
22630
  attachment.resource.resetOnlineClients();
22620
22631
  }
@@ -22623,12 +22634,17 @@
22623
22634
  async syncInternal(attachment, syncMode) {
22624
22635
  const { resource } = attachment;
22625
22636
  if (resource instanceof Channel) {
22637
+ const isFirstCall = !resource.getSessionID();
22626
22638
  try {
22627
22639
  const res = await this.rpcClient.refreshChannel(
22628
22640
  {
22629
- clientId: this.id,
22641
+ clientId: this.id ?? "",
22630
22642
  channelKey: resource.getKey(),
22631
- sessionId: resource.getSessionID()
22643
+ sessionId: resource.getSessionID() ?? "",
22644
+ // First-call only — these fields are ignored by the server
22645
+ // once a session_id is established.
22646
+ clientKey: isFirstCall ? this.key : "",
22647
+ metadata: isFirstCall ? this.metadata : {}
22632
22648
  },
22633
22649
  {
22634
22650
  headers: {
@@ -22636,6 +22652,31 @@
22636
22652
  }
22637
22653
  }
22638
22654
  );
22655
+ if (isFirstCall) {
22656
+ if (this.deactivating || attachment.isDetaching()) {
22657
+ return resource;
22658
+ }
22659
+ if (res.clientId && !this.id) {
22660
+ this.id = res.clientId;
22661
+ this.status = "activated";
22662
+ resource.setActor(res.clientId);
22663
+ } else if (this.id) {
22664
+ resource.setActor(this.id);
22665
+ }
22666
+ if (res.sessionId) {
22667
+ resource.setSessionID(res.sessionId);
22668
+ attachment.resourceID = res.sessionId;
22669
+ resource.applyStatus(ChannelStatus.Attached);
22670
+ }
22671
+ if (attachment.syncMode === "realtime") {
22672
+ this.runWatchLoop(resource.getKey()).catch((err) => {
22673
+ logger.error(
22674
+ `[WP] c:"${this.getKey()}" failed to start watch for p:"${resource.getKey()}":`,
22675
+ err
22676
+ );
22677
+ });
22678
+ }
22679
+ }
22639
22680
  const prevCount = resource.getSessionCount();
22640
22681
  if (resource.updateSessionCount(Number(res.sessionCount), 0)) {
22641
22682
  if (resource.getSessionCount() !== prevCount) {
@@ -22650,6 +22691,21 @@
22650
22691
  `[RP] c:"${this.getKey()}" refreshes p:"${resource.getKey()}" mode:${attachment.syncMode}`
22651
22692
  );
22652
22693
  } catch (err) {
22694
+ if (isErrorCode(err, Code.ErrSessionNotFound)) {
22695
+ logger.info(
22696
+ `[RP] c:"${this.getKey()}" session expired for p:"${resource.getKey()}", re-attaching`
22697
+ );
22698
+ resource.setSessionID("");
22699
+ attachment.resourceID = "";
22700
+ return resource;
22701
+ }
22702
+ if (!this.deactivating && !attachment.isDetaching()) {
22703
+ resource.publish({
22704
+ type: ChannelEventType.SyncError,
22705
+ error: err,
22706
+ method: "RefreshChannel"
22707
+ });
22708
+ }
22653
22709
  logger.error(`[RP] c:"${this.getKey()}" err :`, err);
22654
22710
  throw err;
22655
22711
  }
@@ -23000,7 +23056,7 @@
23000
23056
  };
23001
23057
  }
23002
23058
  const name = "@yorkie-js/react";
23003
- const version = "0.7.9";
23059
+ const version = "0.7.10-rc2";
23004
23060
  const pkg = {
23005
23061
  name,
23006
23062
  version
@@ -23010,7 +23066,7 @@
23010
23066
  loading: true,
23011
23067
  error: void 0
23012
23068
  });
23013
- function useYorkieClient(opts) {
23069
+ function useYorkieClient(opts, activate = true) {
23014
23070
  const [client, setClient] = react.useState(void 0);
23015
23071
  const [loading, setLoading] = react.useState(true);
23016
23072
  const [error, setError] = react.useState(void 0);
@@ -23027,7 +23083,9 @@
23027
23083
  }
23028
23084
  try {
23029
23085
  const newClient = new Client(opts);
23030
- await newClient.activate();
23086
+ if (activate) {
23087
+ await newClient.activate();
23088
+ }
23031
23089
  setClient(newClient);
23032
23090
  } catch (e) {
23033
23091
  setError(
@@ -23039,24 +23097,21 @@
23039
23097
  }
23040
23098
  activateClient();
23041
23099
  return () => {
23042
- if (client?.isActive()) {
23100
+ if (activate && client?.isActive()) {
23043
23101
  client.deactivate({ keepalive: true });
23044
23102
  }
23045
23103
  };
23046
- }, [opts.apiKey, opts.rpcAddr, didMount]);
23104
+ }, [opts.apiKey, opts.rpcAddr, didMount, activate]);
23047
23105
  return { client, loading, error };
23048
23106
  }
23049
- const YorkieProvider = ({
23050
- children,
23051
- ...opts
23052
- }) => {
23107
+ const YorkieProvider = ({ children, activate = true, ...opts }) => {
23053
23108
  const clientOpts = react.useMemo(() => {
23054
23109
  return {
23055
23110
  userAgent: pkg.name + "/" + pkg.version,
23056
23111
  ...opts
23057
23112
  };
23058
23113
  }, [opts.apiKey, opts.rpcAddr]);
23059
- const { client, loading, error } = useYorkieClient(clientOpts);
23114
+ const { client, loading, error } = useYorkieClient(clientOpts, activate);
23060
23115
  return /* @__PURE__ */ jsxRuntime.jsx(YorkieContext.Provider, { value: { client, loading, error }, children });
23061
23116
  };
23062
23117
  const useYorkie = () => {
@@ -23492,7 +23547,7 @@
23492
23547
  }
23493
23548
  let unsubscribe;
23494
23549
  async function attachChannel() {
23495
- if (!client || !client.isActive()) {
23550
+ if (!client) {
23496
23551
  return;
23497
23552
  }
23498
23553
  channelStore.setState((state) => ({
@@ -23502,20 +23557,49 @@
23502
23557
  }));
23503
23558
  try {
23504
23559
  const newChannel = new Channel(channelKey);
23505
- await client.attach(newChannel, { syncMode, channelHeartbeatInterval });
23560
+ await client.attach(newChannel, {
23561
+ syncMode,
23562
+ channelHeartbeatInterval
23563
+ });
23506
23564
  channelRef.current = newChannel;
23507
- unsubscribe = newChannel.subscribe(() => {
23565
+ unsubscribe = newChannel.subscribe((event) => {
23566
+ if (event.type === ChannelEventType.SyncError || event.type === ChannelEventType.AuthError) {
23567
+ const nextError = event.type === ChannelEventType.SyncError ? event.error instanceof Error ? event.error : new Error(String(event.error)) : new Error(
23568
+ `auth error during ${event.method}: ${event.reason}`
23569
+ );
23570
+ channelStore.setState((state) => ({
23571
+ ...state,
23572
+ loading: false,
23573
+ error: nextError
23574
+ }));
23575
+ return;
23576
+ }
23577
+ const recovers = event.type === ChannelEventType.PresenceChanged || event.type === ChannelEventType.Initialized || event.type === ChannelEventType.Broadcast;
23578
+ const ready = newChannel.isAttached() && !!newChannel.getSessionID();
23508
23579
  channelStore.setState((state) => ({
23509
23580
  ...state,
23510
- sessionCount: newChannel.getSessionCount()
23581
+ sessionCount: newChannel.getSessionCount(),
23582
+ ...recovers && state.error ? { error: void 0 } : {},
23583
+ ...ready && state.loading ? { loading: false } : {}
23511
23584
  }));
23512
23585
  });
23513
- channelStore.setState({
23586
+ const detach = async () => {
23587
+ if (!client) return;
23588
+ try {
23589
+ await client.detach(newChannel);
23590
+ } catch (err) {
23591
+ if (err instanceof Error && /not attached/i.test(err.message)) {
23592
+ return;
23593
+ }
23594
+ throw err;
23595
+ }
23596
+ };
23597
+ channelStore.setState((state) => ({
23598
+ ...state,
23514
23599
  channel: newChannel,
23515
- sessionCount: newChannel.getSessionCount(),
23516
- loading: false,
23517
- error: void 0
23518
- });
23600
+ error: void 0,
23601
+ detach
23602
+ }));
23519
23603
  } catch (e) {
23520
23604
  channelStore.setState((state) => ({
23521
23605
  ...state,
@@ -23530,10 +23614,13 @@
23530
23614
  unsubscribe();
23531
23615
  }
23532
23616
  async function detachChannel() {
23533
- if (channelRef.current && client?.isActive()) {
23617
+ if (channelRef.current && client) {
23534
23618
  try {
23535
23619
  await client.detach(channelRef.current);
23536
23620
  } catch (e) {
23621
+ if (e instanceof Error && /not attached/i.test(e.message)) {
23622
+ return;
23623
+ }
23537
23624
  console.error("Failed to detach channel:", e);
23538
23625
  }
23539
23626
  }
@@ -23566,7 +23653,11 @@
23566
23653
  channel: void 0,
23567
23654
  sessionCount: 0,
23568
23655
  loading: true,
23569
- error: void 0
23656
+ error: void 0,
23657
+ // Placeholder until `useYorkieChannel` wires up the real detach.
23658
+ // Pre-attach calls are a no-op rather than a throw.
23659
+ detach: async () => {
23660
+ }
23570
23661
  });
23571
23662
  }
23572
23663
  const channelStore = channelStoreRef.current;
@@ -23594,7 +23685,8 @@
23594
23685
  const sessionCount = useSelector(channelStore, (state) => state.sessionCount);
23595
23686
  const loading = useSelector(channelStore, (state) => state.loading);
23596
23687
  const error = useSelector(channelStore, (state) => state.error);
23597
- return { sessionCount, loading, error };
23688
+ const detach = useSelector(channelStore, (state) => state.detach);
23689
+ return { sessionCount, loading, error, detach };
23598
23690
  };
23599
23691
  const useChannelSessionCount = () => {
23600
23692
  const channelStore = useChannelStore("useChannelSessionCount");
@@ -23616,7 +23708,7 @@
23616
23708
  };
23617
23709
  }, []);
23618
23710
  const peekOnce = react.useCallback(async () => {
23619
- if (!client || !client.isActive()) return;
23711
+ if (!client) return;
23620
23712
  if (mountedRef.current) setLoading(true);
23621
23713
  try {
23622
23714
  const count = await client.peekChannel(channelKeyRef.current);
@@ -23645,7 +23737,7 @@
23645
23737
  let cancelled = false;
23646
23738
  let timer;
23647
23739
  const run = async () => {
23648
- if (cancelled || !client.isActive()) return;
23740
+ if (cancelled) return;
23649
23741
  try {
23650
23742
  const count = await client.peekChannel(channelKey);
23651
23743
  if (cancelled) return;