@yorkie-js/sdk 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";
@@ -20785,12 +20786,25 @@
20785
20786
  }
20786
20787
  class Attachment {
20787
20788
  resource;
20789
+ /**
20790
+ * For Documents: the document's resourceID, available at attach time.
20791
+ * For Channels: the server-issued session_id. Starts empty and is
20792
+ * populated after the first `RefreshChannel` first-call response.
20793
+ */
20788
20794
  resourceID;
20789
20795
  syncMode;
20790
20796
  changeEventReceived;
20791
20797
  lastHeartbeatTime;
20792
20798
  pollInterval;
20793
20799
  pollIntervalPinned;
20800
+ /**
20801
+ * `unsubscribeLocalBroadcast` is set by `attachChannel` when it forwards
20802
+ * a Channel's `local-broadcast` events to the RPC client, and consumed
20803
+ * by `detachInternal` so the subscription does not survive a detach.
20804
+ * Without this, re-attaching a channel accumulates duplicate handlers
20805
+ * on each attach cycle.
20806
+ */
20807
+ unsubscribeLocalBroadcast;
20794
20808
  reconnectStreamDelay;
20795
20809
  cancelled;
20796
20810
  watchStream;
@@ -20798,13 +20812,13 @@
20798
20812
  watchAbortController;
20799
20813
  syncPromise;
20800
20814
  _detaching = false;
20801
- constructor(reconnectStreamDelay, resource, resourceID, syncMode, pollInterval = 0, pollIntervalPinned = false) {
20815
+ constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false) {
20802
20816
  this.reconnectStreamDelay = reconnectStreamDelay;
20803
20817
  this.resource = resource;
20804
20818
  this.resourceID = resourceID;
20805
20819
  this.syncMode = syncMode;
20806
20820
  this.changeEventReceived = syncMode !== void 0 ? false : void 0;
20807
- this.lastHeartbeatTime = Date.now();
20821
+ this.lastHeartbeatTime = 0;
20808
20822
  this.pollInterval = pollInterval;
20809
20823
  this.pollIntervalPinned = pollIntervalPinned;
20810
20824
  this.cancelled = false;
@@ -20966,7 +20980,7 @@
20966
20980
  };
20967
20981
  }
20968
20982
  const name = "@yorkie-js/sdk";
20969
- const version = "0.7.9";
20983
+ const version = "0.7.10-rc";
20970
20984
  const pkg = {
20971
20985
  name,
20972
20986
  version
@@ -21004,6 +21018,7 @@
21004
21018
  ChannelEventType2["Broadcast"] = "broadcast";
21005
21019
  ChannelEventType2["LocalBroadcast"] = "local-broadcast";
21006
21020
  ChannelEventType2["AuthError"] = "auth-error";
21021
+ ChannelEventType2["SyncError"] = "sync-error";
21007
21022
  return ChannelEventType2;
21008
21023
  })(ChannelEventType || {});
21009
21024
  const KeyPathSeparator = ".";
@@ -21143,6 +21158,13 @@
21143
21158
  }
21144
21159
  });
21145
21160
  }
21161
+ if (typeOrTopic === "sync-error") {
21162
+ return this.eventStream.subscribe((event) => {
21163
+ if (event.type === "sync-error") {
21164
+ callback(event);
21165
+ }
21166
+ });
21167
+ }
21146
21168
  if (typeOrTopic === "presence") {
21147
21169
  return this.eventStream.subscribe((event) => {
21148
21170
  if (event.type === "presence-changed" || event.type === "initialized") {
@@ -21262,13 +21284,14 @@
21262
21284
  ClientCondition2["WatchLoop"] = "WatchLoop";
21263
21285
  return ClientCondition2;
21264
21286
  })(ClientCondition || {});
21265
- const DefaultPollingIntervalMs = 3e3;
21287
+ const DefaultDocumentPollIntervalMs = 3e3;
21288
+ const DefaultChannelHeartbeatMs = 5e3;
21266
21289
  const DefaultClientOptions = {
21267
21290
  rpcAddr: "https://api.yorkie.dev",
21268
21291
  syncLoopDuration: 50,
21269
21292
  retrySyncLoopDelay: 1e3,
21270
21293
  reconnectStreamDelay: 1e3,
21271
- channelHeartbeatInterval: 3e4
21294
+ channelHeartbeatInterval: DefaultChannelHeartbeatMs
21272
21295
  };
21273
21296
  const DefaultBroadcastOptions = {
21274
21297
  maxRetries: Infinity,
@@ -21465,7 +21488,7 @@
21465
21488
  );
21466
21489
  }
21467
21490
  const pollIntervalPinned = opts.documentPollInterval !== void 0;
21468
- const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21491
+ const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21469
21492
  return this.enqueueTask(async () => {
21470
21493
  try {
21471
21494
  const res = await this.rpcClient.attachDocument(
@@ -21594,127 +21617,88 @@
21594
21617
  return this.enqueueTask(task);
21595
21618
  }
21596
21619
  /**
21597
- * `attach` attaches the given channel to this client.
21598
- * It tells the server that this client will track the channel.
21620
+ * `attachChannel` attaches the given channel to this client. The channel is
21621
+ * registered locally and the server is notified on the next RefreshChannel
21622
+ * heartbeat.
21599
21623
  */
21600
21624
  async attachChannel(channel, opts = {}) {
21601
- if (!this.isActive()) {
21602
- throw new YorkieError(
21603
- Code.ErrClientNotActivated,
21604
- `${this.key} is not active`
21605
- );
21606
- }
21607
21625
  if (channel.getStatus() !== ChannelStatus.Detached) {
21608
21626
  throw new YorkieError(
21609
21627
  Code.ErrNotDetached,
21610
21628
  `${channel.getKey()} is not detached`
21611
21629
  );
21612
21630
  }
21613
- channel.setActor(this.id);
21631
+ const syncMode = opts.syncMode ?? "realtime";
21632
+ this.assertValidChannelSyncMode(syncMode);
21633
+ if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
21634
+ throw new YorkieError(
21635
+ Code.ErrInvalidArgument,
21636
+ "channelHeartbeatInterval must be greater than 0"
21637
+ );
21638
+ }
21639
+ const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
21640
+ const pollInterval = opts.channelHeartbeatInterval ?? this.channelHeartbeatInterval;
21614
21641
  const task = async () => {
21615
- try {
21616
- const res = await this.rpcClient.attachChannel(
21617
- {
21618
- clientId: this.id,
21619
- channelKey: channel.getKey()
21620
- },
21621
- {
21622
- headers: {
21623
- "x-shard-key": `${this.apiKey}/${channel.getFirstKeyPath()}`
21624
- }
21625
- }
21626
- );
21627
- channel.setSessionID(res.sessionId);
21628
- channel.updateSessionCount(Number(res.sessionCount), 0);
21629
- channel.applyStatus(ChannelStatus.Attached);
21630
- const syncMode = opts.syncMode ?? "realtime";
21631
- this.assertValidChannelSyncMode(syncMode);
21632
- if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
21633
- throw new YorkieError(
21634
- Code.ErrInvalidArgument,
21635
- "channelHeartbeatInterval must be greater than 0"
21636
- );
21637
- }
21638
- const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
21639
- const pollInterval = pollIntervalPinned ? opts.channelHeartbeatInterval : syncMode === "polling" ? DefaultPollingIntervalMs : this.channelHeartbeatInterval;
21640
- const attachment = new Attachment(
21641
- this.reconnectStreamDelay,
21642
- channel,
21643
- res.sessionId,
21644
- syncMode,
21645
- pollInterval,
21646
- pollIntervalPinned
21647
- );
21648
- channel.subscribe("local-broadcast", (event) => {
21642
+ if (this.id) {
21643
+ channel.setActor(this.id);
21644
+ }
21645
+ const attachment = new Attachment(
21646
+ this.reconnectStreamDelay,
21647
+ channel,
21648
+ "",
21649
+ // sessionID populated on first refresh response
21650
+ syncMode,
21651
+ pollInterval,
21652
+ pollIntervalPinned
21653
+ );
21654
+ attachment.unsubscribeLocalBroadcast = channel.subscribe(
21655
+ "local-broadcast",
21656
+ (event) => {
21649
21657
  const { topic, payload, options } = event;
21650
21658
  this.broadcast(channel.getKey(), topic, payload, options).catch(
21651
21659
  (error) => {
21652
- if (options?.error) {
21653
- options.error(error);
21654
- }
21660
+ if (options?.error) options.error(error);
21655
21661
  logger.error(`[BC] c:"${this.getKey()}" failed: ${error}`);
21656
21662
  }
21657
21663
  );
21658
- });
21659
- this.attachmentMap.set(channel.getKey(), attachment);
21660
- if (syncMode === "realtime") {
21661
- await this.runWatchLoop(channel.getKey());
21662
21664
  }
21663
- logger.info(
21664
- `[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode} count:${channel.getSessionCount()}`
21665
- );
21666
- return channel;
21667
- } catch (err) {
21668
- logger.error(`[AP] c:"${this.getKey()}" err :`, err);
21669
- await this.handleConnectError(err);
21670
- throw err;
21665
+ );
21666
+ this.attachmentMap.set(channel.getKey(), attachment);
21667
+ if (!this.conditions[
21668
+ "SyncLoop"
21669
+ /* SyncLoop */
21670
+ ]) {
21671
+ this.runSyncLoop();
21671
21672
  }
21673
+ logger.info(
21674
+ `[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode}`
21675
+ );
21676
+ return channel;
21672
21677
  };
21673
21678
  return this.enqueueTask(task);
21674
21679
  }
21675
21680
  /**
21676
- * `detachChannel` detaches the given channel from this client.
21677
- * It tells the server that this client will no longer track the channel.
21681
+ * `detachChannel` detaches the given channel from this client. The detach
21682
+ * is a local cleanup; the server reclaims the session via TTL when
21683
+ * heartbeats stop.
21678
21684
  */
21679
21685
  async detachChannel(channel) {
21680
- if (!this.isActive()) {
21681
- throw new YorkieError(
21682
- Code.ErrClientNotActivated,
21683
- `${this.key} is not active`
21684
- );
21685
- }
21686
- if (!this.attachmentMap.has(channel.getKey())) {
21686
+ const attachment = this.attachmentMap.get(channel.getKey());
21687
+ if (!attachment) {
21687
21688
  throw new YorkieError(
21688
21689
  Code.ErrNotAttached,
21689
21690
  `${channel.getKey()} is not attached`
21690
21691
  );
21691
21692
  }
21693
+ attachment.markDetaching();
21694
+ await attachment.waitForSyncComplete();
21692
21695
  const task = async () => {
21693
- try {
21694
- const res = await this.rpcClient.detachChannel(
21695
- {
21696
- clientId: this.id,
21697
- channelKey: channel.getKey(),
21698
- sessionId: channel.getSessionID()
21699
- },
21700
- {
21701
- headers: {
21702
- "x-shard-key": `${this.apiKey}/${channel.getFirstKeyPath()}`
21703
- }
21704
- }
21705
- );
21706
- channel.updateSessionCount(Number(res.sessionCount), 0);
21707
- channel.applyStatus(ChannelStatus.Detached);
21708
- this.detachInternal(channel.getKey());
21709
- logger.info(
21710
- `[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" count:${channel.getSessionCount()}`
21711
- );
21712
- return channel;
21713
- } catch (err) {
21714
- logger.error(`[DP] c:"${this.getKey()}" err :`, err);
21715
- await this.handleConnectError(err);
21716
- throw err;
21717
- }
21696
+ channel.applyStatus(ChannelStatus.Detached);
21697
+ this.detachInternal(channel.getKey());
21698
+ logger.info(
21699
+ `[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" (local)`
21700
+ );
21701
+ return channel;
21718
21702
  };
21719
21703
  return this.enqueueTask(task);
21720
21704
  }
@@ -21755,7 +21739,7 @@
21755
21739
  attachment.changeEventReceived = true;
21756
21740
  }
21757
21741
  if (!attachment.pollIntervalPinned) {
21758
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21742
+ attachment.pollInterval = syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21759
21743
  }
21760
21744
  if ((prevSyncMode === "manual" || prevSyncMode === "polling") && syncMode !== "manual" && syncMode !== "polling") {
21761
21745
  attachment.resetCancelled();
@@ -21776,12 +21760,6 @@
21776
21760
  }
21777
21761
  }
21778
21762
  async changeChannelSyncMode(channel, syncMode) {
21779
- if (!this.isActive()) {
21780
- throw new YorkieError(
21781
- Code.ErrClientNotActivated,
21782
- `${this.key} is not active`
21783
- );
21784
- }
21785
21763
  const attachment = this.attachmentMap.get(channel.getKey());
21786
21764
  if (!attachment) {
21787
21765
  throw new YorkieError(
@@ -21799,7 +21777,7 @@
21799
21777
  }
21800
21778
  attachment.changeSyncMode(syncMode);
21801
21779
  if (!attachment.pollIntervalPinned) {
21802
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : syncMode === "realtime" ? this.channelHeartbeatInterval : 0;
21780
+ attachment.pollInterval = syncMode === "manual" ? 0 : this.channelHeartbeatInterval;
21803
21781
  }
21804
21782
  if (syncMode === "realtime") {
21805
21783
  attachment.resetCancelled();
@@ -21811,7 +21789,7 @@
21811
21789
  * `sync` implementation that handles both Document and Channel.
21812
21790
  */
21813
21791
  sync(resource) {
21814
- if (!this.isActive()) {
21792
+ if (!(resource instanceof Channel) && !this.isActive()) {
21815
21793
  throw new YorkieError(
21816
21794
  Code.ErrClientNotActivated,
21817
21795
  `${this.key} is not active`
@@ -22138,12 +22116,6 @@
22138
22116
  * subscribe to channel events. Polling is the caller's responsibility.
22139
22117
  */
22140
22118
  async peekChannel(channelKey) {
22141
- if (!this.isActive()) {
22142
- throw new YorkieError(
22143
- Code.ErrClientNotActivated,
22144
- `${this.key} is not active`
22145
- );
22146
- }
22147
22119
  return this.enqueueTask(async () => {
22148
22120
  const firstKeyPath = channelKey.split(".")[0];
22149
22121
  const res = await this.rpcClient.peekChannel(
@@ -22161,12 +22133,6 @@
22161
22133
  * `broadcast` broadcasts the given payload to the given topic.
22162
22134
  */
22163
22135
  async broadcast(key, topic, payload, options) {
22164
- if (!this.isActive()) {
22165
- throw new YorkieError(
22166
- Code.ErrClientNotActivated,
22167
- `${this.key} is not active`
22168
- );
22169
- }
22170
22136
  const attachment = this.attachmentMap.get(key);
22171
22137
  if (!attachment) {
22172
22138
  throw new YorkieError(Code.ErrNotAttached, `${key} is not attached`);
@@ -22243,8 +22209,16 @@
22243
22209
  */
22244
22210
  runSyncLoop() {
22245
22211
  const doLoop = async () => {
22246
- if (!this.isActive() || this.deactivating) {
22247
- logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
22212
+ if (this.deactivating) {
22213
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (deactivating)`);
22214
+ this.conditions[
22215
+ "SyncLoop"
22216
+ /* SyncLoop */
22217
+ ] = false;
22218
+ return;
22219
+ }
22220
+ if (!this.isActive() && this.attachmentMap.size === 0) {
22221
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (idle)`);
22248
22222
  this.conditions[
22249
22223
  "SyncLoop"
22250
22224
  /* SyncLoop */
@@ -22630,6 +22604,10 @@
22630
22604
  return;
22631
22605
  }
22632
22606
  attachment.cancelWatchStream();
22607
+ if (attachment.unsubscribeLocalBroadcast) {
22608
+ attachment.unsubscribeLocalBroadcast();
22609
+ attachment.unsubscribeLocalBroadcast = void 0;
22610
+ }
22633
22611
  if (attachment.resource instanceof Document) {
22634
22612
  attachment.resource.resetOnlineClients();
22635
22613
  }
@@ -22638,12 +22616,17 @@
22638
22616
  async syncInternal(attachment, syncMode) {
22639
22617
  const { resource } = attachment;
22640
22618
  if (resource instanceof Channel) {
22619
+ const isFirstCall = !resource.getSessionID();
22641
22620
  try {
22642
22621
  const res = await this.rpcClient.refreshChannel(
22643
22622
  {
22644
- clientId: this.id,
22623
+ clientId: this.id ?? "",
22645
22624
  channelKey: resource.getKey(),
22646
- sessionId: resource.getSessionID()
22625
+ sessionId: resource.getSessionID() ?? "",
22626
+ // First-call only — these fields are ignored by the server
22627
+ // once a session_id is established.
22628
+ clientKey: isFirstCall ? this.key : "",
22629
+ metadata: isFirstCall ? this.metadata : {}
22647
22630
  },
22648
22631
  {
22649
22632
  headers: {
@@ -22651,6 +22634,31 @@
22651
22634
  }
22652
22635
  }
22653
22636
  );
22637
+ if (isFirstCall) {
22638
+ if (this.deactivating || attachment.isDetaching()) {
22639
+ return resource;
22640
+ }
22641
+ if (res.clientId && !this.id) {
22642
+ this.id = res.clientId;
22643
+ this.status = "activated";
22644
+ resource.setActor(res.clientId);
22645
+ } else if (this.id) {
22646
+ resource.setActor(this.id);
22647
+ }
22648
+ if (res.sessionId) {
22649
+ resource.setSessionID(res.sessionId);
22650
+ attachment.resourceID = res.sessionId;
22651
+ resource.applyStatus(ChannelStatus.Attached);
22652
+ }
22653
+ if (attachment.syncMode === "realtime") {
22654
+ this.runWatchLoop(resource.getKey()).catch((err) => {
22655
+ logger.error(
22656
+ `[WP] c:"${this.getKey()}" failed to start watch for p:"${resource.getKey()}":`,
22657
+ err
22658
+ );
22659
+ });
22660
+ }
22661
+ }
22654
22662
  const prevCount = resource.getSessionCount();
22655
22663
  if (resource.updateSessionCount(Number(res.sessionCount), 0)) {
22656
22664
  if (resource.getSessionCount() !== prevCount) {
@@ -22665,6 +22673,21 @@
22665
22673
  `[RP] c:"${this.getKey()}" refreshes p:"${resource.getKey()}" mode:${attachment.syncMode}`
22666
22674
  );
22667
22675
  } catch (err) {
22676
+ if (isErrorCode(err, Code.ErrSessionNotFound)) {
22677
+ logger.info(
22678
+ `[RP] c:"${this.getKey()}" session expired for p:"${resource.getKey()}", re-attaching`
22679
+ );
22680
+ resource.setSessionID("");
22681
+ attachment.resourceID = "";
22682
+ return resource;
22683
+ }
22684
+ if (!this.deactivating && !attachment.isDetaching()) {
22685
+ resource.publish({
22686
+ type: ChannelEventType.SyncError,
22687
+ error: err,
22688
+ method: "RefreshChannel"
22689
+ });
22690
+ }
22668
22691
  logger.error(`[RP] c:"${this.getKey()}" err :`, err);
22669
22692
  throw err;
22670
22693
  }