@yorkie-js/react 0.7.9 → 0.7.10-rc

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-rc";
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,
@@ -21450,7 +21473,7 @@
21450
21473
  );
21451
21474
  }
21452
21475
  const pollIntervalPinned = opts.documentPollInterval !== void 0;
21453
- const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21476
+ const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21454
21477
  return this.enqueueTask(async () => {
21455
21478
  try {
21456
21479
  const res = await this.rpcClient.attachDocument(
@@ -21579,127 +21602,88 @@
21579
21602
  return this.enqueueTask(task);
21580
21603
  }
21581
21604
  /**
21582
- * `attach` attaches the given channel to this client.
21583
- * It tells the server that this client will track the channel.
21605
+ * `attachChannel` attaches the given channel to this client. The channel is
21606
+ * registered locally and the server is notified on the next RefreshChannel
21607
+ * heartbeat.
21584
21608
  */
21585
21609
  async attachChannel(channel, opts = {}) {
21586
- if (!this.isActive()) {
21587
- throw new YorkieError(
21588
- Code.ErrClientNotActivated,
21589
- `${this.key} is not active`
21590
- );
21591
- }
21592
21610
  if (channel.getStatus() !== ChannelStatus.Detached) {
21593
21611
  throw new YorkieError(
21594
21612
  Code.ErrNotDetached,
21595
21613
  `${channel.getKey()} is not detached`
21596
21614
  );
21597
21615
  }
21598
- channel.setActor(this.id);
21616
+ const syncMode = opts.syncMode ?? "realtime";
21617
+ this.assertValidChannelSyncMode(syncMode);
21618
+ if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
21619
+ throw new YorkieError(
21620
+ Code.ErrInvalidArgument,
21621
+ "channelHeartbeatInterval must be greater than 0"
21622
+ );
21623
+ }
21624
+ const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
21625
+ const pollInterval = opts.channelHeartbeatInterval ?? this.channelHeartbeatInterval;
21599
21626
  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) => {
21627
+ if (this.id) {
21628
+ channel.setActor(this.id);
21629
+ }
21630
+ const attachment = new Attachment(
21631
+ this.reconnectStreamDelay,
21632
+ channel,
21633
+ "",
21634
+ // sessionID populated on first refresh response
21635
+ syncMode,
21636
+ pollInterval,
21637
+ pollIntervalPinned
21638
+ );
21639
+ attachment.unsubscribeLocalBroadcast = channel.subscribe(
21640
+ "local-broadcast",
21641
+ (event) => {
21634
21642
  const { topic, payload, options } = event;
21635
21643
  this.broadcast(channel.getKey(), topic, payload, options).catch(
21636
21644
  (error) => {
21637
- if (options?.error) {
21638
- options.error(error);
21639
- }
21645
+ if (options?.error) options.error(error);
21640
21646
  logger.error(`[BC] c:"${this.getKey()}" failed: ${error}`);
21641
21647
  }
21642
21648
  );
21643
- });
21644
- this.attachmentMap.set(channel.getKey(), attachment);
21645
- if (syncMode === "realtime") {
21646
- await this.runWatchLoop(channel.getKey());
21647
21649
  }
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;
21650
+ );
21651
+ this.attachmentMap.set(channel.getKey(), attachment);
21652
+ if (!this.conditions[
21653
+ "SyncLoop"
21654
+ /* SyncLoop */
21655
+ ]) {
21656
+ this.runSyncLoop();
21656
21657
  }
21658
+ logger.info(
21659
+ `[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode}`
21660
+ );
21661
+ return channel;
21657
21662
  };
21658
21663
  return this.enqueueTask(task);
21659
21664
  }
21660
21665
  /**
21661
- * `detachChannel` detaches the given channel from this client.
21662
- * It tells the server that this client will no longer track the channel.
21666
+ * `detachChannel` detaches the given channel from this client. The detach
21667
+ * is a local cleanup; the server reclaims the session via TTL when
21668
+ * heartbeats stop.
21663
21669
  */
21664
21670
  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())) {
21671
+ const attachment = this.attachmentMap.get(channel.getKey());
21672
+ if (!attachment) {
21672
21673
  throw new YorkieError(
21673
21674
  Code.ErrNotAttached,
21674
21675
  `${channel.getKey()} is not attached`
21675
21676
  );
21676
21677
  }
21678
+ attachment.markDetaching();
21679
+ await attachment.waitForSyncComplete();
21677
21680
  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
- }
21681
+ channel.applyStatus(ChannelStatus.Detached);
21682
+ this.detachInternal(channel.getKey());
21683
+ logger.info(
21684
+ `[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" (local)`
21685
+ );
21686
+ return channel;
21703
21687
  };
21704
21688
  return this.enqueueTask(task);
21705
21689
  }
@@ -21740,7 +21724,7 @@
21740
21724
  attachment.changeEventReceived = true;
21741
21725
  }
21742
21726
  if (!attachment.pollIntervalPinned) {
21743
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21727
+ attachment.pollInterval = syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21744
21728
  }
21745
21729
  if ((prevSyncMode === "manual" || prevSyncMode === "polling") && syncMode !== "manual" && syncMode !== "polling") {
21746
21730
  attachment.resetCancelled();
@@ -21761,12 +21745,6 @@
21761
21745
  }
21762
21746
  }
21763
21747
  async changeChannelSyncMode(channel, syncMode) {
21764
- if (!this.isActive()) {
21765
- throw new YorkieError(
21766
- Code.ErrClientNotActivated,
21767
- `${this.key} is not active`
21768
- );
21769
- }
21770
21748
  const attachment = this.attachmentMap.get(channel.getKey());
21771
21749
  if (!attachment) {
21772
21750
  throw new YorkieError(
@@ -21784,7 +21762,7 @@
21784
21762
  }
21785
21763
  attachment.changeSyncMode(syncMode);
21786
21764
  if (!attachment.pollIntervalPinned) {
21787
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : syncMode === "realtime" ? this.channelHeartbeatInterval : 0;
21765
+ attachment.pollInterval = syncMode === "manual" ? 0 : this.channelHeartbeatInterval;
21788
21766
  }
21789
21767
  if (syncMode === "realtime") {
21790
21768
  attachment.resetCancelled();
@@ -21796,7 +21774,7 @@
21796
21774
  * `sync` implementation that handles both Document and Channel.
21797
21775
  */
21798
21776
  sync(resource) {
21799
- if (!this.isActive()) {
21777
+ if (!(resource instanceof Channel) && !this.isActive()) {
21800
21778
  throw new YorkieError(
21801
21779
  Code.ErrClientNotActivated,
21802
21780
  `${this.key} is not active`
@@ -22123,12 +22101,6 @@
22123
22101
  * subscribe to channel events. Polling is the caller's responsibility.
22124
22102
  */
22125
22103
  async peekChannel(channelKey) {
22126
- if (!this.isActive()) {
22127
- throw new YorkieError(
22128
- Code.ErrClientNotActivated,
22129
- `${this.key} is not active`
22130
- );
22131
- }
22132
22104
  return this.enqueueTask(async () => {
22133
22105
  const firstKeyPath = channelKey.split(".")[0];
22134
22106
  const res = await this.rpcClient.peekChannel(
@@ -22146,12 +22118,6 @@
22146
22118
  * `broadcast` broadcasts the given payload to the given topic.
22147
22119
  */
22148
22120
  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
22121
  const attachment = this.attachmentMap.get(key);
22156
22122
  if (!attachment) {
22157
22123
  throw new YorkieError(Code.ErrNotAttached, `${key} is not attached`);
@@ -22228,8 +22194,16 @@
22228
22194
  */
22229
22195
  runSyncLoop() {
22230
22196
  const doLoop = async () => {
22231
- if (!this.isActive() || this.deactivating) {
22232
- logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
22197
+ if (this.deactivating) {
22198
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (deactivating)`);
22199
+ this.conditions[
22200
+ "SyncLoop"
22201
+ /* SyncLoop */
22202
+ ] = false;
22203
+ return;
22204
+ }
22205
+ if (!this.isActive() && this.attachmentMap.size === 0) {
22206
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (idle)`);
22233
22207
  this.conditions[
22234
22208
  "SyncLoop"
22235
22209
  /* SyncLoop */
@@ -22615,6 +22589,10 @@
22615
22589
  return;
22616
22590
  }
22617
22591
  attachment.cancelWatchStream();
22592
+ if (attachment.unsubscribeLocalBroadcast) {
22593
+ attachment.unsubscribeLocalBroadcast();
22594
+ attachment.unsubscribeLocalBroadcast = void 0;
22595
+ }
22618
22596
  if (attachment.resource instanceof Document) {
22619
22597
  attachment.resource.resetOnlineClients();
22620
22598
  }
@@ -22623,12 +22601,17 @@
22623
22601
  async syncInternal(attachment, syncMode) {
22624
22602
  const { resource } = attachment;
22625
22603
  if (resource instanceof Channel) {
22604
+ const isFirstCall = !resource.getSessionID();
22626
22605
  try {
22627
22606
  const res = await this.rpcClient.refreshChannel(
22628
22607
  {
22629
- clientId: this.id,
22608
+ clientId: this.id ?? "",
22630
22609
  channelKey: resource.getKey(),
22631
- sessionId: resource.getSessionID()
22610
+ sessionId: resource.getSessionID() ?? "",
22611
+ // First-call only — these fields are ignored by the server
22612
+ // once a session_id is established.
22613
+ clientKey: isFirstCall ? this.key : "",
22614
+ metadata: isFirstCall ? this.metadata : {}
22632
22615
  },
22633
22616
  {
22634
22617
  headers: {
@@ -22636,6 +22619,31 @@
22636
22619
  }
22637
22620
  }
22638
22621
  );
22622
+ if (isFirstCall) {
22623
+ if (this.deactivating || attachment.isDetaching()) {
22624
+ return resource;
22625
+ }
22626
+ if (res.clientId && !this.id) {
22627
+ this.id = res.clientId;
22628
+ this.status = "activated";
22629
+ resource.setActor(res.clientId);
22630
+ } else if (this.id) {
22631
+ resource.setActor(this.id);
22632
+ }
22633
+ if (res.sessionId) {
22634
+ resource.setSessionID(res.sessionId);
22635
+ attachment.resourceID = res.sessionId;
22636
+ resource.applyStatus(ChannelStatus.Attached);
22637
+ }
22638
+ if (attachment.syncMode === "realtime") {
22639
+ this.runWatchLoop(resource.getKey()).catch((err) => {
22640
+ logger.error(
22641
+ `[WP] c:"${this.getKey()}" failed to start watch for p:"${resource.getKey()}":`,
22642
+ err
22643
+ );
22644
+ });
22645
+ }
22646
+ }
22639
22647
  const prevCount = resource.getSessionCount();
22640
22648
  if (resource.updateSessionCount(Number(res.sessionCount), 0)) {
22641
22649
  if (resource.getSessionCount() !== prevCount) {
@@ -22650,6 +22658,21 @@
22650
22658
  `[RP] c:"${this.getKey()}" refreshes p:"${resource.getKey()}" mode:${attachment.syncMode}`
22651
22659
  );
22652
22660
  } catch (err) {
22661
+ if (isErrorCode(err, Code.ErrSessionNotFound)) {
22662
+ logger.info(
22663
+ `[RP] c:"${this.getKey()}" session expired for p:"${resource.getKey()}", re-attaching`
22664
+ );
22665
+ resource.setSessionID("");
22666
+ attachment.resourceID = "";
22667
+ return resource;
22668
+ }
22669
+ if (!this.deactivating && !attachment.isDetaching()) {
22670
+ resource.publish({
22671
+ type: ChannelEventType.SyncError,
22672
+ error: err,
22673
+ method: "RefreshChannel"
22674
+ });
22675
+ }
22653
22676
  logger.error(`[RP] c:"${this.getKey()}" err :`, err);
22654
22677
  throw err;
22655
22678
  }
@@ -23000,7 +23023,7 @@
23000
23023
  };
23001
23024
  }
23002
23025
  const name = "@yorkie-js/react";
23003
- const version = "0.7.9";
23026
+ const version = "0.7.10-rc";
23004
23027
  const pkg = {
23005
23028
  name,
23006
23029
  version
@@ -23010,7 +23033,7 @@
23010
23033
  loading: true,
23011
23034
  error: void 0
23012
23035
  });
23013
- function useYorkieClient(opts) {
23036
+ function useYorkieClient(opts, activate = true) {
23014
23037
  const [client, setClient] = react.useState(void 0);
23015
23038
  const [loading, setLoading] = react.useState(true);
23016
23039
  const [error, setError] = react.useState(void 0);
@@ -23027,7 +23050,9 @@
23027
23050
  }
23028
23051
  try {
23029
23052
  const newClient = new Client(opts);
23030
- await newClient.activate();
23053
+ if (activate) {
23054
+ await newClient.activate();
23055
+ }
23031
23056
  setClient(newClient);
23032
23057
  } catch (e) {
23033
23058
  setError(
@@ -23039,24 +23064,21 @@
23039
23064
  }
23040
23065
  activateClient();
23041
23066
  return () => {
23042
- if (client?.isActive()) {
23067
+ if (activate && client?.isActive()) {
23043
23068
  client.deactivate({ keepalive: true });
23044
23069
  }
23045
23070
  };
23046
- }, [opts.apiKey, opts.rpcAddr, didMount]);
23071
+ }, [opts.apiKey, opts.rpcAddr, didMount, activate]);
23047
23072
  return { client, loading, error };
23048
23073
  }
23049
- const YorkieProvider = ({
23050
- children,
23051
- ...opts
23052
- }) => {
23074
+ const YorkieProvider = ({ children, activate = true, ...opts }) => {
23053
23075
  const clientOpts = react.useMemo(() => {
23054
23076
  return {
23055
23077
  userAgent: pkg.name + "/" + pkg.version,
23056
23078
  ...opts
23057
23079
  };
23058
23080
  }, [opts.apiKey, opts.rpcAddr]);
23059
- const { client, loading, error } = useYorkieClient(clientOpts);
23081
+ const { client, loading, error } = useYorkieClient(clientOpts, activate);
23060
23082
  return /* @__PURE__ */ jsxRuntime.jsx(YorkieContext.Provider, { value: { client, loading, error }, children });
23061
23083
  };
23062
23084
  const useYorkie = () => {
@@ -23492,7 +23514,7 @@
23492
23514
  }
23493
23515
  let unsubscribe;
23494
23516
  async function attachChannel() {
23495
- if (!client || !client.isActive()) {
23517
+ if (!client) {
23496
23518
  return;
23497
23519
  }
23498
23520
  channelStore.setState((state) => ({
@@ -23502,20 +23524,49 @@
23502
23524
  }));
23503
23525
  try {
23504
23526
  const newChannel = new Channel(channelKey);
23505
- await client.attach(newChannel, { syncMode, channelHeartbeatInterval });
23527
+ await client.attach(newChannel, {
23528
+ syncMode,
23529
+ channelHeartbeatInterval
23530
+ });
23506
23531
  channelRef.current = newChannel;
23507
- unsubscribe = newChannel.subscribe(() => {
23532
+ unsubscribe = newChannel.subscribe((event) => {
23533
+ if (event.type === ChannelEventType.SyncError || event.type === ChannelEventType.AuthError) {
23534
+ const nextError = event.type === ChannelEventType.SyncError ? event.error instanceof Error ? event.error : new Error(String(event.error)) : new Error(
23535
+ `auth error during ${event.method}: ${event.reason}`
23536
+ );
23537
+ channelStore.setState((state) => ({
23538
+ ...state,
23539
+ loading: false,
23540
+ error: nextError
23541
+ }));
23542
+ return;
23543
+ }
23544
+ const recovers = event.type === ChannelEventType.PresenceChanged || event.type === ChannelEventType.Initialized || event.type === ChannelEventType.Broadcast;
23545
+ const ready = newChannel.isAttached() && !!newChannel.getSessionID();
23508
23546
  channelStore.setState((state) => ({
23509
23547
  ...state,
23510
- sessionCount: newChannel.getSessionCount()
23548
+ sessionCount: newChannel.getSessionCount(),
23549
+ ...recovers && state.error ? { error: void 0 } : {},
23550
+ ...ready && state.loading ? { loading: false } : {}
23511
23551
  }));
23512
23552
  });
23513
- channelStore.setState({
23553
+ const detach = async () => {
23554
+ if (!client) return;
23555
+ try {
23556
+ await client.detach(newChannel);
23557
+ } catch (err) {
23558
+ if (err instanceof Error && /not attached/i.test(err.message)) {
23559
+ return;
23560
+ }
23561
+ throw err;
23562
+ }
23563
+ };
23564
+ channelStore.setState((state) => ({
23565
+ ...state,
23514
23566
  channel: newChannel,
23515
- sessionCount: newChannel.getSessionCount(),
23516
- loading: false,
23517
- error: void 0
23518
- });
23567
+ error: void 0,
23568
+ detach
23569
+ }));
23519
23570
  } catch (e) {
23520
23571
  channelStore.setState((state) => ({
23521
23572
  ...state,
@@ -23530,10 +23581,13 @@
23530
23581
  unsubscribe();
23531
23582
  }
23532
23583
  async function detachChannel() {
23533
- if (channelRef.current && client?.isActive()) {
23584
+ if (channelRef.current && client) {
23534
23585
  try {
23535
23586
  await client.detach(channelRef.current);
23536
23587
  } catch (e) {
23588
+ if (e instanceof Error && /not attached/i.test(e.message)) {
23589
+ return;
23590
+ }
23537
23591
  console.error("Failed to detach channel:", e);
23538
23592
  }
23539
23593
  }
@@ -23566,7 +23620,11 @@
23566
23620
  channel: void 0,
23567
23621
  sessionCount: 0,
23568
23622
  loading: true,
23569
- error: void 0
23623
+ error: void 0,
23624
+ // Placeholder until `useYorkieChannel` wires up the real detach.
23625
+ // Pre-attach calls are a no-op rather than a throw.
23626
+ detach: async () => {
23627
+ }
23570
23628
  });
23571
23629
  }
23572
23630
  const channelStore = channelStoreRef.current;
@@ -23594,7 +23652,8 @@
23594
23652
  const sessionCount = useSelector(channelStore, (state) => state.sessionCount);
23595
23653
  const loading = useSelector(channelStore, (state) => state.loading);
23596
23654
  const error = useSelector(channelStore, (state) => state.error);
23597
- return { sessionCount, loading, error };
23655
+ const detach = useSelector(channelStore, (state) => state.detach);
23656
+ return { sessionCount, loading, error, detach };
23598
23657
  };
23599
23658
  const useChannelSessionCount = () => {
23600
23659
  const channelStore = useChannelStore("useChannelSessionCount");
@@ -23616,7 +23675,7 @@
23616
23675
  };
23617
23676
  }, []);
23618
23677
  const peekOnce = react.useCallback(async () => {
23619
- if (!client || !client.isActive()) return;
23678
+ if (!client) return;
23620
23679
  if (mountedRef.current) setLoading(true);
23621
23680
  try {
23622
23681
  const count = await client.peekChannel(channelKeyRef.current);
@@ -23645,7 +23704,7 @@
23645
23704
  let cancelled = false;
23646
23705
  let timer;
23647
23706
  const run = async () => {
23648
- if (cancelled || !client.isActive()) return;
23707
+ if (cancelled) return;
23649
23708
  try {
23650
23709
  const count = await client.peekChannel(channelKey);
23651
23710
  if (cancelled) return;