@yorkie-js/react 0.7.5 → 0.7.6
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 +859 -252
- package/dist/yorkie-js-react.es.js.map +1 -1
- package/dist/yorkie-js-react.js +859 -252
- package/dist/yorkie-js-react.js.map +1 -1
- package/package.json +2 -2
|
@@ -5790,7 +5790,7 @@ function createGrpcWebTransport(options) {
|
|
|
5790
5790
|
}
|
|
5791
5791
|
};
|
|
5792
5792
|
}
|
|
5793
|
-
const file_src_api_yorkie_v1_resources = /* @__PURE__ */ fileDesc("CiFzcmMvYXBpL3lvcmtpZS92MS9yZXNvdXJjZXMucHJvdG8SCXlvcmtpZS52MSKuAQoIU25hcHNob3QSJAoEcm9vdBgBIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBI1CglwcmVzZW5jZXMYAiADKAsyIi55b3JraWUudjEuU25hcHNob3QuUHJlc2VuY2VzRW50cnkaRQoOUHJlc2VuY2VzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLlByZXNlbmNlOgI4ASL7AQoKQ2hhbmdlUGFjaxIUCgxkb2N1bWVudF9rZXkYASABKAkSKQoKY2hlY2twb2ludBgCIAEoCzIVLnlvcmtpZS52MS5DaGVja3BvaW50EhAKCHNuYXBzaG90GAMgASgMEiIKB2NoYW5nZXMYBCADKAsyES55b3JraWUudjEuQ2hhbmdlEjAKEW1pbl9zeW5jZWRfdGlja2V0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgGIAEoCBIwCg52ZXJzaW9uX3ZlY3RvchgHIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yIpgBCgZDaGFuZ2USHwoCaWQYASABKAsyEy55b3JraWUudjEuQ2hhbmdlSUQSDwoHbWVzc2FnZRgCIAEoCRIoCgpvcGVyYXRpb25zGAMgAygLMhQueW9ya2llLnYxLk9wZXJhdGlvbhIyCg9wcmVzZW5jZV9jaGFuZ2UYBCABKAsyGS55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UihwEKCENoYW5nZUlEEhIKCmNsaWVudF9zZXEYASABKA0SEgoKc2VydmVyX3NlcRgCIAEoAxIPCgdsYW1wb3J0GAMgASgDEhAKCGFjdG9yX2lkGAQgASgMEjAKDnZlcnNpb25fdmVjdG9yGAUgASgLMhgueW9ya2llLnYxLlZlcnNpb25WZWN0b3IidAoNVmVyc2lvblZlY3RvchI0CgZ2ZWN0b3IYASADKAsyJC55b3JraWUudjEuVmVyc2lvblZlY3Rvci5WZWN0b3JFbnRyeRotCgtWZWN0b3JFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAM6AjgBItkaCglPcGVyYXRpb24SJwoDc2V0GAEgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5TZXRIABInCgNhZGQYAiABKAsyGC55b3JraWUudjEuT3BlcmF0aW9uLkFkZEgAEikKBG1vdmUYAyABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLk1vdmVIABItCgZyZW1vdmUYBCABKAsyGy55b3JraWUudjEuT3BlcmF0aW9uLlJlbW92ZUgAEikKBGVkaXQYBSABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLkVkaXRIABIrCgVzdHlsZRgHIAEoCzIaLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGVIABIxCghpbmNyZWFzZRgIIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uSW5jcmVhc2VIABIyCgl0cmVlX2VkaXQYCSABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0SAASNAoKdHJlZV9zdHlsZRgKIAEoCzIeLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlSAASMgoJYXJyYXlfc2V0GAsgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5BcnJheVNldEgAGp0BCgNTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBILCgNrZXkYAiABKAkSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrAAQoDQWRkEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSLgoPcHJldl9jcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq/AQoETW92ZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIqCgtleGVjdXRlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GpEBCgZSZW1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrZAwoERWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSUwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyMi55b3JraWUudjEuT3BlcmF0aW9uLkVkaXQuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5Eg8KB2NvbnRlbnQYBSABKAkSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBI9CgphdHRyaWJ1dGVzGAcgAygLMikueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkF0dHJpYnV0ZXNFbnRyeRpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGukDCgVTdHlsZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSPgoKYXR0cmlidXRlcxgEIAMoCzIqLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSVAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBiADKAsyMy55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIcChRhdHRyaWJ1dGVzX3RvX3JlbW92ZRgHIAMoCRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGqQBCghJbmNyZWFzZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAIgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDQoFYWN0b3IYBCABKAkakwMKCFRyZWVFZGl0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSVwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyNi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRImCghjb250ZW50cxgFIAMoCzIULnlvcmtpZS52MS5UcmVlTm9kZXMSEwoLc3BsaXRfbGV2ZWwYByABKAUSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGu0DCglUcmVlU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIgCgRmcm9tGAIgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSHgoCdG8YAyABKAsyEi55b3JraWUudjEuVHJlZVBvcxJCCgphdHRyaWJ1dGVzGAQgAygLMi4ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSHAoUYXR0cmlidXRlc190b19yZW1vdmUYBiADKAkSWAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYByADKAsyNy55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrAAQoIQXJyYXlTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldEIGCgRib2R5IsUBChFKU09ORWxlbWVudFNpbXBsZRIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIgoEdHlwZRgEIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYBSABKAwinwsKC0pTT05FbGVtZW50EjgKC2pzb25fb2JqZWN0GAEgASgLMiEueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05PYmplY3RIABI2Cgpqc29uX2FycmF5GAIgASgLMiAueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05BcnJheUgAEjUKCXByaW1pdGl2ZRgDIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5QcmltaXRpdmVIABIrCgR0ZXh0GAUgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRleHRIABIxCgdjb3VudGVyGAYgASgLMh4ueW9ya2llLnYxLkpTT05FbGVtZW50LkNvdW50ZXJIABIrCgR0cmVlGAcgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRyZWVIABquAQoKSlNPTk9iamVjdBIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SSFROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqtAQoJSlNPTkFycmF5EiEKBW5vZGVzGAEgAygLMhIueW9ya2llLnYxLlJHQU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Gr0BCglQcmltaXRpdmUSIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GqkBCgRUZXh0EiIKBW5vZGVzGAEgAygLMhMueW9ya2llLnYxLlRleHROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrYAQoHQ291bnRlchIiCgR0eXBlGAEgASgOMhQueW9ya2llLnYxLlZhbHVlVHlwZRINCgV2YWx1ZRgCIAEoDBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSFQoNaGxsX3JlZ2lzdGVycxgHIAEoDEoECAYQBxqpAQoEVHJlZRIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UcmVlTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSI/CgdSSFROb2RlEgsKA2tleRgBIAEoCRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50IlQKB1JHQU5vZGUSIAoEbmV4dBgBIAEoCzISLnlvcmtpZS52MS5SR0FOb2RlEicKB2VsZW1lbnQYAiABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
|
|
5793
|
+
const file_src_api_yorkie_v1_resources = /* @__PURE__ */ fileDesc("CiFzcmMvYXBpL3lvcmtpZS92MS9yZXNvdXJjZXMucHJvdG8SCXlvcmtpZS52MSKuAQoIU25hcHNob3QSJAoEcm9vdBgBIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBI1CglwcmVzZW5jZXMYAiADKAsyIi55b3JraWUudjEuU25hcHNob3QuUHJlc2VuY2VzRW50cnkaRQoOUHJlc2VuY2VzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLlByZXNlbmNlOgI4ASL7AQoKQ2hhbmdlUGFjaxIUCgxkb2N1bWVudF9rZXkYASABKAkSKQoKY2hlY2twb2ludBgCIAEoCzIVLnlvcmtpZS52MS5DaGVja3BvaW50EhAKCHNuYXBzaG90GAMgASgMEiIKB2NoYW5nZXMYBCADKAsyES55b3JraWUudjEuQ2hhbmdlEjAKEW1pbl9zeW5jZWRfdGlja2V0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgGIAEoCBIwCg52ZXJzaW9uX3ZlY3RvchgHIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yIpgBCgZDaGFuZ2USHwoCaWQYASABKAsyEy55b3JraWUudjEuQ2hhbmdlSUQSDwoHbWVzc2FnZRgCIAEoCRIoCgpvcGVyYXRpb25zGAMgAygLMhQueW9ya2llLnYxLk9wZXJhdGlvbhIyCg9wcmVzZW5jZV9jaGFuZ2UYBCABKAsyGS55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UihwEKCENoYW5nZUlEEhIKCmNsaWVudF9zZXEYASABKA0SEgoKc2VydmVyX3NlcRgCIAEoAxIPCgdsYW1wb3J0GAMgASgDEhAKCGFjdG9yX2lkGAQgASgMEjAKDnZlcnNpb25fdmVjdG9yGAUgASgLMhgueW9ya2llLnYxLlZlcnNpb25WZWN0b3IidAoNVmVyc2lvblZlY3RvchI0CgZ2ZWN0b3IYASADKAsyJC55b3JraWUudjEuVmVyc2lvblZlY3Rvci5WZWN0b3JFbnRyeRotCgtWZWN0b3JFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAM6AjgBItkaCglPcGVyYXRpb24SJwoDc2V0GAEgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5TZXRIABInCgNhZGQYAiABKAsyGC55b3JraWUudjEuT3BlcmF0aW9uLkFkZEgAEikKBG1vdmUYAyABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLk1vdmVIABItCgZyZW1vdmUYBCABKAsyGy55b3JraWUudjEuT3BlcmF0aW9uLlJlbW92ZUgAEikKBGVkaXQYBSABKAsyGS55b3JraWUudjEuT3BlcmF0aW9uLkVkaXRIABIrCgVzdHlsZRgHIAEoCzIaLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGVIABIxCghpbmNyZWFzZRgIIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uSW5jcmVhc2VIABIyCgl0cmVlX2VkaXQYCSABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0SAASNAoKdHJlZV9zdHlsZRgKIAEoCzIeLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlSAASMgoJYXJyYXlfc2V0GAsgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5BcnJheVNldEgAGp0BCgNTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBILCgNrZXkYAiABKAkSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrAAQoDQWRkEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSLgoPcHJldl9jcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq/AQoETW92ZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIqCgtleGVjdXRlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GpEBCgZSZW1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrZAwoERWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSUwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyMi55b3JraWUudjEuT3BlcmF0aW9uLkVkaXQuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5Eg8KB2NvbnRlbnQYBSABKAkSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBI9CgphdHRyaWJ1dGVzGAcgAygLMikueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkF0dHJpYnV0ZXNFbnRyeRpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGukDCgVTdHlsZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiQKBGZyb20YAiABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSIgoCdG8YAyABKAsyFi55b3JraWUudjEuVGV4dE5vZGVQb3MSPgoKYXR0cmlidXRlcxgEIAMoCzIqLnlvcmtpZS52MS5PcGVyYXRpb24uU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSVAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBiADKAsyMy55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIcChRhdHRyaWJ1dGVzX3RvX3JlbW92ZRgHIAMoCRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGqQBCghJbmNyZWFzZRIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAIgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDQoFYWN0b3IYBCABKAkakwMKCFRyZWVFZGl0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSVwoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYBCADKAsyNi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVFZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRImCghjb250ZW50cxgFIAMoCzIULnlvcmtpZS52MS5UcmVlTm9kZXMSEwoLc3BsaXRfbGV2ZWwYByABKAUSKgoLZXhlY3V0ZWRfYXQYBiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBpRChhDcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQ6AjgBGu0DCglUcmVlU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIgCgRmcm9tGAIgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSHgoCdG8YAyABKAsyEi55b3JraWUudjEuVHJlZVBvcxJCCgphdHRyaWJ1dGVzGAQgAygLMi4ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQXR0cmlidXRlc0VudHJ5EioKC2V4ZWN1dGVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSHAoUYXR0cmlidXRlc190b19yZW1vdmUYBiADKAkSWAoXY3JlYXRlZF9hdF9tYXBfYnlfYWN0b3IYByADKAsyNy55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrAAQoIQXJyYXlTZXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKwoFdmFsdWUYAyABKAsyHC55b3JraWUudjEuSlNPTkVsZW1lbnRTaW1wbGUSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldEIGCgRib2R5IsUBChFKU09ORWxlbWVudFNpbXBsZRIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIgoEdHlwZRgEIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYBSABKAwinwsKC0pTT05FbGVtZW50EjgKC2pzb25fb2JqZWN0GAEgASgLMiEueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05PYmplY3RIABI2Cgpqc29uX2FycmF5GAIgASgLMiAueW9ya2llLnYxLkpTT05FbGVtZW50LkpTT05BcnJheUgAEjUKCXByaW1pdGl2ZRgDIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5QcmltaXRpdmVIABIrCgR0ZXh0GAUgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRleHRIABIxCgdjb3VudGVyGAYgASgLMh4ueW9ya2llLnYxLkpTT05FbGVtZW50LkNvdW50ZXJIABIrCgR0cmVlGAcgASgLMhsueW9ya2llLnYxLkpTT05FbGVtZW50LlRyZWVIABquAQoKSlNPTk9iamVjdBIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SSFROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqtAQoJSlNPTkFycmF5EiEKBW5vZGVzGAEgAygLMhIueW9ya2llLnYxLlJHQU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Gr0BCglQcmltaXRpdmUSIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GqkBCgRUZXh0EiIKBW5vZGVzGAEgAygLMhMueW9ya2llLnYxLlRleHROb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBrYAQoHQ291bnRlchIiCgR0eXBlGAEgASgOMhQueW9ya2llLnYxLlZhbHVlVHlwZRINCgV2YWx1ZRgCIAEoDBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSFQoNaGxsX3JlZ2lzdGVycxgHIAEoDEoECAYQBxqpAQoEVHJlZRIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UcmVlTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSI/CgdSSFROb2RlEgsKA2tleRgBIAEoCRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50Iu4BCgdSR0FOb2RlEiAKBG5leHQYASABKAsyEi55b3JraWUudjEuUkdBTm9kZRInCgdlbGVtZW50GAIgASgLMhYueW9ya2llLnYxLkpTT05FbGVtZW50EjIKE3Bvc2l0aW9uX2NyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIwChFwb3NpdGlvbl9tb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EjIKE3Bvc2l0aW9uX3JlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldCJYCghOb2RlQXR0chINCgV2YWx1ZRgBIAEoCRIpCgp1cGRhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSEgoKaXNfcmVtb3ZlZBgDIAEoCCKUAgoIVGV4dE5vZGUSIQoCaWQYASABKAsyFS55b3JraWUudjEuVGV4dE5vZGVJRBINCgV2YWx1ZRgCIAEoCRIpCgpyZW1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLaW5zX3ByZXZfaWQYBCABKAsyFS55b3JraWUudjEuVGV4dE5vZGVJRBI3CgphdHRyaWJ1dGVzGAUgAygLMiMueW9ya2llLnYxLlRleHROb2RlLkF0dHJpYnV0ZXNFbnRyeRpGCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEiIKBXZhbHVlGAIgASgLMhMueW9ya2llLnYxLk5vZGVBdHRyOgI4ASJHCgpUZXh0Tm9kZUlEEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIOCgZvZmZzZXQYAiABKAUiswMKCFRyZWVOb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSDAoEdHlwZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLaW5zX3ByZXZfaWQYBSABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBIqCgtpbnNfbmV4dF9pZBgGIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEg0KBWRlcHRoGAcgASgFEjcKCmF0dHJpYnV0ZXMYCCADKAsyIy55b3JraWUudjEuVHJlZU5vZGUuQXR0cmlidXRlc0VudHJ5EioKC21lcmdlZF9mcm9tGAkgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKAoJbWVyZ2VkX2F0GAogASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiMQoJVHJlZU5vZGVzEiQKB2NvbnRlbnQYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUiRwoKVHJlZU5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFImMKB1RyZWVQb3MSKAoJcGFyZW50X2lkGAEgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSLgoPbGVmdF9zaWJsaW5nX2lkGAIgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQiawoEVXNlchIKCgJpZBgBIAEoCRIVCg1hdXRoX3Byb3ZpZGVyGAIgASgJEhAKCHVzZXJuYW1lGAMgASgJEi4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIokBCgZNZW1iZXISCgoCaWQYASABKAkSEgoKcHJvamVjdF9pZBgCIAEoCRIPCgd1c2VyX2lkGAMgASgJEhAKCHVzZXJuYW1lGAQgASgJEgwKBHJvbGUYBSABKAkSLgoKaW52aXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi6QYKB1Byb2plY3QSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpwdWJsaWNfa2V5GAMgASgJEhIKCnNlY3JldF9rZXkYBCABKAkSGAoQYXV0aF93ZWJob29rX3VybBgFIAEoCRIcChRhdXRoX3dlYmhvb2tfbWV0aG9kcxgGIAMoCRIgChhhdXRoX3dlYmhvb2tfbWF4X3JldHJpZXMYESABKAQSJgoeYXV0aF93ZWJob29rX21pbl93YWl0X2ludGVydmFsGBIgASgJEiYKHmF1dGhfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgTIAEoCRIkChxhdXRoX3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBQgASgJEhkKEWV2ZW50X3dlYmhvb2tfdXJsGAcgASgJEhwKFGV2ZW50X3dlYmhvb2tfZXZlbnRzGAggAygJEiEKGWV2ZW50X3dlYmhvb2tfbWF4X3JldHJpZXMYFSABKAQSJwofZXZlbnRfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgWIAEoCRInCh9ldmVudF93ZWJob29rX21heF93YWl0X2ludGVydmFsGBcgASgJEiUKHWV2ZW50X3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBggASgJEiMKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgJIAEoCRIaChJzbmFwc2hvdF90aHJlc2hvbGQYGSABKAMSGQoRc25hcHNob3RfaW50ZXJ2YWwYGiABKAMSJAocbWF4X3N1YnNjcmliZXJzX3Blcl9kb2N1bWVudBgKIAEoBRIkChxtYXhfYXR0YWNobWVudHNfcGVyX2RvY3VtZW50GAsgASgFEh0KFW1heF9zaXplX3Blcl9kb2N1bWVudBgPIAEoBRIYChByZW1vdmVfb25fZGV0YWNoGBAgASgIEh0KFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgbIAEoCBIXCg9hbGxvd2VkX29yaWdpbnMYDiADKAkSLgoKY3JlYXRlZF9hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiLwoLTWV0cmljUG9pbnQSEQoJdGltZXN0YW1wGAEgASgDEg0KBXZhbHVlGAIgASgFIqMMChZVcGRhdGFibGVQcm9qZWN0RmllbGRzEioKBG5hbWUYASABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSNgoQYXV0aF93ZWJob29rX3VybBgCIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRhdXRoX3dlYmhvb2tfbWV0aG9kcxgDIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkF1dGhXZWJob29rTWV0aG9kcxI+ChhhdXRoX3dlYmhvb2tfbWF4X3JldHJpZXMYDCABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUSRAoeYXV0aF93ZWJob29rX21pbl93YWl0X2ludGVydmFsGA0gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkQKHmF1dGhfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgOIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJCChxhdXRoX3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GA8gASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjcKEWV2ZW50X3dlYmhvb2tfdXJsGAQgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlElIKFGV2ZW50X3dlYmhvb2tfZXZlbnRzGAUgASgLMjQueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuRXZlbnRXZWJob29rRXZlbnRzEj8KGWV2ZW50X3dlYmhvb2tfbWF4X3JldHJpZXMYECABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUSRQofZXZlbnRfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgRIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJFCh9ldmVudF93ZWJob29rX21heF93YWl0X2ludGVydmFsGBIgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkMKHWV2ZW50X3dlYmhvb2tfcmVxdWVzdF90aW1lb3V0GBMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjcKEnNuYXBzaG90X3RocmVzaG9sZBgUIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEjYKEXNuYXBzaG90X2ludGVydmFsGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUSQQobY2xpZW50X2RlYWN0aXZhdGVfdGhyZXNob2xkGAYgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEkEKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYByABKAsyGy5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZRJBChxtYXhfYXR0YWNobWVudHNfcGVyX2RvY3VtZW50GAggASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSOgoVbWF4X3NpemVfcGVyX2RvY3VtZW50GAogASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSNAoQcmVtb3ZlX29uX2RldGFjaBgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSOQoVYXV0b19yZXZpc2lvbl9lbmFibGVkGBYgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZRJJCg9hbGxvd2VkX29yaWdpbnMYCSABKAsyMC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BbGxvd2VkT3JpZ2lucxolChJBdXRoV2ViaG9va01ldGhvZHMSDwoHbWV0aG9kcxgBIAMoCRokChJFdmVudFdlYmhvb2tFdmVudHMSDgoGZXZlbnRzGAEgAygJGiEKDkFsbG93ZWRPcmlnaW5zEg8KB29yaWdpbnMYASADKAkipwMKD0RvY3VtZW50U3VtbWFyeRIKCgJpZBgBIAEoCRILCgNrZXkYAiABKAkSDAoEcm9vdBgDIAEoCRIYChBhdHRhY2hlZF9jbGllbnRzGAcgASgFEikKDWRvY3VtZW50X3NpemUYCCABKAsyEi55b3JraWUudjEuRG9jU2l6ZRISCgpzY2hlbWFfa2V5GAkgASgJEjwKCXByZXNlbmNlcxgKIAMoCzIpLnlvcmtpZS52MS5Eb2N1bWVudFN1bW1hcnkuUHJlc2VuY2VzRW50cnkSLgoKY3JlYXRlZF9hdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLYWNjZXNzZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi2gEKDlByZXNlbmNlQ2hhbmdlEjIKBHR5cGUYASABKA4yJC55b3JraWUudjEuUHJlc2VuY2VDaGFuZ2UuQ2hhbmdlVHlwZRIlCghwcmVzZW5jZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZSJtCgpDaGFuZ2VUeXBlEhsKF0NIQU5HRV9UWVBFX1VOU1BFQ0lGSUVEEAASEwoPQ0hBTkdFX1RZUEVfUFVUEAESFgoSQ0hBTkdFX1RZUEVfREVMRVRFEAISFQoRQ0hBTkdFX1RZUEVfQ0xFQVIQAyJkCghQcmVzZW5jZRIrCgRkYXRhGAEgAygLMh0ueW9ya2llLnYxLlByZXNlbmNlLkRhdGFFbnRyeRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASI0Cg5DaGFubmVsU3VtbWFyeRILCgNrZXkYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoBSI0CgpDaGVja3BvaW50EhIKCnNlcnZlcl9zZXEYASABKAMSEgoKY2xpZW50X3NlcRgCIAEoDSJhCgtUZXh0Tm9kZVBvcxIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFEhcKD3JlbGF0aXZlX29mZnNldBgDIAEoBSJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAq/AIKCVZhbHVlVHlwZRITCg9WQUxVRV9UWVBFX05VTEwQABIWChJWQUxVRV9UWVBFX0JPT0xFQU4QARIWChJWQUxVRV9UWVBFX0lOVEVHRVIQAhITCg9WQUxVRV9UWVBFX0xPTkcQAxIVChFWQUxVRV9UWVBFX0RPVUJMRRAEEhUKEVZBTFVFX1RZUEVfU1RSSU5HEAUSFAoQVkFMVUVfVFlQRV9CWVRFUxAGEhMKD1ZBTFVFX1RZUEVfREFURRAHEhoKFlZBTFVFX1RZUEVfSlNPTl9PQkpFQ1QQCBIZChVWQUxVRV9UWVBFX0pTT05fQVJSQVkQCRITCg9WQUxVRV9UWVBFX1RFWFQQChIaChZWQUxVRV9UWVBFX0lOVEVHRVJfQ05UEAsSFwoTVkFMVUVfVFlQRV9MT05HX0NOVBAMEhMKD1ZBTFVFX1RZUEVfVFJFRRANEiAKHFZBTFVFX1RZUEVfSU5URUdFUl9ERURVUF9DTlQQDiIECA8QDyqmAQoMRG9jRXZlbnRUeXBlEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0NIQU5HRUQQABIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9XQVRDSEVEEAESJQohRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfVU5XQVRDSEVEEAISJQohRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQlJPQURDQVNUEANCRQoRZGV2LnlvcmtpZS5hcGkudjFQAVouZ2l0aHViLmNvbS95b3JraWUtdGVhbS95b3JraWUvYXBpL3lvcmtpZS92MTt2MWIGcHJvdG8z", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
|
|
5794
5794
|
const SnapshotSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 0);
|
|
5795
5795
|
const ChangePackSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 1);
|
|
5796
5796
|
const ChangeSchema = /* @__PURE__ */ messageDesc(file_src_api_yorkie_v1_resources, 2);
|
|
@@ -7139,6 +7139,13 @@ class Primitive extends CRDTElement {
|
|
|
7139
7139
|
if (this.valueType === 5) {
|
|
7140
7140
|
return `"${escapeString(this.value)}"`;
|
|
7141
7141
|
}
|
|
7142
|
+
if (this.valueType === 6) {
|
|
7143
|
+
const bytes = this.value;
|
|
7144
|
+
return `"${btoa(String.fromCharCode(...bytes))}"`;
|
|
7145
|
+
}
|
|
7146
|
+
if (this.valueType === 7) {
|
|
7147
|
+
return `"${this.value.toISOString()}"`;
|
|
7148
|
+
}
|
|
7142
7149
|
return `${this.value}`;
|
|
7143
7150
|
}
|
|
7144
7151
|
/**
|
|
@@ -7281,19 +7288,54 @@ class Primitive extends CRDTElement {
|
|
|
7281
7288
|
}
|
|
7282
7289
|
}
|
|
7283
7290
|
}
|
|
7291
|
+
class ElementEntry {
|
|
7292
|
+
elem;
|
|
7293
|
+
positionNode;
|
|
7294
|
+
posMovedAt;
|
|
7295
|
+
constructor(elem) {
|
|
7296
|
+
this.elem = elem;
|
|
7297
|
+
}
|
|
7298
|
+
}
|
|
7284
7299
|
class RGATreeListNode extends SplayNode {
|
|
7300
|
+
_elementEntry;
|
|
7301
|
+
_createdAt;
|
|
7302
|
+
_removedAt;
|
|
7285
7303
|
prev;
|
|
7286
7304
|
next;
|
|
7287
|
-
|
|
7288
|
-
|
|
7289
|
-
|
|
7290
|
-
this.value = value;
|
|
7305
|
+
constructor(elem, createdAt) {
|
|
7306
|
+
super(elem);
|
|
7307
|
+
this._createdAt = createdAt;
|
|
7291
7308
|
}
|
|
7292
7309
|
/**
|
|
7293
|
-
* `
|
|
7310
|
+
* `createWithElement` creates a new node that owns an element.
|
|
7294
7311
|
*/
|
|
7295
|
-
static
|
|
7296
|
-
const
|
|
7312
|
+
static createWithElement(elem) {
|
|
7313
|
+
const entry = new ElementEntry(elem);
|
|
7314
|
+
const node = new RGATreeListNode(elem, elem.getCreatedAt());
|
|
7315
|
+
entry.positionNode = node;
|
|
7316
|
+
node._elementEntry = entry;
|
|
7317
|
+
return node;
|
|
7318
|
+
}
|
|
7319
|
+
/**
|
|
7320
|
+
* `createBarePosition` creates a position node without an element
|
|
7321
|
+
* (used for move).
|
|
7322
|
+
*/
|
|
7323
|
+
static createBarePosition(createdAt) {
|
|
7324
|
+
return new RGATreeListNode(void 0, createdAt);
|
|
7325
|
+
}
|
|
7326
|
+
/**
|
|
7327
|
+
* `createAfter` creates a new node with the given element after
|
|
7328
|
+
* the given prev node.
|
|
7329
|
+
*/
|
|
7330
|
+
static createAfter(prev, elem) {
|
|
7331
|
+
const newNode = RGATreeListNode.createWithElement(elem);
|
|
7332
|
+
RGATreeListNode.insertNodeAfter(prev, newNode);
|
|
7333
|
+
return newNode;
|
|
7334
|
+
}
|
|
7335
|
+
/**
|
|
7336
|
+
* `insertNodeAfter` inserts a node after the given prev node.
|
|
7337
|
+
*/
|
|
7338
|
+
static insertNodeAfter(prev, newNode) {
|
|
7297
7339
|
const prevNext = prev.next;
|
|
7298
7340
|
prev.next = newNode;
|
|
7299
7341
|
newNode.prev = prev;
|
|
@@ -7301,26 +7343,41 @@ class RGATreeListNode extends SplayNode {
|
|
|
7301
7343
|
if (prevNext) {
|
|
7302
7344
|
prevNext.prev = newNode;
|
|
7303
7345
|
}
|
|
7304
|
-
return newNode;
|
|
7305
7346
|
}
|
|
7306
7347
|
/**
|
|
7307
|
-
* `remove` removes
|
|
7348
|
+
* `remove` removes the element based on removing time.
|
|
7308
7349
|
*/
|
|
7309
7350
|
remove(removedAt) {
|
|
7310
|
-
|
|
7351
|
+
if (!this._elementEntry) {
|
|
7352
|
+
return false;
|
|
7353
|
+
}
|
|
7354
|
+
return this._elementEntry.elem.remove(removedAt);
|
|
7311
7355
|
}
|
|
7312
7356
|
/**
|
|
7313
|
-
* `getCreatedAt` returns creation time
|
|
7357
|
+
* `getCreatedAt` returns the creation time. For live nodes with
|
|
7358
|
+
* elements, returns the element's createdAt for backward
|
|
7359
|
+
* compatibility.
|
|
7314
7360
|
*/
|
|
7315
7361
|
getCreatedAt() {
|
|
7316
|
-
|
|
7362
|
+
if (this._elementEntry) {
|
|
7363
|
+
return this._elementEntry.elem.getCreatedAt();
|
|
7364
|
+
}
|
|
7365
|
+
return this._createdAt;
|
|
7317
7366
|
}
|
|
7318
7367
|
/**
|
|
7319
|
-
* `getPositionedAt` returns the time
|
|
7320
|
-
*
|
|
7368
|
+
* `getPositionedAt` returns the time this element was positioned.
|
|
7369
|
+
* For live nodes, the position register (posMovedAt) is the source
|
|
7370
|
+
* of truth. For dead nodes (no element), the position node's own
|
|
7371
|
+
* createdAt is used.
|
|
7321
7372
|
*/
|
|
7322
7373
|
getPositionedAt() {
|
|
7323
|
-
|
|
7374
|
+
if (this._elementEntry) {
|
|
7375
|
+
if (this._elementEntry.posMovedAt) {
|
|
7376
|
+
return this._elementEntry.posMovedAt;
|
|
7377
|
+
}
|
|
7378
|
+
return this._elementEntry.elem.getCreatedAt();
|
|
7379
|
+
}
|
|
7380
|
+
return this._createdAt;
|
|
7324
7381
|
}
|
|
7325
7382
|
/**
|
|
7326
7383
|
* `release` releases prev and next node.
|
|
@@ -7337,9 +7394,13 @@ class RGATreeListNode extends SplayNode {
|
|
|
7337
7394
|
}
|
|
7338
7395
|
/**
|
|
7339
7396
|
* `getLength` returns the length of this node.
|
|
7397
|
+
* Dead nodes (no element) return 0, removed elements return 0.
|
|
7340
7398
|
*/
|
|
7341
7399
|
getLength() {
|
|
7342
|
-
|
|
7400
|
+
if (!this._elementEntry || this.isRemoved()) {
|
|
7401
|
+
return 0;
|
|
7402
|
+
}
|
|
7403
|
+
return 1;
|
|
7343
7404
|
}
|
|
7344
7405
|
/**
|
|
7345
7406
|
* `getPrev` returns a previous node.
|
|
@@ -7354,28 +7415,87 @@ class RGATreeListNode extends SplayNode {
|
|
|
7354
7415
|
return this.next;
|
|
7355
7416
|
}
|
|
7356
7417
|
/**
|
|
7357
|
-
* `
|
|
7418
|
+
* `getValue` returns the element value.
|
|
7358
7419
|
*/
|
|
7359
|
-
|
|
7360
|
-
|
|
7420
|
+
getValue() {
|
|
7421
|
+
if (!this._elementEntry) {
|
|
7422
|
+
return this.value;
|
|
7423
|
+
}
|
|
7424
|
+
return this._elementEntry.elem;
|
|
7361
7425
|
}
|
|
7362
7426
|
/**
|
|
7363
|
-
* `
|
|
7427
|
+
* `getElement` returns the element or undefined if dead position.
|
|
7364
7428
|
*/
|
|
7365
|
-
|
|
7366
|
-
this.
|
|
7429
|
+
getElement() {
|
|
7430
|
+
return this._elementEntry?.elem;
|
|
7367
7431
|
}
|
|
7368
7432
|
/**
|
|
7369
|
-
* `
|
|
7433
|
+
* `isRemoved` checks if the value was removed.
|
|
7370
7434
|
*/
|
|
7371
|
-
|
|
7372
|
-
|
|
7435
|
+
isRemoved() {
|
|
7436
|
+
if (!this._elementEntry) {
|
|
7437
|
+
return true;
|
|
7438
|
+
}
|
|
7439
|
+
return this._elementEntry.elem.isRemoved();
|
|
7373
7440
|
}
|
|
7374
7441
|
/**
|
|
7375
|
-
* `
|
|
7442
|
+
* `getElementEntry` returns the element entry.
|
|
7376
7443
|
*/
|
|
7377
|
-
|
|
7378
|
-
return this.
|
|
7444
|
+
getElementEntry() {
|
|
7445
|
+
return this._elementEntry;
|
|
7446
|
+
}
|
|
7447
|
+
/**
|
|
7448
|
+
* `setElementEntry` sets the element entry.
|
|
7449
|
+
*/
|
|
7450
|
+
setElementEntry(entry) {
|
|
7451
|
+
this._elementEntry = entry;
|
|
7452
|
+
}
|
|
7453
|
+
/**
|
|
7454
|
+
* `getPositionCreatedAt` returns the position node's own createdAt.
|
|
7455
|
+
*/
|
|
7456
|
+
getPositionCreatedAt() {
|
|
7457
|
+
return this._createdAt;
|
|
7458
|
+
}
|
|
7459
|
+
/**
|
|
7460
|
+
* `getPositionMovedAt` returns the LWW timestamp of the element's
|
|
7461
|
+
* move into this position. Undefined for insert-created positions.
|
|
7462
|
+
*/
|
|
7463
|
+
getPositionMovedAt() {
|
|
7464
|
+
if (!this._elementEntry) {
|
|
7465
|
+
return void 0;
|
|
7466
|
+
}
|
|
7467
|
+
return this._elementEntry.posMovedAt;
|
|
7468
|
+
}
|
|
7469
|
+
/**
|
|
7470
|
+
* `getRemovedAt` returns the time this dead position node was
|
|
7471
|
+
* removed (for GC).
|
|
7472
|
+
*/
|
|
7473
|
+
getRemovedAt() {
|
|
7474
|
+
return this._removedAt;
|
|
7475
|
+
}
|
|
7476
|
+
/**
|
|
7477
|
+
* `setRemovedAt` sets the removal time of this position node.
|
|
7478
|
+
*/
|
|
7479
|
+
setRemovedAt(removedAt) {
|
|
7480
|
+
this._removedAt = removedAt;
|
|
7481
|
+
}
|
|
7482
|
+
/**
|
|
7483
|
+
* `toIDString` returns a unique identifier for this position node
|
|
7484
|
+
* (for GC).
|
|
7485
|
+
*/
|
|
7486
|
+
toIDString() {
|
|
7487
|
+
return this._createdAt.toIDString();
|
|
7488
|
+
}
|
|
7489
|
+
/**
|
|
7490
|
+
* `getDataSize` returns the data size of this position node
|
|
7491
|
+
* (for GC).
|
|
7492
|
+
*/
|
|
7493
|
+
getDataSize() {
|
|
7494
|
+
let meta = TimeTicketSize;
|
|
7495
|
+
if (this._removedAt) {
|
|
7496
|
+
meta += TimeTicketSize;
|
|
7497
|
+
}
|
|
7498
|
+
return { data: 0, meta };
|
|
7379
7499
|
}
|
|
7380
7500
|
}
|
|
7381
7501
|
class RGATreeList {
|
|
@@ -7383,13 +7503,15 @@ class RGATreeList {
|
|
|
7383
7503
|
last;
|
|
7384
7504
|
nodeMapByIndex;
|
|
7385
7505
|
nodeMapByCreatedAt;
|
|
7506
|
+
elementMapByCreatedAt;
|
|
7386
7507
|
constructor() {
|
|
7387
7508
|
const dummyValue = Primitive.of(0, InitialTimeTicket);
|
|
7388
7509
|
dummyValue.setRemovedAt(InitialTimeTicket);
|
|
7389
|
-
this.dummyHead =
|
|
7510
|
+
this.dummyHead = RGATreeListNode.createWithElement(dummyValue);
|
|
7390
7511
|
this.last = this.dummyHead;
|
|
7391
7512
|
this.nodeMapByIndex = new SplayTree();
|
|
7392
7513
|
this.nodeMapByCreatedAt = /* @__PURE__ */ new Map();
|
|
7514
|
+
this.elementMapByCreatedAt = /* @__PURE__ */ new Map();
|
|
7393
7515
|
this.nodeMapByIndex.insert(this.dummyHead);
|
|
7394
7516
|
this.nodeMapByCreatedAt.set(
|
|
7395
7517
|
this.dummyHead.getCreatedAt().toIDString(),
|
|
@@ -7409,22 +7531,10 @@ class RGATreeList {
|
|
|
7409
7531
|
return this.nodeMapByIndex.length;
|
|
7410
7532
|
}
|
|
7411
7533
|
/**
|
|
7412
|
-
* `findNextBeforeExecutedAt`
|
|
7413
|
-
*
|
|
7414
|
-
* given node and returns the next node.
|
|
7415
|
-
* @returns the next node of the given createdAt and executedAt
|
|
7534
|
+
* `findNextBeforeExecutedAt` walks forward from the given node,
|
|
7535
|
+
* skipping nodes positioned after executedAt (RGA insertion rule).
|
|
7416
7536
|
*/
|
|
7417
|
-
findNextBeforeExecutedAt(
|
|
7418
|
-
let node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
|
|
7419
|
-
if (!node) {
|
|
7420
|
-
throw new YorkieError(
|
|
7421
|
-
Code.ErrInvalidArgument,
|
|
7422
|
-
`cant find the given node: ${createdAt.toIDString()}`
|
|
7423
|
-
);
|
|
7424
|
-
}
|
|
7425
|
-
while (node.getValue().getMovedAt() && node.getValue().getMovedAt().after(executedAt) && node.getMovedFrom()) {
|
|
7426
|
-
node = node.getMovedFrom();
|
|
7427
|
-
}
|
|
7537
|
+
findNextBeforeExecutedAt(node, executedAt) {
|
|
7428
7538
|
while (node.getNext() && node.getNext().getPositionedAt().after(executedAt)) {
|
|
7429
7539
|
node = node.getNext();
|
|
7430
7540
|
}
|
|
@@ -7436,65 +7546,103 @@ class RGATreeList {
|
|
|
7436
7546
|
}
|
|
7437
7547
|
node.release();
|
|
7438
7548
|
this.nodeMapByIndex.delete(node);
|
|
7439
|
-
this.nodeMapByCreatedAt.delete(node.
|
|
7549
|
+
this.nodeMapByCreatedAt.delete(node.getPositionCreatedAt().toIDString());
|
|
7440
7550
|
}
|
|
7441
7551
|
/**
|
|
7442
|
-
* `insertAfter` adds a new node with the value after the given
|
|
7552
|
+
* `insertAfter` adds a new node with the value after the given
|
|
7553
|
+
* position. prevCreatedAt is a position node identity. Looks up
|
|
7554
|
+
* nodeMapByCreatedAt first, then elementMapByCreatedAt for backward
|
|
7555
|
+
* compatibility.
|
|
7443
7556
|
*/
|
|
7444
7557
|
insertAfter(prevCreatedAt, value, executedAt = value.getCreatedAt()) {
|
|
7445
|
-
|
|
7558
|
+
let startNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
|
|
7559
|
+
if (!startNode) {
|
|
7560
|
+
const entry = this.elementMapByCreatedAt.get(prevCreatedAt.toIDString());
|
|
7561
|
+
if (entry) {
|
|
7562
|
+
startNode = entry.positionNode;
|
|
7563
|
+
}
|
|
7564
|
+
}
|
|
7565
|
+
if (!startNode) {
|
|
7566
|
+
throw new YorkieError(
|
|
7567
|
+
Code.ErrInvalidArgument,
|
|
7568
|
+
`cant find the given node: ${prevCreatedAt.toIDString()}`
|
|
7569
|
+
);
|
|
7570
|
+
}
|
|
7571
|
+
const prevNode = this.findNextBeforeExecutedAt(startNode, executedAt);
|
|
7446
7572
|
const newNode = RGATreeListNode.createAfter(prevNode, value);
|
|
7447
7573
|
if (prevNode === this.last) {
|
|
7448
7574
|
this.last = newNode;
|
|
7449
7575
|
}
|
|
7450
7576
|
this.nodeMapByIndex.insertAfter(prevNode, newNode);
|
|
7451
|
-
this.nodeMapByCreatedAt.set(
|
|
7577
|
+
this.nodeMapByCreatedAt.set(value.getCreatedAt().toIDString(), newNode);
|
|
7578
|
+
this.elementMapByCreatedAt.set(
|
|
7579
|
+
value.getCreatedAt().toIDString(),
|
|
7580
|
+
newNode.getElementEntry()
|
|
7581
|
+
);
|
|
7452
7582
|
return newNode;
|
|
7453
7583
|
}
|
|
7454
7584
|
/**
|
|
7455
|
-
* `
|
|
7456
|
-
*
|
|
7585
|
+
* `insertPositionAfter` creates a bare position node after
|
|
7586
|
+
* resolving position via forward skip (RGA insertion rule).
|
|
7587
|
+
* Used by moveAfter. prevCreatedAt is a POSITION node identity.
|
|
7588
|
+
*/
|
|
7589
|
+
insertPositionAfter(prevCreatedAt, executedAt) {
|
|
7590
|
+
const startNode = this.nodeMapByCreatedAt.get(prevCreatedAt.toIDString());
|
|
7591
|
+
if (!startNode) {
|
|
7592
|
+
throw new YorkieError(
|
|
7593
|
+
Code.ErrInvalidArgument,
|
|
7594
|
+
`cant find the given node: ${prevCreatedAt.toIDString()}`
|
|
7595
|
+
);
|
|
7596
|
+
}
|
|
7597
|
+
const prevNode = this.findNextBeforeExecutedAt(startNode, executedAt);
|
|
7598
|
+
const newNode = RGATreeListNode.createBarePosition(executedAt);
|
|
7599
|
+
RGATreeListNode.insertNodeAfter(prevNode, newNode);
|
|
7600
|
+
if (prevNode === this.last) {
|
|
7601
|
+
this.last = newNode;
|
|
7602
|
+
}
|
|
7603
|
+
this.nodeMapByIndex.insertAfter(prevNode, newNode);
|
|
7604
|
+
this.nodeMapByCreatedAt.set(executedAt.toIDString(), newNode);
|
|
7605
|
+
return newNode;
|
|
7606
|
+
}
|
|
7607
|
+
/**
|
|
7608
|
+
* `moveAfter` moves the given `createdAt` element after the
|
|
7609
|
+
* `prevCreatedAt` element using LWW position register semantics.
|
|
7610
|
+
* Returns the dead position node (if any) for GC registration.
|
|
7457
7611
|
*/
|
|
7458
7612
|
moveAfter(prevCreatedAt, createdAt, executedAt) {
|
|
7459
|
-
|
|
7460
|
-
if (!prevNode) {
|
|
7613
|
+
if (!this.nodeMapByCreatedAt.has(prevCreatedAt.toIDString())) {
|
|
7461
7614
|
throw new YorkieError(
|
|
7462
7615
|
Code.ErrInvalidArgument,
|
|
7463
7616
|
`cant find the given node: ${prevCreatedAt.toIDString()}`
|
|
7464
7617
|
);
|
|
7465
7618
|
}
|
|
7466
|
-
|
|
7467
|
-
if (!
|
|
7619
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7620
|
+
if (!entry) {
|
|
7468
7621
|
throw new YorkieError(
|
|
7469
7622
|
Code.ErrInvalidArgument,
|
|
7470
7623
|
`cant find the given node: ${createdAt.toIDString()}`
|
|
7471
7624
|
);
|
|
7472
7625
|
}
|
|
7473
|
-
if (
|
|
7474
|
-
|
|
7475
|
-
|
|
7476
|
-
this.release(node);
|
|
7477
|
-
node = this.insertAfter(
|
|
7478
|
-
prevNode.getCreatedAt(),
|
|
7479
|
-
node.getValue(),
|
|
7480
|
-
executedAt
|
|
7481
|
-
);
|
|
7482
|
-
node.getValue().setMovedAt(executedAt);
|
|
7483
|
-
node.setMovedFrom(movedFrom);
|
|
7484
|
-
while (nextNode && nextNode.getPositionedAt().after(executedAt)) {
|
|
7485
|
-
prevNode = node;
|
|
7486
|
-
node = nextNode;
|
|
7487
|
-
nextNode = node.getNext();
|
|
7488
|
-
this.release(node);
|
|
7489
|
-
node = this.insertAfter(
|
|
7490
|
-
prevNode.getCreatedAt(),
|
|
7491
|
-
node.getValue(),
|
|
7492
|
-
executedAt
|
|
7493
|
-
);
|
|
7494
|
-
node.getValue().setMovedAt(executedAt);
|
|
7495
|
-
node.setMovedFrom(movedFrom);
|
|
7626
|
+
if (entry.posMovedAt && !executedAt.after(entry.posMovedAt)) {
|
|
7627
|
+
if (this.nodeMapByCreatedAt.has(executedAt.toIDString())) {
|
|
7628
|
+
return void 0;
|
|
7496
7629
|
}
|
|
7630
|
+
const deadPosNode = this.insertPositionAfter(prevCreatedAt, executedAt);
|
|
7631
|
+
deadPosNode.setRemovedAt(executedAt);
|
|
7632
|
+
this.nodeMapByIndex.splayNode(deadPosNode);
|
|
7633
|
+
return deadPosNode;
|
|
7497
7634
|
}
|
|
7635
|
+
const newPosNode = this.insertPositionAfter(prevCreatedAt, executedAt);
|
|
7636
|
+
const oldPosNode = entry.positionNode;
|
|
7637
|
+
oldPosNode.setElementEntry(void 0);
|
|
7638
|
+
oldPosNode.setRemovedAt(executedAt);
|
|
7639
|
+
this.nodeMapByIndex.splayNode(oldPosNode);
|
|
7640
|
+
newPosNode.setElementEntry(entry);
|
|
7641
|
+
entry.positionNode = newPosNode;
|
|
7642
|
+
entry.posMovedAt = executedAt;
|
|
7643
|
+
entry.elem.setMovedAt(executedAt);
|
|
7644
|
+
this.nodeMapByIndex.splayNode(newPosNode);
|
|
7645
|
+
return oldPosNode;
|
|
7498
7646
|
}
|
|
7499
7647
|
/**
|
|
7500
7648
|
* `insert` adds the given element after the last node.
|
|
@@ -7503,34 +7651,53 @@ class RGATreeList {
|
|
|
7503
7651
|
this.insertAfter(this.last.getCreatedAt(), value);
|
|
7504
7652
|
}
|
|
7505
7653
|
/**
|
|
7506
|
-
* `getByID` returns the
|
|
7654
|
+
* `getByID` returns the node of the given creation time.
|
|
7655
|
+
* Checks elementMapByCreatedAt first (for moved elements whose
|
|
7656
|
+
* position node createdAt differs), then nodeMapByCreatedAt.
|
|
7507
7657
|
*/
|
|
7508
7658
|
getByID(createdAt) {
|
|
7659
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7660
|
+
if (entry) {
|
|
7661
|
+
return entry.positionNode;
|
|
7662
|
+
}
|
|
7509
7663
|
return this.nodeMapByCreatedAt.get(createdAt.toIDString());
|
|
7510
7664
|
}
|
|
7511
7665
|
/**
|
|
7512
7666
|
* `subPathOf` returns the sub path of the given element.
|
|
7513
7667
|
*/
|
|
7514
7668
|
subPathOf(createdAt) {
|
|
7515
|
-
const
|
|
7516
|
-
if (!
|
|
7517
|
-
|
|
7669
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7670
|
+
if (!entry) {
|
|
7671
|
+
const node = this.nodeMapByCreatedAt.get(createdAt.toIDString());
|
|
7672
|
+
if (!node) {
|
|
7673
|
+
return;
|
|
7674
|
+
}
|
|
7675
|
+
return String(this.nodeMapByIndex.indexOf(node));
|
|
7518
7676
|
}
|
|
7519
|
-
return String(this.nodeMapByIndex.indexOf(
|
|
7677
|
+
return String(this.nodeMapByIndex.indexOf(entry.positionNode));
|
|
7520
7678
|
}
|
|
7521
7679
|
/**
|
|
7522
|
-
* `purge` physically purges
|
|
7680
|
+
* `purge` physically purges the given child. Handles both dead
|
|
7681
|
+
* position nodes (GCChild from GCParent path) and CRDTElements
|
|
7682
|
+
* (from CRDTContainer path).
|
|
7523
7683
|
*/
|
|
7524
|
-
purge(
|
|
7525
|
-
|
|
7684
|
+
purge(child) {
|
|
7685
|
+
if (child instanceof RGATreeListNode) {
|
|
7686
|
+
this.release(child);
|
|
7687
|
+
return;
|
|
7688
|
+
}
|
|
7689
|
+
const element = child;
|
|
7690
|
+
const entry = this.elementMapByCreatedAt.get(
|
|
7526
7691
|
element.getCreatedAt().toIDString()
|
|
7527
7692
|
);
|
|
7528
|
-
if (!
|
|
7693
|
+
if (!entry) {
|
|
7529
7694
|
throw new YorkieError(
|
|
7530
7695
|
Code.ErrInvalidArgument,
|
|
7531
7696
|
`fail to find the given createdAt: ${element.getCreatedAt().toIDString()}`
|
|
7532
7697
|
);
|
|
7533
7698
|
}
|
|
7699
|
+
const node = entry.positionNode;
|
|
7700
|
+
this.elementMapByCreatedAt.delete(element.getCreatedAt().toIDString());
|
|
7534
7701
|
this.release(node);
|
|
7535
7702
|
}
|
|
7536
7703
|
/**
|
|
@@ -7541,42 +7708,69 @@ class RGATreeList {
|
|
|
7541
7708
|
return;
|
|
7542
7709
|
}
|
|
7543
7710
|
const node = this.nodeMapByIndex.findForArray(idx);
|
|
7544
|
-
|
|
7545
|
-
return rgaNode;
|
|
7711
|
+
return node;
|
|
7546
7712
|
}
|
|
7547
7713
|
/**
|
|
7548
|
-
* `
|
|
7714
|
+
* `findPrevCreatedAt` returns the position node's createdAt of the
|
|
7715
|
+
* previous element. This returns a position identity suitable for
|
|
7716
|
+
* use as prevCreatedAt in moveAfter.
|
|
7549
7717
|
*/
|
|
7550
|
-
|
|
7551
|
-
|
|
7718
|
+
findPrevCreatedAt(createdAt) {
|
|
7719
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7720
|
+
if (!entry) {
|
|
7721
|
+
throw new YorkieError(
|
|
7722
|
+
Code.ErrInvalidArgument,
|
|
7723
|
+
`cant find the given node: ${createdAt.toIDString()}`
|
|
7724
|
+
);
|
|
7725
|
+
}
|
|
7726
|
+
let node = entry.positionNode;
|
|
7552
7727
|
do {
|
|
7553
7728
|
node = node.getPrev();
|
|
7554
|
-
|
|
7555
|
-
|
|
7729
|
+
if (!node.getElementEntry()) {
|
|
7730
|
+
continue;
|
|
7731
|
+
}
|
|
7732
|
+
if (this.dummyHead === node || !node.isRemoved()) {
|
|
7733
|
+
break;
|
|
7734
|
+
}
|
|
7735
|
+
} while (node);
|
|
7736
|
+
return node.getPositionCreatedAt();
|
|
7737
|
+
}
|
|
7738
|
+
/**
|
|
7739
|
+
* `getPrevCreatedAt` returns the position node's createdAt of the
|
|
7740
|
+
* previous element. Delegates to findPrevCreatedAt.
|
|
7741
|
+
*/
|
|
7742
|
+
getPrevCreatedAt(createdAt) {
|
|
7743
|
+
return this.findPrevCreatedAt(createdAt);
|
|
7556
7744
|
}
|
|
7557
7745
|
/**
|
|
7558
7746
|
* `delete` deletes the node of the given creation time.
|
|
7559
7747
|
*/
|
|
7560
7748
|
delete(createdAt, editedAt) {
|
|
7561
|
-
const
|
|
7749
|
+
const entry = this.elementMapByCreatedAt.get(createdAt.toIDString());
|
|
7750
|
+
if (!entry) {
|
|
7751
|
+
throw new YorkieError(
|
|
7752
|
+
Code.ErrInvalidArgument,
|
|
7753
|
+
`cant find the given node: ${createdAt.toIDString()}`
|
|
7754
|
+
);
|
|
7755
|
+
}
|
|
7756
|
+
const node = entry.positionNode;
|
|
7562
7757
|
const alreadyRemoved = node.isRemoved();
|
|
7563
|
-
if (
|
|
7758
|
+
if (entry.elem.remove(editedAt) && !alreadyRemoved) {
|
|
7564
7759
|
this.nodeMapByIndex.splayNode(node);
|
|
7565
7760
|
}
|
|
7566
|
-
return
|
|
7761
|
+
return entry.elem;
|
|
7567
7762
|
}
|
|
7568
7763
|
/**
|
|
7569
7764
|
* `set` sets the given element at the given creation time.
|
|
7570
7765
|
*/
|
|
7571
7766
|
set(createdAt, element, executedAt) {
|
|
7572
|
-
|
|
7573
|
-
if (!node) {
|
|
7767
|
+
if (!this.elementMapByCreatedAt.has(createdAt.toIDString())) {
|
|
7574
7768
|
throw new YorkieError(
|
|
7575
7769
|
Code.ErrInvalidArgument,
|
|
7576
7770
|
`cant find the given node: ${createdAt.toIDString()}`
|
|
7577
7771
|
);
|
|
7578
7772
|
}
|
|
7579
|
-
this.insertAfter(
|
|
7773
|
+
this.insertAfter(createdAt, element, executedAt);
|
|
7580
7774
|
return this.delete(createdAt, executedAt);
|
|
7581
7775
|
}
|
|
7582
7776
|
/**
|
|
@@ -7605,18 +7799,80 @@ class RGATreeList {
|
|
|
7605
7799
|
return this.last.getValue();
|
|
7606
7800
|
}
|
|
7607
7801
|
/**
|
|
7608
|
-
* `getLastCreatedAt` returns the
|
|
7802
|
+
* `getLastCreatedAt` returns the position node's createdAt of the
|
|
7803
|
+
* last node in the linked list. This is a position identity
|
|
7804
|
+
* suitable for use as prevCreatedAt.
|
|
7609
7805
|
*/
|
|
7610
7806
|
getLastCreatedAt() {
|
|
7611
|
-
return this.last.
|
|
7807
|
+
return this.last.getPositionCreatedAt();
|
|
7612
7808
|
}
|
|
7613
7809
|
/**
|
|
7614
|
-
* `
|
|
7615
|
-
*
|
|
7810
|
+
* `posCreatedAt` returns the createdAt of the position node
|
|
7811
|
+
* currently holding the element. Used to convert element identity
|
|
7812
|
+
* to position identity.
|
|
7813
|
+
*/
|
|
7814
|
+
posCreatedAt(elemCreatedAt) {
|
|
7815
|
+
const entry = this.elementMapByCreatedAt.get(elemCreatedAt.toIDString());
|
|
7816
|
+
if (!entry) {
|
|
7817
|
+
throw new YorkieError(
|
|
7818
|
+
Code.ErrInvalidArgument,
|
|
7819
|
+
`cant find the given node: ${elemCreatedAt.toIDString()}`
|
|
7820
|
+
);
|
|
7821
|
+
}
|
|
7822
|
+
return entry.positionNode.getPositionCreatedAt();
|
|
7823
|
+
}
|
|
7824
|
+
/**
|
|
7825
|
+
* `addDeadPosition` appends a dead position node during snapshot
|
|
7826
|
+
* restoration.
|
|
7827
|
+
*/
|
|
7828
|
+
addDeadPosition(posCreatedAt, removedAt) {
|
|
7829
|
+
const node = RGATreeListNode.createBarePosition(posCreatedAt);
|
|
7830
|
+
node.setRemovedAt(removedAt);
|
|
7831
|
+
const prevNode = this.last;
|
|
7832
|
+
RGATreeListNode.insertNodeAfter(prevNode, node);
|
|
7833
|
+
this.last = node;
|
|
7834
|
+
this.nodeMapByIndex.insertAfter(prevNode, node);
|
|
7835
|
+
this.nodeMapByCreatedAt.set(posCreatedAt.toIDString(), node);
|
|
7836
|
+
}
|
|
7837
|
+
/**
|
|
7838
|
+
* `addMovedElement` appends an element with explicit position
|
|
7839
|
+
* identity during snapshot restoration.
|
|
7840
|
+
*/
|
|
7841
|
+
addMovedElement(elem, posCreatedAt, posMovedAt) {
|
|
7842
|
+
const entry = new ElementEntry(elem);
|
|
7843
|
+
entry.posMovedAt = posMovedAt;
|
|
7844
|
+
const node = RGATreeListNode.createBarePosition(posCreatedAt);
|
|
7845
|
+
node.setElementEntry(entry);
|
|
7846
|
+
entry.positionNode = node;
|
|
7847
|
+
const prevNode = this.last;
|
|
7848
|
+
RGATreeListNode.insertNodeAfter(prevNode, node);
|
|
7849
|
+
this.last = node;
|
|
7850
|
+
this.nodeMapByIndex.insertAfter(prevNode, node);
|
|
7851
|
+
this.nodeMapByCreatedAt.set(posCreatedAt.toIDString(), node);
|
|
7852
|
+
this.elementMapByCreatedAt.set(elem.getCreatedAt().toIDString(), entry);
|
|
7853
|
+
}
|
|
7854
|
+
/**
|
|
7855
|
+
* `allNodes` returns all nodes including dead position nodes.
|
|
7856
|
+
*/
|
|
7857
|
+
allNodes() {
|
|
7858
|
+
const nodes = [];
|
|
7859
|
+
let current = this.dummyHead.getNext();
|
|
7860
|
+
while (current) {
|
|
7861
|
+
nodes.push(current);
|
|
7862
|
+
current = current.getNext();
|
|
7863
|
+
}
|
|
7864
|
+
return nodes;
|
|
7865
|
+
}
|
|
7866
|
+
/**
|
|
7867
|
+
* `toTestString` returns a String containing the meta data of the
|
|
7868
|
+
* node id for debugging purpose.
|
|
7616
7869
|
*/
|
|
7617
7870
|
toTestString() {
|
|
7618
7871
|
const json = [];
|
|
7619
7872
|
for (const node of this) {
|
|
7873
|
+
if (!node.getElementEntry()) {
|
|
7874
|
+
continue;
|
|
7875
|
+
}
|
|
7620
7876
|
const elem = `${node.getCreatedAt().toIDString()}:${node.getValue().toJSON()}`;
|
|
7621
7877
|
if (node.isRemoved()) {
|
|
7622
7878
|
json.push(`{${elem}}`);
|
|
@@ -7673,10 +7929,11 @@ class CRDTArray extends CRDTContainer {
|
|
|
7673
7929
|
this.elements.insertAfter(prevCreatedAt, value, executedAt);
|
|
7674
7930
|
}
|
|
7675
7931
|
/**
|
|
7676
|
-
* `moveAfter` moves the given `createdAt` element after the
|
|
7932
|
+
* `moveAfter` moves the given `createdAt` element after the
|
|
7933
|
+
* `prevCreatedAt`. Returns the dead position node for GC.
|
|
7677
7934
|
*/
|
|
7678
7935
|
moveAfter(prevCreatedAt, createdAt, executedAt) {
|
|
7679
|
-
this.elements.moveAfter(prevCreatedAt, createdAt, executedAt);
|
|
7936
|
+
return this.elements.moveAfter(prevCreatedAt, createdAt, executedAt);
|
|
7680
7937
|
}
|
|
7681
7938
|
/**
|
|
7682
7939
|
* `get` returns the element of the given index.
|
|
@@ -7705,11 +7962,20 @@ class CRDTArray extends CRDTContainer {
|
|
|
7705
7962
|
return this.elements.getLast();
|
|
7706
7963
|
}
|
|
7707
7964
|
/**
|
|
7708
|
-
* `getPrevCreatedAt` returns the creation time of the previous
|
|
7965
|
+
* `getPrevCreatedAt` returns the creation time of the previous
|
|
7966
|
+
* node.
|
|
7709
7967
|
*/
|
|
7710
7968
|
getPrevCreatedAt(createdAt) {
|
|
7711
7969
|
return this.elements.getPrevCreatedAt(createdAt);
|
|
7712
7970
|
}
|
|
7971
|
+
/**
|
|
7972
|
+
* `posCreatedAt` returns the createdAt of the position node
|
|
7973
|
+
* currently holding the element. Used to convert element identity
|
|
7974
|
+
* to position identity for moves.
|
|
7975
|
+
*/
|
|
7976
|
+
posCreatedAt(elemCreatedAt) {
|
|
7977
|
+
return this.elements.posCreatedAt(elemCreatedAt);
|
|
7978
|
+
}
|
|
7713
7979
|
/**
|
|
7714
7980
|
* `delete` deletes the element of the given creation time.
|
|
7715
7981
|
*/
|
|
@@ -7723,7 +7989,8 @@ class CRDTArray extends CRDTContainer {
|
|
|
7723
7989
|
return this.elements.deleteByIndex(index, editedAt);
|
|
7724
7990
|
}
|
|
7725
7991
|
/**
|
|
7726
|
-
* `set` sets the given element at the given position of the
|
|
7992
|
+
* `set` sets the given element at the given position of the
|
|
7993
|
+
* creation time.
|
|
7727
7994
|
*/
|
|
7728
7995
|
set(createdAt, value, executedAt) {
|
|
7729
7996
|
return this.elements.set(createdAt, value, executedAt);
|
|
@@ -7741,18 +8008,19 @@ class CRDTArray extends CRDTContainer {
|
|
|
7741
8008
|
return this.elements.length;
|
|
7742
8009
|
}
|
|
7743
8010
|
/**
|
|
7744
|
-
* `[Symbol.iterator]` returns an iterator for the elements in
|
|
8011
|
+
* `[Symbol.iterator]` returns an iterator for the elements in
|
|
8012
|
+
* this array.
|
|
7745
8013
|
*/
|
|
7746
8014
|
*[Symbol.iterator]() {
|
|
7747
8015
|
for (const node of this.elements) {
|
|
7748
|
-
if (!node.isRemoved()) {
|
|
8016
|
+
if (node.getElementEntry() && !node.isRemoved()) {
|
|
7749
8017
|
yield node.getValue();
|
|
7750
8018
|
}
|
|
7751
8019
|
}
|
|
7752
8020
|
}
|
|
7753
8021
|
/**
|
|
7754
|
-
* `toTestString` returns a String containing the meta data of
|
|
7755
|
-
* for debugging purpose.
|
|
8022
|
+
* `toTestString` returns a String containing the meta data of
|
|
8023
|
+
* this value for debugging purpose.
|
|
7756
8024
|
*/
|
|
7757
8025
|
toTestString() {
|
|
7758
8026
|
return this.elements.toTestString();
|
|
@@ -7762,6 +8030,9 @@ class CRDTArray extends CRDTContainer {
|
|
|
7762
8030
|
*/
|
|
7763
8031
|
getDescendants(callback) {
|
|
7764
8032
|
for (const node of this.elements) {
|
|
8033
|
+
if (!node.getElementEntry()) {
|
|
8034
|
+
continue;
|
|
8035
|
+
}
|
|
7765
8036
|
const element = node.getValue();
|
|
7766
8037
|
if (callback(element, this)) {
|
|
7767
8038
|
return;
|
|
@@ -7823,21 +8094,52 @@ class CRDTArray extends CRDTContainer {
|
|
|
7823
8094
|
return this.toJSON();
|
|
7824
8095
|
}
|
|
7825
8096
|
/**
|
|
7826
|
-
* `getElements` returns
|
|
8097
|
+
* `getElements` returns the underlying RGATreeList.
|
|
7827
8098
|
*/
|
|
7828
8099
|
getElements() {
|
|
7829
8100
|
return this.elements;
|
|
7830
8101
|
}
|
|
8102
|
+
/**
|
|
8103
|
+
* `getRGATreeList` returns the underlying RGATreeList (GCParent
|
|
8104
|
+
* for dead positions).
|
|
8105
|
+
*/
|
|
8106
|
+
getRGATreeList() {
|
|
8107
|
+
return this.elements;
|
|
8108
|
+
}
|
|
8109
|
+
/**
|
|
8110
|
+
* `getAllRGANodes` returns all RGA nodes including dead position
|
|
8111
|
+
* nodes.
|
|
8112
|
+
*/
|
|
8113
|
+
getAllRGANodes() {
|
|
8114
|
+
return this.elements.allNodes();
|
|
8115
|
+
}
|
|
7831
8116
|
/**
|
|
7832
8117
|
* `deepcopy` copies itself deeply.
|
|
7833
8118
|
*/
|
|
7834
8119
|
deepcopy() {
|
|
7835
8120
|
const clone = CRDTArray.create(this.getCreatedAt());
|
|
7836
8121
|
for (const node of this.elements) {
|
|
7837
|
-
|
|
7838
|
-
|
|
7839
|
-
|
|
7840
|
-
|
|
8122
|
+
if (!node.getElementEntry()) {
|
|
8123
|
+
const removedAt = node.getRemovedAt();
|
|
8124
|
+
if (removedAt) {
|
|
8125
|
+
clone.elements.addDeadPosition(
|
|
8126
|
+
node.getPositionCreatedAt(),
|
|
8127
|
+
removedAt
|
|
8128
|
+
);
|
|
8129
|
+
}
|
|
8130
|
+
continue;
|
|
8131
|
+
}
|
|
8132
|
+
const value = node.getValue().deepcopy();
|
|
8133
|
+
const posMovedAt = node.getPositionMovedAt();
|
|
8134
|
+
if (posMovedAt) {
|
|
8135
|
+
clone.elements.addMovedElement(
|
|
8136
|
+
value,
|
|
8137
|
+
node.getPositionCreatedAt(),
|
|
8138
|
+
posMovedAt
|
|
8139
|
+
);
|
|
8140
|
+
} else {
|
|
8141
|
+
clone.elements.insertAfter(clone.getLastCreatedAt(), value);
|
|
8142
|
+
}
|
|
7841
8143
|
}
|
|
7842
8144
|
clone.setRemovedAt(this.getRemovedAt());
|
|
7843
8145
|
clone.setMovedAt(this.getMovedAt());
|
|
@@ -8094,6 +8396,9 @@ class SetOperation extends Operation {
|
|
|
8094
8396
|
if (removed) {
|
|
8095
8397
|
root.registerRemovedElement(removed);
|
|
8096
8398
|
}
|
|
8399
|
+
if (value.getRemovedAt()) {
|
|
8400
|
+
root.registerRemovedElement(value);
|
|
8401
|
+
}
|
|
8097
8402
|
return {
|
|
8098
8403
|
opInfos: [
|
|
8099
8404
|
{
|
|
@@ -8186,7 +8491,17 @@ class MoveOperation extends Operation {
|
|
|
8186
8491
|
const array = parentObject;
|
|
8187
8492
|
const reverseOp = this.toReverseOperation(array);
|
|
8188
8493
|
const previousIndex = Number(array.subPathOf(this.createdAt));
|
|
8189
|
-
array.moveAfter(
|
|
8494
|
+
const deadNode = array.moveAfter(
|
|
8495
|
+
this.prevCreatedAt,
|
|
8496
|
+
this.createdAt,
|
|
8497
|
+
this.getExecutedAt()
|
|
8498
|
+
);
|
|
8499
|
+
if (deadNode) {
|
|
8500
|
+
root.registerGCPair({
|
|
8501
|
+
parent: array.getRGATreeList(),
|
|
8502
|
+
child: deadNode
|
|
8503
|
+
});
|
|
8504
|
+
}
|
|
8190
8505
|
const index = Number(array.subPathOf(this.createdAt));
|
|
8191
8506
|
return {
|
|
8192
8507
|
opInfos: [
|
|
@@ -8209,7 +8524,8 @@ class MoveOperation extends Operation {
|
|
|
8209
8524
|
);
|
|
8210
8525
|
}
|
|
8211
8526
|
/**
|
|
8212
|
-
* `getEffectedCreatedAt` returns the creation time of the
|
|
8527
|
+
* `getEffectedCreatedAt` returns the creation time of the
|
|
8528
|
+
* effected element.
|
|
8213
8529
|
*/
|
|
8214
8530
|
getEffectedCreatedAt() {
|
|
8215
8531
|
return this.createdAt;
|
|
@@ -8221,7 +8537,8 @@ class MoveOperation extends Operation {
|
|
|
8221
8537
|
return `${this.getParentCreatedAt().toTestString()}.MOVE`;
|
|
8222
8538
|
}
|
|
8223
8539
|
/**
|
|
8224
|
-
* `getPrevCreatedAt` returns the creation time of previous
|
|
8540
|
+
* `getPrevCreatedAt` returns the creation time of previous
|
|
8541
|
+
* element.
|
|
8225
8542
|
*/
|
|
8226
8543
|
getPrevCreatedAt() {
|
|
8227
8544
|
return this.prevCreatedAt;
|
|
@@ -8233,7 +8550,8 @@ class MoveOperation extends Operation {
|
|
|
8233
8550
|
return this.createdAt;
|
|
8234
8551
|
}
|
|
8235
8552
|
/**
|
|
8236
|
-
* `setPrevCreatedAt` sets the creation time of the previous
|
|
8553
|
+
* `setPrevCreatedAt` sets the creation time of the previous
|
|
8554
|
+
* element.
|
|
8237
8555
|
*/
|
|
8238
8556
|
setPrevCreatedAt(createdAt) {
|
|
8239
8557
|
this.prevCreatedAt = createdAt;
|
|
@@ -11577,7 +11895,7 @@ class CRDTTreeNode extends IndexTreeNode {
|
|
|
11577
11895
|
CRDTTreeNodeID.of(issueTimeTicket(), 0),
|
|
11578
11896
|
this.type,
|
|
11579
11897
|
void 0,
|
|
11580
|
-
|
|
11898
|
+
this.attrs?.deepcopy(),
|
|
11581
11899
|
this.removedAt
|
|
11582
11900
|
);
|
|
11583
11901
|
}
|
|
@@ -11997,6 +12315,53 @@ class CRDTTree extends CRDTElement {
|
|
|
11997
12315
|
addDataSizes(diff, curr.getDataSize());
|
|
11998
12316
|
}
|
|
11999
12317
|
}
|
|
12318
|
+
if (tokenType === TokenType.Start && versionVector !== void 0) {
|
|
12319
|
+
let current = node;
|
|
12320
|
+
while (current.insNextID) {
|
|
12321
|
+
const next = this.findFloorNode(current.insNextID);
|
|
12322
|
+
if (!next || next.isText) {
|
|
12323
|
+
break;
|
|
12324
|
+
}
|
|
12325
|
+
if (ticketKnown(versionVector, next.id.getCreatedAt())) {
|
|
12326
|
+
break;
|
|
12327
|
+
}
|
|
12328
|
+
const siblingPairs = next.setAttrs(attributes, editedAt);
|
|
12329
|
+
const siblingAffectedAttrs = siblingPairs.reduce(
|
|
12330
|
+
(acc, [, curr]) => {
|
|
12331
|
+
if (curr) {
|
|
12332
|
+
acc[curr.getKey()] = attrs[curr.getKey()];
|
|
12333
|
+
}
|
|
12334
|
+
return acc;
|
|
12335
|
+
},
|
|
12336
|
+
{}
|
|
12337
|
+
);
|
|
12338
|
+
if (Object.keys(siblingAffectedAttrs).length > 0) {
|
|
12339
|
+
const parentOfNext = next.parent;
|
|
12340
|
+
const previousNext = next.prevSibling || parentOfNext;
|
|
12341
|
+
changes.push({
|
|
12342
|
+
type: "style",
|
|
12343
|
+
from: this.toIndex(parentOfNext, previousNext),
|
|
12344
|
+
to: this.toIndex(next, next),
|
|
12345
|
+
fromPath: this.toPath(parentOfNext, previousNext),
|
|
12346
|
+
toPath: this.toPath(next, next),
|
|
12347
|
+
actor: editedAt.getActorID(),
|
|
12348
|
+
value: siblingAffectedAttrs
|
|
12349
|
+
});
|
|
12350
|
+
}
|
|
12351
|
+
for (const [prev] of siblingPairs) {
|
|
12352
|
+
if (prev) {
|
|
12353
|
+
pairs.push({ parent: next, child: prev });
|
|
12354
|
+
}
|
|
12355
|
+
}
|
|
12356
|
+
for (const [key] of Object.entries(attrs)) {
|
|
12357
|
+
const curr = next.attrs?.getNodeMapByKey().get(key);
|
|
12358
|
+
if (curr !== void 0) {
|
|
12359
|
+
addDataSizes(diff, curr.getDataSize());
|
|
12360
|
+
}
|
|
12361
|
+
}
|
|
12362
|
+
current = next;
|
|
12363
|
+
}
|
|
12364
|
+
}
|
|
12000
12365
|
}
|
|
12001
12366
|
}
|
|
12002
12367
|
);
|
|
@@ -12063,6 +12428,43 @@ class CRDTTree extends CRDTElement {
|
|
|
12063
12428
|
toPath: this.toPath(node, node),
|
|
12064
12429
|
value: attributesToRemove
|
|
12065
12430
|
});
|
|
12431
|
+
if (tokenType === TokenType.Start && versionVector !== void 0) {
|
|
12432
|
+
let current = node;
|
|
12433
|
+
while (current.insNextID) {
|
|
12434
|
+
const next = this.findFloorNode(current.insNextID);
|
|
12435
|
+
if (!next || next.isText) {
|
|
12436
|
+
break;
|
|
12437
|
+
}
|
|
12438
|
+
if (ticketKnown(versionVector, next.id.getCreatedAt())) {
|
|
12439
|
+
break;
|
|
12440
|
+
}
|
|
12441
|
+
if (!next.attrs) {
|
|
12442
|
+
next.attrs = new RHT();
|
|
12443
|
+
}
|
|
12444
|
+
let removedAny = false;
|
|
12445
|
+
for (const value of attributesToRemove) {
|
|
12446
|
+
const nodesTobeRemoved = next.attrs.remove(value, editedAt);
|
|
12447
|
+
removedAny = removedAny || nodesTobeRemoved.length > 0;
|
|
12448
|
+
for (const rhtNode of nodesTobeRemoved) {
|
|
12449
|
+
pairs.push({ parent: next, child: rhtNode });
|
|
12450
|
+
}
|
|
12451
|
+
}
|
|
12452
|
+
if (removedAny) {
|
|
12453
|
+
const parentOfNext = next.parent;
|
|
12454
|
+
const previousNext = next.prevSibling || parentOfNext;
|
|
12455
|
+
changes.push({
|
|
12456
|
+
actor: editedAt.getActorID(),
|
|
12457
|
+
type: "removeStyle",
|
|
12458
|
+
from: this.toIndex(parentOfNext, previousNext),
|
|
12459
|
+
to: this.toIndex(next, next),
|
|
12460
|
+
fromPath: this.toPath(parentOfNext, previousNext),
|
|
12461
|
+
toPath: this.toPath(next, next),
|
|
12462
|
+
value: attributesToRemove
|
|
12463
|
+
});
|
|
12464
|
+
}
|
|
12465
|
+
current = next;
|
|
12466
|
+
}
|
|
12467
|
+
}
|
|
12066
12468
|
}
|
|
12067
12469
|
}
|
|
12068
12470
|
);
|
|
@@ -14821,14 +15223,26 @@ function toRHTNodes(rht) {
|
|
|
14821
15223
|
}
|
|
14822
15224
|
return pbRHTNodes;
|
|
14823
15225
|
}
|
|
14824
|
-
function toRGANodes(
|
|
15226
|
+
function toRGANodes(arr) {
|
|
14825
15227
|
const pbRGANodes = [];
|
|
14826
|
-
for (const
|
|
14827
|
-
|
|
14828
|
-
|
|
14829
|
-
|
|
14830
|
-
|
|
14831
|
-
|
|
15228
|
+
for (const rgaNode of arr.getAllRGANodes()) {
|
|
15229
|
+
if (!rgaNode.getElementEntry()) {
|
|
15230
|
+
pbRGANodes.push(
|
|
15231
|
+
create(RGANodeSchema, {
|
|
15232
|
+
positionCreatedAt: toTimeTicket(rgaNode.getPositionCreatedAt()),
|
|
15233
|
+
positionRemovedAt: toTimeTicket(rgaNode.getRemovedAt())
|
|
15234
|
+
})
|
|
15235
|
+
);
|
|
15236
|
+
continue;
|
|
15237
|
+
}
|
|
15238
|
+
const pbNode = create(RGANodeSchema, {
|
|
15239
|
+
element: toElement(rgaNode.getValue())
|
|
15240
|
+
});
|
|
15241
|
+
if (rgaNode.getPositionMovedAt()) {
|
|
15242
|
+
pbNode.positionMovedAt = toTimeTicket(rgaNode.getPositionMovedAt());
|
|
15243
|
+
pbNode.positionCreatedAt = toTimeTicket(rgaNode.getPositionCreatedAt());
|
|
15244
|
+
}
|
|
15245
|
+
pbRGANodes.push(pbNode);
|
|
14832
15246
|
}
|
|
14833
15247
|
return pbRGANodes;
|
|
14834
15248
|
}
|
|
@@ -14928,7 +15342,7 @@ function toArray(arr) {
|
|
|
14928
15342
|
body: {
|
|
14929
15343
|
case: "jsonArray",
|
|
14930
15344
|
value: create(JSONElement_JSONArraySchema, {
|
|
14931
|
-
nodes: toRGANodes(arr
|
|
15345
|
+
nodes: toRGANodes(arr),
|
|
14932
15346
|
createdAt: toTimeTicket(arr.getCreatedAt()),
|
|
14933
15347
|
movedAt: toTimeTicket(arr.getMovedAt()),
|
|
14934
15348
|
removedAt: toTimeTicket(arr.getRemovedAt())
|
|
@@ -15466,7 +15880,32 @@ function fromObject(pbObject) {
|
|
|
15466
15880
|
function fromArray(pbArray) {
|
|
15467
15881
|
const rgaTreeList = new RGATreeList();
|
|
15468
15882
|
for (const pbRGANode of pbArray.nodes) {
|
|
15469
|
-
|
|
15883
|
+
if (!pbRGANode.element) {
|
|
15884
|
+
if (!pbRGANode.positionCreatedAt || !pbRGANode.positionRemovedAt) {
|
|
15885
|
+
throw new YorkieError(
|
|
15886
|
+
Code.ErrInvalidArgument,
|
|
15887
|
+
"dead RGA position node missing position timestamps"
|
|
15888
|
+
);
|
|
15889
|
+
}
|
|
15890
|
+
const posCreatedAt = fromTimeTicket(pbRGANode.positionCreatedAt);
|
|
15891
|
+
const posRemovedAt = fromTimeTicket(pbRGANode.positionRemovedAt);
|
|
15892
|
+
rgaTreeList.addDeadPosition(posCreatedAt, posRemovedAt);
|
|
15893
|
+
continue;
|
|
15894
|
+
}
|
|
15895
|
+
const elem = fromElement(pbRGANode.element);
|
|
15896
|
+
const posMovedAt = fromTimeTicket(pbRGANode.positionMovedAt);
|
|
15897
|
+
if (posMovedAt) {
|
|
15898
|
+
if (!pbRGANode.positionCreatedAt) {
|
|
15899
|
+
throw new YorkieError(
|
|
15900
|
+
Code.ErrInvalidArgument,
|
|
15901
|
+
"moved RGA node missing position_created_at"
|
|
15902
|
+
);
|
|
15903
|
+
}
|
|
15904
|
+
const posCreatedAt = fromTimeTicket(pbRGANode.positionCreatedAt);
|
|
15905
|
+
rgaTreeList.addMovedElement(elem, posCreatedAt, posMovedAt);
|
|
15906
|
+
} else {
|
|
15907
|
+
rgaTreeList.insert(elem);
|
|
15908
|
+
}
|
|
15470
15909
|
}
|
|
15471
15910
|
const arr = new CRDTArray(fromTimeTicket(pbArray.createdAt), rgaTreeList);
|
|
15472
15911
|
arr.setMovedAt(fromTimeTicket(pbArray.movedAt));
|
|
@@ -16254,10 +16693,16 @@ class ArrayProxy {
|
|
|
16254
16693
|
};
|
|
16255
16694
|
} else if (method === "insertAfter") {
|
|
16256
16695
|
return (prevID, value) => {
|
|
16696
|
+
let posCreatedAt;
|
|
16697
|
+
try {
|
|
16698
|
+
posCreatedAt = target.posCreatedAt(prevID);
|
|
16699
|
+
} catch {
|
|
16700
|
+
posCreatedAt = prevID;
|
|
16701
|
+
}
|
|
16257
16702
|
const inserted = ArrayProxy.insertAfterInternal(
|
|
16258
16703
|
context,
|
|
16259
16704
|
target,
|
|
16260
|
-
|
|
16705
|
+
posCreatedAt,
|
|
16261
16706
|
value
|
|
16262
16707
|
);
|
|
16263
16708
|
return toWrappedElement(context, inserted);
|
|
@@ -16442,7 +16887,7 @@ class ArrayProxy {
|
|
|
16442
16887
|
static moveBeforeInternal(context, target, nextCreatedAt, createdAt) {
|
|
16443
16888
|
const ticket = context.issueTimeTicket();
|
|
16444
16889
|
const prevCreatedAt = target.getPrevCreatedAt(nextCreatedAt);
|
|
16445
|
-
target.moveAfter(prevCreatedAt, createdAt, ticket);
|
|
16890
|
+
const deadNode = target.moveAfter(prevCreatedAt, createdAt, ticket);
|
|
16446
16891
|
context.push(
|
|
16447
16892
|
MoveOperation.create(
|
|
16448
16893
|
target.getCreatedAt(),
|
|
@@ -16451,26 +16896,45 @@ class ArrayProxy {
|
|
|
16451
16896
|
ticket
|
|
16452
16897
|
)
|
|
16453
16898
|
);
|
|
16899
|
+
if (deadNode) {
|
|
16900
|
+
context.registerGCPair({
|
|
16901
|
+
parent: target.getRGATreeList(),
|
|
16902
|
+
child: deadNode
|
|
16903
|
+
});
|
|
16904
|
+
}
|
|
16454
16905
|
}
|
|
16455
16906
|
/**
|
|
16456
16907
|
* `moveAfterInternal` moves the given `createdAt` element
|
|
16457
|
-
* after the specific element.
|
|
16908
|
+
* after the specific element. Converts element identity to
|
|
16909
|
+
* position identity for the prevCreatedAt.
|
|
16458
16910
|
*/
|
|
16459
16911
|
static moveAfterInternal(context, target, prevCreatedAt, createdAt) {
|
|
16460
16912
|
const ticket = context.issueTimeTicket();
|
|
16913
|
+
let posCreatedAt;
|
|
16914
|
+
try {
|
|
16915
|
+
posCreatedAt = target.posCreatedAt(prevCreatedAt);
|
|
16916
|
+
} catch {
|
|
16917
|
+
posCreatedAt = prevCreatedAt;
|
|
16918
|
+
}
|
|
16919
|
+
const deadNode = target.moveAfter(posCreatedAt, createdAt, ticket);
|
|
16461
16920
|
context.push(
|
|
16462
16921
|
MoveOperation.create(
|
|
16463
16922
|
target.getCreatedAt(),
|
|
16464
|
-
|
|
16923
|
+
posCreatedAt,
|
|
16465
16924
|
createdAt,
|
|
16466
16925
|
ticket
|
|
16467
16926
|
)
|
|
16468
16927
|
);
|
|
16469
|
-
|
|
16928
|
+
if (deadNode) {
|
|
16929
|
+
context.registerGCPair({
|
|
16930
|
+
parent: target.getRGATreeList(),
|
|
16931
|
+
child: deadNode
|
|
16932
|
+
});
|
|
16933
|
+
}
|
|
16470
16934
|
}
|
|
16471
16935
|
/**
|
|
16472
|
-
* `moveAfterByIndexInternal` moves the given element to its new
|
|
16473
|
-
* after the given previous element.
|
|
16936
|
+
* `moveAfterByIndexInternal` moves the given element to its new
|
|
16937
|
+
* position after the given previous element.
|
|
16474
16938
|
*/
|
|
16475
16939
|
static moveAfterByIndexInternal(context, target, prevIndex, targetIndex) {
|
|
16476
16940
|
const prevElem = target.get(prevIndex);
|
|
@@ -16501,7 +16965,7 @@ class ArrayProxy {
|
|
|
16501
16965
|
static moveFrontInternal(context, target, createdAt) {
|
|
16502
16966
|
const ticket = context.issueTimeTicket();
|
|
16503
16967
|
const head = target.getHead();
|
|
16504
|
-
target.moveAfter(head.getCreatedAt(), createdAt, ticket);
|
|
16968
|
+
const deadNode = target.moveAfter(head.getCreatedAt(), createdAt, ticket);
|
|
16505
16969
|
context.push(
|
|
16506
16970
|
MoveOperation.create(
|
|
16507
16971
|
target.getCreatedAt(),
|
|
@@ -16510,6 +16974,12 @@ class ArrayProxy {
|
|
|
16510
16974
|
ticket
|
|
16511
16975
|
)
|
|
16512
16976
|
);
|
|
16977
|
+
if (deadNode) {
|
|
16978
|
+
context.registerGCPair({
|
|
16979
|
+
parent: target.getRGATreeList(),
|
|
16980
|
+
child: deadNode
|
|
16981
|
+
});
|
|
16982
|
+
}
|
|
16513
16983
|
}
|
|
16514
16984
|
/**
|
|
16515
16985
|
* `moveLastInternal` moves the given `createdAt` element
|
|
@@ -16518,13 +16988,20 @@ class ArrayProxy {
|
|
|
16518
16988
|
static moveLastInternal(context, target, createdAt) {
|
|
16519
16989
|
const ticket = context.issueTimeTicket();
|
|
16520
16990
|
const last = target.getLastCreatedAt();
|
|
16521
|
-
target.moveAfter(last, createdAt, ticket);
|
|
16991
|
+
const deadNode = target.moveAfter(last, createdAt, ticket);
|
|
16522
16992
|
context.push(
|
|
16523
16993
|
MoveOperation.create(target.getCreatedAt(), last, createdAt, ticket)
|
|
16524
16994
|
);
|
|
16995
|
+
if (deadNode) {
|
|
16996
|
+
context.registerGCPair({
|
|
16997
|
+
parent: target.getRGATreeList(),
|
|
16998
|
+
child: deadNode
|
|
16999
|
+
});
|
|
17000
|
+
}
|
|
16525
17001
|
}
|
|
16526
17002
|
/**
|
|
16527
|
-
* `insertAfterInternal` inserts the value after the previously
|
|
17003
|
+
* `insertAfterInternal` inserts the value after the previously
|
|
17004
|
+
* created element.
|
|
16528
17005
|
*/
|
|
16529
17006
|
static insertAfterInternal(context, target, prevCreatedAt, value) {
|
|
16530
17007
|
const createdAt = context.issueTimeTicket();
|
|
@@ -16552,12 +17029,13 @@ class ArrayProxy {
|
|
|
16552
17029
|
`index out of bounds: ${index}`
|
|
16553
17030
|
);
|
|
16554
17031
|
}
|
|
16555
|
-
|
|
16556
|
-
|
|
16557
|
-
target
|
|
16558
|
-
|
|
16559
|
-
|
|
16560
|
-
|
|
17032
|
+
let posCreatedAt;
|
|
17033
|
+
try {
|
|
17034
|
+
posCreatedAt = target.posCreatedAt(prevElem.getCreatedAt());
|
|
17035
|
+
} catch {
|
|
17036
|
+
posCreatedAt = prevElem.getCreatedAt();
|
|
17037
|
+
}
|
|
17038
|
+
ArrayProxy.insertAfterInternal(context, target, posCreatedAt, value);
|
|
16561
17039
|
return target;
|
|
16562
17040
|
}
|
|
16563
17041
|
/**
|
|
@@ -16656,7 +17134,17 @@ class ArrayProxy {
|
|
|
16656
17134
|
}
|
|
16657
17135
|
}
|
|
16658
17136
|
if (items) {
|
|
16659
|
-
let previousID
|
|
17137
|
+
let previousID;
|
|
17138
|
+
if (from === 0) {
|
|
17139
|
+
previousID = target.getHead().getID();
|
|
17140
|
+
} else {
|
|
17141
|
+
const elemID = target.get(from - 1).getID();
|
|
17142
|
+
try {
|
|
17143
|
+
previousID = target.posCreatedAt(elemID);
|
|
17144
|
+
} catch {
|
|
17145
|
+
previousID = elemID;
|
|
17146
|
+
}
|
|
17147
|
+
}
|
|
16660
17148
|
for (const item of items) {
|
|
16661
17149
|
const newElem = ArrayProxy.insertAfterInternal(
|
|
16662
17150
|
context,
|
|
@@ -18006,6 +18494,16 @@ class CRDTRoot {
|
|
|
18006
18494
|
this.registerGCPair(pair);
|
|
18007
18495
|
}
|
|
18008
18496
|
}
|
|
18497
|
+
if (elem instanceof CRDTArray) {
|
|
18498
|
+
for (const node of elem.getAllRGANodes()) {
|
|
18499
|
+
if (!node.getElementEntry() && node.getRemovedAt()) {
|
|
18500
|
+
this.registerGCPair({
|
|
18501
|
+
parent: elem.getRGATreeList(),
|
|
18502
|
+
child: node
|
|
18503
|
+
});
|
|
18504
|
+
}
|
|
18505
|
+
}
|
|
18506
|
+
}
|
|
18009
18507
|
return false;
|
|
18010
18508
|
});
|
|
18011
18509
|
}
|
|
@@ -19092,6 +19590,11 @@ class Document {
|
|
|
19092
19590
|
if (logger.isEnabled(LogLevel.Trivial)) {
|
|
19093
19591
|
logger.trivial(`trying to update a local change: ${this.toJSON()}`);
|
|
19094
19592
|
}
|
|
19593
|
+
const prev = {
|
|
19594
|
+
hadPresence: this.presences.has(actorID),
|
|
19595
|
+
wasOnline: this.status === "attached",
|
|
19596
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
19597
|
+
};
|
|
19095
19598
|
const change = ctx.toChange();
|
|
19096
19599
|
const { opInfos, reverseOps } = change.execute(
|
|
19097
19600
|
this.root,
|
|
@@ -19137,14 +19640,14 @@ class Document {
|
|
|
19137
19640
|
});
|
|
19138
19641
|
}
|
|
19139
19642
|
if (change.hasPresenceChange()) {
|
|
19140
|
-
|
|
19141
|
-
|
|
19142
|
-
|
|
19143
|
-
|
|
19144
|
-
|
|
19145
|
-
|
|
19146
|
-
|
|
19147
|
-
}
|
|
19643
|
+
const presenceEvent = this.reconcilePresence(
|
|
19644
|
+
actorID,
|
|
19645
|
+
prev,
|
|
19646
|
+
OpSource.Local
|
|
19647
|
+
);
|
|
19648
|
+
if (presenceEvent) {
|
|
19649
|
+
event.push(presenceEvent);
|
|
19650
|
+
}
|
|
19148
19651
|
}
|
|
19149
19652
|
this.publish(event);
|
|
19150
19653
|
if (logger.isEnabled(LogLevel.Trivial)) {
|
|
@@ -19628,41 +20131,11 @@ class Document {
|
|
|
19628
20131
|
change.execute(this.clone.root, this.clone.presences, source);
|
|
19629
20132
|
const events = [];
|
|
19630
20133
|
const actorID = change.getID().getActorID();
|
|
19631
|
-
|
|
19632
|
-
|
|
19633
|
-
|
|
19634
|
-
|
|
19635
|
-
|
|
19636
|
-
this.presences.has(actorID) ? {
|
|
19637
|
-
type: "presence-changed",
|
|
19638
|
-
source,
|
|
19639
|
-
value: {
|
|
19640
|
-
clientID: actorID,
|
|
19641
|
-
presence: presenceChange.presence
|
|
19642
|
-
}
|
|
19643
|
-
} : {
|
|
19644
|
-
type: "watched",
|
|
19645
|
-
source: OpSource.Remote,
|
|
19646
|
-
value: {
|
|
19647
|
-
clientID: actorID,
|
|
19648
|
-
presence: presenceChange.presence
|
|
19649
|
-
}
|
|
19650
|
-
}
|
|
19651
|
-
);
|
|
19652
|
-
break;
|
|
19653
|
-
case PresenceChangeType.Clear:
|
|
19654
|
-
events.push({
|
|
19655
|
-
type: "unwatched",
|
|
19656
|
-
source: OpSource.Remote,
|
|
19657
|
-
value: {
|
|
19658
|
-
clientID: actorID,
|
|
19659
|
-
presence: this.getPresence(actorID)
|
|
19660
|
-
}
|
|
19661
|
-
});
|
|
19662
|
-
this.removeOnlineClient(actorID);
|
|
19663
|
-
break;
|
|
19664
|
-
}
|
|
19665
|
-
}
|
|
20134
|
+
const prev = change.hasPresenceChange() ? {
|
|
20135
|
+
hadPresence: this.presences.has(actorID),
|
|
20136
|
+
wasOnline: this.onlineClients.has(actorID),
|
|
20137
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
20138
|
+
} : void 0;
|
|
19666
20139
|
const { opInfos, operations } = change.execute(
|
|
19667
20140
|
this.root,
|
|
19668
20141
|
this.presences,
|
|
@@ -19717,6 +20190,16 @@ class Document {
|
|
|
19717
20190
|
}
|
|
19718
20191
|
);
|
|
19719
20192
|
}
|
|
20193
|
+
if (prev && change.hasPresenceChange()) {
|
|
20194
|
+
const presenceChange = change.getPresenceChange();
|
|
20195
|
+
if (presenceChange.type === PresenceChangeType.Clear) {
|
|
20196
|
+
this.removeOnlineClient(actorID);
|
|
20197
|
+
}
|
|
20198
|
+
const presenceEvent = this.reconcilePresence(actorID, prev, source);
|
|
20199
|
+
if (presenceEvent) {
|
|
20200
|
+
events.push(presenceEvent);
|
|
20201
|
+
}
|
|
20202
|
+
}
|
|
19720
20203
|
if (events.length) {
|
|
19721
20204
|
this.publish(events);
|
|
19722
20205
|
}
|
|
@@ -19745,46 +20228,43 @@ class Document {
|
|
|
19745
20228
|
* `applyDocEvent` applies the given doc event into this document.
|
|
19746
20229
|
*/
|
|
19747
20230
|
applyDocEvent(type, publisher) {
|
|
19748
|
-
const
|
|
20231
|
+
const prev = {
|
|
20232
|
+
hadPresence: this.presences.has(publisher),
|
|
20233
|
+
wasOnline: this.onlineClients.has(publisher),
|
|
20234
|
+
presence: this.presences.has(publisher) ? deepcopy(this.presences.get(publisher)) : void 0
|
|
20235
|
+
};
|
|
19749
20236
|
if (type === DocEventType$1.DOCUMENT_WATCHED) {
|
|
19750
20237
|
if (this.onlineClients.has(publisher) && this.hasPresence(publisher)) {
|
|
19751
20238
|
return;
|
|
19752
20239
|
}
|
|
19753
20240
|
this.addOnlineClient(publisher);
|
|
19754
|
-
if (this.hasPresence(publisher)) {
|
|
19755
|
-
events.push({
|
|
19756
|
-
type: "watched",
|
|
19757
|
-
source: OpSource.Remote,
|
|
19758
|
-
value: {
|
|
19759
|
-
clientID: publisher,
|
|
19760
|
-
presence: this.getPresence(publisher)
|
|
19761
|
-
}
|
|
19762
|
-
});
|
|
19763
|
-
}
|
|
19764
20241
|
} else if (type === DocEventType$1.DOCUMENT_UNWATCHED) {
|
|
19765
|
-
const presence = this.getPresence(publisher);
|
|
19766
20242
|
this.removeOnlineClient(publisher);
|
|
19767
20243
|
this.presences.delete(publisher);
|
|
19768
|
-
if (presence) {
|
|
19769
|
-
events.push({
|
|
19770
|
-
type: "unwatched",
|
|
19771
|
-
source: OpSource.Remote,
|
|
19772
|
-
value: { clientID: publisher, presence }
|
|
19773
|
-
});
|
|
19774
|
-
}
|
|
19775
20244
|
}
|
|
19776
|
-
|
|
19777
|
-
|
|
20245
|
+
const event = this.reconcilePresence(publisher, prev, OpSource.Remote);
|
|
20246
|
+
if (event) {
|
|
20247
|
+
this.publish([event]);
|
|
19778
20248
|
}
|
|
19779
20249
|
}
|
|
19780
20250
|
/**
|
|
19781
20251
|
* `applyStatus` applies the document status into this document.
|
|
19782
20252
|
*/
|
|
19783
20253
|
applyStatus(status) {
|
|
20254
|
+
const actorID = this.changeID.getActorID();
|
|
20255
|
+
const prev = {
|
|
20256
|
+
hadPresence: this.presences.has(actorID),
|
|
20257
|
+
wasOnline: this.status === "attached",
|
|
20258
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
20259
|
+
};
|
|
19784
20260
|
this.status = status;
|
|
19785
20261
|
if (status === "detached") {
|
|
19786
20262
|
this.setActor(InitialActorID);
|
|
19787
20263
|
}
|
|
20264
|
+
const event = this.reconcilePresence(actorID, prev, OpSource.Local);
|
|
20265
|
+
if (event) {
|
|
20266
|
+
this.publish([event]);
|
|
20267
|
+
}
|
|
19788
20268
|
this.publish([
|
|
19789
20269
|
{
|
|
19790
20270
|
source: status === "removed" ? OpSource.Remote : OpSource.Local,
|
|
@@ -19884,6 +20364,57 @@ class Document {
|
|
|
19884
20364
|
removeOnlineClient(clientID) {
|
|
19885
20365
|
this.onlineClients.delete(clientID);
|
|
19886
20366
|
}
|
|
20367
|
+
/**
|
|
20368
|
+
* `reconcilePresence` compares the previous and current state of a client's
|
|
20369
|
+
* presence/online status and returns the appropriate event to emit.
|
|
20370
|
+
*
|
|
20371
|
+
* For remote clients, "online" means the client is in onlineClients.
|
|
20372
|
+
* For self, "online" means the document status is Attached.
|
|
20373
|
+
*
|
|
20374
|
+
* State transition table:
|
|
20375
|
+
* (!hadP || !wasOn) → (hasP && isOn) : watched (remote) or presence-changed (self)
|
|
20376
|
+
* (hadP && wasOn) → (hasP && isOn) : presence-changed
|
|
20377
|
+
* (hadP && wasOn) → (!hasP || !isOn): unwatched (remote only)
|
|
20378
|
+
* otherwise : no event (waiting)
|
|
20379
|
+
*/
|
|
20380
|
+
reconcilePresence(actorID, prev, source) {
|
|
20381
|
+
const isSelf = actorID === this.changeID.getActorID();
|
|
20382
|
+
const hasPresence = this.presences.has(actorID);
|
|
20383
|
+
const isOnline = isSelf ? this.status === "attached" : this.onlineClients.has(actorID);
|
|
20384
|
+
if (!hasPresence || !isOnline) {
|
|
20385
|
+
if (prev.hadPresence && prev.wasOnline && !isSelf) {
|
|
20386
|
+
return {
|
|
20387
|
+
type: "unwatched",
|
|
20388
|
+
source: OpSource.Remote,
|
|
20389
|
+
value: {
|
|
20390
|
+
clientID: actorID,
|
|
20391
|
+
presence: prev.presence
|
|
20392
|
+
}
|
|
20393
|
+
};
|
|
20394
|
+
}
|
|
20395
|
+
return void 0;
|
|
20396
|
+
}
|
|
20397
|
+
const presence = deepcopy(this.presences.get(actorID));
|
|
20398
|
+
if (!prev.hadPresence || !prev.wasOnline) {
|
|
20399
|
+
if (isSelf) {
|
|
20400
|
+
return {
|
|
20401
|
+
type: "presence-changed",
|
|
20402
|
+
source,
|
|
20403
|
+
value: { clientID: actorID, presence }
|
|
20404
|
+
};
|
|
20405
|
+
}
|
|
20406
|
+
return {
|
|
20407
|
+
type: "watched",
|
|
20408
|
+
source: OpSource.Remote,
|
|
20409
|
+
value: { clientID: actorID, presence }
|
|
20410
|
+
};
|
|
20411
|
+
}
|
|
20412
|
+
return {
|
|
20413
|
+
type: "presence-changed",
|
|
20414
|
+
source,
|
|
20415
|
+
value: { clientID: actorID, presence }
|
|
20416
|
+
};
|
|
20417
|
+
}
|
|
19887
20418
|
/**
|
|
19888
20419
|
* `hasPresence` returns whether the given clientID has a presence or not.
|
|
19889
20420
|
*/
|
|
@@ -20045,18 +20576,24 @@ class Document {
|
|
|
20045
20576
|
const ticket = ctx.issueTimeTicket();
|
|
20046
20577
|
op.setExecutedAt(ticket);
|
|
20047
20578
|
if (op instanceof ArraySetOperation) {
|
|
20048
|
-
const
|
|
20579
|
+
const prev2 = op.getCreatedAt();
|
|
20049
20580
|
op.getValue().setCreatedAt(ticket);
|
|
20050
|
-
this.internalHistory.reconcileCreatedAt(
|
|
20581
|
+
this.internalHistory.reconcileCreatedAt(prev2, ticket);
|
|
20051
20582
|
} else if (op instanceof AddOperation) {
|
|
20052
|
-
const
|
|
20583
|
+
const prev2 = op.getValue().getCreatedAt();
|
|
20053
20584
|
op.getValue().setCreatedAt(ticket);
|
|
20054
|
-
this.internalHistory.reconcileCreatedAt(
|
|
20585
|
+
this.internalHistory.reconcileCreatedAt(prev2, ticket);
|
|
20055
20586
|
}
|
|
20056
20587
|
ctx.push(op);
|
|
20057
20588
|
}
|
|
20058
20589
|
const change = ctx.toChange();
|
|
20059
20590
|
change.execute(this.clone.root, this.clone.presences, OpSource.UndoRedo);
|
|
20591
|
+
const actorID = this.changeID.getActorID();
|
|
20592
|
+
const prev = {
|
|
20593
|
+
hadPresence: this.presences.has(actorID),
|
|
20594
|
+
wasOnline: this.status === "attached",
|
|
20595
|
+
presence: this.presences.has(actorID) ? deepcopy(this.presences.get(actorID)) : void 0
|
|
20596
|
+
};
|
|
20060
20597
|
const { opInfos, reverseOps } = change.execute(
|
|
20061
20598
|
this.root,
|
|
20062
20599
|
this.presences,
|
|
@@ -20078,7 +20615,6 @@ class Document {
|
|
|
20078
20615
|
}
|
|
20079
20616
|
this.localChanges.push(change);
|
|
20080
20617
|
this.changeID = ctx.getNextID();
|
|
20081
|
-
const actorID = this.changeID.getActorID();
|
|
20082
20618
|
const events = [];
|
|
20083
20619
|
if (opInfos.length) {
|
|
20084
20620
|
events.push({
|
|
@@ -20095,14 +20631,14 @@ class Document {
|
|
|
20095
20631
|
});
|
|
20096
20632
|
}
|
|
20097
20633
|
if (change.hasPresenceChange()) {
|
|
20098
|
-
|
|
20099
|
-
|
|
20100
|
-
|
|
20101
|
-
|
|
20102
|
-
|
|
20103
|
-
|
|
20104
|
-
|
|
20105
|
-
}
|
|
20634
|
+
const presenceEvent = this.reconcilePresence(
|
|
20635
|
+
actorID,
|
|
20636
|
+
prev,
|
|
20637
|
+
OpSource.UndoRedo
|
|
20638
|
+
);
|
|
20639
|
+
if (presenceEvent) {
|
|
20640
|
+
events.push(presenceEvent);
|
|
20641
|
+
}
|
|
20106
20642
|
}
|
|
20107
20643
|
this.publish(events);
|
|
20108
20644
|
}
|
|
@@ -20118,6 +20654,8 @@ class Attachment {
|
|
|
20118
20654
|
watchStream;
|
|
20119
20655
|
watchLoopTimerID;
|
|
20120
20656
|
watchAbortController;
|
|
20657
|
+
syncPromise;
|
|
20658
|
+
_detaching = false;
|
|
20121
20659
|
constructor(reconnectStreamDelay, resource, resourceID, syncMode) {
|
|
20122
20660
|
this.reconnectStreamDelay = reconnectStreamDelay;
|
|
20123
20661
|
this.resource = resource;
|
|
@@ -20193,6 +20731,49 @@ class Attachment {
|
|
|
20193
20731
|
};
|
|
20194
20732
|
await doLoop();
|
|
20195
20733
|
}
|
|
20734
|
+
/**
|
|
20735
|
+
* `markDetaching` marks this attachment as being in the process of detaching.
|
|
20736
|
+
* Once marked, the sync loop will skip this attachment.
|
|
20737
|
+
*/
|
|
20738
|
+
markDetaching() {
|
|
20739
|
+
this._detaching = true;
|
|
20740
|
+
}
|
|
20741
|
+
/**
|
|
20742
|
+
* `isDetaching` returns whether this attachment is being detached.
|
|
20743
|
+
*/
|
|
20744
|
+
isDetaching() {
|
|
20745
|
+
return this._detaching;
|
|
20746
|
+
}
|
|
20747
|
+
/**
|
|
20748
|
+
* `resetDetaching` resets the detaching flag so the attachment can resume
|
|
20749
|
+
* syncing. Used when a detach RPC fails and the document remains attached.
|
|
20750
|
+
*/
|
|
20751
|
+
resetDetaching() {
|
|
20752
|
+
this._detaching = false;
|
|
20753
|
+
}
|
|
20754
|
+
/**
|
|
20755
|
+
* `setSyncPromise` sets the in-progress sync promise for this attachment.
|
|
20756
|
+
*/
|
|
20757
|
+
setSyncPromise(promise) {
|
|
20758
|
+
this.syncPromise = promise;
|
|
20759
|
+
}
|
|
20760
|
+
/**
|
|
20761
|
+
* `clearSyncPromise` clears the in-progress sync promise.
|
|
20762
|
+
*/
|
|
20763
|
+
clearSyncPromise() {
|
|
20764
|
+
this.syncPromise = void 0;
|
|
20765
|
+
}
|
|
20766
|
+
/**
|
|
20767
|
+
* `waitForSyncComplete` waits for any in-progress sync to complete.
|
|
20768
|
+
*/
|
|
20769
|
+
async waitForSyncComplete() {
|
|
20770
|
+
if (this.syncPromise) {
|
|
20771
|
+
try {
|
|
20772
|
+
await this.syncPromise;
|
|
20773
|
+
} catch {
|
|
20774
|
+
}
|
|
20775
|
+
}
|
|
20776
|
+
}
|
|
20196
20777
|
/**
|
|
20197
20778
|
* `cancelWatchStream` cancels the watch stream.
|
|
20198
20779
|
*/
|
|
@@ -20227,7 +20808,7 @@ function createAuthInterceptor(apiKey, token) {
|
|
|
20227
20808
|
};
|
|
20228
20809
|
}
|
|
20229
20810
|
const name$1 = "@yorkie-js/sdk";
|
|
20230
|
-
const version$1 = "0.7.
|
|
20811
|
+
const version$1 = "0.7.6";
|
|
20231
20812
|
const pkg$1 = {
|
|
20232
20813
|
name: name$1,
|
|
20233
20814
|
version: version$1
|
|
@@ -20542,6 +21123,7 @@ class Client {
|
|
|
20542
21123
|
taskQueue;
|
|
20543
21124
|
processing = false;
|
|
20544
21125
|
keepalive = false;
|
|
21126
|
+
deactivating = false;
|
|
20545
21127
|
/**
|
|
20546
21128
|
* @param rpcAddr - the address of the RPC server.
|
|
20547
21129
|
* @param opts - the options of the client.
|
|
@@ -20611,6 +21193,7 @@ class Client {
|
|
|
20611
21193
|
);
|
|
20612
21194
|
this.id = res.clientId;
|
|
20613
21195
|
this.status = "activated";
|
|
21196
|
+
this.deactivating = false;
|
|
20614
21197
|
this.runSyncLoop();
|
|
20615
21198
|
logger.info(`[AC] c:"${this.getKey()}" activated, id:"${this.id}"`);
|
|
20616
21199
|
if (typeof window !== "undefined") {
|
|
@@ -20639,6 +21222,7 @@ class Client {
|
|
|
20639
21222
|
if (this.status === "deactivated") {
|
|
20640
21223
|
return Promise.resolve();
|
|
20641
21224
|
}
|
|
21225
|
+
this.deactivating = true;
|
|
20642
21226
|
const task = async () => {
|
|
20643
21227
|
try {
|
|
20644
21228
|
await this.rpcClient.deactivateClient(
|
|
@@ -20652,6 +21236,7 @@ class Client {
|
|
|
20652
21236
|
logger.info(`[DC] c"${this.getKey()}" deactivated`);
|
|
20653
21237
|
} catch (err) {
|
|
20654
21238
|
logger.error(`[DC] c:"${this.getKey()}" err :`, err);
|
|
21239
|
+
this.deactivating = false;
|
|
20655
21240
|
await this.handleConnectError(err);
|
|
20656
21241
|
throw err;
|
|
20657
21242
|
}
|
|
@@ -20792,8 +21377,10 @@ class Client {
|
|
|
20792
21377
|
);
|
|
20793
21378
|
}
|
|
20794
21379
|
doc.update((_, p) => p.clear());
|
|
21380
|
+
attachment.markDetaching();
|
|
20795
21381
|
const task = async () => {
|
|
20796
21382
|
try {
|
|
21383
|
+
await attachment.waitForSyncComplete();
|
|
20797
21384
|
const res = await this.rpcClient.detachDocument(
|
|
20798
21385
|
{
|
|
20799
21386
|
clientId: this.id,
|
|
@@ -20812,6 +21399,7 @@ class Client {
|
|
|
20812
21399
|
return doc;
|
|
20813
21400
|
} catch (err) {
|
|
20814
21401
|
logger.error(`[DD] c:"${this.getKey()}" err :`, err);
|
|
21402
|
+
attachment.resetDetaching();
|
|
20815
21403
|
await this.handleConnectError(err);
|
|
20816
21404
|
throw err;
|
|
20817
21405
|
}
|
|
@@ -21378,7 +21966,7 @@ class Client {
|
|
|
21378
21966
|
*/
|
|
21379
21967
|
runSyncLoop() {
|
|
21380
21968
|
const doLoop = async () => {
|
|
21381
|
-
if (!this.isActive()) {
|
|
21969
|
+
if (!this.isActive() || this.deactivating) {
|
|
21382
21970
|
logger.debug(`[SL] c:"${this.getKey()}" exit sync loop`);
|
|
21383
21971
|
this.conditions[
|
|
21384
21972
|
"SyncLoop"
|
|
@@ -21390,43 +21978,62 @@ class Client {
|
|
|
21390
21978
|
await this.enqueueTask(async () => {
|
|
21391
21979
|
const syncs = [];
|
|
21392
21980
|
for (const [, attachment] of this.attachmentMap) {
|
|
21981
|
+
if (this.deactivating) {
|
|
21982
|
+
break;
|
|
21983
|
+
}
|
|
21393
21984
|
if (!attachment.needSync(this.channelHeartbeatInterval)) {
|
|
21394
21985
|
continue;
|
|
21395
21986
|
}
|
|
21987
|
+
if (attachment.isDetaching()) {
|
|
21988
|
+
continue;
|
|
21989
|
+
}
|
|
21396
21990
|
if (attachment.changeEventReceived !== void 0) {
|
|
21397
21991
|
attachment.changeEventReceived = false;
|
|
21398
21992
|
}
|
|
21399
|
-
|
|
21400
|
-
|
|
21401
|
-
|
|
21402
|
-
|
|
21403
|
-
|
|
21404
|
-
|
|
21405
|
-
|
|
21406
|
-
|
|
21407
|
-
|
|
21408
|
-
|
|
21993
|
+
const syncPromise = this.syncInternal(
|
|
21994
|
+
attachment,
|
|
21995
|
+
attachment.syncMode
|
|
21996
|
+
).then(() => {
|
|
21997
|
+
}).catch((e) => {
|
|
21998
|
+
if (isErrorCode(e, Code.ErrUnauthenticated)) {
|
|
21999
|
+
attachment.resource.publish([
|
|
22000
|
+
{
|
|
22001
|
+
type: DocEventType.AuthError,
|
|
22002
|
+
value: {
|
|
22003
|
+
reason: errorMetadataOf(e).reason,
|
|
22004
|
+
method: "PushPull"
|
|
21409
22005
|
}
|
|
21410
|
-
|
|
21411
|
-
|
|
21412
|
-
|
|
21413
|
-
|
|
21414
|
-
|
|
21415
|
-
|
|
21416
|
-
|
|
21417
|
-
|
|
21418
|
-
|
|
22006
|
+
}
|
|
22007
|
+
]);
|
|
22008
|
+
}
|
|
22009
|
+
if (isErrorCode(e, Code.ErrEpochMismatch)) {
|
|
22010
|
+
attachment.resource.publish([
|
|
22011
|
+
{
|
|
22012
|
+
type: DocEventType.EpochMismatch,
|
|
22013
|
+
value: {
|
|
22014
|
+
method: "PushPull"
|
|
21419
22015
|
}
|
|
21420
|
-
|
|
21421
|
-
|
|
21422
|
-
|
|
21423
|
-
|
|
21424
|
-
)
|
|
22016
|
+
}
|
|
22017
|
+
]);
|
|
22018
|
+
}
|
|
22019
|
+
throw e;
|
|
22020
|
+
}).finally(() => {
|
|
22021
|
+
attachment.clearSyncPromise();
|
|
22022
|
+
});
|
|
22023
|
+
attachment.setSyncPromise(syncPromise);
|
|
22024
|
+
syncs.push(syncPromise);
|
|
21425
22025
|
}
|
|
21426
22026
|
await Promise.all(syncs);
|
|
21427
22027
|
setTimeout(doLoop, this.syncLoopDuration);
|
|
21428
22028
|
});
|
|
21429
22029
|
} catch (err) {
|
|
22030
|
+
if (this.deactivating) {
|
|
22031
|
+
this.conditions[
|
|
22032
|
+
"SyncLoop"
|
|
22033
|
+
/* SyncLoop */
|
|
22034
|
+
] = false;
|
|
22035
|
+
return;
|
|
22036
|
+
}
|
|
21430
22037
|
logger.error(`[SL] c:"${this.getKey()}" sync failed:`, err);
|
|
21431
22038
|
if (await this.handleConnectError(err)) {
|
|
21432
22039
|
setTimeout(doLoop, this.retrySyncLoopDelay);
|
|
@@ -22098,7 +22705,7 @@ if (typeof globalThis !== "undefined") {
|
|
|
22098
22705
|
};
|
|
22099
22706
|
}
|
|
22100
22707
|
const name = "@yorkie-js/react";
|
|
22101
|
-
const version = "0.7.
|
|
22708
|
+
const version = "0.7.6";
|
|
22102
22709
|
const pkg = {
|
|
22103
22710
|
name,
|
|
22104
22711
|
version
|