@yorkie-js/sdk 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";
@@ -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-rc2";
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,
@@ -21327,10 +21350,43 @@
21327
21350
  baseUrl: rpcAddr,
21328
21351
  interceptors: [authInterceptor, createMetricInterceptor(opts?.userAgent)],
21329
21352
  fetch: (input, init) => {
21353
+ const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
21354
+ if (/\/yorkie\.v1\.YorkieService\/Watch/.test(url)) {
21355
+ return fetch(input, {
21356
+ ...init,
21357
+ keepalive: this.keepalive
21358
+ });
21359
+ }
21360
+ const callerSignal = init?.signal ?? (input instanceof Request ? input.signal : void 0);
21361
+ const innerAC = new AbortController();
21362
+ let onCallerAbort;
21363
+ if (callerSignal) {
21364
+ if (callerSignal.aborted) {
21365
+ innerAC.abort(callerSignal.reason);
21366
+ } else {
21367
+ onCallerAbort = () => innerAC.abort(callerSignal.reason);
21368
+ callerSignal.addEventListener("abort", onCallerAbort);
21369
+ }
21370
+ }
21371
+ const detach = () => {
21372
+ if (callerSignal && onCallerAbort) {
21373
+ callerSignal.removeEventListener("abort", onCallerAbort);
21374
+ }
21375
+ };
21330
21376
  return fetch(input, {
21331
21377
  ...init,
21378
+ signal: innerAC.signal,
21332
21379
  keepalive: this.keepalive
21333
- });
21380
+ }).then(
21381
+ (res) => {
21382
+ detach();
21383
+ return res;
21384
+ },
21385
+ (err) => {
21386
+ detach();
21387
+ throw err;
21388
+ }
21389
+ );
21334
21390
  }
21335
21391
  };
21336
21392
  this.rpcClient = createClient(
@@ -21465,7 +21521,7 @@
21465
21521
  );
21466
21522
  }
21467
21523
  const pollIntervalPinned = opts.documentPollInterval !== void 0;
21468
- const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21524
+ const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21469
21525
  return this.enqueueTask(async () => {
21470
21526
  try {
21471
21527
  const res = await this.rpcClient.attachDocument(
@@ -21594,127 +21650,88 @@
21594
21650
  return this.enqueueTask(task);
21595
21651
  }
21596
21652
  /**
21597
- * `attach` attaches the given channel to this client.
21598
- * It tells the server that this client will track the channel.
21653
+ * `attachChannel` attaches the given channel to this client. The channel is
21654
+ * registered locally and the server is notified on the next RefreshChannel
21655
+ * heartbeat.
21599
21656
  */
21600
21657
  async attachChannel(channel, opts = {}) {
21601
- if (!this.isActive()) {
21602
- throw new YorkieError(
21603
- Code.ErrClientNotActivated,
21604
- `${this.key} is not active`
21605
- );
21606
- }
21607
21658
  if (channel.getStatus() !== ChannelStatus.Detached) {
21608
21659
  throw new YorkieError(
21609
21660
  Code.ErrNotDetached,
21610
21661
  `${channel.getKey()} is not detached`
21611
21662
  );
21612
21663
  }
21613
- channel.setActor(this.id);
21664
+ const syncMode = opts.syncMode ?? "realtime";
21665
+ this.assertValidChannelSyncMode(syncMode);
21666
+ if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
21667
+ throw new YorkieError(
21668
+ Code.ErrInvalidArgument,
21669
+ "channelHeartbeatInterval must be greater than 0"
21670
+ );
21671
+ }
21672
+ const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
21673
+ const pollInterval = opts.channelHeartbeatInterval ?? this.channelHeartbeatInterval;
21614
21674
  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) => {
21675
+ if (this.id) {
21676
+ channel.setActor(this.id);
21677
+ }
21678
+ const attachment = new Attachment(
21679
+ this.reconnectStreamDelay,
21680
+ channel,
21681
+ "",
21682
+ // sessionID populated on first refresh response
21683
+ syncMode,
21684
+ pollInterval,
21685
+ pollIntervalPinned
21686
+ );
21687
+ attachment.unsubscribeLocalBroadcast = channel.subscribe(
21688
+ "local-broadcast",
21689
+ (event) => {
21649
21690
  const { topic, payload, options } = event;
21650
21691
  this.broadcast(channel.getKey(), topic, payload, options).catch(
21651
21692
  (error) => {
21652
- if (options?.error) {
21653
- options.error(error);
21654
- }
21693
+ if (options?.error) options.error(error);
21655
21694
  logger.error(`[BC] c:"${this.getKey()}" failed: ${error}`);
21656
21695
  }
21657
21696
  );
21658
- });
21659
- this.attachmentMap.set(channel.getKey(), attachment);
21660
- if (syncMode === "realtime") {
21661
- await this.runWatchLoop(channel.getKey());
21662
21697
  }
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;
21698
+ );
21699
+ this.attachmentMap.set(channel.getKey(), attachment);
21700
+ if (!this.conditions[
21701
+ "SyncLoop"
21702
+ /* SyncLoop */
21703
+ ]) {
21704
+ this.runSyncLoop();
21671
21705
  }
21706
+ logger.info(
21707
+ `[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode}`
21708
+ );
21709
+ return channel;
21672
21710
  };
21673
21711
  return this.enqueueTask(task);
21674
21712
  }
21675
21713
  /**
21676
- * `detachChannel` detaches the given channel from this client.
21677
- * It tells the server that this client will no longer track the channel.
21714
+ * `detachChannel` detaches the given channel from this client. The detach
21715
+ * is a local cleanup; the server reclaims the session via TTL when
21716
+ * heartbeats stop.
21678
21717
  */
21679
21718
  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())) {
21719
+ const attachment = this.attachmentMap.get(channel.getKey());
21720
+ if (!attachment) {
21687
21721
  throw new YorkieError(
21688
21722
  Code.ErrNotAttached,
21689
21723
  `${channel.getKey()} is not attached`
21690
21724
  );
21691
21725
  }
21726
+ attachment.markDetaching();
21727
+ await attachment.waitForSyncComplete();
21692
21728
  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
- }
21729
+ channel.applyStatus(ChannelStatus.Detached);
21730
+ this.detachInternal(channel.getKey());
21731
+ logger.info(
21732
+ `[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" (local)`
21733
+ );
21734
+ return channel;
21718
21735
  };
21719
21736
  return this.enqueueTask(task);
21720
21737
  }
@@ -21755,7 +21772,7 @@
21755
21772
  attachment.changeEventReceived = true;
21756
21773
  }
21757
21774
  if (!attachment.pollIntervalPinned) {
21758
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : 0;
21775
+ attachment.pollInterval = syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
21759
21776
  }
21760
21777
  if ((prevSyncMode === "manual" || prevSyncMode === "polling") && syncMode !== "manual" && syncMode !== "polling") {
21761
21778
  attachment.resetCancelled();
@@ -21776,12 +21793,6 @@
21776
21793
  }
21777
21794
  }
21778
21795
  async changeChannelSyncMode(channel, syncMode) {
21779
- if (!this.isActive()) {
21780
- throw new YorkieError(
21781
- Code.ErrClientNotActivated,
21782
- `${this.key} is not active`
21783
- );
21784
- }
21785
21796
  const attachment = this.attachmentMap.get(channel.getKey());
21786
21797
  if (!attachment) {
21787
21798
  throw new YorkieError(
@@ -21799,7 +21810,7 @@
21799
21810
  }
21800
21811
  attachment.changeSyncMode(syncMode);
21801
21812
  if (!attachment.pollIntervalPinned) {
21802
- attachment.pollInterval = syncMode === "polling" ? DefaultPollingIntervalMs : syncMode === "realtime" ? this.channelHeartbeatInterval : 0;
21813
+ attachment.pollInterval = syncMode === "manual" ? 0 : this.channelHeartbeatInterval;
21803
21814
  }
21804
21815
  if (syncMode === "realtime") {
21805
21816
  attachment.resetCancelled();
@@ -21811,7 +21822,7 @@
21811
21822
  * `sync` implementation that handles both Document and Channel.
21812
21823
  */
21813
21824
  sync(resource) {
21814
- if (!this.isActive()) {
21825
+ if (!(resource instanceof Channel) && !this.isActive()) {
21815
21826
  throw new YorkieError(
21816
21827
  Code.ErrClientNotActivated,
21817
21828
  `${this.key} is not active`
@@ -22138,12 +22149,6 @@
22138
22149
  * subscribe to channel events. Polling is the caller's responsibility.
22139
22150
  */
22140
22151
  async peekChannel(channelKey) {
22141
- if (!this.isActive()) {
22142
- throw new YorkieError(
22143
- Code.ErrClientNotActivated,
22144
- `${this.key} is not active`
22145
- );
22146
- }
22147
22152
  return this.enqueueTask(async () => {
22148
22153
  const firstKeyPath = channelKey.split(".")[0];
22149
22154
  const res = await this.rpcClient.peekChannel(
@@ -22161,12 +22166,6 @@
22161
22166
  * `broadcast` broadcasts the given payload to the given topic.
22162
22167
  */
22163
22168
  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
22169
  const attachment = this.attachmentMap.get(key);
22171
22170
  if (!attachment) {
22172
22171
  throw new YorkieError(Code.ErrNotAttached, `${key} is not attached`);
@@ -22243,8 +22242,16 @@
22243
22242
  */
22244
22243
  runSyncLoop() {
22245
22244
  const doLoop = async () => {
22246
- if (!this.isActive() || this.deactivating) {
22247
- logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
22245
+ if (this.deactivating) {
22246
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (deactivating)`);
22247
+ this.conditions[
22248
+ "SyncLoop"
22249
+ /* SyncLoop */
22250
+ ] = false;
22251
+ return;
22252
+ }
22253
+ if (!this.isActive() && this.attachmentMap.size === 0) {
22254
+ logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (idle)`);
22248
22255
  this.conditions[
22249
22256
  "SyncLoop"
22250
22257
  /* SyncLoop */
@@ -22630,6 +22637,10 @@
22630
22637
  return;
22631
22638
  }
22632
22639
  attachment.cancelWatchStream();
22640
+ if (attachment.unsubscribeLocalBroadcast) {
22641
+ attachment.unsubscribeLocalBroadcast();
22642
+ attachment.unsubscribeLocalBroadcast = void 0;
22643
+ }
22633
22644
  if (attachment.resource instanceof Document) {
22634
22645
  attachment.resource.resetOnlineClients();
22635
22646
  }
@@ -22638,12 +22649,17 @@
22638
22649
  async syncInternal(attachment, syncMode) {
22639
22650
  const { resource } = attachment;
22640
22651
  if (resource instanceof Channel) {
22652
+ const isFirstCall = !resource.getSessionID();
22641
22653
  try {
22642
22654
  const res = await this.rpcClient.refreshChannel(
22643
22655
  {
22644
- clientId: this.id,
22656
+ clientId: this.id ?? "",
22645
22657
  channelKey: resource.getKey(),
22646
- sessionId: resource.getSessionID()
22658
+ sessionId: resource.getSessionID() ?? "",
22659
+ // First-call only — these fields are ignored by the server
22660
+ // once a session_id is established.
22661
+ clientKey: isFirstCall ? this.key : "",
22662
+ metadata: isFirstCall ? this.metadata : {}
22647
22663
  },
22648
22664
  {
22649
22665
  headers: {
@@ -22651,6 +22667,31 @@
22651
22667
  }
22652
22668
  }
22653
22669
  );
22670
+ if (isFirstCall) {
22671
+ if (this.deactivating || attachment.isDetaching()) {
22672
+ return resource;
22673
+ }
22674
+ if (res.clientId && !this.id) {
22675
+ this.id = res.clientId;
22676
+ this.status = "activated";
22677
+ resource.setActor(res.clientId);
22678
+ } else if (this.id) {
22679
+ resource.setActor(this.id);
22680
+ }
22681
+ if (res.sessionId) {
22682
+ resource.setSessionID(res.sessionId);
22683
+ attachment.resourceID = res.sessionId;
22684
+ resource.applyStatus(ChannelStatus.Attached);
22685
+ }
22686
+ if (attachment.syncMode === "realtime") {
22687
+ this.runWatchLoop(resource.getKey()).catch((err) => {
22688
+ logger.error(
22689
+ `[WP] c:"${this.getKey()}" failed to start watch for p:"${resource.getKey()}":`,
22690
+ err
22691
+ );
22692
+ });
22693
+ }
22694
+ }
22654
22695
  const prevCount = resource.getSessionCount();
22655
22696
  if (resource.updateSessionCount(Number(res.sessionCount), 0)) {
22656
22697
  if (resource.getSessionCount() !== prevCount) {
@@ -22665,6 +22706,21 @@
22665
22706
  `[RP] c:"${this.getKey()}" refreshes p:"${resource.getKey()}" mode:${attachment.syncMode}`
22666
22707
  );
22667
22708
  } catch (err) {
22709
+ if (isErrorCode(err, Code.ErrSessionNotFound)) {
22710
+ logger.info(
22711
+ `[RP] c:"${this.getKey()}" session expired for p:"${resource.getKey()}", re-attaching`
22712
+ );
22713
+ resource.setSessionID("");
22714
+ attachment.resourceID = "";
22715
+ return resource;
22716
+ }
22717
+ if (!this.deactivating && !attachment.isDetaching()) {
22718
+ resource.publish({
22719
+ type: ChannelEventType.SyncError,
22720
+ error: err,
22721
+ method: "RefreshChannel"
22722
+ });
22723
+ }
22668
22724
  logger.error(`[RP] c:"${this.getKey()}" err :`, err);
22669
22725
  throw err;
22670
22726
  }