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