| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 "use strict"; 2 var wp; 3 (wp ||= {}).sync = (() => { 4 var __create = Object.create; 5 var __defProp = Object.defineProperty; 6 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 7 var __getOwnPropNames = Object.getOwnPropertyNames; 8 var __getProtoOf = Object.getPrototypeOf; 9 var __hasOwnProp = Object.prototype.hasOwnProperty; 10 var __commonJS = (cb, mod) => function __require() { 11 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 12 }; 13 var __export = (target, all2) => { 14 for (var name in all2) 15 __defProp(target, name, { get: all2[name], enumerable: true }); 16 }; 17 var __copyProps = (to, from2, except, desc) => { 18 if (from2 && typeof from2 === "object" || typeof from2 === "function") { 19 for (let key of __getOwnPropNames(from2)) 20 if (!__hasOwnProp.call(to, key) && key !== except) 21 __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); 22 } 23 return to; 24 }; 25 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 26 // If the importer is in node compatibility mode or this is not an ESM 27 // file that has been converted to a CommonJS file using a Babel- 28 // compatible transform (i.e. "__esModule" has not been set), then set 29 // "default" to the CommonJS "module.exports" for node compatibility. 30 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 31 mod 32 )); 33 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); 34 35 // package-external:@wordpress/private-apis 36 var require_private_apis = __commonJS({ 37 "package-external:@wordpress/private-apis"(exports, module) { 38 module.exports = window.wp.privateApis; 39 } 40 }); 41 42 // package-external:@wordpress/hooks 43 var require_hooks = __commonJS({ 44 "package-external:@wordpress/hooks"(exports, module) { 45 module.exports = window.wp.hooks; 46 } 47 }); 48 49 // package-external:@wordpress/api-fetch 50 var require_api_fetch = __commonJS({ 51 "package-external:@wordpress/api-fetch"(exports, module) { 52 module.exports = window.wp.apiFetch; 53 } 54 }); 55 56 // node_modules/fast-deep-equal/es6/index.js 57 var require_es6 = __commonJS({ 58 "node_modules/fast-deep-equal/es6/index.js"(exports, module) { 59 "use strict"; 60 module.exports = function equal(a, b) { 61 if (a === b) return true; 62 if (a && b && typeof a == "object" && typeof b == "object") { 63 if (a.constructor !== b.constructor) return false; 64 var length3, i, keys2; 65 if (Array.isArray(a)) { 66 length3 = a.length; 67 if (length3 != b.length) return false; 68 for (i = length3; i-- !== 0; ) 69 if (!equal(a[i], b[i])) return false; 70 return true; 71 } 72 if (a instanceof Map && b instanceof Map) { 73 if (a.size !== b.size) return false; 74 for (i of a.entries()) 75 if (!b.has(i[0])) return false; 76 for (i of a.entries()) 77 if (!equal(i[1], b.get(i[0]))) return false; 78 return true; 79 } 80 if (a instanceof Set && b instanceof Set) { 81 if (a.size !== b.size) return false; 82 for (i of a.entries()) 83 if (!b.has(i[0])) return false; 84 return true; 85 } 86 if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { 87 length3 = a.length; 88 if (length3 != b.length) return false; 89 for (i = length3; i-- !== 0; ) 90 if (a[i] !== b[i]) return false; 91 return true; 92 } 93 if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; 94 if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); 95 if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); 96 keys2 = Object.keys(a); 97 length3 = keys2.length; 98 if (length3 !== Object.keys(b).length) return false; 99 for (i = length3; i-- !== 0; ) 100 if (!Object.prototype.hasOwnProperty.call(b, keys2[i])) return false; 101 for (i = length3; i-- !== 0; ) { 102 var key = keys2[i]; 103 if (!equal(a[key], b[key])) return false; 104 } 105 return true; 106 } 107 return a !== a && b !== b; 108 }; 109 } 110 }); 111 112 // packages/sync/build-module/index.mjs 113 var index_exports = {}; 114 __export(index_exports, { 115 Awareness: () => Awareness, 116 Y: () => yjs_exports, 117 YJS_VERSION: () => YJS_VERSION, 118 privateApis: () => privateApis 119 }); 120 121 // node_modules/yjs/dist/yjs.mjs 122 var yjs_exports = {}; 123 __export(yjs_exports, { 124 AbsolutePosition: () => AbsolutePosition, 125 AbstractConnector: () => AbstractConnector, 126 AbstractStruct: () => AbstractStruct, 127 AbstractType: () => AbstractType, 128 Array: () => YArray, 129 ContentAny: () => ContentAny, 130 ContentBinary: () => ContentBinary, 131 ContentDeleted: () => ContentDeleted, 132 ContentDoc: () => ContentDoc, 133 ContentEmbed: () => ContentEmbed, 134 ContentFormat: () => ContentFormat, 135 ContentJSON: () => ContentJSON, 136 ContentString: () => ContentString, 137 ContentType: () => ContentType, 138 Doc: () => Doc, 139 GC: () => GC, 140 ID: () => ID, 141 Item: () => Item, 142 Map: () => YMap, 143 PermanentUserData: () => PermanentUserData, 144 RelativePosition: () => RelativePosition, 145 Skip: () => Skip, 146 Snapshot: () => Snapshot, 147 Text: () => YText, 148 Transaction: () => Transaction, 149 UndoManager: () => UndoManager, 150 UpdateDecoderV1: () => UpdateDecoderV1, 151 UpdateDecoderV2: () => UpdateDecoderV2, 152 UpdateEncoderV1: () => UpdateEncoderV1, 153 UpdateEncoderV2: () => UpdateEncoderV2, 154 XmlElement: () => YXmlElement, 155 XmlFragment: () => YXmlFragment, 156 XmlHook: () => YXmlHook, 157 XmlText: () => YXmlText, 158 YArrayEvent: () => YArrayEvent, 159 YEvent: () => YEvent, 160 YMapEvent: () => YMapEvent, 161 YTextEvent: () => YTextEvent, 162 YXmlEvent: () => YXmlEvent, 163 applyUpdate: () => applyUpdate, 164 applyUpdateV2: () => applyUpdateV2, 165 cleanupYTextFormatting: () => cleanupYTextFormatting, 166 compareIDs: () => compareIDs, 167 compareRelativePositions: () => compareRelativePositions, 168 convertUpdateFormatV1ToV2: () => convertUpdateFormatV1ToV2, 169 convertUpdateFormatV2ToV1: () => convertUpdateFormatV2ToV1, 170 createAbsolutePositionFromRelativePosition: () => createAbsolutePositionFromRelativePosition, 171 createDeleteSet: () => createDeleteSet, 172 createDeleteSetFromStructStore: () => createDeleteSetFromStructStore, 173 createDocFromSnapshot: () => createDocFromSnapshot, 174 createID: () => createID, 175 createRelativePositionFromJSON: () => createRelativePositionFromJSON, 176 createRelativePositionFromTypeIndex: () => createRelativePositionFromTypeIndex, 177 createSnapshot: () => createSnapshot, 178 decodeRelativePosition: () => decodeRelativePosition, 179 decodeSnapshot: () => decodeSnapshot, 180 decodeSnapshotV2: () => decodeSnapshotV2, 181 decodeStateVector: () => decodeStateVector, 182 decodeUpdate: () => decodeUpdate, 183 decodeUpdateV2: () => decodeUpdateV2, 184 diffUpdate: () => diffUpdate, 185 diffUpdateV2: () => diffUpdateV2, 186 emptySnapshot: () => emptySnapshot, 187 encodeRelativePosition: () => encodeRelativePosition, 188 encodeSnapshot: () => encodeSnapshot, 189 encodeSnapshotV2: () => encodeSnapshotV2, 190 encodeStateAsUpdate: () => encodeStateAsUpdate, 191 encodeStateAsUpdateV2: () => encodeStateAsUpdateV2, 192 encodeStateVector: () => encodeStateVector, 193 encodeStateVectorFromUpdate: () => encodeStateVectorFromUpdate, 194 encodeStateVectorFromUpdateV2: () => encodeStateVectorFromUpdateV2, 195 equalDeleteSets: () => equalDeleteSets, 196 equalSnapshots: () => equalSnapshots, 197 findIndexSS: () => findIndexSS, 198 findRootTypeKey: () => findRootTypeKey, 199 getItem: () => getItem, 200 getItemCleanEnd: () => getItemCleanEnd, 201 getItemCleanStart: () => getItemCleanStart, 202 getState: () => getState, 203 getTypeChildren: () => getTypeChildren, 204 isDeleted: () => isDeleted, 205 isParentOf: () => isParentOf, 206 iterateDeletedStructs: () => iterateDeletedStructs, 207 logType: () => logType, 208 logUpdate: () => logUpdate, 209 logUpdateV2: () => logUpdateV2, 210 mergeDeleteSets: () => mergeDeleteSets, 211 mergeUpdates: () => mergeUpdates, 212 mergeUpdatesV2: () => mergeUpdatesV2, 213 obfuscateUpdate: () => obfuscateUpdate, 214 obfuscateUpdateV2: () => obfuscateUpdateV2, 215 parseUpdateMeta: () => parseUpdateMeta, 216 parseUpdateMetaV2: () => parseUpdateMetaV2, 217 readUpdate: () => readUpdate, 218 readUpdateV2: () => readUpdateV2, 219 relativePositionToJSON: () => relativePositionToJSON, 220 snapshot: () => snapshot, 221 snapshotContainsUpdate: () => snapshotContainsUpdate, 222 transact: () => transact, 223 tryGc: () => tryGc, 224 typeListToArraySnapshot: () => typeListToArraySnapshot, 225 typeMapGetAllSnapshot: () => typeMapGetAllSnapshot, 226 typeMapGetSnapshot: () => typeMapGetSnapshot 227 }); 228 229 // node_modules/lib0/map.js 230 var create = () => /* @__PURE__ */ new Map(); 231 var copy = (m) => { 232 const r = create(); 233 m.forEach((v, k) => { 234 r.set(k, v); 235 }); 236 return r; 237 }; 238 var setIfUndefined = (map2, key, createT) => { 239 let set = map2.get(key); 240 if (set === void 0) { 241 map2.set(key, set = createT()); 242 } 243 return set; 244 }; 245 var map = (m, f) => { 246 const res = []; 247 for (const [key, value] of m) { 248 res.push(f(value, key)); 249 } 250 return res; 251 }; 252 var any = (m, f) => { 253 for (const [key, value] of m) { 254 if (f(value, key)) { 255 return true; 256 } 257 } 258 return false; 259 }; 260 261 // node_modules/lib0/set.js 262 var create2 = () => /* @__PURE__ */ new Set(); 263 264 // node_modules/lib0/array.js 265 var last = (arr) => arr[arr.length - 1]; 266 var appendTo = (dest, src) => { 267 for (let i = 0; i < src.length; i++) { 268 dest.push(src[i]); 269 } 270 }; 271 var from = Array.from; 272 var some = (arr, f) => { 273 for (let i = 0; i < arr.length; i++) { 274 if (f(arr[i], i, arr)) { 275 return true; 276 } 277 } 278 return false; 279 }; 280 var unfold = (len, f) => { 281 const array = new Array(len); 282 for (let i = 0; i < len; i++) { 283 array[i] = f(i, array); 284 } 285 return array; 286 }; 287 var isArray = Array.isArray; 288 289 // node_modules/lib0/observable.js 290 var ObservableV2 = class { 291 constructor() { 292 this._observers = create(); 293 } 294 /** 295 * @template {keyof EVENTS & string} NAME 296 * @param {NAME} name 297 * @param {EVENTS[NAME]} f 298 */ 299 on(name, f) { 300 setIfUndefined( 301 this._observers, 302 /** @type {string} */ 303 name, 304 create2 305 ).add(f); 306 return f; 307 } 308 /** 309 * @template {keyof EVENTS & string} NAME 310 * @param {NAME} name 311 * @param {EVENTS[NAME]} f 312 */ 313 once(name, f) { 314 const _f = (...args2) => { 315 this.off( 316 name, 317 /** @type {any} */ 318 _f 319 ); 320 f(...args2); 321 }; 322 this.on( 323 name, 324 /** @type {any} */ 325 _f 326 ); 327 } 328 /** 329 * @template {keyof EVENTS & string} NAME 330 * @param {NAME} name 331 * @param {EVENTS[NAME]} f 332 */ 333 off(name, f) { 334 const observers = this._observers.get(name); 335 if (observers !== void 0) { 336 observers.delete(f); 337 if (observers.size === 0) { 338 this._observers.delete(name); 339 } 340 } 341 } 342 /** 343 * Emit a named event. All registered event listeners that listen to the 344 * specified name will receive the event. 345 * 346 * @todo This should catch exceptions 347 * 348 * @template {keyof EVENTS & string} NAME 349 * @param {NAME} name The event name. 350 * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener. 351 */ 352 emit(name, args2) { 353 return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args2)); 354 } 355 destroy() { 356 this._observers = create(); 357 } 358 }; 359 var Observable = class { 360 constructor() { 361 this._observers = create(); 362 } 363 /** 364 * @param {N} name 365 * @param {function} f 366 */ 367 on(name, f) { 368 setIfUndefined(this._observers, name, create2).add(f); 369 } 370 /** 371 * @param {N} name 372 * @param {function} f 373 */ 374 once(name, f) { 375 const _f = (...args2) => { 376 this.off(name, _f); 377 f(...args2); 378 }; 379 this.on(name, _f); 380 } 381 /** 382 * @param {N} name 383 * @param {function} f 384 */ 385 off(name, f) { 386 const observers = this._observers.get(name); 387 if (observers !== void 0) { 388 observers.delete(f); 389 if (observers.size === 0) { 390 this._observers.delete(name); 391 } 392 } 393 } 394 /** 395 * Emit a named event. All registered event listeners that listen to the 396 * specified name will receive the event. 397 * 398 * @todo This should catch exceptions 399 * 400 * @param {N} name The event name. 401 * @param {Array<any>} args The arguments that are applied to the event listener. 402 */ 403 emit(name, args2) { 404 return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args2)); 405 } 406 destroy() { 407 this._observers = create(); 408 } 409 }; 410 411 // node_modules/lib0/math.js 412 var floor = Math.floor; 413 var abs = Math.abs; 414 var min = (a, b) => a < b ? a : b; 415 var max = (a, b) => a > b ? a : b; 416 var isNaN2 = Number.isNaN; 417 var isNegativeZero = (n) => n !== 0 ? n < 0 : 1 / n < 0; 418 419 // node_modules/lib0/binary.js 420 var BIT1 = 1; 421 var BIT2 = 2; 422 var BIT3 = 4; 423 var BIT4 = 8; 424 var BIT6 = 32; 425 var BIT7 = 64; 426 var BIT8 = 128; 427 var BIT18 = 1 << 17; 428 var BIT19 = 1 << 18; 429 var BIT20 = 1 << 19; 430 var BIT21 = 1 << 20; 431 var BIT22 = 1 << 21; 432 var BIT23 = 1 << 22; 433 var BIT24 = 1 << 23; 434 var BIT25 = 1 << 24; 435 var BIT26 = 1 << 25; 436 var BIT27 = 1 << 26; 437 var BIT28 = 1 << 27; 438 var BIT29 = 1 << 28; 439 var BIT30 = 1 << 29; 440 var BIT31 = 1 << 30; 441 var BIT32 = 1 << 31; 442 var BITS5 = 31; 443 var BITS6 = 63; 444 var BITS7 = 127; 445 var BITS17 = BIT18 - 1; 446 var BITS18 = BIT19 - 1; 447 var BITS19 = BIT20 - 1; 448 var BITS20 = BIT21 - 1; 449 var BITS21 = BIT22 - 1; 450 var BITS22 = BIT23 - 1; 451 var BITS23 = BIT24 - 1; 452 var BITS24 = BIT25 - 1; 453 var BITS25 = BIT26 - 1; 454 var BITS26 = BIT27 - 1; 455 var BITS27 = BIT28 - 1; 456 var BITS28 = BIT29 - 1; 457 var BITS29 = BIT30 - 1; 458 var BITS30 = BIT31 - 1; 459 var BITS31 = 2147483647; 460 461 // node_modules/lib0/number.js 462 var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER; 463 var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER; 464 var LOWEST_INT32 = 1 << 31; 465 var isInteger = Number.isInteger || ((num) => typeof num === "number" && isFinite(num) && floor(num) === num); 466 var isNaN3 = Number.isNaN; 467 var parseInt2 = Number.parseInt; 468 469 // node_modules/lib0/string.js 470 var fromCharCode = String.fromCharCode; 471 var fromCodePoint = String.fromCodePoint; 472 var MAX_UTF16_CHARACTER = fromCharCode(65535); 473 var toLowerCase = (s) => s.toLowerCase(); 474 var trimLeftRegex = /^\s*/g; 475 var trimLeft = (s) => s.replace(trimLeftRegex, ""); 476 var fromCamelCaseRegex = /([A-Z])/g; 477 var fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, (match) => `$separator}$toLowerCase(match)}`)); 478 var _encodeUtf8Polyfill = (str) => { 479 const encodedString = unescape(encodeURIComponent(str)); 480 const len = encodedString.length; 481 const buf = new Uint8Array(len); 482 for (let i = 0; i < len; i++) { 483 buf[i] = /** @type {number} */ 484 encodedString.codePointAt(i); 485 } 486 return buf; 487 }; 488 var utf8TextEncoder = ( 489 /** @type {TextEncoder} */ 490 typeof TextEncoder !== "undefined" ? new TextEncoder() : null 491 ); 492 var _encodeUtf8Native = (str) => utf8TextEncoder.encode(str); 493 var encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill; 494 var utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }); 495 if (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) { 496 utf8TextDecoder = null; 497 } 498 var repeat = (source, n) => unfold(n, () => source).join(""); 499 500 // node_modules/lib0/encoding.js 501 var Encoder = class { 502 constructor() { 503 this.cpos = 0; 504 this.cbuf = new Uint8Array(100); 505 this.bufs = []; 506 } 507 }; 508 var createEncoder = () => new Encoder(); 509 var length = (encoder) => { 510 let len = encoder.cpos; 511 for (let i = 0; i < encoder.bufs.length; i++) { 512 len += encoder.bufs[i].length; 513 } 514 return len; 515 }; 516 var toUint8Array = (encoder) => { 517 const uint8arr = new Uint8Array(length(encoder)); 518 let curPos = 0; 519 for (let i = 0; i < encoder.bufs.length; i++) { 520 const d = encoder.bufs[i]; 521 uint8arr.set(d, curPos); 522 curPos += d.length; 523 } 524 uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos); 525 return uint8arr; 526 }; 527 var verifyLen = (encoder, len) => { 528 const bufferLen = encoder.cbuf.length; 529 if (bufferLen - encoder.cpos < len) { 530 encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos)); 531 encoder.cbuf = new Uint8Array(max(bufferLen, len) * 2); 532 encoder.cpos = 0; 533 } 534 }; 535 var write = (encoder, num) => { 536 const bufferLen = encoder.cbuf.length; 537 if (encoder.cpos === bufferLen) { 538 encoder.bufs.push(encoder.cbuf); 539 encoder.cbuf = new Uint8Array(bufferLen * 2); 540 encoder.cpos = 0; 541 } 542 encoder.cbuf[encoder.cpos++] = num; 543 }; 544 var writeUint8 = write; 545 var writeVarUint = (encoder, num) => { 546 while (num > BITS7) { 547 write(encoder, BIT8 | BITS7 & num); 548 num = floor(num / 128); 549 } 550 write(encoder, BITS7 & num); 551 }; 552 var writeVarInt = (encoder, num) => { 553 const isNegative = isNegativeZero(num); 554 if (isNegative) { 555 num = -num; 556 } 557 write(encoder, (num > BITS6 ? BIT8 : 0) | (isNegative ? BIT7 : 0) | BITS6 & num); 558 num = floor(num / 64); 559 while (num > 0) { 560 write(encoder, (num > BITS7 ? BIT8 : 0) | BITS7 & num); 561 num = floor(num / 128); 562 } 563 }; 564 var _strBuffer = new Uint8Array(3e4); 565 var _maxStrBSize = _strBuffer.length / 3; 566 var _writeVarStringNative = (encoder, str) => { 567 if (str.length < _maxStrBSize) { 568 const written = utf8TextEncoder.encodeInto(str, _strBuffer).written || 0; 569 writeVarUint(encoder, written); 570 for (let i = 0; i < written; i++) { 571 write(encoder, _strBuffer[i]); 572 } 573 } else { 574 writeVarUint8Array(encoder, encodeUtf8(str)); 575 } 576 }; 577 var _writeVarStringPolyfill = (encoder, str) => { 578 const encodedString = unescape(encodeURIComponent(str)); 579 const len = encodedString.length; 580 writeVarUint(encoder, len); 581 for (let i = 0; i < len; i++) { 582 write( 583 encoder, 584 /** @type {number} */ 585 encodedString.codePointAt(i) 586 ); 587 } 588 }; 589 var writeVarString = utf8TextEncoder && /** @type {any} */ 590 utf8TextEncoder.encodeInto ? _writeVarStringNative : _writeVarStringPolyfill; 591 var writeBinaryEncoder = (encoder, append2) => writeUint8Array(encoder, toUint8Array(append2)); 592 var writeUint8Array = (encoder, uint8Array) => { 593 const bufferLen = encoder.cbuf.length; 594 const cpos = encoder.cpos; 595 const leftCopyLen = min(bufferLen - cpos, uint8Array.length); 596 const rightCopyLen = uint8Array.length - leftCopyLen; 597 encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos); 598 encoder.cpos += leftCopyLen; 599 if (rightCopyLen > 0) { 600 encoder.bufs.push(encoder.cbuf); 601 encoder.cbuf = new Uint8Array(max(bufferLen * 2, rightCopyLen)); 602 encoder.cbuf.set(uint8Array.subarray(leftCopyLen)); 603 encoder.cpos = rightCopyLen; 604 } 605 }; 606 var writeVarUint8Array = (encoder, uint8Array) => { 607 writeVarUint(encoder, uint8Array.byteLength); 608 writeUint8Array(encoder, uint8Array); 609 }; 610 var writeOnDataView = (encoder, len) => { 611 verifyLen(encoder, len); 612 const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len); 613 encoder.cpos += len; 614 return dview; 615 }; 616 var writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false); 617 var writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false); 618 var writeBigInt64 = (encoder, num) => ( 619 /** @type {any} */ 620 writeOnDataView(encoder, 8).setBigInt64(0, num, false) 621 ); 622 var floatTestBed = new DataView(new ArrayBuffer(4)); 623 var isFloat32 = (num) => { 624 floatTestBed.setFloat32(0, num); 625 return floatTestBed.getFloat32(0) === num; 626 }; 627 var writeAny = (encoder, data) => { 628 switch (typeof data) { 629 case "string": 630 write(encoder, 119); 631 writeVarString(encoder, data); 632 break; 633 case "number": 634 if (isInteger(data) && abs(data) <= BITS31) { 635 write(encoder, 125); 636 writeVarInt(encoder, data); 637 } else if (isFloat32(data)) { 638 write(encoder, 124); 639 writeFloat32(encoder, data); 640 } else { 641 write(encoder, 123); 642 writeFloat64(encoder, data); 643 } 644 break; 645 case "bigint": 646 write(encoder, 122); 647 writeBigInt64(encoder, data); 648 break; 649 case "object": 650 if (data === null) { 651 write(encoder, 126); 652 } else if (isArray(data)) { 653 write(encoder, 117); 654 writeVarUint(encoder, data.length); 655 for (let i = 0; i < data.length; i++) { 656 writeAny(encoder, data[i]); 657 } 658 } else if (data instanceof Uint8Array) { 659 write(encoder, 116); 660 writeVarUint8Array(encoder, data); 661 } else { 662 write(encoder, 118); 663 const keys2 = Object.keys(data); 664 writeVarUint(encoder, keys2.length); 665 for (let i = 0; i < keys2.length; i++) { 666 const key = keys2[i]; 667 writeVarString(encoder, key); 668 writeAny(encoder, data[key]); 669 } 670 } 671 break; 672 case "boolean": 673 write(encoder, data ? 120 : 121); 674 break; 675 default: 676 write(encoder, 127); 677 } 678 }; 679 var RleEncoder = class extends Encoder { 680 /** 681 * @param {function(Encoder, T):void} writer 682 */ 683 constructor(writer) { 684 super(); 685 this.w = writer; 686 this.s = null; 687 this.count = 0; 688 } 689 /** 690 * @param {T} v 691 */ 692 write(v) { 693 if (this.s === v) { 694 this.count++; 695 } else { 696 if (this.count > 0) { 697 writeVarUint(this, this.count - 1); 698 } 699 this.count = 1; 700 this.w(this, v); 701 this.s = v; 702 } 703 } 704 }; 705 var flushUintOptRleEncoder = (encoder) => { 706 if (encoder.count > 0) { 707 writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s); 708 if (encoder.count > 1) { 709 writeVarUint(encoder.encoder, encoder.count - 2); 710 } 711 } 712 }; 713 var UintOptRleEncoder = class { 714 constructor() { 715 this.encoder = new Encoder(); 716 this.s = 0; 717 this.count = 0; 718 } 719 /** 720 * @param {number} v 721 */ 722 write(v) { 723 if (this.s === v) { 724 this.count++; 725 } else { 726 flushUintOptRleEncoder(this); 727 this.count = 1; 728 this.s = v; 729 } 730 } 731 /** 732 * Flush the encoded state and transform this to a Uint8Array. 733 * 734 * Note that this should only be called once. 735 */ 736 toUint8Array() { 737 flushUintOptRleEncoder(this); 738 return toUint8Array(this.encoder); 739 } 740 }; 741 var flushIntDiffOptRleEncoder = (encoder) => { 742 if (encoder.count > 0) { 743 const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1); 744 writeVarInt(encoder.encoder, encodedDiff); 745 if (encoder.count > 1) { 746 writeVarUint(encoder.encoder, encoder.count - 2); 747 } 748 } 749 }; 750 var IntDiffOptRleEncoder = class { 751 constructor() { 752 this.encoder = new Encoder(); 753 this.s = 0; 754 this.count = 0; 755 this.diff = 0; 756 } 757 /** 758 * @param {number} v 759 */ 760 write(v) { 761 if (this.diff === v - this.s) { 762 this.s = v; 763 this.count++; 764 } else { 765 flushIntDiffOptRleEncoder(this); 766 this.count = 1; 767 this.diff = v - this.s; 768 this.s = v; 769 } 770 } 771 /** 772 * Flush the encoded state and transform this to a Uint8Array. 773 * 774 * Note that this should only be called once. 775 */ 776 toUint8Array() { 777 flushIntDiffOptRleEncoder(this); 778 return toUint8Array(this.encoder); 779 } 780 }; 781 var StringEncoder = class { 782 constructor() { 783 this.sarr = []; 784 this.s = ""; 785 this.lensE = new UintOptRleEncoder(); 786 } 787 /** 788 * @param {string} string 789 */ 790 write(string) { 791 this.s += string; 792 if (this.s.length > 19) { 793 this.sarr.push(this.s); 794 this.s = ""; 795 } 796 this.lensE.write(string.length); 797 } 798 toUint8Array() { 799 const encoder = new Encoder(); 800 this.sarr.push(this.s); 801 this.s = ""; 802 writeVarString(encoder, this.sarr.join("")); 803 writeUint8Array(encoder, this.lensE.toUint8Array()); 804 return toUint8Array(encoder); 805 } 806 }; 807 808 // node_modules/lib0/error.js 809 var create3 = (s) => new Error(s); 810 var methodUnimplemented = () => { 811 throw create3("Method unimplemented"); 812 }; 813 var unexpectedCase = () => { 814 throw create3("Unexpected case"); 815 }; 816 817 // node_modules/lib0/decoding.js 818 var errorUnexpectedEndOfArray = create3("Unexpected end of array"); 819 var errorIntegerOutOfRange = create3("Integer out of Range"); 820 var Decoder = class { 821 /** 822 * @param {Uint8Array} uint8Array Binary data to decode 823 */ 824 constructor(uint8Array) { 825 this.arr = uint8Array; 826 this.pos = 0; 827 } 828 }; 829 var createDecoder = (uint8Array) => new Decoder(uint8Array); 830 var hasContent = (decoder) => decoder.pos !== decoder.arr.length; 831 var readUint8Array = (decoder, len) => { 832 const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len); 833 decoder.pos += len; 834 return view; 835 }; 836 var readVarUint8Array = (decoder) => readUint8Array(decoder, readVarUint(decoder)); 837 var readUint8 = (decoder) => decoder.arr[decoder.pos++]; 838 var readVarUint = (decoder) => { 839 let num = 0; 840 let mult = 1; 841 const len = decoder.arr.length; 842 while (decoder.pos < len) { 843 const r = decoder.arr[decoder.pos++]; 844 num = num + (r & BITS7) * mult; 845 mult *= 128; 846 if (r < BIT8) { 847 return num; 848 } 849 if (num > MAX_SAFE_INTEGER) { 850 throw errorIntegerOutOfRange; 851 } 852 } 853 throw errorUnexpectedEndOfArray; 854 }; 855 var readVarInt = (decoder) => { 856 let r = decoder.arr[decoder.pos++]; 857 let num = r & BITS6; 858 let mult = 64; 859 const sign = (r & BIT7) > 0 ? -1 : 1; 860 if ((r & BIT8) === 0) { 861 return sign * num; 862 } 863 const len = decoder.arr.length; 864 while (decoder.pos < len) { 865 r = decoder.arr[decoder.pos++]; 866 num = num + (r & BITS7) * mult; 867 mult *= 128; 868 if (r < BIT8) { 869 return sign * num; 870 } 871 if (num > MAX_SAFE_INTEGER) { 872 throw errorIntegerOutOfRange; 873 } 874 } 875 throw errorUnexpectedEndOfArray; 876 }; 877 var _readVarStringPolyfill = (decoder) => { 878 let remainingLen = readVarUint(decoder); 879 if (remainingLen === 0) { 880 return ""; 881 } else { 882 let encodedString = String.fromCodePoint(readUint8(decoder)); 883 if (--remainingLen < 100) { 884 while (remainingLen--) { 885 encodedString += String.fromCodePoint(readUint8(decoder)); 886 } 887 } else { 888 while (remainingLen > 0) { 889 const nextLen = remainingLen < 1e4 ? remainingLen : 1e4; 890 const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen); 891 decoder.pos += nextLen; 892 encodedString += String.fromCodePoint.apply( 893 null, 894 /** @type {any} */ 895 bytes 896 ); 897 remainingLen -= nextLen; 898 } 899 } 900 return decodeURIComponent(escape(encodedString)); 901 } 902 }; 903 var _readVarStringNative = (decoder) => ( 904 /** @type any */ 905 utf8TextDecoder.decode(readVarUint8Array(decoder)) 906 ); 907 var readVarString = utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill; 908 var readFromDataView = (decoder, len) => { 909 const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len); 910 decoder.pos += len; 911 return dv; 912 }; 913 var readFloat32 = (decoder) => readFromDataView(decoder, 4).getFloat32(0, false); 914 var readFloat64 = (decoder) => readFromDataView(decoder, 8).getFloat64(0, false); 915 var readBigInt64 = (decoder) => ( 916 /** @type {any} */ 917 readFromDataView(decoder, 8).getBigInt64(0, false) 918 ); 919 var readAnyLookupTable = [ 920 (decoder) => void 0, 921 // CASE 127: undefined 922 (decoder) => null, 923 // CASE 126: null 924 readVarInt, 925 // CASE 125: integer 926 readFloat32, 927 // CASE 124: float32 928 readFloat64, 929 // CASE 123: float64 930 readBigInt64, 931 // CASE 122: bigint 932 (decoder) => false, 933 // CASE 121: boolean (false) 934 (decoder) => true, 935 // CASE 120: boolean (true) 936 readVarString, 937 // CASE 119: string 938 (decoder) => { 939 const len = readVarUint(decoder); 940 const obj = {}; 941 for (let i = 0; i < len; i++) { 942 const key = readVarString(decoder); 943 obj[key] = readAny(decoder); 944 } 945 return obj; 946 }, 947 (decoder) => { 948 const len = readVarUint(decoder); 949 const arr = []; 950 for (let i = 0; i < len; i++) { 951 arr.push(readAny(decoder)); 952 } 953 return arr; 954 }, 955 readVarUint8Array 956 // CASE 116: Uint8Array 957 ]; 958 var readAny = (decoder) => readAnyLookupTable[127 - readUint8(decoder)](decoder); 959 var RleDecoder = class extends Decoder { 960 /** 961 * @param {Uint8Array} uint8Array 962 * @param {function(Decoder):T} reader 963 */ 964 constructor(uint8Array, reader) { 965 super(uint8Array); 966 this.reader = reader; 967 this.s = null; 968 this.count = 0; 969 } 970 read() { 971 if (this.count === 0) { 972 this.s = this.reader(this); 973 if (hasContent(this)) { 974 this.count = readVarUint(this) + 1; 975 } else { 976 this.count = -1; 977 } 978 } 979 this.count--; 980 return ( 981 /** @type {T} */ 982 this.s 983 ); 984 } 985 }; 986 var UintOptRleDecoder = class extends Decoder { 987 /** 988 * @param {Uint8Array} uint8Array 989 */ 990 constructor(uint8Array) { 991 super(uint8Array); 992 this.s = 0; 993 this.count = 0; 994 } 995 read() { 996 if (this.count === 0) { 997 this.s = readVarInt(this); 998 const isNegative = isNegativeZero(this.s); 999 this.count = 1; 1000 if (isNegative) { 1001 this.s = -this.s; 1002 this.count = readVarUint(this) + 2; 1003 } 1004 } 1005 this.count--; 1006 return ( 1007 /** @type {number} */ 1008 this.s 1009 ); 1010 } 1011 }; 1012 var IntDiffOptRleDecoder = class extends Decoder { 1013 /** 1014 * @param {Uint8Array} uint8Array 1015 */ 1016 constructor(uint8Array) { 1017 super(uint8Array); 1018 this.s = 0; 1019 this.count = 0; 1020 this.diff = 0; 1021 } 1022 /** 1023 * @return {number} 1024 */ 1025 read() { 1026 if (this.count === 0) { 1027 const diff = readVarInt(this); 1028 const hasCount = diff & 1; 1029 this.diff = floor(diff / 2); 1030 this.count = 1; 1031 if (hasCount) { 1032 this.count = readVarUint(this) + 2; 1033 } 1034 } 1035 this.s += this.diff; 1036 this.count--; 1037 return this.s; 1038 } 1039 }; 1040 var StringDecoder = class { 1041 /** 1042 * @param {Uint8Array} uint8Array 1043 */ 1044 constructor(uint8Array) { 1045 this.decoder = new UintOptRleDecoder(uint8Array); 1046 this.str = readVarString(this.decoder); 1047 this.spos = 0; 1048 } 1049 /** 1050 * @return {string} 1051 */ 1052 read() { 1053 const end = this.spos + this.decoder.read(); 1054 const res = this.str.slice(this.spos, end); 1055 this.spos = end; 1056 return res; 1057 } 1058 }; 1059 1060 // node_modules/lib0/webcrypto.js 1061 var subtle = crypto.subtle; 1062 var getRandomValues = crypto.getRandomValues.bind(crypto); 1063 1064 // node_modules/lib0/random.js 1065 var uint32 = () => getRandomValues(new Uint32Array(1))[0]; 1066 var uuidv4Template = "10000000-1000-4000-8000" + -1e11; 1067 var uuidv4 = () => uuidv4Template.replace( 1068 /[018]/g, 1069 /** @param {number} c */ 1070 (c) => (c ^ uint32() & 15 >> c / 4).toString(16) 1071 ); 1072 1073 // node_modules/lib0/time.js 1074 var getUnixTime = Date.now; 1075 1076 // node_modules/lib0/promise.js 1077 var create4 = (f) => ( 1078 /** @type {Promise<T>} */ 1079 new Promise(f) 1080 ); 1081 var all = Promise.all.bind(Promise); 1082 1083 // node_modules/lib0/conditions.js 1084 var undefinedToNull = (v) => v === void 0 ? null : v; 1085 1086 // node_modules/lib0/storage.js 1087 var VarStoragePolyfill = class { 1088 constructor() { 1089 this.map = /* @__PURE__ */ new Map(); 1090 } 1091 /** 1092 * @param {string} key 1093 * @param {any} newValue 1094 */ 1095 setItem(key, newValue) { 1096 this.map.set(key, newValue); 1097 } 1098 /** 1099 * @param {string} key 1100 */ 1101 getItem(key) { 1102 return this.map.get(key); 1103 } 1104 }; 1105 var _localStorage = new VarStoragePolyfill(); 1106 var usePolyfill = true; 1107 try { 1108 if (typeof localStorage !== "undefined" && localStorage) { 1109 _localStorage = localStorage; 1110 usePolyfill = false; 1111 } 1112 } catch (e) { 1113 } 1114 var varStorage = _localStorage; 1115 1116 // node_modules/lib0/object.js 1117 var assign = Object.assign; 1118 var keys = Object.keys; 1119 var forEach = (obj, f) => { 1120 for (const key in obj) { 1121 f(obj[key], key); 1122 } 1123 }; 1124 var length2 = (obj) => keys(obj).length; 1125 var size = (obj) => keys(obj).length; 1126 var isEmpty = (obj) => { 1127 for (const _k in obj) { 1128 return false; 1129 } 1130 return true; 1131 }; 1132 var every = (obj, f) => { 1133 for (const key in obj) { 1134 if (!f(obj[key], key)) { 1135 return false; 1136 } 1137 } 1138 return true; 1139 }; 1140 var hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key); 1141 var equalFlat = (a, b) => a === b || size(a) === size(b) && every(a, (val, key) => (val !== void 0 || hasProperty(b, key)) && b[key] === val); 1142 var freeze = Object.freeze; 1143 var deepFreeze = (o) => { 1144 for (const key in o) { 1145 const c = o[key]; 1146 if (typeof c === "object" || typeof c === "function") { 1147 deepFreeze(o[key]); 1148 } 1149 } 1150 return freeze(o); 1151 }; 1152 1153 // node_modules/lib0/function.js 1154 var callAll = (fs, args2, i = 0) => { 1155 try { 1156 for (; i < fs.length; i++) { 1157 fs[i](...args2); 1158 } 1159 } finally { 1160 if (i < fs.length) { 1161 callAll(fs, args2, i + 1); 1162 } 1163 } 1164 }; 1165 var id = (a) => a; 1166 var equalityStrict = (a, b) => a === b; 1167 var equalityDeep = (a, b) => { 1168 if (a == null || b == null) { 1169 return equalityStrict(a, b); 1170 } 1171 if (a.constructor !== b.constructor) { 1172 return false; 1173 } 1174 if (a === b) { 1175 return true; 1176 } 1177 switch (a.constructor) { 1178 case ArrayBuffer: 1179 a = new Uint8Array(a); 1180 b = new Uint8Array(b); 1181 // eslint-disable-next-line no-fallthrough 1182 case Uint8Array: { 1183 if (a.byteLength !== b.byteLength) { 1184 return false; 1185 } 1186 for (let i = 0; i < a.length; i++) { 1187 if (a[i] !== b[i]) { 1188 return false; 1189 } 1190 } 1191 break; 1192 } 1193 case Set: { 1194 if (a.size !== b.size) { 1195 return false; 1196 } 1197 for (const value of a) { 1198 if (!b.has(value)) { 1199 return false; 1200 } 1201 } 1202 break; 1203 } 1204 case Map: { 1205 if (a.size !== b.size) { 1206 return false; 1207 } 1208 for (const key of a.keys()) { 1209 if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) { 1210 return false; 1211 } 1212 } 1213 break; 1214 } 1215 case Object: 1216 if (length2(a) !== length2(b)) { 1217 return false; 1218 } 1219 for (const key in a) { 1220 if (!hasProperty(a, key) || !equalityDeep(a[key], b[key])) { 1221 return false; 1222 } 1223 } 1224 break; 1225 case Array: 1226 if (a.length !== b.length) { 1227 return false; 1228 } 1229 for (let i = 0; i < a.length; i++) { 1230 if (!equalityDeep(a[i], b[i])) { 1231 return false; 1232 } 1233 } 1234 break; 1235 default: 1236 return false; 1237 } 1238 return true; 1239 }; 1240 var isOneOf = (value, options) => options.includes(value); 1241 1242 // node_modules/lib0/environment.js 1243 var isNode = typeof process !== "undefined" && process.release && /node|io\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== "undefined" ? process : 0) === "[object process]"; 1244 var isBrowser = typeof window !== "undefined" && typeof document !== "undefined" && !isNode; 1245 var isMac = typeof navigator !== "undefined" ? /Mac/.test(navigator.platform) : false; 1246 var params; 1247 var args = []; 1248 var computeParams = () => { 1249 if (params === void 0) { 1250 if (isNode) { 1251 params = create(); 1252 const pargs = process.argv; 1253 let currParamName = null; 1254 for (let i = 0; i < pargs.length; i++) { 1255 const parg = pargs[i]; 1256 if (parg[0] === "-") { 1257 if (currParamName !== null) { 1258 params.set(currParamName, ""); 1259 } 1260 currParamName = parg; 1261 } else { 1262 if (currParamName !== null) { 1263 params.set(currParamName, parg); 1264 currParamName = null; 1265 } else { 1266 args.push(parg); 1267 } 1268 } 1269 } 1270 if (currParamName !== null) { 1271 params.set(currParamName, ""); 1272 } 1273 } else if (typeof location === "object") { 1274 params = create(); 1275 (location.search || "?").slice(1).split("&").forEach((kv) => { 1276 if (kv.length !== 0) { 1277 const [key, value] = kv.split("="); 1278 params.set(`--$fromCamelCase(key, "-")}`, value); 1279 params.set(`-$fromCamelCase(key, "-")}`, value); 1280 } 1281 }); 1282 } else { 1283 params = create(); 1284 } 1285 } 1286 return params; 1287 }; 1288 var hasParam = (name) => computeParams().has(name); 1289 var getVariable = (name) => isNode ? undefinedToNull(process.env[name.toUpperCase().replaceAll("-", "_")]) : undefinedToNull(varStorage.getItem(name)); 1290 var hasConf = (name) => hasParam("--" + name) || getVariable(name) !== null; 1291 var production = hasConf("production"); 1292 var forceColor = isNode && isOneOf(process.env.FORCE_COLOR, ["true", "1", "2"]); 1293 var supportsColor = forceColor || !hasParam("--no-colors") && // @todo deprecate --no-colors 1294 !hasConf("no-color") && (!isNode || process.stdout.isTTY) && (!isNode || hasParam("--color") || getVariable("COLORTERM") !== null || (getVariable("TERM") || "").includes("color")); 1295 1296 // node_modules/lib0/buffer.js 1297 var createUint8ArrayFromLen = (len) => new Uint8Array(len); 1298 var createUint8ArrayViewFromArrayBuffer = (buffer, byteOffset, length3) => new Uint8Array(buffer, byteOffset, length3); 1299 var toBase64Browser = (bytes) => { 1300 let s = ""; 1301 for (let i = 0; i < bytes.byteLength; i++) { 1302 s += fromCharCode(bytes[i]); 1303 } 1304 return btoa(s); 1305 }; 1306 var toBase64Node = (bytes) => Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64"); 1307 var fromBase64Browser = (s) => { 1308 const a = atob(s); 1309 const bytes = createUint8ArrayFromLen(a.length); 1310 for (let i = 0; i < a.length; i++) { 1311 bytes[i] = a.charCodeAt(i); 1312 } 1313 return bytes; 1314 }; 1315 var fromBase64Node = (s) => { 1316 const buf = Buffer.from(s, "base64"); 1317 return createUint8ArrayViewFromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength); 1318 }; 1319 var toBase64 = isBrowser ? toBase64Browser : toBase64Node; 1320 var fromBase64 = isBrowser ? fromBase64Browser : fromBase64Node; 1321 var copyUint8Array = (uint8Array) => { 1322 const newBuf = createUint8ArrayFromLen(uint8Array.byteLength); 1323 newBuf.set(uint8Array); 1324 return newBuf; 1325 }; 1326 1327 // node_modules/lib0/pair.js 1328 var Pair = class { 1329 /** 1330 * @param {L} left 1331 * @param {R} right 1332 */ 1333 constructor(left, right) { 1334 this.left = left; 1335 this.right = right; 1336 } 1337 }; 1338 var create5 = (left, right) => new Pair(left, right); 1339 1340 // node_modules/lib0/dom.js 1341 var doc = ( 1342 /** @type {Document} */ 1343 typeof document !== "undefined" ? document : {} 1344 ); 1345 var domParser = ( 1346 /** @type {DOMParser} */ 1347 typeof DOMParser !== "undefined" ? new DOMParser() : null 1348 ); 1349 var mapToStyleString = (m) => map(m, (value, key) => `$key}:$value};`).join(""); 1350 var ELEMENT_NODE = doc.ELEMENT_NODE; 1351 var TEXT_NODE = doc.TEXT_NODE; 1352 var CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE; 1353 var COMMENT_NODE = doc.COMMENT_NODE; 1354 var DOCUMENT_NODE = doc.DOCUMENT_NODE; 1355 var DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE; 1356 var DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE; 1357 1358 // node_modules/lib0/symbol.js 1359 var create6 = Symbol; 1360 1361 // node_modules/lib0/logging.common.js 1362 var BOLD = create6(); 1363 var UNBOLD = create6(); 1364 var BLUE = create6(); 1365 var GREY = create6(); 1366 var GREEN = create6(); 1367 var RED = create6(); 1368 var PURPLE = create6(); 1369 var ORANGE = create6(); 1370 var UNCOLOR = create6(); 1371 var computeNoColorLoggingArgs = (args2) => { 1372 if (args2.length === 1 && args2[0]?.constructor === Function) { 1373 args2 = /** @type {Array<string|Symbol|Object|number>} */ 1374 /** @type {[function]} */ 1375 args2[0](); 1376 } 1377 const strBuilder = []; 1378 const logArgs = []; 1379 let i = 0; 1380 for (; i < args2.length; i++) { 1381 const arg = args2[i]; 1382 if (arg === void 0) { 1383 break; 1384 } else if (arg.constructor === String || arg.constructor === Number) { 1385 strBuilder.push(arg); 1386 } else if (arg.constructor === Object) { 1387 break; 1388 } 1389 } 1390 if (i > 0) { 1391 logArgs.push(strBuilder.join("")); 1392 } 1393 for (; i < args2.length; i++) { 1394 const arg = args2[i]; 1395 if (!(arg instanceof Symbol)) { 1396 logArgs.push(arg); 1397 } 1398 } 1399 return logArgs; 1400 }; 1401 var lastLoggingTime = getUnixTime(); 1402 1403 // node_modules/lib0/logging.js 1404 var _browserStyleMap = { 1405 [BOLD]: create5("font-weight", "bold"), 1406 [UNBOLD]: create5("font-weight", "normal"), 1407 [BLUE]: create5("color", "blue"), 1408 [GREEN]: create5("color", "green"), 1409 [GREY]: create5("color", "grey"), 1410 [RED]: create5("color", "red"), 1411 [PURPLE]: create5("color", "purple"), 1412 [ORANGE]: create5("color", "orange"), 1413 // not well supported in chrome when debugging node with inspector - TODO: deprecate 1414 [UNCOLOR]: create5("color", "black") 1415 }; 1416 var computeBrowserLoggingArgs = (args2) => { 1417 if (args2.length === 1 && args2[0]?.constructor === Function) { 1418 args2 = /** @type {Array<string|Symbol|Object|number>} */ 1419 /** @type {[function]} */ 1420 args2[0](); 1421 } 1422 const strBuilder = []; 1423 const styles = []; 1424 const currentStyle = create(); 1425 let logArgs = []; 1426 let i = 0; 1427 for (; i < args2.length; i++) { 1428 const arg = args2[i]; 1429 const style = _browserStyleMap[arg]; 1430 if (style !== void 0) { 1431 currentStyle.set(style.left, style.right); 1432 } else { 1433 if (arg === void 0) { 1434 break; 1435 } 1436 if (arg.constructor === String || arg.constructor === Number) { 1437 const style2 = mapToStyleString(currentStyle); 1438 if (i > 0 || style2.length > 0) { 1439 strBuilder.push("%c" + arg); 1440 styles.push(style2); 1441 } else { 1442 strBuilder.push(arg); 1443 } 1444 } else { 1445 break; 1446 } 1447 } 1448 } 1449 if (i > 0) { 1450 logArgs = styles; 1451 logArgs.unshift(strBuilder.join("")); 1452 } 1453 for (; i < args2.length; i++) { 1454 const arg = args2[i]; 1455 if (!(arg instanceof Symbol)) { 1456 logArgs.push(arg); 1457 } 1458 } 1459 return logArgs; 1460 }; 1461 var computeLoggingArgs = supportsColor ? computeBrowserLoggingArgs : computeNoColorLoggingArgs; 1462 var print = (...args2) => { 1463 console.log(...computeLoggingArgs(args2)); 1464 vconsoles.forEach((vc) => vc.print(args2)); 1465 }; 1466 var warn = (...args2) => { 1467 console.warn(...computeLoggingArgs(args2)); 1468 args2.unshift(ORANGE); 1469 vconsoles.forEach((vc) => vc.print(args2)); 1470 }; 1471 var vconsoles = create2(); 1472 1473 // node_modules/lib0/iterator.js 1474 var createIterator = (next) => ({ 1475 /** 1476 * @return {IterableIterator<T>} 1477 */ 1478 [Symbol.iterator]() { 1479 return this; 1480 }, 1481 // @ts-ignore 1482 next 1483 }); 1484 var iteratorFilter = (iterator, filter) => createIterator(() => { 1485 let res; 1486 do { 1487 res = iterator.next(); 1488 } while (!res.done && !filter(res.value)); 1489 return res; 1490 }); 1491 var iteratorMap = (iterator, fmap) => createIterator(() => { 1492 const { done, value } = iterator.next(); 1493 return { done, value: done ? void 0 : fmap(value) }; 1494 }); 1495 1496 // node_modules/yjs/dist/yjs.mjs 1497 var AbstractConnector = class extends ObservableV2 { 1498 /** 1499 * @param {Doc} ydoc 1500 * @param {any} awareness 1501 */ 1502 constructor(ydoc, awareness) { 1503 super(); 1504 this.doc = ydoc; 1505 this.awareness = awareness; 1506 } 1507 }; 1508 var DeleteItem = class { 1509 /** 1510 * @param {number} clock 1511 * @param {number} len 1512 */ 1513 constructor(clock, len) { 1514 this.clock = clock; 1515 this.len = len; 1516 } 1517 }; 1518 var DeleteSet = class { 1519 constructor() { 1520 this.clients = /* @__PURE__ */ new Map(); 1521 } 1522 }; 1523 var iterateDeletedStructs = (transaction, ds, f) => ds.clients.forEach((deletes, clientid) => { 1524 const structs = ( 1525 /** @type {Array<GC|Item>} */ 1526 transaction.doc.store.clients.get(clientid) 1527 ); 1528 if (structs != null) { 1529 const lastStruct = structs[structs.length - 1]; 1530 const clockState = lastStruct.id.clock + lastStruct.length; 1531 for (let i = 0, del = deletes[i]; i < deletes.length && del.clock < clockState; del = deletes[++i]) { 1532 iterateStructs(transaction, structs, del.clock, del.len, f); 1533 } 1534 } 1535 }); 1536 var findIndexDS = (dis, clock) => { 1537 let left = 0; 1538 let right = dis.length - 1; 1539 while (left <= right) { 1540 const midindex = floor((left + right) / 2); 1541 const mid = dis[midindex]; 1542 const midclock = mid.clock; 1543 if (midclock <= clock) { 1544 if (clock < midclock + mid.len) { 1545 return midindex; 1546 } 1547 left = midindex + 1; 1548 } else { 1549 right = midindex - 1; 1550 } 1551 } 1552 return null; 1553 }; 1554 var isDeleted = (ds, id2) => { 1555 const dis = ds.clients.get(id2.client); 1556 return dis !== void 0 && findIndexDS(dis, id2.clock) !== null; 1557 }; 1558 var sortAndMergeDeleteSet = (ds) => { 1559 ds.clients.forEach((dels) => { 1560 dels.sort((a, b) => a.clock - b.clock); 1561 let i, j; 1562 for (i = 1, j = 1; i < dels.length; i++) { 1563 const left = dels[j - 1]; 1564 const right = dels[i]; 1565 if (left.clock + left.len >= right.clock) { 1566 left.len = max(left.len, right.clock + right.len - left.clock); 1567 } else { 1568 if (j < i) { 1569 dels[j] = right; 1570 } 1571 j++; 1572 } 1573 } 1574 dels.length = j; 1575 }); 1576 }; 1577 var mergeDeleteSets = (dss) => { 1578 const merged = new DeleteSet(); 1579 for (let dssI = 0; dssI < dss.length; dssI++) { 1580 dss[dssI].clients.forEach((delsLeft, client) => { 1581 if (!merged.clients.has(client)) { 1582 const dels = delsLeft.slice(); 1583 for (let i = dssI + 1; i < dss.length; i++) { 1584 appendTo(dels, dss[i].clients.get(client) || []); 1585 } 1586 merged.clients.set(client, dels); 1587 } 1588 }); 1589 } 1590 sortAndMergeDeleteSet(merged); 1591 return merged; 1592 }; 1593 var addToDeleteSet = (ds, client, clock, length3) => { 1594 setIfUndefined(ds.clients, client, () => ( 1595 /** @type {Array<DeleteItem>} */ 1596 [] 1597 )).push(new DeleteItem(clock, length3)); 1598 }; 1599 var createDeleteSet = () => new DeleteSet(); 1600 var createDeleteSetFromStructStore = (ss) => { 1601 const ds = createDeleteSet(); 1602 ss.clients.forEach((structs, client) => { 1603 const dsitems = []; 1604 for (let i = 0; i < structs.length; i++) { 1605 const struct = structs[i]; 1606 if (struct.deleted) { 1607 const clock = struct.id.clock; 1608 let len = struct.length; 1609 if (i + 1 < structs.length) { 1610 for (let next = structs[i + 1]; i + 1 < structs.length && next.deleted; next = structs[++i + 1]) { 1611 len += next.length; 1612 } 1613 } 1614 dsitems.push(new DeleteItem(clock, len)); 1615 } 1616 } 1617 if (dsitems.length > 0) { 1618 ds.clients.set(client, dsitems); 1619 } 1620 }); 1621 return ds; 1622 }; 1623 var writeDeleteSet = (encoder, ds) => { 1624 writeVarUint(encoder.restEncoder, ds.clients.size); 1625 from(ds.clients.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, dsitems]) => { 1626 encoder.resetDsCurVal(); 1627 writeVarUint(encoder.restEncoder, client); 1628 const len = dsitems.length; 1629 writeVarUint(encoder.restEncoder, len); 1630 for (let i = 0; i < len; i++) { 1631 const item = dsitems[i]; 1632 encoder.writeDsClock(item.clock); 1633 encoder.writeDsLen(item.len); 1634 } 1635 }); 1636 }; 1637 var readDeleteSet = (decoder) => { 1638 const ds = new DeleteSet(); 1639 const numClients = readVarUint(decoder.restDecoder); 1640 for (let i = 0; i < numClients; i++) { 1641 decoder.resetDsCurVal(); 1642 const client = readVarUint(decoder.restDecoder); 1643 const numberOfDeletes = readVarUint(decoder.restDecoder); 1644 if (numberOfDeletes > 0) { 1645 const dsField = setIfUndefined(ds.clients, client, () => ( 1646 /** @type {Array<DeleteItem>} */ 1647 [] 1648 )); 1649 for (let i2 = 0; i2 < numberOfDeletes; i2++) { 1650 dsField.push(new DeleteItem(decoder.readDsClock(), decoder.readDsLen())); 1651 } 1652 } 1653 } 1654 return ds; 1655 }; 1656 var readAndApplyDeleteSet = (decoder, transaction, store) => { 1657 const unappliedDS = new DeleteSet(); 1658 const numClients = readVarUint(decoder.restDecoder); 1659 for (let i = 0; i < numClients; i++) { 1660 decoder.resetDsCurVal(); 1661 const client = readVarUint(decoder.restDecoder); 1662 const numberOfDeletes = readVarUint(decoder.restDecoder); 1663 const structs = store.clients.get(client) || []; 1664 const state = getState(store, client); 1665 for (let i2 = 0; i2 < numberOfDeletes; i2++) { 1666 const clock = decoder.readDsClock(); 1667 const clockEnd = clock + decoder.readDsLen(); 1668 if (clock < state) { 1669 if (state < clockEnd) { 1670 addToDeleteSet(unappliedDS, client, state, clockEnd - state); 1671 } 1672 let index = findIndexSS(structs, clock); 1673 let struct = structs[index]; 1674 if (!struct.deleted && struct.id.clock < clock) { 1675 structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock)); 1676 index++; 1677 } 1678 while (index < structs.length) { 1679 struct = structs[index++]; 1680 if (struct.id.clock < clockEnd) { 1681 if (!struct.deleted) { 1682 if (clockEnd < struct.id.clock + struct.length) { 1683 structs.splice(index, 0, splitItem(transaction, struct, clockEnd - struct.id.clock)); 1684 } 1685 struct.delete(transaction); 1686 } 1687 } else { 1688 break; 1689 } 1690 } 1691 } else { 1692 addToDeleteSet(unappliedDS, client, clock, clockEnd - clock); 1693 } 1694 } 1695 } 1696 if (unappliedDS.clients.size > 0) { 1697 const ds = new UpdateEncoderV2(); 1698 writeVarUint(ds.restEncoder, 0); 1699 writeDeleteSet(ds, unappliedDS); 1700 return ds.toUint8Array(); 1701 } 1702 return null; 1703 }; 1704 var equalDeleteSets = (ds1, ds2) => { 1705 if (ds1.clients.size !== ds2.clients.size) return false; 1706 for (const [client, deleteItems1] of ds1.clients.entries()) { 1707 const deleteItems2 = ( 1708 /** @type {Array<import('../internals.js').DeleteItem>} */ 1709 ds2.clients.get(client) 1710 ); 1711 if (deleteItems2 === void 0 || deleteItems1.length !== deleteItems2.length) return false; 1712 for (let i = 0; i < deleteItems1.length; i++) { 1713 const di1 = deleteItems1[i]; 1714 const di2 = deleteItems2[i]; 1715 if (di1.clock !== di2.clock || di1.len !== di2.len) { 1716 return false; 1717 } 1718 } 1719 } 1720 return true; 1721 }; 1722 var generateNewClientId = uint32; 1723 var Doc = class _Doc extends ObservableV2 { 1724 /** 1725 * @param {DocOpts} opts configuration 1726 */ 1727 constructor({ guid = uuidv4(), collectionid = null, gc = true, gcFilter = () => true, meta = null, autoLoad = false, shouldLoad = true } = {}) { 1728 super(); 1729 this.gc = gc; 1730 this.gcFilter = gcFilter; 1731 this.clientID = generateNewClientId(); 1732 this.guid = guid; 1733 this.collectionid = collectionid; 1734 this.share = /* @__PURE__ */ new Map(); 1735 this.store = new StructStore(); 1736 this._transaction = null; 1737 this._transactionCleanups = []; 1738 this.subdocs = /* @__PURE__ */ new Set(); 1739 this._item = null; 1740 this.shouldLoad = shouldLoad; 1741 this.autoLoad = autoLoad; 1742 this.meta = meta; 1743 this.isLoaded = false; 1744 this.isSynced = false; 1745 this.isDestroyed = false; 1746 this.whenLoaded = create4((resolve) => { 1747 this.on("load", () => { 1748 this.isLoaded = true; 1749 resolve(this); 1750 }); 1751 }); 1752 const provideSyncedPromise = () => create4((resolve) => { 1753 const eventHandler = (isSynced) => { 1754 if (isSynced === void 0 || isSynced === true) { 1755 this.off("sync", eventHandler); 1756 resolve(); 1757 } 1758 }; 1759 this.on("sync", eventHandler); 1760 }); 1761 this.on("sync", (isSynced) => { 1762 if (isSynced === false && this.isSynced) { 1763 this.whenSynced = provideSyncedPromise(); 1764 } 1765 this.isSynced = isSynced === void 0 || isSynced === true; 1766 if (this.isSynced && !this.isLoaded) { 1767 this.emit("load", [this]); 1768 } 1769 }); 1770 this.whenSynced = provideSyncedPromise(); 1771 } 1772 /** 1773 * Notify the parent document that you request to load data into this subdocument (if it is a subdocument). 1774 * 1775 * `load()` might be used in the future to request any provider to load the most current data. 1776 * 1777 * It is safe to call `load()` multiple times. 1778 */ 1779 load() { 1780 const item = this._item; 1781 if (item !== null && !this.shouldLoad) { 1782 transact( 1783 /** @type {any} */ 1784 item.parent.doc, 1785 (transaction) => { 1786 transaction.subdocsLoaded.add(this); 1787 }, 1788 null, 1789 true 1790 ); 1791 } 1792 this.shouldLoad = true; 1793 } 1794 getSubdocs() { 1795 return this.subdocs; 1796 } 1797 getSubdocGuids() { 1798 return new Set(from(this.subdocs).map((doc2) => doc2.guid)); 1799 } 1800 /** 1801 * Changes that happen inside of a transaction are bundled. This means that 1802 * the observer fires _after_ the transaction is finished and that all changes 1803 * that happened inside of the transaction are sent as one message to the 1804 * other peers. 1805 * 1806 * @template T 1807 * @param {function(Transaction):T} f The function that should be executed as a transaction 1808 * @param {any} [origin] Origin of who started the transaction. Will be stored on transaction.origin 1809 * @return T 1810 * 1811 * @public 1812 */ 1813 transact(f, origin2 = null) { 1814 return transact(this, f, origin2); 1815 } 1816 /** 1817 * Define a shared data type. 1818 * 1819 * Multiple calls of `ydoc.get(name, TypeConstructor)` yield the same result 1820 * and do not overwrite each other. I.e. 1821 * `ydoc.get(name, Y.Array) === ydoc.get(name, Y.Array)` 1822 * 1823 * After this method is called, the type is also available on `ydoc.share.get(name)`. 1824 * 1825 * *Best Practices:* 1826 * Define all types right after the Y.Doc instance is created and store them in a separate object. 1827 * Also use the typed methods `getText(name)`, `getArray(name)`, .. 1828 * 1829 * @template {typeof AbstractType<any>} Type 1830 * @example 1831 * const ydoc = new Y.Doc(..) 1832 * const appState = { 1833 * document: ydoc.getText('document') 1834 * comments: ydoc.getArray('comments') 1835 * } 1836 * 1837 * @param {string} name 1838 * @param {Type} TypeConstructor The constructor of the type definition. E.g. Y.Text, Y.Array, Y.Map, ... 1839 * @return {InstanceType<Type>} The created type. Constructed with TypeConstructor 1840 * 1841 * @public 1842 */ 1843 get(name, TypeConstructor = ( 1844 /** @type {any} */ 1845 AbstractType 1846 )) { 1847 const type = setIfUndefined(this.share, name, () => { 1848 const t = new TypeConstructor(); 1849 t._integrate(this, null); 1850 return t; 1851 }); 1852 const Constr = type.constructor; 1853 if (TypeConstructor !== AbstractType && Constr !== TypeConstructor) { 1854 if (Constr === AbstractType) { 1855 const t = new TypeConstructor(); 1856 t._map = type._map; 1857 type._map.forEach( 1858 /** @param {Item?} n */ 1859 (n) => { 1860 for (; n !== null; n = n.left) { 1861 n.parent = t; 1862 } 1863 } 1864 ); 1865 t._start = type._start; 1866 for (let n = t._start; n !== null; n = n.right) { 1867 n.parent = t; 1868 } 1869 t._length = type._length; 1870 this.share.set(name, t); 1871 t._integrate(this, null); 1872 return ( 1873 /** @type {InstanceType<Type>} */ 1874 t 1875 ); 1876 } else { 1877 throw new Error(`Type with the name $name} has already been defined with a different constructor`); 1878 } 1879 } 1880 return ( 1881 /** @type {InstanceType<Type>} */ 1882 type 1883 ); 1884 } 1885 /** 1886 * @template T 1887 * @param {string} [name] 1888 * @return {YArray<T>} 1889 * 1890 * @public 1891 */ 1892 getArray(name = "") { 1893 return ( 1894 /** @type {YArray<T>} */ 1895 this.get(name, YArray) 1896 ); 1897 } 1898 /** 1899 * @param {string} [name] 1900 * @return {YText} 1901 * 1902 * @public 1903 */ 1904 getText(name = "") { 1905 return this.get(name, YText); 1906 } 1907 /** 1908 * @template T 1909 * @param {string} [name] 1910 * @return {YMap<T>} 1911 * 1912 * @public 1913 */ 1914 getMap(name = "") { 1915 return ( 1916 /** @type {YMap<T>} */ 1917 this.get(name, YMap) 1918 ); 1919 } 1920 /** 1921 * @param {string} [name] 1922 * @return {YXmlElement} 1923 * 1924 * @public 1925 */ 1926 getXmlElement(name = "") { 1927 return ( 1928 /** @type {YXmlElement<{[key:string]:string}>} */ 1929 this.get(name, YXmlElement) 1930 ); 1931 } 1932 /** 1933 * @param {string} [name] 1934 * @return {YXmlFragment} 1935 * 1936 * @public 1937 */ 1938 getXmlFragment(name = "") { 1939 return this.get(name, YXmlFragment); 1940 } 1941 /** 1942 * Converts the entire document into a js object, recursively traversing each yjs type 1943 * Doesn't log types that have not been defined (using ydoc.getType(..)). 1944 * 1945 * @deprecated Do not use this method and rather call toJSON directly on the shared types. 1946 * 1947 * @return {Object<string, any>} 1948 */ 1949 toJSON() { 1950 const doc2 = {}; 1951 this.share.forEach((value, key) => { 1952 doc2[key] = value.toJSON(); 1953 }); 1954 return doc2; 1955 } 1956 /** 1957 * Emit `destroy` event and unregister all event handlers. 1958 */ 1959 destroy() { 1960 this.isDestroyed = true; 1961 from(this.subdocs).forEach((subdoc) => subdoc.destroy()); 1962 const item = this._item; 1963 if (item !== null) { 1964 this._item = null; 1965 const content = ( 1966 /** @type {ContentDoc} */ 1967 item.content 1968 ); 1969 content.doc = new _Doc({ guid: this.guid, ...content.opts, shouldLoad: false }); 1970 content.doc._item = item; 1971 transact( 1972 /** @type {any} */ 1973 item.parent.doc, 1974 (transaction) => { 1975 const doc2 = content.doc; 1976 if (!item.deleted) { 1977 transaction.subdocsAdded.add(doc2); 1978 } 1979 transaction.subdocsRemoved.add(this); 1980 }, 1981 null, 1982 true 1983 ); 1984 } 1985 this.emit("destroyed", [true]); 1986 this.emit("destroy", [this]); 1987 super.destroy(); 1988 } 1989 }; 1990 var DSDecoderV1 = class { 1991 /** 1992 * @param {decoding.Decoder} decoder 1993 */ 1994 constructor(decoder) { 1995 this.restDecoder = decoder; 1996 } 1997 resetDsCurVal() { 1998 } 1999 /** 2000 * @return {number} 2001 */ 2002 readDsClock() { 2003 return readVarUint(this.restDecoder); 2004 } 2005 /** 2006 * @return {number} 2007 */ 2008 readDsLen() { 2009 return readVarUint(this.restDecoder); 2010 } 2011 }; 2012 var UpdateDecoderV1 = class extends DSDecoderV1 { 2013 /** 2014 * @return {ID} 2015 */ 2016 readLeftID() { 2017 return createID(readVarUint(this.restDecoder), readVarUint(this.restDecoder)); 2018 } 2019 /** 2020 * @return {ID} 2021 */ 2022 readRightID() { 2023 return createID(readVarUint(this.restDecoder), readVarUint(this.restDecoder)); 2024 } 2025 /** 2026 * Read the next client id. 2027 * Use this in favor of readID whenever possible to reduce the number of objects created. 2028 */ 2029 readClient() { 2030 return readVarUint(this.restDecoder); 2031 } 2032 /** 2033 * @return {number} info An unsigned 8-bit integer 2034 */ 2035 readInfo() { 2036 return readUint8(this.restDecoder); 2037 } 2038 /** 2039 * @return {string} 2040 */ 2041 readString() { 2042 return readVarString(this.restDecoder); 2043 } 2044 /** 2045 * @return {boolean} isKey 2046 */ 2047 readParentInfo() { 2048 return readVarUint(this.restDecoder) === 1; 2049 } 2050 /** 2051 * @return {number} info An unsigned 8-bit integer 2052 */ 2053 readTypeRef() { 2054 return readVarUint(this.restDecoder); 2055 } 2056 /** 2057 * Write len of a struct - well suited for Opt RLE encoder. 2058 * 2059 * @return {number} len 2060 */ 2061 readLen() { 2062 return readVarUint(this.restDecoder); 2063 } 2064 /** 2065 * @return {any} 2066 */ 2067 readAny() { 2068 return readAny(this.restDecoder); 2069 } 2070 /** 2071 * @return {Uint8Array} 2072 */ 2073 readBuf() { 2074 return copyUint8Array(readVarUint8Array(this.restDecoder)); 2075 } 2076 /** 2077 * Legacy implementation uses JSON parse. We use any-decoding in v2. 2078 * 2079 * @return {any} 2080 */ 2081 readJSON() { 2082 return JSON.parse(readVarString(this.restDecoder)); 2083 } 2084 /** 2085 * @return {string} 2086 */ 2087 readKey() { 2088 return readVarString(this.restDecoder); 2089 } 2090 }; 2091 var DSDecoderV2 = class { 2092 /** 2093 * @param {decoding.Decoder} decoder 2094 */ 2095 constructor(decoder) { 2096 this.dsCurrVal = 0; 2097 this.restDecoder = decoder; 2098 } 2099 resetDsCurVal() { 2100 this.dsCurrVal = 0; 2101 } 2102 /** 2103 * @return {number} 2104 */ 2105 readDsClock() { 2106 this.dsCurrVal += readVarUint(this.restDecoder); 2107 return this.dsCurrVal; 2108 } 2109 /** 2110 * @return {number} 2111 */ 2112 readDsLen() { 2113 const diff = readVarUint(this.restDecoder) + 1; 2114 this.dsCurrVal += diff; 2115 return diff; 2116 } 2117 }; 2118 var UpdateDecoderV2 = class extends DSDecoderV2 { 2119 /** 2120 * @param {decoding.Decoder} decoder 2121 */ 2122 constructor(decoder) { 2123 super(decoder); 2124 this.keys = []; 2125 readVarUint(decoder); 2126 this.keyClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder)); 2127 this.clientDecoder = new UintOptRleDecoder(readVarUint8Array(decoder)); 2128 this.leftClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder)); 2129 this.rightClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder)); 2130 this.infoDecoder = new RleDecoder(readVarUint8Array(decoder), readUint8); 2131 this.stringDecoder = new StringDecoder(readVarUint8Array(decoder)); 2132 this.parentInfoDecoder = new RleDecoder(readVarUint8Array(decoder), readUint8); 2133 this.typeRefDecoder = new UintOptRleDecoder(readVarUint8Array(decoder)); 2134 this.lenDecoder = new UintOptRleDecoder(readVarUint8Array(decoder)); 2135 } 2136 /** 2137 * @return {ID} 2138 */ 2139 readLeftID() { 2140 return new ID(this.clientDecoder.read(), this.leftClockDecoder.read()); 2141 } 2142 /** 2143 * @return {ID} 2144 */ 2145 readRightID() { 2146 return new ID(this.clientDecoder.read(), this.rightClockDecoder.read()); 2147 } 2148 /** 2149 * Read the next client id. 2150 * Use this in favor of readID whenever possible to reduce the number of objects created. 2151 */ 2152 readClient() { 2153 return this.clientDecoder.read(); 2154 } 2155 /** 2156 * @return {number} info An unsigned 8-bit integer 2157 */ 2158 readInfo() { 2159 return ( 2160 /** @type {number} */ 2161 this.infoDecoder.read() 2162 ); 2163 } 2164 /** 2165 * @return {string} 2166 */ 2167 readString() { 2168 return this.stringDecoder.read(); 2169 } 2170 /** 2171 * @return {boolean} 2172 */ 2173 readParentInfo() { 2174 return this.parentInfoDecoder.read() === 1; 2175 } 2176 /** 2177 * @return {number} An unsigned 8-bit integer 2178 */ 2179 readTypeRef() { 2180 return this.typeRefDecoder.read(); 2181 } 2182 /** 2183 * Write len of a struct - well suited for Opt RLE encoder. 2184 * 2185 * @return {number} 2186 */ 2187 readLen() { 2188 return this.lenDecoder.read(); 2189 } 2190 /** 2191 * @return {any} 2192 */ 2193 readAny() { 2194 return readAny(this.restDecoder); 2195 } 2196 /** 2197 * @return {Uint8Array} 2198 */ 2199 readBuf() { 2200 return readVarUint8Array(this.restDecoder); 2201 } 2202 /** 2203 * This is mainly here for legacy purposes. 2204 * 2205 * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder. 2206 * 2207 * @return {any} 2208 */ 2209 readJSON() { 2210 return readAny(this.restDecoder); 2211 } 2212 /** 2213 * @return {string} 2214 */ 2215 readKey() { 2216 const keyClock = this.keyClockDecoder.read(); 2217 if (keyClock < this.keys.length) { 2218 return this.keys[keyClock]; 2219 } else { 2220 const key = this.stringDecoder.read(); 2221 this.keys.push(key); 2222 return key; 2223 } 2224 } 2225 }; 2226 var DSEncoderV1 = class { 2227 constructor() { 2228 this.restEncoder = createEncoder(); 2229 } 2230 toUint8Array() { 2231 return toUint8Array(this.restEncoder); 2232 } 2233 resetDsCurVal() { 2234 } 2235 /** 2236 * @param {number} clock 2237 */ 2238 writeDsClock(clock) { 2239 writeVarUint(this.restEncoder, clock); 2240 } 2241 /** 2242 * @param {number} len 2243 */ 2244 writeDsLen(len) { 2245 writeVarUint(this.restEncoder, len); 2246 } 2247 }; 2248 var UpdateEncoderV1 = class extends DSEncoderV1 { 2249 /** 2250 * @param {ID} id 2251 */ 2252 writeLeftID(id2) { 2253 writeVarUint(this.restEncoder, id2.client); 2254 writeVarUint(this.restEncoder, id2.clock); 2255 } 2256 /** 2257 * @param {ID} id 2258 */ 2259 writeRightID(id2) { 2260 writeVarUint(this.restEncoder, id2.client); 2261 writeVarUint(this.restEncoder, id2.clock); 2262 } 2263 /** 2264 * Use writeClient and writeClock instead of writeID if possible. 2265 * @param {number} client 2266 */ 2267 writeClient(client) { 2268 writeVarUint(this.restEncoder, client); 2269 } 2270 /** 2271 * @param {number} info An unsigned 8-bit integer 2272 */ 2273 writeInfo(info) { 2274 writeUint8(this.restEncoder, info); 2275 } 2276 /** 2277 * @param {string} s 2278 */ 2279 writeString(s) { 2280 writeVarString(this.restEncoder, s); 2281 } 2282 /** 2283 * @param {boolean} isYKey 2284 */ 2285 writeParentInfo(isYKey) { 2286 writeVarUint(this.restEncoder, isYKey ? 1 : 0); 2287 } 2288 /** 2289 * @param {number} info An unsigned 8-bit integer 2290 */ 2291 writeTypeRef(info) { 2292 writeVarUint(this.restEncoder, info); 2293 } 2294 /** 2295 * Write len of a struct - well suited for Opt RLE encoder. 2296 * 2297 * @param {number} len 2298 */ 2299 writeLen(len) { 2300 writeVarUint(this.restEncoder, len); 2301 } 2302 /** 2303 * @param {any} any 2304 */ 2305 writeAny(any2) { 2306 writeAny(this.restEncoder, any2); 2307 } 2308 /** 2309 * @param {Uint8Array} buf 2310 */ 2311 writeBuf(buf) { 2312 writeVarUint8Array(this.restEncoder, buf); 2313 } 2314 /** 2315 * @param {any} embed 2316 */ 2317 writeJSON(embed) { 2318 writeVarString(this.restEncoder, JSON.stringify(embed)); 2319 } 2320 /** 2321 * @param {string} key 2322 */ 2323 writeKey(key) { 2324 writeVarString(this.restEncoder, key); 2325 } 2326 }; 2327 var DSEncoderV2 = class { 2328 constructor() { 2329 this.restEncoder = createEncoder(); 2330 this.dsCurrVal = 0; 2331 } 2332 toUint8Array() { 2333 return toUint8Array(this.restEncoder); 2334 } 2335 resetDsCurVal() { 2336 this.dsCurrVal = 0; 2337 } 2338 /** 2339 * @param {number} clock 2340 */ 2341 writeDsClock(clock) { 2342 const diff = clock - this.dsCurrVal; 2343 this.dsCurrVal = clock; 2344 writeVarUint(this.restEncoder, diff); 2345 } 2346 /** 2347 * @param {number} len 2348 */ 2349 writeDsLen(len) { 2350 if (len === 0) { 2351 unexpectedCase(); 2352 } 2353 writeVarUint(this.restEncoder, len - 1); 2354 this.dsCurrVal += len; 2355 } 2356 }; 2357 var UpdateEncoderV2 = class extends DSEncoderV2 { 2358 constructor() { 2359 super(); 2360 this.keyMap = /* @__PURE__ */ new Map(); 2361 this.keyClock = 0; 2362 this.keyClockEncoder = new IntDiffOptRleEncoder(); 2363 this.clientEncoder = new UintOptRleEncoder(); 2364 this.leftClockEncoder = new IntDiffOptRleEncoder(); 2365 this.rightClockEncoder = new IntDiffOptRleEncoder(); 2366 this.infoEncoder = new RleEncoder(writeUint8); 2367 this.stringEncoder = new StringEncoder(); 2368 this.parentInfoEncoder = new RleEncoder(writeUint8); 2369 this.typeRefEncoder = new UintOptRleEncoder(); 2370 this.lenEncoder = new UintOptRleEncoder(); 2371 } 2372 toUint8Array() { 2373 const encoder = createEncoder(); 2374 writeVarUint(encoder, 0); 2375 writeVarUint8Array(encoder, this.keyClockEncoder.toUint8Array()); 2376 writeVarUint8Array(encoder, this.clientEncoder.toUint8Array()); 2377 writeVarUint8Array(encoder, this.leftClockEncoder.toUint8Array()); 2378 writeVarUint8Array(encoder, this.rightClockEncoder.toUint8Array()); 2379 writeVarUint8Array(encoder, toUint8Array(this.infoEncoder)); 2380 writeVarUint8Array(encoder, this.stringEncoder.toUint8Array()); 2381 writeVarUint8Array(encoder, toUint8Array(this.parentInfoEncoder)); 2382 writeVarUint8Array(encoder, this.typeRefEncoder.toUint8Array()); 2383 writeVarUint8Array(encoder, this.lenEncoder.toUint8Array()); 2384 writeUint8Array(encoder, toUint8Array(this.restEncoder)); 2385 return toUint8Array(encoder); 2386 } 2387 /** 2388 * @param {ID} id 2389 */ 2390 writeLeftID(id2) { 2391 this.clientEncoder.write(id2.client); 2392 this.leftClockEncoder.write(id2.clock); 2393 } 2394 /** 2395 * @param {ID} id 2396 */ 2397 writeRightID(id2) { 2398 this.clientEncoder.write(id2.client); 2399 this.rightClockEncoder.write(id2.clock); 2400 } 2401 /** 2402 * @param {number} client 2403 */ 2404 writeClient(client) { 2405 this.clientEncoder.write(client); 2406 } 2407 /** 2408 * @param {number} info An unsigned 8-bit integer 2409 */ 2410 writeInfo(info) { 2411 this.infoEncoder.write(info); 2412 } 2413 /** 2414 * @param {string} s 2415 */ 2416 writeString(s) { 2417 this.stringEncoder.write(s); 2418 } 2419 /** 2420 * @param {boolean} isYKey 2421 */ 2422 writeParentInfo(isYKey) { 2423 this.parentInfoEncoder.write(isYKey ? 1 : 0); 2424 } 2425 /** 2426 * @param {number} info An unsigned 8-bit integer 2427 */ 2428 writeTypeRef(info) { 2429 this.typeRefEncoder.write(info); 2430 } 2431 /** 2432 * Write len of a struct - well suited for Opt RLE encoder. 2433 * 2434 * @param {number} len 2435 */ 2436 writeLen(len) { 2437 this.lenEncoder.write(len); 2438 } 2439 /** 2440 * @param {any} any 2441 */ 2442 writeAny(any2) { 2443 writeAny(this.restEncoder, any2); 2444 } 2445 /** 2446 * @param {Uint8Array} buf 2447 */ 2448 writeBuf(buf) { 2449 writeVarUint8Array(this.restEncoder, buf); 2450 } 2451 /** 2452 * This is mainly here for legacy purposes. 2453 * 2454 * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder. 2455 * 2456 * @param {any} embed 2457 */ 2458 writeJSON(embed) { 2459 writeAny(this.restEncoder, embed); 2460 } 2461 /** 2462 * Property keys are often reused. For example, in y-prosemirror the key `bold` might 2463 * occur very often. For a 3d application, the key `position` might occur very often. 2464 * 2465 * We cache these keys in a Map and refer to them via a unique number. 2466 * 2467 * @param {string} key 2468 */ 2469 writeKey(key) { 2470 const clock = this.keyMap.get(key); 2471 if (clock === void 0) { 2472 this.keyClockEncoder.write(this.keyClock++); 2473 this.stringEncoder.write(key); 2474 } else { 2475 this.keyClockEncoder.write(clock); 2476 } 2477 } 2478 }; 2479 var writeStructs = (encoder, structs, client, clock) => { 2480 clock = max(clock, structs[0].id.clock); 2481 const startNewStructs = findIndexSS(structs, clock); 2482 writeVarUint(encoder.restEncoder, structs.length - startNewStructs); 2483 encoder.writeClient(client); 2484 writeVarUint(encoder.restEncoder, clock); 2485 const firstStruct = structs[startNewStructs]; 2486 firstStruct.write(encoder, clock - firstStruct.id.clock); 2487 for (let i = startNewStructs + 1; i < structs.length; i++) { 2488 structs[i].write(encoder, 0); 2489 } 2490 }; 2491 var writeClientsStructs = (encoder, store, _sm) => { 2492 const sm = /* @__PURE__ */ new Map(); 2493 _sm.forEach((clock, client) => { 2494 if (getState(store, client) > clock) { 2495 sm.set(client, clock); 2496 } 2497 }); 2498 getStateVector(store).forEach((_clock, client) => { 2499 if (!_sm.has(client)) { 2500 sm.set(client, 0); 2501 } 2502 }); 2503 writeVarUint(encoder.restEncoder, sm.size); 2504 from(sm.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => { 2505 writeStructs( 2506 encoder, 2507 /** @type {Array<GC|Item>} */ 2508 store.clients.get(client), 2509 client, 2510 clock 2511 ); 2512 }); 2513 }; 2514 var readClientsStructRefs = (decoder, doc2) => { 2515 const clientRefs = create(); 2516 const numOfStateUpdates = readVarUint(decoder.restDecoder); 2517 for (let i = 0; i < numOfStateUpdates; i++) { 2518 const numberOfStructs = readVarUint(decoder.restDecoder); 2519 const refs = new Array(numberOfStructs); 2520 const client = decoder.readClient(); 2521 let clock = readVarUint(decoder.restDecoder); 2522 clientRefs.set(client, { i: 0, refs }); 2523 for (let i2 = 0; i2 < numberOfStructs; i2++) { 2524 const info = decoder.readInfo(); 2525 switch (BITS5 & info) { 2526 case 0: { 2527 const len = decoder.readLen(); 2528 refs[i2] = new GC(createID(client, clock), len); 2529 clock += len; 2530 break; 2531 } 2532 case 10: { 2533 const len = readVarUint(decoder.restDecoder); 2534 refs[i2] = new Skip(createID(client, clock), len); 2535 clock += len; 2536 break; 2537 } 2538 default: { 2539 const cantCopyParentInfo = (info & (BIT7 | BIT8)) === 0; 2540 const struct = new Item( 2541 createID(client, clock), 2542 null, 2543 // left 2544 (info & BIT8) === BIT8 ? decoder.readLeftID() : null, 2545 // origin 2546 null, 2547 // right 2548 (info & BIT7) === BIT7 ? decoder.readRightID() : null, 2549 // right origin 2550 cantCopyParentInfo ? decoder.readParentInfo() ? doc2.get(decoder.readString()) : decoder.readLeftID() : null, 2551 // parent 2552 cantCopyParentInfo && (info & BIT6) === BIT6 ? decoder.readString() : null, 2553 // parentSub 2554 readItemContent(decoder, info) 2555 // item content 2556 ); 2557 refs[i2] = struct; 2558 clock += struct.length; 2559 } 2560 } 2561 } 2562 } 2563 return clientRefs; 2564 }; 2565 var integrateStructs = (transaction, store, clientsStructRefs) => { 2566 const stack = []; 2567 let clientsStructRefsIds = from(clientsStructRefs.keys()).sort((a, b) => a - b); 2568 if (clientsStructRefsIds.length === 0) { 2569 return null; 2570 } 2571 const getNextStructTarget = () => { 2572 if (clientsStructRefsIds.length === 0) { 2573 return null; 2574 } 2575 let nextStructsTarget = ( 2576 /** @type {{i:number,refs:Array<GC|Item>}} */ 2577 clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]) 2578 ); 2579 while (nextStructsTarget.refs.length === nextStructsTarget.i) { 2580 clientsStructRefsIds.pop(); 2581 if (clientsStructRefsIds.length > 0) { 2582 nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ 2583 clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]); 2584 } else { 2585 return null; 2586 } 2587 } 2588 return nextStructsTarget; 2589 }; 2590 let curStructsTarget = getNextStructTarget(); 2591 if (curStructsTarget === null) { 2592 return null; 2593 } 2594 const restStructs = new StructStore(); 2595 const missingSV = /* @__PURE__ */ new Map(); 2596 const updateMissingSv = (client, clock) => { 2597 const mclock = missingSV.get(client); 2598 if (mclock == null || mclock > clock) { 2599 missingSV.set(client, clock); 2600 } 2601 }; 2602 let stackHead = ( 2603 /** @type {any} */ 2604 curStructsTarget.refs[ 2605 /** @type {any} */ 2606 curStructsTarget.i++ 2607 ] 2608 ); 2609 const state = /* @__PURE__ */ new Map(); 2610 const addStackToRestSS = () => { 2611 for (const item of stack) { 2612 const client = item.id.client; 2613 const inapplicableItems = clientsStructRefs.get(client); 2614 if (inapplicableItems) { 2615 inapplicableItems.i--; 2616 restStructs.clients.set(client, inapplicableItems.refs.slice(inapplicableItems.i)); 2617 clientsStructRefs.delete(client); 2618 inapplicableItems.i = 0; 2619 inapplicableItems.refs = []; 2620 } else { 2621 restStructs.clients.set(client, [item]); 2622 } 2623 clientsStructRefsIds = clientsStructRefsIds.filter((c) => c !== client); 2624 } 2625 stack.length = 0; 2626 }; 2627 while (true) { 2628 if (stackHead.constructor !== Skip) { 2629 const localClock = setIfUndefined(state, stackHead.id.client, () => getState(store, stackHead.id.client)); 2630 const offset = localClock - stackHead.id.clock; 2631 if (offset < 0) { 2632 stack.push(stackHead); 2633 updateMissingSv(stackHead.id.client, stackHead.id.clock - 1); 2634 addStackToRestSS(); 2635 } else { 2636 const missing = stackHead.getMissing(transaction, store); 2637 if (missing !== null) { 2638 stack.push(stackHead); 2639 const structRefs = clientsStructRefs.get( 2640 /** @type {number} */ 2641 missing 2642 ) || { refs: [], i: 0 }; 2643 if (structRefs.refs.length === structRefs.i) { 2644 updateMissingSv( 2645 /** @type {number} */ 2646 missing, 2647 getState(store, missing) 2648 ); 2649 addStackToRestSS(); 2650 } else { 2651 stackHead = structRefs.refs[structRefs.i++]; 2652 continue; 2653 } 2654 } else if (offset === 0 || offset < stackHead.length) { 2655 stackHead.integrate(transaction, offset); 2656 state.set(stackHead.id.client, stackHead.id.clock + stackHead.length); 2657 } 2658 } 2659 } 2660 if (stack.length > 0) { 2661 stackHead = /** @type {GC|Item} */ 2662 stack.pop(); 2663 } else if (curStructsTarget !== null && curStructsTarget.i < curStructsTarget.refs.length) { 2664 stackHead = /** @type {GC|Item} */ 2665 curStructsTarget.refs[curStructsTarget.i++]; 2666 } else { 2667 curStructsTarget = getNextStructTarget(); 2668 if (curStructsTarget === null) { 2669 break; 2670 } else { 2671 stackHead = /** @type {GC|Item} */ 2672 curStructsTarget.refs[curStructsTarget.i++]; 2673 } 2674 } 2675 } 2676 if (restStructs.clients.size > 0) { 2677 const encoder = new UpdateEncoderV2(); 2678 writeClientsStructs(encoder, restStructs, /* @__PURE__ */ new Map()); 2679 writeVarUint(encoder.restEncoder, 0); 2680 return { missing: missingSV, update: encoder.toUint8Array() }; 2681 } 2682 return null; 2683 }; 2684 var writeStructsFromTransaction = (encoder, transaction) => writeClientsStructs(encoder, transaction.doc.store, transaction.beforeState); 2685 var readUpdateV2 = (decoder, ydoc, transactionOrigin, structDecoder = new UpdateDecoderV2(decoder)) => transact(ydoc, (transaction) => { 2686 transaction.local = false; 2687 let retry = false; 2688 const doc2 = transaction.doc; 2689 const store = doc2.store; 2690 const ss = readClientsStructRefs(structDecoder, doc2); 2691 const restStructs = integrateStructs(transaction, store, ss); 2692 const pending = store.pendingStructs; 2693 if (pending) { 2694 for (const [client, clock] of pending.missing) { 2695 if (clock < getState(store, client)) { 2696 retry = true; 2697 break; 2698 } 2699 } 2700 if (restStructs) { 2701 for (const [client, clock] of restStructs.missing) { 2702 const mclock = pending.missing.get(client); 2703 if (mclock == null || mclock > clock) { 2704 pending.missing.set(client, clock); 2705 } 2706 } 2707 pending.update = mergeUpdatesV2([pending.update, restStructs.update]); 2708 } 2709 } else { 2710 store.pendingStructs = restStructs; 2711 } 2712 const dsRest = readAndApplyDeleteSet(structDecoder, transaction, store); 2713 if (store.pendingDs) { 2714 const pendingDSUpdate = new UpdateDecoderV2(createDecoder(store.pendingDs)); 2715 readVarUint(pendingDSUpdate.restDecoder); 2716 const dsRest2 = readAndApplyDeleteSet(pendingDSUpdate, transaction, store); 2717 if (dsRest && dsRest2) { 2718 store.pendingDs = mergeUpdatesV2([dsRest, dsRest2]); 2719 } else { 2720 store.pendingDs = dsRest || dsRest2; 2721 } 2722 } else { 2723 store.pendingDs = dsRest; 2724 } 2725 if (retry) { 2726 const update = ( 2727 /** @type {{update: Uint8Array}} */ 2728 store.pendingStructs.update 2729 ); 2730 store.pendingStructs = null; 2731 applyUpdateV2(transaction.doc, update); 2732 } 2733 }, transactionOrigin, false); 2734 var readUpdate = (decoder, ydoc, transactionOrigin) => readUpdateV2(decoder, ydoc, transactionOrigin, new UpdateDecoderV1(decoder)); 2735 var applyUpdateV2 = (ydoc, update, transactionOrigin, YDecoder = UpdateDecoderV2) => { 2736 const decoder = createDecoder(update); 2737 readUpdateV2(decoder, ydoc, transactionOrigin, new YDecoder(decoder)); 2738 }; 2739 var applyUpdate = (ydoc, update, transactionOrigin) => applyUpdateV2(ydoc, update, transactionOrigin, UpdateDecoderV1); 2740 var writeStateAsUpdate = (encoder, doc2, targetStateVector = /* @__PURE__ */ new Map()) => { 2741 writeClientsStructs(encoder, doc2.store, targetStateVector); 2742 writeDeleteSet(encoder, createDeleteSetFromStructStore(doc2.store)); 2743 }; 2744 var encodeStateAsUpdateV2 = (doc2, encodedTargetStateVector = new Uint8Array([0]), encoder = new UpdateEncoderV2()) => { 2745 const targetStateVector = decodeStateVector(encodedTargetStateVector); 2746 writeStateAsUpdate(encoder, doc2, targetStateVector); 2747 const updates = [encoder.toUint8Array()]; 2748 if (doc2.store.pendingDs) { 2749 updates.push(doc2.store.pendingDs); 2750 } 2751 if (doc2.store.pendingStructs) { 2752 updates.push(diffUpdateV2(doc2.store.pendingStructs.update, encodedTargetStateVector)); 2753 } 2754 if (updates.length > 1) { 2755 if (encoder.constructor === UpdateEncoderV1) { 2756 return mergeUpdates(updates.map((update, i) => i === 0 ? update : convertUpdateFormatV2ToV1(update))); 2757 } else if (encoder.constructor === UpdateEncoderV2) { 2758 return mergeUpdatesV2(updates); 2759 } 2760 } 2761 return updates[0]; 2762 }; 2763 var encodeStateAsUpdate = (doc2, encodedTargetStateVector) => encodeStateAsUpdateV2(doc2, encodedTargetStateVector, new UpdateEncoderV1()); 2764 var readStateVector = (decoder) => { 2765 const ss = /* @__PURE__ */ new Map(); 2766 const ssLength = readVarUint(decoder.restDecoder); 2767 for (let i = 0; i < ssLength; i++) { 2768 const client = readVarUint(decoder.restDecoder); 2769 const clock = readVarUint(decoder.restDecoder); 2770 ss.set(client, clock); 2771 } 2772 return ss; 2773 }; 2774 var decodeStateVector = (decodedState) => readStateVector(new DSDecoderV1(createDecoder(decodedState))); 2775 var writeStateVector = (encoder, sv) => { 2776 writeVarUint(encoder.restEncoder, sv.size); 2777 from(sv.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => { 2778 writeVarUint(encoder.restEncoder, client); 2779 writeVarUint(encoder.restEncoder, clock); 2780 }); 2781 return encoder; 2782 }; 2783 var writeDocumentStateVector = (encoder, doc2) => writeStateVector(encoder, getStateVector(doc2.store)); 2784 var encodeStateVectorV2 = (doc2, encoder = new DSEncoderV2()) => { 2785 if (doc2 instanceof Map) { 2786 writeStateVector(encoder, doc2); 2787 } else { 2788 writeDocumentStateVector(encoder, doc2); 2789 } 2790 return encoder.toUint8Array(); 2791 }; 2792 var encodeStateVector = (doc2) => encodeStateVectorV2(doc2, new DSEncoderV1()); 2793 var EventHandler = class { 2794 constructor() { 2795 this.l = []; 2796 } 2797 }; 2798 var createEventHandler = () => new EventHandler(); 2799 var addEventHandlerListener = (eventHandler, f) => eventHandler.l.push(f); 2800 var removeEventHandlerListener = (eventHandler, f) => { 2801 const l = eventHandler.l; 2802 const len = l.length; 2803 eventHandler.l = l.filter((g) => f !== g); 2804 if (len === eventHandler.l.length) { 2805 console.error("[yjs] Tried to remove event handler that doesn't exist."); 2806 } 2807 }; 2808 var callEventHandlerListeners = (eventHandler, arg0, arg1) => callAll(eventHandler.l, [arg0, arg1]); 2809 var ID = class { 2810 /** 2811 * @param {number} client client id 2812 * @param {number} clock unique per client id, continuous number 2813 */ 2814 constructor(client, clock) { 2815 this.client = client; 2816 this.clock = clock; 2817 } 2818 }; 2819 var compareIDs = (a, b) => a === b || a !== null && b !== null && a.client === b.client && a.clock === b.clock; 2820 var createID = (client, clock) => new ID(client, clock); 2821 var writeID = (encoder, id2) => { 2822 writeVarUint(encoder, id2.client); 2823 writeVarUint(encoder, id2.clock); 2824 }; 2825 var readID = (decoder) => createID(readVarUint(decoder), readVarUint(decoder)); 2826 var findRootTypeKey = (type) => { 2827 for (const [key, value] of type.doc.share.entries()) { 2828 if (value === type) { 2829 return key; 2830 } 2831 } 2832 throw unexpectedCase(); 2833 }; 2834 var isParentOf = (parent, child) => { 2835 while (child !== null) { 2836 if (child.parent === parent) { 2837 return true; 2838 } 2839 child = /** @type {AbstractType<any>} */ 2840 child.parent._item; 2841 } 2842 return false; 2843 }; 2844 var logType = (type) => { 2845 const res = []; 2846 let n = type._start; 2847 while (n) { 2848 res.push(n); 2849 n = n.right; 2850 } 2851 console.log("Children: ", res); 2852 console.log("Children content: ", res.filter((m) => !m.deleted).map((m) => m.content)); 2853 }; 2854 var PermanentUserData = class { 2855 /** 2856 * @param {Doc} doc 2857 * @param {YMap<any>} [storeType] 2858 */ 2859 constructor(doc2, storeType = doc2.getMap("users")) { 2860 const dss = /* @__PURE__ */ new Map(); 2861 this.yusers = storeType; 2862 this.doc = doc2; 2863 this.clients = /* @__PURE__ */ new Map(); 2864 this.dss = dss; 2865 const initUser = (user, userDescription) => { 2866 const ds = user.get("ds"); 2867 const ids = user.get("ids"); 2868 const addClientId = ( 2869 /** @param {number} clientid */ 2870 (clientid) => this.clients.set(clientid, userDescription) 2871 ); 2872 ds.observe( 2873 /** @param {YArrayEvent<any>} event */ 2874 (event) => { 2875 event.changes.added.forEach((item) => { 2876 item.content.getContent().forEach((encodedDs) => { 2877 if (encodedDs instanceof Uint8Array) { 2878 this.dss.set(userDescription, mergeDeleteSets([this.dss.get(userDescription) || createDeleteSet(), readDeleteSet(new DSDecoderV1(createDecoder(encodedDs)))])); 2879 } 2880 }); 2881 }); 2882 } 2883 ); 2884 this.dss.set(userDescription, mergeDeleteSets(ds.map((encodedDs) => readDeleteSet(new DSDecoderV1(createDecoder(encodedDs)))))); 2885 ids.observe( 2886 /** @param {YArrayEvent<any>} event */ 2887 (event) => event.changes.added.forEach((item) => item.content.getContent().forEach(addClientId)) 2888 ); 2889 ids.forEach(addClientId); 2890 }; 2891 storeType.observe((event) => { 2892 event.keysChanged.forEach( 2893 (userDescription) => initUser(storeType.get(userDescription), userDescription) 2894 ); 2895 }); 2896 storeType.forEach(initUser); 2897 } 2898 /** 2899 * @param {Doc} doc 2900 * @param {number} clientid 2901 * @param {string} userDescription 2902 * @param {Object} conf 2903 * @param {function(Transaction, DeleteSet):boolean} [conf.filter] 2904 */ 2905 setUserMapping(doc2, clientid, userDescription, { filter = () => true } = {}) { 2906 const users = this.yusers; 2907 let user = users.get(userDescription); 2908 if (!user) { 2909 user = new YMap(); 2910 user.set("ids", new YArray()); 2911 user.set("ds", new YArray()); 2912 users.set(userDescription, user); 2913 } 2914 user.get("ids").push([clientid]); 2915 users.observe((_event) => { 2916 setTimeout(() => { 2917 const userOverwrite = users.get(userDescription); 2918 if (userOverwrite !== user) { 2919 user = userOverwrite; 2920 this.clients.forEach((_userDescription, clientid2) => { 2921 if (userDescription === _userDescription) { 2922 user.get("ids").push([clientid2]); 2923 } 2924 }); 2925 const encoder = new DSEncoderV1(); 2926 const ds = this.dss.get(userDescription); 2927 if (ds) { 2928 writeDeleteSet(encoder, ds); 2929 user.get("ds").push([encoder.toUint8Array()]); 2930 } 2931 } 2932 }, 0); 2933 }); 2934 doc2.on( 2935 "afterTransaction", 2936 /** @param {Transaction} transaction */ 2937 (transaction) => { 2938 setTimeout(() => { 2939 const yds = user.get("ds"); 2940 const ds = transaction.deleteSet; 2941 if (transaction.local && ds.clients.size > 0 && filter(transaction, ds)) { 2942 const encoder = new DSEncoderV1(); 2943 writeDeleteSet(encoder, ds); 2944 yds.push([encoder.toUint8Array()]); 2945 } 2946 }); 2947 } 2948 ); 2949 } 2950 /** 2951 * @param {number} clientid 2952 * @return {any} 2953 */ 2954 getUserByClientId(clientid) { 2955 return this.clients.get(clientid) || null; 2956 } 2957 /** 2958 * @param {ID} id 2959 * @return {string | null} 2960 */ 2961 getUserByDeletedId(id2) { 2962 for (const [userDescription, ds] of this.dss.entries()) { 2963 if (isDeleted(ds, id2)) { 2964 return userDescription; 2965 } 2966 } 2967 return null; 2968 } 2969 }; 2970 var RelativePosition = class { 2971 /** 2972 * @param {ID|null} type 2973 * @param {string|null} tname 2974 * @param {ID|null} item 2975 * @param {number} assoc 2976 */ 2977 constructor(type, tname, item, assoc = 0) { 2978 this.type = type; 2979 this.tname = tname; 2980 this.item = item; 2981 this.assoc = assoc; 2982 } 2983 }; 2984 var relativePositionToJSON = (rpos) => { 2985 const json = {}; 2986 if (rpos.type) { 2987 json.type = rpos.type; 2988 } 2989 if (rpos.tname) { 2990 json.tname = rpos.tname; 2991 } 2992 if (rpos.item) { 2993 json.item = rpos.item; 2994 } 2995 if (rpos.assoc != null) { 2996 json.assoc = rpos.assoc; 2997 } 2998 return json; 2999 }; 3000 var createRelativePositionFromJSON = (json) => new RelativePosition(json.type == null ? null : createID(json.type.client, json.type.clock), json.tname ?? null, json.item == null ? null : createID(json.item.client, json.item.clock), json.assoc == null ? 0 : json.assoc); 3001 var AbsolutePosition = class { 3002 /** 3003 * @param {AbstractType<any>} type 3004 * @param {number} index 3005 * @param {number} [assoc] 3006 */ 3007 constructor(type, index, assoc = 0) { 3008 this.type = type; 3009 this.index = index; 3010 this.assoc = assoc; 3011 } 3012 }; 3013 var createAbsolutePosition = (type, index, assoc = 0) => new AbsolutePosition(type, index, assoc); 3014 var createRelativePosition = (type, item, assoc) => { 3015 let typeid = null; 3016 let tname = null; 3017 if (type._item === null) { 3018 tname = findRootTypeKey(type); 3019 } else { 3020 typeid = createID(type._item.id.client, type._item.id.clock); 3021 } 3022 return new RelativePosition(typeid, tname, item, assoc); 3023 }; 3024 var createRelativePositionFromTypeIndex = (type, index, assoc = 0) => { 3025 let t = type._start; 3026 if (assoc < 0) { 3027 if (index === 0) { 3028 return createRelativePosition(type, null, assoc); 3029 } 3030 index--; 3031 } 3032 while (t !== null) { 3033 if (!t.deleted && t.countable) { 3034 if (t.length > index) { 3035 return createRelativePosition(type, createID(t.id.client, t.id.clock + index), assoc); 3036 } 3037 index -= t.length; 3038 } 3039 if (t.right === null && assoc < 0) { 3040 return createRelativePosition(type, t.lastId, assoc); 3041 } 3042 t = t.right; 3043 } 3044 return createRelativePosition(type, null, assoc); 3045 }; 3046 var writeRelativePosition = (encoder, rpos) => { 3047 const { type, tname, item, assoc } = rpos; 3048 if (item !== null) { 3049 writeVarUint(encoder, 0); 3050 writeID(encoder, item); 3051 } else if (tname !== null) { 3052 writeUint8(encoder, 1); 3053 writeVarString(encoder, tname); 3054 } else if (type !== null) { 3055 writeUint8(encoder, 2); 3056 writeID(encoder, type); 3057 } else { 3058 throw unexpectedCase(); 3059 } 3060 writeVarInt(encoder, assoc); 3061 return encoder; 3062 }; 3063 var encodeRelativePosition = (rpos) => { 3064 const encoder = createEncoder(); 3065 writeRelativePosition(encoder, rpos); 3066 return toUint8Array(encoder); 3067 }; 3068 var readRelativePosition = (decoder) => { 3069 let type = null; 3070 let tname = null; 3071 let itemID = null; 3072 switch (readVarUint(decoder)) { 3073 case 0: 3074 itemID = readID(decoder); 3075 break; 3076 case 1: 3077 tname = readVarString(decoder); 3078 break; 3079 case 2: { 3080 type = readID(decoder); 3081 } 3082 } 3083 const assoc = hasContent(decoder) ? readVarInt(decoder) : 0; 3084 return new RelativePosition(type, tname, itemID, assoc); 3085 }; 3086 var decodeRelativePosition = (uint8Array) => readRelativePosition(createDecoder(uint8Array)); 3087 var getItemWithOffset = (store, id2) => { 3088 const item = getItem(store, id2); 3089 const diff = id2.clock - item.id.clock; 3090 return { 3091 item, 3092 diff 3093 }; 3094 }; 3095 var createAbsolutePositionFromRelativePosition = (rpos, doc2, followUndoneDeletions = true) => { 3096 const store = doc2.store; 3097 const rightID = rpos.item; 3098 const typeID = rpos.type; 3099 const tname = rpos.tname; 3100 const assoc = rpos.assoc; 3101 let type = null; 3102 let index = 0; 3103 if (rightID !== null) { 3104 if (getState(store, rightID.client) <= rightID.clock) { 3105 return null; 3106 } 3107 const res = followUndoneDeletions ? followRedone(store, rightID) : getItemWithOffset(store, rightID); 3108 const right = res.item; 3109 if (!(right instanceof Item)) { 3110 return null; 3111 } 3112 type = /** @type {AbstractType<any>} */ 3113 right.parent; 3114 if (type._item === null || !type._item.deleted) { 3115 index = right.deleted || !right.countable ? 0 : res.diff + (assoc >= 0 ? 0 : 1); 3116 let n = right.left; 3117 while (n !== null) { 3118 if (!n.deleted && n.countable) { 3119 index += n.length; 3120 } 3121 n = n.left; 3122 } 3123 } 3124 } else { 3125 if (tname !== null) { 3126 type = doc2.get(tname); 3127 } else if (typeID !== null) { 3128 if (getState(store, typeID.client) <= typeID.clock) { 3129 return null; 3130 } 3131 const { item } = followUndoneDeletions ? followRedone(store, typeID) : { item: getItem(store, typeID) }; 3132 if (item instanceof Item && item.content instanceof ContentType) { 3133 type = item.content.type; 3134 } else { 3135 return null; 3136 } 3137 } else { 3138 throw unexpectedCase(); 3139 } 3140 if (assoc >= 0) { 3141 index = type._length; 3142 } else { 3143 index = 0; 3144 } 3145 } 3146 return createAbsolutePosition(type, index, rpos.assoc); 3147 }; 3148 var compareRelativePositions = (a, b) => a === b || a !== null && b !== null && a.tname === b.tname && compareIDs(a.item, b.item) && compareIDs(a.type, b.type) && a.assoc === b.assoc; 3149 var Snapshot = class { 3150 /** 3151 * @param {DeleteSet} ds 3152 * @param {Map<number,number>} sv state map 3153 */ 3154 constructor(ds, sv) { 3155 this.ds = ds; 3156 this.sv = sv; 3157 } 3158 }; 3159 var equalSnapshots = (snap1, snap2) => { 3160 const ds1 = snap1.ds.clients; 3161 const ds2 = snap2.ds.clients; 3162 const sv1 = snap1.sv; 3163 const sv2 = snap2.sv; 3164 if (sv1.size !== sv2.size || ds1.size !== ds2.size) { 3165 return false; 3166 } 3167 for (const [key, value] of sv1.entries()) { 3168 if (sv2.get(key) !== value) { 3169 return false; 3170 } 3171 } 3172 for (const [client, dsitems1] of ds1.entries()) { 3173 const dsitems2 = ds2.get(client) || []; 3174 if (dsitems1.length !== dsitems2.length) { 3175 return false; 3176 } 3177 for (let i = 0; i < dsitems1.length; i++) { 3178 const dsitem1 = dsitems1[i]; 3179 const dsitem2 = dsitems2[i]; 3180 if (dsitem1.clock !== dsitem2.clock || dsitem1.len !== dsitem2.len) { 3181 return false; 3182 } 3183 } 3184 } 3185 return true; 3186 }; 3187 var encodeSnapshotV2 = (snapshot2, encoder = new DSEncoderV2()) => { 3188 writeDeleteSet(encoder, snapshot2.ds); 3189 writeStateVector(encoder, snapshot2.sv); 3190 return encoder.toUint8Array(); 3191 }; 3192 var encodeSnapshot = (snapshot2) => encodeSnapshotV2(snapshot2, new DSEncoderV1()); 3193 var decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(createDecoder(buf))) => { 3194 return new Snapshot(readDeleteSet(decoder), readStateVector(decoder)); 3195 }; 3196 var decodeSnapshot = (buf) => decodeSnapshotV2(buf, new DSDecoderV1(createDecoder(buf))); 3197 var createSnapshot = (ds, sm) => new Snapshot(ds, sm); 3198 var emptySnapshot = createSnapshot(createDeleteSet(), /* @__PURE__ */ new Map()); 3199 var snapshot = (doc2) => createSnapshot(createDeleteSetFromStructStore(doc2.store), getStateVector(doc2.store)); 3200 var isVisible = (item, snapshot2) => snapshot2 === void 0 ? !item.deleted : snapshot2.sv.has(item.id.client) && (snapshot2.sv.get(item.id.client) || 0) > item.id.clock && !isDeleted(snapshot2.ds, item.id); 3201 var splitSnapshotAffectedStructs = (transaction, snapshot2) => { 3202 const meta = setIfUndefined(transaction.meta, splitSnapshotAffectedStructs, create2); 3203 const store = transaction.doc.store; 3204 if (!meta.has(snapshot2)) { 3205 snapshot2.sv.forEach((clock, client) => { 3206 if (clock < getState(store, client)) { 3207 getItemCleanStart(transaction, createID(client, clock)); 3208 } 3209 }); 3210 iterateDeletedStructs(transaction, snapshot2.ds, (_item) => { 3211 }); 3212 meta.add(snapshot2); 3213 } 3214 }; 3215 var createDocFromSnapshot = (originDoc, snapshot2, newDoc = new Doc()) => { 3216 if (originDoc.gc) { 3217 throw new Error("Garbage-collection must be disabled in `originDoc`!"); 3218 } 3219 const { sv, ds } = snapshot2; 3220 const encoder = new UpdateEncoderV2(); 3221 originDoc.transact((transaction) => { 3222 let size2 = 0; 3223 sv.forEach((clock) => { 3224 if (clock > 0) { 3225 size2++; 3226 } 3227 }); 3228 writeVarUint(encoder.restEncoder, size2); 3229 for (const [client, clock] of sv) { 3230 if (clock === 0) { 3231 continue; 3232 } 3233 if (clock < getState(originDoc.store, client)) { 3234 getItemCleanStart(transaction, createID(client, clock)); 3235 } 3236 const structs = originDoc.store.clients.get(client) || []; 3237 const lastStructIndex = findIndexSS(structs, clock - 1); 3238 writeVarUint(encoder.restEncoder, lastStructIndex + 1); 3239 encoder.writeClient(client); 3240 writeVarUint(encoder.restEncoder, 0); 3241 for (let i = 0; i <= lastStructIndex; i++) { 3242 structs[i].write(encoder, 0); 3243 } 3244 } 3245 writeDeleteSet(encoder, ds); 3246 }); 3247 applyUpdateV2(newDoc, encoder.toUint8Array(), "snapshot"); 3248 return newDoc; 3249 }; 3250 var snapshotContainsUpdateV2 = (snapshot2, update, YDecoder = UpdateDecoderV2) => { 3251 const updateDecoder = new YDecoder(createDecoder(update)); 3252 const lazyDecoder = new LazyStructReader(updateDecoder, false); 3253 for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { 3254 if ((snapshot2.sv.get(curr.id.client) || 0) < curr.id.clock + curr.length) { 3255 return false; 3256 } 3257 } 3258 const mergedDS = mergeDeleteSets([snapshot2.ds, readDeleteSet(updateDecoder)]); 3259 return equalDeleteSets(snapshot2.ds, mergedDS); 3260 }; 3261 var snapshotContainsUpdate = (snapshot2, update) => snapshotContainsUpdateV2(snapshot2, update, UpdateDecoderV1); 3262 var StructStore = class { 3263 constructor() { 3264 this.clients = /* @__PURE__ */ new Map(); 3265 this.pendingStructs = null; 3266 this.pendingDs = null; 3267 } 3268 }; 3269 var getStateVector = (store) => { 3270 const sm = /* @__PURE__ */ new Map(); 3271 store.clients.forEach((structs, client) => { 3272 const struct = structs[structs.length - 1]; 3273 sm.set(client, struct.id.clock + struct.length); 3274 }); 3275 return sm; 3276 }; 3277 var getState = (store, client) => { 3278 const structs = store.clients.get(client); 3279 if (structs === void 0) { 3280 return 0; 3281 } 3282 const lastStruct = structs[structs.length - 1]; 3283 return lastStruct.id.clock + lastStruct.length; 3284 }; 3285 var addStruct = (store, struct) => { 3286 let structs = store.clients.get(struct.id.client); 3287 if (structs === void 0) { 3288 structs = []; 3289 store.clients.set(struct.id.client, structs); 3290 } else { 3291 const lastStruct = structs[structs.length - 1]; 3292 if (lastStruct.id.clock + lastStruct.length !== struct.id.clock) { 3293 throw unexpectedCase(); 3294 } 3295 } 3296 structs.push(struct); 3297 }; 3298 var findIndexSS = (structs, clock) => { 3299 let left = 0; 3300 let right = structs.length - 1; 3301 let mid = structs[right]; 3302 let midclock = mid.id.clock; 3303 if (midclock === clock) { 3304 return right; 3305 } 3306 let midindex = floor(clock / (midclock + mid.length - 1) * right); 3307 while (left <= right) { 3308 mid = structs[midindex]; 3309 midclock = mid.id.clock; 3310 if (midclock <= clock) { 3311 if (clock < midclock + mid.length) { 3312 return midindex; 3313 } 3314 left = midindex + 1; 3315 } else { 3316 right = midindex - 1; 3317 } 3318 midindex = floor((left + right) / 2); 3319 } 3320 throw unexpectedCase(); 3321 }; 3322 var find = (store, id2) => { 3323 const structs = store.clients.get(id2.client); 3324 return structs[findIndexSS(structs, id2.clock)]; 3325 }; 3326 var getItem = ( 3327 /** @type {function(StructStore,ID):Item} */ 3328 find 3329 ); 3330 var findIndexCleanStart = (transaction, structs, clock) => { 3331 const index = findIndexSS(structs, clock); 3332 const struct = structs[index]; 3333 if (struct.id.clock < clock && struct instanceof Item) { 3334 structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock)); 3335 return index + 1; 3336 } 3337 return index; 3338 }; 3339 var getItemCleanStart = (transaction, id2) => { 3340 const structs = ( 3341 /** @type {Array<Item>} */ 3342 transaction.doc.store.clients.get(id2.client) 3343 ); 3344 return structs[findIndexCleanStart(transaction, structs, id2.clock)]; 3345 }; 3346 var getItemCleanEnd = (transaction, store, id2) => { 3347 const structs = store.clients.get(id2.client); 3348 const index = findIndexSS(structs, id2.clock); 3349 const struct = structs[index]; 3350 if (id2.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) { 3351 structs.splice(index + 1, 0, splitItem(transaction, struct, id2.clock - struct.id.clock + 1)); 3352 } 3353 return struct; 3354 }; 3355 var replaceStruct = (store, struct, newStruct) => { 3356 const structs = ( 3357 /** @type {Array<GC|Item>} */ 3358 store.clients.get(struct.id.client) 3359 ); 3360 structs[findIndexSS(structs, struct.id.clock)] = newStruct; 3361 }; 3362 var iterateStructs = (transaction, structs, clockStart, len, f) => { 3363 if (len === 0) { 3364 return; 3365 } 3366 const clockEnd = clockStart + len; 3367 let index = findIndexCleanStart(transaction, structs, clockStart); 3368 let struct; 3369 do { 3370 struct = structs[index++]; 3371 if (clockEnd < struct.id.clock + struct.length) { 3372 findIndexCleanStart(transaction, structs, clockEnd); 3373 } 3374 f(struct); 3375 } while (index < structs.length && structs[index].id.clock < clockEnd); 3376 }; 3377 var Transaction = class { 3378 /** 3379 * @param {Doc} doc 3380 * @param {any} origin 3381 * @param {boolean} local 3382 */ 3383 constructor(doc2, origin2, local) { 3384 this.doc = doc2; 3385 this.deleteSet = new DeleteSet(); 3386 this.beforeState = getStateVector(doc2.store); 3387 this.afterState = /* @__PURE__ */ new Map(); 3388 this.changed = /* @__PURE__ */ new Map(); 3389 this.changedParentTypes = /* @__PURE__ */ new Map(); 3390 this._mergeStructs = []; 3391 this.origin = origin2; 3392 this.meta = /* @__PURE__ */ new Map(); 3393 this.local = local; 3394 this.subdocsAdded = /* @__PURE__ */ new Set(); 3395 this.subdocsRemoved = /* @__PURE__ */ new Set(); 3396 this.subdocsLoaded = /* @__PURE__ */ new Set(); 3397 this._needFormattingCleanup = false; 3398 } 3399 }; 3400 var writeUpdateMessageFromTransaction = (encoder, transaction) => { 3401 if (transaction.deleteSet.clients.size === 0 && !any(transaction.afterState, (clock, client) => transaction.beforeState.get(client) !== clock)) { 3402 return false; 3403 } 3404 sortAndMergeDeleteSet(transaction.deleteSet); 3405 writeStructsFromTransaction(encoder, transaction); 3406 writeDeleteSet(encoder, transaction.deleteSet); 3407 return true; 3408 }; 3409 var addChangedTypeToTransaction = (transaction, type, parentSub) => { 3410 const item = type._item; 3411 if (item === null || item.id.clock < (transaction.beforeState.get(item.id.client) || 0) && !item.deleted) { 3412 setIfUndefined(transaction.changed, type, create2).add(parentSub); 3413 } 3414 }; 3415 var tryToMergeWithLefts = (structs, pos) => { 3416 let right = structs[pos]; 3417 let left = structs[pos - 1]; 3418 let i = pos; 3419 for (; i > 0; right = left, left = structs[--i - 1]) { 3420 if (left.deleted === right.deleted && left.constructor === right.constructor) { 3421 if (left.mergeWith(right)) { 3422 if (right instanceof Item && right.parentSub !== null && /** @type {AbstractType<any>} */ 3423 right.parent._map.get(right.parentSub) === right) { 3424 right.parent._map.set( 3425 right.parentSub, 3426 /** @type {Item} */ 3427 left 3428 ); 3429 } 3430 continue; 3431 } 3432 } 3433 break; 3434 } 3435 const merged = pos - i; 3436 if (merged) { 3437 structs.splice(pos + 1 - merged, merged); 3438 } 3439 return merged; 3440 }; 3441 var tryGcDeleteSet = (ds, store, gcFilter) => { 3442 for (const [client, deleteItems] of ds.clients.entries()) { 3443 const structs = ( 3444 /** @type {Array<GC|Item>} */ 3445 store.clients.get(client) 3446 ); 3447 for (let di = deleteItems.length - 1; di >= 0; di--) { 3448 const deleteItem = deleteItems[di]; 3449 const endDeleteItemClock = deleteItem.clock + deleteItem.len; 3450 for (let si = findIndexSS(structs, deleteItem.clock), struct = structs[si]; si < structs.length && struct.id.clock < endDeleteItemClock; struct = structs[++si]) { 3451 const struct2 = structs[si]; 3452 if (deleteItem.clock + deleteItem.len <= struct2.id.clock) { 3453 break; 3454 } 3455 if (struct2 instanceof Item && struct2.deleted && !struct2.keep && gcFilter(struct2)) { 3456 struct2.gc(store, false); 3457 } 3458 } 3459 } 3460 } 3461 }; 3462 var tryMergeDeleteSet = (ds, store) => { 3463 ds.clients.forEach((deleteItems, client) => { 3464 const structs = ( 3465 /** @type {Array<GC|Item>} */ 3466 store.clients.get(client) 3467 ); 3468 for (let di = deleteItems.length - 1; di >= 0; di--) { 3469 const deleteItem = deleteItems[di]; 3470 const mostRightIndexToCheck = min(structs.length - 1, 1 + findIndexSS(structs, deleteItem.clock + deleteItem.len - 1)); 3471 for (let si = mostRightIndexToCheck, struct = structs[si]; si > 0 && struct.id.clock >= deleteItem.clock; struct = structs[si]) { 3472 si -= 1 + tryToMergeWithLefts(structs, si); 3473 } 3474 } 3475 }); 3476 }; 3477 var tryGc = (ds, store, gcFilter) => { 3478 tryGcDeleteSet(ds, store, gcFilter); 3479 tryMergeDeleteSet(ds, store); 3480 }; 3481 var cleanupTransactions = (transactionCleanups, i) => { 3482 if (i < transactionCleanups.length) { 3483 const transaction = transactionCleanups[i]; 3484 const doc2 = transaction.doc; 3485 const store = doc2.store; 3486 const ds = transaction.deleteSet; 3487 const mergeStructs = transaction._mergeStructs; 3488 try { 3489 sortAndMergeDeleteSet(ds); 3490 transaction.afterState = getStateVector(transaction.doc.store); 3491 doc2.emit("beforeObserverCalls", [transaction, doc2]); 3492 const fs = []; 3493 transaction.changed.forEach( 3494 (subs, itemtype) => fs.push(() => { 3495 if (itemtype._item === null || !itemtype._item.deleted) { 3496 itemtype._callObserver(transaction, subs); 3497 } 3498 }) 3499 ); 3500 fs.push(() => { 3501 transaction.changedParentTypes.forEach((events, type) => { 3502 if (type._dEH.l.length > 0 && (type._item === null || !type._item.deleted)) { 3503 events = events.filter( 3504 (event) => event.target._item === null || !event.target._item.deleted 3505 ); 3506 events.forEach((event) => { 3507 event.currentTarget = type; 3508 event._path = null; 3509 }); 3510 events.sort((event1, event2) => event1.path.length - event2.path.length); 3511 fs.push(() => { 3512 callEventHandlerListeners(type._dEH, events, transaction); 3513 }); 3514 } 3515 }); 3516 fs.push(() => doc2.emit("afterTransaction", [transaction, doc2])); 3517 fs.push(() => { 3518 if (transaction._needFormattingCleanup) { 3519 cleanupYTextAfterTransaction(transaction); 3520 } 3521 }); 3522 }); 3523 callAll(fs, []); 3524 } finally { 3525 if (doc2.gc) { 3526 tryGcDeleteSet(ds, store, doc2.gcFilter); 3527 } 3528 tryMergeDeleteSet(ds, store); 3529 transaction.afterState.forEach((clock, client) => { 3530 const beforeClock = transaction.beforeState.get(client) || 0; 3531 if (beforeClock !== clock) { 3532 const structs = ( 3533 /** @type {Array<GC|Item>} */ 3534 store.clients.get(client) 3535 ); 3536 const firstChangePos = max(findIndexSS(structs, beforeClock), 1); 3537 for (let i2 = structs.length - 1; i2 >= firstChangePos; ) { 3538 i2 -= 1 + tryToMergeWithLefts(structs, i2); 3539 } 3540 } 3541 }); 3542 for (let i2 = mergeStructs.length - 1; i2 >= 0; i2--) { 3543 const { client, clock } = mergeStructs[i2].id; 3544 const structs = ( 3545 /** @type {Array<GC|Item>} */ 3546 store.clients.get(client) 3547 ); 3548 const replacedStructPos = findIndexSS(structs, clock); 3549 if (replacedStructPos + 1 < structs.length) { 3550 if (tryToMergeWithLefts(structs, replacedStructPos + 1) > 1) { 3551 continue; 3552 } 3553 } 3554 if (replacedStructPos > 0) { 3555 tryToMergeWithLefts(structs, replacedStructPos); 3556 } 3557 } 3558 if (!transaction.local && transaction.afterState.get(doc2.clientID) !== transaction.beforeState.get(doc2.clientID)) { 3559 print(ORANGE, BOLD, "[yjs] ", UNBOLD, RED, "Changed the client-id because another client seems to be using it."); 3560 doc2.clientID = generateNewClientId(); 3561 } 3562 doc2.emit("afterTransactionCleanup", [transaction, doc2]); 3563 if (doc2._observers.has("update")) { 3564 const encoder = new UpdateEncoderV1(); 3565 const hasContent2 = writeUpdateMessageFromTransaction(encoder, transaction); 3566 if (hasContent2) { 3567 doc2.emit("update", [encoder.toUint8Array(), transaction.origin, doc2, transaction]); 3568 } 3569 } 3570 if (doc2._observers.has("updateV2")) { 3571 const encoder = new UpdateEncoderV2(); 3572 const hasContent2 = writeUpdateMessageFromTransaction(encoder, transaction); 3573 if (hasContent2) { 3574 doc2.emit("updateV2", [encoder.toUint8Array(), transaction.origin, doc2, transaction]); 3575 } 3576 } 3577 const { subdocsAdded, subdocsLoaded, subdocsRemoved } = transaction; 3578 if (subdocsAdded.size > 0 || subdocsRemoved.size > 0 || subdocsLoaded.size > 0) { 3579 subdocsAdded.forEach((subdoc) => { 3580 subdoc.clientID = doc2.clientID; 3581 if (subdoc.collectionid == null) { 3582 subdoc.collectionid = doc2.collectionid; 3583 } 3584 doc2.subdocs.add(subdoc); 3585 }); 3586 subdocsRemoved.forEach((subdoc) => doc2.subdocs.delete(subdoc)); 3587 doc2.emit("subdocs", [{ loaded: subdocsLoaded, added: subdocsAdded, removed: subdocsRemoved }, doc2, transaction]); 3588 subdocsRemoved.forEach((subdoc) => subdoc.destroy()); 3589 } 3590 if (transactionCleanups.length <= i + 1) { 3591 doc2._transactionCleanups = []; 3592 doc2.emit("afterAllTransactions", [doc2, transactionCleanups]); 3593 } else { 3594 cleanupTransactions(transactionCleanups, i + 1); 3595 } 3596 } 3597 } 3598 }; 3599 var transact = (doc2, f, origin2 = null, local = true) => { 3600 const transactionCleanups = doc2._transactionCleanups; 3601 let initialCall = false; 3602 let result = null; 3603 if (doc2._transaction === null) { 3604 initialCall = true; 3605 doc2._transaction = new Transaction(doc2, origin2, local); 3606 transactionCleanups.push(doc2._transaction); 3607 if (transactionCleanups.length === 1) { 3608 doc2.emit("beforeAllTransactions", [doc2]); 3609 } 3610 doc2.emit("beforeTransaction", [doc2._transaction, doc2]); 3611 } 3612 try { 3613 result = f(doc2._transaction); 3614 } finally { 3615 if (initialCall) { 3616 const finishCleanup = doc2._transaction === transactionCleanups[0]; 3617 doc2._transaction = null; 3618 if (finishCleanup) { 3619 cleanupTransactions(transactionCleanups, 0); 3620 } 3621 } 3622 } 3623 return result; 3624 }; 3625 var StackItem = class { 3626 /** 3627 * @param {DeleteSet} deletions 3628 * @param {DeleteSet} insertions 3629 */ 3630 constructor(deletions, insertions) { 3631 this.insertions = insertions; 3632 this.deletions = deletions; 3633 this.meta = /* @__PURE__ */ new Map(); 3634 } 3635 }; 3636 var clearUndoManagerStackItem = (tr, um, stackItem) => { 3637 iterateDeletedStructs(tr, stackItem.deletions, (item) => { 3638 if (item instanceof Item && um.scope.some((type) => type === tr.doc || isParentOf( 3639 /** @type {AbstractType<any>} */ 3640 type, 3641 item 3642 ))) { 3643 keepItem(item, false); 3644 } 3645 }); 3646 }; 3647 var popStackItem = (undoManager, stack, eventType) => { 3648 let _tr = null; 3649 const doc2 = undoManager.doc; 3650 const scope = undoManager.scope; 3651 transact(doc2, (transaction) => { 3652 while (stack.length > 0 && undoManager.currStackItem === null) { 3653 const store = doc2.store; 3654 const stackItem = ( 3655 /** @type {StackItem} */ 3656 stack.pop() 3657 ); 3658 const itemsToRedo = /* @__PURE__ */ new Set(); 3659 const itemsToDelete = []; 3660 let performedChange = false; 3661 iterateDeletedStructs(transaction, stackItem.insertions, (struct) => { 3662 if (struct instanceof Item) { 3663 if (struct.redone !== null) { 3664 let { item, diff } = followRedone(store, struct.id); 3665 if (diff > 0) { 3666 item = getItemCleanStart(transaction, createID(item.id.client, item.id.clock + diff)); 3667 } 3668 struct = item; 3669 } 3670 if (!struct.deleted && scope.some((type) => type === transaction.doc || isParentOf( 3671 /** @type {AbstractType<any>} */ 3672 type, 3673 /** @type {Item} */ 3674 struct 3675 ))) { 3676 itemsToDelete.push(struct); 3677 } 3678 } 3679 }); 3680 iterateDeletedStructs(transaction, stackItem.deletions, (struct) => { 3681 if (struct instanceof Item && scope.some((type) => type === transaction.doc || isParentOf( 3682 /** @type {AbstractType<any>} */ 3683 type, 3684 struct 3685 )) && // Never redo structs in stackItem.insertions because they were created and deleted in the same capture interval. 3686 !isDeleted(stackItem.insertions, struct.id)) { 3687 itemsToRedo.add(struct); 3688 } 3689 }); 3690 itemsToRedo.forEach((struct) => { 3691 performedChange = redoItem(transaction, struct, itemsToRedo, stackItem.insertions, undoManager.ignoreRemoteMapChanges, undoManager) !== null || performedChange; 3692 }); 3693 for (let i = itemsToDelete.length - 1; i >= 0; i--) { 3694 const item = itemsToDelete[i]; 3695 if (undoManager.deleteFilter(item)) { 3696 item.delete(transaction); 3697 performedChange = true; 3698 } 3699 } 3700 undoManager.currStackItem = performedChange ? stackItem : null; 3701 } 3702 transaction.changed.forEach((subProps, type) => { 3703 if (subProps.has(null) && type._searchMarker) { 3704 type._searchMarker.length = 0; 3705 } 3706 }); 3707 _tr = transaction; 3708 }, undoManager); 3709 const res = undoManager.currStackItem; 3710 if (res != null) { 3711 const changedParentTypes = _tr.changedParentTypes; 3712 undoManager.emit("stack-item-popped", [{ stackItem: res, type: eventType, changedParentTypes, origin: undoManager }, undoManager]); 3713 undoManager.currStackItem = null; 3714 } 3715 return res; 3716 }; 3717 var UndoManager = class extends ObservableV2 { 3718 /** 3719 * @param {Doc|AbstractType<any>|Array<AbstractType<any>>} typeScope Limits the scope of the UndoManager. If this is set to a ydoc instance, all changes on that ydoc will be undone. If set to a specific type, only changes on that type or its children will be undone. Also accepts an array of types. 3720 * @param {UndoManagerOptions} options 3721 */ 3722 constructor(typeScope, { 3723 captureTimeout = 500, 3724 captureTransaction = (_tr) => true, 3725 deleteFilter = () => true, 3726 trackedOrigins = /* @__PURE__ */ new Set([null]), 3727 ignoreRemoteMapChanges = false, 3728 doc: doc2 = ( 3729 /** @type {Doc} */ 3730 isArray(typeScope) ? typeScope[0].doc : typeScope instanceof Doc ? typeScope : typeScope.doc 3731 ) 3732 } = {}) { 3733 super(); 3734 this.scope = []; 3735 this.doc = doc2; 3736 this.addToScope(typeScope); 3737 this.deleteFilter = deleteFilter; 3738 trackedOrigins.add(this); 3739 this.trackedOrigins = trackedOrigins; 3740 this.captureTransaction = captureTransaction; 3741 this.undoStack = []; 3742 this.redoStack = []; 3743 this.undoing = false; 3744 this.redoing = false; 3745 this.currStackItem = null; 3746 this.lastChange = 0; 3747 this.ignoreRemoteMapChanges = ignoreRemoteMapChanges; 3748 this.captureTimeout = captureTimeout; 3749 this.afterTransactionHandler = (transaction) => { 3750 if (!this.captureTransaction(transaction) || !this.scope.some((type) => transaction.changedParentTypes.has( 3751 /** @type {AbstractType<any>} */ 3752 type 3753 ) || type === this.doc) || !this.trackedOrigins.has(transaction.origin) && (!transaction.origin || !this.trackedOrigins.has(transaction.origin.constructor))) { 3754 return; 3755 } 3756 const undoing = this.undoing; 3757 const redoing = this.redoing; 3758 const stack = undoing ? this.redoStack : this.undoStack; 3759 if (undoing) { 3760 this.stopCapturing(); 3761 } else if (!redoing) { 3762 this.clear(false, true); 3763 } 3764 const insertions = new DeleteSet(); 3765 transaction.afterState.forEach((endClock, client) => { 3766 const startClock = transaction.beforeState.get(client) || 0; 3767 const len = endClock - startClock; 3768 if (len > 0) { 3769 addToDeleteSet(insertions, client, startClock, len); 3770 } 3771 }); 3772 const now = getUnixTime(); 3773 let didAdd = false; 3774 if (this.lastChange > 0 && now - this.lastChange < this.captureTimeout && stack.length > 0 && !undoing && !redoing) { 3775 const lastOp = stack[stack.length - 1]; 3776 lastOp.deletions = mergeDeleteSets([lastOp.deletions, transaction.deleteSet]); 3777 lastOp.insertions = mergeDeleteSets([lastOp.insertions, insertions]); 3778 } else { 3779 stack.push(new StackItem(transaction.deleteSet, insertions)); 3780 didAdd = true; 3781 } 3782 if (!undoing && !redoing) { 3783 this.lastChange = now; 3784 } 3785 iterateDeletedStructs( 3786 transaction, 3787 transaction.deleteSet, 3788 /** @param {Item|GC} item */ 3789 (item) => { 3790 if (item instanceof Item && this.scope.some((type) => type === transaction.doc || isParentOf( 3791 /** @type {AbstractType<any>} */ 3792 type, 3793 item 3794 ))) { 3795 keepItem(item, true); 3796 } 3797 } 3798 ); 3799 const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? "redo" : "undo", changedParentTypes: transaction.changedParentTypes }, this]; 3800 if (didAdd) { 3801 this.emit("stack-item-added", changeEvent); 3802 } else { 3803 this.emit("stack-item-updated", changeEvent); 3804 } 3805 }; 3806 this.doc.on("afterTransaction", this.afterTransactionHandler); 3807 this.doc.on("destroy", () => { 3808 this.destroy(); 3809 }); 3810 } 3811 /** 3812 * Extend the scope. 3813 * 3814 * @param {Array<AbstractType<any> | Doc> | AbstractType<any> | Doc} ytypes 3815 */ 3816 addToScope(ytypes) { 3817 const tmpSet = new Set(this.scope); 3818 ytypes = isArray(ytypes) ? ytypes : [ytypes]; 3819 ytypes.forEach((ytype) => { 3820 if (!tmpSet.has(ytype)) { 3821 tmpSet.add(ytype); 3822 if (ytype instanceof AbstractType ? ytype.doc !== this.doc : ytype !== this.doc) warn("[yjs#509] Not same Y.Doc"); 3823 this.scope.push(ytype); 3824 } 3825 }); 3826 } 3827 /** 3828 * @param {any} origin 3829 */ 3830 addTrackedOrigin(origin2) { 3831 this.trackedOrigins.add(origin2); 3832 } 3833 /** 3834 * @param {any} origin 3835 */ 3836 removeTrackedOrigin(origin2) { 3837 this.trackedOrigins.delete(origin2); 3838 } 3839 clear(clearUndoStack = true, clearRedoStack = true) { 3840 if (clearUndoStack && this.canUndo() || clearRedoStack && this.canRedo()) { 3841 this.doc.transact((tr) => { 3842 if (clearUndoStack) { 3843 this.undoStack.forEach((item) => clearUndoManagerStackItem(tr, this, item)); 3844 this.undoStack = []; 3845 } 3846 if (clearRedoStack) { 3847 this.redoStack.forEach((item) => clearUndoManagerStackItem(tr, this, item)); 3848 this.redoStack = []; 3849 } 3850 this.emit("stack-cleared", [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }]); 3851 }); 3852 } 3853 } 3854 /** 3855 * UndoManager merges Undo-StackItem if they are created within time-gap 3856 * smaller than `options.captureTimeout`. Call `um.stopCapturing()` so that the next 3857 * StackItem won't be merged. 3858 * 3859 * 3860 * @example 3861 * // without stopCapturing 3862 * ytext.insert(0, 'a') 3863 * ytext.insert(1, 'b') 3864 * um.undo() 3865 * ytext.toString() // => '' (note that 'ab' was removed) 3866 * // with stopCapturing 3867 * ytext.insert(0, 'a') 3868 * um.stopCapturing() 3869 * ytext.insert(0, 'b') 3870 * um.undo() 3871 * ytext.toString() // => 'a' (note that only 'b' was removed) 3872 * 3873 */ 3874 stopCapturing() { 3875 this.lastChange = 0; 3876 } 3877 /** 3878 * Undo last changes on type. 3879 * 3880 * @return {StackItem?} Returns StackItem if a change was applied 3881 */ 3882 undo() { 3883 this.undoing = true; 3884 let res; 3885 try { 3886 res = popStackItem(this, this.undoStack, "undo"); 3887 } finally { 3888 this.undoing = false; 3889 } 3890 return res; 3891 } 3892 /** 3893 * Redo last undo operation. 3894 * 3895 * @return {StackItem?} Returns StackItem if a change was applied 3896 */ 3897 redo() { 3898 this.redoing = true; 3899 let res; 3900 try { 3901 res = popStackItem(this, this.redoStack, "redo"); 3902 } finally { 3903 this.redoing = false; 3904 } 3905 return res; 3906 } 3907 /** 3908 * Are undo steps available? 3909 * 3910 * @return {boolean} `true` if undo is possible 3911 */ 3912 canUndo() { 3913 return this.undoStack.length > 0; 3914 } 3915 /** 3916 * Are redo steps available? 3917 * 3918 * @return {boolean} `true` if redo is possible 3919 */ 3920 canRedo() { 3921 return this.redoStack.length > 0; 3922 } 3923 destroy() { 3924 this.trackedOrigins.delete(this); 3925 this.doc.off("afterTransaction", this.afterTransactionHandler); 3926 super.destroy(); 3927 } 3928 }; 3929 function* lazyStructReaderGenerator(decoder) { 3930 const numOfStateUpdates = readVarUint(decoder.restDecoder); 3931 for (let i = 0; i < numOfStateUpdates; i++) { 3932 const numberOfStructs = readVarUint(decoder.restDecoder); 3933 const client = decoder.readClient(); 3934 let clock = readVarUint(decoder.restDecoder); 3935 for (let i2 = 0; i2 < numberOfStructs; i2++) { 3936 const info = decoder.readInfo(); 3937 if (info === 10) { 3938 const len = readVarUint(decoder.restDecoder); 3939 yield new Skip(createID(client, clock), len); 3940 clock += len; 3941 } else if ((BITS5 & info) !== 0) { 3942 const cantCopyParentInfo = (info & (BIT7 | BIT8)) === 0; 3943 const struct = new Item( 3944 createID(client, clock), 3945 null, 3946 // left 3947 (info & BIT8) === BIT8 ? decoder.readLeftID() : null, 3948 // origin 3949 null, 3950 // right 3951 (info & BIT7) === BIT7 ? decoder.readRightID() : null, 3952 // right origin 3953 // @ts-ignore Force writing a string here. 3954 cantCopyParentInfo ? decoder.readParentInfo() ? decoder.readString() : decoder.readLeftID() : null, 3955 // parent 3956 cantCopyParentInfo && (info & BIT6) === BIT6 ? decoder.readString() : null, 3957 // parentSub 3958 readItemContent(decoder, info) 3959 // item content 3960 ); 3961 yield struct; 3962 clock += struct.length; 3963 } else { 3964 const len = decoder.readLen(); 3965 yield new GC(createID(client, clock), len); 3966 clock += len; 3967 } 3968 } 3969 } 3970 } 3971 var LazyStructReader = class { 3972 /** 3973 * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder 3974 * @param {boolean} filterSkips 3975 */ 3976 constructor(decoder, filterSkips) { 3977 this.gen = lazyStructReaderGenerator(decoder); 3978 this.curr = null; 3979 this.done = false; 3980 this.filterSkips = filterSkips; 3981 this.next(); 3982 } 3983 /** 3984 * @return {Item | GC | Skip |null} 3985 */ 3986 next() { 3987 do { 3988 this.curr = this.gen.next().value || null; 3989 } while (this.filterSkips && this.curr !== null && this.curr.constructor === Skip); 3990 return this.curr; 3991 } 3992 }; 3993 var logUpdate = (update) => logUpdateV2(update, UpdateDecoderV1); 3994 var logUpdateV2 = (update, YDecoder = UpdateDecoderV2) => { 3995 const structs = []; 3996 const updateDecoder = new YDecoder(createDecoder(update)); 3997 const lazyDecoder = new LazyStructReader(updateDecoder, false); 3998 for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { 3999 structs.push(curr); 4000 } 4001 print("Structs: ", structs); 4002 const ds = readDeleteSet(updateDecoder); 4003 print("DeleteSet: ", ds); 4004 }; 4005 var decodeUpdate = (update) => decodeUpdateV2(update, UpdateDecoderV1); 4006 var decodeUpdateV2 = (update, YDecoder = UpdateDecoderV2) => { 4007 const structs = []; 4008 const updateDecoder = new YDecoder(createDecoder(update)); 4009 const lazyDecoder = new LazyStructReader(updateDecoder, false); 4010 for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { 4011 structs.push(curr); 4012 } 4013 return { 4014 structs, 4015 ds: readDeleteSet(updateDecoder) 4016 }; 4017 }; 4018 var LazyStructWriter = class { 4019 /** 4020 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 4021 */ 4022 constructor(encoder) { 4023 this.currClient = 0; 4024 this.startClock = 0; 4025 this.written = 0; 4026 this.encoder = encoder; 4027 this.clientStructs = []; 4028 } 4029 }; 4030 var mergeUpdates = (updates) => mergeUpdatesV2(updates, UpdateDecoderV1, UpdateEncoderV1); 4031 var encodeStateVectorFromUpdateV2 = (update, YEncoder = DSEncoderV2, YDecoder = UpdateDecoderV2) => { 4032 const encoder = new YEncoder(); 4033 const updateDecoder = new LazyStructReader(new YDecoder(createDecoder(update)), false); 4034 let curr = updateDecoder.curr; 4035 if (curr !== null) { 4036 let size2 = 0; 4037 let currClient = curr.id.client; 4038 let stopCounting = curr.id.clock !== 0; 4039 let currClock = stopCounting ? 0 : curr.id.clock + curr.length; 4040 for (; curr !== null; curr = updateDecoder.next()) { 4041 if (currClient !== curr.id.client) { 4042 if (currClock !== 0) { 4043 size2++; 4044 writeVarUint(encoder.restEncoder, currClient); 4045 writeVarUint(encoder.restEncoder, currClock); 4046 } 4047 currClient = curr.id.client; 4048 currClock = 0; 4049 stopCounting = curr.id.clock !== 0; 4050 } 4051 if (curr.constructor === Skip) { 4052 stopCounting = true; 4053 } 4054 if (!stopCounting) { 4055 currClock = curr.id.clock + curr.length; 4056 } 4057 } 4058 if (currClock !== 0) { 4059 size2++; 4060 writeVarUint(encoder.restEncoder, currClient); 4061 writeVarUint(encoder.restEncoder, currClock); 4062 } 4063 const enc = createEncoder(); 4064 writeVarUint(enc, size2); 4065 writeBinaryEncoder(enc, encoder.restEncoder); 4066 encoder.restEncoder = enc; 4067 return encoder.toUint8Array(); 4068 } else { 4069 writeVarUint(encoder.restEncoder, 0); 4070 return encoder.toUint8Array(); 4071 } 4072 }; 4073 var encodeStateVectorFromUpdate = (update) => encodeStateVectorFromUpdateV2(update, DSEncoderV1, UpdateDecoderV1); 4074 var parseUpdateMetaV2 = (update, YDecoder = UpdateDecoderV2) => { 4075 const from2 = /* @__PURE__ */ new Map(); 4076 const to = /* @__PURE__ */ new Map(); 4077 const updateDecoder = new LazyStructReader(new YDecoder(createDecoder(update)), false); 4078 let curr = updateDecoder.curr; 4079 if (curr !== null) { 4080 let currClient = curr.id.client; 4081 let currClock = curr.id.clock; 4082 from2.set(currClient, currClock); 4083 for (; curr !== null; curr = updateDecoder.next()) { 4084 if (currClient !== curr.id.client) { 4085 to.set(currClient, currClock); 4086 from2.set(curr.id.client, curr.id.clock); 4087 currClient = curr.id.client; 4088 } 4089 currClock = curr.id.clock + curr.length; 4090 } 4091 to.set(currClient, currClock); 4092 } 4093 return { from: from2, to }; 4094 }; 4095 var parseUpdateMeta = (update) => parseUpdateMetaV2(update, UpdateDecoderV1); 4096 var sliceStruct = (left, diff) => { 4097 if (left.constructor === GC) { 4098 const { client, clock } = left.id; 4099 return new GC(createID(client, clock + diff), left.length - diff); 4100 } else if (left.constructor === Skip) { 4101 const { client, clock } = left.id; 4102 return new Skip(createID(client, clock + diff), left.length - diff); 4103 } else { 4104 const leftItem = ( 4105 /** @type {Item} */ 4106 left 4107 ); 4108 const { client, clock } = leftItem.id; 4109 return new Item( 4110 createID(client, clock + diff), 4111 null, 4112 createID(client, clock + diff - 1), 4113 null, 4114 leftItem.rightOrigin, 4115 leftItem.parent, 4116 leftItem.parentSub, 4117 leftItem.content.splice(diff) 4118 ); 4119 } 4120 }; 4121 var mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => { 4122 if (updates.length === 1) { 4123 return updates[0]; 4124 } 4125 const updateDecoders = updates.map((update) => new YDecoder(createDecoder(update))); 4126 let lazyStructDecoders = updateDecoders.map((decoder) => new LazyStructReader(decoder, true)); 4127 let currWrite = null; 4128 const updateEncoder = new YEncoder(); 4129 const lazyStructEncoder = new LazyStructWriter(updateEncoder); 4130 while (true) { 4131 lazyStructDecoders = lazyStructDecoders.filter((dec) => dec.curr !== null); 4132 lazyStructDecoders.sort( 4133 /** @type {function(any,any):number} */ 4134 (dec1, dec2) => { 4135 if (dec1.curr.id.client === dec2.curr.id.client) { 4136 const clockDiff = dec1.curr.id.clock - dec2.curr.id.clock; 4137 if (clockDiff === 0) { 4138 return dec1.curr.constructor === dec2.curr.constructor ? 0 : dec1.curr.constructor === Skip ? 1 : -1; 4139 } else { 4140 return clockDiff; 4141 } 4142 } else { 4143 return dec2.curr.id.client - dec1.curr.id.client; 4144 } 4145 } 4146 ); 4147 if (lazyStructDecoders.length === 0) { 4148 break; 4149 } 4150 const currDecoder = lazyStructDecoders[0]; 4151 const firstClient = ( 4152 /** @type {Item | GC} */ 4153 currDecoder.curr.id.client 4154 ); 4155 if (currWrite !== null) { 4156 let curr = ( 4157 /** @type {Item | GC | null} */ 4158 currDecoder.curr 4159 ); 4160 let iterated = false; 4161 while (curr !== null && curr.id.clock + curr.length <= currWrite.struct.id.clock + currWrite.struct.length && curr.id.client >= currWrite.struct.id.client) { 4162 curr = currDecoder.next(); 4163 iterated = true; 4164 } 4165 if (curr === null || // current decoder is empty 4166 curr.id.client !== firstClient || // check whether there is another decoder that has has updates from `firstClient` 4167 iterated && curr.id.clock > currWrite.struct.id.clock + currWrite.struct.length) { 4168 continue; 4169 } 4170 if (firstClient !== currWrite.struct.id.client) { 4171 writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); 4172 currWrite = { struct: curr, offset: 0 }; 4173 currDecoder.next(); 4174 } else { 4175 if (currWrite.struct.id.clock + currWrite.struct.length < curr.id.clock) { 4176 if (currWrite.struct.constructor === Skip) { 4177 currWrite.struct.length = curr.id.clock + curr.length - currWrite.struct.id.clock; 4178 } else { 4179 writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); 4180 const diff = curr.id.clock - currWrite.struct.id.clock - currWrite.struct.length; 4181 const struct = new Skip(createID(firstClient, currWrite.struct.id.clock + currWrite.struct.length), diff); 4182 currWrite = { struct, offset: 0 }; 4183 } 4184 } else { 4185 const diff = currWrite.struct.id.clock + currWrite.struct.length - curr.id.clock; 4186 if (diff > 0) { 4187 if (currWrite.struct.constructor === Skip) { 4188 currWrite.struct.length -= diff; 4189 } else { 4190 curr = sliceStruct(curr, diff); 4191 } 4192 } 4193 if (!currWrite.struct.mergeWith( 4194 /** @type {any} */ 4195 curr 4196 )) { 4197 writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); 4198 currWrite = { struct: curr, offset: 0 }; 4199 currDecoder.next(); 4200 } 4201 } 4202 } 4203 } else { 4204 currWrite = { struct: ( 4205 /** @type {Item | GC} */ 4206 currDecoder.curr 4207 ), offset: 0 }; 4208 currDecoder.next(); 4209 } 4210 for (let next = currDecoder.curr; next !== null && next.id.client === firstClient && next.id.clock === currWrite.struct.id.clock + currWrite.struct.length && next.constructor !== Skip; next = currDecoder.next()) { 4211 writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); 4212 currWrite = { struct: next, offset: 0 }; 4213 } 4214 } 4215 if (currWrite !== null) { 4216 writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset); 4217 currWrite = null; 4218 } 4219 finishLazyStructWriting(lazyStructEncoder); 4220 const dss = updateDecoders.map((decoder) => readDeleteSet(decoder)); 4221 const ds = mergeDeleteSets(dss); 4222 writeDeleteSet(updateEncoder, ds); 4223 return updateEncoder.toUint8Array(); 4224 }; 4225 var diffUpdateV2 = (update, sv, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => { 4226 const state = decodeStateVector(sv); 4227 const encoder = new YEncoder(); 4228 const lazyStructWriter = new LazyStructWriter(encoder); 4229 const decoder = new YDecoder(createDecoder(update)); 4230 const reader = new LazyStructReader(decoder, false); 4231 while (reader.curr) { 4232 const curr = reader.curr; 4233 const currClient = curr.id.client; 4234 const svClock = state.get(currClient) || 0; 4235 if (reader.curr.constructor === Skip) { 4236 reader.next(); 4237 continue; 4238 } 4239 if (curr.id.clock + curr.length > svClock) { 4240 writeStructToLazyStructWriter(lazyStructWriter, curr, max(svClock - curr.id.clock, 0)); 4241 reader.next(); 4242 while (reader.curr && reader.curr.id.client === currClient) { 4243 writeStructToLazyStructWriter(lazyStructWriter, reader.curr, 0); 4244 reader.next(); 4245 } 4246 } else { 4247 while (reader.curr && reader.curr.id.client === currClient && reader.curr.id.clock + reader.curr.length <= svClock) { 4248 reader.next(); 4249 } 4250 } 4251 } 4252 finishLazyStructWriting(lazyStructWriter); 4253 const ds = readDeleteSet(decoder); 4254 writeDeleteSet(encoder, ds); 4255 return encoder.toUint8Array(); 4256 }; 4257 var diffUpdate = (update, sv) => diffUpdateV2(update, sv, UpdateDecoderV1, UpdateEncoderV1); 4258 var flushLazyStructWriter = (lazyWriter) => { 4259 if (lazyWriter.written > 0) { 4260 lazyWriter.clientStructs.push({ written: lazyWriter.written, restEncoder: toUint8Array(lazyWriter.encoder.restEncoder) }); 4261 lazyWriter.encoder.restEncoder = createEncoder(); 4262 lazyWriter.written = 0; 4263 } 4264 }; 4265 var writeStructToLazyStructWriter = (lazyWriter, struct, offset) => { 4266 if (lazyWriter.written > 0 && lazyWriter.currClient !== struct.id.client) { 4267 flushLazyStructWriter(lazyWriter); 4268 } 4269 if (lazyWriter.written === 0) { 4270 lazyWriter.currClient = struct.id.client; 4271 lazyWriter.encoder.writeClient(struct.id.client); 4272 writeVarUint(lazyWriter.encoder.restEncoder, struct.id.clock + offset); 4273 } 4274 struct.write(lazyWriter.encoder, offset); 4275 lazyWriter.written++; 4276 }; 4277 var finishLazyStructWriting = (lazyWriter) => { 4278 flushLazyStructWriter(lazyWriter); 4279 const restEncoder = lazyWriter.encoder.restEncoder; 4280 writeVarUint(restEncoder, lazyWriter.clientStructs.length); 4281 for (let i = 0; i < lazyWriter.clientStructs.length; i++) { 4282 const partStructs = lazyWriter.clientStructs[i]; 4283 writeVarUint(restEncoder, partStructs.written); 4284 writeUint8Array(restEncoder, partStructs.restEncoder); 4285 } 4286 }; 4287 var convertUpdateFormat = (update, blockTransformer, YDecoder, YEncoder) => { 4288 const updateDecoder = new YDecoder(createDecoder(update)); 4289 const lazyDecoder = new LazyStructReader(updateDecoder, false); 4290 const updateEncoder = new YEncoder(); 4291 const lazyWriter = new LazyStructWriter(updateEncoder); 4292 for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) { 4293 writeStructToLazyStructWriter(lazyWriter, blockTransformer(curr), 0); 4294 } 4295 finishLazyStructWriting(lazyWriter); 4296 const ds = readDeleteSet(updateDecoder); 4297 writeDeleteSet(updateEncoder, ds); 4298 return updateEncoder.toUint8Array(); 4299 }; 4300 var createObfuscator = ({ formatting = true, subdocs = true, yxml = true } = {}) => { 4301 let i = 0; 4302 const mapKeyCache = create(); 4303 const nodeNameCache = create(); 4304 const formattingKeyCache = create(); 4305 const formattingValueCache = create(); 4306 formattingValueCache.set(null, null); 4307 return (block) => { 4308 switch (block.constructor) { 4309 case GC: 4310 case Skip: 4311 return block; 4312 case Item: { 4313 const item = ( 4314 /** @type {Item} */ 4315 block 4316 ); 4317 const content = item.content; 4318 switch (content.constructor) { 4319 case ContentDeleted: 4320 break; 4321 case ContentType: { 4322 if (yxml) { 4323 const type = ( 4324 /** @type {ContentType} */ 4325 content.type 4326 ); 4327 if (type instanceof YXmlElement) { 4328 type.nodeName = setIfUndefined(nodeNameCache, type.nodeName, () => "node-" + i); 4329 } 4330 if (type instanceof YXmlHook) { 4331 type.hookName = setIfUndefined(nodeNameCache, type.hookName, () => "hook-" + i); 4332 } 4333 } 4334 break; 4335 } 4336 case ContentAny: { 4337 const c = ( 4338 /** @type {ContentAny} */ 4339 content 4340 ); 4341 c.arr = c.arr.map(() => i); 4342 break; 4343 } 4344 case ContentBinary: { 4345 const c = ( 4346 /** @type {ContentBinary} */ 4347 content 4348 ); 4349 c.content = new Uint8Array([i]); 4350 break; 4351 } 4352 case ContentDoc: { 4353 const c = ( 4354 /** @type {ContentDoc} */ 4355 content 4356 ); 4357 if (subdocs) { 4358 c.opts = {}; 4359 c.doc.guid = i + ""; 4360 } 4361 break; 4362 } 4363 case ContentEmbed: { 4364 const c = ( 4365 /** @type {ContentEmbed} */ 4366 content 4367 ); 4368 c.embed = {}; 4369 break; 4370 } 4371 case ContentFormat: { 4372 const c = ( 4373 /** @type {ContentFormat} */ 4374 content 4375 ); 4376 if (formatting) { 4377 c.key = setIfUndefined(formattingKeyCache, c.key, () => i + ""); 4378 c.value = setIfUndefined(formattingValueCache, c.value, () => ({ i })); 4379 } 4380 break; 4381 } 4382 case ContentJSON: { 4383 const c = ( 4384 /** @type {ContentJSON} */ 4385 content 4386 ); 4387 c.arr = c.arr.map(() => i); 4388 break; 4389 } 4390 case ContentString: { 4391 const c = ( 4392 /** @type {ContentString} */ 4393 content 4394 ); 4395 c.str = repeat(i % 10 + "", c.str.length); 4396 break; 4397 } 4398 default: 4399 unexpectedCase(); 4400 } 4401 if (item.parentSub) { 4402 item.parentSub = setIfUndefined(mapKeyCache, item.parentSub, () => i + ""); 4403 } 4404 i++; 4405 return block; 4406 } 4407 default: 4408 unexpectedCase(); 4409 } 4410 }; 4411 }; 4412 var obfuscateUpdate = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV1, UpdateEncoderV1); 4413 var obfuscateUpdateV2 = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV2, UpdateEncoderV2); 4414 var convertUpdateFormatV1ToV2 = (update) => convertUpdateFormat(update, id, UpdateDecoderV1, UpdateEncoderV2); 4415 var convertUpdateFormatV2ToV1 = (update) => convertUpdateFormat(update, id, UpdateDecoderV2, UpdateEncoderV1); 4416 var errorComputeChanges = "You must not compute changes after the event-handler fired."; 4417 var YEvent = class { 4418 /** 4419 * @param {T} target The changed type. 4420 * @param {Transaction} transaction 4421 */ 4422 constructor(target, transaction) { 4423 this.target = target; 4424 this.currentTarget = target; 4425 this.transaction = transaction; 4426 this._changes = null; 4427 this._keys = null; 4428 this._delta = null; 4429 this._path = null; 4430 } 4431 /** 4432 * Computes the path from `y` to the changed type. 4433 * 4434 * @todo v14 should standardize on path: Array<{parent, index}> because that is easier to work with. 4435 * 4436 * The following property holds: 4437 * @example 4438 * let type = y 4439 * event.path.forEach(dir => { 4440 * type = type.get(dir) 4441 * }) 4442 * type === event.target // => true 4443 */ 4444 get path() { 4445 return this._path || (this._path = getPathTo(this.currentTarget, this.target)); 4446 } 4447 /** 4448 * Check if a struct is deleted by this event. 4449 * 4450 * In contrast to change.deleted, this method also returns true if the struct was added and then deleted. 4451 * 4452 * @param {AbstractStruct} struct 4453 * @return {boolean} 4454 */ 4455 deletes(struct) { 4456 return isDeleted(this.transaction.deleteSet, struct.id); 4457 } 4458 /** 4459 * @type {Map<string, { action: 'add' | 'update' | 'delete', oldValue: any }>} 4460 */ 4461 get keys() { 4462 if (this._keys === null) { 4463 if (this.transaction.doc._transactionCleanups.length === 0) { 4464 throw create3(errorComputeChanges); 4465 } 4466 const keys2 = /* @__PURE__ */ new Map(); 4467 const target = this.target; 4468 const changed = ( 4469 /** @type Set<string|null> */ 4470 this.transaction.changed.get(target) 4471 ); 4472 changed.forEach((key) => { 4473 if (key !== null) { 4474 const item = ( 4475 /** @type {Item} */ 4476 target._map.get(key) 4477 ); 4478 let action; 4479 let oldValue; 4480 if (this.adds(item)) { 4481 let prev = item.left; 4482 while (prev !== null && this.adds(prev)) { 4483 prev = prev.left; 4484 } 4485 if (this.deletes(item)) { 4486 if (prev !== null && this.deletes(prev)) { 4487 action = "delete"; 4488 oldValue = last(prev.content.getContent()); 4489 } else { 4490 return; 4491 } 4492 } else { 4493 if (prev !== null && this.deletes(prev)) { 4494 action = "update"; 4495 oldValue = last(prev.content.getContent()); 4496 } else { 4497 action = "add"; 4498 oldValue = void 0; 4499 } 4500 } 4501 } else { 4502 if (this.deletes(item)) { 4503 action = "delete"; 4504 oldValue = last( 4505 /** @type {Item} */ 4506 item.content.getContent() 4507 ); 4508 } else { 4509 return; 4510 } 4511 } 4512 keys2.set(key, { action, oldValue }); 4513 } 4514 }); 4515 this._keys = keys2; 4516 } 4517 return this._keys; 4518 } 4519 /** 4520 * This is a computed property. Note that this can only be safely computed during the 4521 * event call. Computing this property after other changes happened might result in 4522 * unexpected behavior (incorrect computation of deltas). A safe way to collect changes 4523 * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object. 4524 * 4525 * @type {Array<{insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any>}>} 4526 */ 4527 get delta() { 4528 return this.changes.delta; 4529 } 4530 /** 4531 * Check if a struct is added by this event. 4532 * 4533 * In contrast to change.deleted, this method also returns true if the struct was added and then deleted. 4534 * 4535 * @param {AbstractStruct} struct 4536 * @return {boolean} 4537 */ 4538 adds(struct) { 4539 return struct.id.clock >= (this.transaction.beforeState.get(struct.id.client) || 0); 4540 } 4541 /** 4542 * This is a computed property. Note that this can only be safely computed during the 4543 * event call. Computing this property after other changes happened might result in 4544 * unexpected behavior (incorrect computation of deltas). A safe way to collect changes 4545 * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object. 4546 * 4547 * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}} 4548 */ 4549 get changes() { 4550 let changes = this._changes; 4551 if (changes === null) { 4552 if (this.transaction.doc._transactionCleanups.length === 0) { 4553 throw create3(errorComputeChanges); 4554 } 4555 const target = this.target; 4556 const added = create2(); 4557 const deleted = create2(); 4558 const delta = []; 4559 changes = { 4560 added, 4561 deleted, 4562 delta, 4563 keys: this.keys 4564 }; 4565 const changed = ( 4566 /** @type Set<string|null> */ 4567 this.transaction.changed.get(target) 4568 ); 4569 if (changed.has(null)) { 4570 let lastOp = null; 4571 const packOp = () => { 4572 if (lastOp) { 4573 delta.push(lastOp); 4574 } 4575 }; 4576 for (let item = target._start; item !== null; item = item.right) { 4577 if (item.deleted) { 4578 if (this.deletes(item) && !this.adds(item)) { 4579 if (lastOp === null || lastOp.delete === void 0) { 4580 packOp(); 4581 lastOp = { delete: 0 }; 4582 } 4583 lastOp.delete += item.length; 4584 deleted.add(item); 4585 } 4586 } else { 4587 if (this.adds(item)) { 4588 if (lastOp === null || lastOp.insert === void 0) { 4589 packOp(); 4590 lastOp = { insert: [] }; 4591 } 4592 lastOp.insert = lastOp.insert.concat(item.content.getContent()); 4593 added.add(item); 4594 } else { 4595 if (lastOp === null || lastOp.retain === void 0) { 4596 packOp(); 4597 lastOp = { retain: 0 }; 4598 } 4599 lastOp.retain += item.length; 4600 } 4601 } 4602 } 4603 if (lastOp !== null && lastOp.retain === void 0) { 4604 packOp(); 4605 } 4606 } 4607 this._changes = changes; 4608 } 4609 return ( 4610 /** @type {any} */ 4611 changes 4612 ); 4613 } 4614 }; 4615 var getPathTo = (parent, child) => { 4616 const path = []; 4617 while (child._item !== null && child !== parent) { 4618 if (child._item.parentSub !== null) { 4619 path.unshift(child._item.parentSub); 4620 } else { 4621 let i = 0; 4622 let c = ( 4623 /** @type {AbstractType<any>} */ 4624 child._item.parent._start 4625 ); 4626 while (c !== child._item && c !== null) { 4627 if (!c.deleted && c.countable) { 4628 i += c.length; 4629 } 4630 c = c.right; 4631 } 4632 path.unshift(i); 4633 } 4634 child = /** @type {AbstractType<any>} */ 4635 child._item.parent; 4636 } 4637 return path; 4638 }; 4639 var warnPrematureAccess = () => { 4640 warn("Invalid access: Add Yjs type to a document before reading data."); 4641 }; 4642 var maxSearchMarker = 80; 4643 var globalSearchMarkerTimestamp = 0; 4644 var ArraySearchMarker = class { 4645 /** 4646 * @param {Item} p 4647 * @param {number} index 4648 */ 4649 constructor(p, index) { 4650 p.marker = true; 4651 this.p = p; 4652 this.index = index; 4653 this.timestamp = globalSearchMarkerTimestamp++; 4654 } 4655 }; 4656 var refreshMarkerTimestamp = (marker) => { 4657 marker.timestamp = globalSearchMarkerTimestamp++; 4658 }; 4659 var overwriteMarker = (marker, p, index) => { 4660 marker.p.marker = false; 4661 marker.p = p; 4662 p.marker = true; 4663 marker.index = index; 4664 marker.timestamp = globalSearchMarkerTimestamp++; 4665 }; 4666 var markPosition = (searchMarker, p, index) => { 4667 if (searchMarker.length >= maxSearchMarker) { 4668 const marker = searchMarker.reduce((a, b) => a.timestamp < b.timestamp ? a : b); 4669 overwriteMarker(marker, p, index); 4670 return marker; 4671 } else { 4672 const pm = new ArraySearchMarker(p, index); 4673 searchMarker.push(pm); 4674 return pm; 4675 } 4676 }; 4677 var findMarker = (yarray, index) => { 4678 if (yarray._start === null || index === 0 || yarray._searchMarker === null) { 4679 return null; 4680 } 4681 const marker = yarray._searchMarker.length === 0 ? null : yarray._searchMarker.reduce((a, b) => abs(index - a.index) < abs(index - b.index) ? a : b); 4682 let p = yarray._start; 4683 let pindex = 0; 4684 if (marker !== null) { 4685 p = marker.p; 4686 pindex = marker.index; 4687 refreshMarkerTimestamp(marker); 4688 } 4689 while (p.right !== null && pindex < index) { 4690 if (!p.deleted && p.countable) { 4691 if (index < pindex + p.length) { 4692 break; 4693 } 4694 pindex += p.length; 4695 } 4696 p = p.right; 4697 } 4698 while (p.left !== null && pindex > index) { 4699 p = p.left; 4700 if (!p.deleted && p.countable) { 4701 pindex -= p.length; 4702 } 4703 } 4704 while (p.left !== null && p.left.id.client === p.id.client && p.left.id.clock + p.left.length === p.id.clock) { 4705 p = p.left; 4706 if (!p.deleted && p.countable) { 4707 pindex -= p.length; 4708 } 4709 } 4710 if (marker !== null && abs(marker.index - pindex) < /** @type {YText|YArray<any>} */ 4711 p.parent.length / maxSearchMarker) { 4712 overwriteMarker(marker, p, pindex); 4713 return marker; 4714 } else { 4715 return markPosition(yarray._searchMarker, p, pindex); 4716 } 4717 }; 4718 var updateMarkerChanges = (searchMarker, index, len) => { 4719 for (let i = searchMarker.length - 1; i >= 0; i--) { 4720 const m = searchMarker[i]; 4721 if (len > 0) { 4722 let p = m.p; 4723 p.marker = false; 4724 while (p && (p.deleted || !p.countable)) { 4725 p = p.left; 4726 if (p && !p.deleted && p.countable) { 4727 m.index -= p.length; 4728 } 4729 } 4730 if (p === null || p.marker === true) { 4731 searchMarker.splice(i, 1); 4732 continue; 4733 } 4734 m.p = p; 4735 p.marker = true; 4736 } 4737 if (index < m.index || len > 0 && index === m.index) { 4738 m.index = max(index, m.index + len); 4739 } 4740 } 4741 }; 4742 var getTypeChildren = (t) => { 4743 t.doc ?? warnPrematureAccess(); 4744 let s = t._start; 4745 const arr = []; 4746 while (s) { 4747 arr.push(s); 4748 s = s.right; 4749 } 4750 return arr; 4751 }; 4752 var callTypeObservers = (type, transaction, event) => { 4753 const changedType = type; 4754 const changedParentTypes = transaction.changedParentTypes; 4755 while (true) { 4756 setIfUndefined(changedParentTypes, type, () => []).push(event); 4757 if (type._item === null) { 4758 break; 4759 } 4760 type = /** @type {AbstractType<any>} */ 4761 type._item.parent; 4762 } 4763 callEventHandlerListeners(changedType._eH, event, transaction); 4764 }; 4765 var AbstractType = class { 4766 constructor() { 4767 this._item = null; 4768 this._map = /* @__PURE__ */ new Map(); 4769 this._start = null; 4770 this.doc = null; 4771 this._length = 0; 4772 this._eH = createEventHandler(); 4773 this._dEH = createEventHandler(); 4774 this._searchMarker = null; 4775 } 4776 /** 4777 * @return {AbstractType<any>|null} 4778 */ 4779 get parent() { 4780 return this._item ? ( 4781 /** @type {AbstractType<any>} */ 4782 this._item.parent 4783 ) : null; 4784 } 4785 /** 4786 * Integrate this type into the Yjs instance. 4787 * 4788 * * Save this struct in the os 4789 * * This type is sent to other client 4790 * * Observer functions are fired 4791 * 4792 * @param {Doc} y The Yjs instance 4793 * @param {Item|null} item 4794 */ 4795 _integrate(y, item) { 4796 this.doc = y; 4797 this._item = item; 4798 } 4799 /** 4800 * @return {AbstractType<EventType>} 4801 */ 4802 _copy() { 4803 throw methodUnimplemented(); 4804 } 4805 /** 4806 * Makes a copy of this data type that can be included somewhere else. 4807 * 4808 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 4809 * 4810 * @return {AbstractType<EventType>} 4811 */ 4812 clone() { 4813 throw methodUnimplemented(); 4814 } 4815 /** 4816 * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder 4817 */ 4818 _write(_encoder) { 4819 } 4820 /** 4821 * The first non-deleted item 4822 */ 4823 get _first() { 4824 let n = this._start; 4825 while (n !== null && n.deleted) { 4826 n = n.right; 4827 } 4828 return n; 4829 } 4830 /** 4831 * Creates YEvent and calls all type observers. 4832 * Must be implemented by each type. 4833 * 4834 * @param {Transaction} transaction 4835 * @param {Set<null|string>} _parentSubs Keys changed on this type. `null` if list was modified. 4836 */ 4837 _callObserver(transaction, _parentSubs) { 4838 if (!transaction.local && this._searchMarker) { 4839 this._searchMarker.length = 0; 4840 } 4841 } 4842 /** 4843 * Observe all events that are created on this type. 4844 * 4845 * @param {function(EventType, Transaction):void} f Observer function 4846 */ 4847 observe(f) { 4848 addEventHandlerListener(this._eH, f); 4849 } 4850 /** 4851 * Observe all events that are created by this type and its children. 4852 * 4853 * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function 4854 */ 4855 observeDeep(f) { 4856 addEventHandlerListener(this._dEH, f); 4857 } 4858 /** 4859 * Unregister an observer function. 4860 * 4861 * @param {function(EventType,Transaction):void} f Observer function 4862 */ 4863 unobserve(f) { 4864 removeEventHandlerListener(this._eH, f); 4865 } 4866 /** 4867 * Unregister an observer function. 4868 * 4869 * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function 4870 */ 4871 unobserveDeep(f) { 4872 removeEventHandlerListener(this._dEH, f); 4873 } 4874 /** 4875 * @abstract 4876 * @return {any} 4877 */ 4878 toJSON() { 4879 } 4880 }; 4881 var typeListSlice = (type, start, end) => { 4882 type.doc ?? warnPrematureAccess(); 4883 if (start < 0) { 4884 start = type._length + start; 4885 } 4886 if (end < 0) { 4887 end = type._length + end; 4888 } 4889 let len = end - start; 4890 const cs = []; 4891 let n = type._start; 4892 while (n !== null && len > 0) { 4893 if (n.countable && !n.deleted) { 4894 const c = n.content.getContent(); 4895 if (c.length <= start) { 4896 start -= c.length; 4897 } else { 4898 for (let i = start; i < c.length && len > 0; i++) { 4899 cs.push(c[i]); 4900 len--; 4901 } 4902 start = 0; 4903 } 4904 } 4905 n = n.right; 4906 } 4907 return cs; 4908 }; 4909 var typeListToArray = (type) => { 4910 type.doc ?? warnPrematureAccess(); 4911 const cs = []; 4912 let n = type._start; 4913 while (n !== null) { 4914 if (n.countable && !n.deleted) { 4915 const c = n.content.getContent(); 4916 for (let i = 0; i < c.length; i++) { 4917 cs.push(c[i]); 4918 } 4919 } 4920 n = n.right; 4921 } 4922 return cs; 4923 }; 4924 var typeListToArraySnapshot = (type, snapshot2) => { 4925 const cs = []; 4926 let n = type._start; 4927 while (n !== null) { 4928 if (n.countable && isVisible(n, snapshot2)) { 4929 const c = n.content.getContent(); 4930 for (let i = 0; i < c.length; i++) { 4931 cs.push(c[i]); 4932 } 4933 } 4934 n = n.right; 4935 } 4936 return cs; 4937 }; 4938 var typeListForEach = (type, f) => { 4939 let index = 0; 4940 let n = type._start; 4941 type.doc ?? warnPrematureAccess(); 4942 while (n !== null) { 4943 if (n.countable && !n.deleted) { 4944 const c = n.content.getContent(); 4945 for (let i = 0; i < c.length; i++) { 4946 f(c[i], index++, type); 4947 } 4948 } 4949 n = n.right; 4950 } 4951 }; 4952 var typeListMap = (type, f) => { 4953 const result = []; 4954 typeListForEach(type, (c, i) => { 4955 result.push(f(c, i, type)); 4956 }); 4957 return result; 4958 }; 4959 var typeListCreateIterator = (type) => { 4960 let n = type._start; 4961 let currentContent = null; 4962 let currentContentIndex = 0; 4963 return { 4964 [Symbol.iterator]() { 4965 return this; 4966 }, 4967 next: () => { 4968 if (currentContent === null) { 4969 while (n !== null && n.deleted) { 4970 n = n.right; 4971 } 4972 if (n === null) { 4973 return { 4974 done: true, 4975 value: void 0 4976 }; 4977 } 4978 currentContent = n.content.getContent(); 4979 currentContentIndex = 0; 4980 n = n.right; 4981 } 4982 const value = currentContent[currentContentIndex++]; 4983 if (currentContent.length <= currentContentIndex) { 4984 currentContent = null; 4985 } 4986 return { 4987 done: false, 4988 value 4989 }; 4990 } 4991 }; 4992 }; 4993 var typeListGet = (type, index) => { 4994 type.doc ?? warnPrematureAccess(); 4995 const marker = findMarker(type, index); 4996 let n = type._start; 4997 if (marker !== null) { 4998 n = marker.p; 4999 index -= marker.index; 5000 } 5001 for (; n !== null; n = n.right) { 5002 if (!n.deleted && n.countable) { 5003 if (index < n.length) { 5004 return n.content.getContent()[index]; 5005 } 5006 index -= n.length; 5007 } 5008 } 5009 }; 5010 var typeListInsertGenericsAfter = (transaction, parent, referenceItem, content) => { 5011 let left = referenceItem; 5012 const doc2 = transaction.doc; 5013 const ownClientId = doc2.clientID; 5014 const store = doc2.store; 5015 const right = referenceItem === null ? parent._start : referenceItem.right; 5016 let jsonContent = []; 5017 const packJsonContent = () => { 5018 if (jsonContent.length > 0) { 5019 left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentAny(jsonContent)); 5020 left.integrate(transaction, 0); 5021 jsonContent = []; 5022 } 5023 }; 5024 content.forEach((c) => { 5025 if (c === null) { 5026 jsonContent.push(c); 5027 } else { 5028 switch (c.constructor) { 5029 case Number: 5030 case Object: 5031 case Boolean: 5032 case Array: 5033 case String: 5034 jsonContent.push(c); 5035 break; 5036 default: 5037 packJsonContent(); 5038 switch (c.constructor) { 5039 case Uint8Array: 5040 case ArrayBuffer: 5041 left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentBinary(new Uint8Array( 5042 /** @type {Uint8Array} */ 5043 c 5044 ))); 5045 left.integrate(transaction, 0); 5046 break; 5047 case Doc: 5048 left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentDoc( 5049 /** @type {Doc} */ 5050 c 5051 )); 5052 left.integrate(transaction, 0); 5053 break; 5054 default: 5055 if (c instanceof AbstractType) { 5056 left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentType(c)); 5057 left.integrate(transaction, 0); 5058 } else { 5059 throw new Error("Unexpected content type in insert operation"); 5060 } 5061 } 5062 } 5063 } 5064 }); 5065 packJsonContent(); 5066 }; 5067 var lengthExceeded = () => create3("Length exceeded!"); 5068 var typeListInsertGenerics = (transaction, parent, index, content) => { 5069 if (index > parent._length) { 5070 throw lengthExceeded(); 5071 } 5072 if (index === 0) { 5073 if (parent._searchMarker) { 5074 updateMarkerChanges(parent._searchMarker, index, content.length); 5075 } 5076 return typeListInsertGenericsAfter(transaction, parent, null, content); 5077 } 5078 const startIndex = index; 5079 const marker = findMarker(parent, index); 5080 let n = parent._start; 5081 if (marker !== null) { 5082 n = marker.p; 5083 index -= marker.index; 5084 if (index === 0) { 5085 n = n.prev; 5086 index += n && n.countable && !n.deleted ? n.length : 0; 5087 } 5088 } 5089 for (; n !== null; n = n.right) { 5090 if (!n.deleted && n.countable) { 5091 if (index <= n.length) { 5092 if (index < n.length) { 5093 getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index)); 5094 } 5095 break; 5096 } 5097 index -= n.length; 5098 } 5099 } 5100 if (parent._searchMarker) { 5101 updateMarkerChanges(parent._searchMarker, startIndex, content.length); 5102 } 5103 return typeListInsertGenericsAfter(transaction, parent, n, content); 5104 }; 5105 var typeListPushGenerics = (transaction, parent, content) => { 5106 const marker = (parent._searchMarker || []).reduce((maxMarker, currMarker) => currMarker.index > maxMarker.index ? currMarker : maxMarker, { index: 0, p: parent._start }); 5107 let n = marker.p; 5108 if (n) { 5109 while (n.right) { 5110 n = n.right; 5111 } 5112 } 5113 return typeListInsertGenericsAfter(transaction, parent, n, content); 5114 }; 5115 var typeListDelete = (transaction, parent, index, length3) => { 5116 if (length3 === 0) { 5117 return; 5118 } 5119 const startIndex = index; 5120 const startLength = length3; 5121 const marker = findMarker(parent, index); 5122 let n = parent._start; 5123 if (marker !== null) { 5124 n = marker.p; 5125 index -= marker.index; 5126 } 5127 for (; n !== null && index > 0; n = n.right) { 5128 if (!n.deleted && n.countable) { 5129 if (index < n.length) { 5130 getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index)); 5131 } 5132 index -= n.length; 5133 } 5134 } 5135 while (length3 > 0 && n !== null) { 5136 if (!n.deleted) { 5137 if (length3 < n.length) { 5138 getItemCleanStart(transaction, createID(n.id.client, n.id.clock + length3)); 5139 } 5140 n.delete(transaction); 5141 length3 -= n.length; 5142 } 5143 n = n.right; 5144 } 5145 if (length3 > 0) { 5146 throw lengthExceeded(); 5147 } 5148 if (parent._searchMarker) { 5149 updateMarkerChanges( 5150 parent._searchMarker, 5151 startIndex, 5152 -startLength + length3 5153 /* in case we remove the above exception */ 5154 ); 5155 } 5156 }; 5157 var typeMapDelete = (transaction, parent, key) => { 5158 const c = parent._map.get(key); 5159 if (c !== void 0) { 5160 c.delete(transaction); 5161 } 5162 }; 5163 var typeMapSet = (transaction, parent, key, value) => { 5164 const left = parent._map.get(key) || null; 5165 const doc2 = transaction.doc; 5166 const ownClientId = doc2.clientID; 5167 let content; 5168 if (value == null) { 5169 content = new ContentAny([value]); 5170 } else { 5171 switch (value.constructor) { 5172 case Number: 5173 case Object: 5174 case Boolean: 5175 case Array: 5176 case String: 5177 case Date: 5178 case BigInt: 5179 content = new ContentAny([value]); 5180 break; 5181 case Uint8Array: 5182 content = new ContentBinary( 5183 /** @type {Uint8Array} */ 5184 value 5185 ); 5186 break; 5187 case Doc: 5188 content = new ContentDoc( 5189 /** @type {Doc} */ 5190 value 5191 ); 5192 break; 5193 default: 5194 if (value instanceof AbstractType) { 5195 content = new ContentType(value); 5196 } else { 5197 throw new Error("Unexpected content type"); 5198 } 5199 } 5200 } 5201 new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, null, null, parent, key, content).integrate(transaction, 0); 5202 }; 5203 var typeMapGet = (parent, key) => { 5204 parent.doc ?? warnPrematureAccess(); 5205 const val = parent._map.get(key); 5206 return val !== void 0 && !val.deleted ? val.content.getContent()[val.length - 1] : void 0; 5207 }; 5208 var typeMapGetAll = (parent) => { 5209 const res = {}; 5210 parent.doc ?? warnPrematureAccess(); 5211 parent._map.forEach((value, key) => { 5212 if (!value.deleted) { 5213 res[key] = value.content.getContent()[value.length - 1]; 5214 } 5215 }); 5216 return res; 5217 }; 5218 var typeMapHas = (parent, key) => { 5219 parent.doc ?? warnPrematureAccess(); 5220 const val = parent._map.get(key); 5221 return val !== void 0 && !val.deleted; 5222 }; 5223 var typeMapGetSnapshot = (parent, key, snapshot2) => { 5224 let v = parent._map.get(key) || null; 5225 while (v !== null && (!snapshot2.sv.has(v.id.client) || v.id.clock >= (snapshot2.sv.get(v.id.client) || 0))) { 5226 v = v.left; 5227 } 5228 return v !== null && isVisible(v, snapshot2) ? v.content.getContent()[v.length - 1] : void 0; 5229 }; 5230 var typeMapGetAllSnapshot = (parent, snapshot2) => { 5231 const res = {}; 5232 parent._map.forEach((value, key) => { 5233 let v = value; 5234 while (v !== null && (!snapshot2.sv.has(v.id.client) || v.id.clock >= (snapshot2.sv.get(v.id.client) || 0))) { 5235 v = v.left; 5236 } 5237 if (v !== null && isVisible(v, snapshot2)) { 5238 res[key] = v.content.getContent()[v.length - 1]; 5239 } 5240 }); 5241 return res; 5242 }; 5243 var createMapIterator = (type) => { 5244 type.doc ?? warnPrematureAccess(); 5245 return iteratorFilter( 5246 type._map.entries(), 5247 /** @param {any} entry */ 5248 (entry) => !entry[1].deleted 5249 ); 5250 }; 5251 var YArrayEvent = class extends YEvent { 5252 }; 5253 var YArray = class _YArray extends AbstractType { 5254 constructor() { 5255 super(); 5256 this._prelimContent = []; 5257 this._searchMarker = []; 5258 } 5259 /** 5260 * Construct a new YArray containing the specified items. 5261 * @template {Object<string,any>|Array<any>|number|null|string|Uint8Array} T 5262 * @param {Array<T>} items 5263 * @return {YArray<T>} 5264 */ 5265 static from(items) { 5266 const a = new _YArray(); 5267 a.push(items); 5268 return a; 5269 } 5270 /** 5271 * Integrate this type into the Yjs instance. 5272 * 5273 * * Save this struct in the os 5274 * * This type is sent to other client 5275 * * Observer functions are fired 5276 * 5277 * @param {Doc} y The Yjs instance 5278 * @param {Item} item 5279 */ 5280 _integrate(y, item) { 5281 super._integrate(y, item); 5282 this.insert( 5283 0, 5284 /** @type {Array<any>} */ 5285 this._prelimContent 5286 ); 5287 this._prelimContent = null; 5288 } 5289 /** 5290 * @return {YArray<T>} 5291 */ 5292 _copy() { 5293 return new _YArray(); 5294 } 5295 /** 5296 * Makes a copy of this data type that can be included somewhere else. 5297 * 5298 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 5299 * 5300 * @return {YArray<T>} 5301 */ 5302 clone() { 5303 const arr = new _YArray(); 5304 arr.insert(0, this.toArray().map( 5305 (el) => el instanceof AbstractType ? ( 5306 /** @type {typeof el} */ 5307 el.clone() 5308 ) : el 5309 )); 5310 return arr; 5311 } 5312 get length() { 5313 this.doc ?? warnPrematureAccess(); 5314 return this._length; 5315 } 5316 /** 5317 * Creates YArrayEvent and calls observers. 5318 * 5319 * @param {Transaction} transaction 5320 * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified. 5321 */ 5322 _callObserver(transaction, parentSubs) { 5323 super._callObserver(transaction, parentSubs); 5324 callTypeObservers(this, transaction, new YArrayEvent(this, transaction)); 5325 } 5326 /** 5327 * Inserts new content at an index. 5328 * 5329 * Important: This function expects an array of content. Not just a content 5330 * object. The reason for this "weirdness" is that inserting several elements 5331 * is very efficient when it is done as a single operation. 5332 * 5333 * @example 5334 * // Insert character 'a' at position 0 5335 * yarray.insert(0, ['a']) 5336 * // Insert numbers 1, 2 at position 1 5337 * yarray.insert(1, [1, 2]) 5338 * 5339 * @param {number} index The index to insert content at. 5340 * @param {Array<T>} content The array of content 5341 */ 5342 insert(index, content) { 5343 if (this.doc !== null) { 5344 transact(this.doc, (transaction) => { 5345 typeListInsertGenerics( 5346 transaction, 5347 this, 5348 index, 5349 /** @type {any} */ 5350 content 5351 ); 5352 }); 5353 } else { 5354 this._prelimContent.splice(index, 0, ...content); 5355 } 5356 } 5357 /** 5358 * Appends content to this YArray. 5359 * 5360 * @param {Array<T>} content Array of content to append. 5361 * 5362 * @todo Use the following implementation in all types. 5363 */ 5364 push(content) { 5365 if (this.doc !== null) { 5366 transact(this.doc, (transaction) => { 5367 typeListPushGenerics( 5368 transaction, 5369 this, 5370 /** @type {any} */ 5371 content 5372 ); 5373 }); 5374 } else { 5375 this._prelimContent.push(...content); 5376 } 5377 } 5378 /** 5379 * Prepends content to this YArray. 5380 * 5381 * @param {Array<T>} content Array of content to prepend. 5382 */ 5383 unshift(content) { 5384 this.insert(0, content); 5385 } 5386 /** 5387 * Deletes elements starting from an index. 5388 * 5389 * @param {number} index Index at which to start deleting elements 5390 * @param {number} length The number of elements to remove. Defaults to 1. 5391 */ 5392 delete(index, length3 = 1) { 5393 if (this.doc !== null) { 5394 transact(this.doc, (transaction) => { 5395 typeListDelete(transaction, this, index, length3); 5396 }); 5397 } else { 5398 this._prelimContent.splice(index, length3); 5399 } 5400 } 5401 /** 5402 * Returns the i-th element from a YArray. 5403 * 5404 * @param {number} index The index of the element to return from the YArray 5405 * @return {T} 5406 */ 5407 get(index) { 5408 return typeListGet(this, index); 5409 } 5410 /** 5411 * Transforms this YArray to a JavaScript Array. 5412 * 5413 * @return {Array<T>} 5414 */ 5415 toArray() { 5416 return typeListToArray(this); 5417 } 5418 /** 5419 * Returns a portion of this YArray into a JavaScript Array selected 5420 * from start to end (end not included). 5421 * 5422 * @param {number} [start] 5423 * @param {number} [end] 5424 * @return {Array<T>} 5425 */ 5426 slice(start = 0, end = this.length) { 5427 return typeListSlice(this, start, end); 5428 } 5429 /** 5430 * Transforms this Shared Type to a JSON object. 5431 * 5432 * @return {Array<any>} 5433 */ 5434 toJSON() { 5435 return this.map((c) => c instanceof AbstractType ? c.toJSON() : c); 5436 } 5437 /** 5438 * Returns an Array with the result of calling a provided function on every 5439 * element of this YArray. 5440 * 5441 * @template M 5442 * @param {function(T,number,YArray<T>):M} f Function that produces an element of the new Array 5443 * @return {Array<M>} A new array with each element being the result of the 5444 * callback function 5445 */ 5446 map(f) { 5447 return typeListMap( 5448 this, 5449 /** @type {any} */ 5450 f 5451 ); 5452 } 5453 /** 5454 * Executes a provided function once on every element of this YArray. 5455 * 5456 * @param {function(T,number,YArray<T>):void} f A function to execute on every element of this YArray. 5457 */ 5458 forEach(f) { 5459 typeListForEach(this, f); 5460 } 5461 /** 5462 * @return {IterableIterator<T>} 5463 */ 5464 [Symbol.iterator]() { 5465 return typeListCreateIterator(this); 5466 } 5467 /** 5468 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 5469 */ 5470 _write(encoder) { 5471 encoder.writeTypeRef(YArrayRefID); 5472 } 5473 }; 5474 var readYArray = (_decoder) => new YArray(); 5475 var YMapEvent = class extends YEvent { 5476 /** 5477 * @param {YMap<T>} ymap The YArray that changed. 5478 * @param {Transaction} transaction 5479 * @param {Set<any>} subs The keys that changed. 5480 */ 5481 constructor(ymap, transaction, subs) { 5482 super(ymap, transaction); 5483 this.keysChanged = subs; 5484 } 5485 }; 5486 var YMap = class _YMap extends AbstractType { 5487 /** 5488 * 5489 * @param {Iterable<readonly [string, any]>=} entries - an optional iterable to initialize the YMap 5490 */ 5491 constructor(entries) { 5492 super(); 5493 this._prelimContent = null; 5494 if (entries === void 0) { 5495 this._prelimContent = /* @__PURE__ */ new Map(); 5496 } else { 5497 this._prelimContent = new Map(entries); 5498 } 5499 } 5500 /** 5501 * Integrate this type into the Yjs instance. 5502 * 5503 * * Save this struct in the os 5504 * * This type is sent to other client 5505 * * Observer functions are fired 5506 * 5507 * @param {Doc} y The Yjs instance 5508 * @param {Item} item 5509 */ 5510 _integrate(y, item) { 5511 super._integrate(y, item); 5512 this._prelimContent.forEach((value, key) => { 5513 this.set(key, value); 5514 }); 5515 this._prelimContent = null; 5516 } 5517 /** 5518 * @return {YMap<MapType>} 5519 */ 5520 _copy() { 5521 return new _YMap(); 5522 } 5523 /** 5524 * Makes a copy of this data type that can be included somewhere else. 5525 * 5526 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 5527 * 5528 * @return {YMap<MapType>} 5529 */ 5530 clone() { 5531 const map2 = new _YMap(); 5532 this.forEach((value, key) => { 5533 map2.set(key, value instanceof AbstractType ? ( 5534 /** @type {typeof value} */ 5535 value.clone() 5536 ) : value); 5537 }); 5538 return map2; 5539 } 5540 /** 5541 * Creates YMapEvent and calls observers. 5542 * 5543 * @param {Transaction} transaction 5544 * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified. 5545 */ 5546 _callObserver(transaction, parentSubs) { 5547 callTypeObservers(this, transaction, new YMapEvent(this, transaction, parentSubs)); 5548 } 5549 /** 5550 * Transforms this Shared Type to a JSON object. 5551 * 5552 * @return {Object<string,any>} 5553 */ 5554 toJSON() { 5555 this.doc ?? warnPrematureAccess(); 5556 const map2 = {}; 5557 this._map.forEach((item, key) => { 5558 if (!item.deleted) { 5559 const v = item.content.getContent()[item.length - 1]; 5560 map2[key] = v instanceof AbstractType ? v.toJSON() : v; 5561 } 5562 }); 5563 return map2; 5564 } 5565 /** 5566 * Returns the size of the YMap (count of key/value pairs) 5567 * 5568 * @return {number} 5569 */ 5570 get size() { 5571 return [...createMapIterator(this)].length; 5572 } 5573 /** 5574 * Returns the keys for each element in the YMap Type. 5575 * 5576 * @return {IterableIterator<string>} 5577 */ 5578 keys() { 5579 return iteratorMap( 5580 createMapIterator(this), 5581 /** @param {any} v */ 5582 (v) => v[0] 5583 ); 5584 } 5585 /** 5586 * Returns the values for each element in the YMap Type. 5587 * 5588 * @return {IterableIterator<MapType>} 5589 */ 5590 values() { 5591 return iteratorMap( 5592 createMapIterator(this), 5593 /** @param {any} v */ 5594 (v) => v[1].content.getContent()[v[1].length - 1] 5595 ); 5596 } 5597 /** 5598 * Returns an Iterator of [key, value] pairs 5599 * 5600 * @return {IterableIterator<[string, MapType]>} 5601 */ 5602 entries() { 5603 return iteratorMap( 5604 createMapIterator(this), 5605 /** @param {any} v */ 5606 (v) => ( 5607 /** @type {any} */ 5608 [v[0], v[1].content.getContent()[v[1].length - 1]] 5609 ) 5610 ); 5611 } 5612 /** 5613 * Executes a provided function on once on every key-value pair. 5614 * 5615 * @param {function(MapType,string,YMap<MapType>):void} f A function to execute on every element of this YArray. 5616 */ 5617 forEach(f) { 5618 this.doc ?? warnPrematureAccess(); 5619 this._map.forEach((item, key) => { 5620 if (!item.deleted) { 5621 f(item.content.getContent()[item.length - 1], key, this); 5622 } 5623 }); 5624 } 5625 /** 5626 * Returns an Iterator of [key, value] pairs 5627 * 5628 * @return {IterableIterator<[string, MapType]>} 5629 */ 5630 [Symbol.iterator]() { 5631 return this.entries(); 5632 } 5633 /** 5634 * Remove a specified element from this YMap. 5635 * 5636 * @param {string} key The key of the element to remove. 5637 */ 5638 delete(key) { 5639 if (this.doc !== null) { 5640 transact(this.doc, (transaction) => { 5641 typeMapDelete(transaction, this, key); 5642 }); 5643 } else { 5644 this._prelimContent.delete(key); 5645 } 5646 } 5647 /** 5648 * Adds or updates an element with a specified key and value. 5649 * @template {MapType} VAL 5650 * 5651 * @param {string} key The key of the element to add to this YMap 5652 * @param {VAL} value The value of the element to add 5653 * @return {VAL} 5654 */ 5655 set(key, value) { 5656 if (this.doc !== null) { 5657 transact(this.doc, (transaction) => { 5658 typeMapSet( 5659 transaction, 5660 this, 5661 key, 5662 /** @type {any} */ 5663 value 5664 ); 5665 }); 5666 } else { 5667 this._prelimContent.set(key, value); 5668 } 5669 return value; 5670 } 5671 /** 5672 * Returns a specified element from this YMap. 5673 * 5674 * @param {string} key 5675 * @return {MapType|undefined} 5676 */ 5677 get(key) { 5678 return ( 5679 /** @type {any} */ 5680 typeMapGet(this, key) 5681 ); 5682 } 5683 /** 5684 * Returns a boolean indicating whether the specified key exists or not. 5685 * 5686 * @param {string} key The key to test. 5687 * @return {boolean} 5688 */ 5689 has(key) { 5690 return typeMapHas(this, key); 5691 } 5692 /** 5693 * Removes all elements from this YMap. 5694 */ 5695 clear() { 5696 if (this.doc !== null) { 5697 transact(this.doc, (transaction) => { 5698 this.forEach(function(_value, key, map2) { 5699 typeMapDelete(transaction, map2, key); 5700 }); 5701 }); 5702 } else { 5703 this._prelimContent.clear(); 5704 } 5705 } 5706 /** 5707 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 5708 */ 5709 _write(encoder) { 5710 encoder.writeTypeRef(YMapRefID); 5711 } 5712 }; 5713 var readYMap = (_decoder) => new YMap(); 5714 var equalAttrs = (a, b) => a === b || typeof a === "object" && typeof b === "object" && a && b && equalFlat(a, b); 5715 var ItemTextListPosition = class { 5716 /** 5717 * @param {Item|null} left 5718 * @param {Item|null} right 5719 * @param {number} index 5720 * @param {Map<string,any>} currentAttributes 5721 */ 5722 constructor(left, right, index, currentAttributes) { 5723 this.left = left; 5724 this.right = right; 5725 this.index = index; 5726 this.currentAttributes = currentAttributes; 5727 } 5728 /** 5729 * Only call this if you know that this.right is defined 5730 */ 5731 forward() { 5732 if (this.right === null) { 5733 unexpectedCase(); 5734 } 5735 switch (this.right.content.constructor) { 5736 case ContentFormat: 5737 if (!this.right.deleted) { 5738 updateCurrentAttributes( 5739 this.currentAttributes, 5740 /** @type {ContentFormat} */ 5741 this.right.content 5742 ); 5743 } 5744 break; 5745 default: 5746 if (!this.right.deleted) { 5747 this.index += this.right.length; 5748 } 5749 break; 5750 } 5751 this.left = this.right; 5752 this.right = this.right.right; 5753 } 5754 }; 5755 var findNextPosition = (transaction, pos, count) => { 5756 while (pos.right !== null && count > 0) { 5757 switch (pos.right.content.constructor) { 5758 case ContentFormat: 5759 if (!pos.right.deleted) { 5760 updateCurrentAttributes( 5761 pos.currentAttributes, 5762 /** @type {ContentFormat} */ 5763 pos.right.content 5764 ); 5765 } 5766 break; 5767 default: 5768 if (!pos.right.deleted) { 5769 if (count < pos.right.length) { 5770 getItemCleanStart(transaction, createID(pos.right.id.client, pos.right.id.clock + count)); 5771 } 5772 pos.index += pos.right.length; 5773 count -= pos.right.length; 5774 } 5775 break; 5776 } 5777 pos.left = pos.right; 5778 pos.right = pos.right.right; 5779 } 5780 return pos; 5781 }; 5782 var findPosition = (transaction, parent, index, useSearchMarker) => { 5783 const currentAttributes = /* @__PURE__ */ new Map(); 5784 const marker = useSearchMarker ? findMarker(parent, index) : null; 5785 if (marker) { 5786 const pos = new ItemTextListPosition(marker.p.left, marker.p, marker.index, currentAttributes); 5787 return findNextPosition(transaction, pos, index - marker.index); 5788 } else { 5789 const pos = new ItemTextListPosition(null, parent._start, 0, currentAttributes); 5790 return findNextPosition(transaction, pos, index); 5791 } 5792 }; 5793 var insertNegatedAttributes = (transaction, parent, currPos, negatedAttributes) => { 5794 while (currPos.right !== null && (currPos.right.deleted === true || currPos.right.content.constructor === ContentFormat && equalAttrs( 5795 negatedAttributes.get( 5796 /** @type {ContentFormat} */ 5797 currPos.right.content.key 5798 ), 5799 /** @type {ContentFormat} */ 5800 currPos.right.content.value 5801 ))) { 5802 if (!currPos.right.deleted) { 5803 negatedAttributes.delete( 5804 /** @type {ContentFormat} */ 5805 currPos.right.content.key 5806 ); 5807 } 5808 currPos.forward(); 5809 } 5810 const doc2 = transaction.doc; 5811 const ownClientId = doc2.clientID; 5812 negatedAttributes.forEach((val, key) => { 5813 const left = currPos.left; 5814 const right = currPos.right; 5815 const nextFormat = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val)); 5816 nextFormat.integrate(transaction, 0); 5817 currPos.right = nextFormat; 5818 currPos.forward(); 5819 }); 5820 }; 5821 var updateCurrentAttributes = (currentAttributes, format) => { 5822 const { key, value } = format; 5823 if (value === null) { 5824 currentAttributes.delete(key); 5825 } else { 5826 currentAttributes.set(key, value); 5827 } 5828 }; 5829 var minimizeAttributeChanges = (currPos, attributes) => { 5830 while (true) { 5831 if (currPos.right === null) { 5832 break; 5833 } else if (currPos.right.deleted || currPos.right.content.constructor === ContentFormat && equalAttrs( 5834 attributes[ 5835 /** @type {ContentFormat} */ 5836 currPos.right.content.key 5837 ] ?? null, 5838 /** @type {ContentFormat} */ 5839 currPos.right.content.value 5840 )) ; 5841 else { 5842 break; 5843 } 5844 currPos.forward(); 5845 } 5846 }; 5847 var insertAttributes = (transaction, parent, currPos, attributes) => { 5848 const doc2 = transaction.doc; 5849 const ownClientId = doc2.clientID; 5850 const negatedAttributes = /* @__PURE__ */ new Map(); 5851 for (const key in attributes) { 5852 const val = attributes[key]; 5853 const currentVal = currPos.currentAttributes.get(key) ?? null; 5854 if (!equalAttrs(currentVal, val)) { 5855 negatedAttributes.set(key, currentVal); 5856 const { left, right } = currPos; 5857 currPos.right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val)); 5858 currPos.right.integrate(transaction, 0); 5859 currPos.forward(); 5860 } 5861 } 5862 return negatedAttributes; 5863 }; 5864 var insertText = (transaction, parent, currPos, text2, attributes) => { 5865 currPos.currentAttributes.forEach((_val, key) => { 5866 if (attributes[key] === void 0) { 5867 attributes[key] = null; 5868 } 5869 }); 5870 const doc2 = transaction.doc; 5871 const ownClientId = doc2.clientID; 5872 minimizeAttributeChanges(currPos, attributes); 5873 const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes); 5874 const content = text2.constructor === String ? new ContentString( 5875 /** @type {string} */ 5876 text2 5877 ) : text2 instanceof AbstractType ? new ContentType(text2) : new ContentEmbed(text2); 5878 let { left, right, index } = currPos; 5879 if (parent._searchMarker) { 5880 updateMarkerChanges(parent._searchMarker, currPos.index, content.getLength()); 5881 } 5882 right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, content); 5883 right.integrate(transaction, 0); 5884 currPos.right = right; 5885 currPos.index = index; 5886 currPos.forward(); 5887 insertNegatedAttributes(transaction, parent, currPos, negatedAttributes); 5888 }; 5889 var formatText = (transaction, parent, currPos, length3, attributes) => { 5890 const doc2 = transaction.doc; 5891 const ownClientId = doc2.clientID; 5892 minimizeAttributeChanges(currPos, attributes); 5893 const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes); 5894 iterationLoop: while (currPos.right !== null && (length3 > 0 || negatedAttributes.size > 0 && (currPos.right.deleted || currPos.right.content.constructor === ContentFormat))) { 5895 if (!currPos.right.deleted) { 5896 switch (currPos.right.content.constructor) { 5897 case ContentFormat: { 5898 const { key, value } = ( 5899 /** @type {ContentFormat} */ 5900 currPos.right.content 5901 ); 5902 const attr = attributes[key]; 5903 if (attr !== void 0) { 5904 if (equalAttrs(attr, value)) { 5905 negatedAttributes.delete(key); 5906 } else { 5907 if (length3 === 0) { 5908 break iterationLoop; 5909 } 5910 negatedAttributes.set(key, value); 5911 } 5912 currPos.right.delete(transaction); 5913 } else { 5914 currPos.currentAttributes.set(key, value); 5915 } 5916 break; 5917 } 5918 default: 5919 if (length3 < currPos.right.length) { 5920 getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length3)); 5921 } 5922 length3 -= currPos.right.length; 5923 break; 5924 } 5925 } 5926 currPos.forward(); 5927 } 5928 if (length3 > 0) { 5929 let newlines = ""; 5930 for (; length3 > 0; length3--) { 5931 newlines += "\n"; 5932 } 5933 currPos.right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), currPos.left, currPos.left && currPos.left.lastId, currPos.right, currPos.right && currPos.right.id, parent, null, new ContentString(newlines)); 5934 currPos.right.integrate(transaction, 0); 5935 currPos.forward(); 5936 } 5937 insertNegatedAttributes(transaction, parent, currPos, negatedAttributes); 5938 }; 5939 var cleanupFormattingGap = (transaction, start, curr, startAttributes, currAttributes) => { 5940 let end = start; 5941 const endFormats = create(); 5942 while (end && (!end.countable || end.deleted)) { 5943 if (!end.deleted && end.content.constructor === ContentFormat) { 5944 const cf = ( 5945 /** @type {ContentFormat} */ 5946 end.content 5947 ); 5948 endFormats.set(cf.key, cf); 5949 } 5950 end = end.right; 5951 } 5952 let cleanups = 0; 5953 let reachedCurr = false; 5954 while (start !== end) { 5955 if (curr === start) { 5956 reachedCurr = true; 5957 } 5958 if (!start.deleted) { 5959 const content = start.content; 5960 switch (content.constructor) { 5961 case ContentFormat: { 5962 const { key, value } = ( 5963 /** @type {ContentFormat} */ 5964 content 5965 ); 5966 const startAttrValue = startAttributes.get(key) ?? null; 5967 if (endFormats.get(key) !== content || startAttrValue === value) { 5968 start.delete(transaction); 5969 cleanups++; 5970 if (!reachedCurr && (currAttributes.get(key) ?? null) === value && startAttrValue !== value) { 5971 if (startAttrValue === null) { 5972 currAttributes.delete(key); 5973 } else { 5974 currAttributes.set(key, startAttrValue); 5975 } 5976 } 5977 } 5978 if (!reachedCurr && !start.deleted) { 5979 updateCurrentAttributes( 5980 currAttributes, 5981 /** @type {ContentFormat} */ 5982 content 5983 ); 5984 } 5985 break; 5986 } 5987 } 5988 } 5989 start = /** @type {Item} */ 5990 start.right; 5991 } 5992 return cleanups; 5993 }; 5994 var cleanupContextlessFormattingGap = (transaction, item) => { 5995 while (item && item.right && (item.right.deleted || !item.right.countable)) { 5996 item = item.right; 5997 } 5998 const attrs = /* @__PURE__ */ new Set(); 5999 while (item && (item.deleted || !item.countable)) { 6000 if (!item.deleted && item.content.constructor === ContentFormat) { 6001 const key = ( 6002 /** @type {ContentFormat} */ 6003 item.content.key 6004 ); 6005 if (attrs.has(key)) { 6006 item.delete(transaction); 6007 } else { 6008 attrs.add(key); 6009 } 6010 } 6011 item = item.left; 6012 } 6013 }; 6014 var cleanupYTextFormatting = (type) => { 6015 let res = 0; 6016 transact( 6017 /** @type {Doc} */ 6018 type.doc, 6019 (transaction) => { 6020 let start = ( 6021 /** @type {Item} */ 6022 type._start 6023 ); 6024 let end = type._start; 6025 let startAttributes = create(); 6026 const currentAttributes = copy(startAttributes); 6027 while (end) { 6028 if (end.deleted === false) { 6029 switch (end.content.constructor) { 6030 case ContentFormat: 6031 updateCurrentAttributes( 6032 currentAttributes, 6033 /** @type {ContentFormat} */ 6034 end.content 6035 ); 6036 break; 6037 default: 6038 res += cleanupFormattingGap(transaction, start, end, startAttributes, currentAttributes); 6039 startAttributes = copy(currentAttributes); 6040 start = end; 6041 break; 6042 } 6043 } 6044 end = end.right; 6045 } 6046 } 6047 ); 6048 return res; 6049 }; 6050 var cleanupYTextAfterTransaction = (transaction) => { 6051 const needFullCleanup = /* @__PURE__ */ new Set(); 6052 const doc2 = transaction.doc; 6053 for (const [client, afterClock] of transaction.afterState.entries()) { 6054 const clock = transaction.beforeState.get(client) || 0; 6055 if (afterClock === clock) { 6056 continue; 6057 } 6058 iterateStructs( 6059 transaction, 6060 /** @type {Array<Item|GC>} */ 6061 doc2.store.clients.get(client), 6062 clock, 6063 afterClock, 6064 (item) => { 6065 if (!item.deleted && /** @type {Item} */ 6066 item.content.constructor === ContentFormat && item.constructor !== GC) { 6067 needFullCleanup.add( 6068 /** @type {any} */ 6069 item.parent 6070 ); 6071 } 6072 } 6073 ); 6074 } 6075 transact(doc2, (t) => { 6076 iterateDeletedStructs(transaction, transaction.deleteSet, (item) => { 6077 if (item instanceof GC || !/** @type {YText} */ 6078 item.parent._hasFormatting || needFullCleanup.has( 6079 /** @type {YText} */ 6080 item.parent 6081 )) { 6082 return; 6083 } 6084 const parent = ( 6085 /** @type {YText} */ 6086 item.parent 6087 ); 6088 if (item.content.constructor === ContentFormat) { 6089 needFullCleanup.add(parent); 6090 } else { 6091 cleanupContextlessFormattingGap(t, item); 6092 } 6093 }); 6094 for (const yText of needFullCleanup) { 6095 cleanupYTextFormatting(yText); 6096 } 6097 }); 6098 }; 6099 var deleteText = (transaction, currPos, length3) => { 6100 const startLength = length3; 6101 const startAttrs = copy(currPos.currentAttributes); 6102 const start = currPos.right; 6103 while (length3 > 0 && currPos.right !== null) { 6104 if (currPos.right.deleted === false) { 6105 switch (currPos.right.content.constructor) { 6106 case ContentType: 6107 case ContentEmbed: 6108 case ContentString: 6109 if (length3 < currPos.right.length) { 6110 getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length3)); 6111 } 6112 length3 -= currPos.right.length; 6113 currPos.right.delete(transaction); 6114 break; 6115 } 6116 } 6117 currPos.forward(); 6118 } 6119 if (start) { 6120 cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes); 6121 } 6122 const parent = ( 6123 /** @type {AbstractType<any>} */ 6124 /** @type {Item} */ 6125 (currPos.left || currPos.right).parent 6126 ); 6127 if (parent._searchMarker) { 6128 updateMarkerChanges(parent._searchMarker, currPos.index, -startLength + length3); 6129 } 6130 return currPos; 6131 }; 6132 var YTextEvent = class extends YEvent { 6133 /** 6134 * @param {YText} ytext 6135 * @param {Transaction} transaction 6136 * @param {Set<any>} subs The keys that changed 6137 */ 6138 constructor(ytext, transaction, subs) { 6139 super(ytext, transaction); 6140 this.childListChanged = false; 6141 this.keysChanged = /* @__PURE__ */ new Set(); 6142 subs.forEach((sub) => { 6143 if (sub === null) { 6144 this.childListChanged = true; 6145 } else { 6146 this.keysChanged.add(sub); 6147 } 6148 }); 6149 } 6150 /** 6151 * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}} 6152 */ 6153 get changes() { 6154 if (this._changes === null) { 6155 const changes = { 6156 keys: this.keys, 6157 delta: this.delta, 6158 added: /* @__PURE__ */ new Set(), 6159 deleted: /* @__PURE__ */ new Set() 6160 }; 6161 this._changes = changes; 6162 } 6163 return ( 6164 /** @type {any} */ 6165 this._changes 6166 ); 6167 } 6168 /** 6169 * Compute the changes in the delta format. 6170 * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document. 6171 * 6172 * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>} 6173 * 6174 * @public 6175 */ 6176 get delta() { 6177 if (this._delta === null) { 6178 const y = ( 6179 /** @type {Doc} */ 6180 this.target.doc 6181 ); 6182 const delta = []; 6183 transact(y, (transaction) => { 6184 const currentAttributes = /* @__PURE__ */ new Map(); 6185 const oldAttributes = /* @__PURE__ */ new Map(); 6186 let item = this.target._start; 6187 let action = null; 6188 const attributes = {}; 6189 let insert = ""; 6190 let retain = 0; 6191 let deleteLen = 0; 6192 const addOp = () => { 6193 if (action !== null) { 6194 let op = null; 6195 switch (action) { 6196 case "delete": 6197 if (deleteLen > 0) { 6198 op = { delete: deleteLen }; 6199 } 6200 deleteLen = 0; 6201 break; 6202 case "insert": 6203 if (typeof insert === "object" || insert.length > 0) { 6204 op = { insert }; 6205 if (currentAttributes.size > 0) { 6206 op.attributes = {}; 6207 currentAttributes.forEach((value, key) => { 6208 if (value !== null) { 6209 op.attributes[key] = value; 6210 } 6211 }); 6212 } 6213 } 6214 insert = ""; 6215 break; 6216 case "retain": 6217 if (retain > 0) { 6218 op = { retain }; 6219 if (!isEmpty(attributes)) { 6220 op.attributes = assign({}, attributes); 6221 } 6222 } 6223 retain = 0; 6224 break; 6225 } 6226 if (op) delta.push(op); 6227 action = null; 6228 } 6229 }; 6230 while (item !== null) { 6231 switch (item.content.constructor) { 6232 case ContentType: 6233 case ContentEmbed: 6234 if (this.adds(item)) { 6235 if (!this.deletes(item)) { 6236 addOp(); 6237 action = "insert"; 6238 insert = item.content.getContent()[0]; 6239 addOp(); 6240 } 6241 } else if (this.deletes(item)) { 6242 if (action !== "delete") { 6243 addOp(); 6244 action = "delete"; 6245 } 6246 deleteLen += 1; 6247 } else if (!item.deleted) { 6248 if (action !== "retain") { 6249 addOp(); 6250 action = "retain"; 6251 } 6252 retain += 1; 6253 } 6254 break; 6255 case ContentString: 6256 if (this.adds(item)) { 6257 if (!this.deletes(item)) { 6258 if (action !== "insert") { 6259 addOp(); 6260 action = "insert"; 6261 } 6262 insert += /** @type {ContentString} */ 6263 item.content.str; 6264 } 6265 } else if (this.deletes(item)) { 6266 if (action !== "delete") { 6267 addOp(); 6268 action = "delete"; 6269 } 6270 deleteLen += item.length; 6271 } else if (!item.deleted) { 6272 if (action !== "retain") { 6273 addOp(); 6274 action = "retain"; 6275 } 6276 retain += item.length; 6277 } 6278 break; 6279 case ContentFormat: { 6280 const { key, value } = ( 6281 /** @type {ContentFormat} */ 6282 item.content 6283 ); 6284 if (this.adds(item)) { 6285 if (!this.deletes(item)) { 6286 const curVal = currentAttributes.get(key) ?? null; 6287 if (!equalAttrs(curVal, value)) { 6288 if (action === "retain") { 6289 addOp(); 6290 } 6291 if (equalAttrs(value, oldAttributes.get(key) ?? null)) { 6292 delete attributes[key]; 6293 } else { 6294 attributes[key] = value; 6295 } 6296 } else if (value !== null) { 6297 item.delete(transaction); 6298 } 6299 } 6300 } else if (this.deletes(item)) { 6301 oldAttributes.set(key, value); 6302 const curVal = currentAttributes.get(key) ?? null; 6303 if (!equalAttrs(curVal, value)) { 6304 if (action === "retain") { 6305 addOp(); 6306 } 6307 attributes[key] = curVal; 6308 } 6309 } else if (!item.deleted) { 6310 oldAttributes.set(key, value); 6311 const attr = attributes[key]; 6312 if (attr !== void 0) { 6313 if (!equalAttrs(attr, value)) { 6314 if (action === "retain") { 6315 addOp(); 6316 } 6317 if (value === null) { 6318 delete attributes[key]; 6319 } else { 6320 attributes[key] = value; 6321 } 6322 } else if (attr !== null) { 6323 item.delete(transaction); 6324 } 6325 } 6326 } 6327 if (!item.deleted) { 6328 if (action === "insert") { 6329 addOp(); 6330 } 6331 updateCurrentAttributes( 6332 currentAttributes, 6333 /** @type {ContentFormat} */ 6334 item.content 6335 ); 6336 } 6337 break; 6338 } 6339 } 6340 item = item.right; 6341 } 6342 addOp(); 6343 while (delta.length > 0) { 6344 const lastOp = delta[delta.length - 1]; 6345 if (lastOp.retain !== void 0 && lastOp.attributes === void 0) { 6346 delta.pop(); 6347 } else { 6348 break; 6349 } 6350 } 6351 }); 6352 this._delta = delta; 6353 } 6354 return ( 6355 /** @type {any} */ 6356 this._delta 6357 ); 6358 } 6359 }; 6360 var YText = class _YText extends AbstractType { 6361 /** 6362 * @param {String} [string] The initial value of the YText. 6363 */ 6364 constructor(string) { 6365 super(); 6366 this._pending = string !== void 0 ? [() => this.insert(0, string)] : []; 6367 this._searchMarker = []; 6368 this._hasFormatting = false; 6369 } 6370 /** 6371 * Number of characters of this text type. 6372 * 6373 * @type {number} 6374 */ 6375 get length() { 6376 this.doc ?? warnPrematureAccess(); 6377 return this._length; 6378 } 6379 /** 6380 * @param {Doc} y 6381 * @param {Item} item 6382 */ 6383 _integrate(y, item) { 6384 super._integrate(y, item); 6385 try { 6386 this._pending.forEach((f) => f()); 6387 } catch (e) { 6388 console.error(e); 6389 } 6390 this._pending = null; 6391 } 6392 _copy() { 6393 return new _YText(); 6394 } 6395 /** 6396 * Makes a copy of this data type that can be included somewhere else. 6397 * 6398 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 6399 * 6400 * @return {YText} 6401 */ 6402 clone() { 6403 const text2 = new _YText(); 6404 text2.applyDelta(this.toDelta()); 6405 return text2; 6406 } 6407 /** 6408 * Creates YTextEvent and calls observers. 6409 * 6410 * @param {Transaction} transaction 6411 * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified. 6412 */ 6413 _callObserver(transaction, parentSubs) { 6414 super._callObserver(transaction, parentSubs); 6415 const event = new YTextEvent(this, transaction, parentSubs); 6416 callTypeObservers(this, transaction, event); 6417 if (!transaction.local && this._hasFormatting) { 6418 transaction._needFormattingCleanup = true; 6419 } 6420 } 6421 /** 6422 * Returns the unformatted string representation of this YText type. 6423 * 6424 * @public 6425 */ 6426 toString() { 6427 this.doc ?? warnPrematureAccess(); 6428 let str = ""; 6429 let n = this._start; 6430 while (n !== null) { 6431 if (!n.deleted && n.countable && n.content.constructor === ContentString) { 6432 str += /** @type {ContentString} */ 6433 n.content.str; 6434 } 6435 n = n.right; 6436 } 6437 return str; 6438 } 6439 /** 6440 * Returns the unformatted string representation of this YText type. 6441 * 6442 * @return {string} 6443 * @public 6444 */ 6445 toJSON() { 6446 return this.toString(); 6447 } 6448 /** 6449 * Apply a {@link Delta} on this shared YText type. 6450 * 6451 * @param {Array<any>} delta The changes to apply on this element. 6452 * @param {object} opts 6453 * @param {boolean} [opts.sanitize] Sanitize input delta. Removes ending newlines if set to true. 6454 * 6455 * 6456 * @public 6457 */ 6458 applyDelta(delta, { sanitize = true } = {}) { 6459 if (this.doc !== null) { 6460 transact(this.doc, (transaction) => { 6461 const currPos = new ItemTextListPosition(null, this._start, 0, /* @__PURE__ */ new Map()); 6462 for (let i = 0; i < delta.length; i++) { 6463 const op = delta[i]; 6464 if (op.insert !== void 0) { 6465 const ins = !sanitize && typeof op.insert === "string" && i === delta.length - 1 && currPos.right === null && op.insert.slice(-1) === "\n" ? op.insert.slice(0, -1) : op.insert; 6466 if (typeof ins !== "string" || ins.length > 0) { 6467 insertText(transaction, this, currPos, ins, op.attributes || {}); 6468 } 6469 } else if (op.retain !== void 0) { 6470 formatText(transaction, this, currPos, op.retain, op.attributes || {}); 6471 } else if (op.delete !== void 0) { 6472 deleteText(transaction, currPos, op.delete); 6473 } 6474 } 6475 }); 6476 } else { 6477 this._pending.push(() => this.applyDelta(delta)); 6478 } 6479 } 6480 /** 6481 * Returns the Delta representation of this YText type. 6482 * 6483 * @param {Snapshot} [snapshot] 6484 * @param {Snapshot} [prevSnapshot] 6485 * @param {function('removed' | 'added', ID):any} [computeYChange] 6486 * @return {any} The Delta representation of this type. 6487 * 6488 * @public 6489 */ 6490 toDelta(snapshot2, prevSnapshot, computeYChange) { 6491 this.doc ?? warnPrematureAccess(); 6492 const ops = []; 6493 const currentAttributes = /* @__PURE__ */ new Map(); 6494 const doc2 = ( 6495 /** @type {Doc} */ 6496 this.doc 6497 ); 6498 let str = ""; 6499 let n = this._start; 6500 function packStr() { 6501 if (str.length > 0) { 6502 const attributes = {}; 6503 let addAttributes = false; 6504 currentAttributes.forEach((value, key) => { 6505 addAttributes = true; 6506 attributes[key] = value; 6507 }); 6508 const op = { insert: str }; 6509 if (addAttributes) { 6510 op.attributes = attributes; 6511 } 6512 ops.push(op); 6513 str = ""; 6514 } 6515 } 6516 const computeDelta = () => { 6517 while (n !== null) { 6518 if (isVisible(n, snapshot2) || prevSnapshot !== void 0 && isVisible(n, prevSnapshot)) { 6519 switch (n.content.constructor) { 6520 case ContentString: { 6521 const cur = currentAttributes.get("ychange"); 6522 if (snapshot2 !== void 0 && !isVisible(n, snapshot2)) { 6523 if (cur === void 0 || cur.user !== n.id.client || cur.type !== "removed") { 6524 packStr(); 6525 currentAttributes.set("ychange", computeYChange ? computeYChange("removed", n.id) : { type: "removed" }); 6526 } 6527 } else if (prevSnapshot !== void 0 && !isVisible(n, prevSnapshot)) { 6528 if (cur === void 0 || cur.user !== n.id.client || cur.type !== "added") { 6529 packStr(); 6530 currentAttributes.set("ychange", computeYChange ? computeYChange("added", n.id) : { type: "added" }); 6531 } 6532 } else if (cur !== void 0) { 6533 packStr(); 6534 currentAttributes.delete("ychange"); 6535 } 6536 str += /** @type {ContentString} */ 6537 n.content.str; 6538 break; 6539 } 6540 case ContentType: 6541 case ContentEmbed: { 6542 packStr(); 6543 const op = { 6544 insert: n.content.getContent()[0] 6545 }; 6546 if (currentAttributes.size > 0) { 6547 const attrs = ( 6548 /** @type {Object<string,any>} */ 6549 {} 6550 ); 6551 op.attributes = attrs; 6552 currentAttributes.forEach((value, key) => { 6553 attrs[key] = value; 6554 }); 6555 } 6556 ops.push(op); 6557 break; 6558 } 6559 case ContentFormat: 6560 if (isVisible(n, snapshot2)) { 6561 packStr(); 6562 updateCurrentAttributes( 6563 currentAttributes, 6564 /** @type {ContentFormat} */ 6565 n.content 6566 ); 6567 } 6568 break; 6569 } 6570 } 6571 n = n.right; 6572 } 6573 packStr(); 6574 }; 6575 if (snapshot2 || prevSnapshot) { 6576 transact(doc2, (transaction) => { 6577 if (snapshot2) { 6578 splitSnapshotAffectedStructs(transaction, snapshot2); 6579 } 6580 if (prevSnapshot) { 6581 splitSnapshotAffectedStructs(transaction, prevSnapshot); 6582 } 6583 computeDelta(); 6584 }, "cleanup"); 6585 } else { 6586 computeDelta(); 6587 } 6588 return ops; 6589 } 6590 /** 6591 * Insert text at a given index. 6592 * 6593 * @param {number} index The index at which to start inserting. 6594 * @param {String} text The text to insert at the specified position. 6595 * @param {TextAttributes} [attributes] Optionally define some formatting 6596 * information to apply on the inserted 6597 * Text. 6598 * @public 6599 */ 6600 insert(index, text2, attributes) { 6601 if (text2.length <= 0) { 6602 return; 6603 } 6604 const y = this.doc; 6605 if (y !== null) { 6606 transact(y, (transaction) => { 6607 const pos = findPosition(transaction, this, index, !attributes); 6608 if (!attributes) { 6609 attributes = {}; 6610 pos.currentAttributes.forEach((v, k) => { 6611 attributes[k] = v; 6612 }); 6613 } 6614 insertText(transaction, this, pos, text2, attributes); 6615 }); 6616 } else { 6617 this._pending.push(() => this.insert(index, text2, attributes)); 6618 } 6619 } 6620 /** 6621 * Inserts an embed at a index. 6622 * 6623 * @param {number} index The index to insert the embed at. 6624 * @param {Object | AbstractType<any>} embed The Object that represents the embed. 6625 * @param {TextAttributes} [attributes] Attribute information to apply on the 6626 * embed 6627 * 6628 * @public 6629 */ 6630 insertEmbed(index, embed, attributes) { 6631 const y = this.doc; 6632 if (y !== null) { 6633 transact(y, (transaction) => { 6634 const pos = findPosition(transaction, this, index, !attributes); 6635 insertText(transaction, this, pos, embed, attributes || {}); 6636 }); 6637 } else { 6638 this._pending.push(() => this.insertEmbed(index, embed, attributes || {})); 6639 } 6640 } 6641 /** 6642 * Deletes text starting from an index. 6643 * 6644 * @param {number} index Index at which to start deleting. 6645 * @param {number} length The number of characters to remove. Defaults to 1. 6646 * 6647 * @public 6648 */ 6649 delete(index, length3) { 6650 if (length3 === 0) { 6651 return; 6652 } 6653 const y = this.doc; 6654 if (y !== null) { 6655 transact(y, (transaction) => { 6656 deleteText(transaction, findPosition(transaction, this, index, true), length3); 6657 }); 6658 } else { 6659 this._pending.push(() => this.delete(index, length3)); 6660 } 6661 } 6662 /** 6663 * Assigns properties to a range of text. 6664 * 6665 * @param {number} index The position where to start formatting. 6666 * @param {number} length The amount of characters to assign properties to. 6667 * @param {TextAttributes} attributes Attribute information to apply on the 6668 * text. 6669 * 6670 * @public 6671 */ 6672 format(index, length3, attributes) { 6673 if (length3 === 0) { 6674 return; 6675 } 6676 const y = this.doc; 6677 if (y !== null) { 6678 transact(y, (transaction) => { 6679 const pos = findPosition(transaction, this, index, false); 6680 if (pos.right === null) { 6681 return; 6682 } 6683 formatText(transaction, this, pos, length3, attributes); 6684 }); 6685 } else { 6686 this._pending.push(() => this.format(index, length3, attributes)); 6687 } 6688 } 6689 /** 6690 * Removes an attribute. 6691 * 6692 * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. 6693 * 6694 * @param {String} attributeName The attribute name that is to be removed. 6695 * 6696 * @public 6697 */ 6698 removeAttribute(attributeName) { 6699 if (this.doc !== null) { 6700 transact(this.doc, (transaction) => { 6701 typeMapDelete(transaction, this, attributeName); 6702 }); 6703 } else { 6704 this._pending.push(() => this.removeAttribute(attributeName)); 6705 } 6706 } 6707 /** 6708 * Sets or updates an attribute. 6709 * 6710 * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. 6711 * 6712 * @param {String} attributeName The attribute name that is to be set. 6713 * @param {any} attributeValue The attribute value that is to be set. 6714 * 6715 * @public 6716 */ 6717 setAttribute(attributeName, attributeValue) { 6718 if (this.doc !== null) { 6719 transact(this.doc, (transaction) => { 6720 typeMapSet(transaction, this, attributeName, attributeValue); 6721 }); 6722 } else { 6723 this._pending.push(() => this.setAttribute(attributeName, attributeValue)); 6724 } 6725 } 6726 /** 6727 * Returns an attribute value that belongs to the attribute name. 6728 * 6729 * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. 6730 * 6731 * @param {String} attributeName The attribute name that identifies the 6732 * queried value. 6733 * @return {any} The queried attribute value. 6734 * 6735 * @public 6736 */ 6737 getAttribute(attributeName) { 6738 return ( 6739 /** @type {any} */ 6740 typeMapGet(this, attributeName) 6741 ); 6742 } 6743 /** 6744 * Returns all attribute name/value pairs in a JSON Object. 6745 * 6746 * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks. 6747 * 6748 * @return {Object<string, any>} A JSON Object that describes the attributes. 6749 * 6750 * @public 6751 */ 6752 getAttributes() { 6753 return typeMapGetAll(this); 6754 } 6755 /** 6756 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 6757 */ 6758 _write(encoder) { 6759 encoder.writeTypeRef(YTextRefID); 6760 } 6761 }; 6762 var readYText = (_decoder) => new YText(); 6763 var YXmlTreeWalker = class { 6764 /** 6765 * @param {YXmlFragment | YXmlElement} root 6766 * @param {function(AbstractType<any>):boolean} [f] 6767 */ 6768 constructor(root, f = () => true) { 6769 this._filter = f; 6770 this._root = root; 6771 this._currentNode = /** @type {Item} */ 6772 root._start; 6773 this._firstCall = true; 6774 root.doc ?? warnPrematureAccess(); 6775 } 6776 [Symbol.iterator]() { 6777 return this; 6778 } 6779 /** 6780 * Get the next node. 6781 * 6782 * @return {IteratorResult<YXmlElement|YXmlText|YXmlHook>} The next node. 6783 * 6784 * @public 6785 */ 6786 next() { 6787 let n = this._currentNode; 6788 let type = n && n.content && /** @type {any} */ 6789 n.content.type; 6790 if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) { 6791 do { 6792 type = /** @type {any} */ 6793 n.content.type; 6794 if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) { 6795 n = type._start; 6796 } else { 6797 while (n !== null) { 6798 const nxt = n.next; 6799 if (nxt !== null) { 6800 n = nxt; 6801 break; 6802 } else if (n.parent === this._root) { 6803 n = null; 6804 } else { 6805 n = /** @type {AbstractType<any>} */ 6806 n.parent._item; 6807 } 6808 } 6809 } 6810 } while (n !== null && (n.deleted || !this._filter( 6811 /** @type {ContentType} */ 6812 n.content.type 6813 ))); 6814 } 6815 this._firstCall = false; 6816 if (n === null) { 6817 return { value: void 0, done: true }; 6818 } 6819 this._currentNode = n; 6820 return { value: ( 6821 /** @type {any} */ 6822 n.content.type 6823 ), done: false }; 6824 } 6825 }; 6826 var YXmlFragment = class _YXmlFragment extends AbstractType { 6827 constructor() { 6828 super(); 6829 this._prelimContent = []; 6830 } 6831 /** 6832 * @type {YXmlElement|YXmlText|null} 6833 */ 6834 get firstChild() { 6835 const first = this._first; 6836 return first ? first.content.getContent()[0] : null; 6837 } 6838 /** 6839 * Integrate this type into the Yjs instance. 6840 * 6841 * * Save this struct in the os 6842 * * This type is sent to other client 6843 * * Observer functions are fired 6844 * 6845 * @param {Doc} y The Yjs instance 6846 * @param {Item} item 6847 */ 6848 _integrate(y, item) { 6849 super._integrate(y, item); 6850 this.insert( 6851 0, 6852 /** @type {Array<any>} */ 6853 this._prelimContent 6854 ); 6855 this._prelimContent = null; 6856 } 6857 _copy() { 6858 return new _YXmlFragment(); 6859 } 6860 /** 6861 * Makes a copy of this data type that can be included somewhere else. 6862 * 6863 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 6864 * 6865 * @return {YXmlFragment} 6866 */ 6867 clone() { 6868 const el = new _YXmlFragment(); 6869 el.insert(0, this.toArray().map((item) => item instanceof AbstractType ? item.clone() : item)); 6870 return el; 6871 } 6872 get length() { 6873 this.doc ?? warnPrematureAccess(); 6874 return this._prelimContent === null ? this._length : this._prelimContent.length; 6875 } 6876 /** 6877 * Create a subtree of childNodes. 6878 * 6879 * @example 6880 * const walker = elem.createTreeWalker(dom => dom.nodeName === 'div') 6881 * for (let node in walker) { 6882 * // `node` is a div node 6883 * nop(node) 6884 * } 6885 * 6886 * @param {function(AbstractType<any>):boolean} filter Function that is called on each child element and 6887 * returns a Boolean indicating whether the child 6888 * is to be included in the subtree. 6889 * @return {YXmlTreeWalker} A subtree and a position within it. 6890 * 6891 * @public 6892 */ 6893 createTreeWalker(filter) { 6894 return new YXmlTreeWalker(this, filter); 6895 } 6896 /** 6897 * Returns the first YXmlElement that matches the query. 6898 * Similar to DOM's {@link querySelector}. 6899 * 6900 * Query support: 6901 * - tagname 6902 * TODO: 6903 * - id 6904 * - attribute 6905 * 6906 * @param {CSS_Selector} query The query on the children. 6907 * @return {YXmlElement|YXmlText|YXmlHook|null} The first element that matches the query or null. 6908 * 6909 * @public 6910 */ 6911 querySelector(query) { 6912 query = query.toUpperCase(); 6913 const iterator = new YXmlTreeWalker(this, (element2) => element2.nodeName && element2.nodeName.toUpperCase() === query); 6914 const next = iterator.next(); 6915 if (next.done) { 6916 return null; 6917 } else { 6918 return next.value; 6919 } 6920 } 6921 /** 6922 * Returns all YXmlElements that match the query. 6923 * Similar to Dom's {@link querySelectorAll}. 6924 * 6925 * @todo Does not yet support all queries. Currently only query by tagName. 6926 * 6927 * @param {CSS_Selector} query The query on the children 6928 * @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query. 6929 * 6930 * @public 6931 */ 6932 querySelectorAll(query) { 6933 query = query.toUpperCase(); 6934 return from(new YXmlTreeWalker(this, (element2) => element2.nodeName && element2.nodeName.toUpperCase() === query)); 6935 } 6936 /** 6937 * Creates YXmlEvent and calls observers. 6938 * 6939 * @param {Transaction} transaction 6940 * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified. 6941 */ 6942 _callObserver(transaction, parentSubs) { 6943 callTypeObservers(this, transaction, new YXmlEvent(this, parentSubs, transaction)); 6944 } 6945 /** 6946 * Get the string representation of all the children of this YXmlFragment. 6947 * 6948 * @return {string} The string representation of all children. 6949 */ 6950 toString() { 6951 return typeListMap(this, (xml) => xml.toString()).join(""); 6952 } 6953 /** 6954 * @return {string} 6955 */ 6956 toJSON() { 6957 return this.toString(); 6958 } 6959 /** 6960 * Creates a Dom Element that mirrors this YXmlElement. 6961 * 6962 * @param {Document} [_document=document] The document object (you must define 6963 * this when calling this method in 6964 * nodejs) 6965 * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks 6966 * are presented in the DOM 6967 * @param {any} [binding] You should not set this property. This is 6968 * used if DomBinding wants to create a 6969 * association to the created DOM type. 6970 * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} 6971 * 6972 * @public 6973 */ 6974 toDOM(_document = document, hooks = {}, binding) { 6975 const fragment = _document.createDocumentFragment(); 6976 if (binding !== void 0) { 6977 binding._createAssociation(fragment, this); 6978 } 6979 typeListForEach(this, (xmlType) => { 6980 fragment.insertBefore(xmlType.toDOM(_document, hooks, binding), null); 6981 }); 6982 return fragment; 6983 } 6984 /** 6985 * Inserts new content at an index. 6986 * 6987 * @example 6988 * // Insert character 'a' at position 0 6989 * xml.insert(0, [new Y.XmlText('text')]) 6990 * 6991 * @param {number} index The index to insert content at 6992 * @param {Array<YXmlElement|YXmlText>} content The array of content 6993 */ 6994 insert(index, content) { 6995 if (this.doc !== null) { 6996 transact(this.doc, (transaction) => { 6997 typeListInsertGenerics(transaction, this, index, content); 6998 }); 6999 } else { 7000 this._prelimContent.splice(index, 0, ...content); 7001 } 7002 } 7003 /** 7004 * Inserts new content at an index. 7005 * 7006 * @example 7007 * // Insert character 'a' at position 0 7008 * xml.insert(0, [new Y.XmlText('text')]) 7009 * 7010 * @param {null|Item|YXmlElement|YXmlText} ref The index to insert content at 7011 * @param {Array<YXmlElement|YXmlText>} content The array of content 7012 */ 7013 insertAfter(ref, content) { 7014 if (this.doc !== null) { 7015 transact(this.doc, (transaction) => { 7016 const refItem = ref && ref instanceof AbstractType ? ref._item : ref; 7017 typeListInsertGenericsAfter(transaction, this, refItem, content); 7018 }); 7019 } else { 7020 const pc = ( 7021 /** @type {Array<any>} */ 7022 this._prelimContent 7023 ); 7024 const index = ref === null ? 0 : pc.findIndex((el) => el === ref) + 1; 7025 if (index === 0 && ref !== null) { 7026 throw create3("Reference item not found"); 7027 } 7028 pc.splice(index, 0, ...content); 7029 } 7030 } 7031 /** 7032 * Deletes elements starting from an index. 7033 * 7034 * @param {number} index Index at which to start deleting elements 7035 * @param {number} [length=1] The number of elements to remove. Defaults to 1. 7036 */ 7037 delete(index, length3 = 1) { 7038 if (this.doc !== null) { 7039 transact(this.doc, (transaction) => { 7040 typeListDelete(transaction, this, index, length3); 7041 }); 7042 } else { 7043 this._prelimContent.splice(index, length3); 7044 } 7045 } 7046 /** 7047 * Transforms this YArray to a JavaScript Array. 7048 * 7049 * @return {Array<YXmlElement|YXmlText|YXmlHook>} 7050 */ 7051 toArray() { 7052 return typeListToArray(this); 7053 } 7054 /** 7055 * Appends content to this YArray. 7056 * 7057 * @param {Array<YXmlElement|YXmlText>} content Array of content to append. 7058 */ 7059 push(content) { 7060 this.insert(this.length, content); 7061 } 7062 /** 7063 * Prepends content to this YArray. 7064 * 7065 * @param {Array<YXmlElement|YXmlText>} content Array of content to prepend. 7066 */ 7067 unshift(content) { 7068 this.insert(0, content); 7069 } 7070 /** 7071 * Returns the i-th element from a YArray. 7072 * 7073 * @param {number} index The index of the element to return from the YArray 7074 * @return {YXmlElement|YXmlText} 7075 */ 7076 get(index) { 7077 return typeListGet(this, index); 7078 } 7079 /** 7080 * Returns a portion of this YXmlFragment into a JavaScript Array selected 7081 * from start to end (end not included). 7082 * 7083 * @param {number} [start] 7084 * @param {number} [end] 7085 * @return {Array<YXmlElement|YXmlText>} 7086 */ 7087 slice(start = 0, end = this.length) { 7088 return typeListSlice(this, start, end); 7089 } 7090 /** 7091 * Executes a provided function on once on every child element. 7092 * 7093 * @param {function(YXmlElement|YXmlText,number, typeof self):void} f A function to execute on every element of this YArray. 7094 */ 7095 forEach(f) { 7096 typeListForEach(this, f); 7097 } 7098 /** 7099 * Transform the properties of this type to binary and write it to an 7100 * BinaryEncoder. 7101 * 7102 * This is called when this Item is sent to a remote peer. 7103 * 7104 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. 7105 */ 7106 _write(encoder) { 7107 encoder.writeTypeRef(YXmlFragmentRefID); 7108 } 7109 }; 7110 var readYXmlFragment = (_decoder) => new YXmlFragment(); 7111 var YXmlElement = class _YXmlElement extends YXmlFragment { 7112 constructor(nodeName = "UNDEFINED") { 7113 super(); 7114 this.nodeName = nodeName; 7115 this._prelimAttrs = /* @__PURE__ */ new Map(); 7116 } 7117 /** 7118 * @type {YXmlElement|YXmlText|null} 7119 */ 7120 get nextSibling() { 7121 const n = this._item ? this._item.next : null; 7122 return n ? ( 7123 /** @type {YXmlElement|YXmlText} */ 7124 /** @type {ContentType} */ 7125 n.content.type 7126 ) : null; 7127 } 7128 /** 7129 * @type {YXmlElement|YXmlText|null} 7130 */ 7131 get prevSibling() { 7132 const n = this._item ? this._item.prev : null; 7133 return n ? ( 7134 /** @type {YXmlElement|YXmlText} */ 7135 /** @type {ContentType} */ 7136 n.content.type 7137 ) : null; 7138 } 7139 /** 7140 * Integrate this type into the Yjs instance. 7141 * 7142 * * Save this struct in the os 7143 * * This type is sent to other client 7144 * * Observer functions are fired 7145 * 7146 * @param {Doc} y The Yjs instance 7147 * @param {Item} item 7148 */ 7149 _integrate(y, item) { 7150 super._integrate(y, item); 7151 /** @type {Map<string, any>} */ 7152 this._prelimAttrs.forEach((value, key) => { 7153 this.setAttribute(key, value); 7154 }); 7155 this._prelimAttrs = null; 7156 } 7157 /** 7158 * Creates an Item with the same effect as this Item (without position effect) 7159 * 7160 * @return {YXmlElement} 7161 */ 7162 _copy() { 7163 return new _YXmlElement(this.nodeName); 7164 } 7165 /** 7166 * Makes a copy of this data type that can be included somewhere else. 7167 * 7168 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 7169 * 7170 * @return {YXmlElement<KV>} 7171 */ 7172 clone() { 7173 const el = new _YXmlElement(this.nodeName); 7174 const attrs = this.getAttributes(); 7175 forEach(attrs, (value, key) => { 7176 el.setAttribute( 7177 key, 7178 /** @type {any} */ 7179 value 7180 ); 7181 }); 7182 el.insert(0, this.toArray().map((v) => v instanceof AbstractType ? v.clone() : v)); 7183 return el; 7184 } 7185 /** 7186 * Returns the XML serialization of this YXmlElement. 7187 * The attributes are ordered by attribute-name, so you can easily use this 7188 * method to compare YXmlElements 7189 * 7190 * @return {string} The string representation of this type. 7191 * 7192 * @public 7193 */ 7194 toString() { 7195 const attrs = this.getAttributes(); 7196 const stringBuilder = []; 7197 const keys2 = []; 7198 for (const key in attrs) { 7199 keys2.push(key); 7200 } 7201 keys2.sort(); 7202 const keysLen = keys2.length; 7203 for (let i = 0; i < keysLen; i++) { 7204 const key = keys2[i]; 7205 stringBuilder.push(key + '="' + attrs[key] + '"'); 7206 } 7207 const nodeName = this.nodeName.toLocaleLowerCase(); 7208 const attrsString = stringBuilder.length > 0 ? " " + stringBuilder.join(" ") : ""; 7209 return `<$nodeName}$attrsString}>$super.toString()}</$nodeName}>`; 7210 } 7211 /** 7212 * Removes an attribute from this YXmlElement. 7213 * 7214 * @param {string} attributeName The attribute name that is to be removed. 7215 * 7216 * @public 7217 */ 7218 removeAttribute(attributeName) { 7219 if (this.doc !== null) { 7220 transact(this.doc, (transaction) => { 7221 typeMapDelete(transaction, this, attributeName); 7222 }); 7223 } else { 7224 this._prelimAttrs.delete(attributeName); 7225 } 7226 } 7227 /** 7228 * Sets or updates an attribute. 7229 * 7230 * @template {keyof KV & string} KEY 7231 * 7232 * @param {KEY} attributeName The attribute name that is to be set. 7233 * @param {KV[KEY]} attributeValue The attribute value that is to be set. 7234 * 7235 * @public 7236 */ 7237 setAttribute(attributeName, attributeValue) { 7238 if (this.doc !== null) { 7239 transact(this.doc, (transaction) => { 7240 typeMapSet(transaction, this, attributeName, attributeValue); 7241 }); 7242 } else { 7243 this._prelimAttrs.set(attributeName, attributeValue); 7244 } 7245 } 7246 /** 7247 * Returns an attribute value that belongs to the attribute name. 7248 * 7249 * @template {keyof KV & string} KEY 7250 * 7251 * @param {KEY} attributeName The attribute name that identifies the 7252 * queried value. 7253 * @return {KV[KEY]|undefined} The queried attribute value. 7254 * 7255 * @public 7256 */ 7257 getAttribute(attributeName) { 7258 return ( 7259 /** @type {any} */ 7260 typeMapGet(this, attributeName) 7261 ); 7262 } 7263 /** 7264 * Returns whether an attribute exists 7265 * 7266 * @param {string} attributeName The attribute name to check for existence. 7267 * @return {boolean} whether the attribute exists. 7268 * 7269 * @public 7270 */ 7271 hasAttribute(attributeName) { 7272 return ( 7273 /** @type {any} */ 7274 typeMapHas(this, attributeName) 7275 ); 7276 } 7277 /** 7278 * Returns all attribute name/value pairs in a JSON Object. 7279 * 7280 * @param {Snapshot} [snapshot] 7281 * @return {{ [Key in Extract<keyof KV,string>]?: KV[Key]}} A JSON Object that describes the attributes. 7282 * 7283 * @public 7284 */ 7285 getAttributes(snapshot2) { 7286 return ( 7287 /** @type {any} */ 7288 snapshot2 ? typeMapGetAllSnapshot(this, snapshot2) : typeMapGetAll(this) 7289 ); 7290 } 7291 /** 7292 * Creates a Dom Element that mirrors this YXmlElement. 7293 * 7294 * @param {Document} [_document=document] The document object (you must define 7295 * this when calling this method in 7296 * nodejs) 7297 * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks 7298 * are presented in the DOM 7299 * @param {any} [binding] You should not set this property. This is 7300 * used if DomBinding wants to create a 7301 * association to the created DOM type. 7302 * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} 7303 * 7304 * @public 7305 */ 7306 toDOM(_document = document, hooks = {}, binding) { 7307 const dom = _document.createElement(this.nodeName); 7308 const attrs = this.getAttributes(); 7309 for (const key in attrs) { 7310 const value = attrs[key]; 7311 if (typeof value === "string") { 7312 dom.setAttribute(key, value); 7313 } 7314 } 7315 typeListForEach(this, (yxml) => { 7316 dom.appendChild(yxml.toDOM(_document, hooks, binding)); 7317 }); 7318 if (binding !== void 0) { 7319 binding._createAssociation(dom, this); 7320 } 7321 return dom; 7322 } 7323 /** 7324 * Transform the properties of this type to binary and write it to an 7325 * BinaryEncoder. 7326 * 7327 * This is called when this Item is sent to a remote peer. 7328 * 7329 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. 7330 */ 7331 _write(encoder) { 7332 encoder.writeTypeRef(YXmlElementRefID); 7333 encoder.writeKey(this.nodeName); 7334 } 7335 }; 7336 var readYXmlElement = (decoder) => new YXmlElement(decoder.readKey()); 7337 var YXmlEvent = class extends YEvent { 7338 /** 7339 * @param {YXmlElement|YXmlText|YXmlFragment} target The target on which the event is created. 7340 * @param {Set<string|null>} subs The set of changed attributes. `null` is included if the 7341 * child list changed. 7342 * @param {Transaction} transaction The transaction instance with which the 7343 * change was created. 7344 */ 7345 constructor(target, subs, transaction) { 7346 super(target, transaction); 7347 this.childListChanged = false; 7348 this.attributesChanged = /* @__PURE__ */ new Set(); 7349 subs.forEach((sub) => { 7350 if (sub === null) { 7351 this.childListChanged = true; 7352 } else { 7353 this.attributesChanged.add(sub); 7354 } 7355 }); 7356 } 7357 }; 7358 var YXmlHook = class _YXmlHook extends YMap { 7359 /** 7360 * @param {string} hookName nodeName of the Dom Node. 7361 */ 7362 constructor(hookName) { 7363 super(); 7364 this.hookName = hookName; 7365 } 7366 /** 7367 * Creates an Item with the same effect as this Item (without position effect) 7368 */ 7369 _copy() { 7370 return new _YXmlHook(this.hookName); 7371 } 7372 /** 7373 * Makes a copy of this data type that can be included somewhere else. 7374 * 7375 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 7376 * 7377 * @return {YXmlHook} 7378 */ 7379 clone() { 7380 const el = new _YXmlHook(this.hookName); 7381 this.forEach((value, key) => { 7382 el.set(key, value); 7383 }); 7384 return el; 7385 } 7386 /** 7387 * Creates a Dom Element that mirrors this YXmlElement. 7388 * 7389 * @param {Document} [_document=document] The document object (you must define 7390 * this when calling this method in 7391 * nodejs) 7392 * @param {Object.<string, any>} [hooks] Optional property to customize how hooks 7393 * are presented in the DOM 7394 * @param {any} [binding] You should not set this property. This is 7395 * used if DomBinding wants to create a 7396 * association to the created DOM type 7397 * @return {Element} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} 7398 * 7399 * @public 7400 */ 7401 toDOM(_document = document, hooks = {}, binding) { 7402 const hook = hooks[this.hookName]; 7403 let dom; 7404 if (hook !== void 0) { 7405 dom = hook.createDom(this); 7406 } else { 7407 dom = document.createElement(this.hookName); 7408 } 7409 dom.setAttribute("data-yjs-hook", this.hookName); 7410 if (binding !== void 0) { 7411 binding._createAssociation(dom, this); 7412 } 7413 return dom; 7414 } 7415 /** 7416 * Transform the properties of this type to binary and write it to an 7417 * BinaryEncoder. 7418 * 7419 * This is called when this Item is sent to a remote peer. 7420 * 7421 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. 7422 */ 7423 _write(encoder) { 7424 encoder.writeTypeRef(YXmlHookRefID); 7425 encoder.writeKey(this.hookName); 7426 } 7427 }; 7428 var readYXmlHook = (decoder) => new YXmlHook(decoder.readKey()); 7429 var YXmlText = class _YXmlText extends YText { 7430 /** 7431 * @type {YXmlElement|YXmlText|null} 7432 */ 7433 get nextSibling() { 7434 const n = this._item ? this._item.next : null; 7435 return n ? ( 7436 /** @type {YXmlElement|YXmlText} */ 7437 /** @type {ContentType} */ 7438 n.content.type 7439 ) : null; 7440 } 7441 /** 7442 * @type {YXmlElement|YXmlText|null} 7443 */ 7444 get prevSibling() { 7445 const n = this._item ? this._item.prev : null; 7446 return n ? ( 7447 /** @type {YXmlElement|YXmlText} */ 7448 /** @type {ContentType} */ 7449 n.content.type 7450 ) : null; 7451 } 7452 _copy() { 7453 return new _YXmlText(); 7454 } 7455 /** 7456 * Makes a copy of this data type that can be included somewhere else. 7457 * 7458 * Note that the content is only readable _after_ it has been included somewhere in the Ydoc. 7459 * 7460 * @return {YXmlText} 7461 */ 7462 clone() { 7463 const text2 = new _YXmlText(); 7464 text2.applyDelta(this.toDelta()); 7465 return text2; 7466 } 7467 /** 7468 * Creates a Dom Element that mirrors this YXmlText. 7469 * 7470 * @param {Document} [_document=document] The document object (you must define 7471 * this when calling this method in 7472 * nodejs) 7473 * @param {Object<string, any>} [hooks] Optional property to customize how hooks 7474 * are presented in the DOM 7475 * @param {any} [binding] You should not set this property. This is 7476 * used if DomBinding wants to create a 7477 * association to the created DOM type. 7478 * @return {Text} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element} 7479 * 7480 * @public 7481 */ 7482 toDOM(_document = document, hooks, binding) { 7483 const dom = _document.createTextNode(this.toString()); 7484 if (binding !== void 0) { 7485 binding._createAssociation(dom, this); 7486 } 7487 return dom; 7488 } 7489 toString() { 7490 return this.toDelta().map((delta) => { 7491 const nestedNodes = []; 7492 for (const nodeName in delta.attributes) { 7493 const attrs = []; 7494 for (const key in delta.attributes[nodeName]) { 7495 attrs.push({ key, value: delta.attributes[nodeName][key] }); 7496 } 7497 attrs.sort((a, b) => a.key < b.key ? -1 : 1); 7498 nestedNodes.push({ nodeName, attrs }); 7499 } 7500 nestedNodes.sort((a, b) => a.nodeName < b.nodeName ? -1 : 1); 7501 let str = ""; 7502 for (let i = 0; i < nestedNodes.length; i++) { 7503 const node = nestedNodes[i]; 7504 str += `<$node.nodeName}`; 7505 for (let j = 0; j < node.attrs.length; j++) { 7506 const attr = node.attrs[j]; 7507 str += ` $attr.key}="$attr.value}"`; 7508 } 7509 str += ">"; 7510 } 7511 str += delta.insert; 7512 for (let i = nestedNodes.length - 1; i >= 0; i--) { 7513 str += `</$nestedNodes[i].nodeName}>`; 7514 } 7515 return str; 7516 }).join(""); 7517 } 7518 /** 7519 * @return {string} 7520 */ 7521 toJSON() { 7522 return this.toString(); 7523 } 7524 /** 7525 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 7526 */ 7527 _write(encoder) { 7528 encoder.writeTypeRef(YXmlTextRefID); 7529 } 7530 }; 7531 var readYXmlText = (decoder) => new YXmlText(); 7532 var AbstractStruct = class { 7533 /** 7534 * @param {ID} id 7535 * @param {number} length 7536 */ 7537 constructor(id2, length3) { 7538 this.id = id2; 7539 this.length = length3; 7540 } 7541 /** 7542 * @type {boolean} 7543 */ 7544 get deleted() { 7545 throw methodUnimplemented(); 7546 } 7547 /** 7548 * Merge this struct with the item to the right. 7549 * This method is already assuming that `this.id.clock + this.length === this.id.clock`. 7550 * Also this method does *not* remove right from StructStore! 7551 * @param {AbstractStruct} right 7552 * @return {boolean} whether this merged with right 7553 */ 7554 mergeWith(right) { 7555 return false; 7556 } 7557 /** 7558 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. 7559 * @param {number} offset 7560 * @param {number} encodingRef 7561 */ 7562 write(encoder, offset, encodingRef) { 7563 throw methodUnimplemented(); 7564 } 7565 /** 7566 * @param {Transaction} transaction 7567 * @param {number} offset 7568 */ 7569 integrate(transaction, offset) { 7570 throw methodUnimplemented(); 7571 } 7572 }; 7573 var structGCRefNumber = 0; 7574 var GC = class extends AbstractStruct { 7575 get deleted() { 7576 return true; 7577 } 7578 delete() { 7579 } 7580 /** 7581 * @param {GC} right 7582 * @return {boolean} 7583 */ 7584 mergeWith(right) { 7585 if (this.constructor !== right.constructor) { 7586 return false; 7587 } 7588 this.length += right.length; 7589 return true; 7590 } 7591 /** 7592 * @param {Transaction} transaction 7593 * @param {number} offset 7594 */ 7595 integrate(transaction, offset) { 7596 if (offset > 0) { 7597 this.id.clock += offset; 7598 this.length -= offset; 7599 } 7600 addStruct(transaction.doc.store, this); 7601 } 7602 /** 7603 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 7604 * @param {number} offset 7605 */ 7606 write(encoder, offset) { 7607 encoder.writeInfo(structGCRefNumber); 7608 encoder.writeLen(this.length - offset); 7609 } 7610 /** 7611 * @param {Transaction} transaction 7612 * @param {StructStore} store 7613 * @return {null | number} 7614 */ 7615 getMissing(transaction, store) { 7616 return null; 7617 } 7618 }; 7619 var ContentBinary = class _ContentBinary { 7620 /** 7621 * @param {Uint8Array} content 7622 */ 7623 constructor(content) { 7624 this.content = content; 7625 } 7626 /** 7627 * @return {number} 7628 */ 7629 getLength() { 7630 return 1; 7631 } 7632 /** 7633 * @return {Array<any>} 7634 */ 7635 getContent() { 7636 return [this.content]; 7637 } 7638 /** 7639 * @return {boolean} 7640 */ 7641 isCountable() { 7642 return true; 7643 } 7644 /** 7645 * @return {ContentBinary} 7646 */ 7647 copy() { 7648 return new _ContentBinary(this.content); 7649 } 7650 /** 7651 * @param {number} offset 7652 * @return {ContentBinary} 7653 */ 7654 splice(offset) { 7655 throw methodUnimplemented(); 7656 } 7657 /** 7658 * @param {ContentBinary} right 7659 * @return {boolean} 7660 */ 7661 mergeWith(right) { 7662 return false; 7663 } 7664 /** 7665 * @param {Transaction} transaction 7666 * @param {Item} item 7667 */ 7668 integrate(transaction, item) { 7669 } 7670 /** 7671 * @param {Transaction} transaction 7672 */ 7673 delete(transaction) { 7674 } 7675 /** 7676 * @param {StructStore} store 7677 */ 7678 gc(store) { 7679 } 7680 /** 7681 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 7682 * @param {number} offset 7683 */ 7684 write(encoder, offset) { 7685 encoder.writeBuf(this.content); 7686 } 7687 /** 7688 * @return {number} 7689 */ 7690 getRef() { 7691 return 3; 7692 } 7693 }; 7694 var readContentBinary = (decoder) => new ContentBinary(decoder.readBuf()); 7695 var ContentDeleted = class _ContentDeleted { 7696 /** 7697 * @param {number} len 7698 */ 7699 constructor(len) { 7700 this.len = len; 7701 } 7702 /** 7703 * @return {number} 7704 */ 7705 getLength() { 7706 return this.len; 7707 } 7708 /** 7709 * @return {Array<any>} 7710 */ 7711 getContent() { 7712 return []; 7713 } 7714 /** 7715 * @return {boolean} 7716 */ 7717 isCountable() { 7718 return false; 7719 } 7720 /** 7721 * @return {ContentDeleted} 7722 */ 7723 copy() { 7724 return new _ContentDeleted(this.len); 7725 } 7726 /** 7727 * @param {number} offset 7728 * @return {ContentDeleted} 7729 */ 7730 splice(offset) { 7731 const right = new _ContentDeleted(this.len - offset); 7732 this.len = offset; 7733 return right; 7734 } 7735 /** 7736 * @param {ContentDeleted} right 7737 * @return {boolean} 7738 */ 7739 mergeWith(right) { 7740 this.len += right.len; 7741 return true; 7742 } 7743 /** 7744 * @param {Transaction} transaction 7745 * @param {Item} item 7746 */ 7747 integrate(transaction, item) { 7748 addToDeleteSet(transaction.deleteSet, item.id.client, item.id.clock, this.len); 7749 item.markDeleted(); 7750 } 7751 /** 7752 * @param {Transaction} transaction 7753 */ 7754 delete(transaction) { 7755 } 7756 /** 7757 * @param {StructStore} store 7758 */ 7759 gc(store) { 7760 } 7761 /** 7762 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 7763 * @param {number} offset 7764 */ 7765 write(encoder, offset) { 7766 encoder.writeLen(this.len - offset); 7767 } 7768 /** 7769 * @return {number} 7770 */ 7771 getRef() { 7772 return 1; 7773 } 7774 }; 7775 var readContentDeleted = (decoder) => new ContentDeleted(decoder.readLen()); 7776 var createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false }); 7777 var ContentDoc = class _ContentDoc { 7778 /** 7779 * @param {Doc} doc 7780 */ 7781 constructor(doc2) { 7782 if (doc2._item) { 7783 console.error("This document was already integrated as a sub-document. You should create a second instance instead with the same guid."); 7784 } 7785 this.doc = doc2; 7786 const opts = {}; 7787 this.opts = opts; 7788 if (!doc2.gc) { 7789 opts.gc = false; 7790 } 7791 if (doc2.autoLoad) { 7792 opts.autoLoad = true; 7793 } 7794 if (doc2.meta !== null) { 7795 opts.meta = doc2.meta; 7796 } 7797 } 7798 /** 7799 * @return {number} 7800 */ 7801 getLength() { 7802 return 1; 7803 } 7804 /** 7805 * @return {Array<any>} 7806 */ 7807 getContent() { 7808 return [this.doc]; 7809 } 7810 /** 7811 * @return {boolean} 7812 */ 7813 isCountable() { 7814 return true; 7815 } 7816 /** 7817 * @return {ContentDoc} 7818 */ 7819 copy() { 7820 return new _ContentDoc(createDocFromOpts(this.doc.guid, this.opts)); 7821 } 7822 /** 7823 * @param {number} offset 7824 * @return {ContentDoc} 7825 */ 7826 splice(offset) { 7827 throw methodUnimplemented(); 7828 } 7829 /** 7830 * @param {ContentDoc} right 7831 * @return {boolean} 7832 */ 7833 mergeWith(right) { 7834 return false; 7835 } 7836 /** 7837 * @param {Transaction} transaction 7838 * @param {Item} item 7839 */ 7840 integrate(transaction, item) { 7841 this.doc._item = item; 7842 transaction.subdocsAdded.add(this.doc); 7843 if (this.doc.shouldLoad) { 7844 transaction.subdocsLoaded.add(this.doc); 7845 } 7846 } 7847 /** 7848 * @param {Transaction} transaction 7849 */ 7850 delete(transaction) { 7851 if (transaction.subdocsAdded.has(this.doc)) { 7852 transaction.subdocsAdded.delete(this.doc); 7853 } else { 7854 transaction.subdocsRemoved.add(this.doc); 7855 } 7856 } 7857 /** 7858 * @param {StructStore} store 7859 */ 7860 gc(store) { 7861 } 7862 /** 7863 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 7864 * @param {number} offset 7865 */ 7866 write(encoder, offset) { 7867 encoder.writeString(this.doc.guid); 7868 encoder.writeAny(this.opts); 7869 } 7870 /** 7871 * @return {number} 7872 */ 7873 getRef() { 7874 return 9; 7875 } 7876 }; 7877 var readContentDoc = (decoder) => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny())); 7878 var ContentEmbed = class _ContentEmbed { 7879 /** 7880 * @param {Object} embed 7881 */ 7882 constructor(embed) { 7883 this.embed = embed; 7884 } 7885 /** 7886 * @return {number} 7887 */ 7888 getLength() { 7889 return 1; 7890 } 7891 /** 7892 * @return {Array<any>} 7893 */ 7894 getContent() { 7895 return [this.embed]; 7896 } 7897 /** 7898 * @return {boolean} 7899 */ 7900 isCountable() { 7901 return true; 7902 } 7903 /** 7904 * @return {ContentEmbed} 7905 */ 7906 copy() { 7907 return new _ContentEmbed(this.embed); 7908 } 7909 /** 7910 * @param {number} offset 7911 * @return {ContentEmbed} 7912 */ 7913 splice(offset) { 7914 throw methodUnimplemented(); 7915 } 7916 /** 7917 * @param {ContentEmbed} right 7918 * @return {boolean} 7919 */ 7920 mergeWith(right) { 7921 return false; 7922 } 7923 /** 7924 * @param {Transaction} transaction 7925 * @param {Item} item 7926 */ 7927 integrate(transaction, item) { 7928 } 7929 /** 7930 * @param {Transaction} transaction 7931 */ 7932 delete(transaction) { 7933 } 7934 /** 7935 * @param {StructStore} store 7936 */ 7937 gc(store) { 7938 } 7939 /** 7940 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 7941 * @param {number} offset 7942 */ 7943 write(encoder, offset) { 7944 encoder.writeJSON(this.embed); 7945 } 7946 /** 7947 * @return {number} 7948 */ 7949 getRef() { 7950 return 5; 7951 } 7952 }; 7953 var readContentEmbed = (decoder) => new ContentEmbed(decoder.readJSON()); 7954 var ContentFormat = class _ContentFormat { 7955 /** 7956 * @param {string} key 7957 * @param {Object} value 7958 */ 7959 constructor(key, value) { 7960 this.key = key; 7961 this.value = value; 7962 } 7963 /** 7964 * @return {number} 7965 */ 7966 getLength() { 7967 return 1; 7968 } 7969 /** 7970 * @return {Array<any>} 7971 */ 7972 getContent() { 7973 return []; 7974 } 7975 /** 7976 * @return {boolean} 7977 */ 7978 isCountable() { 7979 return false; 7980 } 7981 /** 7982 * @return {ContentFormat} 7983 */ 7984 copy() { 7985 return new _ContentFormat(this.key, this.value); 7986 } 7987 /** 7988 * @param {number} _offset 7989 * @return {ContentFormat} 7990 */ 7991 splice(_offset) { 7992 throw methodUnimplemented(); 7993 } 7994 /** 7995 * @param {ContentFormat} _right 7996 * @return {boolean} 7997 */ 7998 mergeWith(_right) { 7999 return false; 8000 } 8001 /** 8002 * @param {Transaction} _transaction 8003 * @param {Item} item 8004 */ 8005 integrate(_transaction, item) { 8006 const p = ( 8007 /** @type {YText} */ 8008 item.parent 8009 ); 8010 p._searchMarker = null; 8011 p._hasFormatting = true; 8012 } 8013 /** 8014 * @param {Transaction} transaction 8015 */ 8016 delete(transaction) { 8017 } 8018 /** 8019 * @param {StructStore} store 8020 */ 8021 gc(store) { 8022 } 8023 /** 8024 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 8025 * @param {number} offset 8026 */ 8027 write(encoder, offset) { 8028 encoder.writeKey(this.key); 8029 encoder.writeJSON(this.value); 8030 } 8031 /** 8032 * @return {number} 8033 */ 8034 getRef() { 8035 return 6; 8036 } 8037 }; 8038 var readContentFormat = (decoder) => new ContentFormat(decoder.readKey(), decoder.readJSON()); 8039 var ContentJSON = class _ContentJSON { 8040 /** 8041 * @param {Array<any>} arr 8042 */ 8043 constructor(arr) { 8044 this.arr = arr; 8045 } 8046 /** 8047 * @return {number} 8048 */ 8049 getLength() { 8050 return this.arr.length; 8051 } 8052 /** 8053 * @return {Array<any>} 8054 */ 8055 getContent() { 8056 return this.arr; 8057 } 8058 /** 8059 * @return {boolean} 8060 */ 8061 isCountable() { 8062 return true; 8063 } 8064 /** 8065 * @return {ContentJSON} 8066 */ 8067 copy() { 8068 return new _ContentJSON(this.arr); 8069 } 8070 /** 8071 * @param {number} offset 8072 * @return {ContentJSON} 8073 */ 8074 splice(offset) { 8075 const right = new _ContentJSON(this.arr.slice(offset)); 8076 this.arr = this.arr.slice(0, offset); 8077 return right; 8078 } 8079 /** 8080 * @param {ContentJSON} right 8081 * @return {boolean} 8082 */ 8083 mergeWith(right) { 8084 this.arr = this.arr.concat(right.arr); 8085 return true; 8086 } 8087 /** 8088 * @param {Transaction} transaction 8089 * @param {Item} item 8090 */ 8091 integrate(transaction, item) { 8092 } 8093 /** 8094 * @param {Transaction} transaction 8095 */ 8096 delete(transaction) { 8097 } 8098 /** 8099 * @param {StructStore} store 8100 */ 8101 gc(store) { 8102 } 8103 /** 8104 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 8105 * @param {number} offset 8106 */ 8107 write(encoder, offset) { 8108 const len = this.arr.length; 8109 encoder.writeLen(len - offset); 8110 for (let i = offset; i < len; i++) { 8111 const c = this.arr[i]; 8112 encoder.writeString(c === void 0 ? "undefined" : JSON.stringify(c)); 8113 } 8114 } 8115 /** 8116 * @return {number} 8117 */ 8118 getRef() { 8119 return 2; 8120 } 8121 }; 8122 var readContentJSON = (decoder) => { 8123 const len = decoder.readLen(); 8124 const cs = []; 8125 for (let i = 0; i < len; i++) { 8126 const c = decoder.readString(); 8127 if (c === "undefined") { 8128 cs.push(void 0); 8129 } else { 8130 cs.push(JSON.parse(c)); 8131 } 8132 } 8133 return new ContentJSON(cs); 8134 }; 8135 var isDevMode = getVariable("node_env") === "development"; 8136 var ContentAny = class _ContentAny { 8137 /** 8138 * @param {Array<any>} arr 8139 */ 8140 constructor(arr) { 8141 this.arr = arr; 8142 isDevMode && deepFreeze(arr); 8143 } 8144 /** 8145 * @return {number} 8146 */ 8147 getLength() { 8148 return this.arr.length; 8149 } 8150 /** 8151 * @return {Array<any>} 8152 */ 8153 getContent() { 8154 return this.arr; 8155 } 8156 /** 8157 * @return {boolean} 8158 */ 8159 isCountable() { 8160 return true; 8161 } 8162 /** 8163 * @return {ContentAny} 8164 */ 8165 copy() { 8166 return new _ContentAny(this.arr); 8167 } 8168 /** 8169 * @param {number} offset 8170 * @return {ContentAny} 8171 */ 8172 splice(offset) { 8173 const right = new _ContentAny(this.arr.slice(offset)); 8174 this.arr = this.arr.slice(0, offset); 8175 return right; 8176 } 8177 /** 8178 * @param {ContentAny} right 8179 * @return {boolean} 8180 */ 8181 mergeWith(right) { 8182 this.arr = this.arr.concat(right.arr); 8183 return true; 8184 } 8185 /** 8186 * @param {Transaction} transaction 8187 * @param {Item} item 8188 */ 8189 integrate(transaction, item) { 8190 } 8191 /** 8192 * @param {Transaction} transaction 8193 */ 8194 delete(transaction) { 8195 } 8196 /** 8197 * @param {StructStore} store 8198 */ 8199 gc(store) { 8200 } 8201 /** 8202 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 8203 * @param {number} offset 8204 */ 8205 write(encoder, offset) { 8206 const len = this.arr.length; 8207 encoder.writeLen(len - offset); 8208 for (let i = offset; i < len; i++) { 8209 const c = this.arr[i]; 8210 encoder.writeAny(c); 8211 } 8212 } 8213 /** 8214 * @return {number} 8215 */ 8216 getRef() { 8217 return 8; 8218 } 8219 }; 8220 var readContentAny = (decoder) => { 8221 const len = decoder.readLen(); 8222 const cs = []; 8223 for (let i = 0; i < len; i++) { 8224 cs.push(decoder.readAny()); 8225 } 8226 return new ContentAny(cs); 8227 }; 8228 var ContentString = class _ContentString { 8229 /** 8230 * @param {string} str 8231 */ 8232 constructor(str) { 8233 this.str = str; 8234 } 8235 /** 8236 * @return {number} 8237 */ 8238 getLength() { 8239 return this.str.length; 8240 } 8241 /** 8242 * @return {Array<any>} 8243 */ 8244 getContent() { 8245 return this.str.split(""); 8246 } 8247 /** 8248 * @return {boolean} 8249 */ 8250 isCountable() { 8251 return true; 8252 } 8253 /** 8254 * @return {ContentString} 8255 */ 8256 copy() { 8257 return new _ContentString(this.str); 8258 } 8259 /** 8260 * @param {number} offset 8261 * @return {ContentString} 8262 */ 8263 splice(offset) { 8264 const right = new _ContentString(this.str.slice(offset)); 8265 this.str = this.str.slice(0, offset); 8266 const firstCharCode = this.str.charCodeAt(offset - 1); 8267 if (firstCharCode >= 55296 && firstCharCode <= 56319) { 8268 this.str = this.str.slice(0, offset - 1) + "\uFFFD"; 8269 right.str = "\uFFFD" + right.str.slice(1); 8270 } 8271 return right; 8272 } 8273 /** 8274 * @param {ContentString} right 8275 * @return {boolean} 8276 */ 8277 mergeWith(right) { 8278 this.str += right.str; 8279 return true; 8280 } 8281 /** 8282 * @param {Transaction} transaction 8283 * @param {Item} item 8284 */ 8285 integrate(transaction, item) { 8286 } 8287 /** 8288 * @param {Transaction} transaction 8289 */ 8290 delete(transaction) { 8291 } 8292 /** 8293 * @param {StructStore} store 8294 */ 8295 gc(store) { 8296 } 8297 /** 8298 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 8299 * @param {number} offset 8300 */ 8301 write(encoder, offset) { 8302 encoder.writeString(offset === 0 ? this.str : this.str.slice(offset)); 8303 } 8304 /** 8305 * @return {number} 8306 */ 8307 getRef() { 8308 return 4; 8309 } 8310 }; 8311 var readContentString = (decoder) => new ContentString(decoder.readString()); 8312 var typeRefs = [ 8313 readYArray, 8314 readYMap, 8315 readYText, 8316 readYXmlElement, 8317 readYXmlFragment, 8318 readYXmlHook, 8319 readYXmlText 8320 ]; 8321 var YArrayRefID = 0; 8322 var YMapRefID = 1; 8323 var YTextRefID = 2; 8324 var YXmlElementRefID = 3; 8325 var YXmlFragmentRefID = 4; 8326 var YXmlHookRefID = 5; 8327 var YXmlTextRefID = 6; 8328 var ContentType = class _ContentType { 8329 /** 8330 * @param {AbstractType<any>} type 8331 */ 8332 constructor(type) { 8333 this.type = type; 8334 } 8335 /** 8336 * @return {number} 8337 */ 8338 getLength() { 8339 return 1; 8340 } 8341 /** 8342 * @return {Array<any>} 8343 */ 8344 getContent() { 8345 return [this.type]; 8346 } 8347 /** 8348 * @return {boolean} 8349 */ 8350 isCountable() { 8351 return true; 8352 } 8353 /** 8354 * @return {ContentType} 8355 */ 8356 copy() { 8357 return new _ContentType(this.type._copy()); 8358 } 8359 /** 8360 * @param {number} offset 8361 * @return {ContentType} 8362 */ 8363 splice(offset) { 8364 throw methodUnimplemented(); 8365 } 8366 /** 8367 * @param {ContentType} right 8368 * @return {boolean} 8369 */ 8370 mergeWith(right) { 8371 return false; 8372 } 8373 /** 8374 * @param {Transaction} transaction 8375 * @param {Item} item 8376 */ 8377 integrate(transaction, item) { 8378 this.type._integrate(transaction.doc, item); 8379 } 8380 /** 8381 * @param {Transaction} transaction 8382 */ 8383 delete(transaction) { 8384 let item = this.type._start; 8385 while (item !== null) { 8386 if (!item.deleted) { 8387 item.delete(transaction); 8388 } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) { 8389 transaction._mergeStructs.push(item); 8390 } 8391 item = item.right; 8392 } 8393 this.type._map.forEach((item2) => { 8394 if (!item2.deleted) { 8395 item2.delete(transaction); 8396 } else if (item2.id.clock < (transaction.beforeState.get(item2.id.client) || 0)) { 8397 transaction._mergeStructs.push(item2); 8398 } 8399 }); 8400 transaction.changed.delete(this.type); 8401 } 8402 /** 8403 * @param {StructStore} store 8404 */ 8405 gc(store) { 8406 let item = this.type._start; 8407 while (item !== null) { 8408 item.gc(store, true); 8409 item = item.right; 8410 } 8411 this.type._start = null; 8412 this.type._map.forEach( 8413 /** @param {Item | null} item */ 8414 (item2) => { 8415 while (item2 !== null) { 8416 item2.gc(store, true); 8417 item2 = item2.left; 8418 } 8419 } 8420 ); 8421 this.type._map = /* @__PURE__ */ new Map(); 8422 } 8423 /** 8424 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 8425 * @param {number} offset 8426 */ 8427 write(encoder, offset) { 8428 this.type._write(encoder); 8429 } 8430 /** 8431 * @return {number} 8432 */ 8433 getRef() { 8434 return 7; 8435 } 8436 }; 8437 var readContentType = (decoder) => new ContentType(typeRefs[decoder.readTypeRef()](decoder)); 8438 var followRedone = (store, id2) => { 8439 let nextID = id2; 8440 let diff = 0; 8441 let item; 8442 do { 8443 if (diff > 0) { 8444 nextID = createID(nextID.client, nextID.clock + diff); 8445 } 8446 item = getItem(store, nextID); 8447 diff = nextID.clock - item.id.clock; 8448 nextID = item.redone; 8449 } while (nextID !== null && item instanceof Item); 8450 return { 8451 item, 8452 diff 8453 }; 8454 }; 8455 var keepItem = (item, keep) => { 8456 while (item !== null && item.keep !== keep) { 8457 item.keep = keep; 8458 item = /** @type {AbstractType<any>} */ 8459 item.parent._item; 8460 } 8461 }; 8462 var splitItem = (transaction, leftItem, diff) => { 8463 const { client, clock } = leftItem.id; 8464 const rightItem = new Item( 8465 createID(client, clock + diff), 8466 leftItem, 8467 createID(client, clock + diff - 1), 8468 leftItem.right, 8469 leftItem.rightOrigin, 8470 leftItem.parent, 8471 leftItem.parentSub, 8472 leftItem.content.splice(diff) 8473 ); 8474 if (leftItem.deleted) { 8475 rightItem.markDeleted(); 8476 } 8477 if (leftItem.keep) { 8478 rightItem.keep = true; 8479 } 8480 if (leftItem.redone !== null) { 8481 rightItem.redone = createID(leftItem.redone.client, leftItem.redone.clock + diff); 8482 } 8483 leftItem.right = rightItem; 8484 if (rightItem.right !== null) { 8485 rightItem.right.left = rightItem; 8486 } 8487 transaction._mergeStructs.push(rightItem); 8488 if (rightItem.parentSub !== null && rightItem.right === null) { 8489 rightItem.parent._map.set(rightItem.parentSub, rightItem); 8490 } 8491 leftItem.length = diff; 8492 return rightItem; 8493 }; 8494 var isDeletedByUndoStack = (stack, id2) => some( 8495 stack, 8496 /** @param {StackItem} s */ 8497 (s) => isDeleted(s.deletions, id2) 8498 ); 8499 var redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) => { 8500 const doc2 = transaction.doc; 8501 const store = doc2.store; 8502 const ownClientID = doc2.clientID; 8503 const redone = item.redone; 8504 if (redone !== null) { 8505 return getItemCleanStart(transaction, redone); 8506 } 8507 let parentItem = ( 8508 /** @type {AbstractType<any>} */ 8509 item.parent._item 8510 ); 8511 let left = null; 8512 let right; 8513 if (parentItem !== null && parentItem.deleted === true) { 8514 if (parentItem.redone === null && (!redoitems.has(parentItem) || redoItem(transaction, parentItem, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) === null)) { 8515 return null; 8516 } 8517 while (parentItem.redone !== null) { 8518 parentItem = getItemCleanStart(transaction, parentItem.redone); 8519 } 8520 } 8521 const parentType = parentItem === null ? ( 8522 /** @type {AbstractType<any>} */ 8523 item.parent 8524 ) : ( 8525 /** @type {ContentType} */ 8526 parentItem.content.type 8527 ); 8528 if (item.parentSub === null) { 8529 left = item.left; 8530 right = item; 8531 while (left !== null) { 8532 let leftTrace = left; 8533 while (leftTrace !== null && /** @type {AbstractType<any>} */ 8534 leftTrace.parent._item !== parentItem) { 8535 leftTrace = leftTrace.redone === null ? null : getItemCleanStart(transaction, leftTrace.redone); 8536 } 8537 if (leftTrace !== null && /** @type {AbstractType<any>} */ 8538 leftTrace.parent._item === parentItem) { 8539 left = leftTrace; 8540 break; 8541 } 8542 left = left.left; 8543 } 8544 while (right !== null) { 8545 let rightTrace = right; 8546 while (rightTrace !== null && /** @type {AbstractType<any>} */ 8547 rightTrace.parent._item !== parentItem) { 8548 rightTrace = rightTrace.redone === null ? null : getItemCleanStart(transaction, rightTrace.redone); 8549 } 8550 if (rightTrace !== null && /** @type {AbstractType<any>} */ 8551 rightTrace.parent._item === parentItem) { 8552 right = rightTrace; 8553 break; 8554 } 8555 right = right.right; 8556 } 8557 } else { 8558 right = null; 8559 if (item.right && !ignoreRemoteMapChanges) { 8560 left = item; 8561 while (left !== null && left.right !== null && (left.right.redone || isDeleted(itemsToDelete, left.right.id) || isDeletedByUndoStack(um.undoStack, left.right.id) || isDeletedByUndoStack(um.redoStack, left.right.id))) { 8562 left = left.right; 8563 while (left.redone) left = getItemCleanStart(transaction, left.redone); 8564 } 8565 if (left && left.right !== null) { 8566 return null; 8567 } 8568 } else { 8569 left = parentType._map.get(item.parentSub) || null; 8570 } 8571 } 8572 const nextClock = getState(store, ownClientID); 8573 const nextId = createID(ownClientID, nextClock); 8574 const redoneItem = new Item( 8575 nextId, 8576 left, 8577 left && left.lastId, 8578 right, 8579 right && right.id, 8580 parentType, 8581 item.parentSub, 8582 item.content.copy() 8583 ); 8584 item.redone = nextId; 8585 keepItem(redoneItem, true); 8586 redoneItem.integrate(transaction, 0); 8587 return redoneItem; 8588 }; 8589 var Item = class _Item extends AbstractStruct { 8590 /** 8591 * @param {ID} id 8592 * @param {Item | null} left 8593 * @param {ID | null} origin 8594 * @param {Item | null} right 8595 * @param {ID | null} rightOrigin 8596 * @param {AbstractType<any>|ID|null} parent Is a type if integrated, is null if it is possible to copy parent from left or right, is ID before integration to search for it. 8597 * @param {string | null} parentSub 8598 * @param {AbstractContent} content 8599 */ 8600 constructor(id2, left, origin2, right, rightOrigin, parent, parentSub, content) { 8601 super(id2, content.getLength()); 8602 this.origin = origin2; 8603 this.left = left; 8604 this.right = right; 8605 this.rightOrigin = rightOrigin; 8606 this.parent = parent; 8607 this.parentSub = parentSub; 8608 this.redone = null; 8609 this.content = content; 8610 this.info = this.content.isCountable() ? BIT2 : 0; 8611 } 8612 /** 8613 * This is used to mark the item as an indexed fast-search marker 8614 * 8615 * @type {boolean} 8616 */ 8617 set marker(isMarked) { 8618 if ((this.info & BIT4) > 0 !== isMarked) { 8619 this.info ^= BIT4; 8620 } 8621 } 8622 get marker() { 8623 return (this.info & BIT4) > 0; 8624 } 8625 /** 8626 * If true, do not garbage collect this Item. 8627 */ 8628 get keep() { 8629 return (this.info & BIT1) > 0; 8630 } 8631 set keep(doKeep) { 8632 if (this.keep !== doKeep) { 8633 this.info ^= BIT1; 8634 } 8635 } 8636 get countable() { 8637 return (this.info & BIT2) > 0; 8638 } 8639 /** 8640 * Whether this item was deleted or not. 8641 * @type {Boolean} 8642 */ 8643 get deleted() { 8644 return (this.info & BIT3) > 0; 8645 } 8646 set deleted(doDelete) { 8647 if (this.deleted !== doDelete) { 8648 this.info ^= BIT3; 8649 } 8650 } 8651 markDeleted() { 8652 this.info |= BIT3; 8653 } 8654 /** 8655 * Return the creator clientID of the missing op or define missing items and return null. 8656 * 8657 * @param {Transaction} transaction 8658 * @param {StructStore} store 8659 * @return {null | number} 8660 */ 8661 getMissing(transaction, store) { 8662 if (this.origin && this.origin.client !== this.id.client && this.origin.clock >= getState(store, this.origin.client)) { 8663 return this.origin.client; 8664 } 8665 if (this.rightOrigin && this.rightOrigin.client !== this.id.client && this.rightOrigin.clock >= getState(store, this.rightOrigin.client)) { 8666 return this.rightOrigin.client; 8667 } 8668 if (this.parent && this.parent.constructor === ID && this.id.client !== this.parent.client && this.parent.clock >= getState(store, this.parent.client)) { 8669 return this.parent.client; 8670 } 8671 if (this.origin) { 8672 this.left = getItemCleanEnd(transaction, store, this.origin); 8673 this.origin = this.left.lastId; 8674 } 8675 if (this.rightOrigin) { 8676 this.right = getItemCleanStart(transaction, this.rightOrigin); 8677 this.rightOrigin = this.right.id; 8678 } 8679 if (this.left && this.left.constructor === GC || this.right && this.right.constructor === GC) { 8680 this.parent = null; 8681 } else if (!this.parent) { 8682 if (this.left && this.left.constructor === _Item) { 8683 this.parent = this.left.parent; 8684 this.parentSub = this.left.parentSub; 8685 } else if (this.right && this.right.constructor === _Item) { 8686 this.parent = this.right.parent; 8687 this.parentSub = this.right.parentSub; 8688 } 8689 } else if (this.parent.constructor === ID) { 8690 const parentItem = getItem(store, this.parent); 8691 if (parentItem.constructor === GC) { 8692 this.parent = null; 8693 } else { 8694 this.parent = /** @type {ContentType} */ 8695 parentItem.content.type; 8696 } 8697 } 8698 return null; 8699 } 8700 /** 8701 * @param {Transaction} transaction 8702 * @param {number} offset 8703 */ 8704 integrate(transaction, offset) { 8705 if (offset > 0) { 8706 this.id.clock += offset; 8707 this.left = getItemCleanEnd(transaction, transaction.doc.store, createID(this.id.client, this.id.clock - 1)); 8708 this.origin = this.left.lastId; 8709 this.content = this.content.splice(offset); 8710 this.length -= offset; 8711 } 8712 if (this.parent) { 8713 if (!this.left && (!this.right || this.right.left !== null) || this.left && this.left.right !== this.right) { 8714 let left = this.left; 8715 let o; 8716 if (left !== null) { 8717 o = left.right; 8718 } else if (this.parentSub !== null) { 8719 o = /** @type {AbstractType<any>} */ 8720 this.parent._map.get(this.parentSub) || null; 8721 while (o !== null && o.left !== null) { 8722 o = o.left; 8723 } 8724 } else { 8725 o = /** @type {AbstractType<any>} */ 8726 this.parent._start; 8727 } 8728 const conflictingItems = /* @__PURE__ */ new Set(); 8729 const itemsBeforeOrigin = /* @__PURE__ */ new Set(); 8730 while (o !== null && o !== this.right) { 8731 itemsBeforeOrigin.add(o); 8732 conflictingItems.add(o); 8733 if (compareIDs(this.origin, o.origin)) { 8734 if (o.id.client < this.id.client) { 8735 left = o; 8736 conflictingItems.clear(); 8737 } else if (compareIDs(this.rightOrigin, o.rightOrigin)) { 8738 break; 8739 } 8740 } else if (o.origin !== null && itemsBeforeOrigin.has(getItem(transaction.doc.store, o.origin))) { 8741 if (!conflictingItems.has(getItem(transaction.doc.store, o.origin))) { 8742 left = o; 8743 conflictingItems.clear(); 8744 } 8745 } else { 8746 break; 8747 } 8748 o = o.right; 8749 } 8750 this.left = left; 8751 } 8752 if (this.left !== null) { 8753 const right = this.left.right; 8754 this.right = right; 8755 this.left.right = this; 8756 } else { 8757 let r; 8758 if (this.parentSub !== null) { 8759 r = /** @type {AbstractType<any>} */ 8760 this.parent._map.get(this.parentSub) || null; 8761 while (r !== null && r.left !== null) { 8762 r = r.left; 8763 } 8764 } else { 8765 r = /** @type {AbstractType<any>} */ 8766 this.parent._start; 8767 this.parent._start = this; 8768 } 8769 this.right = r; 8770 } 8771 if (this.right !== null) { 8772 this.right.left = this; 8773 } else if (this.parentSub !== null) { 8774 this.parent._map.set(this.parentSub, this); 8775 if (this.left !== null) { 8776 this.left.delete(transaction); 8777 } 8778 } 8779 if (this.parentSub === null && this.countable && !this.deleted) { 8780 this.parent._length += this.length; 8781 } 8782 addStruct(transaction.doc.store, this); 8783 this.content.integrate(transaction, this); 8784 addChangedTypeToTransaction( 8785 transaction, 8786 /** @type {AbstractType<any>} */ 8787 this.parent, 8788 this.parentSub 8789 ); 8790 if ( 8791 /** @type {AbstractType<any>} */ 8792 this.parent._item !== null && /** @type {AbstractType<any>} */ 8793 this.parent._item.deleted || this.parentSub !== null && this.right !== null 8794 ) { 8795 this.delete(transaction); 8796 } 8797 } else { 8798 new GC(this.id, this.length).integrate(transaction, 0); 8799 } 8800 } 8801 /** 8802 * Returns the next non-deleted item 8803 */ 8804 get next() { 8805 let n = this.right; 8806 while (n !== null && n.deleted) { 8807 n = n.right; 8808 } 8809 return n; 8810 } 8811 /** 8812 * Returns the previous non-deleted item 8813 */ 8814 get prev() { 8815 let n = this.left; 8816 while (n !== null && n.deleted) { 8817 n = n.left; 8818 } 8819 return n; 8820 } 8821 /** 8822 * Computes the last content address of this Item. 8823 */ 8824 get lastId() { 8825 return this.length === 1 ? this.id : createID(this.id.client, this.id.clock + this.length - 1); 8826 } 8827 /** 8828 * Try to merge two items 8829 * 8830 * @param {Item} right 8831 * @return {boolean} 8832 */ 8833 mergeWith(right) { 8834 if (this.constructor === right.constructor && compareIDs(right.origin, this.lastId) && this.right === right && compareIDs(this.rightOrigin, right.rightOrigin) && this.id.client === right.id.client && this.id.clock + this.length === right.id.clock && this.deleted === right.deleted && this.redone === null && right.redone === null && this.content.constructor === right.content.constructor && this.content.mergeWith(right.content)) { 8835 const searchMarker = ( 8836 /** @type {AbstractType<any>} */ 8837 this.parent._searchMarker 8838 ); 8839 if (searchMarker) { 8840 searchMarker.forEach((marker) => { 8841 if (marker.p === right) { 8842 marker.p = this; 8843 if (!this.deleted && this.countable) { 8844 marker.index -= this.length; 8845 } 8846 } 8847 }); 8848 } 8849 if (right.keep) { 8850 this.keep = true; 8851 } 8852 this.right = right.right; 8853 if (this.right !== null) { 8854 this.right.left = this; 8855 } 8856 this.length += right.length; 8857 return true; 8858 } 8859 return false; 8860 } 8861 /** 8862 * Mark this Item as deleted. 8863 * 8864 * @param {Transaction} transaction 8865 */ 8866 delete(transaction) { 8867 if (!this.deleted) { 8868 const parent = ( 8869 /** @type {AbstractType<any>} */ 8870 this.parent 8871 ); 8872 if (this.countable && this.parentSub === null) { 8873 parent._length -= this.length; 8874 } 8875 this.markDeleted(); 8876 addToDeleteSet(transaction.deleteSet, this.id.client, this.id.clock, this.length); 8877 addChangedTypeToTransaction(transaction, parent, this.parentSub); 8878 this.content.delete(transaction); 8879 } 8880 } 8881 /** 8882 * @param {StructStore} store 8883 * @param {boolean} parentGCd 8884 */ 8885 gc(store, parentGCd) { 8886 if (!this.deleted) { 8887 throw unexpectedCase(); 8888 } 8889 this.content.gc(store); 8890 if (parentGCd) { 8891 replaceStruct(store, this, new GC(this.id, this.length)); 8892 } else { 8893 this.content = new ContentDeleted(this.length); 8894 } 8895 } 8896 /** 8897 * Transform the properties of this type to binary and write it to an 8898 * BinaryEncoder. 8899 * 8900 * This is called when this Item is sent to a remote peer. 8901 * 8902 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to. 8903 * @param {number} offset 8904 */ 8905 write(encoder, offset) { 8906 const origin2 = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin; 8907 const rightOrigin = this.rightOrigin; 8908 const parentSub = this.parentSub; 8909 const info = this.content.getRef() & BITS5 | (origin2 === null ? 0 : BIT8) | // origin is defined 8910 (rightOrigin === null ? 0 : BIT7) | // right origin is defined 8911 (parentSub === null ? 0 : BIT6); 8912 encoder.writeInfo(info); 8913 if (origin2 !== null) { 8914 encoder.writeLeftID(origin2); 8915 } 8916 if (rightOrigin !== null) { 8917 encoder.writeRightID(rightOrigin); 8918 } 8919 if (origin2 === null && rightOrigin === null) { 8920 const parent = ( 8921 /** @type {AbstractType<any>} */ 8922 this.parent 8923 ); 8924 if (parent._item !== void 0) { 8925 const parentItem = parent._item; 8926 if (parentItem === null) { 8927 const ykey = findRootTypeKey(parent); 8928 encoder.writeParentInfo(true); 8929 encoder.writeString(ykey); 8930 } else { 8931 encoder.writeParentInfo(false); 8932 encoder.writeLeftID(parentItem.id); 8933 } 8934 } else if (parent.constructor === String) { 8935 encoder.writeParentInfo(true); 8936 encoder.writeString(parent); 8937 } else if (parent.constructor === ID) { 8938 encoder.writeParentInfo(false); 8939 encoder.writeLeftID(parent); 8940 } else { 8941 unexpectedCase(); 8942 } 8943 if (parentSub !== null) { 8944 encoder.writeString(parentSub); 8945 } 8946 } 8947 this.content.write(encoder, offset); 8948 } 8949 }; 8950 var readItemContent = (decoder, info) => contentRefs[info & BITS5](decoder); 8951 var contentRefs = [ 8952 () => { 8953 unexpectedCase(); 8954 }, 8955 // GC is not ItemContent 8956 readContentDeleted, 8957 // 1 8958 readContentJSON, 8959 // 2 8960 readContentBinary, 8961 // 3 8962 readContentString, 8963 // 4 8964 readContentEmbed, 8965 // 5 8966 readContentFormat, 8967 // 6 8968 readContentType, 8969 // 7 8970 readContentAny, 8971 // 8 8972 readContentDoc, 8973 // 9 8974 () => { 8975 unexpectedCase(); 8976 } 8977 // 10 - Skip is not ItemContent 8978 ]; 8979 var structSkipRefNumber = 10; 8980 var Skip = class extends AbstractStruct { 8981 get deleted() { 8982 return true; 8983 } 8984 delete() { 8985 } 8986 /** 8987 * @param {Skip} right 8988 * @return {boolean} 8989 */ 8990 mergeWith(right) { 8991 if (this.constructor !== right.constructor) { 8992 return false; 8993 } 8994 this.length += right.length; 8995 return true; 8996 } 8997 /** 8998 * @param {Transaction} transaction 8999 * @param {number} offset 9000 */ 9001 integrate(transaction, offset) { 9002 unexpectedCase(); 9003 } 9004 /** 9005 * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder 9006 * @param {number} offset 9007 */ 9008 write(encoder, offset) { 9009 encoder.writeInfo(structSkipRefNumber); 9010 writeVarUint(encoder.restEncoder, this.length - offset); 9011 } 9012 /** 9013 * @param {Transaction} transaction 9014 * @param {StructStore} store 9015 * @return {null | number} 9016 */ 9017 getMissing(transaction, store) { 9018 return null; 9019 } 9020 }; 9021 var glo = ( 9022 /** @type {any} */ 9023 typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {} 9024 ); 9025 var importIdentifier = "__ $YJS$ __"; 9026 if (glo[importIdentifier] === true) { 9027 console.error("Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438"); 9028 } 9029 glo[importIdentifier] = true; 9030 9031 // packages/sync/node_modules/y-protocols/awareness.js 9032 var outdatedTimeout = 3e4; 9033 var Awareness = class extends Observable { 9034 /** 9035 * @param {Y.Doc} doc 9036 */ 9037 constructor(doc2) { 9038 super(); 9039 this.doc = doc2; 9040 this.clientID = doc2.clientID; 9041 this.states = /* @__PURE__ */ new Map(); 9042 this.meta = /* @__PURE__ */ new Map(); 9043 this._checkInterval = /** @type {any} */ 9044 setInterval(() => { 9045 const now = getUnixTime(); 9046 if (this.getLocalState() !== null && outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ 9047 this.meta.get(this.clientID).lastUpdated) { 9048 this.setLocalState(this.getLocalState()); 9049 } 9050 const remove = []; 9051 this.meta.forEach((meta, clientid) => { 9052 if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) { 9053 remove.push(clientid); 9054 } 9055 }); 9056 if (remove.length > 0) { 9057 removeAwarenessStates(this, remove, "timeout"); 9058 } 9059 }, floor(outdatedTimeout / 10)); 9060 doc2.on("destroy", () => { 9061 this.destroy(); 9062 }); 9063 this.setLocalState({}); 9064 } 9065 destroy() { 9066 this.emit("destroy", [this]); 9067 this.setLocalState(null); 9068 super.destroy(); 9069 clearInterval(this._checkInterval); 9070 } 9071 /** 9072 * @return {Object<string,any>|null} 9073 */ 9074 getLocalState() { 9075 return this.states.get(this.clientID) || null; 9076 } 9077 /** 9078 * @param {Object<string,any>|null} state 9079 */ 9080 setLocalState(state) { 9081 const clientID = this.clientID; 9082 const currLocalMeta = this.meta.get(clientID); 9083 const clock = currLocalMeta === void 0 ? 0 : currLocalMeta.clock + 1; 9084 const prevState = this.states.get(clientID); 9085 if (state === null) { 9086 this.states.delete(clientID); 9087 } else { 9088 this.states.set(clientID, state); 9089 } 9090 this.meta.set(clientID, { 9091 clock, 9092 lastUpdated: getUnixTime() 9093 }); 9094 const added = []; 9095 const updated = []; 9096 const filteredUpdated = []; 9097 const removed = []; 9098 if (state === null) { 9099 removed.push(clientID); 9100 } else if (prevState == null) { 9101 if (state != null) { 9102 added.push(clientID); 9103 } 9104 } else { 9105 updated.push(clientID); 9106 if (!equalityDeep(prevState, state)) { 9107 filteredUpdated.push(clientID); 9108 } 9109 } 9110 if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) { 9111 this.emit("change", [{ added, updated: filteredUpdated, removed }, "local"]); 9112 } 9113 this.emit("update", [{ added, updated, removed }, "local"]); 9114 } 9115 /** 9116 * @param {string} field 9117 * @param {any} value 9118 */ 9119 setLocalStateField(field, value) { 9120 const state = this.getLocalState(); 9121 if (state !== null) { 9122 this.setLocalState({ 9123 ...state, 9124 [field]: value 9125 }); 9126 } 9127 } 9128 /** 9129 * @return {Map<number,Object<string,any>>} 9130 */ 9131 getStates() { 9132 return this.states; 9133 } 9134 }; 9135 var removeAwarenessStates = (awareness, clients, origin2) => { 9136 const removed = []; 9137 for (let i = 0; i < clients.length; i++) { 9138 const clientID = clients[i]; 9139 if (awareness.states.has(clientID)) { 9140 awareness.states.delete(clientID); 9141 if (clientID === awareness.clientID) { 9142 const curMeta = ( 9143 /** @type {MetaClientState} */ 9144 awareness.meta.get(clientID) 9145 ); 9146 awareness.meta.set(clientID, { 9147 clock: curMeta.clock + 1, 9148 lastUpdated: getUnixTime() 9149 }); 9150 } 9151 removed.push(clientID); 9152 } 9153 } 9154 if (removed.length > 0) { 9155 awareness.emit("change", [{ added: [], updated: [], removed }, origin2]); 9156 awareness.emit("update", [{ added: [], updated: [], removed }, origin2]); 9157 } 9158 }; 9159 9160 // packages/sync/build-module/config.mjs 9161 var CRDT_DOC_VERSION = 1; 9162 var CRDT_DOC_META_PERSISTENCE_KEY = "fromPersistence"; 9163 var CRDT_RECORD_MAP_KEY = "document"; 9164 var CRDT_STATE_MAP_KEY = "state"; 9165 var CRDT_STATE_MAP_SAVED_AT_KEY = "savedAt"; 9166 var CRDT_STATE_MAP_SAVED_BY_KEY = "savedBy"; 9167 var CRDT_STATE_MAP_VERSION_KEY = "version"; 9168 var LOCAL_EDITOR_ORIGIN = "gutenberg"; 9169 var LOCAL_SYNC_MANAGER_ORIGIN = "syncManager"; 9170 var LOCAL_UNDO_IGNORED_ORIGIN = "gutenberg-undo-ignored"; 9171 9172 // packages/sync/build-module/errors.mjs 9173 var ConnectionErrorCode = /* @__PURE__ */ ((ConnectionErrorCode2) => { 9174 ConnectionErrorCode2["AUTHENTICATION_FAILED"] = "authentication-failed"; 9175 ConnectionErrorCode2["CONNECTION_EXPIRED"] = "connection-expired"; 9176 ConnectionErrorCode2["CONNECTION_LIMIT_EXCEEDED"] = "connection-limit-exceeded"; 9177 ConnectionErrorCode2["DOCUMENT_SIZE_LIMIT_EXCEEDED"] = "document-size-limit-exceeded"; 9178 ConnectionErrorCode2["UNKNOWN_ERROR"] = "unknown-error"; 9179 return ConnectionErrorCode2; 9180 })(ConnectionErrorCode || {}); 9181 var ConnectionError = class extends Error { 9182 constructor(code = "unknown-error", message) { 9183 super(message); 9184 this.code = code; 9185 this.name = "ConnectionError"; 9186 } 9187 }; 9188 9189 // packages/sync/build-module/lock-unlock.mjs 9190 var import_private_apis = __toESM(require_private_apis(), 1); 9191 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 9192 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 9193 "@wordpress/sync" 9194 ); 9195 9196 // packages/sync/build-module/performance.mjs 9197 function logPerformanceTiming(fn) { 9198 return function(...args2) { 9199 const start = performance.now(); 9200 const result = fn.apply(this, args2); 9201 const end = performance.now(); 9202 console.log( 9203 `[SyncManager][performance]: $fn.name} took ${(end - start).toFixed(2)} ms` 9204 ); 9205 return result; 9206 }; 9207 } 9208 function passThru(fn) { 9209 return ((...args2) => fn(...args2)); 9210 } 9211 function yieldToEventLoop(fn) { 9212 return function(...args2) { 9213 setTimeout(() => { 9214 fn.apply(this, args2); 9215 }, 0); 9216 }; 9217 } 9218 9219 // packages/sync/build-module/providers/index.mjs 9220 var import_hooks3 = __toESM(require_hooks(), 1); 9221 9222 // packages/sync/build-module/providers/http-polling/polling-manager.mjs 9223 var import_hooks2 = __toESM(require_hooks(), 1); 9224 9225 // packages/sync/node_modules/y-protocols/sync.js 9226 var messageYjsSyncStep1 = 0; 9227 var messageYjsSyncStep2 = 1; 9228 var messageYjsUpdate = 2; 9229 var writeSyncStep1 = (encoder, doc2) => { 9230 writeVarUint(encoder, messageYjsSyncStep1); 9231 const sv = encodeStateVector(doc2); 9232 writeVarUint8Array(encoder, sv); 9233 }; 9234 var writeSyncStep2 = (encoder, doc2, encodedStateVector) => { 9235 writeVarUint(encoder, messageYjsSyncStep2); 9236 writeVarUint8Array(encoder, encodeStateAsUpdate(doc2, encodedStateVector)); 9237 }; 9238 var readSyncStep1 = (decoder, encoder, doc2) => writeSyncStep2(encoder, doc2, readVarUint8Array(decoder)); 9239 var readSyncStep2 = (decoder, doc2, transactionOrigin, errorHandler) => { 9240 try { 9241 applyUpdate(doc2, readVarUint8Array(decoder), transactionOrigin); 9242 } catch (error) { 9243 if (errorHandler != null) errorHandler( 9244 /** @type {Error} */ 9245 error 9246 ); 9247 console.error("Caught error while handling a Yjs update", error); 9248 } 9249 }; 9250 var readUpdate2 = readSyncStep2; 9251 var readSyncMessage = (decoder, encoder, doc2, transactionOrigin, errorHandler) => { 9252 const messageType = readVarUint(decoder); 9253 switch (messageType) { 9254 case messageYjsSyncStep1: 9255 readSyncStep1(decoder, encoder, doc2); 9256 break; 9257 case messageYjsSyncStep2: 9258 readSyncStep2(decoder, doc2, transactionOrigin, errorHandler); 9259 break; 9260 case messageYjsUpdate: 9261 readUpdate2(decoder, doc2, transactionOrigin, errorHandler); 9262 break; 9263 default: 9264 throw new Error("Unknown message type"); 9265 } 9266 return messageType; 9267 }; 9268 9269 // packages/sync/build-module/providers/http-polling/config.mjs 9270 var import_hooks = __toESM(require_hooks(), 1); 9271 var DEFAULT_CLIENT_LIMIT_PER_ROOM = 3; 9272 var MAX_ERROR_BACKOFF_IN_MS = 30 * 1e3; 9273 var MAX_UPDATE_SIZE_IN_BYTES = 1 * 1024 * 1024; 9274 var POLLING_INTERVAL_IN_MS = (0, import_hooks.applyFilters)( 9275 "sync.pollingManager.pollingInterval", 9276 4e3 9277 // 4 seconds 9278 ); 9279 var POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS = (0, import_hooks.applyFilters)( 9280 "sync.pollingManager.pollingIntervalWithCollaborators", 9281 1e3 9282 // 1 second 9283 ); 9284 var POLLING_INTERVAL_BACKGROUND_TAB_IN_MS = 25 * 1e3; 9285 9286 // packages/sync/build-module/providers/http-polling/types.mjs 9287 var SyncUpdateType = /* @__PURE__ */ ((SyncUpdateType2) => { 9288 SyncUpdateType2["COMPACTION"] = "compaction"; 9289 SyncUpdateType2["SYNC_STEP_1"] = "sync_step1"; 9290 SyncUpdateType2["SYNC_STEP_2"] = "sync_step2"; 9291 SyncUpdateType2["UPDATE"] = "update"; 9292 return SyncUpdateType2; 9293 })(SyncUpdateType || {}); 9294 9295 // packages/sync/build-module/providers/http-polling/utils.mjs 9296 var import_api_fetch = __toESM(require_api_fetch(), 1); 9297 var SYNC_API_PATH = "/wp-sync/v1/updates"; 9298 function uint8ArrayToBase64(data) { 9299 let binary = ""; 9300 const len = data.byteLength; 9301 for (let i = 0; i < len; i++) { 9302 binary += String.fromCharCode(data[i]); 9303 } 9304 return globalThis.btoa(binary); 9305 } 9306 function base64ToUint8Array(base64) { 9307 const binaryString = globalThis.atob(base64); 9308 const len = binaryString.length; 9309 const bytes = new Uint8Array(len); 9310 for (let i = 0; i < len; i++) { 9311 bytes[i] = binaryString.charCodeAt(i); 9312 } 9313 return bytes; 9314 } 9315 function createSyncUpdate(data, type) { 9316 return { 9317 data: uint8ArrayToBase64(data), 9318 type 9319 }; 9320 } 9321 function createUpdateQueue(initial = [], paused = true) { 9322 let isPaused = paused; 9323 const updates = [...initial]; 9324 return { 9325 add(update) { 9326 updates.push(update); 9327 }, 9328 addBulk(bulkUpdates) { 9329 if (0 === bulkUpdates.length) { 9330 return; 9331 } 9332 updates.push(...bulkUpdates); 9333 }, 9334 clear() { 9335 updates.splice(0, updates.length); 9336 }, 9337 get() { 9338 if (isPaused) { 9339 return []; 9340 } 9341 return updates.splice(0, updates.length); 9342 }, 9343 pause() { 9344 isPaused = true; 9345 }, 9346 restore(restoredUpdates) { 9347 const filtered = restoredUpdates.filter( 9348 (u) => u.type !== SyncUpdateType.COMPACTION 9349 ); 9350 if (0 === filtered.length) { 9351 return; 9352 } 9353 updates.unshift(...filtered); 9354 }, 9355 resume() { 9356 isPaused = false; 9357 }, 9358 size() { 9359 return updates.length; 9360 } 9361 }; 9362 } 9363 async function postSyncUpdate(payload) { 9364 const response = await (0, import_api_fetch.default)({ 9365 body: JSON.stringify(payload), 9366 headers: { 9367 "Content-Type": "application/json" 9368 }, 9369 method: "POST", 9370 parse: false, 9371 path: SYNC_API_PATH 9372 }); 9373 if (!response.ok) { 9374 throw new Error( 9375 `Sync update failed with status $response.status}` 9376 ); 9377 } 9378 return await response.json(); 9379 } 9380 function postSyncUpdateNonBlocking(payload) { 9381 if (payload.rooms.length === 0) { 9382 return; 9383 } 9384 (0, import_api_fetch.default)({ 9385 body: JSON.stringify(payload), 9386 headers: { "Content-Type": "application/json" }, 9387 keepalive: true, 9388 method: "POST", 9389 parse: false, 9390 path: SYNC_API_PATH 9391 }).catch(() => { 9392 }); 9393 } 9394 function intValueOrDefault(value, defaultValue) { 9395 const intValue = parseInt(String(value), 10); 9396 return isNaN(intValue) ? defaultValue : intValue; 9397 } 9398 9399 // packages/sync/build-module/providers/http-polling/polling-manager.mjs 9400 var POLLING_MANAGER_ORIGIN = "polling-manager"; 9401 var roomStates = /* @__PURE__ */ new Map(); 9402 function createDeprecatedCompactionUpdate(updates) { 9403 const mergeable = updates.filter( 9404 (u) => [SyncUpdateType.COMPACTION, SyncUpdateType.UPDATE].includes( 9405 u.type 9406 ) 9407 ).map((u) => base64ToUint8Array(u.data)); 9408 return createSyncUpdate( 9409 mergeUpdatesV2(mergeable), 9410 SyncUpdateType.COMPACTION 9411 ); 9412 } 9413 function createSyncStep1Update(doc2) { 9414 const encoder = createEncoder(); 9415 writeSyncStep1(encoder, doc2); 9416 return createSyncUpdate( 9417 toUint8Array(encoder), 9418 SyncUpdateType.SYNC_STEP_1 9419 ); 9420 } 9421 function createSyncStep2Update(doc2, step1) { 9422 const decoder = createDecoder(step1); 9423 const encoder = createEncoder(); 9424 readSyncMessage( 9425 decoder, 9426 encoder, 9427 doc2, 9428 POLLING_MANAGER_ORIGIN 9429 ); 9430 return createSyncUpdate( 9431 toUint8Array(encoder), 9432 SyncUpdateType.SYNC_STEP_2 9433 ); 9434 } 9435 function processAwarenessUpdate(state, awareness) { 9436 const currentStates = awareness.getStates(); 9437 const added = /* @__PURE__ */ new Set(); 9438 const updated = /* @__PURE__ */ new Set(); 9439 const removed = new Set( 9440 Array.from(currentStates.keys()).filter( 9441 (clientId) => !state[clientId] 9442 ) 9443 ); 9444 Object.entries(state).forEach(([clientIdString, awarenessState]) => { 9445 const clientId = Number(clientIdString); 9446 if (clientId === awareness.clientID) { 9447 return; 9448 } 9449 if (null === awarenessState) { 9450 currentStates.delete(clientId); 9451 removed.add(clientId); 9452 return; 9453 } 9454 if (!currentStates.has(clientId)) { 9455 currentStates.set(clientId, awarenessState); 9456 added.add(clientId); 9457 return; 9458 } 9459 const currentState = currentStates.get(clientId); 9460 if (JSON.stringify(currentState) !== JSON.stringify(awarenessState)) { 9461 currentStates.set(clientId, awarenessState); 9462 updated.add(clientId); 9463 } 9464 }); 9465 if (added.size + updated.size > 0) { 9466 awareness.emit("change", [ 9467 { 9468 added: Array.from(added), 9469 updated: Array.from(updated), 9470 // Left blank on purpose, as the removal of clients is handled in the if condition below. 9471 removed: [] 9472 } 9473 ]); 9474 } 9475 if (removed.size > 0) { 9476 removeAwarenessStates( 9477 awareness, 9478 Array.from(removed), 9479 POLLING_MANAGER_ORIGIN 9480 ); 9481 } 9482 } 9483 function processDocUpdate(update, doc2, onSync) { 9484 const data = base64ToUint8Array(update.data); 9485 switch (update.type) { 9486 case SyncUpdateType.SYNC_STEP_1: { 9487 return createSyncStep2Update(doc2, data); 9488 } 9489 case SyncUpdateType.SYNC_STEP_2: { 9490 const decoder = createDecoder(data); 9491 const encoder = createEncoder(); 9492 readSyncMessage( 9493 decoder, 9494 encoder, 9495 doc2, 9496 POLLING_MANAGER_ORIGIN 9497 ); 9498 onSync(); 9499 return; 9500 } 9501 case SyncUpdateType.COMPACTION: 9502 case SyncUpdateType.UPDATE: { 9503 applyUpdateV2(doc2, data, POLLING_MANAGER_ORIGIN); 9504 } 9505 } 9506 } 9507 function checkConnectionLimit(awareness, roomState) { 9508 if (!roomState.isPrimaryRoom || hasCheckedConnectionLimit) { 9509 return false; 9510 } 9511 hasCheckedConnectionLimit = true; 9512 const maxClientsPerRoom = (0, import_hooks2.applyFilters)( 9513 "sync.pollingProvider.maxClientsPerRoom", 9514 DEFAULT_CLIENT_LIMIT_PER_ROOM, 9515 roomState.room 9516 ); 9517 const clientCount = Object.keys(awareness).length; 9518 const validatedLimit = intValueOrDefault( 9519 maxClientsPerRoom, 9520 DEFAULT_CLIENT_LIMIT_PER_ROOM 9521 ); 9522 if (clientCount > validatedLimit) { 9523 roomState.log("Connection limit exceeded", { 9524 clientCount, 9525 maxClientsPerRoom: validatedLimit, 9526 room: roomState.room 9527 }); 9528 return true; 9529 } 9530 return false; 9531 } 9532 var areListenersRegistered = false; 9533 var hasCheckedConnectionLimit = false; 9534 var hasCollaborators = false; 9535 var isActiveBrowser = "visible" === document.visibilityState; 9536 var isPolling = false; 9537 var isUnloadPending = false; 9538 var pollInterval = POLLING_INTERVAL_IN_MS; 9539 var pollingTimeoutId = null; 9540 function handleBeforeUnload() { 9541 isUnloadPending = true; 9542 } 9543 function handlePageHide() { 9544 const rooms = Array.from(roomStates.entries()).map( 9545 ([room, state]) => ({ 9546 after: 0, 9547 awareness: null, 9548 client_id: state.clientId, 9549 room, 9550 updates: [] 9551 }) 9552 ); 9553 postSyncUpdateNonBlocking({ rooms }); 9554 } 9555 function handleVisibilityChange() { 9556 const wasActive = isActiveBrowser; 9557 isActiveBrowser = document.visibilityState === "visible"; 9558 if (isActiveBrowser && !wasActive) { 9559 if (pollingTimeoutId) { 9560 clearTimeout(pollingTimeoutId); 9561 pollingTimeoutId = null; 9562 poll(); 9563 } 9564 } 9565 } 9566 function poll() { 9567 isPolling = true; 9568 pollingTimeoutId = null; 9569 async function start() { 9570 if (0 === roomStates.size) { 9571 isPolling = false; 9572 return; 9573 } 9574 isUnloadPending = false; 9575 roomStates.forEach((state) => { 9576 state.onStatusChange({ status: "connecting" }); 9577 }); 9578 const payload = { 9579 rooms: Array.from(roomStates.entries()).map( 9580 ([room, state]) => ({ 9581 after: state.endCursor ?? 0, 9582 awareness: state.localAwarenessState, 9583 client_id: state.clientId, 9584 room, 9585 updates: state.updateQueue.get() 9586 }) 9587 ) 9588 }; 9589 try { 9590 const { rooms } = await postSyncUpdate(payload); 9591 roomStates.forEach((state) => { 9592 state.onStatusChange({ status: "connected" }); 9593 }); 9594 hasCollaborators = false; 9595 rooms.forEach((room) => { 9596 if (!roomStates.has(room.room)) { 9597 return; 9598 } 9599 const roomState = roomStates.get(room.room); 9600 roomState.endCursor = room.end_cursor; 9601 if (checkConnectionLimit(room.awareness, roomState)) { 9602 roomState.onStatusChange({ 9603 status: "disconnected", 9604 error: new ConnectionError( 9605 ConnectionErrorCode.CONNECTION_LIMIT_EXCEEDED, 9606 "Connection limit exceeded" 9607 ) 9608 }); 9609 unregisterRoom(room.room); 9610 return; 9611 } 9612 roomState.processAwarenessUpdate(room.awareness); 9613 if (roomState.isPrimaryRoom && Object.keys(room.awareness).length > 1) { 9614 hasCollaborators = true; 9615 roomStates.forEach((state) => { 9616 state.updateQueue.resume(); 9617 }); 9618 } 9619 const responseUpdates = []; 9620 for (const update of room.updates) { 9621 try { 9622 const response = roomState.processDocUpdate(update); 9623 if (response) { 9624 responseUpdates.push(response); 9625 } 9626 } catch (error) { 9627 roomState.log( 9628 "Failed to apply sync update", 9629 { error, update }, 9630 "error", 9631 true 9632 // force 9633 ); 9634 } 9635 } 9636 roomState.updateQueue.addBulk(responseUpdates); 9637 if (room.should_compact) { 9638 roomState.log("Server requested compaction update"); 9639 roomState.updateQueue.clear(); 9640 roomState.updateQueue.add( 9641 roomState.createCompactionUpdate() 9642 ); 9643 } else if (room.compaction_request) { 9644 roomState.log("Server requested (old) compaction update"); 9645 roomState.updateQueue.add( 9646 createDeprecatedCompactionUpdate( 9647 room.compaction_request 9648 ) 9649 ); 9650 } 9651 }); 9652 if (isActiveBrowser && hasCollaborators) { 9653 pollInterval = POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS; 9654 } else if (isActiveBrowser) { 9655 pollInterval = POLLING_INTERVAL_IN_MS; 9656 } else { 9657 pollInterval = POLLING_INTERVAL_BACKGROUND_TAB_IN_MS; 9658 } 9659 } catch (error) { 9660 pollInterval = Math.min( 9661 pollInterval * 2, 9662 MAX_ERROR_BACKOFF_IN_MS 9663 ); 9664 for (const room of payload.rooms) { 9665 if (!roomStates.has(room.room)) { 9666 continue; 9667 } 9668 const state = roomStates.get(room.room); 9669 if (room.updates.length > 0 && state.endCursor > 0) { 9670 state.updateQueue.clear(); 9671 state.updateQueue.add(state.createCompactionUpdate()); 9672 } else if (room.updates.length > 0) { 9673 state.updateQueue.restore(room.updates); 9674 } 9675 state.log( 9676 "Error posting sync update, will retry with backoff", 9677 { error, nextPoll: pollInterval }, 9678 "error", 9679 true 9680 // force 9681 ); 9682 } 9683 if (!isUnloadPending) { 9684 roomStates.forEach((state) => { 9685 state.onStatusChange({ 9686 status: "disconnected", 9687 canManuallyRetry: true, 9688 willAutoRetryInMs: pollInterval 9689 }); 9690 }); 9691 } 9692 } 9693 pollingTimeoutId = setTimeout(poll, pollInterval); 9694 } 9695 void start(); 9696 } 9697 function registerRoom({ 9698 room, 9699 doc: doc2, 9700 awareness, 9701 log, 9702 onSync, 9703 onStatusChange 9704 }) { 9705 if (roomStates.has(room)) { 9706 return; 9707 } 9708 const updateQueue = createUpdateQueue([createSyncStep1Update(doc2)]); 9709 const isPrimaryRoom = 0 === roomStates.size; 9710 function onAwarenessUpdate() { 9711 roomState.localAwarenessState = awareness.getLocalState() ?? {}; 9712 } 9713 function onDocUpdate(update, origin2) { 9714 if (POLLING_MANAGER_ORIGIN === origin2) { 9715 return; 9716 } 9717 if (update.byteLength > MAX_UPDATE_SIZE_IN_BYTES) { 9718 const state = roomStates.get(room); 9719 if (!state) { 9720 return; 9721 } 9722 state.log("Document size limit exceeded", { 9723 maxUpdateSizeInBytes: MAX_UPDATE_SIZE_IN_BYTES, 9724 updateSizeInBytes: update.byteLength 9725 }); 9726 state.onStatusChange({ 9727 status: "disconnected", 9728 error: new ConnectionError( 9729 ConnectionErrorCode.DOCUMENT_SIZE_LIMIT_EXCEEDED, 9730 "Document size limit exceeded" 9731 ) 9732 }); 9733 unregisterRoom(room); 9734 } 9735 updateQueue.add(createSyncUpdate(update, SyncUpdateType.UPDATE)); 9736 } 9737 function unregister() { 9738 doc2.off("updateV2", onDocUpdate); 9739 awareness.off("change", onAwarenessUpdate); 9740 updateQueue.clear(); 9741 } 9742 const roomState = { 9743 clientId: doc2.clientID, 9744 createCompactionUpdate: () => createSyncUpdate( 9745 encodeStateAsUpdateV2(doc2), 9746 SyncUpdateType.COMPACTION 9747 ), 9748 endCursor: 0, 9749 isPrimaryRoom, 9750 localAwarenessState: awareness.getLocalState() ?? {}, 9751 log, 9752 onStatusChange, 9753 processAwarenessUpdate: (state) => processAwarenessUpdate(state, awareness), 9754 processDocUpdate: (update) => processDocUpdate(update, doc2, onSync), 9755 room, 9756 unregister, 9757 updateQueue 9758 }; 9759 doc2.on("updateV2", onDocUpdate); 9760 awareness.on("change", onAwarenessUpdate); 9761 roomStates.set(room, roomState); 9762 if (!areListenersRegistered) { 9763 window.addEventListener("beforeunload", handleBeforeUnload); 9764 window.addEventListener("pagehide", handlePageHide); 9765 document.addEventListener("visibilitychange", handleVisibilityChange); 9766 areListenersRegistered = true; 9767 } 9768 if (!isPolling) { 9769 poll(); 9770 } 9771 } 9772 function unregisterRoom(room) { 9773 const state = roomStates.get(room); 9774 if (state) { 9775 const rooms = [ 9776 { 9777 after: 0, 9778 awareness: null, 9779 client_id: state.clientId, 9780 room, 9781 updates: [] 9782 } 9783 ]; 9784 postSyncUpdateNonBlocking({ rooms }); 9785 state.unregister(); 9786 roomStates.delete(room); 9787 } 9788 if (0 === roomStates.size && areListenersRegistered) { 9789 window.removeEventListener("beforeunload", handleBeforeUnload); 9790 window.removeEventListener("pagehide", handlePageHide); 9791 document.removeEventListener( 9792 "visibilitychange", 9793 handleVisibilityChange 9794 ); 9795 areListenersRegistered = false; 9796 hasCheckedConnectionLimit = false; 9797 } 9798 } 9799 function retryNow() { 9800 pollInterval = POLLING_INTERVAL_IN_MS * 2; 9801 if (pollingTimeoutId) { 9802 clearTimeout(pollingTimeoutId); 9803 pollingTimeoutId = null; 9804 poll(); 9805 } 9806 } 9807 var pollingManager = { 9808 registerRoom, 9809 retryNow, 9810 unregisterRoom 9811 }; 9812 9813 // packages/sync/build-module/providers/http-polling/http-polling-provider.mjs 9814 var HttpPollingProvider = class extends ObservableV2 { 9815 constructor(options) { 9816 super(); 9817 this.options = options; 9818 this.log("Initializing", { room: options.room }); 9819 this.awareness = options.awareness ?? new Awareness(options.ydoc); 9820 this.connect(); 9821 } 9822 awareness; 9823 status = "disconnected"; 9824 synced = false; 9825 /** 9826 * Connect to the endpoint and initialize sync. 9827 */ 9828 connect() { 9829 this.log("Connecting"); 9830 pollingManager.registerRoom({ 9831 room: this.options.room, 9832 doc: this.options.ydoc, 9833 awareness: this.awareness, 9834 log: this.log, 9835 onStatusChange: this.emitStatus, 9836 onSync: this.onSync 9837 }); 9838 } 9839 /** 9840 * Destroy the provider and cleanup resources. 9841 */ 9842 destroy() { 9843 this.disconnect(); 9844 super.destroy(); 9845 } 9846 /** 9847 * Disconnect the provider and allow reconnection later. 9848 */ 9849 disconnect() { 9850 this.log("Disconnecting"); 9851 pollingManager.unregisterRoom(this.options.room); 9852 this.emitStatus({ status: "disconnected" }); 9853 } 9854 /** 9855 * Emit connection status, passing the full object through so that 9856 * additional fields (e.g. `willAutoRetryInMs`) are preserved for consumers. 9857 * 9858 * @param connectionStatus The connection status object 9859 */ 9860 emitStatus = (connectionStatus) => { 9861 const { status } = connectionStatus; 9862 const error = status === "disconnected" ? connectionStatus.error : void 0; 9863 if (this.status === status && !error) { 9864 return; 9865 } 9866 if (status === "connecting" && this.status !== "disconnected") { 9867 return; 9868 } 9869 this.log("Status change", { status, error }); 9870 this.status = status; 9871 this.emit("status", [connectionStatus]); 9872 }; 9873 /** 9874 * Log debug messages if debugging is enabled. 9875 * 9876 * @param message The debug message 9877 * @param debug Additional debug information 9878 * @param errorLevel The console method to use for logging 9879 * @param force Whether to force logging regardless of debug setting 9880 */ 9881 log = (message, debug = {}, errorLevel = "log", force = false) => { 9882 if (!this.options.debug && !force) { 9883 return; 9884 } 9885 const logFn = console[errorLevel] || console.log; 9886 logFn(`[$this.constructor.name}]: $message}`, { 9887 room: this.options.room, 9888 ...debug 9889 }); 9890 }; 9891 /** 9892 * Handle synchronization events from the polling manager. 9893 */ 9894 onSync = () => { 9895 if (!this.synced) { 9896 this.synced = true; 9897 this.log("Synced"); 9898 } 9899 }; 9900 }; 9901 function createHttpPollingProvider() { 9902 return async ({ 9903 awareness, 9904 objectType, 9905 objectId, 9906 ydoc 9907 }) => { 9908 const room = objectId ? `$objectType}:$objectId}` : objectType; 9909 const provider = new HttpPollingProvider({ 9910 awareness, 9911 // debug: true, 9912 room, 9913 ydoc 9914 }); 9915 return { 9916 destroy: () => provider.destroy(), 9917 // Adapter: ObservableV2.on is compatible with ProviderOn 9918 // The callback receives data as the first parameter 9919 on: (event, callback) => { 9920 provider.on(event, callback); 9921 } 9922 }; 9923 }; 9924 } 9925 9926 // packages/sync/build-module/providers/index.mjs 9927 var providerCreators = null; 9928 function getDefaultProviderCreators() { 9929 return [createHttpPollingProvider()]; 9930 } 9931 function isProviderCreator(creator) { 9932 return "function" === typeof creator; 9933 } 9934 function getProviderCreators() { 9935 if (providerCreators) { 9936 return providerCreators; 9937 } 9938 if (!window._wpCollaborationEnabled) { 9939 return []; 9940 } 9941 const filteredProviderCreators = (0, import_hooks3.applyFilters)( 9942 "sync.providers", 9943 getDefaultProviderCreators() 9944 ); 9945 if (!Array.isArray(filteredProviderCreators)) { 9946 providerCreators = []; 9947 return providerCreators; 9948 } 9949 providerCreators = filteredProviderCreators.filter(isProviderCreator); 9950 return providerCreators; 9951 } 9952 9953 // packages/sync/build-module/y-utilities/y-multidoc-undomanager.mjs 9954 var popStackItem2 = (mum, type) => { 9955 const stack = type === "undo" ? mum.undoStack : mum.redoStack; 9956 while (stack.length > 0) { 9957 const um = ( 9958 /** @type {Y.UndoManager} */ 9959 stack.pop() 9960 ); 9961 const prevUmStack = type === "undo" ? um.undoStack : um.redoStack; 9962 const stackItem = ( 9963 /** @type {any} */ 9964 prevUmStack.pop() 9965 ); 9966 let actionPerformed = false; 9967 if (type === "undo") { 9968 um.undoStack = [stackItem]; 9969 actionPerformed = um.undo() !== null; 9970 um.undoStack = prevUmStack; 9971 } else { 9972 um.redoStack = [stackItem]; 9973 actionPerformed = um.redo() !== null; 9974 um.redoStack = prevUmStack; 9975 } 9976 if (actionPerformed) { 9977 return stackItem; 9978 } 9979 } 9980 return null; 9981 }; 9982 var YMultiDocUndoManager = class extends Observable { 9983 /** 9984 * @param {Y.AbstractType<any>|Array<Y.AbstractType<any>>} typeScope Accepts either a single type, or an array of types 9985 * @param {ConstructorParameters<typeof Y.UndoManager>[1]} opts 9986 */ 9987 constructor(typeScope = [], opts = {}) { 9988 super(); 9989 this.docs = /* @__PURE__ */ new Map(); 9990 this.trackedOrigins = opts.trackedOrigins || /* @__PURE__ */ new Set([null]); 9991 opts.trackedOrigins = this.trackedOrigins; 9992 this._defaultOpts = opts; 9993 this.undoStack = []; 9994 this.redoStack = []; 9995 this.addToScope(typeScope); 9996 } 9997 /** 9998 * @param {Array<Y.AbstractType<any>> | Y.AbstractType<any>} ytypes 9999 */ 10000 addToScope(ytypes) { 10001 ytypes = isArray(ytypes) ? ytypes : [ytypes]; 10002 ytypes.forEach((ytype) => { 10003 const ydoc = ( 10004 /** @type {Y.Doc} */ 10005 ytype.doc 10006 ); 10007 const um = setIfUndefined(this.docs, ydoc, () => { 10008 const um2 = new UndoManager([ytype], this._defaultOpts); 10009 um2.on( 10010 "stack-cleared", 10011 /** @param {any} opts */ 10012 ({ 10013 undoStackCleared, 10014 redoStackCleared 10015 }) => { 10016 this.clear(undoStackCleared, redoStackCleared); 10017 } 10018 ); 10019 ydoc.on("destroy", () => { 10020 this.docs.delete(ydoc); 10021 this.undoStack = this.undoStack.filter( 10022 (um3) => um3.doc !== ydoc 10023 ); 10024 this.redoStack = this.redoStack.filter( 10025 (um3) => um3.doc !== ydoc 10026 ); 10027 }); 10028 um2.on( 10029 "stack-item-added", 10030 /** @param {any} change */ 10031 (change) => { 10032 const stack = change.type === "undo" ? this.undoStack : this.redoStack; 10033 stack.push(um2); 10034 this.emit("stack-item-added", [ 10035 { ...change, ydoc }, 10036 this 10037 ]); 10038 } 10039 ); 10040 um2.on( 10041 "stack-item-updated", 10042 /** @param {any} change */ 10043 (change) => { 10044 this.emit("stack-item-updated", [ 10045 { ...change, ydoc }, 10046 this 10047 ]); 10048 } 10049 ); 10050 um2.on( 10051 "stack-item-popped", 10052 /** @param {any} change */ 10053 (change) => { 10054 this.emit("stack-item-popped", [ 10055 { ...change, ydoc }, 10056 this 10057 ]); 10058 } 10059 ); 10060 return um2; 10061 }); 10062 if (um.scope.every((yt) => yt !== ytype)) { 10063 um.scope.push(ytype); 10064 } 10065 }); 10066 } 10067 /** 10068 * @param {any} origin 10069 */ 10070 /* c8 ignore next 3 */ 10071 addTrackedOrigin(origin2) { 10072 this.trackedOrigins.add(origin2); 10073 } 10074 /** 10075 * @param {any} origin 10076 */ 10077 /* c8 ignore next 3 */ 10078 removeTrackedOrigin(origin2) { 10079 this.trackedOrigins.delete(origin2); 10080 } 10081 /** 10082 * Undo last changes on type. 10083 * 10084 * @return {any?} Returns StackItem if a change was applied 10085 */ 10086 undo() { 10087 return popStackItem2(this, "undo"); 10088 } 10089 /** 10090 * Redo last undo operation. 10091 * 10092 * @return {any?} Returns StackItem if a change was applied 10093 */ 10094 redo() { 10095 return popStackItem2(this, "redo"); 10096 } 10097 clear(clearUndoStack = true, clearRedoStack = true) { 10098 if (clearUndoStack && this.canUndo() || clearRedoStack && this.canRedo()) { 10099 this.docs.forEach((um) => { 10100 clearUndoStack && (this.undoStack = []); 10101 clearRedoStack && (this.redoStack = []); 10102 um.clear(clearUndoStack, clearRedoStack); 10103 }); 10104 this.emit("stack-cleared", [ 10105 { 10106 undoStackCleared: clearUndoStack, 10107 redoStackCleared: clearRedoStack 10108 } 10109 ]); 10110 } 10111 } 10112 /* c8 ignore next 5 */ 10113 stopCapturing() { 10114 this.docs.forEach((um) => { 10115 um.stopCapturing(); 10116 }); 10117 } 10118 /** 10119 * Are undo steps available? 10120 * 10121 * @return {boolean} `true` if undo is possible 10122 */ 10123 canUndo() { 10124 return this.undoStack.length > 0; 10125 } 10126 /** 10127 * Are redo steps available? 10128 * 10129 * @return {boolean} `true` if redo is possible 10130 */ 10131 canRedo() { 10132 return this.redoStack.length > 0; 10133 } 10134 destroy() { 10135 this.docs.forEach((um) => um.destroy()); 10136 super.destroy(); 10137 } 10138 }; 10139 10140 // packages/sync/build-module/undo-manager.mjs 10141 function createUndoManager() { 10142 const yUndoManager = new YMultiDocUndoManager([], { 10143 // Throttle undo/redo captures after 500ms of inactivity. 10144 // 500 was selected from subjective local UX testing, shorter timeouts 10145 // may cause mid-word undo stack items. 10146 captureTimeout: 500, 10147 // Ensure that we only scope the undo/redo to the current editor. 10148 // The yjs document's clientID is added once it's available. 10149 trackedOrigins: /* @__PURE__ */ new Set([LOCAL_EDITOR_ORIGIN]) 10150 }); 10151 return { 10152 /** 10153 * Record changes into the history. 10154 * Since Yjs automatically tracks changes, this method translates the WordPress 10155 * HistoryRecord format into Yjs operations. 10156 * 10157 * @param _record A record of changes to record. 10158 * @param _isStaged Whether to immediately create an undo point or not. 10159 */ 10160 addRecord(_record, _isStaged = false) { 10161 }, 10162 /** 10163 * Add a Yjs map to the scope of the undo manager. 10164 * 10165 * @param {Y.Map< any >} ymap The Yjs map to add to the scope. 10166 * @param handlers 10167 * @param handlers.addUndoMeta 10168 * @param handlers.restoreUndoMeta 10169 */ 10170 addToScope(ymap, handlers) { 10171 if (ymap.doc === null) { 10172 return; 10173 } 10174 const ydoc = ymap.doc; 10175 yUndoManager.addToScope(ymap); 10176 const { addUndoMeta, restoreUndoMeta } = handlers; 10177 yUndoManager.on("stack-item-added", (event) => { 10178 addUndoMeta(ydoc, event.stackItem.meta); 10179 }); 10180 yUndoManager.on("stack-item-popped", (event) => { 10181 restoreUndoMeta(ydoc, event.stackItem.meta); 10182 }); 10183 }, 10184 /** 10185 * Undo the last recorded changes. 10186 * 10187 */ 10188 undo() { 10189 if (!yUndoManager.canUndo()) { 10190 return; 10191 } 10192 yUndoManager.undo(); 10193 return []; 10194 }, 10195 /** 10196 * Redo the last undone changes. 10197 */ 10198 redo() { 10199 if (!yUndoManager.canRedo()) { 10200 return; 10201 } 10202 yUndoManager.redo(); 10203 return []; 10204 }, 10205 /** 10206 * Check if there are changes that can be undone. 10207 * 10208 * @return {boolean} Whether there are changes to undo. 10209 */ 10210 hasUndo() { 10211 return yUndoManager.canUndo(); 10212 }, 10213 /** 10214 * Check if there are changes that can be redone. 10215 * 10216 * @return {boolean} Whether there are changes to redo. 10217 */ 10218 hasRedo() { 10219 return yUndoManager.canRedo(); 10220 }, 10221 /** 10222 * Stop capturing changes into the current undo item. 10223 * The next change will create a new undo item. 10224 */ 10225 stopCapturing() { 10226 yUndoManager.stopCapturing(); 10227 } 10228 }; 10229 } 10230 10231 // packages/sync/build-module/utils.mjs 10232 function createYjsDoc(documentMeta = {}) { 10233 const metaMap = new Map( 10234 Object.entries(documentMeta) 10235 ); 10236 return new Doc({ meta: metaMap }); 10237 } 10238 function initializeYjsDoc(ydoc) { 10239 const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY); 10240 stateMap.set(CRDT_STATE_MAP_VERSION_KEY, CRDT_DOC_VERSION); 10241 } 10242 function markEntityAsSaved(ydoc) { 10243 const recordMeta = ydoc.getMap(CRDT_STATE_MAP_KEY); 10244 recordMeta.set(CRDT_STATE_MAP_SAVED_AT_KEY, Date.now()); 10245 recordMeta.set(CRDT_STATE_MAP_SAVED_BY_KEY, ydoc.clientID); 10246 } 10247 function pseudoRandomID() { 10248 return Math.floor(Math.random() * 1e9); 10249 } 10250 function serializeCrdtDoc(crdtDoc) { 10251 return JSON.stringify({ 10252 document: toBase64(encodeStateAsUpdateV2(crdtDoc)), 10253 updateId: pseudoRandomID() 10254 // helps with debugging 10255 }); 10256 } 10257 function deserializeCrdtDoc(serializedCrdtDoc) { 10258 try { 10259 const { document: document2 } = JSON.parse(serializedCrdtDoc); 10260 const docMeta = { 10261 [CRDT_DOC_META_PERSISTENCE_KEY]: true 10262 }; 10263 const ydoc = createYjsDoc(docMeta); 10264 const yupdate = fromBase64(document2); 10265 applyUpdateV2(ydoc, yupdate); 10266 ydoc.clientID = pseudoRandomID(); 10267 return ydoc; 10268 } catch (e) { 10269 return null; 10270 } 10271 } 10272 10273 // packages/sync/build-module/manager.mjs 10274 function getEntityId(objectType, objectId) { 10275 return `$objectType}_$objectId}`; 10276 } 10277 function createSyncManager(debug = false) { 10278 const debugWrap = debug ? logPerformanceTiming : passThru; 10279 const collectionStates = /* @__PURE__ */ new Map(); 10280 const entityStates = /* @__PURE__ */ new Map(); 10281 let undoManager; 10282 function log(component, message, entityId, context = {}) { 10283 if (!debug) { 10284 return; 10285 } 10286 console.log(`[SyncManager][$component}]: $message}`, { 10287 ...context, 10288 entityId 10289 }); 10290 } 10291 async function loadEntity(syncConfig, objectType, objectId, record, handlers) { 10292 const providerCreators2 = getProviderCreators(); 10293 const entityId = getEntityId(objectType, objectId); 10294 if (0 === providerCreators2.length) { 10295 log("loadEntity", "no providers, skipping", entityId); 10296 return; 10297 } 10298 if (entityStates.has(entityId)) { 10299 log("loadEntity", "already loaded", entityId); 10300 return; 10301 } 10302 log("loadEntity", "loading", entityId); 10303 handlers = { 10304 addUndoMeta: debugWrap(handlers.addUndoMeta), 10305 editRecord: debugWrap(handlers.editRecord), 10306 getEditedRecord: debugWrap(handlers.getEditedRecord), 10307 onStatusChange: debugWrap(handlers.onStatusChange), 10308 persistCRDTDoc: debugWrap(handlers.persistCRDTDoc), 10309 refetchRecord: debugWrap(handlers.refetchRecord), 10310 restoreUndoMeta: debugWrap(handlers.restoreUndoMeta) 10311 }; 10312 const ydoc = createYjsDoc({ objectType }); 10313 const recordMap = ydoc.getMap(CRDT_RECORD_MAP_KEY); 10314 const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY); 10315 const now = Date.now(); 10316 const unload = () => { 10317 log("loadEntity", "unloading", entityId); 10318 providerResults.forEach((result) => result.destroy()); 10319 handlers.onStatusChange(null); 10320 recordMap.unobserveDeep(onRecordUpdate); 10321 stateMap.unobserve(onStateMapUpdate); 10322 ydoc.destroy(); 10323 entityStates.delete(entityId); 10324 }; 10325 const awareness = syncConfig.createAwareness?.(ydoc, objectId); 10326 const onRecordUpdate = (_events, transaction) => { 10327 if (transaction.local && !(transaction.origin instanceof UndoManager)) { 10328 return; 10329 } 10330 void internal.updateEntityRecord(objectType, objectId); 10331 }; 10332 const onStateMapUpdate = (event, transaction) => { 10333 if (transaction.local) { 10334 return; 10335 } 10336 event.keysChanged.forEach((key) => { 10337 switch (key) { 10338 case CRDT_STATE_MAP_SAVED_AT_KEY: 10339 const newValue = stateMap.get(CRDT_STATE_MAP_SAVED_AT_KEY); 10340 if ("number" === typeof newValue && newValue > now) { 10341 log("loadEntity", "refetching record", entityId); 10342 void handlers.refetchRecord().catch(() => { 10343 }); 10344 } 10345 break; 10346 } 10347 }); 10348 }; 10349 if (!undoManager) { 10350 undoManager = createUndoManager(); 10351 } 10352 const { addUndoMeta, restoreUndoMeta } = handlers; 10353 undoManager.addToScope(recordMap, { 10354 addUndoMeta, 10355 restoreUndoMeta 10356 }); 10357 const entityState = { 10358 awareness, 10359 handlers, 10360 objectId, 10361 objectType, 10362 syncConfig, 10363 unload, 10364 ydoc 10365 }; 10366 entityStates.set(entityId, entityState); 10367 log("loadEntity", "connecting", entityId); 10368 const providerResults = await Promise.all( 10369 providerCreators2.map(async (create7) => { 10370 const provider = await create7({ 10371 objectType, 10372 objectId, 10373 ydoc, 10374 awareness 10375 }); 10376 provider.on("status", handlers.onStatusChange); 10377 return provider; 10378 }) 10379 ); 10380 recordMap.observeDeep(onRecordUpdate); 10381 stateMap.observe(onStateMapUpdate); 10382 initializeYjsDoc(ydoc); 10383 internal.applyPersistedCrdtDoc(objectType, objectId, record); 10384 } 10385 async function loadCollection(syncConfig, objectType, handlers) { 10386 const providerCreators2 = getProviderCreators(); 10387 const entityId = getEntityId(objectType, null); 10388 if (0 === providerCreators2.length) { 10389 log("loadCollection", "no providers, skipping", entityId); 10390 return; 10391 } 10392 if (collectionStates.has(objectType)) { 10393 log("loadCollection", "already loaded", entityId); 10394 return; 10395 } 10396 log("loadCollection", "loading", entityId); 10397 const ydoc = createYjsDoc({ collection: true, objectType }); 10398 const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY); 10399 const now = Date.now(); 10400 const unload = () => { 10401 log("loadCollection", "unloading", entityId); 10402 providerResults.forEach((result) => result.destroy()); 10403 handlers.onStatusChange(null); 10404 stateMap.unobserve(onStateMapUpdate); 10405 ydoc.destroy(); 10406 collectionStates.delete(objectType); 10407 }; 10408 const onStateMapUpdate = (event, transaction) => { 10409 if (transaction.local) { 10410 return; 10411 } 10412 event.keysChanged.forEach((key) => { 10413 switch (key) { 10414 case CRDT_STATE_MAP_SAVED_AT_KEY: 10415 const newValue = stateMap.get(CRDT_STATE_MAP_SAVED_AT_KEY); 10416 if ("number" === typeof newValue && newValue > now) { 10417 void handlers.refetchRecords().catch(() => { 10418 }); 10419 } 10420 break; 10421 } 10422 }); 10423 }; 10424 const awareness = syncConfig.createAwareness?.(ydoc); 10425 const collectionState = { 10426 awareness, 10427 handlers, 10428 syncConfig, 10429 unload, 10430 ydoc 10431 }; 10432 collectionStates.set(objectType, collectionState); 10433 log("loadCollection", "connecting", entityId); 10434 const providerResults = await Promise.all( 10435 providerCreators2.map(async (create7) => { 10436 const provider = await create7({ 10437 awareness, 10438 objectType, 10439 objectId: null, 10440 ydoc 10441 }); 10442 provider.on("status", handlers.onStatusChange); 10443 return provider; 10444 }) 10445 ); 10446 stateMap.observe(onStateMapUpdate); 10447 initializeYjsDoc(ydoc); 10448 } 10449 function unloadEntity(objectType, objectId) { 10450 const entityId = getEntityId(objectType, objectId); 10451 log("unloadEntity", "unloading", entityId); 10452 entityStates.get(entityId)?.unload(); 10453 updateCRDTDoc(objectType, null, {}, origin, { isSave: true }); 10454 } 10455 function getAwareness(objectType, objectId) { 10456 const entityId = getEntityId(objectType, objectId); 10457 const entityState = entityStates.get(entityId); 10458 if (!entityState || !entityState.awareness) { 10459 return void 0; 10460 } 10461 return entityState.awareness; 10462 } 10463 function _applyPersistedCrdtDoc(objectType, objectId, record) { 10464 const entityId = getEntityId(objectType, objectId); 10465 const entityState = entityStates.get(entityId); 10466 if (!entityState) { 10467 log("applyPersistedCrdtDoc", "no entity state", entityId); 10468 return; 10469 } 10470 const { 10471 handlers, 10472 syncConfig: { 10473 applyChangesToCRDTDoc, 10474 getChangesFromCRDTDoc, 10475 getPersistedCRDTDoc 10476 }, 10477 ydoc: targetDoc 10478 } = entityState; 10479 const serialized = getPersistedCRDTDoc?.(record); 10480 const tempDoc = serialized ? deserializeCrdtDoc(serialized) : null; 10481 if (!tempDoc) { 10482 log("applyPersistedCrdtDoc", "no persisted doc", entityId); 10483 targetDoc.transact(() => { 10484 applyChangesToCRDTDoc(targetDoc, record); 10485 handlers.persistCRDTDoc(); 10486 }, LOCAL_SYNC_MANAGER_ORIGIN); 10487 return; 10488 } 10489 const update = encodeStateAsUpdateV2(tempDoc); 10490 applyUpdateV2(targetDoc, update); 10491 const invalidations = getChangesFromCRDTDoc(tempDoc, record); 10492 const invalidatedKeys = Object.keys(invalidations); 10493 tempDoc.destroy(); 10494 if (0 === invalidatedKeys.length) { 10495 log("applyPersistedCrdtDoc", "valid persisted doc", entityId); 10496 return; 10497 } 10498 log("applyPersistedCrdtDoc", "invalidated keys", entityId, { 10499 invalidatedKeys 10500 }); 10501 const changes = invalidatedKeys.reduce( 10502 (acc, key) => Object.assign(acc, { 10503 [key]: record[key] 10504 }), 10505 {} 10506 ); 10507 targetDoc.transact(() => { 10508 applyChangesToCRDTDoc(targetDoc, changes); 10509 handlers.persistCRDTDoc(); 10510 }, LOCAL_SYNC_MANAGER_ORIGIN); 10511 } 10512 function updateCRDTDoc(objectType, objectId, changes, origin2, options = {}) { 10513 const { isSave = false, isNewUndoLevel = false } = options; 10514 const entityId = getEntityId(objectType, objectId); 10515 const entityState = entityStates.get(entityId); 10516 const collectionState = collectionStates.get(objectType); 10517 if (entityState) { 10518 const { syncConfig, ydoc } = entityState; 10519 if (isNewUndoLevel && undoManager) { 10520 undoManager.stopCapturing?.(); 10521 } 10522 ydoc.transact(() => { 10523 log("updateCRDTDoc", "applying changes", entityId, { 10524 changedKeys: Object.keys(changes) 10525 }); 10526 syncConfig.applyChangesToCRDTDoc(ydoc, changes); 10527 if (isSave) { 10528 markEntityAsSaved(ydoc); 10529 } 10530 }, origin2); 10531 } 10532 if (collectionState && isSave) { 10533 collectionState.ydoc.transact(() => { 10534 markEntityAsSaved(collectionState.ydoc); 10535 }, origin2); 10536 } 10537 } 10538 async function _updateEntityRecord(objectType, objectId) { 10539 const entityId = getEntityId(objectType, objectId); 10540 const entityState = entityStates.get(entityId); 10541 if (!entityState) { 10542 log("updateEntityRecord", "no entity state", entityId); 10543 return; 10544 } 10545 const { handlers, syncConfig, ydoc } = entityState; 10546 const changes = syncConfig.getChangesFromCRDTDoc( 10547 ydoc, 10548 await handlers.getEditedRecord() 10549 ); 10550 const changedKeys = Object.keys(changes); 10551 if (0 === changedKeys.length) { 10552 return; 10553 } 10554 log("updateEntityRecord", "changes", entityId, { 10555 changedKeys 10556 }); 10557 handlers.editRecord(changes); 10558 } 10559 async function createPersistedCRDTDoc(objectType, objectId) { 10560 const entityId = getEntityId(objectType, objectId); 10561 const entityState = entityStates.get(entityId); 10562 if (!entityState?.ydoc) { 10563 return null; 10564 } 10565 await new Promise((resolve) => setTimeout(resolve, 0)); 10566 return serializeCrdtDoc(entityState.ydoc); 10567 } 10568 const internal = { 10569 applyPersistedCrdtDoc: debugWrap(_applyPersistedCrdtDoc), 10570 updateEntityRecord: debugWrap(_updateEntityRecord) 10571 }; 10572 return { 10573 createPersistedCRDTDoc: debugWrap(createPersistedCRDTDoc), 10574 getAwareness, 10575 load: debugWrap(loadEntity), 10576 loadCollection: debugWrap(loadCollection), 10577 // Use getter to ensure we always return the current value of `undoManager`. 10578 get undoManager() { 10579 return undoManager; 10580 }, 10581 unload: debugWrap(unloadEntity), 10582 update: debugWrap(yieldToEventLoop(updateCRDTDoc)) 10583 }; 10584 } 10585 10586 // packages/sync/node_modules/diff/libesm/diff/base.js 10587 var Diff = class { 10588 diff(oldStr, newStr, options = {}) { 10589 let callback; 10590 if (typeof options === "function") { 10591 callback = options; 10592 options = {}; 10593 } else if ("callback" in options) { 10594 callback = options.callback; 10595 } 10596 const oldString = this.castInput(oldStr, options); 10597 const newString = this.castInput(newStr, options); 10598 const oldTokens = this.removeEmpty(this.tokenize(oldString, options)); 10599 const newTokens = this.removeEmpty(this.tokenize(newString, options)); 10600 return this.diffWithOptionsObj(oldTokens, newTokens, options, callback); 10601 } 10602 diffWithOptionsObj(oldTokens, newTokens, options, callback) { 10603 var _a; 10604 const done = (value) => { 10605 value = this.postProcess(value, options); 10606 if (callback) { 10607 setTimeout(function() { 10608 callback(value); 10609 }, 0); 10610 return void 0; 10611 } else { 10612 return value; 10613 } 10614 }; 10615 const newLen = newTokens.length, oldLen = oldTokens.length; 10616 let editLength = 1; 10617 let maxEditLength = newLen + oldLen; 10618 if (options.maxEditLength != null) { 10619 maxEditLength = Math.min(maxEditLength, options.maxEditLength); 10620 } 10621 const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity; 10622 const abortAfterTimestamp = Date.now() + maxExecutionTime; 10623 const bestPath = [{ oldPos: -1, lastComponent: void 0 }]; 10624 let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options); 10625 if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) { 10626 return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens)); 10627 } 10628 let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity; 10629 const execEditLength = () => { 10630 for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) { 10631 let basePath; 10632 const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1]; 10633 if (removePath) { 10634 bestPath[diagonalPath - 1] = void 0; 10635 } 10636 let canAdd = false; 10637 if (addPath) { 10638 const addPathNewPos = addPath.oldPos - diagonalPath; 10639 canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen; 10640 } 10641 const canRemove = removePath && removePath.oldPos + 1 < oldLen; 10642 if (!canAdd && !canRemove) { 10643 bestPath[diagonalPath] = void 0; 10644 continue; 10645 } 10646 if (!canRemove || canAdd && removePath.oldPos < addPath.oldPos) { 10647 basePath = this.addToPath(addPath, true, false, 0, options); 10648 } else { 10649 basePath = this.addToPath(removePath, false, true, 1, options); 10650 } 10651 newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options); 10652 if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) { 10653 return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true; 10654 } else { 10655 bestPath[diagonalPath] = basePath; 10656 if (basePath.oldPos + 1 >= oldLen) { 10657 maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1); 10658 } 10659 if (newPos + 1 >= newLen) { 10660 minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1); 10661 } 10662 } 10663 } 10664 editLength++; 10665 }; 10666 if (callback) { 10667 (function exec() { 10668 setTimeout(function() { 10669 if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) { 10670 return callback(void 0); 10671 } 10672 if (!execEditLength()) { 10673 exec(); 10674 } 10675 }, 0); 10676 })(); 10677 } else { 10678 while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) { 10679 const ret = execEditLength(); 10680 if (ret) { 10681 return ret; 10682 } 10683 } 10684 } 10685 } 10686 addToPath(path, added, removed, oldPosInc, options) { 10687 const last2 = path.lastComponent; 10688 if (last2 && !options.oneChangePerToken && last2.added === added && last2.removed === removed) { 10689 return { 10690 oldPos: path.oldPos + oldPosInc, 10691 lastComponent: { count: last2.count + 1, added, removed, previousComponent: last2.previousComponent } 10692 }; 10693 } else { 10694 return { 10695 oldPos: path.oldPos + oldPosInc, 10696 lastComponent: { count: 1, added, removed, previousComponent: last2 } 10697 }; 10698 } 10699 } 10700 extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) { 10701 const newLen = newTokens.length, oldLen = oldTokens.length; 10702 let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0; 10703 while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) { 10704 newPos++; 10705 oldPos++; 10706 commonCount++; 10707 if (options.oneChangePerToken) { 10708 basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false }; 10709 } 10710 } 10711 if (commonCount && !options.oneChangePerToken) { 10712 basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false }; 10713 } 10714 basePath.oldPos = oldPos; 10715 return newPos; 10716 } 10717 equals(left, right, options) { 10718 if (options.comparator) { 10719 return options.comparator(left, right); 10720 } else { 10721 return left === right || !!options.ignoreCase && left.toLowerCase() === right.toLowerCase(); 10722 } 10723 } 10724 removeEmpty(array) { 10725 const ret = []; 10726 for (let i = 0; i < array.length; i++) { 10727 if (array[i]) { 10728 ret.push(array[i]); 10729 } 10730 } 10731 return ret; 10732 } 10733 // eslint-disable-next-line @typescript-eslint/no-unused-vars 10734 castInput(value, options) { 10735 return value; 10736 } 10737 // eslint-disable-next-line @typescript-eslint/no-unused-vars 10738 tokenize(value, options) { 10739 return Array.from(value); 10740 } 10741 join(chars) { 10742 return chars.join(""); 10743 } 10744 postProcess(changeObjects, options) { 10745 return changeObjects; 10746 } 10747 get useLongestToken() { 10748 return false; 10749 } 10750 buildValues(lastComponent, newTokens, oldTokens) { 10751 const components = []; 10752 let nextComponent; 10753 while (lastComponent) { 10754 components.push(lastComponent); 10755 nextComponent = lastComponent.previousComponent; 10756 delete lastComponent.previousComponent; 10757 lastComponent = nextComponent; 10758 } 10759 components.reverse(); 10760 const componentLen = components.length; 10761 let componentPos = 0, newPos = 0, oldPos = 0; 10762 for (; componentPos < componentLen; componentPos++) { 10763 const component = components[componentPos]; 10764 if (!component.removed) { 10765 if (!component.added && this.useLongestToken) { 10766 let value = newTokens.slice(newPos, newPos + component.count); 10767 value = value.map(function(value2, i) { 10768 const oldValue = oldTokens[oldPos + i]; 10769 return oldValue.length > value2.length ? oldValue : value2; 10770 }); 10771 component.value = this.join(value); 10772 } else { 10773 component.value = this.join(newTokens.slice(newPos, newPos + component.count)); 10774 } 10775 newPos += component.count; 10776 if (!component.added) { 10777 oldPos += component.count; 10778 } 10779 } else { 10780 component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count)); 10781 oldPos += component.count; 10782 } 10783 } 10784 return components; 10785 } 10786 }; 10787 10788 // packages/sync/node_modules/diff/libesm/diff/character.js 10789 var CharacterDiff = class extends Diff { 10790 }; 10791 var characterDiff = new CharacterDiff(); 10792 function diffChars(oldStr, newStr, options) { 10793 return characterDiff.diff(oldStr, newStr, options); 10794 } 10795 10796 // packages/sync/node_modules/diff/libesm/diff/line.js 10797 var LineDiff = class extends Diff { 10798 constructor() { 10799 super(...arguments); 10800 this.tokenize = tokenize; 10801 } 10802 equals(left, right, options) { 10803 if (options.ignoreWhitespace) { 10804 if (!options.newlineIsToken || !left.includes("\n")) { 10805 left = left.trim(); 10806 } 10807 if (!options.newlineIsToken || !right.includes("\n")) { 10808 right = right.trim(); 10809 } 10810 } else if (options.ignoreNewlineAtEof && !options.newlineIsToken) { 10811 if (left.endsWith("\n")) { 10812 left = left.slice(0, -1); 10813 } 10814 if (right.endsWith("\n")) { 10815 right = right.slice(0, -1); 10816 } 10817 } 10818 return super.equals(left, right, options); 10819 } 10820 }; 10821 var lineDiff = new LineDiff(); 10822 function diffLines(oldStr, newStr, options) { 10823 return lineDiff.diff(oldStr, newStr, options); 10824 } 10825 function tokenize(value, options) { 10826 if (options.stripTrailingCr) { 10827 value = value.replace(/\r\n/g, "\n"); 10828 } 10829 const retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/); 10830 if (!linesAndNewlines[linesAndNewlines.length - 1]) { 10831 linesAndNewlines.pop(); 10832 } 10833 for (let i = 0; i < linesAndNewlines.length; i++) { 10834 const line = linesAndNewlines[i]; 10835 if (i % 2 && !options.newlineIsToken) { 10836 retLines[retLines.length - 1] += line; 10837 } else { 10838 retLines.push(line); 10839 } 10840 } 10841 return retLines; 10842 } 10843 10844 // packages/sync/build-module/quill-delta/Delta.mjs 10845 var import_es62 = __toESM(require_es6(), 1); 10846 10847 // packages/sync/build-module/quill-delta/AttributeMap.mjs 10848 var import_es6 = __toESM(require_es6(), 1); 10849 function cloneDeep(value) { 10850 return JSON.parse(JSON.stringify(value)); 10851 } 10852 var AttributeMap; 10853 ((AttributeMap2) => { 10854 function compose(a = {}, b = {}, keepNull = false) { 10855 if (typeof a !== "object") { 10856 a = {}; 10857 } 10858 if (typeof b !== "object") { 10859 b = {}; 10860 } 10861 let attributes = cloneDeep(b); 10862 if (!keepNull) { 10863 attributes = Object.keys(attributes).reduce( 10864 (copy2, key) => { 10865 if (attributes[key] !== null || attributes[key] !== void 0) { 10866 copy2[key] = attributes[key]; 10867 } 10868 return copy2; 10869 }, 10870 {} 10871 ); 10872 } 10873 for (const key in a) { 10874 if (a[key] !== void 0 && b[key] === void 0) { 10875 attributes[key] = a[key]; 10876 } 10877 } 10878 return Object.keys(attributes).length > 0 ? attributes : void 0; 10879 } 10880 AttributeMap2.compose = compose; 10881 function diff(a = {}, b = {}) { 10882 if (typeof a !== "object") { 10883 a = {}; 10884 } 10885 if (typeof b !== "object") { 10886 b = {}; 10887 } 10888 const attributes = Object.keys(a).concat(Object.keys(b)).reduce((attrs, key) => { 10889 if (!(0, import_es6.default)(a[key], b[key])) { 10890 attrs[key] = b[key] === void 0 ? null : b[key]; 10891 } 10892 return attrs; 10893 }, {}); 10894 return Object.keys(attributes).length > 0 ? attributes : void 0; 10895 } 10896 AttributeMap2.diff = diff; 10897 function invert(attr = {}, base = {}) { 10898 attr = attr || {}; 10899 const baseInverted = Object.keys(base).reduce( 10900 (memo, key) => { 10901 if (base[key] !== attr[key] && attr[key] !== void 0) { 10902 memo[key] = base[key]; 10903 } 10904 return memo; 10905 }, 10906 {} 10907 ); 10908 return Object.keys(attr).reduce((memo, key) => { 10909 if (attr[key] !== base[key] && base[key] === void 0) { 10910 memo[key] = null; 10911 } 10912 return memo; 10913 }, baseInverted); 10914 } 10915 AttributeMap2.invert = invert; 10916 function transform(a, b, priority = false) { 10917 if (typeof a !== "object") { 10918 return b; 10919 } 10920 if (typeof b !== "object") { 10921 return void 0; 10922 } 10923 if (!priority) { 10924 return b; 10925 } 10926 const attributes = Object.keys(b).reduce( 10927 (attrs, key) => { 10928 if (a[key] === void 0) { 10929 attrs[key] = b[key]; 10930 } 10931 return attrs; 10932 }, 10933 {} 10934 ); 10935 return Object.keys(attributes).length > 0 ? attributes : void 0; 10936 } 10937 AttributeMap2.transform = transform; 10938 })(AttributeMap || (AttributeMap = {})); 10939 var AttributeMap_default = AttributeMap; 10940 10941 // packages/sync/build-module/quill-delta/Op.mjs 10942 var Op; 10943 ((Op2) => { 10944 function length3(op) { 10945 if (typeof op.delete === "number") { 10946 return op.delete; 10947 } else if (typeof op.retain === "number") { 10948 return op.retain; 10949 } else if (typeof op.retain === "object" && op.retain !== null) { 10950 return 1; 10951 } 10952 return typeof op.insert === "string" ? op.insert.length : 1; 10953 } 10954 Op2.length = length3; 10955 })(Op || (Op = {})); 10956 var Op_default = Op; 10957 10958 // packages/sync/build-module/quill-delta/OpIterator.mjs 10959 var Iterator = class { 10960 ops; 10961 index; 10962 offset; 10963 constructor(ops) { 10964 this.ops = ops; 10965 this.index = 0; 10966 this.offset = 0; 10967 } 10968 hasNext() { 10969 return this.peekLength() < Infinity; 10970 } 10971 next(length3) { 10972 if (!length3) { 10973 length3 = Infinity; 10974 } 10975 const nextOp = this.ops[this.index]; 10976 if (nextOp) { 10977 const offset = this.offset; 10978 const opLength = Op_default.length(nextOp); 10979 if (length3 >= opLength - offset) { 10980 length3 = opLength - offset; 10981 this.index += 1; 10982 this.offset = 0; 10983 } else { 10984 this.offset += length3; 10985 } 10986 if (typeof nextOp.delete === "number") { 10987 return { delete: length3 }; 10988 } 10989 const retOp = {}; 10990 if (nextOp.attributes) { 10991 retOp.attributes = nextOp.attributes; 10992 } 10993 if (typeof nextOp.retain === "number") { 10994 retOp.retain = length3; 10995 } else if (typeof nextOp.retain === "object" && nextOp.retain !== null) { 10996 retOp.retain = nextOp.retain; 10997 } else if (typeof nextOp.insert === "string") { 10998 retOp.insert = nextOp.insert.substr(offset, length3); 10999 } else { 11000 retOp.insert = nextOp.insert; 11001 } 11002 return retOp; 11003 } 11004 return { retain: Infinity }; 11005 } 11006 peek() { 11007 return this.ops[this.index]; 11008 } 11009 peekLength() { 11010 if (this.ops[this.index]) { 11011 return Op_default.length(this.ops[this.index]) - this.offset; 11012 } 11013 return Infinity; 11014 } 11015 peekType() { 11016 const op = this.ops[this.index]; 11017 if (op) { 11018 if (typeof op.delete === "number") { 11019 return "delete"; 11020 } else if (typeof op.retain === "number" || typeof op.retain === "object" && op.retain !== null) { 11021 return "retain"; 11022 } 11023 return "insert"; 11024 } 11025 return "retain"; 11026 } 11027 rest() { 11028 if (!this.hasNext()) { 11029 return []; 11030 } else if (this.offset === 0) { 11031 return this.ops.slice(this.index); 11032 } 11033 const offset = this.offset; 11034 const index = this.index; 11035 const next = this.next(); 11036 const rest = this.ops.slice(this.index); 11037 this.offset = offset; 11038 this.index = index; 11039 return [next].concat(rest); 11040 } 11041 }; 11042 11043 // packages/sync/build-module/quill-delta/Delta.mjs 11044 function cloneDeep2(value) { 11045 return JSON.parse(JSON.stringify(value)); 11046 } 11047 var NULL_CHARACTER = String.fromCharCode(0); 11048 var STRING_TOO_LARGE_THRESHOLD = 1e4; 11049 function normalizeChangeCounts(changes) { 11050 return changes.map((change) => ({ 11051 ...change, 11052 count: change.value.length 11053 })); 11054 } 11055 var getEmbedTypeAndData = (a, b) => { 11056 if (typeof a !== "object" || a === null) { 11057 throw new Error(`cannot retain a $typeof a}`); 11058 } 11059 if (typeof b !== "object" || b === null) { 11060 throw new Error(`cannot retain a $typeof b}`); 11061 } 11062 const embedType = Object.keys(a)[0]; 11063 if (!embedType || embedType !== Object.keys(b)[0]) { 11064 throw new Error( 11065 `embed types not matched: $embedType} != $Object.keys(b)[0]}` 11066 ); 11067 } 11068 return [embedType, a[embedType], b[embedType]]; 11069 }; 11070 var Delta = class _Delta { 11071 static Op = Op_default; 11072 static OpIterator = Iterator; 11073 static AttributeMap = AttributeMap_default; 11074 static handlers = {}; 11075 static registerEmbed(embedType, handler) { 11076 this.handlers[embedType] = handler; 11077 } 11078 static unregisterEmbed(embedType) { 11079 delete this.handlers[embedType]; 11080 } 11081 static getHandler(embedType) { 11082 const handler = this.handlers[embedType]; 11083 if (!handler) { 11084 throw new Error(`no handlers for embed type "$embedType}"`); 11085 } 11086 return handler; 11087 } 11088 ops; 11089 constructor(ops) { 11090 if (Array.isArray(ops)) { 11091 this.ops = ops; 11092 } else if (ops !== null && ops !== void 0 && Array.isArray(ops.ops)) { 11093 this.ops = ops.ops; 11094 } else { 11095 this.ops = []; 11096 } 11097 } 11098 insert(arg, attributes) { 11099 const newOp = {}; 11100 if (typeof arg === "string" && arg.length === 0) { 11101 return this; 11102 } 11103 newOp.insert = arg; 11104 if (attributes !== null && attributes !== void 0 && typeof attributes === "object" && Object.keys(attributes).length > 0) { 11105 newOp.attributes = attributes; 11106 } 11107 return this.push(newOp); 11108 } 11109 delete(length3) { 11110 if (length3 <= 0) { 11111 return this; 11112 } 11113 return this.push({ delete: length3 }); 11114 } 11115 retain(length3, attributes) { 11116 if (typeof length3 === "number" && length3 <= 0) { 11117 return this; 11118 } 11119 const newOp = { retain: length3 }; 11120 if (attributes !== null && attributes !== void 0 && typeof attributes === "object" && Object.keys(attributes).length > 0) { 11121 newOp.attributes = attributes; 11122 } 11123 return this.push(newOp); 11124 } 11125 push(newOp) { 11126 let index = this.ops.length; 11127 let lastOp = this.ops[index - 1]; 11128 newOp = cloneDeep2(newOp); 11129 if (typeof lastOp === "object") { 11130 if (typeof newOp.delete === "number" && typeof lastOp.delete === "number") { 11131 this.ops[index - 1] = { 11132 delete: lastOp.delete + newOp.delete 11133 }; 11134 return this; 11135 } 11136 if (typeof lastOp.delete === "number" && newOp.insert !== null && newOp.insert !== void 0) { 11137 index -= 1; 11138 lastOp = this.ops[index - 1]; 11139 if (typeof lastOp !== "object") { 11140 this.ops.unshift(newOp); 11141 return this; 11142 } 11143 } 11144 if ((0, import_es62.default)(newOp.attributes, lastOp.attributes)) { 11145 if (typeof newOp.insert === "string" && typeof lastOp.insert === "string") { 11146 this.ops[index - 1] = { 11147 insert: lastOp.insert + newOp.insert 11148 }; 11149 if (typeof newOp.attributes === "object") { 11150 this.ops[index - 1].attributes = newOp.attributes; 11151 } 11152 return this; 11153 } else if (typeof newOp.retain === "number" && typeof lastOp.retain === "number") { 11154 this.ops[index - 1] = { 11155 retain: lastOp.retain + newOp.retain 11156 }; 11157 if (typeof newOp.attributes === "object") { 11158 this.ops[index - 1].attributes = newOp.attributes; 11159 } 11160 return this; 11161 } 11162 } 11163 } 11164 if (index === this.ops.length) { 11165 this.ops.push(newOp); 11166 } else { 11167 this.ops.splice(index, 0, newOp); 11168 } 11169 return this; 11170 } 11171 chop() { 11172 const lastOp = this.ops[this.ops.length - 1]; 11173 if (lastOp && typeof lastOp.retain === "number" && !lastOp.attributes) { 11174 this.ops.pop(); 11175 } 11176 return this; 11177 } 11178 filter(predicate) { 11179 return this.ops.filter(predicate); 11180 } 11181 forEach(predicate) { 11182 this.ops.forEach(predicate); 11183 } 11184 map(predicate) { 11185 return this.ops.map(predicate); 11186 } 11187 partition(predicate) { 11188 const passed = []; 11189 const failed = []; 11190 this.forEach((op) => { 11191 const target = predicate(op) ? passed : failed; 11192 target.push(op); 11193 }); 11194 return [passed, failed]; 11195 } 11196 reduce(predicate, initialValue) { 11197 return this.ops.reduce(predicate, initialValue); 11198 } 11199 changeLength() { 11200 return this.reduce((length3, elem) => { 11201 if (elem.insert) { 11202 return length3 + Op_default.length(elem); 11203 } else if (elem.delete) { 11204 return length3 - elem.delete; 11205 } 11206 return length3; 11207 }, 0); 11208 } 11209 length() { 11210 return this.reduce((length3, elem) => { 11211 return length3 + Op_default.length(elem); 11212 }, 0); 11213 } 11214 slice(start = 0, end = Infinity) { 11215 const ops = []; 11216 const iter = new Iterator(this.ops); 11217 let index = 0; 11218 while (index < end && iter.hasNext()) { 11219 let nextOp; 11220 if (index < start) { 11221 nextOp = iter.next(start - index); 11222 } else { 11223 nextOp = iter.next(end - index); 11224 ops.push(nextOp); 11225 } 11226 index += Op_default.length(nextOp); 11227 } 11228 return new _Delta(ops); 11229 } 11230 compose(other) { 11231 const thisIter = new Iterator(this.ops); 11232 const otherIter = new Iterator(other.ops); 11233 const ops = []; 11234 const firstOther = otherIter.peek(); 11235 if (firstOther !== null && firstOther !== void 0 && typeof firstOther.retain === "number" && (firstOther.attributes === null || firstOther.attributes === void 0)) { 11236 let firstLeft = firstOther.retain; 11237 while (thisIter.peekType() === "insert" && thisIter.peekLength() <= firstLeft) { 11238 firstLeft -= thisIter.peekLength(); 11239 ops.push(thisIter.next()); 11240 } 11241 if (firstOther.retain - firstLeft > 0) { 11242 otherIter.next(firstOther.retain - firstLeft); 11243 } 11244 } 11245 const delta = new _Delta(ops); 11246 while (thisIter.hasNext() || otherIter.hasNext()) { 11247 if (otherIter.peekType() === "insert") { 11248 delta.push(otherIter.next()); 11249 } else if (thisIter.peekType() === "delete") { 11250 delta.push(thisIter.next()); 11251 } else { 11252 const length3 = Math.min( 11253 thisIter.peekLength(), 11254 otherIter.peekLength() 11255 ); 11256 const thisOp = thisIter.next(length3); 11257 const otherOp = otherIter.next(length3); 11258 if (otherOp.retain) { 11259 const newOp = {}; 11260 if (typeof thisOp.retain === "number") { 11261 newOp.retain = typeof otherOp.retain === "number" ? length3 : otherOp.retain; 11262 } else if (typeof otherOp.retain === "number") { 11263 if (thisOp.retain === null || thisOp.retain === void 0) { 11264 newOp.insert = thisOp.insert; 11265 } else { 11266 newOp.retain = thisOp.retain; 11267 } 11268 } else { 11269 const action = thisOp.retain === null || thisOp.retain === void 0 ? "insert" : "retain"; 11270 const [embedType, thisData, otherData] = getEmbedTypeAndData( 11271 thisOp[action], 11272 otherOp.retain 11273 ); 11274 const handler = _Delta.getHandler(embedType); 11275 newOp[action] = { 11276 [embedType]: handler.compose( 11277 thisData, 11278 otherData, 11279 action === "retain" 11280 ) 11281 }; 11282 } 11283 const attributes = AttributeMap_default.compose( 11284 thisOp.attributes, 11285 otherOp.attributes, 11286 typeof thisOp.retain === "number" 11287 ); 11288 if (attributes) { 11289 newOp.attributes = attributes; 11290 } 11291 delta.push(newOp); 11292 if (!otherIter.hasNext() && (0, import_es62.default)(delta.ops[delta.ops.length - 1], newOp)) { 11293 const rest = new _Delta(thisIter.rest()); 11294 return delta.concat(rest).chop(); 11295 } 11296 } else if (typeof otherOp.delete === "number" && (typeof thisOp.retain === "number" || typeof thisOp.retain === "object" && thisOp.retain !== null)) { 11297 delta.push(otherOp); 11298 } 11299 } 11300 } 11301 return delta.chop(); 11302 } 11303 concat(other) { 11304 const delta = new _Delta(this.ops.slice()); 11305 if (other.ops.length > 0) { 11306 delta.push(other.ops[0]); 11307 delta.ops = delta.ops.concat(other.ops.slice(1)); 11308 } 11309 return delta; 11310 } 11311 diff(other) { 11312 if (this.ops === other.ops) { 11313 return new _Delta(); 11314 } 11315 const strings = this.deltasToStrings(other); 11316 const diffResult = normalizeChangeCounts( 11317 diffChars(strings[0], strings[1]) 11318 ); 11319 const thisIter = new Iterator(this.ops); 11320 const otherIter = new Iterator(other.ops); 11321 const retDelta = this.convertChangesToDelta( 11322 diffResult, 11323 thisIter, 11324 otherIter 11325 ); 11326 return retDelta.chop(); 11327 } 11328 eachLine(predicate, newline = "\n") { 11329 const iter = new Iterator(this.ops); 11330 let line = new _Delta(); 11331 let i = 0; 11332 while (iter.hasNext()) { 11333 if (iter.peekType() !== "insert") { 11334 return; 11335 } 11336 const thisOp = iter.peek(); 11337 const start = Op_default.length(thisOp) - iter.peekLength(); 11338 const index = typeof thisOp.insert === "string" ? thisOp.insert.indexOf(newline, start) - start : -1; 11339 if (index < 0) { 11340 line.push(iter.next()); 11341 } else if (index > 0) { 11342 line.push(iter.next(index)); 11343 } else { 11344 if (predicate(line, iter.next(1).attributes || {}, i) === false) { 11345 return; 11346 } 11347 i += 1; 11348 line = new _Delta(); 11349 } 11350 } 11351 if (line.length() > 0) { 11352 predicate(line, {}, i); 11353 } 11354 } 11355 invert(base) { 11356 const inverted = new _Delta(); 11357 this.reduce((baseIndex, op) => { 11358 if (op.insert) { 11359 inverted.delete(Op_default.length(op)); 11360 } else if (typeof op.retain === "number" && (op.attributes === null || op.attributes === void 0)) { 11361 inverted.retain(op.retain); 11362 return baseIndex + op.retain; 11363 } else if (op.delete || typeof op.retain === "number") { 11364 const length3 = op.delete || op.retain; 11365 const slice = base.slice(baseIndex, baseIndex + length3); 11366 slice.forEach((baseOp) => { 11367 if (op.delete) { 11368 inverted.push(baseOp); 11369 } else if (op.retain && op.attributes) { 11370 inverted.retain( 11371 Op_default.length(baseOp), 11372 AttributeMap_default.invert( 11373 op.attributes, 11374 baseOp.attributes 11375 ) 11376 ); 11377 } 11378 }); 11379 return baseIndex + length3; 11380 } else if (typeof op.retain === "object" && op.retain !== null) { 11381 const slice = base.slice(baseIndex, baseIndex + 1); 11382 const baseOp = new Iterator(slice.ops).next(); 11383 const [embedType, opData, baseOpData] = getEmbedTypeAndData( 11384 op.retain, 11385 baseOp.insert 11386 ); 11387 const handler = _Delta.getHandler(embedType); 11388 inverted.retain( 11389 { [embedType]: handler.invert(opData, baseOpData) }, 11390 AttributeMap_default.invert(op.attributes, baseOp.attributes) 11391 ); 11392 return baseIndex + 1; 11393 } 11394 return baseIndex; 11395 }, 0); 11396 return inverted.chop(); 11397 } 11398 transform(arg, priority = false) { 11399 priority = !!priority; 11400 if (typeof arg === "number") { 11401 return this.transformPosition(arg, priority); 11402 } 11403 const other = arg; 11404 const thisIter = new Iterator(this.ops); 11405 const otherIter = new Iterator(other.ops); 11406 const delta = new _Delta(); 11407 while (thisIter.hasNext() || otherIter.hasNext()) { 11408 if (thisIter.peekType() === "insert" && (priority || otherIter.peekType() !== "insert")) { 11409 delta.retain(Op_default.length(thisIter.next())); 11410 } else if (otherIter.peekType() === "insert") { 11411 delta.push(otherIter.next()); 11412 } else { 11413 const length3 = Math.min( 11414 thisIter.peekLength(), 11415 otherIter.peekLength() 11416 ); 11417 const thisOp = thisIter.next(length3); 11418 const otherOp = otherIter.next(length3); 11419 if (thisOp.delete) { 11420 continue; 11421 } else if (otherOp.delete) { 11422 delta.push(otherOp); 11423 } else { 11424 const thisData = thisOp.retain; 11425 const otherData = otherOp.retain; 11426 let transformedData = typeof otherData === "object" && otherData !== null ? otherData : length3; 11427 if (typeof thisData === "object" && thisData !== null && typeof otherData === "object" && otherData !== null) { 11428 const embedType = Object.keys(thisData)[0]; 11429 if (embedType === Object.keys(otherData)[0]) { 11430 const handler = _Delta.getHandler(embedType); 11431 if (handler) { 11432 transformedData = { 11433 [embedType]: handler.transform( 11434 thisData[embedType], 11435 otherData[embedType], 11436 priority 11437 ) 11438 }; 11439 } 11440 } 11441 } 11442 delta.retain( 11443 transformedData, 11444 AttributeMap_default.transform( 11445 thisOp.attributes, 11446 otherOp.attributes, 11447 priority 11448 ) 11449 ); 11450 } 11451 } 11452 } 11453 return delta.chop(); 11454 } 11455 transformPosition(index, priority = false) { 11456 priority = !!priority; 11457 const thisIter = new Iterator(this.ops); 11458 let offset = 0; 11459 while (thisIter.hasNext() && offset <= index) { 11460 const length3 = thisIter.peekLength(); 11461 const nextType = thisIter.peekType(); 11462 thisIter.next(); 11463 if (nextType === "delete") { 11464 index -= Math.min(length3, index - offset); 11465 continue; 11466 } else if (nextType === "insert" && (offset < index || !priority)) { 11467 index += length3; 11468 } 11469 offset += length3; 11470 } 11471 return index; 11472 } 11473 /** 11474 * Given a Delta and a cursor position, do a diff and attempt to adjust 11475 * the diff to place insertions or deletions at the cursor position. 11476 * 11477 * @param other - The other Delta to diff against. 11478 * @param cursorAfterChange - The cursor position index after the change. 11479 * @return A Delta that attempts to place insertions or deletions at the cursor position. 11480 */ 11481 diffWithCursor(other, cursorAfterChange) { 11482 if (this.ops === other.ops) { 11483 return new _Delta(); 11484 } 11485 const strings = this.deltasToStrings(other); 11486 const maxStringLength = Math.max( 11487 ...strings.map((str) => str.length) 11488 ); 11489 if (maxStringLength > STRING_TOO_LARGE_THRESHOLD) { 11490 const diffResult = normalizeChangeCounts( 11491 diffLines(strings[0], strings[1]) 11492 ); 11493 const thisIterLarge = new Iterator(this.ops); 11494 const otherIterLarge = new Iterator(other.ops); 11495 return this.convertChangesToDelta( 11496 diffResult, 11497 thisIterLarge, 11498 otherIterLarge 11499 ).chop(); 11500 } else if (cursorAfterChange === null) { 11501 return this.diff(other); 11502 } 11503 let diffs = normalizeChangeCounts( 11504 diffChars(strings[0], strings[1]) 11505 ); 11506 let lastDiffPosition = 0; 11507 const adjustedDiffs = []; 11508 for (let i = 0; i < diffs.length; i++) { 11509 const diff = diffs[i]; 11510 const segmentStart = lastDiffPosition; 11511 const segmentEnd = lastDiffPosition + (diff.count ?? 0); 11512 const isCursorInSegment = cursorAfterChange > segmentStart && cursorAfterChange <= segmentEnd; 11513 const isUnchangedSegment = !diff.added && !diff.removed; 11514 const isRemovalSegment = diff.removed && !diff.added; 11515 const nextDiff = diffs[i + 1]; 11516 const isNextDiffAnInsert = nextDiff && nextDiff.added && !nextDiff.removed; 11517 if (isUnchangedSegment && isCursorInSegment && isNextDiffAnInsert) { 11518 const movedSegments = this.tryMoveInsertionToCursor( 11519 diff, 11520 nextDiff, 11521 cursorAfterChange, 11522 segmentStart 11523 ); 11524 if (movedSegments) { 11525 adjustedDiffs.push(...movedSegments); 11526 i++; 11527 lastDiffPosition = segmentEnd; 11528 continue; 11529 } 11530 } 11531 if (isRemovalSegment) { 11532 const movedSegments = this.tryMoveDeletionToCursor( 11533 diff, 11534 adjustedDiffs, 11535 cursorAfterChange, 11536 lastDiffPosition 11537 ); 11538 if (movedSegments) { 11539 adjustedDiffs.pop(); 11540 adjustedDiffs.push(...movedSegments); 11541 lastDiffPosition += diff.count ?? 0; 11542 continue; 11543 } 11544 } 11545 adjustedDiffs.push(diff); 11546 if (!diff.added) { 11547 lastDiffPosition += diff.count ?? 0; 11548 } 11549 } 11550 diffs = adjustedDiffs; 11551 const thisIter = new Iterator(this.ops); 11552 const otherIter = new Iterator(other.ops); 11553 const retDelta = this.convertChangesToDelta( 11554 diffs, 11555 thisIter, 11556 otherIter 11557 ); 11558 return retDelta.chop(); 11559 } 11560 /** 11561 * Try to move an insertion operation from after an unchanged segment to the cursor position within it. 11562 * This is a "look-ahead" strategy. 11563 * 11564 * @param diff - The current unchanged diff segment. 11565 * @param nextDiff - The next diff segment (expected to be an insertion). 11566 * @param cursorAfterChange - The cursor position after the change. 11567 * @param segmentStart - The start position of the current segment. 11568 * @return An array of adjusted diff segments if the insertion was successfully moved, null otherwise. 11569 */ 11570 tryMoveInsertionToCursor(diff, nextDiff, cursorAfterChange, segmentStart) { 11571 const nextDiffInsert = nextDiff.value; 11572 const insertLength = nextDiffInsert.length; 11573 const insertOffset = cursorAfterChange - segmentStart - insertLength; 11574 const textAtCursor = diff.value.substring( 11575 insertOffset, 11576 insertOffset + nextDiffInsert.length 11577 ); 11578 const isInsertMoveable = textAtCursor === nextDiffInsert; 11579 if (!isInsertMoveable) { 11580 return null; 11581 } 11582 const beforeCursor = diff.value.substring(0, insertOffset); 11583 const afterCursor = diff.value.substring(insertOffset); 11584 const result = []; 11585 if (beforeCursor.length > 0) { 11586 result.push({ 11587 value: beforeCursor, 11588 count: beforeCursor.length, 11589 added: false, 11590 removed: false 11591 }); 11592 } 11593 result.push(nextDiff); 11594 if (afterCursor.length > 0) { 11595 result.push({ 11596 value: afterCursor, 11597 count: afterCursor.length, 11598 added: false, 11599 removed: false 11600 }); 11601 } 11602 return result; 11603 } 11604 /** 11605 * Try to move a deletion operation to the cursor position by looking back at the previous unchanged segment. 11606 * This is a "look-back" strategy. 11607 * 11608 * @param diff - The current deletion diff segment. 11609 * @param adjustedDiffs - The array of previously processed diff segments. 11610 * @param cursorAfterChange - The cursor position after the change. 11611 * @param lastDiffPosition - The position in the document up to (but not including) the current diff. 11612 * @return An array of adjusted diff segments if the deletion was successfully moved, null otherwise. 11613 */ 11614 tryMoveDeletionToCursor(diff, adjustedDiffs, cursorAfterChange, lastDiffPosition) { 11615 const prevDiff = adjustedDiffs[adjustedDiffs.length - 1]; 11616 if (!prevDiff || prevDiff.added || prevDiff.removed) { 11617 return null; 11618 } 11619 const prevSegmentStart = lastDiffPosition - (prevDiff.count ?? 0); 11620 const prevSegmentEnd = lastDiffPosition; 11621 if (cursorAfterChange < prevSegmentStart || cursorAfterChange >= prevSegmentEnd) { 11622 return null; 11623 } 11624 const deletedChars = diff.value; 11625 const deleteOffset = cursorAfterChange - prevSegmentStart; 11626 const textAtCursor = prevDiff.value.substring( 11627 deleteOffset, 11628 deleteOffset + deletedChars.length 11629 ); 11630 const canBePlacedHere = textAtCursor === deletedChars; 11631 if (!canBePlacedHere) { 11632 return null; 11633 } 11634 const beforeCursor = prevDiff.value.substring(0, deleteOffset); 11635 const atAndAfterCursor = prevDiff.value.substring(deleteOffset); 11636 const deletionLength = diff.count ?? 0; 11637 const afterDeletion = atAndAfterCursor.substring(deletionLength); 11638 const result = []; 11639 if (beforeCursor.length > 0) { 11640 result.push({ 11641 value: beforeCursor, 11642 count: beforeCursor.length, 11643 added: false, 11644 removed: false 11645 }); 11646 } 11647 result.push(diff); 11648 if (afterDeletion.length > 0) { 11649 result.push({ 11650 value: afterDeletion, 11651 count: afterDeletion.length, 11652 added: false, 11653 removed: false 11654 }); 11655 } 11656 return result; 11657 } 11658 /** 11659 * Convert two Deltas to string representations for diffing. 11660 * 11661 * @param other - The other Delta to convert. 11662 * @return A tuple of [thisString, otherString]. 11663 */ 11664 deltasToStrings(other) { 11665 return [this, other].map((delta) => { 11666 return delta.map((op) => { 11667 if (op.insert !== null || op.insert !== void 0) { 11668 return typeof op.insert === "string" ? op.insert : NULL_CHARACTER; 11669 } 11670 const prep = delta === other ? "on" : "with"; 11671 throw new Error( 11672 "diff() called " + prep + " non-document" 11673 ); 11674 }).join(""); 11675 }); 11676 } 11677 /** 11678 * Process diff changes and convert them to Delta operations. 11679 * 11680 * @param changes - The array of changes from the diff algorithm. 11681 * @param thisIter - Iterator for this Delta's operations. 11682 * @param otherIter - Iterator for the other Delta's operations. 11683 * @return A Delta containing the processed diff operations. 11684 */ 11685 convertChangesToDelta(changes, thisIter, otherIter) { 11686 const retDelta = new _Delta(); 11687 changes.forEach((component) => { 11688 let length3 = component.count ?? 0; 11689 while (length3 > 0) { 11690 let opLength = 0; 11691 if (component.added) { 11692 opLength = Math.min(otherIter.peekLength(), length3); 11693 retDelta.push(otherIter.next(opLength)); 11694 } else if (component.removed) { 11695 opLength = Math.min(length3, thisIter.peekLength()); 11696 thisIter.next(opLength); 11697 retDelta.delete(opLength); 11698 } else { 11699 opLength = Math.min( 11700 thisIter.peekLength(), 11701 otherIter.peekLength(), 11702 length3 11703 ); 11704 const thisOp = thisIter.next(opLength); 11705 const otherOp = otherIter.next(opLength); 11706 if ((0, import_es62.default)(thisOp.insert, otherOp.insert)) { 11707 retDelta.retain( 11708 opLength, 11709 AttributeMap_default.diff( 11710 thisOp.attributes, 11711 otherOp.attributes 11712 ) 11713 ); 11714 } else { 11715 retDelta.push(otherOp).delete(opLength); 11716 } 11717 } 11718 length3 -= opLength; 11719 } 11720 }); 11721 return retDelta; 11722 } 11723 }; 11724 var Delta_default = Delta; 11725 11726 // packages/sync/build-module/private-apis.mjs 11727 var privateApis = {}; 11728 lock(privateApis, { 11729 ConnectionErrorCode, 11730 createSyncManager, 11731 Delta: Delta_default, 11732 CRDT_DOC_META_PERSISTENCE_KEY, 11733 CRDT_RECORD_MAP_KEY, 11734 LOCAL_EDITOR_ORIGIN, 11735 LOCAL_UNDO_IGNORED_ORIGIN, 11736 retrySyncConnection: () => pollingManager.retryNow() 11737 }); 11738 11739 // packages/sync/build-module/index.mjs 11740 var YJS_VERSION = "13"; 11741 return __toCommonJS(index_exports); 11742 })();
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sat Jun 13 09:38:55 2026 | Cross-referenced by PHPXref |