@yorkie-js/react 0.7.9 → 0.7.10-rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/yorkie-js-react.d.ts +19 -2
- package/dist/yorkie-js-react.es.js +207 -148
- package/dist/yorkie-js-react.es.js.map +1 -1
- package/dist/yorkie-js-react.js +207 -148
- package/dist/yorkie-js-react.js.map +1 -1
- package/package.json +2 -2
package/dist/yorkie-js-react.js
CHANGED
|
@@ -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("
|
|
5872
|
+
const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlImoKFUF0dGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxISCgpzY2hlbWFfa2V5GAMgASgJIp8BChZBdHRhY2hEb2N1bWVudFJlc3BvbnNlEhMKC2RvY3VtZW50X2lkGAEgASgJEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSHQoVbWF4X3NpemVfcGVyX2RvY3VtZW50GAMgASgFEiUKDHNjaGVtYV9ydWxlcxgEIAMoCzIPLnlvcmtpZS52MS5SdWxlIosBChVEZXRhY2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSHgoWcmVtb3ZlX2lmX25vdF9hdHRhY2hlZBgEIAEoCCJEChZEZXRhY2hEb2N1bWVudFJlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siUwoMV2F0Y2hSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRIwCglyZXNvdXJjZXMYAiADKAsyHS55b3JraWUudjEuUmVzb3VyY2VEZXNjcmlwdG9yIoQBChJSZXNvdXJjZURlc2NyaXB0b3ISMQoIZG9jdW1lbnQYASABKAsyHS55b3JraWUudjEuRG9jdW1lbnREZXNjcmlwdG9ySAASLwoHY2hhbm5lbBgCIAEoCzIcLnlvcmtpZS52MS5DaGFubmVsRGVzY3JpcHRvckgAQgoKCHJlc291cmNlIikKEkRvY3VtZW50RGVzY3JpcHRvchITCgtkb2N1bWVudF9pZBgBIAEoCSIoChFDaGFubmVsRGVzY3JpcHRvchITCgtjaGFubmVsX2tleRgBIAEoCSJ5Cg1XYXRjaFJlc3BvbnNlEjgKDmluaXRpYWxpemF0aW9uGAEgASgLMh4ueW9ya2llLnYxLldhdGNoSW5pdGlhbGl6YXRpb25IABImCgVldmVudBgCIAEoCzIVLnlvcmtpZS52MS5XYXRjaEV2ZW50SABCBgoEYm9keSJGChNXYXRjaEluaXRpYWxpemF0aW9uEi8KDnJlc291cmNlX2luaXRzGAEgAygLMhcueW9ya2llLnYxLlJlc291cmNlSW5pdCJ4CgxSZXNvdXJjZUluaXQSMAoNZG9jdW1lbnRfaW5pdBgBIAEoCzIXLnlvcmtpZS52MS5Eb2N1bWVudEluaXRIABIuCgxjaGFubmVsX2luaXQYAiABKAsyFi55b3JraWUudjEuQ2hhbm5lbEluaXRIAEIGCgRpbml0IjcKDERvY3VtZW50SW5pdBITCgtkb2N1bWVudF9pZBgBIAEoCRISCgpjbGllbnRfaWRzGAIgAygJIkYKC0NoYW5uZWxJbml0EhMKC2NoYW5uZWxfa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAMSCwoDc2VxGAMgASgDInsKCldhdGNoRXZlbnQSLQoJZG9jX2V2ZW50GAEgASgLMhgueW9ya2llLnYxLkRvY1dhdGNoRXZlbnRIABI1Cg1jaGFubmVsX2V2ZW50GAIgASgLMhwueW9ya2llLnYxLkNoYW5uZWxXYXRjaEV2ZW50SABCBwoFZXZlbnQiSAoNRG9jV2F0Y2hFdmVudBITCgtkb2N1bWVudF9pZBgBIAEoCRIiCgVldmVudBgCIAEoCzITLnlvcmtpZS52MS5Eb2NFdmVudCJQChFDaGFubmVsV2F0Y2hFdmVudBITCgtjaGFubmVsX2tleRgBIAEoCRImCgVldmVudBgCIAEoCzIXLnlvcmtpZS52MS5DaGFubmVsRXZlbnQiPgoUV2F0Y2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJIrYBChVXYXRjaERvY3VtZW50UmVzcG9uc2USSQoOaW5pdGlhbGl6YXRpb24YASABKAsyLy55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlc3BvbnNlLkluaXRpYWxpemF0aW9uSAASJAoFZXZlbnQYAiABKAsyEy55b3JraWUudjEuRG9jRXZlbnRIABokCg5Jbml0aWFsaXphdGlvbhISCgpjbGllbnRfaWRzGAEgAygJQgYKBGJvZHkiPQoTV2F0Y2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkigwEKFFdhdGNoQ2hhbm5lbFJlc3BvbnNlEjkKC2luaXRpYWxpemVkGAEgASgLMiIueW9ya2llLnYxLldhdGNoQ2hhbm5lbEluaXRpYWxpemVkSAASKAoFZXZlbnQYAiABKAsyFy55b3JraWUudjEuQ2hhbm5lbEV2ZW50SABCBgoEYm9keSI9ChdXYXRjaENoYW5uZWxJbml0aWFsaXplZBIVCg1zZXNzaW9uX2NvdW50GAEgASgDEgsKA3NlcRgCIAEoAyJrChVSZW1vdmVEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siRAoWUmVtb3ZlRG9jdW1lbnRSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgBIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIn8KFlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEQoJcHVzaF9vbmx5GAQgASgIIkUKF1B1c2hQdWxsQ2hhbmdlc1Jlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAEgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2siYwoVQ3JlYXRlUmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRINCgVsYWJlbBgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCSJGChZDcmVhdGVSZXZpc2lvblJlc3BvbnNlEiwKCHJldmlzaW9uGAEgASgLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJRChJHZXRSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhMKC3JldmlzaW9uX2lkGAMgASgJIkMKE0dldFJldmlzaW9uUmVzcG9uc2USLAoIcmV2aXNpb24YASABKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5InUKFExpc3RSZXZpc2lvbnNSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIRCglwYWdlX3NpemUYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKCmlzX2ZvcndhcmQYBSABKAgiRgoVTGlzdFJldmlzaW9uc1Jlc3BvbnNlEi0KCXJldmlzaW9ucxgBIAMoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkiVQoWUmVzdG9yZVJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEwoLcmV2aXNpb25faWQYBCABKAkiGQoXUmVzdG9yZVJldmlzaW9uUmVzcG9uc2UiPgoUQXR0YWNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJIkIKFUF0dGFjaENoYW5uZWxSZXNwb25zZRISCgpzZXNzaW9uX2lkGAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAMiUgoURGV0YWNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkiLgoVRGV0YWNoQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMi2gEKFVJlZnJlc2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCRISCgpjbGllbnRfa2V5GAQgASgJEkAKCG1ldGFkYXRhGAUgAygLMi4ueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJWChZSZWZyZXNoQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMSEQoJY2xpZW50X2lkGAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkiKQoSUGVla0NoYW5uZWxSZXF1ZXN0EhMKC2NoYW5uZWxfa2V5GAEgASgJIiwKE1BlZWtDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAyJaChBCcm9hZGNhc3RSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRINCgV0b3BpYxgDIAEoCRIPCgdwYXlsb2FkGAQgASgMIhMKEUJyb2FkY2FzdFJlc3BvbnNlMpUMCg1Zb3JraWVTZXJ2aWNlElcKDkFjdGl2YXRlQ2xpZW50EiAueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdBohLnlvcmtpZS52MS5BY3RpdmF0ZUNsaWVudFJlc3BvbnNlIgASXQoQRGVhY3RpdmF0ZUNsaWVudBIiLnlvcmtpZS52MS5EZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBojLnlvcmtpZS52MS5EZWFjdGl2YXRlQ2xpZW50UmVzcG9uc2UiABJXCg5BdHRhY2hEb2N1bWVudBIgLnlvcmtpZS52MS5BdHRhY2hEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuQXR0YWNoRG9jdW1lbnRSZXNwb25zZSIAElcKDkRldGFjaERvY3VtZW50EiAueW9ya2llLnYxLkRldGFjaERvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5EZXRhY2hEb2N1bWVudFJlc3BvbnNlIgASVwoOUmVtb3ZlRG9jdW1lbnQSIC55b3JraWUudjEuUmVtb3ZlRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLlJlbW92ZURvY3VtZW50UmVzcG9uc2UiABJaCg9QdXNoUHVsbENoYW5nZXMSIS55b3JraWUudjEuUHVzaFB1bGxDaGFuZ2VzUmVxdWVzdBoiLnlvcmtpZS52MS5QdXNoUHVsbENoYW5nZXNSZXNwb25zZSIAEj4KBVdhdGNoEhcueW9ya2llLnYxLldhdGNoUmVxdWVzdBoYLnlvcmtpZS52MS5XYXRjaFJlc3BvbnNlIgAwARJWCg1XYXRjaERvY3VtZW50Eh8ueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXF1ZXN0GiAueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXNwb25zZSIAMAESUwoMV2F0Y2hDaGFubmVsEh4ueW9ya2llLnYxLldhdGNoQ2hhbm5lbFJlcXVlc3QaHy55b3JraWUudjEuV2F0Y2hDaGFubmVsUmVzcG9uc2UiADABElcKDkNyZWF0ZVJldmlzaW9uEiAueW9ya2llLnYxLkNyZWF0ZVJldmlzaW9uUmVxdWVzdBohLnlvcmtpZS52MS5DcmVhdGVSZXZpc2lvblJlc3BvbnNlIgASTgoLR2V0UmV2aXNpb24SHS55b3JraWUudjEuR2V0UmV2aXNpb25SZXF1ZXN0Gh4ueW9ya2llLnYxLkdldFJldmlzaW9uUmVzcG9uc2UiABJUCg1MaXN0UmV2aXNpb25zEh8ueW9ya2llLnYxLkxpc3RSZXZpc2lvbnNSZXF1ZXN0GiAueW9ya2llLnYxLkxpc3RSZXZpc2lvbnNSZXNwb25zZSIAEloKD1Jlc3RvcmVSZXZpc2lvbhIhLnlvcmtpZS52MS5SZXN0b3JlUmV2aXNpb25SZXF1ZXN0GiIueW9ya2llLnYxLlJlc3RvcmVSZXZpc2lvblJlc3BvbnNlIgASVAoNQXR0YWNoQ2hhbm5lbBIfLnlvcmtpZS52MS5BdHRhY2hDaGFubmVsUmVxdWVzdBogLnlvcmtpZS52MS5BdHRhY2hDaGFubmVsUmVzcG9uc2UiABJUCg1EZXRhY2hDaGFubmVsEh8ueW9ya2llLnYxLkRldGFjaENoYW5uZWxSZXF1ZXN0GiAueW9ya2llLnYxLkRldGFjaENoYW5uZWxSZXNwb25zZSIAElcKDlJlZnJlc2hDaGFubmVsEiAueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVxdWVzdBohLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlc3BvbnNlIgASTgoLUGVla0NoYW5uZWwSHS55b3JraWUudjEuUGVla0NoYW5uZWxSZXF1ZXN0Gh4ueW9ya2llLnYxLlBlZWtDaGFubmVsUmVzcG9uc2UiABJICglCcm9hZGNhc3QSGy55b3JraWUudjEuQnJvYWRjYXN0UmVxdWVzdBocLnlvcmtpZS52MS5Ccm9hZGNhc3RSZXNwb25zZSIAQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_yorkie_v1_resources]);
|
|
5873
5873
|
const YorkieService = /* @__PURE__ */ serviceDesc(file_yorkie_v1_yorkie, 0);
|
|
5874
5874
|
const file_google_rpc_error_details = /* @__PURE__ */ fileDesc("Ch5nb29nbGUvcnBjL2Vycm9yX2RldGFpbHMucHJvdG8SCmdvb2dsZS5ycGMikwEKCUVycm9ySW5mbxIOCgZyZWFzb24YASABKAkSDgoGZG9tYWluGAIgASgJEjUKCG1ldGFkYXRhGAMgAygLMiMuZ29vZ2xlLnJwYy5FcnJvckluZm8uTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiOwoJUmV0cnlJbmZvEi4KC3JldHJ5X2RlbGF5GAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIjIKCURlYnVnSW5mbxIVCg1zdGFja19lbnRyaWVzGAEgAygJEg4KBmRldGFpbBgCIAEoCSKPAwoMUXVvdGFGYWlsdXJlEjYKCnZpb2xhdGlvbnMYASADKAsyIi5nb29nbGUucnBjLlF1b3RhRmFpbHVyZS5WaW9sYXRpb24axgIKCVZpb2xhdGlvbhIPCgdzdWJqZWN0GAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhMKC2FwaV9zZXJ2aWNlGAMgASgJEhQKDHF1b3RhX21ldHJpYxgEIAEoCRIQCghxdW90YV9pZBgFIAEoCRJRChBxdW90YV9kaW1lbnNpb25zGAYgAygLMjcuZ29vZ2xlLnJwYy5RdW90YUZhaWx1cmUuVmlvbGF0aW9uLlF1b3RhRGltZW5zaW9uc0VudHJ5EhMKC3F1b3RhX3ZhbHVlGAcgASgDEh8KEmZ1dHVyZV9xdW90YV92YWx1ZRgIIAEoA0gAiAEBGjYKFFF1b3RhRGltZW5zaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCFQoTX2Z1dHVyZV9xdW90YV92YWx1ZSKVAQoTUHJlY29uZGl0aW9uRmFpbHVyZRI9Cgp2aW9sYXRpb25zGAEgAygLMikuZ29vZ2xlLnJwYy5QcmVjb25kaXRpb25GYWlsdXJlLlZpb2xhdGlvbho/CglWaW9sYXRpb24SDAoEdHlwZRgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJIswBCgpCYWRSZXF1ZXN0Ej8KEGZpZWxkX3Zpb2xhdGlvbnMYASADKAsyJS5nb29nbGUucnBjLkJhZFJlcXVlc3QuRmllbGRWaW9sYXRpb24afQoORmllbGRWaW9sYXRpb24SDQoFZmllbGQYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSDgoGcmVhc29uGAMgASgJEjcKEWxvY2FsaXplZF9tZXNzYWdlGAQgASgLMhwuZ29vZ2xlLnJwYy5Mb2NhbGl6ZWRNZXNzYWdlIjcKC1JlcXVlc3RJbmZvEhIKCnJlcXVlc3RfaWQYASABKAkSFAoMc2VydmluZ19kYXRhGAIgASgJImAKDFJlc291cmNlSW5mbxIVCg1yZXNvdXJjZV90eXBlGAEgASgJEhUKDXJlc291cmNlX25hbWUYAiABKAkSDQoFb3duZXIYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiVgoESGVscBIkCgVsaW5rcxgBIAMoCzIVLmdvb2dsZS5ycGMuSGVscC5MaW5rGigKBExpbmsSEwoLZGVzY3JpcHRpb24YASABKAkSCwoDdXJsGAIgASgJIjMKEExvY2FsaXplZE1lc3NhZ2USDgoGbG9jYWxlGAEgASgJEg8KB21lc3NhZ2UYAiABKAlCbAoOY29tLmdvb2dsZS5ycGNCEUVycm9yRGV0YWlsc1Byb3RvUAFaP2dvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvcnBjL2VycmRldGFpbHM7ZXJyZGV0YWlsc6ICA1JQQ2IGcHJvdG8z", [file_google_protobuf_duration]);
|
|
5875
5875
|
const ErrorInfoSchema = /* @__PURE__ */ messageDesc(file_google_rpc_error_details, 0);
|
|
@@ -5882,6 +5882,7 @@
|
|
|
5882
5882
|
Code2["ErrDummy"] = "ErrDummy";
|
|
5883
5883
|
Code2["ErrNotAttached"] = "ErrNotAttached";
|
|
5884
5884
|
Code2["ErrNotDetached"] = "ErrNotDetached";
|
|
5885
|
+
Code2["ErrSessionNotFound"] = "ErrSessionNotFound";
|
|
5885
5886
|
Code2["ErrDocumentRemoved"] = "ErrDocumentRemoved";
|
|
5886
5887
|
Code2["ErrDocumentSizeExceedsLimit"] = "ErrDocumentSizeExceedsLimit";
|
|
5887
5888
|
Code2["ErrDocumentSchemaValidationFailed"] = "ErrDocumentSchemaValidationFailed";
|
|
@@ -20780,12 +20781,25 @@
|
|
|
20780
20781
|
}
|
|
20781
20782
|
class Attachment {
|
|
20782
20783
|
resource;
|
|
20784
|
+
/**
|
|
20785
|
+
* For Documents: the document's resourceID, available at attach time.
|
|
20786
|
+
* For Channels: the server-issued session_id. Starts empty and is
|
|
20787
|
+
* populated after the first `RefreshChannel` first-call response.
|
|
20788
|
+
*/
|
|
20783
20789
|
resourceID;
|
|
20784
20790
|
syncMode;
|
|
20785
20791
|
changeEventReceived;
|
|
20786
20792
|
lastHeartbeatTime;
|
|
20787
20793
|
pollInterval;
|
|
20788
20794
|
pollIntervalPinned;
|
|
20795
|
+
/**
|
|
20796
|
+
* `unsubscribeLocalBroadcast` is set by `attachChannel` when it forwards
|
|
20797
|
+
* a Channel's `local-broadcast` events to the RPC client, and consumed
|
|
20798
|
+
* by `detachInternal` so the subscription does not survive a detach.
|
|
20799
|
+
* Without this, re-attaching a channel accumulates duplicate handlers
|
|
20800
|
+
* on each attach cycle.
|
|
20801
|
+
*/
|
|
20802
|
+
unsubscribeLocalBroadcast;
|
|
20789
20803
|
reconnectStreamDelay;
|
|
20790
20804
|
cancelled;
|
|
20791
20805
|
watchStream;
|
|
@@ -20793,13 +20807,13 @@
|
|
|
20793
20807
|
watchAbortController;
|
|
20794
20808
|
syncPromise;
|
|
20795
20809
|
_detaching = false;
|
|
20796
|
-
constructor(reconnectStreamDelay, resource, resourceID, syncMode, pollInterval = 0, pollIntervalPinned = false) {
|
|
20810
|
+
constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false) {
|
|
20797
20811
|
this.reconnectStreamDelay = reconnectStreamDelay;
|
|
20798
20812
|
this.resource = resource;
|
|
20799
20813
|
this.resourceID = resourceID;
|
|
20800
20814
|
this.syncMode = syncMode;
|
|
20801
20815
|
this.changeEventReceived = syncMode !== void 0 ? false : void 0;
|
|
20802
|
-
this.lastHeartbeatTime =
|
|
20816
|
+
this.lastHeartbeatTime = 0;
|
|
20803
20817
|
this.pollInterval = pollInterval;
|
|
20804
20818
|
this.pollIntervalPinned = pollIntervalPinned;
|
|
20805
20819
|
this.cancelled = false;
|
|
@@ -20961,7 +20975,7 @@
|
|
|
20961
20975
|
};
|
|
20962
20976
|
}
|
|
20963
20977
|
const name$1 = "@yorkie-js/sdk";
|
|
20964
|
-
const version$1 = "0.7.
|
|
20978
|
+
const version$1 = "0.7.10-rc";
|
|
20965
20979
|
const pkg$1 = {
|
|
20966
20980
|
name: name$1,
|
|
20967
20981
|
version: version$1
|
|
@@ -20999,6 +21013,7 @@
|
|
|
20999
21013
|
ChannelEventType2["Broadcast"] = "broadcast";
|
|
21000
21014
|
ChannelEventType2["LocalBroadcast"] = "local-broadcast";
|
|
21001
21015
|
ChannelEventType2["AuthError"] = "auth-error";
|
|
21016
|
+
ChannelEventType2["SyncError"] = "sync-error";
|
|
21002
21017
|
return ChannelEventType2;
|
|
21003
21018
|
})(ChannelEventType || {});
|
|
21004
21019
|
const KeyPathSeparator = ".";
|
|
@@ -21138,6 +21153,13 @@
|
|
|
21138
21153
|
}
|
|
21139
21154
|
});
|
|
21140
21155
|
}
|
|
21156
|
+
if (typeOrTopic === "sync-error") {
|
|
21157
|
+
return this.eventStream.subscribe((event) => {
|
|
21158
|
+
if (event.type === "sync-error") {
|
|
21159
|
+
callback(event);
|
|
21160
|
+
}
|
|
21161
|
+
});
|
|
21162
|
+
}
|
|
21141
21163
|
if (typeOrTopic === "presence") {
|
|
21142
21164
|
return this.eventStream.subscribe((event) => {
|
|
21143
21165
|
if (event.type === "presence-changed" || event.type === "initialized") {
|
|
@@ -21247,13 +21269,14 @@
|
|
|
21247
21269
|
SyncMode2["Polling"] = "polling";
|
|
21248
21270
|
return SyncMode2;
|
|
21249
21271
|
})(SyncMode || {});
|
|
21250
|
-
const
|
|
21272
|
+
const DefaultDocumentPollIntervalMs = 3e3;
|
|
21273
|
+
const DefaultChannelHeartbeatMs = 5e3;
|
|
21251
21274
|
const DefaultClientOptions = {
|
|
21252
21275
|
rpcAddr: "https://api.yorkie.dev",
|
|
21253
21276
|
syncLoopDuration: 50,
|
|
21254
21277
|
retrySyncLoopDelay: 1e3,
|
|
21255
21278
|
reconnectStreamDelay: 1e3,
|
|
21256
|
-
channelHeartbeatInterval:
|
|
21279
|
+
channelHeartbeatInterval: DefaultChannelHeartbeatMs
|
|
21257
21280
|
};
|
|
21258
21281
|
const DefaultBroadcastOptions = {
|
|
21259
21282
|
maxRetries: Infinity,
|
|
@@ -21450,7 +21473,7 @@
|
|
|
21450
21473
|
);
|
|
21451
21474
|
}
|
|
21452
21475
|
const pollIntervalPinned = opts.documentPollInterval !== void 0;
|
|
21453
|
-
const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ?
|
|
21476
|
+
const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
|
|
21454
21477
|
return this.enqueueTask(async () => {
|
|
21455
21478
|
try {
|
|
21456
21479
|
const res = await this.rpcClient.attachDocument(
|
|
@@ -21579,127 +21602,88 @@
|
|
|
21579
21602
|
return this.enqueueTask(task);
|
|
21580
21603
|
}
|
|
21581
21604
|
/**
|
|
21582
|
-
* `
|
|
21583
|
-
*
|
|
21605
|
+
* `attachChannel` attaches the given channel to this client. The channel is
|
|
21606
|
+
* registered locally and the server is notified on the next RefreshChannel
|
|
21607
|
+
* heartbeat.
|
|
21584
21608
|
*/
|
|
21585
21609
|
async attachChannel(channel, opts = {}) {
|
|
21586
|
-
if (!this.isActive()) {
|
|
21587
|
-
throw new YorkieError(
|
|
21588
|
-
Code.ErrClientNotActivated,
|
|
21589
|
-
`${this.key} is not active`
|
|
21590
|
-
);
|
|
21591
|
-
}
|
|
21592
21610
|
if (channel.getStatus() !== ChannelStatus.Detached) {
|
|
21593
21611
|
throw new YorkieError(
|
|
21594
21612
|
Code.ErrNotDetached,
|
|
21595
21613
|
`${channel.getKey()} is not detached`
|
|
21596
21614
|
);
|
|
21597
21615
|
}
|
|
21598
|
-
|
|
21616
|
+
const syncMode = opts.syncMode ?? "realtime";
|
|
21617
|
+
this.assertValidChannelSyncMode(syncMode);
|
|
21618
|
+
if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
|
|
21619
|
+
throw new YorkieError(
|
|
21620
|
+
Code.ErrInvalidArgument,
|
|
21621
|
+
"channelHeartbeatInterval must be greater than 0"
|
|
21622
|
+
);
|
|
21623
|
+
}
|
|
21624
|
+
const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
|
|
21625
|
+
const pollInterval = opts.channelHeartbeatInterval ?? this.channelHeartbeatInterval;
|
|
21599
21626
|
const task = async () => {
|
|
21600
|
-
|
|
21601
|
-
|
|
21602
|
-
|
|
21603
|
-
|
|
21604
|
-
|
|
21605
|
-
|
|
21606
|
-
|
|
21607
|
-
|
|
21608
|
-
|
|
21609
|
-
|
|
21610
|
-
|
|
21611
|
-
|
|
21612
|
-
|
|
21613
|
-
|
|
21614
|
-
|
|
21615
|
-
const syncMode = opts.syncMode ?? "realtime";
|
|
21616
|
-
this.assertValidChannelSyncMode(syncMode);
|
|
21617
|
-
if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
|
|
21618
|
-
throw new YorkieError(
|
|
21619
|
-
Code.ErrInvalidArgument,
|
|
21620
|
-
"channelHeartbeatInterval must be greater than 0"
|
|
21621
|
-
);
|
|
21622
|
-
}
|
|
21623
|
-
const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
|
|
21624
|
-
const pollInterval = pollIntervalPinned ? opts.channelHeartbeatInterval : syncMode === "polling" ? DefaultPollingIntervalMs : this.channelHeartbeatInterval;
|
|
21625
|
-
const attachment = new Attachment(
|
|
21626
|
-
this.reconnectStreamDelay,
|
|
21627
|
-
channel,
|
|
21628
|
-
res.sessionId,
|
|
21629
|
-
syncMode,
|
|
21630
|
-
pollInterval,
|
|
21631
|
-
pollIntervalPinned
|
|
21632
|
-
);
|
|
21633
|
-
channel.subscribe("local-broadcast", (event) => {
|
|
21627
|
+
if (this.id) {
|
|
21628
|
+
channel.setActor(this.id);
|
|
21629
|
+
}
|
|
21630
|
+
const attachment = new Attachment(
|
|
21631
|
+
this.reconnectStreamDelay,
|
|
21632
|
+
channel,
|
|
21633
|
+
"",
|
|
21634
|
+
// sessionID populated on first refresh response
|
|
21635
|
+
syncMode,
|
|
21636
|
+
pollInterval,
|
|
21637
|
+
pollIntervalPinned
|
|
21638
|
+
);
|
|
21639
|
+
attachment.unsubscribeLocalBroadcast = channel.subscribe(
|
|
21640
|
+
"local-broadcast",
|
|
21641
|
+
(event) => {
|
|
21634
21642
|
const { topic, payload, options } = event;
|
|
21635
21643
|
this.broadcast(channel.getKey(), topic, payload, options).catch(
|
|
21636
21644
|
(error) => {
|
|
21637
|
-
if (options?.error)
|
|
21638
|
-
options.error(error);
|
|
21639
|
-
}
|
|
21645
|
+
if (options?.error) options.error(error);
|
|
21640
21646
|
logger.error(`[BC] c:"${this.getKey()}" failed: ${error}`);
|
|
21641
21647
|
}
|
|
21642
21648
|
);
|
|
21643
|
-
});
|
|
21644
|
-
this.attachmentMap.set(channel.getKey(), attachment);
|
|
21645
|
-
if (syncMode === "realtime") {
|
|
21646
|
-
await this.runWatchLoop(channel.getKey());
|
|
21647
21649
|
}
|
|
21648
|
-
|
|
21649
|
-
|
|
21650
|
-
|
|
21651
|
-
|
|
21652
|
-
|
|
21653
|
-
|
|
21654
|
-
|
|
21655
|
-
throw err;
|
|
21650
|
+
);
|
|
21651
|
+
this.attachmentMap.set(channel.getKey(), attachment);
|
|
21652
|
+
if (!this.conditions[
|
|
21653
|
+
"SyncLoop"
|
|
21654
|
+
/* SyncLoop */
|
|
21655
|
+
]) {
|
|
21656
|
+
this.runSyncLoop();
|
|
21656
21657
|
}
|
|
21658
|
+
logger.info(
|
|
21659
|
+
`[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode}`
|
|
21660
|
+
);
|
|
21661
|
+
return channel;
|
|
21657
21662
|
};
|
|
21658
21663
|
return this.enqueueTask(task);
|
|
21659
21664
|
}
|
|
21660
21665
|
/**
|
|
21661
|
-
* `detachChannel` detaches the given channel from this client.
|
|
21662
|
-
*
|
|
21666
|
+
* `detachChannel` detaches the given channel from this client. The detach
|
|
21667
|
+
* is a local cleanup; the server reclaims the session via TTL when
|
|
21668
|
+
* heartbeats stop.
|
|
21663
21669
|
*/
|
|
21664
21670
|
async detachChannel(channel) {
|
|
21665
|
-
|
|
21666
|
-
|
|
21667
|
-
Code.ErrClientNotActivated,
|
|
21668
|
-
`${this.key} is not active`
|
|
21669
|
-
);
|
|
21670
|
-
}
|
|
21671
|
-
if (!this.attachmentMap.has(channel.getKey())) {
|
|
21671
|
+
const attachment = this.attachmentMap.get(channel.getKey());
|
|
21672
|
+
if (!attachment) {
|
|
21672
21673
|
throw new YorkieError(
|
|
21673
21674
|
Code.ErrNotAttached,
|
|
21674
21675
|
`${channel.getKey()} is not attached`
|
|
21675
21676
|
);
|
|
21676
21677
|
}
|
|
21678
|
+
attachment.markDetaching();
|
|
21679
|
+
await attachment.waitForSyncComplete();
|
|
21677
21680
|
const task = async () => {
|
|
21678
|
-
|
|
21679
|
-
|
|
21680
|
-
|
|
21681
|
-
|
|
21682
|
-
|
|
21683
|
-
|
|
21684
|
-
},
|
|
21685
|
-
{
|
|
21686
|
-
headers: {
|
|
21687
|
-
"x-shard-key": `${this.apiKey}/${channel.getFirstKeyPath()}`
|
|
21688
|
-
}
|
|
21689
|
-
}
|
|
21690
|
-
);
|
|
21691
|
-
channel.updateSessionCount(Number(res.sessionCount), 0);
|
|
21692
|
-
channel.applyStatus(ChannelStatus.Detached);
|
|
21693
|
-
this.detachInternal(channel.getKey());
|
|
21694
|
-
logger.info(
|
|
21695
|
-
`[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" count:${channel.getSessionCount()}`
|
|
21696
|
-
);
|
|
21697
|
-
return channel;
|
|
21698
|
-
} catch (err) {
|
|
21699
|
-
logger.error(`[DP] c:"${this.getKey()}" err :`, err);
|
|
21700
|
-
await this.handleConnectError(err);
|
|
21701
|
-
throw err;
|
|
21702
|
-
}
|
|
21681
|
+
channel.applyStatus(ChannelStatus.Detached);
|
|
21682
|
+
this.detachInternal(channel.getKey());
|
|
21683
|
+
logger.info(
|
|
21684
|
+
`[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" (local)`
|
|
21685
|
+
);
|
|
21686
|
+
return channel;
|
|
21703
21687
|
};
|
|
21704
21688
|
return this.enqueueTask(task);
|
|
21705
21689
|
}
|
|
@@ -21740,7 +21724,7 @@
|
|
|
21740
21724
|
attachment.changeEventReceived = true;
|
|
21741
21725
|
}
|
|
21742
21726
|
if (!attachment.pollIntervalPinned) {
|
|
21743
|
-
attachment.pollInterval = syncMode === "polling" ?
|
|
21727
|
+
attachment.pollInterval = syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
|
|
21744
21728
|
}
|
|
21745
21729
|
if ((prevSyncMode === "manual" || prevSyncMode === "polling") && syncMode !== "manual" && syncMode !== "polling") {
|
|
21746
21730
|
attachment.resetCancelled();
|
|
@@ -21761,12 +21745,6 @@
|
|
|
21761
21745
|
}
|
|
21762
21746
|
}
|
|
21763
21747
|
async changeChannelSyncMode(channel, syncMode) {
|
|
21764
|
-
if (!this.isActive()) {
|
|
21765
|
-
throw new YorkieError(
|
|
21766
|
-
Code.ErrClientNotActivated,
|
|
21767
|
-
`${this.key} is not active`
|
|
21768
|
-
);
|
|
21769
|
-
}
|
|
21770
21748
|
const attachment = this.attachmentMap.get(channel.getKey());
|
|
21771
21749
|
if (!attachment) {
|
|
21772
21750
|
throw new YorkieError(
|
|
@@ -21784,7 +21762,7 @@
|
|
|
21784
21762
|
}
|
|
21785
21763
|
attachment.changeSyncMode(syncMode);
|
|
21786
21764
|
if (!attachment.pollIntervalPinned) {
|
|
21787
|
-
attachment.pollInterval = syncMode === "
|
|
21765
|
+
attachment.pollInterval = syncMode === "manual" ? 0 : this.channelHeartbeatInterval;
|
|
21788
21766
|
}
|
|
21789
21767
|
if (syncMode === "realtime") {
|
|
21790
21768
|
attachment.resetCancelled();
|
|
@@ -21796,7 +21774,7 @@
|
|
|
21796
21774
|
* `sync` implementation that handles both Document and Channel.
|
|
21797
21775
|
*/
|
|
21798
21776
|
sync(resource) {
|
|
21799
|
-
if (!this.isActive()) {
|
|
21777
|
+
if (!(resource instanceof Channel) && !this.isActive()) {
|
|
21800
21778
|
throw new YorkieError(
|
|
21801
21779
|
Code.ErrClientNotActivated,
|
|
21802
21780
|
`${this.key} is not active`
|
|
@@ -22123,12 +22101,6 @@
|
|
|
22123
22101
|
* subscribe to channel events. Polling is the caller's responsibility.
|
|
22124
22102
|
*/
|
|
22125
22103
|
async peekChannel(channelKey) {
|
|
22126
|
-
if (!this.isActive()) {
|
|
22127
|
-
throw new YorkieError(
|
|
22128
|
-
Code.ErrClientNotActivated,
|
|
22129
|
-
`${this.key} is not active`
|
|
22130
|
-
);
|
|
22131
|
-
}
|
|
22132
22104
|
return this.enqueueTask(async () => {
|
|
22133
22105
|
const firstKeyPath = channelKey.split(".")[0];
|
|
22134
22106
|
const res = await this.rpcClient.peekChannel(
|
|
@@ -22146,12 +22118,6 @@
|
|
|
22146
22118
|
* `broadcast` broadcasts the given payload to the given topic.
|
|
22147
22119
|
*/
|
|
22148
22120
|
async broadcast(key, topic, payload, options) {
|
|
22149
|
-
if (!this.isActive()) {
|
|
22150
|
-
throw new YorkieError(
|
|
22151
|
-
Code.ErrClientNotActivated,
|
|
22152
|
-
`${this.key} is not active`
|
|
22153
|
-
);
|
|
22154
|
-
}
|
|
22155
22121
|
const attachment = this.attachmentMap.get(key);
|
|
22156
22122
|
if (!attachment) {
|
|
22157
22123
|
throw new YorkieError(Code.ErrNotAttached, `${key} is not attached`);
|
|
@@ -22228,8 +22194,16 @@
|
|
|
22228
22194
|
*/
|
|
22229
22195
|
runSyncLoop() {
|
|
22230
22196
|
const doLoop = async () => {
|
|
22231
|
-
if (
|
|
22232
|
-
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
|
|
22197
|
+
if (this.deactivating) {
|
|
22198
|
+
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (deactivating)`);
|
|
22199
|
+
this.conditions[
|
|
22200
|
+
"SyncLoop"
|
|
22201
|
+
/* SyncLoop */
|
|
22202
|
+
] = false;
|
|
22203
|
+
return;
|
|
22204
|
+
}
|
|
22205
|
+
if (!this.isActive() && this.attachmentMap.size === 0) {
|
|
22206
|
+
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (idle)`);
|
|
22233
22207
|
this.conditions[
|
|
22234
22208
|
"SyncLoop"
|
|
22235
22209
|
/* SyncLoop */
|
|
@@ -22615,6 +22589,10 @@
|
|
|
22615
22589
|
return;
|
|
22616
22590
|
}
|
|
22617
22591
|
attachment.cancelWatchStream();
|
|
22592
|
+
if (attachment.unsubscribeLocalBroadcast) {
|
|
22593
|
+
attachment.unsubscribeLocalBroadcast();
|
|
22594
|
+
attachment.unsubscribeLocalBroadcast = void 0;
|
|
22595
|
+
}
|
|
22618
22596
|
if (attachment.resource instanceof Document) {
|
|
22619
22597
|
attachment.resource.resetOnlineClients();
|
|
22620
22598
|
}
|
|
@@ -22623,12 +22601,17 @@
|
|
|
22623
22601
|
async syncInternal(attachment, syncMode) {
|
|
22624
22602
|
const { resource } = attachment;
|
|
22625
22603
|
if (resource instanceof Channel) {
|
|
22604
|
+
const isFirstCall = !resource.getSessionID();
|
|
22626
22605
|
try {
|
|
22627
22606
|
const res = await this.rpcClient.refreshChannel(
|
|
22628
22607
|
{
|
|
22629
|
-
clientId: this.id,
|
|
22608
|
+
clientId: this.id ?? "",
|
|
22630
22609
|
channelKey: resource.getKey(),
|
|
22631
|
-
sessionId: resource.getSessionID()
|
|
22610
|
+
sessionId: resource.getSessionID() ?? "",
|
|
22611
|
+
// First-call only — these fields are ignored by the server
|
|
22612
|
+
// once a session_id is established.
|
|
22613
|
+
clientKey: isFirstCall ? this.key : "",
|
|
22614
|
+
metadata: isFirstCall ? this.metadata : {}
|
|
22632
22615
|
},
|
|
22633
22616
|
{
|
|
22634
22617
|
headers: {
|
|
@@ -22636,6 +22619,31 @@
|
|
|
22636
22619
|
}
|
|
22637
22620
|
}
|
|
22638
22621
|
);
|
|
22622
|
+
if (isFirstCall) {
|
|
22623
|
+
if (this.deactivating || attachment.isDetaching()) {
|
|
22624
|
+
return resource;
|
|
22625
|
+
}
|
|
22626
|
+
if (res.clientId && !this.id) {
|
|
22627
|
+
this.id = res.clientId;
|
|
22628
|
+
this.status = "activated";
|
|
22629
|
+
resource.setActor(res.clientId);
|
|
22630
|
+
} else if (this.id) {
|
|
22631
|
+
resource.setActor(this.id);
|
|
22632
|
+
}
|
|
22633
|
+
if (res.sessionId) {
|
|
22634
|
+
resource.setSessionID(res.sessionId);
|
|
22635
|
+
attachment.resourceID = res.sessionId;
|
|
22636
|
+
resource.applyStatus(ChannelStatus.Attached);
|
|
22637
|
+
}
|
|
22638
|
+
if (attachment.syncMode === "realtime") {
|
|
22639
|
+
this.runWatchLoop(resource.getKey()).catch((err) => {
|
|
22640
|
+
logger.error(
|
|
22641
|
+
`[WP] c:"${this.getKey()}" failed to start watch for p:"${resource.getKey()}":`,
|
|
22642
|
+
err
|
|
22643
|
+
);
|
|
22644
|
+
});
|
|
22645
|
+
}
|
|
22646
|
+
}
|
|
22639
22647
|
const prevCount = resource.getSessionCount();
|
|
22640
22648
|
if (resource.updateSessionCount(Number(res.sessionCount), 0)) {
|
|
22641
22649
|
if (resource.getSessionCount() !== prevCount) {
|
|
@@ -22650,6 +22658,21 @@
|
|
|
22650
22658
|
`[RP] c:"${this.getKey()}" refreshes p:"${resource.getKey()}" mode:${attachment.syncMode}`
|
|
22651
22659
|
);
|
|
22652
22660
|
} catch (err) {
|
|
22661
|
+
if (isErrorCode(err, Code.ErrSessionNotFound)) {
|
|
22662
|
+
logger.info(
|
|
22663
|
+
`[RP] c:"${this.getKey()}" session expired for p:"${resource.getKey()}", re-attaching`
|
|
22664
|
+
);
|
|
22665
|
+
resource.setSessionID("");
|
|
22666
|
+
attachment.resourceID = "";
|
|
22667
|
+
return resource;
|
|
22668
|
+
}
|
|
22669
|
+
if (!this.deactivating && !attachment.isDetaching()) {
|
|
22670
|
+
resource.publish({
|
|
22671
|
+
type: ChannelEventType.SyncError,
|
|
22672
|
+
error: err,
|
|
22673
|
+
method: "RefreshChannel"
|
|
22674
|
+
});
|
|
22675
|
+
}
|
|
22653
22676
|
logger.error(`[RP] c:"${this.getKey()}" err :`, err);
|
|
22654
22677
|
throw err;
|
|
22655
22678
|
}
|
|
@@ -23000,7 +23023,7 @@
|
|
|
23000
23023
|
};
|
|
23001
23024
|
}
|
|
23002
23025
|
const name = "@yorkie-js/react";
|
|
23003
|
-
const version = "0.7.
|
|
23026
|
+
const version = "0.7.10-rc";
|
|
23004
23027
|
const pkg = {
|
|
23005
23028
|
name,
|
|
23006
23029
|
version
|
|
@@ -23010,7 +23033,7 @@
|
|
|
23010
23033
|
loading: true,
|
|
23011
23034
|
error: void 0
|
|
23012
23035
|
});
|
|
23013
|
-
function useYorkieClient(opts) {
|
|
23036
|
+
function useYorkieClient(opts, activate = true) {
|
|
23014
23037
|
const [client, setClient] = react.useState(void 0);
|
|
23015
23038
|
const [loading, setLoading] = react.useState(true);
|
|
23016
23039
|
const [error, setError] = react.useState(void 0);
|
|
@@ -23027,7 +23050,9 @@
|
|
|
23027
23050
|
}
|
|
23028
23051
|
try {
|
|
23029
23052
|
const newClient = new Client(opts);
|
|
23030
|
-
|
|
23053
|
+
if (activate) {
|
|
23054
|
+
await newClient.activate();
|
|
23055
|
+
}
|
|
23031
23056
|
setClient(newClient);
|
|
23032
23057
|
} catch (e) {
|
|
23033
23058
|
setError(
|
|
@@ -23039,24 +23064,21 @@
|
|
|
23039
23064
|
}
|
|
23040
23065
|
activateClient();
|
|
23041
23066
|
return () => {
|
|
23042
|
-
if (client?.isActive()) {
|
|
23067
|
+
if (activate && client?.isActive()) {
|
|
23043
23068
|
client.deactivate({ keepalive: true });
|
|
23044
23069
|
}
|
|
23045
23070
|
};
|
|
23046
|
-
}, [opts.apiKey, opts.rpcAddr, didMount]);
|
|
23071
|
+
}, [opts.apiKey, opts.rpcAddr, didMount, activate]);
|
|
23047
23072
|
return { client, loading, error };
|
|
23048
23073
|
}
|
|
23049
|
-
const YorkieProvider = ({
|
|
23050
|
-
children,
|
|
23051
|
-
...opts
|
|
23052
|
-
}) => {
|
|
23074
|
+
const YorkieProvider = ({ children, activate = true, ...opts }) => {
|
|
23053
23075
|
const clientOpts = react.useMemo(() => {
|
|
23054
23076
|
return {
|
|
23055
23077
|
userAgent: pkg.name + "/" + pkg.version,
|
|
23056
23078
|
...opts
|
|
23057
23079
|
};
|
|
23058
23080
|
}, [opts.apiKey, opts.rpcAddr]);
|
|
23059
|
-
const { client, loading, error } = useYorkieClient(clientOpts);
|
|
23081
|
+
const { client, loading, error } = useYorkieClient(clientOpts, activate);
|
|
23060
23082
|
return /* @__PURE__ */ jsxRuntime.jsx(YorkieContext.Provider, { value: { client, loading, error }, children });
|
|
23061
23083
|
};
|
|
23062
23084
|
const useYorkie = () => {
|
|
@@ -23492,7 +23514,7 @@
|
|
|
23492
23514
|
}
|
|
23493
23515
|
let unsubscribe;
|
|
23494
23516
|
async function attachChannel() {
|
|
23495
|
-
if (!client
|
|
23517
|
+
if (!client) {
|
|
23496
23518
|
return;
|
|
23497
23519
|
}
|
|
23498
23520
|
channelStore.setState((state) => ({
|
|
@@ -23502,20 +23524,49 @@
|
|
|
23502
23524
|
}));
|
|
23503
23525
|
try {
|
|
23504
23526
|
const newChannel = new Channel(channelKey);
|
|
23505
|
-
await client.attach(newChannel, {
|
|
23527
|
+
await client.attach(newChannel, {
|
|
23528
|
+
syncMode,
|
|
23529
|
+
channelHeartbeatInterval
|
|
23530
|
+
});
|
|
23506
23531
|
channelRef.current = newChannel;
|
|
23507
|
-
unsubscribe = newChannel.subscribe(() => {
|
|
23532
|
+
unsubscribe = newChannel.subscribe((event) => {
|
|
23533
|
+
if (event.type === ChannelEventType.SyncError || event.type === ChannelEventType.AuthError) {
|
|
23534
|
+
const nextError = event.type === ChannelEventType.SyncError ? event.error instanceof Error ? event.error : new Error(String(event.error)) : new Error(
|
|
23535
|
+
`auth error during ${event.method}: ${event.reason}`
|
|
23536
|
+
);
|
|
23537
|
+
channelStore.setState((state) => ({
|
|
23538
|
+
...state,
|
|
23539
|
+
loading: false,
|
|
23540
|
+
error: nextError
|
|
23541
|
+
}));
|
|
23542
|
+
return;
|
|
23543
|
+
}
|
|
23544
|
+
const recovers = event.type === ChannelEventType.PresenceChanged || event.type === ChannelEventType.Initialized || event.type === ChannelEventType.Broadcast;
|
|
23545
|
+
const ready = newChannel.isAttached() && !!newChannel.getSessionID();
|
|
23508
23546
|
channelStore.setState((state) => ({
|
|
23509
23547
|
...state,
|
|
23510
|
-
sessionCount: newChannel.getSessionCount()
|
|
23548
|
+
sessionCount: newChannel.getSessionCount(),
|
|
23549
|
+
...recovers && state.error ? { error: void 0 } : {},
|
|
23550
|
+
...ready && state.loading ? { loading: false } : {}
|
|
23511
23551
|
}));
|
|
23512
23552
|
});
|
|
23513
|
-
|
|
23553
|
+
const detach = async () => {
|
|
23554
|
+
if (!client) return;
|
|
23555
|
+
try {
|
|
23556
|
+
await client.detach(newChannel);
|
|
23557
|
+
} catch (err) {
|
|
23558
|
+
if (err instanceof Error && /not attached/i.test(err.message)) {
|
|
23559
|
+
return;
|
|
23560
|
+
}
|
|
23561
|
+
throw err;
|
|
23562
|
+
}
|
|
23563
|
+
};
|
|
23564
|
+
channelStore.setState((state) => ({
|
|
23565
|
+
...state,
|
|
23514
23566
|
channel: newChannel,
|
|
23515
|
-
|
|
23516
|
-
|
|
23517
|
-
|
|
23518
|
-
});
|
|
23567
|
+
error: void 0,
|
|
23568
|
+
detach
|
|
23569
|
+
}));
|
|
23519
23570
|
} catch (e) {
|
|
23520
23571
|
channelStore.setState((state) => ({
|
|
23521
23572
|
...state,
|
|
@@ -23530,10 +23581,13 @@
|
|
|
23530
23581
|
unsubscribe();
|
|
23531
23582
|
}
|
|
23532
23583
|
async function detachChannel() {
|
|
23533
|
-
if (channelRef.current && client
|
|
23584
|
+
if (channelRef.current && client) {
|
|
23534
23585
|
try {
|
|
23535
23586
|
await client.detach(channelRef.current);
|
|
23536
23587
|
} catch (e) {
|
|
23588
|
+
if (e instanceof Error && /not attached/i.test(e.message)) {
|
|
23589
|
+
return;
|
|
23590
|
+
}
|
|
23537
23591
|
console.error("Failed to detach channel:", e);
|
|
23538
23592
|
}
|
|
23539
23593
|
}
|
|
@@ -23566,7 +23620,11 @@
|
|
|
23566
23620
|
channel: void 0,
|
|
23567
23621
|
sessionCount: 0,
|
|
23568
23622
|
loading: true,
|
|
23569
|
-
error: void 0
|
|
23623
|
+
error: void 0,
|
|
23624
|
+
// Placeholder until `useYorkieChannel` wires up the real detach.
|
|
23625
|
+
// Pre-attach calls are a no-op rather than a throw.
|
|
23626
|
+
detach: async () => {
|
|
23627
|
+
}
|
|
23570
23628
|
});
|
|
23571
23629
|
}
|
|
23572
23630
|
const channelStore = channelStoreRef.current;
|
|
@@ -23594,7 +23652,8 @@
|
|
|
23594
23652
|
const sessionCount = useSelector(channelStore, (state) => state.sessionCount);
|
|
23595
23653
|
const loading = useSelector(channelStore, (state) => state.loading);
|
|
23596
23654
|
const error = useSelector(channelStore, (state) => state.error);
|
|
23597
|
-
|
|
23655
|
+
const detach = useSelector(channelStore, (state) => state.detach);
|
|
23656
|
+
return { sessionCount, loading, error, detach };
|
|
23598
23657
|
};
|
|
23599
23658
|
const useChannelSessionCount = () => {
|
|
23600
23659
|
const channelStore = useChannelStore("useChannelSessionCount");
|
|
@@ -23616,7 +23675,7 @@
|
|
|
23616
23675
|
};
|
|
23617
23676
|
}, []);
|
|
23618
23677
|
const peekOnce = react.useCallback(async () => {
|
|
23619
|
-
if (!client
|
|
23678
|
+
if (!client) return;
|
|
23620
23679
|
if (mountedRef.current) setLoading(true);
|
|
23621
23680
|
try {
|
|
23622
23681
|
const count = await client.peekChannel(channelKeyRef.current);
|
|
@@ -23645,7 +23704,7 @@
|
|
|
23645
23704
|
let cancelled = false;
|
|
23646
23705
|
let timer;
|
|
23647
23706
|
const run = async () => {
|
|
23648
|
-
if (cancelled
|
|
23707
|
+
if (cancelled) return;
|
|
23649
23708
|
try {
|
|
23650
23709
|
const count = await client.peekChannel(channelKey);
|
|
23651
23710
|
if (cancelled) return;
|