@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
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-rc2";
|
|
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,
|
|
@@ -21312,10 +21335,43 @@
|
|
|
21312
21335
|
baseUrl: rpcAddr,
|
|
21313
21336
|
interceptors: [authInterceptor, createMetricInterceptor(opts?.userAgent)],
|
|
21314
21337
|
fetch: (input, init) => {
|
|
21338
|
+
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
21339
|
+
if (/\/yorkie\.v1\.YorkieService\/Watch/.test(url)) {
|
|
21340
|
+
return fetch(input, {
|
|
21341
|
+
...init,
|
|
21342
|
+
keepalive: this.keepalive
|
|
21343
|
+
});
|
|
21344
|
+
}
|
|
21345
|
+
const callerSignal = init?.signal ?? (input instanceof Request ? input.signal : void 0);
|
|
21346
|
+
const innerAC = new AbortController();
|
|
21347
|
+
let onCallerAbort;
|
|
21348
|
+
if (callerSignal) {
|
|
21349
|
+
if (callerSignal.aborted) {
|
|
21350
|
+
innerAC.abort(callerSignal.reason);
|
|
21351
|
+
} else {
|
|
21352
|
+
onCallerAbort = () => innerAC.abort(callerSignal.reason);
|
|
21353
|
+
callerSignal.addEventListener("abort", onCallerAbort);
|
|
21354
|
+
}
|
|
21355
|
+
}
|
|
21356
|
+
const detach = () => {
|
|
21357
|
+
if (callerSignal && onCallerAbort) {
|
|
21358
|
+
callerSignal.removeEventListener("abort", onCallerAbort);
|
|
21359
|
+
}
|
|
21360
|
+
};
|
|
21315
21361
|
return fetch(input, {
|
|
21316
21362
|
...init,
|
|
21363
|
+
signal: innerAC.signal,
|
|
21317
21364
|
keepalive: this.keepalive
|
|
21318
|
-
})
|
|
21365
|
+
}).then(
|
|
21366
|
+
(res) => {
|
|
21367
|
+
detach();
|
|
21368
|
+
return res;
|
|
21369
|
+
},
|
|
21370
|
+
(err) => {
|
|
21371
|
+
detach();
|
|
21372
|
+
throw err;
|
|
21373
|
+
}
|
|
21374
|
+
);
|
|
21319
21375
|
}
|
|
21320
21376
|
};
|
|
21321
21377
|
this.rpcClient = createClient(
|
|
@@ -21450,7 +21506,7 @@
|
|
|
21450
21506
|
);
|
|
21451
21507
|
}
|
|
21452
21508
|
const pollIntervalPinned = opts.documentPollInterval !== void 0;
|
|
21453
|
-
const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ?
|
|
21509
|
+
const pollInterval = pollIntervalPinned ? opts.documentPollInterval : syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
|
|
21454
21510
|
return this.enqueueTask(async () => {
|
|
21455
21511
|
try {
|
|
21456
21512
|
const res = await this.rpcClient.attachDocument(
|
|
@@ -21579,127 +21635,88 @@
|
|
|
21579
21635
|
return this.enqueueTask(task);
|
|
21580
21636
|
}
|
|
21581
21637
|
/**
|
|
21582
|
-
* `
|
|
21583
|
-
*
|
|
21638
|
+
* `attachChannel` attaches the given channel to this client. The channel is
|
|
21639
|
+
* registered locally and the server is notified on the next RefreshChannel
|
|
21640
|
+
* heartbeat.
|
|
21584
21641
|
*/
|
|
21585
21642
|
async attachChannel(channel, opts = {}) {
|
|
21586
|
-
if (!this.isActive()) {
|
|
21587
|
-
throw new YorkieError(
|
|
21588
|
-
Code.ErrClientNotActivated,
|
|
21589
|
-
`${this.key} is not active`
|
|
21590
|
-
);
|
|
21591
|
-
}
|
|
21592
21643
|
if (channel.getStatus() !== ChannelStatus.Detached) {
|
|
21593
21644
|
throw new YorkieError(
|
|
21594
21645
|
Code.ErrNotDetached,
|
|
21595
21646
|
`${channel.getKey()} is not detached`
|
|
21596
21647
|
);
|
|
21597
21648
|
}
|
|
21598
|
-
|
|
21649
|
+
const syncMode = opts.syncMode ?? "realtime";
|
|
21650
|
+
this.assertValidChannelSyncMode(syncMode);
|
|
21651
|
+
if (opts.channelHeartbeatInterval !== void 0 && opts.channelHeartbeatInterval <= 0) {
|
|
21652
|
+
throw new YorkieError(
|
|
21653
|
+
Code.ErrInvalidArgument,
|
|
21654
|
+
"channelHeartbeatInterval must be greater than 0"
|
|
21655
|
+
);
|
|
21656
|
+
}
|
|
21657
|
+
const pollIntervalPinned = opts.channelHeartbeatInterval !== void 0;
|
|
21658
|
+
const pollInterval = opts.channelHeartbeatInterval ?? this.channelHeartbeatInterval;
|
|
21599
21659
|
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) => {
|
|
21660
|
+
if (this.id) {
|
|
21661
|
+
channel.setActor(this.id);
|
|
21662
|
+
}
|
|
21663
|
+
const attachment = new Attachment(
|
|
21664
|
+
this.reconnectStreamDelay,
|
|
21665
|
+
channel,
|
|
21666
|
+
"",
|
|
21667
|
+
// sessionID populated on first refresh response
|
|
21668
|
+
syncMode,
|
|
21669
|
+
pollInterval,
|
|
21670
|
+
pollIntervalPinned
|
|
21671
|
+
);
|
|
21672
|
+
attachment.unsubscribeLocalBroadcast = channel.subscribe(
|
|
21673
|
+
"local-broadcast",
|
|
21674
|
+
(event) => {
|
|
21634
21675
|
const { topic, payload, options } = event;
|
|
21635
21676
|
this.broadcast(channel.getKey(), topic, payload, options).catch(
|
|
21636
21677
|
(error) => {
|
|
21637
|
-
if (options?.error)
|
|
21638
|
-
options.error(error);
|
|
21639
|
-
}
|
|
21678
|
+
if (options?.error) options.error(error);
|
|
21640
21679
|
logger.error(`[BC] c:"${this.getKey()}" failed: ${error}`);
|
|
21641
21680
|
}
|
|
21642
21681
|
);
|
|
21643
|
-
});
|
|
21644
|
-
this.attachmentMap.set(channel.getKey(), attachment);
|
|
21645
|
-
if (syncMode === "realtime") {
|
|
21646
|
-
await this.runWatchLoop(channel.getKey());
|
|
21647
21682
|
}
|
|
21648
|
-
|
|
21649
|
-
|
|
21650
|
-
|
|
21651
|
-
|
|
21652
|
-
|
|
21653
|
-
|
|
21654
|
-
|
|
21655
|
-
throw err;
|
|
21683
|
+
);
|
|
21684
|
+
this.attachmentMap.set(channel.getKey(), attachment);
|
|
21685
|
+
if (!this.conditions[
|
|
21686
|
+
"SyncLoop"
|
|
21687
|
+
/* SyncLoop */
|
|
21688
|
+
]) {
|
|
21689
|
+
this.runSyncLoop();
|
|
21656
21690
|
}
|
|
21691
|
+
logger.info(
|
|
21692
|
+
`[AP] c:"${this.getKey()}" attaches p:"${channel.getKey()}" mode:${syncMode}`
|
|
21693
|
+
);
|
|
21694
|
+
return channel;
|
|
21657
21695
|
};
|
|
21658
21696
|
return this.enqueueTask(task);
|
|
21659
21697
|
}
|
|
21660
21698
|
/**
|
|
21661
|
-
* `detachChannel` detaches the given channel from this client.
|
|
21662
|
-
*
|
|
21699
|
+
* `detachChannel` detaches the given channel from this client. The detach
|
|
21700
|
+
* is a local cleanup; the server reclaims the session via TTL when
|
|
21701
|
+
* heartbeats stop.
|
|
21663
21702
|
*/
|
|
21664
21703
|
async detachChannel(channel) {
|
|
21665
|
-
|
|
21666
|
-
|
|
21667
|
-
Code.ErrClientNotActivated,
|
|
21668
|
-
`${this.key} is not active`
|
|
21669
|
-
);
|
|
21670
|
-
}
|
|
21671
|
-
if (!this.attachmentMap.has(channel.getKey())) {
|
|
21704
|
+
const attachment = this.attachmentMap.get(channel.getKey());
|
|
21705
|
+
if (!attachment) {
|
|
21672
21706
|
throw new YorkieError(
|
|
21673
21707
|
Code.ErrNotAttached,
|
|
21674
21708
|
`${channel.getKey()} is not attached`
|
|
21675
21709
|
);
|
|
21676
21710
|
}
|
|
21711
|
+
attachment.markDetaching();
|
|
21712
|
+
await attachment.waitForSyncComplete();
|
|
21677
21713
|
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
|
-
}
|
|
21714
|
+
channel.applyStatus(ChannelStatus.Detached);
|
|
21715
|
+
this.detachInternal(channel.getKey());
|
|
21716
|
+
logger.info(
|
|
21717
|
+
`[DP] c:"${this.getKey()}" detaches p:"${channel.getKey()}" (local)`
|
|
21718
|
+
);
|
|
21719
|
+
return channel;
|
|
21703
21720
|
};
|
|
21704
21721
|
return this.enqueueTask(task);
|
|
21705
21722
|
}
|
|
@@ -21740,7 +21757,7 @@
|
|
|
21740
21757
|
attachment.changeEventReceived = true;
|
|
21741
21758
|
}
|
|
21742
21759
|
if (!attachment.pollIntervalPinned) {
|
|
21743
|
-
attachment.pollInterval = syncMode === "polling" ?
|
|
21760
|
+
attachment.pollInterval = syncMode === "polling" ? DefaultDocumentPollIntervalMs : 0;
|
|
21744
21761
|
}
|
|
21745
21762
|
if ((prevSyncMode === "manual" || prevSyncMode === "polling") && syncMode !== "manual" && syncMode !== "polling") {
|
|
21746
21763
|
attachment.resetCancelled();
|
|
@@ -21761,12 +21778,6 @@
|
|
|
21761
21778
|
}
|
|
21762
21779
|
}
|
|
21763
21780
|
async changeChannelSyncMode(channel, syncMode) {
|
|
21764
|
-
if (!this.isActive()) {
|
|
21765
|
-
throw new YorkieError(
|
|
21766
|
-
Code.ErrClientNotActivated,
|
|
21767
|
-
`${this.key} is not active`
|
|
21768
|
-
);
|
|
21769
|
-
}
|
|
21770
21781
|
const attachment = this.attachmentMap.get(channel.getKey());
|
|
21771
21782
|
if (!attachment) {
|
|
21772
21783
|
throw new YorkieError(
|
|
@@ -21784,7 +21795,7 @@
|
|
|
21784
21795
|
}
|
|
21785
21796
|
attachment.changeSyncMode(syncMode);
|
|
21786
21797
|
if (!attachment.pollIntervalPinned) {
|
|
21787
|
-
attachment.pollInterval = syncMode === "
|
|
21798
|
+
attachment.pollInterval = syncMode === "manual" ? 0 : this.channelHeartbeatInterval;
|
|
21788
21799
|
}
|
|
21789
21800
|
if (syncMode === "realtime") {
|
|
21790
21801
|
attachment.resetCancelled();
|
|
@@ -21796,7 +21807,7 @@
|
|
|
21796
21807
|
* `sync` implementation that handles both Document and Channel.
|
|
21797
21808
|
*/
|
|
21798
21809
|
sync(resource) {
|
|
21799
|
-
if (!this.isActive()) {
|
|
21810
|
+
if (!(resource instanceof Channel) && !this.isActive()) {
|
|
21800
21811
|
throw new YorkieError(
|
|
21801
21812
|
Code.ErrClientNotActivated,
|
|
21802
21813
|
`${this.key} is not active`
|
|
@@ -22123,12 +22134,6 @@
|
|
|
22123
22134
|
* subscribe to channel events. Polling is the caller's responsibility.
|
|
22124
22135
|
*/
|
|
22125
22136
|
async peekChannel(channelKey) {
|
|
22126
|
-
if (!this.isActive()) {
|
|
22127
|
-
throw new YorkieError(
|
|
22128
|
-
Code.ErrClientNotActivated,
|
|
22129
|
-
`${this.key} is not active`
|
|
22130
|
-
);
|
|
22131
|
-
}
|
|
22132
22137
|
return this.enqueueTask(async () => {
|
|
22133
22138
|
const firstKeyPath = channelKey.split(".")[0];
|
|
22134
22139
|
const res = await this.rpcClient.peekChannel(
|
|
@@ -22146,12 +22151,6 @@
|
|
|
22146
22151
|
* `broadcast` broadcasts the given payload to the given topic.
|
|
22147
22152
|
*/
|
|
22148
22153
|
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
22154
|
const attachment = this.attachmentMap.get(key);
|
|
22156
22155
|
if (!attachment) {
|
|
22157
22156
|
throw new YorkieError(Code.ErrNotAttached, `${key} is not attached`);
|
|
@@ -22228,8 +22227,16 @@
|
|
|
22228
22227
|
*/
|
|
22229
22228
|
runSyncLoop() {
|
|
22230
22229
|
const doLoop = async () => {
|
|
22231
|
-
if (
|
|
22232
|
-
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
|
|
22230
|
+
if (this.deactivating) {
|
|
22231
|
+
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (deactivating)`);
|
|
22232
|
+
this.conditions[
|
|
22233
|
+
"SyncLoop"
|
|
22234
|
+
/* SyncLoop */
|
|
22235
|
+
] = false;
|
|
22236
|
+
return;
|
|
22237
|
+
}
|
|
22238
|
+
if (!this.isActive() && this.attachmentMap.size === 0) {
|
|
22239
|
+
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop (idle)`);
|
|
22233
22240
|
this.conditions[
|
|
22234
22241
|
"SyncLoop"
|
|
22235
22242
|
/* SyncLoop */
|
|
@@ -22615,6 +22622,10 @@
|
|
|
22615
22622
|
return;
|
|
22616
22623
|
}
|
|
22617
22624
|
attachment.cancelWatchStream();
|
|
22625
|
+
if (attachment.unsubscribeLocalBroadcast) {
|
|
22626
|
+
attachment.unsubscribeLocalBroadcast();
|
|
22627
|
+
attachment.unsubscribeLocalBroadcast = void 0;
|
|
22628
|
+
}
|
|
22618
22629
|
if (attachment.resource instanceof Document) {
|
|
22619
22630
|
attachment.resource.resetOnlineClients();
|
|
22620
22631
|
}
|
|
@@ -22623,12 +22634,17 @@
|
|
|
22623
22634
|
async syncInternal(attachment, syncMode) {
|
|
22624
22635
|
const { resource } = attachment;
|
|
22625
22636
|
if (resource instanceof Channel) {
|
|
22637
|
+
const isFirstCall = !resource.getSessionID();
|
|
22626
22638
|
try {
|
|
22627
22639
|
const res = await this.rpcClient.refreshChannel(
|
|
22628
22640
|
{
|
|
22629
|
-
clientId: this.id,
|
|
22641
|
+
clientId: this.id ?? "",
|
|
22630
22642
|
channelKey: resource.getKey(),
|
|
22631
|
-
sessionId: resource.getSessionID()
|
|
22643
|
+
sessionId: resource.getSessionID() ?? "",
|
|
22644
|
+
// First-call only — these fields are ignored by the server
|
|
22645
|
+
// once a session_id is established.
|
|
22646
|
+
clientKey: isFirstCall ? this.key : "",
|
|
22647
|
+
metadata: isFirstCall ? this.metadata : {}
|
|
22632
22648
|
},
|
|
22633
22649
|
{
|
|
22634
22650
|
headers: {
|
|
@@ -22636,6 +22652,31 @@
|
|
|
22636
22652
|
}
|
|
22637
22653
|
}
|
|
22638
22654
|
);
|
|
22655
|
+
if (isFirstCall) {
|
|
22656
|
+
if (this.deactivating || attachment.isDetaching()) {
|
|
22657
|
+
return resource;
|
|
22658
|
+
}
|
|
22659
|
+
if (res.clientId && !this.id) {
|
|
22660
|
+
this.id = res.clientId;
|
|
22661
|
+
this.status = "activated";
|
|
22662
|
+
resource.setActor(res.clientId);
|
|
22663
|
+
} else if (this.id) {
|
|
22664
|
+
resource.setActor(this.id);
|
|
22665
|
+
}
|
|
22666
|
+
if (res.sessionId) {
|
|
22667
|
+
resource.setSessionID(res.sessionId);
|
|
22668
|
+
attachment.resourceID = res.sessionId;
|
|
22669
|
+
resource.applyStatus(ChannelStatus.Attached);
|
|
22670
|
+
}
|
|
22671
|
+
if (attachment.syncMode === "realtime") {
|
|
22672
|
+
this.runWatchLoop(resource.getKey()).catch((err) => {
|
|
22673
|
+
logger.error(
|
|
22674
|
+
`[WP] c:"${this.getKey()}" failed to start watch for p:"${resource.getKey()}":`,
|
|
22675
|
+
err
|
|
22676
|
+
);
|
|
22677
|
+
});
|
|
22678
|
+
}
|
|
22679
|
+
}
|
|
22639
22680
|
const prevCount = resource.getSessionCount();
|
|
22640
22681
|
if (resource.updateSessionCount(Number(res.sessionCount), 0)) {
|
|
22641
22682
|
if (resource.getSessionCount() !== prevCount) {
|
|
@@ -22650,6 +22691,21 @@
|
|
|
22650
22691
|
`[RP] c:"${this.getKey()}" refreshes p:"${resource.getKey()}" mode:${attachment.syncMode}`
|
|
22651
22692
|
);
|
|
22652
22693
|
} catch (err) {
|
|
22694
|
+
if (isErrorCode(err, Code.ErrSessionNotFound)) {
|
|
22695
|
+
logger.info(
|
|
22696
|
+
`[RP] c:"${this.getKey()}" session expired for p:"${resource.getKey()}", re-attaching`
|
|
22697
|
+
);
|
|
22698
|
+
resource.setSessionID("");
|
|
22699
|
+
attachment.resourceID = "";
|
|
22700
|
+
return resource;
|
|
22701
|
+
}
|
|
22702
|
+
if (!this.deactivating && !attachment.isDetaching()) {
|
|
22703
|
+
resource.publish({
|
|
22704
|
+
type: ChannelEventType.SyncError,
|
|
22705
|
+
error: err,
|
|
22706
|
+
method: "RefreshChannel"
|
|
22707
|
+
});
|
|
22708
|
+
}
|
|
22653
22709
|
logger.error(`[RP] c:"${this.getKey()}" err :`, err);
|
|
22654
22710
|
throw err;
|
|
22655
22711
|
}
|
|
@@ -23000,7 +23056,7 @@
|
|
|
23000
23056
|
};
|
|
23001
23057
|
}
|
|
23002
23058
|
const name = "@yorkie-js/react";
|
|
23003
|
-
const version = "0.7.
|
|
23059
|
+
const version = "0.7.10-rc2";
|
|
23004
23060
|
const pkg = {
|
|
23005
23061
|
name,
|
|
23006
23062
|
version
|
|
@@ -23010,7 +23066,7 @@
|
|
|
23010
23066
|
loading: true,
|
|
23011
23067
|
error: void 0
|
|
23012
23068
|
});
|
|
23013
|
-
function useYorkieClient(opts) {
|
|
23069
|
+
function useYorkieClient(opts, activate = true) {
|
|
23014
23070
|
const [client, setClient] = react.useState(void 0);
|
|
23015
23071
|
const [loading, setLoading] = react.useState(true);
|
|
23016
23072
|
const [error, setError] = react.useState(void 0);
|
|
@@ -23027,7 +23083,9 @@
|
|
|
23027
23083
|
}
|
|
23028
23084
|
try {
|
|
23029
23085
|
const newClient = new Client(opts);
|
|
23030
|
-
|
|
23086
|
+
if (activate) {
|
|
23087
|
+
await newClient.activate();
|
|
23088
|
+
}
|
|
23031
23089
|
setClient(newClient);
|
|
23032
23090
|
} catch (e) {
|
|
23033
23091
|
setError(
|
|
@@ -23039,24 +23097,21 @@
|
|
|
23039
23097
|
}
|
|
23040
23098
|
activateClient();
|
|
23041
23099
|
return () => {
|
|
23042
|
-
if (client?.isActive()) {
|
|
23100
|
+
if (activate && client?.isActive()) {
|
|
23043
23101
|
client.deactivate({ keepalive: true });
|
|
23044
23102
|
}
|
|
23045
23103
|
};
|
|
23046
|
-
}, [opts.apiKey, opts.rpcAddr, didMount]);
|
|
23104
|
+
}, [opts.apiKey, opts.rpcAddr, didMount, activate]);
|
|
23047
23105
|
return { client, loading, error };
|
|
23048
23106
|
}
|
|
23049
|
-
const YorkieProvider = ({
|
|
23050
|
-
children,
|
|
23051
|
-
...opts
|
|
23052
|
-
}) => {
|
|
23107
|
+
const YorkieProvider = ({ children, activate = true, ...opts }) => {
|
|
23053
23108
|
const clientOpts = react.useMemo(() => {
|
|
23054
23109
|
return {
|
|
23055
23110
|
userAgent: pkg.name + "/" + pkg.version,
|
|
23056
23111
|
...opts
|
|
23057
23112
|
};
|
|
23058
23113
|
}, [opts.apiKey, opts.rpcAddr]);
|
|
23059
|
-
const { client, loading, error } = useYorkieClient(clientOpts);
|
|
23114
|
+
const { client, loading, error } = useYorkieClient(clientOpts, activate);
|
|
23060
23115
|
return /* @__PURE__ */ jsxRuntime.jsx(YorkieContext.Provider, { value: { client, loading, error }, children });
|
|
23061
23116
|
};
|
|
23062
23117
|
const useYorkie = () => {
|
|
@@ -23492,7 +23547,7 @@
|
|
|
23492
23547
|
}
|
|
23493
23548
|
let unsubscribe;
|
|
23494
23549
|
async function attachChannel() {
|
|
23495
|
-
if (!client
|
|
23550
|
+
if (!client) {
|
|
23496
23551
|
return;
|
|
23497
23552
|
}
|
|
23498
23553
|
channelStore.setState((state) => ({
|
|
@@ -23502,20 +23557,49 @@
|
|
|
23502
23557
|
}));
|
|
23503
23558
|
try {
|
|
23504
23559
|
const newChannel = new Channel(channelKey);
|
|
23505
|
-
await client.attach(newChannel, {
|
|
23560
|
+
await client.attach(newChannel, {
|
|
23561
|
+
syncMode,
|
|
23562
|
+
channelHeartbeatInterval
|
|
23563
|
+
});
|
|
23506
23564
|
channelRef.current = newChannel;
|
|
23507
|
-
unsubscribe = newChannel.subscribe(() => {
|
|
23565
|
+
unsubscribe = newChannel.subscribe((event) => {
|
|
23566
|
+
if (event.type === ChannelEventType.SyncError || event.type === ChannelEventType.AuthError) {
|
|
23567
|
+
const nextError = event.type === ChannelEventType.SyncError ? event.error instanceof Error ? event.error : new Error(String(event.error)) : new Error(
|
|
23568
|
+
`auth error during ${event.method}: ${event.reason}`
|
|
23569
|
+
);
|
|
23570
|
+
channelStore.setState((state) => ({
|
|
23571
|
+
...state,
|
|
23572
|
+
loading: false,
|
|
23573
|
+
error: nextError
|
|
23574
|
+
}));
|
|
23575
|
+
return;
|
|
23576
|
+
}
|
|
23577
|
+
const recovers = event.type === ChannelEventType.PresenceChanged || event.type === ChannelEventType.Initialized || event.type === ChannelEventType.Broadcast;
|
|
23578
|
+
const ready = newChannel.isAttached() && !!newChannel.getSessionID();
|
|
23508
23579
|
channelStore.setState((state) => ({
|
|
23509
23580
|
...state,
|
|
23510
|
-
sessionCount: newChannel.getSessionCount()
|
|
23581
|
+
sessionCount: newChannel.getSessionCount(),
|
|
23582
|
+
...recovers && state.error ? { error: void 0 } : {},
|
|
23583
|
+
...ready && state.loading ? { loading: false } : {}
|
|
23511
23584
|
}));
|
|
23512
23585
|
});
|
|
23513
|
-
|
|
23586
|
+
const detach = async () => {
|
|
23587
|
+
if (!client) return;
|
|
23588
|
+
try {
|
|
23589
|
+
await client.detach(newChannel);
|
|
23590
|
+
} catch (err) {
|
|
23591
|
+
if (err instanceof Error && /not attached/i.test(err.message)) {
|
|
23592
|
+
return;
|
|
23593
|
+
}
|
|
23594
|
+
throw err;
|
|
23595
|
+
}
|
|
23596
|
+
};
|
|
23597
|
+
channelStore.setState((state) => ({
|
|
23598
|
+
...state,
|
|
23514
23599
|
channel: newChannel,
|
|
23515
|
-
|
|
23516
|
-
|
|
23517
|
-
|
|
23518
|
-
});
|
|
23600
|
+
error: void 0,
|
|
23601
|
+
detach
|
|
23602
|
+
}));
|
|
23519
23603
|
} catch (e) {
|
|
23520
23604
|
channelStore.setState((state) => ({
|
|
23521
23605
|
...state,
|
|
@@ -23530,10 +23614,13 @@
|
|
|
23530
23614
|
unsubscribe();
|
|
23531
23615
|
}
|
|
23532
23616
|
async function detachChannel() {
|
|
23533
|
-
if (channelRef.current && client
|
|
23617
|
+
if (channelRef.current && client) {
|
|
23534
23618
|
try {
|
|
23535
23619
|
await client.detach(channelRef.current);
|
|
23536
23620
|
} catch (e) {
|
|
23621
|
+
if (e instanceof Error && /not attached/i.test(e.message)) {
|
|
23622
|
+
return;
|
|
23623
|
+
}
|
|
23537
23624
|
console.error("Failed to detach channel:", e);
|
|
23538
23625
|
}
|
|
23539
23626
|
}
|
|
@@ -23566,7 +23653,11 @@
|
|
|
23566
23653
|
channel: void 0,
|
|
23567
23654
|
sessionCount: 0,
|
|
23568
23655
|
loading: true,
|
|
23569
|
-
error: void 0
|
|
23656
|
+
error: void 0,
|
|
23657
|
+
// Placeholder until `useYorkieChannel` wires up the real detach.
|
|
23658
|
+
// Pre-attach calls are a no-op rather than a throw.
|
|
23659
|
+
detach: async () => {
|
|
23660
|
+
}
|
|
23570
23661
|
});
|
|
23571
23662
|
}
|
|
23572
23663
|
const channelStore = channelStoreRef.current;
|
|
@@ -23594,7 +23685,8 @@
|
|
|
23594
23685
|
const sessionCount = useSelector(channelStore, (state) => state.sessionCount);
|
|
23595
23686
|
const loading = useSelector(channelStore, (state) => state.loading);
|
|
23596
23687
|
const error = useSelector(channelStore, (state) => state.error);
|
|
23597
|
-
|
|
23688
|
+
const detach = useSelector(channelStore, (state) => state.detach);
|
|
23689
|
+
return { sessionCount, loading, error, detach };
|
|
23598
23690
|
};
|
|
23599
23691
|
const useChannelSessionCount = () => {
|
|
23600
23692
|
const channelStore = useChannelStore("useChannelSessionCount");
|
|
@@ -23616,7 +23708,7 @@
|
|
|
23616
23708
|
};
|
|
23617
23709
|
}, []);
|
|
23618
23710
|
const peekOnce = react.useCallback(async () => {
|
|
23619
|
-
if (!client
|
|
23711
|
+
if (!client) return;
|
|
23620
23712
|
if (mountedRef.current) setLoading(true);
|
|
23621
23713
|
try {
|
|
23622
23714
|
const count = await client.peekChannel(channelKeyRef.current);
|
|
@@ -23645,7 +23737,7 @@
|
|
|
23645
23737
|
let cancelled = false;
|
|
23646
23738
|
let timer;
|
|
23647
23739
|
const run = async () => {
|
|
23648
|
-
if (cancelled
|
|
23740
|
+
if (cancelled) return;
|
|
23649
23741
|
try {
|
|
23650
23742
|
const count = await client.peekChannel(channelKey);
|
|
23651
23743
|
if (cancelled) return;
|