@yorkie-js/react 0.7.5 → 0.7.7
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.es.js +955 -261
- package/dist/yorkie-js-react.es.js.map +1 -1
- package/dist/yorkie-js-react.js +955 -261
- package/dist/yorkie-js-react.js.map +1 -1
- package/package.json +2 -2
package/dist/yorkie-js-react.js
CHANGED
|
@@ -5792,7 +5792,7 @@
|
|
|
5792
5792
|
}
|
|
5793
5793
|
};
|
|
5794
5794
|
}
|
|
5795
|
-
const file_src_api_yorkie_v1_resources = /* @__PURE__ */ fileDesc("CiFzcmMvYXBpL3lvcmtpZS92MS9yZXNvdXJjZXMucHJvdG8SCXlvcmtpZS52MSKuAQoIU25hcHNob3QSJAoEcm9vdBgBIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBI1CglwcmVzZW5jZXMYAiADKAsyIi55b3JraWUudjEuU25hcHNob3QuUHJlc2VuY2VzRW50cnkaRQoOUHJlc2VuY2VzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLlByZXNlbmNlOgI4ASL7AQoKQ2hhbmdlUGFjaxIUCgxkb2N1bWVudF9rZXkYASABKAkSKQoKY2hlY2twb2ludBgCIAEoCzIVLnlvcmtpZS52MS5DaGVja3BvaW50EhAKCHNuYXBzaG90GAMgASgMEiIKB2NoYW5nZXMYBCADKAsyES55b3JraWUudjEuQ2hhbmdlEjAKEW1pbl9zeW5jZWRfdGlja2V0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgGIAEoCBIwCg52ZXJzaW9uX3ZlY3RvchgHIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yIpgBCgZDaGFuZ2USHwoCaWQYASABKAsyEy55b3JraWUudjEuQ2hhbmdlSUQSDwoHbWVzc2FnZRgCIAEoCRIoCgpvcGVyYXRpb25zGAMgAygLMhQueW9ya2llLnYxLk9wZXJhdGlvbhIyCg9wcmVzZW5jZV9jaGFuZ2UYBCABKAsyGS55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UihwEKCENoYW5nZUlEEhIKCmNsaWVudF9zZXEYASABKA0SEgoKc2VydmVyX3NlcRgCIAEoAxIPCgdsYW1wb3J0GAMgASgDEhAKCGFjdG9yX2lkGAQgASgMEjAKDnZlcnNpb25fdmVjdG9yGAUgASgLMhgueW9ya2llLnYxLlZlcnNpb25WZWN0b3IidAoNVmVyc2lvblZlY3RvchI0CgZ2ZWN0b3IYASADKAsyJC55b3JraWUudjEuVmVyc2lvblZlY3Rvci5WZWN0b3JFbnRyeRotCgtWZWN0b3JFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAM6AjgBItkaCglPcGVyYXRpb24SJwoDc2V0GAEgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5TZXRIABInCgNhZGQYAiABKAsyGC55b3JraWUudjEuT3BlcmF0aW9uLkFkZEgAEikKBG1vdmUYAyABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLk1vdmVIABItCgZyZW1vdmUYBCABKAsyGy55b3JraWUudjEuT3BlcmF0aW9uLlJlbW92ZUgAEikKBGVkaXQYBSABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLkVkaXRIABIrCgVzdHlsZRgHIAEoCzIaLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGVIABIxCghpbmNyZWFzZRgIIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uSW5jcmVhc2VIABIyCgl0cmVlX2VkaXQYCSABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0SAASNAoKdHJlZV9zdHlsZRgKIAEoCzIeLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlSAASMgoJYXJyYXlfc2V0GAsgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5BcnJheVNldEgAGp0BCgNTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBILCgNrZXkYAiABKAkSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrAAQoDQWRkEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSLgoPcHJldl9jcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq/AQoETW92ZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIqCgtleGVjdXRlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GpEBCgZSZW1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrZAwoERWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSUwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyMi55b3JraWUudjEuT3BlcmF0aW9uLkVkaXQuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5Eg8KB2NvbnRlbnQYBSABKAkSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBI9CgphdHRyaWJ1dGVzGAcgAygLMikueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkF0dHJpYnV0ZXNFbnRyeRpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGukDCgVTdHlsZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSPgoKYXR0cmlidXRlcxgEIAMoCzIqLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSVAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBiADKAsyMy55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIcChRhdHRyaWJ1dGVzX3RvX3JlbW92ZRgHIAMoCRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGqQBCghJbmNyZWFzZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAIgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDQoFYWN0b3IYBCABKAkakwMKCFRyZWVFZGl0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSVwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyNi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRImCghjb250ZW50cxgFIAMoCzIULnlvcmtpZS52MS5UcmVlTm9kZXMSEwoLc3BsaXRfbGV2ZWwYByABKAUSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGu0DCglUcmVlU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIgCgRmcm9tGAIgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSHgoCdG8YAyABKAsyEi55b3JraWUudjEuVHJlZVBvcxJCCgphdHRyaWJ1dGVzGAQgAygLMi4ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSHAoUYXR0cmlidXRlc190b19yZW1vdmUYBiADKAkSWAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYByADKAsyNy55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrAAQoIQXJyYXlTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldEIGCgRib2R5IsUBChFKU09ORWxlbWVudFNpbXBsZRIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIgoEdHlwZRgEIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYBSABKAwinwsKC0pTT05FbGVtZW50EjgKC2pzb25fb2JqZWN0GAEgASgLMiEueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05PYmplY3RIABI2Cgpqc29uX2FycmF5GAIgASgLMiAueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05BcnJheUgAEjUKCXByaW1pdGl2ZRgDIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5QcmltaXRpdmVIABIrCgR0ZXh0GAUgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRleHRIABIxCgdjb3VudGVyGAYgASgLMh4ueW9ya2llLnYxLkpTT05FbGVtZW50LkNvdW50ZXJIABIrCgR0cmVlGAcgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRyZWVIABquAQoKSlNPTk9iamVjdBIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SSFROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqtAQoJSlNPTkFycmF5EiEKBW5vZGVzGAEgAygLMhIueW9ya2llLnYxLlJHQU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Gr0BCglQcmltaXRpdmUSIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GqkBCgRUZXh0EiIKBW5vZGVzGAEgAygLMhMueW9ya2llLnYxLlRleHROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrYAQoHQ291bnRlchIiCgR0eXBlGAEgASgOMhQueW9ya2llLnYxLlZhbHVlVHlwZRINCgV2YWx1ZRgCIAEoDBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSFQoNaGxsX3JlZ2lzdGVycxgHIAEoDEoECAYQBxqpAQoEVHJlZRIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UcmVlTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSI/CgdSSFROb2RlEgsKA2tleRgBIAEoCRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50IlQKB1JHQU5vZGUSIAoEbmV4dBgBIAEoCzISLnlvcmtpZS52MS5SR0FOb2RlEicKB2VsZW1lbnQYAiABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
|
|
5795
|
+
const file_src_api_yorkie_v1_resources = /* @__PURE__ */ fileDesc("CiFzcmMvYXBpL3lvcmtpZS92MS9yZXNvdXJjZXMucHJvdG8SCXlvcmtpZS52MSKuAQoIU25hcHNob3QSJAoEcm9vdBgBIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBI1CglwcmVzZW5jZXMYAiADKAsyIi55b3JraWUudjEuU25hcHNob3QuUHJlc2VuY2VzRW50cnkaRQoOUHJlc2VuY2VzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLlByZXNlbmNlOgI4ASL7AQoKQ2hhbmdlUGFjaxIUCgxkb2N1bWVudF9rZXkYASABKAkSKQoKY2hlY2twb2ludBgCIAEoCzIVLnlvcmtpZS52MS5DaGVja3BvaW50EhAKCHNuYXBzaG90GAMgASgMEiIKB2NoYW5nZXMYBCADKAsyES55b3JraWUudjEuQ2hhbmdlEjAKEW1pbl9zeW5jZWRfdGlja2V0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgGIAEoCBIwCg52ZXJzaW9uX3ZlY3RvchgHIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yIpgBCgZDaGFuZ2USHwoCaWQYASABKAsyEy55b3JraWUudjEuQ2hhbmdlSUQSDwoHbWVzc2FnZRgCIAEoCRIoCgpvcGVyYXRpb25zGAMgAygLMhQueW9ya2llLnYxLk9wZXJhdGlvbhIyCg9wcmVzZW5jZV9jaGFuZ2UYBCABKAsyGS55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UihwEKCENoYW5nZUlEEhIKCmNsaWVudF9zZXEYASABKA0SEgoKc2VydmVyX3NlcRgCIAEoAxIPCgdsYW1wb3J0GAMgASgDEhAKCGFjdG9yX2lkGAQgASgMEjAKDnZlcnNpb25fdmVjdG9yGAUgASgLMhgueW9ya2llLnYxLlZlcnNpb25WZWN0b3IidAoNVmVyc2lvblZlY3RvchI0CgZ2ZWN0b3IYASADKAsyJC55b3JraWUudjEuVmVyc2lvblZlY3Rvci5WZWN0b3JFbnRyeRotCgtWZWN0b3JFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAM6AjgBItkaCglPcGVyYXRpb24SJwoDc2V0GAEgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5TZXRIABInCgNhZGQYAiABKAsyGC55b3JraWUudjEuT3BlcmF0aW9uLkFkZEgAEikKBG1vdmUYAyABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLk1vdmVIABItCgZyZW1vdmUYBCABKAsyGy55b3JraWUudjEuT3BlcmF0aW9uLlJlbW92ZUgAEikKBGVkaXQYBSABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLkVkaXRIABIrCgVzdHlsZRgHIAEoCzIaLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGVIABIxCghpbmNyZWFzZRgIIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uSW5jcmVhc2VIABIyCgl0cmVlX2VkaXQYCSABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0SAASNAoKdHJlZV9zdHlsZRgKIAEoCzIeLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlSAASMgoJYXJyYXlfc2V0GAsgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5BcnJheVNldEgAGp0BCgNTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBILCgNrZXkYAiABKAkSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrAAQoDQWRkEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSLgoPcHJldl9jcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq/AQoETW92ZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIqCgtleGVjdXRlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GpEBCgZSZW1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrZAwoERWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSUwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyMi55b3JraWUudjEuT3BlcmF0aW9uLkVkaXQuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5Eg8KB2NvbnRlbnQYBSABKAkSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBI9CgphdHRyaWJ1dGVzGAcgAygLMikueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkF0dHJpYnV0ZXNFbnRyeRpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGukDCgVTdHlsZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSPgoKYXR0cmlidXRlcxgEIAMoCzIqLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSVAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBiADKAsyMy55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIcChRhdHRyaWJ1dGVzX3RvX3JlbW92ZRgHIAMoCRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGqQBCghJbmNyZWFzZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAIgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDQoFYWN0b3IYBCABKAkakwMKCFRyZWVFZGl0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSVwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyNi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRImCghjb250ZW50cxgFIAMoCzIULnlvcmtpZS52MS5UcmVlTm9kZXMSEwoLc3BsaXRfbGV2ZWwYByABKAUSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGu0DCglUcmVlU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIgCgRmcm9tGAIgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSHgoCdG8YAyABKAsyEi55b3JraWUudjEuVHJlZVBvcxJCCgphdHRyaWJ1dGVzGAQgAygLMi4ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSHAoUYXR0cmlidXRlc190b19yZW1vdmUYBiADKAkSWAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYByADKAsyNy55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrAAQoIQXJyYXlTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldEIGCgRib2R5IsUBChFKU09ORWxlbWVudFNpbXBsZRIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIgoEdHlwZRgEIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYBSABKAwinwsKC0pTT05FbGVtZW50EjgKC2pzb25fb2JqZWN0GAEgASgLMiEueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05PYmplY3RIABI2Cgpqc29uX2FycmF5GAIgASgLMiAueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05BcnJheUgAEjUKCXByaW1pdGl2ZRgDIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5QcmltaXRpdmVIABIrCgR0ZXh0GAUgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRleHRIABIxCgdjb3VudGVyGAYgASgLMh4ueW9ya2llLnYxLkpTT05FbGVtZW50LkNvdW50ZXJIABIrCgR0cmVlGAcgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRyZWVIABquAQoKSlNPTk9iamVjdBIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SSFROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqtAQoJSlNPTkFycmF5EiEKBW5vZGVzGAEgAygLMhIueW9ya2llLnYxLlJHQU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Gr0BCglQcmltaXRpdmUSIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GqkBCgRUZXh0EiIKBW5vZGVzGAEgAygLMhMueW9ya2llLnYxLlRleHROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrYAQoHQ291bnRlchIiCgR0eXBlGAEgASgOMhQueW9ya2llLnYxLlZhbHVlVHlwZRINCgV2YWx1ZRgCIAEoDBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSFQoNaGxsX3JlZ2lzdGVycxgHIAEoDEoECAYQBxqpAQoEVHJlZRIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UcmVlTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSI/CgdSSFROb2RlEgsKA2tleRgBIAEoCRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50Iu4BCgdSR0FOb2RlEiAKBG5leHQYASABKAsyEi55b3JraWUudjEuUkdBTm9kZRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50EjIKE3Bvc2l0aW9uX2NyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIwChFwb3NpdGlvbl9tb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EjIKE3Bvc2l0aW9uX3JlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldCJYCghOb2RlQXR0chINCgV2YWx1ZRgBIAEoCRIpCgp1cGRhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgDIAEoCCKUAgoIVGV4dE5vZGUSIQoCaWQYASABKAsyFS55b3JraWUudjEuVGV4dE5vZGVJRBINCgV2YWx1ZRgCIAEoCRIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLaW5zX3ByZXZfaWQYBCABKAsyFS55b3JraWUudjEuVGV4dE5vZGVJRBI3CgphdHRyaWJ1dGVzGAUgAygLMiMueW9ya2llLnYxLlRleHROb2RlLkF0dHJpYnV0ZXNFbnRyeRpGCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLk5vZGVBdHRyOgI4ASJHCgpUZXh0Tm9kZUlEEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIOCgZvZmZzZXQYAiABKAUiswMKCFRyZWVOb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSDAoEdHlwZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLaW5zX3ByZXZfaWQYBSABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBIqCgtpbnNfbmV4dF9pZBgGIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEg0KBWRlcHRoGAcgASgFEjcKCmF0dHJpYnV0ZXMYCCADKAsyIy55b3JraWUudjEuVHJlZU5vZGUuQXR0cmlidXRlc0VudHJ5EioKC21lcmdlZF9mcm9tGAkgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKAoJbWVyZ2VkX2F0GAogASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiMQoJVHJlZU5vZGVzEiQKB2NvbnRlbnQYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUiRwoKVHJlZU5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFImMKB1RyZWVQb3MSKAoJcGFyZW50X2lkGAEgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSLgoPbGVmdF9zaWJsaW5nX2lkGAIgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQiawoEVXNlchIKCgJpZBgBIAEoCRIVCg1hdXRoX3Byb3ZpZGVyGAIgASgJEhAKCHVzZXJuYW1lGAMgASgJEi4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIokBCgZNZW1iZXISCgoCaWQYASABKAkSEgoKcHJvamVjdF9pZBgCIAEoCRIPCgd1c2VyX2lkGAMgASgJEhAKCHVzZXJuYW1lGAQgASgJEgwKBHJvbGUYBSABKAkSLgoKaW52aXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi6QYKB1Byb2plY3QSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpwdWJsaWNfa2V5GAMgASgJEhIKCnNlY3JldF9rZXkYBCABKAkSGAoQYXV0aF93ZWJob29rX3VybBgFIAEoCRIcChRhdXRoX3dlYmhvb2tfbWV0aG9kcxgGIAMoCRIgChhhdXRoX3dlYmhvb2tfbWF4X3JldHJpZXMYESABKAQSJgoeYXV0aF93ZWJob29rX21pbl93YWl0X2ludGVydmFsGBIgASgJEiYKHmF1dGhfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgTIAEoCRIkChxhdXRoX3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBQgASgJEhkKEWV2ZW50X3dlYmhvb2tfdXJsGAcgASgJEhwKFGV2ZW50X3dlYmhvb2tfZXZlbnRzGAggAygJEiEKGWV2ZW50X3dlYmhvb2tfbWF4X3JldHJpZXMYFSABKAQSJwofZXZlbnRfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgWIAEoCRInCh9ldmVudF93ZWJob29rX21heF93YWl0X2ludGVydmFsGBcgASgJEiUKHWV2ZW50X3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBggASgJEiMKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgJIAEoCRIaChJzbmFwc2hvdF90aHJlc2hvbGQYGSABKAMSGQoRc25hcHNob3RfaW50ZXJ2YWwYGiABKAMSJAocbWF4X3N1YnNjcmliZXJzX3Blcl9kb2N1bWVudBgKIAEoBRIkChxtYXhfYXR0YWNobWVudHNfcGVyX2RvY3VtZW50GAsgASgFEh0KFW1heF9zaXplX3Blcl9kb2N1bWVudBgPIAEoBRIYChByZW1vdmVfb25fZGV0YWNoGBAgASgIEh0KFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgbIAEoCBIXCg9hbGxvd2VkX29yaWdpbnMYDiADKAkSLgoKY3JlYXRlZF9hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiLwoLTWV0cmljUG9pbnQSEQoJdGltZXN0YW1wGAEgASgDEg0KBXZhbHVlGAIgASgFIqMMChZVcGRhdGFibGVQcm9qZWN0RmllbGRzEioKBG5hbWUYASABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSNgoQYXV0aF93ZWJob29rX3VybBgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRhdXRoX3dlYmhvb2tfbWV0aG9kcxgDIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkF1dGhXZWJob29rTWV0aG9kcxI+ChhhdXRoX3dlYmhvb2tfbWF4X3JldHJpZXMYDCABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUSRAoeYXV0aF93ZWJob29rX21pbl93YWl0X2ludGVydmFsGA0gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkQKHmF1dGhfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgOIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJCChxhdXRoX3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GA8gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjcKEWV2ZW50X3dlYmhvb2tfdXJsGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlElIKFGV2ZW50X3dlYmhvb2tfZXZlbnRzGAUgASgLMjQueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuRXZlbnRXZWJob29rRXZlbnRzEj8KGWV2ZW50X3dlYmhvb2tfbWF4X3JldHJpZXMYECABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUSRQofZXZlbnRfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgRIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJFCh9ldmVudF93ZWJob29rX21heF93YWl0X2ludGVydmFsGBIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkMKHWV2ZW50X3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjcKEnNuYXBzaG90X3RocmVzaG9sZBgUIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEjYKEXNuYXBzaG90X2ludGVydmFsGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSQQobY2xpZW50X2RlYWN0aXZhdGVfdGhyZXNob2xkGAYgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkEKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZRJBChxtYXhfYXR0YWNobWVudHNfcGVyX2RvY3VtZW50GAggASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSOgoVbWF4X3NpemVfcGVyX2RvY3VtZW50GAogASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSNAoQcmVtb3ZlX29uX2RldGFjaBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSOQoVYXV0b19yZXZpc2lvbl9lbmFibGVkGBYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZRJJCg9hbGxvd2VkX29yaWdpbnMYCSABKAsyMC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BbGxvd2VkT3JpZ2lucxolChJBdXRoV2ViaG9va01ldGhvZHMSDwoHbWV0aG9kcxgBIAMoCRokChJFdmVudFdlYmhvb2tFdmVudHMSDgoGZXZlbnRzGAEgAygJGiEKDkFsbG93ZWRPcmlnaW5zEg8KB29yaWdpbnMYASADKAkipwMKD0RvY3VtZW50U3VtbWFyeRIKCgJpZBgBIAEoCRILCgNrZXkYAiABKAkSDAoEcm9vdBgDIAEoCRIYChBhdHRhY2hlZF9jbGllbnRzGAcgASgFEikKDWRvY3VtZW50X3NpemUYCCABKAsyEi55b3JraWUudjEuRG9jU2l6ZRISCgpzY2hlbWFfa2V5GAkgASgJEjwKCXByZXNlbmNlcxgKIAMoCzIpLnlvcmtpZS52MS5Eb2N1bWVudFN1bW1hcnkuUHJlc2VuY2VzRW50cnkSLgoKY3JlYXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLYWNjZXNzZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi2gEKDlByZXNlbmNlQ2hhbmdlEjIKBHR5cGUYASABKA4yJC55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UuQ2hhbmdlVHlwZRIlCghwcmVzZW5jZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZSJtCgpDaGFuZ2VUeXBlEhsKF0NIQU5HRV9UWVBFX1VOU1BFQ0lGSUVEEAASEwoPQ0hBTkdFX1RZUEVfUFVUEAESFgoSQ0hBTkdFX1RZUEVfREVMRVRFEAISFQoRQ0hBTkdFX1RZUEVfQ0xFQVIQAyJkCghQcmVzZW5jZRIrCgRkYXRhGAEgAygLMh0ueW9ya2llLnYxLlByZXNlbmNlLkRhdGFFbnRyeRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASI0Cg5DaGFubmVsU3VtbWFyeRILCgNrZXkYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoBSI0CgpDaGVja3BvaW50EhIKCnNlcnZlcl9zZXEYASABKAMSEgoKY2xpZW50X3NlcRgCIAEoDSJhCgtUZXh0Tm9kZVBvcxIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFEhcKD3JlbGF0aXZlX29mZnNldBgDIAEoBSJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAq/AIKCVZhbHVlVHlwZRITCg9WQUxVRV9UWVBFX05VTEwQABIWChJWQUxVRV9UWVBFX0JPT0xFQU4QARIWChJWQUxVRV9UWVBFX0lOVEVHRVIQAhITCg9WQUxVRV9UWVBFX0xPTkcQAxIVChFWQUxVRV9UWVBFX0RPVUJMRRAEEhUKEVZBTFVFX1RZUEVfU1RSSU5HEAUSFAoQVkFMVUVfVFlQRV9CWVRFUxAGEhMKD1ZBTFVFX1RZUEVfREFURRAHEhoKFlZBTFVFX1RZUEVfSlNPTl9PQkpFQ1QQCBIZChVWQUxVRV9UWVBFX0pTT05fQVJSQVkQCRITCg9WQUxVRV9UWVBFX1RFWFQQChIaChZWQUxVRV9UWVBFX0lOVEVHRVJfQ05UEAsSFwoTVkFMVUVfVFlQRV9MT05HX0NOVBAMEhMKD1ZBTFVFX1RZUEVfVFJFRRANEiAKHFZBTFVFX1RZUEVfSU5URUdFUl9ERURVUF9DTlQQDiIECA8QDyqmAQoMRG9jRXZlbnRUeXBlEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0NIQU5HRUQQABIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9XQVRDSEVEEAESJQohRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfVU5XQVRDSEVEEAISJQohRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQlJPQURDQVNUEANCRQoRZGV2LnlvcmtpZS5hcGkudjFQAVouZ2l0aHViLmNvbS95b3JraWUtdGVhbS95b3JraWUvYXBpL3lvcmtpZS92MTt2MWIGcHJvdG8z", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
|
|
5796
5796
|
const SnapshotSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 0);
|
|
5797
5797
|
const ChangePackSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 1);
|
|
5798
5798
|
const ChangeSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 2);
|
|
@@ -7141,6 +7141,13 @@
|
|
|
7141
7141
|
if (this.valueType === 5) {
|
|
7142
7142
|
return `"${escapeString(this.value)}"`;
|
|
7143
7143
|
}
|
|
7144
|
+
if (this.valueType === 6) {
|
|
7145
|
+
const bytes = this.value;
|
|
7146
|
+
return `"${btoa(String.fromCharCode(...bytes))}"`;
|
|
7147
|
+
}
|
|
7148
|
+
if (this.valueType === 7) {
|
|
7149
|
+
return `"${this.value.toISOString()}"`;
|
|
7150
|
+
}
|
|
7144
7151
|
return `${this.value}`;
|
|
7145
7152
|
}
|
|
7146
7153
|
/**
|
|
@@ -7283,19 +7290,54 @@
|
|
|
7283
7290
|
}
|
|
7284
7291
|
}
|
|
7285
7292
|
}
|
|
7293
|
+
class ElementEntry {
|
|
7294
|
+
elem;
|
|
7295
|
+
positionNode;
|
|
7296
|
+
posMovedAt;
|
|
7297
|
+
constructor(elem) {
|
|
7298
|
+
this.elem = elem;
|
|
7299
|
+
}
|
|
7300
|
+
}
|
|
7286
7301
|
class RGATreeListNode extends SplayNode {
|
|
7302
|
+
_elementEntry;
|
|
7303
|
+
_createdAt;
|
|
7304
|
+
_removedAt;
|
|
7287
7305
|
prev;
|
|
7288
7306
|
next;
|
|
7289
|
-
|
|
7290
|
-
|
|
7291
|
-
|
|
7292
|
-
|
|
7307
|
+
constructor(elem, createdAt) {
|
|
7308
|
+
super(elem);
|
|
7309
|
+
this._createdAt = createdAt;
|
|
7310
|
+
}
|
|
7311
|
+
/**
|
|
7312
|
+
* `createWithElement` creates a new node that owns an element.
|
|
7313
|
+
*/
|
|
7314
|
+
static createWithElement(elem) {
|
|
7315
|
+
const entry = new ElementEntry(elem);
|
|
7316
|
+
const node = new RGATreeListNode(elem, elem.getCreatedAt());
|
|
7317
|
+
entry.positionNode = node;
|
|
7318
|
+
node._elementEntry = entry;
|
|
7319
|
+
return node;
|
|
7320
|
+
}
|
|
7321
|
+
/**
|
|
7322
|
+
* `createBarePosition` creates a position node without an element
|
|
7323
|
+
* (used for move).
|
|
7324
|
+
*/
|
|
7325
|
+
static createBarePosition(createdAt) {
|
|
7326
|
+
return new RGATreeListNode(void 0, createdAt);
|
|
7293
7327
|
}
|
|
7294
7328
|
/**
|
|
7295
|
-
* `createAfter` creates a new node
|
|
7329
|
+
* `createAfter` creates a new node with the given element after
|
|
7330
|
+
* the given prev node.
|
|
7296
7331
|
*/
|
|
7297
|
-
static createAfter(prev,
|
|
7298
|
-
const newNode =
|
|
7332
|
+
static createAfter(prev, elem) {
|
|
7333
|
+
const newNode = RGATreeListNode.createWithElement(elem);
|
|
7334
|
+
RGATreeListNode.insertNodeAfter(prev, newNode);
|
|
7335
|
+
return newNode;
|
|
7336
|
+
}
|
|
7337
|
+
/**
|
|
7338
|
+
* `insertNodeAfter` inserts a node after the given prev node.
|
|
7339
|
+
*/
|
|
7340
|
+
static insertNodeAfter(prev, newNode) {
|
|
7299
7341
|
const prevNext = prev.next;
|
|
7300
7342
|
prev.next = newNode;
|
|
7301
7343
|
newNode.prev = prev;
|
|
@@ -7303,26 +7345,41 @@
|
|
|
7303
7345
|
if (prevNext) {
|
|
7304
7346
|
prevNext.prev = newNode;
|
|
7305
7347
|
}
|
|
7306
|
-
return newNode;
|
|
7307
7348
|
}
|
|
7308
7349
|
/**
|
|
7309
|
-
* `remove` removes
|
|
7350
|
+
* `remove` removes the element based on removing time.
|
|
7310
7351
|
*/
|
|
7311
7352
|
remove(removedAt) {
|
|
7312
|
-
|
|
7353
|
+
if (!this._elementEntry) {
|
|
7354
|
+
return false;
|
|
7355
|
+
}
|
|
7356
|
+
return this._elementEntry.elem.remove(removedAt);
|
|
7313
7357
|
}
|
|
7314
7358
|
/**
|
|
7315
|
-
* `getCreatedAt` returns creation time
|
|
7359
|
+
* `getCreatedAt` returns the creation time. For live nodes with
|
|
7360
|
+
* elements, returns the element's createdAt for backward
|
|
7361
|
+
* compatibility.
|
|
7316
7362
|
*/
|
|
7317
7363
|
getCreatedAt() {
|
|
7318
|
-
|
|
7364
|
+
if (this._elementEntry) {
|
|
7365
|
+
return this._elementEntry.elem.getCreatedAt();
|
|
7366
|
+
}
|
|
7367
|
+
return this._createdAt;
|
|
7319
7368
|
}
|
|
7320
7369
|
/**
|
|
7321
|
-
* `getPositionedAt` returns the time
|
|
7322
|
-
*
|
|
7370
|
+
* `getPositionedAt` returns the time this element was positioned.
|
|
7371
|
+
* For live nodes, the position register (posMovedAt) is the source
|
|
7372
|
+
* of truth. For dead nodes (no element), the position node's own
|
|
7373
|
+
* createdAt is used.
|
|
7323
7374
|
*/
|
|
7324
7375
|
getPositionedAt() {
|
|
7325
|
-
|
|
7376
|
+
if (this._elementEntry) {
|
|
7377
|
+
if (this._elementEntry.posMovedAt) {
|
|
7378
|
+
return this._elementEntry.posMovedAt;
|
|
7379
|
+
}
|
|
7380
|
+
return this._elementEntry.elem.getCreatedAt();
|
|
7381
|
+
}
|
|
7382
|
+
return this._createdAt;
|
|
7326
7383
|
}
|
|
7327
7384
|
/**
|
|
7328
7385
|
* `release` releases prev and next node.
|
|
@@ -7339,9 +7396,13 @@
|
|
|
7339
7396
|
}
|
|
7340
7397
|
/**
|
|
7341
7398
|
* `getLength` returns the length of this node.
|
|
7399
|
+
* Dead nodes (no element) return 0, removed elements return 0.
|
|
7342
7400
|
*/
|
|
7343
7401
|
getLength() {
|
|
7344
|
-
|
|
7402
|
+
if (!this._elementEntry || this.isRemoved()) {
|
|
7403
|
+
return 0;
|
|
7404
|
+
}
|
|
7405
|
+
return 1;
|
|
7345
7406
|
}
|
|
7346
7407
|
/**
|
|
7347
7408
|
* `getPrev` returns a previous node.
|
|
@@ -7356,28 +7417,87 @@
|
|
|
7356
7417
|
return this.next;
|
|
7357
7418
|
}
|
|
7358
7419
|
/**
|
|
7359
|
-
* `
|
|
7420
|
+
* `getValue` returns the element value.
|
|
7360
7421
|
*/
|
|
7361
|
-
|
|
7362
|
-
|
|
7422
|
+
getValue() {
|
|
7423
|
+
if (!this._elementEntry) {
|
|
7424
|
+
return this.value;
|
|
7425
|
+
}
|
|
7426
|
+
return this._elementEntry.elem;
|
|
7363
7427
|
}
|
|
7364
7428
|
/**
|
|
7365
|
-
* `
|
|
7429
|
+
* `getElement` returns the element or undefined if dead position.
|
|
7366
7430
|
*/
|
|
7367
|
-
|
|
7368
|
-
this.
|
|
7431
|
+
getElement() {
|
|
7432
|
+
return this._elementEntry?.elem;
|
|
7369
7433
|
}
|
|
7370
7434
|
/**
|
|
7371
|
-
* `
|
|
7435
|
+
* `isRemoved` checks if the value was removed.
|
|
7372
7436
|
*/
|
|
7373
|
-
|
|
7374
|
-
|
|
7437
|
+
isRemoved() {
|
|
7438
|
+
if (!this._elementEntry) {
|
|
7439
|
+
return true;
|
|
7440
|
+
}
|
|
7441
|
+
return this._elementEntry.elem.isRemoved();
|
|
7375
7442
|
}
|
|
7376
7443
|
/**
|
|
7377
|
-
* `
|
|
7444
|
+
* `getElementEntry` returns the element entry.
|
|
7378
7445
|
*/
|
|
7379
|
-
|
|
7380
|
-
return this.
|
|
7446
|
+
getElementEntry() {
|
|
7447
|
+
return this._elementEntry;
|
|
7448
|
+
}
|
|
7449
|
+
/**
|
|
7450
|
+
* `setElementEntry` sets the element entry.
|
|
7451
|
+
*/
|
|
7452
|
+
setElementEntry(entry) {
|
|
7453
|
+
this._elementEntry = entry;
|
|
7454
|
+
}
|
|
7455
|
+
/**
|
|
7456
|
+
* `getPositionCreatedAt` returns the position node's own createdAt.
|
|
7457
|
+
*/
|
|
7458
|
+
getPositionCreatedAt() {
|
|
7459
|
+
return this._createdAt;
|
|
7460
|
+
}
|
|
7461
|
+
/**
|
|
7462
|
+
* `getPositionMovedAt` returns the LWW timestamp of the element's
|
|
7463
|
+
* move into this position. Undefined for insert-created positions.
|
|
7464
|
+
*/
|
|
7465
|
+
getPositionMovedAt() {
|
|
7466
|
+
if (!this._elementEntry) {
|
|
7467
|
+
return void 0;
|
|
7468
|
+
}
|
|
7469
|
+
return this._elementEntry.posMovedAt;
|
|
7470
|
+
}
|
|
7471
|
+
/**
|
|
7472
|
+
* `getRemovedAt` returns the time this dead position node was
|
|
7473
|
+
* removed (for GC).
|
|
7474
|
+
*/
|
|
7475
|
+
getRemovedAt() {
|
|
7476
|
+
return this._removedAt;
|
|
7477
|
+
}
|
|
7478
|
+
/**
|
|
7479
|
+
* `setRemovedAt` sets the removal time of this position node.
|
|
7480
|
+
*/
|
|
7481
|
+
setRemovedAt(removedAt) {
|
|
7482
|
+
this._removedAt = removedAt;
|
|
7483
|
+
}
|
|
7484
|
+
/**
|
|
7485
|
+
* `toIDString` returns a unique identifier for this position node
|
|
7486
|
+
* (for GC).
|
|
7487
|
+
*/
|
|
7488
|
+
toIDString() {
|
|
7489
|
+
return this._createdAt.toIDString();
|
|
7490
|
+
}
|
|
7491
|
+
/**
|
|
7492
|
+
* `getDataSize` returns the data size of this position node
|
|
7493
|
+
* (for GC).
|
|
7494
|
+
*/
|
|
7495
|
+
getDataSize() {
|
|
7496
|
+
let meta = TimeTicketSize;
|
|
7497
|
+
if (this._removedAt) {
|
|
7498
|
+
meta += TimeTicketSize;
|
|
7499
|
+
}
|
|
7500
|
+
return { data: 0, meta };
|
|
7381
7501
|
}
|
|
7382
7502
|
}
|
|
7383
7503
|
class RGATreeList {
|
|
@@ -7385,13 +7505,15 @@
|
|
|
7385
7505
|
last;
|
|
7386
7506
|
nodeMapByIndex;
|
|
7387
7507
|
nodeMapByCreatedAt;
|
|
7508
|
+
elementMapByCreatedAt;
|
|
7388
7509
|
constructor() {
|
|
7389
7510
|
const dummyValue = Primitive.of(0, InitialTimeTicket);
|
|
7390
7511
|
dummyValue.setRemovedAt(InitialTimeTicket);
|
|
7391
|
-
this.dummyHead =
|
|
7512
|
+
this.dummyHead = RGATreeListNode.createWithElement(dummyValue);
|
|
7392
7513
|
this.last = this.dummyHead;
|
|
7393
7514
|
this.nodeMapByIndex = new SplayTree();
|
|
7394
7515
|
this.nodeMapByCreatedAt = /* @__PURE__ */ new Map();
|
|
7516
|
+
this.elementMapByCreatedAt = /* @__PURE__ */ new Map();
|
|
7395
7517
|
this.nodeMapByIndex.insert(this.dummyHead);
|
|
7396
7518
|
this.nodeMapByCreatedAt.set(
|
|
7397
7519
|
this.dummyHead.getCreatedAt().toIDString(),
|
|
@@ -7411,22 +7533,10 @@
|
|
|
7411
7533
|
return this.nodeMapByIndex.length;
|
|
7412
7534
|
}
|
|
7413
7535
|
/**
|
|
7414
|
-
* `findNextBeforeExecutedAt`
|
|
7415
|
-
*
|
|
7416
|
-
* given node and returns the next node.
|
|
7417
|
-
* @returns the next node of the given createdAt and executedAt
|
|
7536
|
+
* `findNextBeforeExecutedAt` walks forward from the given node,
|
|
7537
|
+
* skipping nodes positioned after executedAt (RGA insertion rule).
|
|
7418
7538
|
*/
|
|
7419
|
-
findNextBeforeExecutedAt(
|
|
7420
|
-
let node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
|
|
7421
|
-
if (!node) {
|
|
7422
|
-
throw new YorkieError(
|
|
7423
|
-
Code.ErrInvalidArgument,
|
|
7424
|
-
`cant find the given node: ${createdAt.toIDString()}`
|
|
7425
|
-
);
|
|
7426
|
-
}
|
|
7427
|
-
while (node.getValue().getMovedAt() && node.getValue().getMovedAt().after(executedAt) && node.getMovedFrom()) {
|
|
7428
|
-
node = node.getMovedFrom();
|
|
7429
|
-
}
|
|
7539
|
+
findNextBeforeExecutedAt(node, executedAt) {
|
|
7430
7540
|
while (node.getNext() && node.getNext().getPositionedAt().after(executedAt)) {
|
|
7431
7541
|
node = node.getNext();
|
|
7432
7542
|
}
|
|
@@ -7438,65 +7548,103 @@
|
|
|
7438
7548
|
}
|
|
7439
7549
|
node.release();
|
|
7440
7550
|
this.nodeMapByIndex.delete(node);
|
|
7441
|
-
this.nodeMapByCreatedAt.delete(node.
|
|
7551
|
+
this.nodeMapByCreatedAt.delete(node.getPositionCreatedAt().toIDString());
|
|
7442
7552
|
}
|
|
7443
7553
|
/**
|
|
7444
|
-
* `insertAfter` adds a new node with the value after the given
|
|
7554
|
+
* `insertAfter` adds a new node with the value after the given
|
|
7555
|
+
* position. prevCreatedAt is a position node identity. Looks up
|
|
7556
|
+
* nodeMapByCreatedAt first, then elementMapByCreatedAt for backward
|
|
7557
|
+
* compatibility.
|
|
7445
7558
|
*/
|
|
7446
7559
|
insertAfter(prevCreatedAt, value, executedAt = value.getCreatedAt()) {
|
|
7447
|
-
|
|
7560
|
+
let startNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
|
|
7561
|
+
if (!startNode) {
|
|
7562
|
+
const entry = this.elementMapByCreatedAt.get(prevCreatedAt.toIDString());
|
|
7563
|
+
if (entry) {
|
|
7564
|
+
startNode = entry.positionNode;
|
|
7565
|
+
}
|
|
7566
|
+
}
|
|
7567
|
+
if (!startNode) {
|
|
7568
|
+
throw new YorkieError(
|
|
7569
|
+
Code.ErrInvalidArgument,
|
|
7570
|
+
`cant find the given node: ${prevCreatedAt.toIDString()}`
|
|
7571
|
+
);
|
|
7572
|
+
}
|
|
7573
|
+
const prevNode = this.findNextBeforeExecutedAt(startNode, executedAt);
|
|
7448
7574
|
const newNode = RGATreeListNode.createAfter(prevNode, value);
|
|
7449
7575
|
if (prevNode === this.last) {
|
|
7450
7576
|
this.last = newNode;
|
|
7451
7577
|
}
|
|
7452
7578
|
this.nodeMapByIndex.insertAfter(prevNode, newNode);
|
|
7453
|
-
this.nodeMapByCreatedAt.set(
|
|
7579
|
+
this.nodeMapByCreatedAt.set(value.getCreatedAt().toIDString(), newNode);
|
|
7580
|
+
this.elementMapByCreatedAt.set(
|
|
7581
|
+
value.getCreatedAt().toIDString(),
|
|
7582
|
+
newNode.getElementEntry()
|
|
7583
|
+
);
|
|
7454
7584
|
return newNode;
|
|
7455
7585
|
}
|
|
7456
7586
|
/**
|
|
7457
|
-
* `
|
|
7458
|
-
*
|
|
7587
|
+
* `insertPositionAfter` creates a bare position node after
|
|
7588
|
+
* resolving position via forward skip (RGA insertion rule).
|
|
7589
|
+
* Used by moveAfter. prevCreatedAt is a POSITION node identity.
|
|
7590
|
+
*/
|
|
7591
|
+
insertPositionAfter(prevCreatedAt, executedAt) {
|
|
7592
|
+
const startNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
|
|
7593
|
+
if (!startNode) {
|
|
7594
|
+
throw new YorkieError(
|
|
7595
|
+
Code.ErrInvalidArgument,
|
|
7596
|
+
`cant find the given node: ${prevCreatedAt.toIDString()}`
|
|
7597
|
+
);
|
|
7598
|
+
}
|
|
7599
|
+
const prevNode = this.findNextBeforeExecutedAt(startNode, executedAt);
|
|
7600
|
+
const newNode = RGATreeListNode.createBarePosition(executedAt);
|
|
7601
|
+
RGATreeListNode.insertNodeAfter(prevNode, newNode);
|
|
7602
|
+
if (prevNode === this.last) {
|
|
7603
|
+
this.last = newNode;
|
|
7604
|
+
}
|
|
7605
|
+
this.nodeMapByIndex.insertAfter(prevNode, newNode);
|
|
7606
|
+
this.nodeMapByCreatedAt.set(executedAt.toIDString(), newNode);
|
|
7607
|
+
return newNode;
|
|
7608
|
+
}
|
|
7609
|
+
/**
|
|
7610
|
+
* `moveAfter` moves the given `createdAt` element after the
|
|
7611
|
+
* `prevCreatedAt` element using LWW position register semantics.
|
|
7612
|
+
* Returns the dead position node (if any) for GC registration.
|
|
7459
7613
|
*/
|
|
7460
7614
|
moveAfter(prevCreatedAt, createdAt, executedAt) {
|
|
7461
|
-
|
|
7462
|
-
if (!prevNode) {
|
|
7615
|
+
if (!this.nodeMapByCreatedAt.has(prevCreatedAt.toIDString())) {
|
|
7463
7616
|
throw new YorkieError(
|
|
7464
7617
|
Code.ErrInvalidArgument,
|
|
7465
7618
|
`cant find the given node: ${prevCreatedAt.toIDString()}`
|
|
7466
7619
|
);
|
|
7467
7620
|
}
|
|
7468
|
-
|
|
7469
|
-
if (!
|
|
7621
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7622
|
+
if (!entry) {
|
|
7470
7623
|
throw new YorkieError(
|
|
7471
7624
|
Code.ErrInvalidArgument,
|
|
7472
7625
|
`cant find the given node: ${createdAt.toIDString()}`
|
|
7473
7626
|
);
|
|
7474
7627
|
}
|
|
7475
|
-
if (
|
|
7476
|
-
|
|
7477
|
-
|
|
7478
|
-
this.release(node);
|
|
7479
|
-
node = this.insertAfter(
|
|
7480
|
-
prevNode.getCreatedAt(),
|
|
7481
|
-
node.getValue(),
|
|
7482
|
-
executedAt
|
|
7483
|
-
);
|
|
7484
|
-
node.getValue().setMovedAt(executedAt);
|
|
7485
|
-
node.setMovedFrom(movedFrom);
|
|
7486
|
-
while (nextNode && nextNode.getPositionedAt().after(executedAt)) {
|
|
7487
|
-
prevNode = node;
|
|
7488
|
-
node = nextNode;
|
|
7489
|
-
nextNode = node.getNext();
|
|
7490
|
-
this.release(node);
|
|
7491
|
-
node = this.insertAfter(
|
|
7492
|
-
prevNode.getCreatedAt(),
|
|
7493
|
-
node.getValue(),
|
|
7494
|
-
executedAt
|
|
7495
|
-
);
|
|
7496
|
-
node.getValue().setMovedAt(executedAt);
|
|
7497
|
-
node.setMovedFrom(movedFrom);
|
|
7628
|
+
if (entry.posMovedAt && !executedAt.after(entry.posMovedAt)) {
|
|
7629
|
+
if (this.nodeMapByCreatedAt.has(executedAt.toIDString())) {
|
|
7630
|
+
return void 0;
|
|
7498
7631
|
}
|
|
7632
|
+
const deadPosNode = this.insertPositionAfter(prevCreatedAt, executedAt);
|
|
7633
|
+
deadPosNode.setRemovedAt(executedAt);
|
|
7634
|
+
this.nodeMapByIndex.splayNode(deadPosNode);
|
|
7635
|
+
return deadPosNode;
|
|
7499
7636
|
}
|
|
7637
|
+
const newPosNode = this.insertPositionAfter(prevCreatedAt, executedAt);
|
|
7638
|
+
const oldPosNode = entry.positionNode;
|
|
7639
|
+
oldPosNode.setElementEntry(void 0);
|
|
7640
|
+
oldPosNode.setRemovedAt(executedAt);
|
|
7641
|
+
this.nodeMapByIndex.splayNode(oldPosNode);
|
|
7642
|
+
newPosNode.setElementEntry(entry);
|
|
7643
|
+
entry.positionNode = newPosNode;
|
|
7644
|
+
entry.posMovedAt = executedAt;
|
|
7645
|
+
entry.elem.setMovedAt(executedAt);
|
|
7646
|
+
this.nodeMapByIndex.splayNode(newPosNode);
|
|
7647
|
+
return oldPosNode;
|
|
7500
7648
|
}
|
|
7501
7649
|
/**
|
|
7502
7650
|
* `insert` adds the given element after the last node.
|
|
@@ -7505,34 +7653,53 @@
|
|
|
7505
7653
|
this.insertAfter(this.last.getCreatedAt(), value);
|
|
7506
7654
|
}
|
|
7507
7655
|
/**
|
|
7508
|
-
* `getByID` returns the
|
|
7656
|
+
* `getByID` returns the node of the given creation time.
|
|
7657
|
+
* Checks elementMapByCreatedAt first (for moved elements whose
|
|
7658
|
+
* position node createdAt differs), then nodeMapByCreatedAt.
|
|
7509
7659
|
*/
|
|
7510
7660
|
getByID(createdAt) {
|
|
7661
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7662
|
+
if (entry) {
|
|
7663
|
+
return entry.positionNode;
|
|
7664
|
+
}
|
|
7511
7665
|
return this.nodeMapByCreatedAt.get(createdAt.toIDString());
|
|
7512
7666
|
}
|
|
7513
7667
|
/**
|
|
7514
7668
|
* `subPathOf` returns the sub path of the given element.
|
|
7515
7669
|
*/
|
|
7516
7670
|
subPathOf(createdAt) {
|
|
7517
|
-
const
|
|
7518
|
-
if (!
|
|
7519
|
-
|
|
7671
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7672
|
+
if (!entry) {
|
|
7673
|
+
const node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
|
|
7674
|
+
if (!node) {
|
|
7675
|
+
return;
|
|
7676
|
+
}
|
|
7677
|
+
return String(this.nodeMapByIndex.indexOf(node));
|
|
7520
7678
|
}
|
|
7521
|
-
return String(this.nodeMapByIndex.indexOf(
|
|
7679
|
+
return String(this.nodeMapByIndex.indexOf(entry.positionNode));
|
|
7522
7680
|
}
|
|
7523
7681
|
/**
|
|
7524
|
-
* `purge` physically purges
|
|
7682
|
+
* `purge` physically purges the given child. Handles both dead
|
|
7683
|
+
* position nodes (GCChild from GCParent path) and CRDTElements
|
|
7684
|
+
* (from CRDTContainer path).
|
|
7525
7685
|
*/
|
|
7526
|
-
purge(
|
|
7527
|
-
|
|
7686
|
+
purge(child) {
|
|
7687
|
+
if (child instanceof RGATreeListNode) {
|
|
7688
|
+
this.release(child);
|
|
7689
|
+
return;
|
|
7690
|
+
}
|
|
7691
|
+
const element = child;
|
|
7692
|
+
const entry = this.elementMapByCreatedAt.get(
|
|
7528
7693
|
element.getCreatedAt().toIDString()
|
|
7529
7694
|
);
|
|
7530
|
-
if (!
|
|
7695
|
+
if (!entry) {
|
|
7531
7696
|
throw new YorkieError(
|
|
7532
7697
|
Code.ErrInvalidArgument,
|
|
7533
7698
|
`fail to find the given createdAt: ${element.getCreatedAt().toIDString()}`
|
|
7534
7699
|
);
|
|
7535
7700
|
}
|
|
7701
|
+
const node = entry.positionNode;
|
|
7702
|
+
this.elementMapByCreatedAt.delete(element.getCreatedAt().toIDString());
|
|
7536
7703
|
this.release(node);
|
|
7537
7704
|
}
|
|
7538
7705
|
/**
|
|
@@ -7543,42 +7710,69 @@
|
|
|
7543
7710
|
return;
|
|
7544
7711
|
}
|
|
7545
7712
|
const node = this.nodeMapByIndex.findForArray(idx);
|
|
7546
|
-
|
|
7547
|
-
return rgaNode;
|
|
7713
|
+
return node;
|
|
7548
7714
|
}
|
|
7549
7715
|
/**
|
|
7550
|
-
* `
|
|
7716
|
+
* `findPrevCreatedAt` returns the position node's createdAt of the
|
|
7717
|
+
* previous element. This returns a position identity suitable for
|
|
7718
|
+
* use as prevCreatedAt in moveAfter.
|
|
7551
7719
|
*/
|
|
7552
|
-
|
|
7553
|
-
|
|
7720
|
+
findPrevCreatedAt(createdAt) {
|
|
7721
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7722
|
+
if (!entry) {
|
|
7723
|
+
throw new YorkieError(
|
|
7724
|
+
Code.ErrInvalidArgument,
|
|
7725
|
+
`cant find the given node: ${createdAt.toIDString()}`
|
|
7726
|
+
);
|
|
7727
|
+
}
|
|
7728
|
+
let node = entry.positionNode;
|
|
7554
7729
|
do {
|
|
7555
7730
|
node = node.getPrev();
|
|
7556
|
-
|
|
7557
|
-
|
|
7731
|
+
if (!node.getElementEntry()) {
|
|
7732
|
+
continue;
|
|
7733
|
+
}
|
|
7734
|
+
if (this.dummyHead === node || !node.isRemoved()) {
|
|
7735
|
+
break;
|
|
7736
|
+
}
|
|
7737
|
+
} while (node);
|
|
7738
|
+
return node.getPositionCreatedAt();
|
|
7739
|
+
}
|
|
7740
|
+
/**
|
|
7741
|
+
* `getPrevCreatedAt` returns the position node's createdAt of the
|
|
7742
|
+
* previous element. Delegates to findPrevCreatedAt.
|
|
7743
|
+
*/
|
|
7744
|
+
getPrevCreatedAt(createdAt) {
|
|
7745
|
+
return this.findPrevCreatedAt(createdAt);
|
|
7558
7746
|
}
|
|
7559
7747
|
/**
|
|
7560
7748
|
* `delete` deletes the node of the given creation time.
|
|
7561
7749
|
*/
|
|
7562
7750
|
delete(createdAt, editedAt) {
|
|
7563
|
-
const
|
|
7751
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7752
|
+
if (!entry) {
|
|
7753
|
+
throw new YorkieError(
|
|
7754
|
+
Code.ErrInvalidArgument,
|
|
7755
|
+
`cant find the given node: ${createdAt.toIDString()}`
|
|
7756
|
+
);
|
|
7757
|
+
}
|
|
7758
|
+
const node = entry.positionNode;
|
|
7564
7759
|
const alreadyRemoved = node.isRemoved();
|
|
7565
|
-
if (
|
|
7760
|
+
if (entry.elem.remove(editedAt) && !alreadyRemoved) {
|
|
7566
7761
|
this.nodeMapByIndex.splayNode(node);
|
|
7567
7762
|
}
|
|
7568
|
-
return
|
|
7763
|
+
return entry.elem;
|
|
7569
7764
|
}
|
|
7570
7765
|
/**
|
|
7571
7766
|
* `set` sets the given element at the given creation time.
|
|
7572
7767
|
*/
|
|
7573
7768
|
set(createdAt, element, executedAt) {
|
|
7574
|
-
|
|
7575
|
-
if (!node) {
|
|
7769
|
+
if (!this.elementMapByCreatedAt.has(createdAt.toIDString())) {
|
|
7576
7770
|
throw new YorkieError(
|
|
7577
7771
|
Code.ErrInvalidArgument,
|
|
7578
7772
|
`cant find the given node: ${createdAt.toIDString()}`
|
|
7579
7773
|
);
|
|
7580
7774
|
}
|
|
7581
|
-
this.insertAfter(
|
|
7775
|
+
this.insertAfter(createdAt, element, executedAt);
|
|
7582
7776
|
return this.delete(createdAt, executedAt);
|
|
7583
7777
|
}
|
|
7584
7778
|
/**
|
|
@@ -7607,18 +7801,80 @@
|
|
|
7607
7801
|
return this.last.getValue();
|
|
7608
7802
|
}
|
|
7609
7803
|
/**
|
|
7610
|
-
* `getLastCreatedAt` returns the
|
|
7804
|
+
* `getLastCreatedAt` returns the position node's createdAt of the
|
|
7805
|
+
* last node in the linked list. This is a position identity
|
|
7806
|
+
* suitable for use as prevCreatedAt.
|
|
7611
7807
|
*/
|
|
7612
7808
|
getLastCreatedAt() {
|
|
7613
|
-
return this.last.
|
|
7809
|
+
return this.last.getPositionCreatedAt();
|
|
7614
7810
|
}
|
|
7615
7811
|
/**
|
|
7616
|
-
* `
|
|
7617
|
-
*
|
|
7812
|
+
* `posCreatedAt` returns the createdAt of the position node
|
|
7813
|
+
* currently holding the element. Used to convert element identity
|
|
7814
|
+
* to position identity.
|
|
7815
|
+
*/
|
|
7816
|
+
posCreatedAt(elemCreatedAt) {
|
|
7817
|
+
const entry = this.elementMapByCreatedAt.get(elemCreatedAt.toIDString());
|
|
7818
|
+
if (!entry) {
|
|
7819
|
+
throw new YorkieError(
|
|
7820
|
+
Code.ErrInvalidArgument,
|
|
7821
|
+
`cant find the given node: ${elemCreatedAt.toIDString()}`
|
|
7822
|
+
);
|
|
7823
|
+
}
|
|
7824
|
+
return entry.positionNode.getPositionCreatedAt();
|
|
7825
|
+
}
|
|
7826
|
+
/**
|
|
7827
|
+
* `addDeadPosition` appends a dead position node during snapshot
|
|
7828
|
+
* restoration.
|
|
7829
|
+
*/
|
|
7830
|
+
addDeadPosition(posCreatedAt, removedAt) {
|
|
7831
|
+
const node = RGATreeListNode.createBarePosition(posCreatedAt);
|
|
7832
|
+
node.setRemovedAt(removedAt);
|
|
7833
|
+
const prevNode = this.last;
|
|
7834
|
+
RGATreeListNode.insertNodeAfter(prevNode, node);
|
|
7835
|
+
this.last = node;
|
|
7836
|
+
this.nodeMapByIndex.insertAfter(prevNode, node);
|
|
7837
|
+
this.nodeMapByCreatedAt.set(posCreatedAt.toIDString(), node);
|
|
7838
|
+
}
|
|
7839
|
+
/**
|
|
7840
|
+
* `addMovedElement` appends an element with explicit position
|
|
7841
|
+
* identity during snapshot restoration.
|
|
7842
|
+
*/
|
|
7843
|
+
addMovedElement(elem, posCreatedAt, posMovedAt) {
|
|
7844
|
+
const entry = new ElementEntry(elem);
|
|
7845
|
+
entry.posMovedAt = posMovedAt;
|
|
7846
|
+
const node = RGATreeListNode.createBarePosition(posCreatedAt);
|
|
7847
|
+
node.setElementEntry(entry);
|
|
7848
|
+
entry.positionNode = node;
|
|
7849
|
+
const prevNode = this.last;
|
|
7850
|
+
RGATreeListNode.insertNodeAfter(prevNode, node);
|
|
7851
|
+
this.last = node;
|
|
7852
|
+
this.nodeMapByIndex.insertAfter(prevNode, node);
|
|
7853
|
+
this.nodeMapByCreatedAt.set(posCreatedAt.toIDString(), node);
|
|
7854
|
+
this.elementMapByCreatedAt.set(elem.getCreatedAt().toIDString(), entry);
|
|
7855
|
+
}
|
|
7856
|
+
/**
|
|
7857
|
+
* `allNodes` returns all nodes including dead position nodes.
|
|
7858
|
+
*/
|
|
7859
|
+
allNodes() {
|
|
7860
|
+
const nodes = [];
|
|
7861
|
+
let current = this.dummyHead.getNext();
|
|
7862
|
+
while (current) {
|
|
7863
|
+
nodes.push(current);
|
|
7864
|
+
current = current.getNext();
|
|
7865
|
+
}
|
|
7866
|
+
return nodes;
|
|
7867
|
+
}
|
|
7868
|
+
/**
|
|
7869
|
+
* `toTestString` returns a String containing the meta data of the
|
|
7870
|
+
* node id for debugging purpose.
|
|
7618
7871
|
*/
|
|
7619
7872
|
toTestString() {
|
|
7620
7873
|
const json = [];
|
|
7621
7874
|
for (const node of this) {
|
|
7875
|
+
if (!node.getElementEntry()) {
|
|
7876
|
+
continue;
|
|
7877
|
+
}
|
|
7622
7878
|
const elem = `${node.getCreatedAt().toIDString()}:${node.getValue().toJSON()}`;
|
|
7623
7879
|
if (node.isRemoved()) {
|
|
7624
7880
|
json.push(`{${elem}}`);
|
|
@@ -7675,10 +7931,11 @@
|
|
|
7675
7931
|
this.elements.insertAfter(prevCreatedAt, value, executedAt);
|
|
7676
7932
|
}
|
|
7677
7933
|
/**
|
|
7678
|
-
* `moveAfter` moves the given `createdAt` element after the
|
|
7934
|
+
* `moveAfter` moves the given `createdAt` element after the
|
|
7935
|
+
* `prevCreatedAt`. Returns the dead position node for GC.
|
|
7679
7936
|
*/
|
|
7680
7937
|
moveAfter(prevCreatedAt, createdAt, executedAt) {
|
|
7681
|
-
this.elements.moveAfter(prevCreatedAt, createdAt, executedAt);
|
|
7938
|
+
return this.elements.moveAfter(prevCreatedAt, createdAt, executedAt);
|
|
7682
7939
|
}
|
|
7683
7940
|
/**
|
|
7684
7941
|
* `get` returns the element of the given index.
|
|
@@ -7707,11 +7964,20 @@
|
|
|
7707
7964
|
return this.elements.getLast();
|
|
7708
7965
|
}
|
|
7709
7966
|
/**
|
|
7710
|
-
* `getPrevCreatedAt` returns the creation time of the previous
|
|
7967
|
+
* `getPrevCreatedAt` returns the creation time of the previous
|
|
7968
|
+
* node.
|
|
7711
7969
|
*/
|
|
7712
7970
|
getPrevCreatedAt(createdAt) {
|
|
7713
7971
|
return this.elements.getPrevCreatedAt(createdAt);
|
|
7714
7972
|
}
|
|
7973
|
+
/**
|
|
7974
|
+
* `posCreatedAt` returns the createdAt of the position node
|
|
7975
|
+
* currently holding the element. Used to convert element identity
|
|
7976
|
+
* to position identity for moves.
|
|
7977
|
+
*/
|
|
7978
|
+
posCreatedAt(elemCreatedAt) {
|
|
7979
|
+
return this.elements.posCreatedAt(elemCreatedAt);
|
|
7980
|
+
}
|
|
7715
7981
|
/**
|
|
7716
7982
|
* `delete` deletes the element of the given creation time.
|
|
7717
7983
|
*/
|
|
@@ -7725,7 +7991,8 @@
|
|
|
7725
7991
|
return this.elements.deleteByIndex(index, editedAt);
|
|
7726
7992
|
}
|
|
7727
7993
|
/**
|
|
7728
|
-
* `set` sets the given element at the given position of the
|
|
7994
|
+
* `set` sets the given element at the given position of the
|
|
7995
|
+
* creation time.
|
|
7729
7996
|
*/
|
|
7730
7997
|
set(createdAt, value, executedAt) {
|
|
7731
7998
|
return this.elements.set(createdAt, value, executedAt);
|
|
@@ -7743,18 +8010,19 @@
|
|
|
7743
8010
|
return this.elements.length;
|
|
7744
8011
|
}
|
|
7745
8012
|
/**
|
|
7746
|
-
* `[Symbol.iterator]` returns an iterator for the elements in
|
|
8013
|
+
* `[Symbol.iterator]` returns an iterator for the elements in
|
|
8014
|
+
* this array.
|
|
7747
8015
|
*/
|
|
7748
8016
|
*[Symbol.iterator]() {
|
|
7749
8017
|
for (const node of this.elements) {
|
|
7750
|
-
if (!node.isRemoved()) {
|
|
8018
|
+
if (node.getElementEntry() && !node.isRemoved()) {
|
|
7751
8019
|
yield node.getValue();
|
|
7752
8020
|
}
|
|
7753
8021
|
}
|
|
7754
8022
|
}
|
|
7755
8023
|
/**
|
|
7756
|
-
* `toTestString` returns a String containing the meta data of
|
|
7757
|
-
* for debugging purpose.
|
|
8024
|
+
* `toTestString` returns a String containing the meta data of
|
|
8025
|
+
* this value for debugging purpose.
|
|
7758
8026
|
*/
|
|
7759
8027
|
toTestString() {
|
|
7760
8028
|
return this.elements.toTestString();
|
|
@@ -7764,6 +8032,9 @@
|
|
|
7764
8032
|
*/
|
|
7765
8033
|
getDescendants(callback) {
|
|
7766
8034
|
for (const node of this.elements) {
|
|
8035
|
+
if (!node.getElementEntry()) {
|
|
8036
|
+
continue;
|
|
8037
|
+
}
|
|
7767
8038
|
const element = node.getValue();
|
|
7768
8039
|
if (callback(element, this)) {
|
|
7769
8040
|
return;
|
|
@@ -7825,21 +8096,52 @@
|
|
|
7825
8096
|
return this.toJSON();
|
|
7826
8097
|
}
|
|
7827
8098
|
/**
|
|
7828
|
-
* `getElements` returns
|
|
8099
|
+
* `getElements` returns the underlying RGATreeList.
|
|
7829
8100
|
*/
|
|
7830
8101
|
getElements() {
|
|
7831
8102
|
return this.elements;
|
|
7832
8103
|
}
|
|
8104
|
+
/**
|
|
8105
|
+
* `getRGATreeList` returns the underlying RGATreeList (GCParent
|
|
8106
|
+
* for dead positions).
|
|
8107
|
+
*/
|
|
8108
|
+
getRGATreeList() {
|
|
8109
|
+
return this.elements;
|
|
8110
|
+
}
|
|
8111
|
+
/**
|
|
8112
|
+
* `getAllRGANodes` returns all RGA nodes including dead position
|
|
8113
|
+
* nodes.
|
|
8114
|
+
*/
|
|
8115
|
+
getAllRGANodes() {
|
|
8116
|
+
return this.elements.allNodes();
|
|
8117
|
+
}
|
|
7833
8118
|
/**
|
|
7834
8119
|
* `deepcopy` copies itself deeply.
|
|
7835
8120
|
*/
|
|
7836
8121
|
deepcopy() {
|
|
7837
8122
|
const clone = CRDTArray.create(this.getCreatedAt());
|
|
7838
8123
|
for (const node of this.elements) {
|
|
7839
|
-
|
|
7840
|
-
|
|
7841
|
-
|
|
7842
|
-
|
|
8124
|
+
if (!node.getElementEntry()) {
|
|
8125
|
+
const removedAt = node.getRemovedAt();
|
|
8126
|
+
if (removedAt) {
|
|
8127
|
+
clone.elements.addDeadPosition(
|
|
8128
|
+
node.getPositionCreatedAt(),
|
|
8129
|
+
removedAt
|
|
8130
|
+
);
|
|
8131
|
+
}
|
|
8132
|
+
continue;
|
|
8133
|
+
}
|
|
8134
|
+
const value = node.getValue().deepcopy();
|
|
8135
|
+
const posMovedAt = node.getPositionMovedAt();
|
|
8136
|
+
if (posMovedAt) {
|
|
8137
|
+
clone.elements.addMovedElement(
|
|
8138
|
+
value,
|
|
8139
|
+
node.getPositionCreatedAt(),
|
|
8140
|
+
posMovedAt
|
|
8141
|
+
);
|
|
8142
|
+
} else {
|
|
8143
|
+
clone.elements.insertAfter(clone.getLastCreatedAt(), value);
|
|
8144
|
+
}
|
|
7843
8145
|
}
|
|
7844
8146
|
clone.setRemovedAt(this.getRemovedAt());
|
|
7845
8147
|
clone.setMovedAt(this.getMovedAt());
|
|
@@ -8096,6 +8398,9 @@
|
|
|
8096
8398
|
if (removed) {
|
|
8097
8399
|
root.registerRemovedElement(removed);
|
|
8098
8400
|
}
|
|
8401
|
+
if (value.getRemovedAt()) {
|
|
8402
|
+
root.registerRemovedElement(value);
|
|
8403
|
+
}
|
|
8099
8404
|
return {
|
|
8100
8405
|
opInfos: [
|
|
8101
8406
|
{
|
|
@@ -8188,7 +8493,17 @@
|
|
|
8188
8493
|
const array = parentObject;
|
|
8189
8494
|
const reverseOp = this.toReverseOperation(array);
|
|
8190
8495
|
const previousIndex = Number(array.subPathOf(this.createdAt));
|
|
8191
|
-
array.moveAfter(
|
|
8496
|
+
const deadNode = array.moveAfter(
|
|
8497
|
+
this.prevCreatedAt,
|
|
8498
|
+
this.createdAt,
|
|
8499
|
+
this.getExecutedAt()
|
|
8500
|
+
);
|
|
8501
|
+
if (deadNode) {
|
|
8502
|
+
root.registerGCPair({
|
|
8503
|
+
parent: array.getRGATreeList(),
|
|
8504
|
+
child: deadNode
|
|
8505
|
+
});
|
|
8506
|
+
}
|
|
8192
8507
|
const index = Number(array.subPathOf(this.createdAt));
|
|
8193
8508
|
return {
|
|
8194
8509
|
opInfos: [
|
|
@@ -8211,7 +8526,8 @@
|
|
|
8211
8526
|
);
|
|
8212
8527
|
}
|
|
8213
8528
|
/**
|
|
8214
|
-
* `getEffectedCreatedAt` returns the creation time of the
|
|
8529
|
+
* `getEffectedCreatedAt` returns the creation time of the
|
|
8530
|
+
* effected element.
|
|
8215
8531
|
*/
|
|
8216
8532
|
getEffectedCreatedAt() {
|
|
8217
8533
|
return this.createdAt;
|
|
@@ -8223,7 +8539,8 @@
|
|
|
8223
8539
|
return `${this.getParentCreatedAt().toTestString()}.MOVE`;
|
|
8224
8540
|
}
|
|
8225
8541
|
/**
|
|
8226
|
-
* `getPrevCreatedAt` returns the creation time of previous
|
|
8542
|
+
* `getPrevCreatedAt` returns the creation time of previous
|
|
8543
|
+
* element.
|
|
8227
8544
|
*/
|
|
8228
8545
|
getPrevCreatedAt() {
|
|
8229
8546
|
return this.prevCreatedAt;
|
|
@@ -8235,7 +8552,8 @@
|
|
|
8235
8552
|
return this.createdAt;
|
|
8236
8553
|
}
|
|
8237
8554
|
/**
|
|
8238
|
-
* `setPrevCreatedAt` sets the creation time of the previous
|
|
8555
|
+
* `setPrevCreatedAt` sets the creation time of the previous
|
|
8556
|
+
* element.
|
|
8239
8557
|
*/
|
|
8240
8558
|
setPrevCreatedAt(createdAt) {
|
|
8241
8559
|
this.prevCreatedAt = createdAt;
|
|
@@ -10816,6 +11134,32 @@
|
|
|
10816
11134
|
}
|
|
10817
11135
|
actualRight.push(child);
|
|
10818
11136
|
}
|
|
11137
|
+
if (versionVector) {
|
|
11138
|
+
const movedToLeft = [];
|
|
11139
|
+
const remaining = [];
|
|
11140
|
+
let boundaryReached = false;
|
|
11141
|
+
for (const child of actualRight) {
|
|
11142
|
+
if (!boundaryReached) {
|
|
11143
|
+
if (child.insPrevID !== void 0 && !child.isText) {
|
|
11144
|
+
remaining.push(child);
|
|
11145
|
+
continue;
|
|
11146
|
+
}
|
|
11147
|
+
const actorID = child.id.getCreatedAt().getActorID();
|
|
11148
|
+
const knownLamport = versionVector.get(actorID);
|
|
11149
|
+
if (knownLamport === void 0 || knownLamport < child.id.getCreatedAt().getLamport()) {
|
|
11150
|
+
movedToLeft.push(child);
|
|
11151
|
+
continue;
|
|
11152
|
+
}
|
|
11153
|
+
}
|
|
11154
|
+
boundaryReached = true;
|
|
11155
|
+
remaining.push(child);
|
|
11156
|
+
}
|
|
11157
|
+
if (movedToLeft.length > 0) {
|
|
11158
|
+
left.push(...movedToLeft);
|
|
11159
|
+
actualRight.length = 0;
|
|
11160
|
+
actualRight.push(...remaining);
|
|
11161
|
+
}
|
|
11162
|
+
}
|
|
10819
11163
|
this._children = left;
|
|
10820
11164
|
clone._children = actualRight;
|
|
10821
11165
|
this.visibleSize = this._children.reduce(
|
|
@@ -11579,7 +11923,7 @@
|
|
|
11579
11923
|
CRDTTreeNodeID.of(issueTimeTicket(), 0),
|
|
11580
11924
|
this.type,
|
|
11581
11925
|
void 0,
|
|
11582
|
-
|
|
11926
|
+
this.attrs?.deepcopy(),
|
|
11583
11927
|
this.removedAt
|
|
11584
11928
|
);
|
|
11585
11929
|
}
|
|
@@ -11592,8 +11936,14 @@
|
|
|
11592
11936
|
split.insPrevID = this.id;
|
|
11593
11937
|
if (this.insNextID) {
|
|
11594
11938
|
const insNext = tree.findFloorNode(this.insNextID);
|
|
11595
|
-
insNext.insPrevID = split.id;
|
|
11596
11939
|
split.insNextID = this.insNextID;
|
|
11940
|
+
if (insNext) {
|
|
11941
|
+
insNext.insPrevID = split.id;
|
|
11942
|
+
if (!this.isText && insNext.parent && !insNext.isRemoved && insNext.parent !== split.parent && split.allChildren.length === 0) {
|
|
11943
|
+
split.parent.detachChild(split);
|
|
11944
|
+
insNext.parent.insertBefore(split, insNext);
|
|
11945
|
+
}
|
|
11946
|
+
}
|
|
11597
11947
|
}
|
|
11598
11948
|
this.insNextID = split.id;
|
|
11599
11949
|
tree.registerNode(split);
|
|
@@ -11817,7 +12167,7 @@
|
|
|
11817
12167
|
* given node, advancing past element-type split siblings that the editing
|
|
11818
12168
|
* client did not know about (not in versionVector).
|
|
11819
12169
|
*/
|
|
11820
|
-
advancePastUnknownSplitSiblings(node, versionVector) {
|
|
12170
|
+
advancePastUnknownSplitSiblings(node, versionVector, relaxParentCheck = false, skipActorID) {
|
|
11821
12171
|
if (!versionVector || !node) {
|
|
11822
12172
|
return node;
|
|
11823
12173
|
}
|
|
@@ -11827,10 +12177,13 @@
|
|
|
11827
12177
|
if (!next || next.isText) {
|
|
11828
12178
|
break;
|
|
11829
12179
|
}
|
|
11830
|
-
if (next.parent !== current.parent) {
|
|
12180
|
+
if (!relaxParentCheck && next.parent !== current.parent) {
|
|
11831
12181
|
break;
|
|
11832
12182
|
}
|
|
11833
12183
|
const actorID = next.id.getCreatedAt().getActorID();
|
|
12184
|
+
if (skipActorID !== void 0 && actorID === skipActorID) {
|
|
12185
|
+
break;
|
|
12186
|
+
}
|
|
11834
12187
|
const knownLamport = versionVector.get(actorID);
|
|
11835
12188
|
if (knownLamport !== void 0 && knownLamport >= next.id.getCreatedAt().getLamport()) {
|
|
11836
12189
|
break;
|
|
@@ -11999,6 +12352,53 @@
|
|
|
11999
12352
|
addDataSizes(diff, curr.getDataSize());
|
|
12000
12353
|
}
|
|
12001
12354
|
}
|
|
12355
|
+
if (tokenType === TokenType.Start && versionVector !== void 0) {
|
|
12356
|
+
let current = node;
|
|
12357
|
+
while (current.insNextID) {
|
|
12358
|
+
const next = this.findFloorNode(current.insNextID);
|
|
12359
|
+
if (!next || next.isText) {
|
|
12360
|
+
break;
|
|
12361
|
+
}
|
|
12362
|
+
if (ticketKnown(versionVector, next.id.getCreatedAt())) {
|
|
12363
|
+
break;
|
|
12364
|
+
}
|
|
12365
|
+
const siblingPairs = next.setAttrs(attributes, editedAt);
|
|
12366
|
+
const siblingAffectedAttrs = siblingPairs.reduce(
|
|
12367
|
+
(acc, [, curr]) => {
|
|
12368
|
+
if (curr) {
|
|
12369
|
+
acc[curr.getKey()] = attrs[curr.getKey()];
|
|
12370
|
+
}
|
|
12371
|
+
return acc;
|
|
12372
|
+
},
|
|
12373
|
+
{}
|
|
12374
|
+
);
|
|
12375
|
+
if (Object.keys(siblingAffectedAttrs).length > 0) {
|
|
12376
|
+
const parentOfNext = next.parent;
|
|
12377
|
+
const previousNext = next.prevSibling || parentOfNext;
|
|
12378
|
+
changes.push({
|
|
12379
|
+
type: "style",
|
|
12380
|
+
from: this.toIndex(parentOfNext, previousNext),
|
|
12381
|
+
to: this.toIndex(next, next),
|
|
12382
|
+
fromPath: this.toPath(parentOfNext, previousNext),
|
|
12383
|
+
toPath: this.toPath(next, next),
|
|
12384
|
+
actor: editedAt.getActorID(),
|
|
12385
|
+
value: siblingAffectedAttrs
|
|
12386
|
+
});
|
|
12387
|
+
}
|
|
12388
|
+
for (const [prev] of siblingPairs) {
|
|
12389
|
+
if (prev) {
|
|
12390
|
+
pairs.push({ parent: next, child: prev });
|
|
12391
|
+
}
|
|
12392
|
+
}
|
|
12393
|
+
for (const [key] of Object.entries(attrs)) {
|
|
12394
|
+
const curr = next.attrs?.getNodeMapByKey().get(key);
|
|
12395
|
+
if (curr !== void 0) {
|
|
12396
|
+
addDataSizes(diff, curr.getDataSize());
|
|
12397
|
+
}
|
|
12398
|
+
}
|
|
12399
|
+
current = next;
|
|
12400
|
+
}
|
|
12401
|
+
}
|
|
12002
12402
|
}
|
|
12003
12403
|
}
|
|
12004
12404
|
);
|
|
@@ -12065,6 +12465,43 @@
|
|
|
12065
12465
|
toPath: this.toPath(node, node),
|
|
12066
12466
|
value: attributesToRemove
|
|
12067
12467
|
});
|
|
12468
|
+
if (tokenType === TokenType.Start && versionVector !== void 0) {
|
|
12469
|
+
let current = node;
|
|
12470
|
+
while (current.insNextID) {
|
|
12471
|
+
const next = this.findFloorNode(current.insNextID);
|
|
12472
|
+
if (!next || next.isText) {
|
|
12473
|
+
break;
|
|
12474
|
+
}
|
|
12475
|
+
if (ticketKnown(versionVector, next.id.getCreatedAt())) {
|
|
12476
|
+
break;
|
|
12477
|
+
}
|
|
12478
|
+
if (!next.attrs) {
|
|
12479
|
+
next.attrs = new RHT();
|
|
12480
|
+
}
|
|
12481
|
+
let removedAny = false;
|
|
12482
|
+
for (const value of attributesToRemove) {
|
|
12483
|
+
const nodesTobeRemoved = next.attrs.remove(value, editedAt);
|
|
12484
|
+
removedAny = removedAny || nodesTobeRemoved.length > 0;
|
|
12485
|
+
for (const rhtNode of nodesTobeRemoved) {
|
|
12486
|
+
pairs.push({ parent: next, child: rhtNode });
|
|
12487
|
+
}
|
|
12488
|
+
}
|
|
12489
|
+
if (removedAny) {
|
|
12490
|
+
const parentOfNext = next.parent;
|
|
12491
|
+
const previousNext = next.prevSibling || parentOfNext;
|
|
12492
|
+
changes.push({
|
|
12493
|
+
actor: editedAt.getActorID(),
|
|
12494
|
+
type: "removeStyle",
|
|
12495
|
+
from: this.toIndex(parentOfNext, previousNext),
|
|
12496
|
+
to: this.toIndex(next, next),
|
|
12497
|
+
fromPath: this.toPath(parentOfNext, previousNext),
|
|
12498
|
+
toPath: this.toPath(next, next),
|
|
12499
|
+
value: attributesToRemove
|
|
12500
|
+
});
|
|
12501
|
+
}
|
|
12502
|
+
current = next;
|
|
12503
|
+
}
|
|
12504
|
+
}
|
|
12068
12505
|
}
|
|
12069
12506
|
}
|
|
12070
12507
|
);
|
|
@@ -12087,6 +12524,23 @@
|
|
|
12087
12524
|
addDataSizes(diff, diffTo, diffFrom);
|
|
12088
12525
|
const fromLeft = fromLeftRaw !== fromParent ? this.advancePastUnknownSplitSiblings(fromLeftRaw, versionVector) : fromLeftRaw;
|
|
12089
12526
|
const toLeft = toLeftRaw !== toParent ? this.advancePastUnknownSplitSiblings(toLeftRaw, versionVector) : toLeftRaw;
|
|
12527
|
+
let collectFromParent = fromParent;
|
|
12528
|
+
let collectFromLeft = fromLeft;
|
|
12529
|
+
if (fromLeft !== fromParent && fromParent !== toParent) {
|
|
12530
|
+
let current = fromLeft;
|
|
12531
|
+
while (current.insNextID) {
|
|
12532
|
+
const next = this.findFloorNode(current.insNextID);
|
|
12533
|
+
if (!next || next.isText) {
|
|
12534
|
+
break;
|
|
12535
|
+
}
|
|
12536
|
+
if (next.parent && next.parent === toParent) {
|
|
12537
|
+
collectFromLeft = next;
|
|
12538
|
+
collectFromParent = toParent;
|
|
12539
|
+
break;
|
|
12540
|
+
}
|
|
12541
|
+
current = next;
|
|
12542
|
+
}
|
|
12543
|
+
}
|
|
12090
12544
|
const fromIdx = this.toIndex(fromParent, fromLeft);
|
|
12091
12545
|
const fromPath = this.toPath(fromParent, fromLeft);
|
|
12092
12546
|
const nodesToBeRemoved = [];
|
|
@@ -12095,8 +12549,8 @@
|
|
|
12095
12549
|
const toBeMergedNodes = [];
|
|
12096
12550
|
const preTombstoned = /* @__PURE__ */ new Set();
|
|
12097
12551
|
this.traverseInPosRange(
|
|
12098
|
-
|
|
12099
|
-
|
|
12552
|
+
collectFromParent,
|
|
12553
|
+
collectFromLeft,
|
|
12100
12554
|
toParent,
|
|
12101
12555
|
toLeft,
|
|
12102
12556
|
([node, tokenType], ended) => {
|
|
@@ -12200,9 +12654,20 @@
|
|
|
12200
12654
|
let parent = fromParent;
|
|
12201
12655
|
let left = fromLeft;
|
|
12202
12656
|
while (splitCount < splitLevel) {
|
|
12657
|
+
if (left !== parent) {
|
|
12658
|
+
left = this.advancePastUnknownSplitSiblings(
|
|
12659
|
+
left,
|
|
12660
|
+
versionVector,
|
|
12661
|
+
true,
|
|
12662
|
+
editedAt.getActorID()
|
|
12663
|
+
);
|
|
12664
|
+
if (left.parent && left.parent !== parent) {
|
|
12665
|
+
parent = left.parent;
|
|
12666
|
+
}
|
|
12667
|
+
}
|
|
12203
12668
|
parent.split(
|
|
12204
12669
|
this,
|
|
12205
|
-
parent.findOffset(left, true) + 1,
|
|
12670
|
+
left !== parent ? parent.findOffset(left, true) + 1 : 0,
|
|
12206
12671
|
issueTimeTicket,
|
|
12207
12672
|
versionVector
|
|
12208
12673
|
);
|
|
@@ -12809,10 +13274,10 @@
|
|
|
12809
13274
|
);
|
|
12810
13275
|
this.lastToIdx = preEditFromIdx + removedSize;
|
|
12811
13276
|
let reverseOp;
|
|
12812
|
-
const
|
|
13277
|
+
const isPureSplit = this.splitLevel > 0 && !this.contents?.length && removedNodes.length === 0;
|
|
12813
13278
|
if (this.splitLevel === 0) {
|
|
12814
13279
|
reverseOp = this.toReverseOperation(tree, removedNodes, preEditFromIdx);
|
|
12815
|
-
} else if (
|
|
13280
|
+
} else if (isPureSplit) {
|
|
12816
13281
|
reverseOp = this.toSplitReverseOperation(tree, preEditFromIdx);
|
|
12817
13282
|
}
|
|
12818
13283
|
root.acc(diff);
|
|
@@ -14823,14 +15288,26 @@
|
|
|
14823
15288
|
}
|
|
14824
15289
|
return pbRHTNodes;
|
|
14825
15290
|
}
|
|
14826
|
-
function toRGANodes(
|
|
15291
|
+
function toRGANodes(arr) {
|
|
14827
15292
|
const pbRGANodes = [];
|
|
14828
|
-
for (const
|
|
14829
|
-
|
|
14830
|
-
|
|
14831
|
-
|
|
14832
|
-
|
|
14833
|
-
|
|
15293
|
+
for (const rgaNode of arr.getAllRGANodes()) {
|
|
15294
|
+
if (!rgaNode.getElementEntry()) {
|
|
15295
|
+
pbRGANodes.push(
|
|
15296
|
+
create(RGANodeSchema, {
|
|
15297
|
+
positionCreatedAt: toTimeTicket(rgaNode.getPositionCreatedAt()),
|
|
15298
|
+
positionRemovedAt: toTimeTicket(rgaNode.getRemovedAt())
|
|
15299
|
+
})
|
|
15300
|
+
);
|
|
15301
|
+
continue;
|
|
15302
|
+
}
|
|
15303
|
+
const pbNode = create(RGANodeSchema, {
|
|
15304
|
+
element: toElement(rgaNode.getValue())
|
|
15305
|
+
});
|
|
15306
|
+
if (rgaNode.getPositionMovedAt()) {
|
|
15307
|
+
pbNode.positionMovedAt = toTimeTicket(rgaNode.getPositionMovedAt());
|
|
15308
|
+
pbNode.positionCreatedAt = toTimeTicket(rgaNode.getPositionCreatedAt());
|
|
15309
|
+
}
|
|
15310
|
+
pbRGANodes.push(pbNode);
|
|
14834
15311
|
}
|
|
14835
15312
|
return pbRGANodes;
|
|
14836
15313
|
}
|
|
@@ -14930,7 +15407,7 @@
|
|
|
14930
15407
|
body: {
|
|
14931
15408
|
case: "jsonArray",
|
|
14932
15409
|
value: create(JSONElement_JSONArraySchema, {
|
|
14933
|
-
nodes: toRGANodes(arr
|
|
15410
|
+
nodes: toRGANodes(arr),
|
|
14934
15411
|
createdAt: toTimeTicket(arr.getCreatedAt()),
|
|
14935
15412
|
movedAt: toTimeTicket(arr.getMovedAt()),
|
|
14936
15413
|
removedAt: toTimeTicket(arr.getRemovedAt())
|
|
@@ -15468,7 +15945,32 @@
|
|
|
15468
15945
|
function fromArray(pbArray) {
|
|
15469
15946
|
const rgaTreeList = new RGATreeList();
|
|
15470
15947
|
for (const pbRGANode of pbArray.nodes) {
|
|
15471
|
-
|
|
15948
|
+
if (!pbRGANode.element) {
|
|
15949
|
+
if (!pbRGANode.positionCreatedAt || !pbRGANode.positionRemovedAt) {
|
|
15950
|
+
throw new YorkieError(
|
|
15951
|
+
Code.ErrInvalidArgument,
|
|
15952
|
+
"dead RGA position node missing position timestamps"
|
|
15953
|
+
);
|
|
15954
|
+
}
|
|
15955
|
+
const posCreatedAt = fromTimeTicket(pbRGANode.positionCreatedAt);
|
|
15956
|
+
const posRemovedAt = fromTimeTicket(pbRGANode.positionRemovedAt);
|
|
15957
|
+
rgaTreeList.addDeadPosition(posCreatedAt, posRemovedAt);
|
|
15958
|
+
continue;
|
|
15959
|
+
}
|
|
15960
|
+
const elem = fromElement(pbRGANode.element);
|
|
15961
|
+
const posMovedAt = fromTimeTicket(pbRGANode.positionMovedAt);
|
|
15962
|
+
if (posMovedAt) {
|
|
15963
|
+
if (!pbRGANode.positionCreatedAt) {
|
|
15964
|
+
throw new YorkieError(
|
|
15965
|
+
Code.ErrInvalidArgument,
|
|
15966
|
+
"moved RGA node missing position_created_at"
|
|
15967
|
+
);
|
|
15968
|
+
}
|
|
15969
|
+
const posCreatedAt = fromTimeTicket(pbRGANode.positionCreatedAt);
|
|
15970
|
+
rgaTreeList.addMovedElement(elem, posCreatedAt, posMovedAt);
|
|
15971
|
+
} else {
|
|
15972
|
+
rgaTreeList.insert(elem);
|
|
15973
|
+
}
|
|
15472
15974
|
}
|
|
15473
15975
|
const arr = new CRDTArray(fromTimeTicket(pbArray.createdAt), rgaTreeList);
|
|
15474
15976
|
arr.setMovedAt(fromTimeTicket(pbArray.movedAt));
|
|
@@ -16256,10 +16758,16 @@
|
|
|
16256
16758
|
};
|
|
16257
16759
|
} else if (method === "insertAfter") {
|
|
16258
16760
|
return (prevID, value) => {
|
|
16761
|
+
let posCreatedAt;
|
|
16762
|
+
try {
|
|
16763
|
+
posCreatedAt = target.posCreatedAt(prevID);
|
|
16764
|
+
} catch {
|
|
16765
|
+
posCreatedAt = prevID;
|
|
16766
|
+
}
|
|
16259
16767
|
const inserted = ArrayProxy.insertAfterInternal(
|
|
16260
16768
|
context,
|
|
16261
16769
|
target,
|
|
16262
|
-
|
|
16770
|
+
posCreatedAt,
|
|
16263
16771
|
value
|
|
16264
16772
|
);
|
|
16265
16773
|
return toWrappedElement(context, inserted);
|
|
@@ -16444,7 +16952,7 @@
|
|
|
16444
16952
|
static moveBeforeInternal(context, target, nextCreatedAt, createdAt) {
|
|
16445
16953
|
const ticket = context.issueTimeTicket();
|
|
16446
16954
|
const prevCreatedAt = target.getPrevCreatedAt(nextCreatedAt);
|
|
16447
|
-
target.moveAfter(prevCreatedAt, createdAt, ticket);
|
|
16955
|
+
const deadNode = target.moveAfter(prevCreatedAt, createdAt, ticket);
|
|
16448
16956
|
context.push(
|
|
16449
16957
|
MoveOperation.create(
|
|
16450
16958
|
target.getCreatedAt(),
|
|
@@ -16453,26 +16961,45 @@
|
|
|
16453
16961
|
ticket
|
|
16454
16962
|
)
|
|
16455
16963
|
);
|
|
16964
|
+
if (deadNode) {
|
|
16965
|
+
context.registerGCPair({
|
|
16966
|
+
parent: target.getRGATreeList(),
|
|
16967
|
+
child: deadNode
|
|
16968
|
+
});
|
|
16969
|
+
}
|
|
16456
16970
|
}
|
|
16457
16971
|
/**
|
|
16458
16972
|
* `moveAfterInternal` moves the given `createdAt` element
|
|
16459
|
-
* after the specific element.
|
|
16973
|
+
* after the specific element. Converts element identity to
|
|
16974
|
+
* position identity for the prevCreatedAt.
|
|
16460
16975
|
*/
|
|
16461
16976
|
static moveAfterInternal(context, target, prevCreatedAt, createdAt) {
|
|
16462
16977
|
const ticket = context.issueTimeTicket();
|
|
16978
|
+
let posCreatedAt;
|
|
16979
|
+
try {
|
|
16980
|
+
posCreatedAt = target.posCreatedAt(prevCreatedAt);
|
|
16981
|
+
} catch {
|
|
16982
|
+
posCreatedAt = prevCreatedAt;
|
|
16983
|
+
}
|
|
16984
|
+
const deadNode = target.moveAfter(posCreatedAt, createdAt, ticket);
|
|
16463
16985
|
context.push(
|
|
16464
16986
|
MoveOperation.create(
|
|
16465
16987
|
target.getCreatedAt(),
|
|
16466
|
-
|
|
16988
|
+
posCreatedAt,
|
|
16467
16989
|
createdAt,
|
|
16468
16990
|
ticket
|
|
16469
16991
|
)
|
|
16470
16992
|
);
|
|
16471
|
-
|
|
16993
|
+
if (deadNode) {
|
|
16994
|
+
context.registerGCPair({
|
|
16995
|
+
parent: target.getRGATreeList(),
|
|
16996
|
+
child: deadNode
|
|
16997
|
+
});
|
|
16998
|
+
}
|
|
16472
16999
|
}
|
|
16473
17000
|
/**
|
|
16474
|
-
* `moveAfterByIndexInternal` moves the given element to its new
|
|
16475
|
-
* after the given previous element.
|
|
17001
|
+
* `moveAfterByIndexInternal` moves the given element to its new
|
|
17002
|
+
* position after the given previous element.
|
|
16476
17003
|
*/
|
|
16477
17004
|
static moveAfterByIndexInternal(context, target, prevIndex, targetIndex) {
|
|
16478
17005
|
const prevElem = target.get(prevIndex);
|
|
@@ -16503,7 +17030,7 @@
|
|
|
16503
17030
|
static moveFrontInternal(context, target, createdAt) {
|
|
16504
17031
|
const ticket = context.issueTimeTicket();
|
|
16505
17032
|
const head = target.getHead();
|
|
16506
|
-
target.moveAfter(head.getCreatedAt(), createdAt, ticket);
|
|
17033
|
+
const deadNode = target.moveAfter(head.getCreatedAt(), createdAt, ticket);
|
|
16507
17034
|
context.push(
|
|
16508
17035
|
MoveOperation.create(
|
|
16509
17036
|
target.getCreatedAt(),
|
|
@@ -16512,6 +17039,12 @@
|
|
|
16512
17039
|
ticket
|
|
16513
17040
|
)
|
|
16514
17041
|
);
|
|
17042
|
+
if (deadNode) {
|
|
17043
|
+
context.registerGCPair({
|
|
17044
|
+
parent: target.getRGATreeList(),
|
|
17045
|
+
child: deadNode
|
|
17046
|
+
});
|
|
17047
|
+
}
|
|
16515
17048
|
}
|
|
16516
17049
|
/**
|
|
16517
17050
|
* `moveLastInternal` moves the given `createdAt` element
|
|
@@ -16520,13 +17053,20 @@
|
|
|
16520
17053
|
static moveLastInternal(context, target, createdAt) {
|
|
16521
17054
|
const ticket = context.issueTimeTicket();
|
|
16522
17055
|
const last = target.getLastCreatedAt();
|
|
16523
|
-
target.moveAfter(last, createdAt, ticket);
|
|
17056
|
+
const deadNode = target.moveAfter(last, createdAt, ticket);
|
|
16524
17057
|
context.push(
|
|
16525
17058
|
MoveOperation.create(target.getCreatedAt(), last, createdAt, ticket)
|
|
16526
17059
|
);
|
|
17060
|
+
if (deadNode) {
|
|
17061
|
+
context.registerGCPair({
|
|
17062
|
+
parent: target.getRGATreeList(),
|
|
17063
|
+
child: deadNode
|
|
17064
|
+
});
|
|
17065
|
+
}
|
|
16527
17066
|
}
|
|
16528
17067
|
/**
|
|
16529
|
-
* `insertAfterInternal` inserts the value after the previously
|
|
17068
|
+
* `insertAfterInternal` inserts the value after the previously
|
|
17069
|
+
* created element.
|
|
16530
17070
|
*/
|
|
16531
17071
|
static insertAfterInternal(context, target, prevCreatedAt, value) {
|
|
16532
17072
|
const createdAt = context.issueTimeTicket();
|
|
@@ -16554,12 +17094,13 @@
|
|
|
16554
17094
|
`index out of bounds: ${index}`
|
|
16555
17095
|
);
|
|
16556
17096
|
}
|
|
16557
|
-
|
|
16558
|
-
|
|
16559
|
-
target
|
|
16560
|
-
|
|
16561
|
-
|
|
16562
|
-
|
|
17097
|
+
let posCreatedAt;
|
|
17098
|
+
try {
|
|
17099
|
+
posCreatedAt = target.posCreatedAt(prevElem.getCreatedAt());
|
|
17100
|
+
} catch {
|
|
17101
|
+
posCreatedAt = prevElem.getCreatedAt();
|
|
17102
|
+
}
|
|
17103
|
+
ArrayProxy.insertAfterInternal(context, target, posCreatedAt, value);
|
|
16563
17104
|
return target;
|
|
16564
17105
|
}
|
|
16565
17106
|
/**
|
|
@@ -16658,7 +17199,17 @@
|
|
|
16658
17199
|
}
|
|
16659
17200
|
}
|
|
16660
17201
|
if (items) {
|
|
16661
|
-
let previousID
|
|
17202
|
+
let previousID;
|
|
17203
|
+
if (from === 0) {
|
|
17204
|
+
previousID = target.getHead().getID();
|
|
17205
|
+
} else {
|
|
17206
|
+
const elemID = target.get(from - 1).getID();
|
|
17207
|
+
try {
|
|
17208
|
+
previousID = target.posCreatedAt(elemID);
|
|
17209
|
+
} catch {
|
|
17210
|
+
previousID = elemID;
|
|
17211
|
+
}
|
|
17212
|
+
}
|
|
16662
17213
|
for (const item of items) {
|
|
16663
17214
|
const newElem = ArrayProxy.insertAfterInternal(
|
|
16664
17215
|
context,
|
|
@@ -18008,6 +18559,16 @@
|
|
|
18008
18559
|
this.registerGCPair(pair);
|
|
18009
18560
|
}
|
|
18010
18561
|
}
|
|
18562
|
+
if (elem instanceof CRDTArray) {
|
|
18563
|
+
for (const node of elem.getAllRGANodes()) {
|
|
18564
|
+
if (!node.getElementEntry() && node.getRemovedAt()) {
|
|
18565
|
+
this.registerGCPair({
|
|
18566
|
+
parent: elem.getRGATreeList(),
|
|
18567
|
+
child: node
|
|
18568
|
+
});
|
|
18569
|
+
}
|
|
18570
|
+
}
|
|
18571
|
+
}
|
|
18011
18572
|
return false;
|
|
18012
18573
|
});
|
|
18013
18574
|
}
|
|
@@ -19094,6 +19655,11 @@
|
|
|
19094
19655
|
if (logger.isEnabled(LogLevel.Trivial)) {
|
|
19095
19656
|
logger.trivial(`trying to update a local change: ${this.toJSON()}`);
|
|
19096
19657
|
}
|
|
19658
|
+
const prev = {
|
|
19659
|
+
hadPresence: this.presences.has(actorID),
|
|
19660
|
+
wasOnline: this.status === "attached",
|
|
19661
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
19662
|
+
};
|
|
19097
19663
|
const change = ctx.toChange();
|
|
19098
19664
|
const { opInfos, reverseOps } = change.execute(
|
|
19099
19665
|
this.root,
|
|
@@ -19139,14 +19705,14 @@
|
|
|
19139
19705
|
});
|
|
19140
19706
|
}
|
|
19141
19707
|
if (change.hasPresenceChange()) {
|
|
19142
|
-
|
|
19143
|
-
|
|
19144
|
-
|
|
19145
|
-
|
|
19146
|
-
|
|
19147
|
-
|
|
19148
|
-
|
|
19149
|
-
}
|
|
19708
|
+
const presenceEvent = this.reconcilePresence(
|
|
19709
|
+
actorID,
|
|
19710
|
+
prev,
|
|
19711
|
+
OpSource.Local
|
|
19712
|
+
);
|
|
19713
|
+
if (presenceEvent) {
|
|
19714
|
+
event.push(presenceEvent);
|
|
19715
|
+
}
|
|
19150
19716
|
}
|
|
19151
19717
|
this.publish(event);
|
|
19152
19718
|
if (logger.isEnabled(LogLevel.Trivial)) {
|
|
@@ -19630,41 +20196,11 @@
|
|
|
19630
20196
|
change.execute(this.clone.root, this.clone.presences, source);
|
|
19631
20197
|
const events = [];
|
|
19632
20198
|
const actorID = change.getID().getActorID();
|
|
19633
|
-
|
|
19634
|
-
|
|
19635
|
-
|
|
19636
|
-
|
|
19637
|
-
|
|
19638
|
-
this.presences.has(actorID) ? {
|
|
19639
|
-
type: "presence-changed",
|
|
19640
|
-
source,
|
|
19641
|
-
value: {
|
|
19642
|
-
clientID: actorID,
|
|
19643
|
-
presence: presenceChange.presence
|
|
19644
|
-
}
|
|
19645
|
-
} : {
|
|
19646
|
-
type: "watched",
|
|
19647
|
-
source: OpSource.Remote,
|
|
19648
|
-
value: {
|
|
19649
|
-
clientID: actorID,
|
|
19650
|
-
presence: presenceChange.presence
|
|
19651
|
-
}
|
|
19652
|
-
}
|
|
19653
|
-
);
|
|
19654
|
-
break;
|
|
19655
|
-
case PresenceChangeType.Clear:
|
|
19656
|
-
events.push({
|
|
19657
|
-
type: "unwatched",
|
|
19658
|
-
source: OpSource.Remote,
|
|
19659
|
-
value: {
|
|
19660
|
-
clientID: actorID,
|
|
19661
|
-
presence: this.getPresence(actorID)
|
|
19662
|
-
}
|
|
19663
|
-
});
|
|
19664
|
-
this.removeOnlineClient(actorID);
|
|
19665
|
-
break;
|
|
19666
|
-
}
|
|
19667
|
-
}
|
|
20199
|
+
const prev = change.hasPresenceChange() ? {
|
|
20200
|
+
hadPresence: this.presences.has(actorID),
|
|
20201
|
+
wasOnline: this.onlineClients.has(actorID),
|
|
20202
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
20203
|
+
} : void 0;
|
|
19668
20204
|
const { opInfos, operations } = change.execute(
|
|
19669
20205
|
this.root,
|
|
19670
20206
|
this.presences,
|
|
@@ -19719,6 +20255,16 @@
|
|
|
19719
20255
|
}
|
|
19720
20256
|
);
|
|
19721
20257
|
}
|
|
20258
|
+
if (prev && change.hasPresenceChange()) {
|
|
20259
|
+
const presenceChange = change.getPresenceChange();
|
|
20260
|
+
if (presenceChange.type === PresenceChangeType.Clear) {
|
|
20261
|
+
this.removeOnlineClient(actorID);
|
|
20262
|
+
}
|
|
20263
|
+
const presenceEvent = this.reconcilePresence(actorID, prev, source);
|
|
20264
|
+
if (presenceEvent) {
|
|
20265
|
+
events.push(presenceEvent);
|
|
20266
|
+
}
|
|
20267
|
+
}
|
|
19722
20268
|
if (events.length) {
|
|
19723
20269
|
this.publish(events);
|
|
19724
20270
|
}
|
|
@@ -19747,46 +20293,43 @@
|
|
|
19747
20293
|
* `applyDocEvent` applies the given doc event into this document.
|
|
19748
20294
|
*/
|
|
19749
20295
|
applyDocEvent(type, publisher) {
|
|
19750
|
-
const
|
|
20296
|
+
const prev = {
|
|
20297
|
+
hadPresence: this.presences.has(publisher),
|
|
20298
|
+
wasOnline: this.onlineClients.has(publisher),
|
|
20299
|
+
presence: this.presences.has(publisher) ? deepcopy(this.presences.get(publisher)) : void 0
|
|
20300
|
+
};
|
|
19751
20301
|
if (type === DocEventType$1.DOCUMENT_WATCHED) {
|
|
19752
20302
|
if (this.onlineClients.has(publisher) && this.hasPresence(publisher)) {
|
|
19753
20303
|
return;
|
|
19754
20304
|
}
|
|
19755
20305
|
this.addOnlineClient(publisher);
|
|
19756
|
-
if (this.hasPresence(publisher)) {
|
|
19757
|
-
events.push({
|
|
19758
|
-
type: "watched",
|
|
19759
|
-
source: OpSource.Remote,
|
|
19760
|
-
value: {
|
|
19761
|
-
clientID: publisher,
|
|
19762
|
-
presence: this.getPresence(publisher)
|
|
19763
|
-
}
|
|
19764
|
-
});
|
|
19765
|
-
}
|
|
19766
20306
|
} else if (type === DocEventType$1.DOCUMENT_UNWATCHED) {
|
|
19767
|
-
const presence = this.getPresence(publisher);
|
|
19768
20307
|
this.removeOnlineClient(publisher);
|
|
19769
20308
|
this.presences.delete(publisher);
|
|
19770
|
-
if (presence) {
|
|
19771
|
-
events.push({
|
|
19772
|
-
type: "unwatched",
|
|
19773
|
-
source: OpSource.Remote,
|
|
19774
|
-
value: { clientID: publisher, presence }
|
|
19775
|
-
});
|
|
19776
|
-
}
|
|
19777
20309
|
}
|
|
19778
|
-
|
|
19779
|
-
|
|
20310
|
+
const event = this.reconcilePresence(publisher, prev, OpSource.Remote);
|
|
20311
|
+
if (event) {
|
|
20312
|
+
this.publish([event]);
|
|
19780
20313
|
}
|
|
19781
20314
|
}
|
|
19782
20315
|
/**
|
|
19783
20316
|
* `applyStatus` applies the document status into this document.
|
|
19784
20317
|
*/
|
|
19785
20318
|
applyStatus(status) {
|
|
20319
|
+
const actorID = this.changeID.getActorID();
|
|
20320
|
+
const prev = {
|
|
20321
|
+
hadPresence: this.presences.has(actorID),
|
|
20322
|
+
wasOnline: this.status === "attached",
|
|
20323
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
20324
|
+
};
|
|
19786
20325
|
this.status = status;
|
|
19787
20326
|
if (status === "detached") {
|
|
19788
20327
|
this.setActor(InitialActorID);
|
|
19789
20328
|
}
|
|
20329
|
+
const event = this.reconcilePresence(actorID, prev, OpSource.Local);
|
|
20330
|
+
if (event) {
|
|
20331
|
+
this.publish([event]);
|
|
20332
|
+
}
|
|
19790
20333
|
this.publish([
|
|
19791
20334
|
{
|
|
19792
20335
|
source: status === "removed" ? OpSource.Remote : OpSource.Local,
|
|
@@ -19886,6 +20429,57 @@
|
|
|
19886
20429
|
removeOnlineClient(clientID) {
|
|
19887
20430
|
this.onlineClients.delete(clientID);
|
|
19888
20431
|
}
|
|
20432
|
+
/**
|
|
20433
|
+
* `reconcilePresence` compares the previous and current state of a client's
|
|
20434
|
+
* presence/online status and returns the appropriate event to emit.
|
|
20435
|
+
*
|
|
20436
|
+
* For remote clients, "online" means the client is in onlineClients.
|
|
20437
|
+
* For self, "online" means the document status is Attached.
|
|
20438
|
+
*
|
|
20439
|
+
* State transition table:
|
|
20440
|
+
* (!hadP || !wasOn) → (hasP && isOn) : watched (remote) or presence-changed (self)
|
|
20441
|
+
* (hadP && wasOn) → (hasP && isOn) : presence-changed
|
|
20442
|
+
* (hadP && wasOn) → (!hasP || !isOn): unwatched (remote only)
|
|
20443
|
+
* otherwise : no event (waiting)
|
|
20444
|
+
*/
|
|
20445
|
+
reconcilePresence(actorID, prev, source) {
|
|
20446
|
+
const isSelf = actorID === this.changeID.getActorID();
|
|
20447
|
+
const hasPresence = this.presences.has(actorID);
|
|
20448
|
+
const isOnline = isSelf ? this.status === "attached" : this.onlineClients.has(actorID);
|
|
20449
|
+
if (!hasPresence || !isOnline) {
|
|
20450
|
+
if (prev.hadPresence && prev.wasOnline && !isSelf) {
|
|
20451
|
+
return {
|
|
20452
|
+
type: "unwatched",
|
|
20453
|
+
source: OpSource.Remote,
|
|
20454
|
+
value: {
|
|
20455
|
+
clientID: actorID,
|
|
20456
|
+
presence: prev.presence
|
|
20457
|
+
}
|
|
20458
|
+
};
|
|
20459
|
+
}
|
|
20460
|
+
return void 0;
|
|
20461
|
+
}
|
|
20462
|
+
const presence = deepcopy(this.presences.get(actorID));
|
|
20463
|
+
if (!prev.hadPresence || !prev.wasOnline) {
|
|
20464
|
+
if (isSelf) {
|
|
20465
|
+
return {
|
|
20466
|
+
type: "presence-changed",
|
|
20467
|
+
source,
|
|
20468
|
+
value: { clientID: actorID, presence }
|
|
20469
|
+
};
|
|
20470
|
+
}
|
|
20471
|
+
return {
|
|
20472
|
+
type: "watched",
|
|
20473
|
+
source: OpSource.Remote,
|
|
20474
|
+
value: { clientID: actorID, presence }
|
|
20475
|
+
};
|
|
20476
|
+
}
|
|
20477
|
+
return {
|
|
20478
|
+
type: "presence-changed",
|
|
20479
|
+
source,
|
|
20480
|
+
value: { clientID: actorID, presence }
|
|
20481
|
+
};
|
|
20482
|
+
}
|
|
19889
20483
|
/**
|
|
19890
20484
|
* `hasPresence` returns whether the given clientID has a presence or not.
|
|
19891
20485
|
*/
|
|
@@ -20047,18 +20641,24 @@
|
|
|
20047
20641
|
const ticket = ctx.issueTimeTicket();
|
|
20048
20642
|
op.setExecutedAt(ticket);
|
|
20049
20643
|
if (op instanceof ArraySetOperation) {
|
|
20050
|
-
const
|
|
20644
|
+
const prev2 = op.getCreatedAt();
|
|
20051
20645
|
op.getValue().setCreatedAt(ticket);
|
|
20052
|
-
this.internalHistory.reconcileCreatedAt(
|
|
20646
|
+
this.internalHistory.reconcileCreatedAt(prev2, ticket);
|
|
20053
20647
|
} else if (op instanceof AddOperation) {
|
|
20054
|
-
const
|
|
20648
|
+
const prev2 = op.getValue().getCreatedAt();
|
|
20055
20649
|
op.getValue().setCreatedAt(ticket);
|
|
20056
|
-
this.internalHistory.reconcileCreatedAt(
|
|
20650
|
+
this.internalHistory.reconcileCreatedAt(prev2, ticket);
|
|
20057
20651
|
}
|
|
20058
20652
|
ctx.push(op);
|
|
20059
20653
|
}
|
|
20060
20654
|
const change = ctx.toChange();
|
|
20061
20655
|
change.execute(this.clone.root, this.clone.presences, OpSource.UndoRedo);
|
|
20656
|
+
const actorID = this.changeID.getActorID();
|
|
20657
|
+
const prev = {
|
|
20658
|
+
hadPresence: this.presences.has(actorID),
|
|
20659
|
+
wasOnline: this.status === "attached",
|
|
20660
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
20661
|
+
};
|
|
20062
20662
|
const { opInfos, reverseOps } = change.execute(
|
|
20063
20663
|
this.root,
|
|
20064
20664
|
this.presences,
|
|
@@ -20080,7 +20680,6 @@
|
|
|
20080
20680
|
}
|
|
20081
20681
|
this.localChanges.push(change);
|
|
20082
20682
|
this.changeID = ctx.getNextID();
|
|
20083
|
-
const actorID = this.changeID.getActorID();
|
|
20084
20683
|
const events = [];
|
|
20085
20684
|
if (opInfos.length) {
|
|
20086
20685
|
events.push({
|
|
@@ -20097,14 +20696,14 @@
|
|
|
20097
20696
|
});
|
|
20098
20697
|
}
|
|
20099
20698
|
if (change.hasPresenceChange()) {
|
|
20100
|
-
|
|
20101
|
-
|
|
20102
|
-
|
|
20103
|
-
|
|
20104
|
-
|
|
20105
|
-
|
|
20106
|
-
|
|
20107
|
-
}
|
|
20699
|
+
const presenceEvent = this.reconcilePresence(
|
|
20700
|
+
actorID,
|
|
20701
|
+
prev,
|
|
20702
|
+
OpSource.UndoRedo
|
|
20703
|
+
);
|
|
20704
|
+
if (presenceEvent) {
|
|
20705
|
+
events.push(presenceEvent);
|
|
20706
|
+
}
|
|
20108
20707
|
}
|
|
20109
20708
|
this.publish(events);
|
|
20110
20709
|
}
|
|
@@ -20120,6 +20719,8 @@
|
|
|
20120
20719
|
watchStream;
|
|
20121
20720
|
watchLoopTimerID;
|
|
20122
20721
|
watchAbortController;
|
|
20722
|
+
syncPromise;
|
|
20723
|
+
_detaching = false;
|
|
20123
20724
|
constructor(reconnectStreamDelay, resource, resourceID, syncMode) {
|
|
20124
20725
|
this.reconnectStreamDelay = reconnectStreamDelay;
|
|
20125
20726
|
this.resource = resource;
|
|
@@ -20195,6 +20796,49 @@
|
|
|
20195
20796
|
};
|
|
20196
20797
|
await doLoop();
|
|
20197
20798
|
}
|
|
20799
|
+
/**
|
|
20800
|
+
* `markDetaching` marks this attachment as being in the process of detaching.
|
|
20801
|
+
* Once marked, the sync loop will skip this attachment.
|
|
20802
|
+
*/
|
|
20803
|
+
markDetaching() {
|
|
20804
|
+
this._detaching = true;
|
|
20805
|
+
}
|
|
20806
|
+
/**
|
|
20807
|
+
* `isDetaching` returns whether this attachment is being detached.
|
|
20808
|
+
*/
|
|
20809
|
+
isDetaching() {
|
|
20810
|
+
return this._detaching;
|
|
20811
|
+
}
|
|
20812
|
+
/**
|
|
20813
|
+
* `resetDetaching` resets the detaching flag so the attachment can resume
|
|
20814
|
+
* syncing. Used when a detach RPC fails and the document remains attached.
|
|
20815
|
+
*/
|
|
20816
|
+
resetDetaching() {
|
|
20817
|
+
this._detaching = false;
|
|
20818
|
+
}
|
|
20819
|
+
/**
|
|
20820
|
+
* `setSyncPromise` sets the in-progress sync promise for this attachment.
|
|
20821
|
+
*/
|
|
20822
|
+
setSyncPromise(promise) {
|
|
20823
|
+
this.syncPromise = promise;
|
|
20824
|
+
}
|
|
20825
|
+
/**
|
|
20826
|
+
* `clearSyncPromise` clears the in-progress sync promise.
|
|
20827
|
+
*/
|
|
20828
|
+
clearSyncPromise() {
|
|
20829
|
+
this.syncPromise = void 0;
|
|
20830
|
+
}
|
|
20831
|
+
/**
|
|
20832
|
+
* `waitForSyncComplete` waits for any in-progress sync to complete.
|
|
20833
|
+
*/
|
|
20834
|
+
async waitForSyncComplete() {
|
|
20835
|
+
if (this.syncPromise) {
|
|
20836
|
+
try {
|
|
20837
|
+
await this.syncPromise;
|
|
20838
|
+
} catch {
|
|
20839
|
+
}
|
|
20840
|
+
}
|
|
20841
|
+
}
|
|
20198
20842
|
/**
|
|
20199
20843
|
* `cancelWatchStream` cancels the watch stream.
|
|
20200
20844
|
*/
|
|
@@ -20229,7 +20873,7 @@
|
|
|
20229
20873
|
};
|
|
20230
20874
|
}
|
|
20231
20875
|
const name$1 = "@yorkie-js/sdk";
|
|
20232
|
-
const version$1 = "0.7.
|
|
20876
|
+
const version$1 = "0.7.7";
|
|
20233
20877
|
const pkg$1 = {
|
|
20234
20878
|
name: name$1,
|
|
20235
20879
|
version: version$1
|
|
@@ -20544,6 +21188,7 @@
|
|
|
20544
21188
|
taskQueue;
|
|
20545
21189
|
processing = false;
|
|
20546
21190
|
keepalive = false;
|
|
21191
|
+
deactivating = false;
|
|
20547
21192
|
/**
|
|
20548
21193
|
* @param rpcAddr - the address of the RPC server.
|
|
20549
21194
|
* @param opts - the options of the client.
|
|
@@ -20613,6 +21258,7 @@
|
|
|
20613
21258
|
);
|
|
20614
21259
|
this.id = res.clientId;
|
|
20615
21260
|
this.status = "activated";
|
|
21261
|
+
this.deactivating = false;
|
|
20616
21262
|
this.runSyncLoop();
|
|
20617
21263
|
logger.info(`[AC] c:"${this.getKey()}" activated, id:"${this.id}"`);
|
|
20618
21264
|
if (typeof window !== "undefined") {
|
|
@@ -20641,6 +21287,7 @@
|
|
|
20641
21287
|
if (this.status === "deactivated") {
|
|
20642
21288
|
return Promise.resolve();
|
|
20643
21289
|
}
|
|
21290
|
+
this.deactivating = true;
|
|
20644
21291
|
const task = async () => {
|
|
20645
21292
|
try {
|
|
20646
21293
|
await this.rpcClient.deactivateClient(
|
|
@@ -20654,6 +21301,7 @@
|
|
|
20654
21301
|
logger.info(`[DC] c"${this.getKey()}" deactivated`);
|
|
20655
21302
|
} catch (err) {
|
|
20656
21303
|
logger.error(`[DC] c:"${this.getKey()}" err :`, err);
|
|
21304
|
+
this.deactivating = false;
|
|
20657
21305
|
await this.handleConnectError(err);
|
|
20658
21306
|
throw err;
|
|
20659
21307
|
}
|
|
@@ -20794,8 +21442,10 @@
|
|
|
20794
21442
|
);
|
|
20795
21443
|
}
|
|
20796
21444
|
doc.update((_, p) => p.clear());
|
|
21445
|
+
attachment.markDetaching();
|
|
20797
21446
|
const task = async () => {
|
|
20798
21447
|
try {
|
|
21448
|
+
await attachment.waitForSyncComplete();
|
|
20799
21449
|
const res = await this.rpcClient.detachDocument(
|
|
20800
21450
|
{
|
|
20801
21451
|
clientId: this.id,
|
|
@@ -20814,6 +21464,7 @@
|
|
|
20814
21464
|
return doc;
|
|
20815
21465
|
} catch (err) {
|
|
20816
21466
|
logger.error(`[DD] c:"${this.getKey()}" err :`, err);
|
|
21467
|
+
attachment.resetDetaching();
|
|
20817
21468
|
await this.handleConnectError(err);
|
|
20818
21469
|
throw err;
|
|
20819
21470
|
}
|
|
@@ -21380,7 +22031,7 @@
|
|
|
21380
22031
|
*/
|
|
21381
22032
|
runSyncLoop() {
|
|
21382
22033
|
const doLoop = async () => {
|
|
21383
|
-
if (!this.isActive()) {
|
|
22034
|
+
if (!this.isActive() || this.deactivating) {
|
|
21384
22035
|
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
|
|
21385
22036
|
this.conditions[
|
|
21386
22037
|
"SyncLoop"
|
|
@@ -21392,43 +22043,62 @@
|
|
|
21392
22043
|
await this.enqueueTask(async () => {
|
|
21393
22044
|
const syncs = [];
|
|
21394
22045
|
for (const [, attachment] of this.attachmentMap) {
|
|
22046
|
+
if (this.deactivating) {
|
|
22047
|
+
break;
|
|
22048
|
+
}
|
|
21395
22049
|
if (!attachment.needSync(this.channelHeartbeatInterval)) {
|
|
21396
22050
|
continue;
|
|
21397
22051
|
}
|
|
22052
|
+
if (attachment.isDetaching()) {
|
|
22053
|
+
continue;
|
|
22054
|
+
}
|
|
21398
22055
|
if (attachment.changeEventReceived !== void 0) {
|
|
21399
22056
|
attachment.changeEventReceived = false;
|
|
21400
22057
|
}
|
|
21401
|
-
|
|
21402
|
-
|
|
21403
|
-
|
|
21404
|
-
|
|
21405
|
-
|
|
21406
|
-
|
|
21407
|
-
|
|
21408
|
-
|
|
21409
|
-
|
|
21410
|
-
|
|
22058
|
+
const syncPromise = this.syncInternal(
|
|
22059
|
+
attachment,
|
|
22060
|
+
attachment.syncMode
|
|
22061
|
+
).then(() => {
|
|
22062
|
+
}).catch((e) => {
|
|
22063
|
+
if (isErrorCode(e, Code.ErrUnauthenticated)) {
|
|
22064
|
+
attachment.resource.publish([
|
|
22065
|
+
{
|
|
22066
|
+
type: DocEventType.AuthError,
|
|
22067
|
+
value: {
|
|
22068
|
+
reason: errorMetadataOf(e).reason,
|
|
22069
|
+
method: "PushPull"
|
|
21411
22070
|
}
|
|
21412
|
-
|
|
21413
|
-
|
|
21414
|
-
|
|
21415
|
-
|
|
21416
|
-
|
|
21417
|
-
|
|
21418
|
-
|
|
21419
|
-
|
|
21420
|
-
|
|
22071
|
+
}
|
|
22072
|
+
]);
|
|
22073
|
+
}
|
|
22074
|
+
if (isErrorCode(e, Code.ErrEpochMismatch)) {
|
|
22075
|
+
attachment.resource.publish([
|
|
22076
|
+
{
|
|
22077
|
+
type: DocEventType.EpochMismatch,
|
|
22078
|
+
value: {
|
|
22079
|
+
method: "PushPull"
|
|
21421
22080
|
}
|
|
21422
|
-
|
|
21423
|
-
|
|
21424
|
-
|
|
21425
|
-
|
|
21426
|
-
)
|
|
22081
|
+
}
|
|
22082
|
+
]);
|
|
22083
|
+
}
|
|
22084
|
+
throw e;
|
|
22085
|
+
}).finally(() => {
|
|
22086
|
+
attachment.clearSyncPromise();
|
|
22087
|
+
});
|
|
22088
|
+
attachment.setSyncPromise(syncPromise);
|
|
22089
|
+
syncs.push(syncPromise);
|
|
21427
22090
|
}
|
|
21428
22091
|
await Promise.all(syncs);
|
|
21429
22092
|
setTimeout(doLoop, this.syncLoopDuration);
|
|
21430
22093
|
});
|
|
21431
22094
|
} catch (err) {
|
|
22095
|
+
if (this.deactivating) {
|
|
22096
|
+
this.conditions[
|
|
22097
|
+
"SyncLoop"
|
|
22098
|
+
/* SyncLoop */
|
|
22099
|
+
] = false;
|
|
22100
|
+
return;
|
|
22101
|
+
}
|
|
21432
22102
|
logger.error(`[SL] c:"${this.getKey()}" sync failed:`, err);
|
|
21433
22103
|
if (await this.handleConnectError(err)) {
|
|
21434
22104
|
setTimeout(doLoop, this.retrySyncLoopDelay);
|
|
@@ -21909,8 +22579,11 @@
|
|
|
21909
22579
|
function isCounter(value) {
|
|
21910
22580
|
return typeof value === "object" && value !== null && value.type === "Counter" && typeof value.value === "object";
|
|
21911
22581
|
}
|
|
22582
|
+
function isDedupCounter(value) {
|
|
22583
|
+
return typeof value === "object" && value !== null && value.type === "DedupCounter" && typeof value.value === "object" && typeof value.registers === "string";
|
|
22584
|
+
}
|
|
21912
22585
|
function isObject(value) {
|
|
21913
|
-
return typeof value === "object" && value !== null && !Array.isArray(value) && !isText(value) && !isTree(value) && !isInt(value) && !isLong(value) && !isDate(value) && !isBinData(value) && !isCounter(value);
|
|
22586
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && !isText(value) && !isTree(value) && !isInt(value) && !isLong(value) && !isDate(value) && !isBinData(value) && !isCounter(value) && !isDedupCounter(value);
|
|
21914
22587
|
}
|
|
21915
22588
|
function parse(yson) {
|
|
21916
22589
|
try {
|
|
@@ -21926,6 +22599,12 @@
|
|
|
21926
22599
|
}
|
|
21927
22600
|
function preprocessYSON(yson) {
|
|
21928
22601
|
let result = yson;
|
|
22602
|
+
result = result.replace(
|
|
22603
|
+
/DedupCounter\(Int\((-?\d+)\),"([^"]+)"\)/g,
|
|
22604
|
+
(_, value, registers) => {
|
|
22605
|
+
return `{"__yson_type":"DedupCounter","__yson_data":{"__yson_type":"Int","__yson_data":${value}},"__yson_registers":"${registers}"}`;
|
|
22606
|
+
}
|
|
22607
|
+
);
|
|
21929
22608
|
result = result.replace(
|
|
21930
22609
|
/Counter\((Int|Long)\((-?\d+)\)\)/g,
|
|
21931
22610
|
(_, type, value) => {
|
|
@@ -21986,6 +22665,20 @@
|
|
|
21986
22665
|
value: value.__yson_data
|
|
21987
22666
|
};
|
|
21988
22667
|
}
|
|
22668
|
+
if (value.__yson_type === "DedupCounter" && typeof value.__yson_data === "object" && typeof value.__yson_registers === "string") {
|
|
22669
|
+
const counterValue = postprocessValue(value.__yson_data);
|
|
22670
|
+
if (typeof counterValue === "object" && counterValue !== null && "type" in counterValue && counterValue.type === "Int") {
|
|
22671
|
+
return {
|
|
22672
|
+
type: "DedupCounter",
|
|
22673
|
+
value: counterValue,
|
|
22674
|
+
registers: value.__yson_registers
|
|
22675
|
+
};
|
|
22676
|
+
}
|
|
22677
|
+
throw new YorkieError(
|
|
22678
|
+
Code.ErrInvalidArgument,
|
|
22679
|
+
"DedupCounter must contain Int"
|
|
22680
|
+
);
|
|
22681
|
+
}
|
|
21989
22682
|
if (value.__yson_type === "Counter" && typeof value.__yson_data === "object") {
|
|
21990
22683
|
const counterValue = postprocessValue(value.__yson_data);
|
|
21991
22684
|
if (typeof counterValue === "object" && counterValue !== null && "type" in counterValue && (counterValue.type === "Int" || counterValue.type === "Long")) {
|
|
@@ -22074,6 +22767,7 @@
|
|
|
22074
22767
|
isBinData,
|
|
22075
22768
|
isCounter,
|
|
22076
22769
|
isDate,
|
|
22770
|
+
isDedupCounter,
|
|
22077
22771
|
isInt,
|
|
22078
22772
|
isLong,
|
|
22079
22773
|
isObject,
|
|
@@ -22100,7 +22794,7 @@
|
|
|
22100
22794
|
};
|
|
22101
22795
|
}
|
|
22102
22796
|
const name = "@yorkie-js/react";
|
|
22103
|
-
const version = "0.7.
|
|
22797
|
+
const version = "0.7.7";
|
|
22104
22798
|
const pkg = {
|
|
22105
22799
|
name,
|
|
22106
22800
|
version
|