@liveblocks/core 3.19.3 → 3.19.4-test1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -6,7 +6,7 @@ var __export = (target, all) => {
6
6
 
7
7
  // src/version.ts
8
8
  var PKG_NAME = "@liveblocks/core";
9
- var PKG_VERSION = "3.19.3";
9
+ var PKG_VERSION = "3.19.4-test1";
10
10
  var PKG_FORMAT = "cjs";
11
11
 
12
12
  // src/dupe-detection.ts
@@ -2715,7 +2715,6 @@ var HttpClient = class {
2715
2715
  };
2716
2716
 
2717
2717
  // src/lib/fsm.ts
2718
- var IGNORE = /* @__PURE__ */ Symbol("fsm.ignore");
2719
2718
  function distance(state1, state2) {
2720
2719
  if (state1 === state2) {
2721
2720
  return [0, 0];
@@ -2888,7 +2887,7 @@ var FSM = class {
2888
2887
  this.#eventHub = {
2889
2888
  didReceiveEvent: makeEventSource(),
2890
2889
  willTransition: makeEventSource(),
2891
- didIgnoreUnexpectedEvent: makeEventSource(),
2890
+ didIgnoreEvent: makeEventSource(),
2892
2891
  willExitState: makeEventSource(),
2893
2892
  didEnterState: makeEventSource(),
2894
2893
  didExitState: makeEventSource()
@@ -2896,7 +2895,7 @@ var FSM = class {
2896
2895
  this.events = {
2897
2896
  didReceiveEvent: this.#eventHub.didReceiveEvent.observable,
2898
2897
  willTransition: this.#eventHub.willTransition.observable,
2899
- didIgnoreUnexpectedEvent: this.#eventHub.didIgnoreUnexpectedEvent.observable,
2898
+ didIgnoreEvent: this.#eventHub.didIgnoreEvent.observable,
2900
2899
  willExitState: this.#eventHub.willExitState.observable,
2901
2900
  didEnterState: this.#eventHub.didEnterState.observable,
2902
2901
  didExitState: this.#eventHub.didExitState.observable
@@ -3019,14 +3018,9 @@ var FSM = class {
3019
3018
  * `context` params to conditionally decide which next state to transition
3020
3019
  * to.
3021
3020
  *
3022
- * If you don't define a target for a transition, the event is treated
3023
- * as unhandled in this state: `didIgnoreUnexpectedEvent` fires and the
3024
- * state does not change.
3025
- *
3026
- * To declare an event as an intentional silent no-op in this state, use
3027
- * the {@link IGNORE} sentinel — either statically (`{ EVENT: IGNORE }`)
3028
- * or as a return value from a target function. IGNORE'd events do not
3029
- * fire `didIgnoreUnexpectedEvent`.
3021
+ * If you set it to `null`, then the transition will be explicitly forbidden
3022
+ * and throw an error. If you don't define a target for a transition, then
3023
+ * such events will get ignored.
3030
3024
  */
3031
3025
  addTransitions(nameOrPattern, mapping) {
3032
3026
  if (this.#runningState !== 0 /* NOT_STARTED_YET */) {
@@ -3046,12 +3040,7 @@ var FSM = class {
3046
3040
  }
3047
3041
  const target = target_;
3048
3042
  this.#knownEventTypes.add(type);
3049
- if (target === void 0) {
3050
- continue;
3051
- }
3052
- if (target === IGNORE) {
3053
- map.set(type, IGNORE);
3054
- } else {
3043
+ if (target !== void 0) {
3055
3044
  const targetFn = typeof target === "function" ? target : () => target;
3056
3045
  map.set(type, targetFn);
3057
3046
  }
@@ -3150,14 +3139,12 @@ var FSM = class {
3150
3139
  if (this.#runningState === 2 /* STOPPED */) {
3151
3140
  return;
3152
3141
  }
3153
- const entry = this.#getTargetFn(event.type);
3154
- if (entry === IGNORE) {
3155
- return;
3156
- }
3157
- if (entry !== void 0) {
3158
- return this.#transition(event, entry);
3142
+ const targetFn = this.#getTargetFn(event.type);
3143
+ if (targetFn !== void 0) {
3144
+ return this.#transition(event, targetFn);
3145
+ } else {
3146
+ this.#eventHub.didIgnoreEvent.notify(event);
3159
3147
  }
3160
- this.#eventHub.didIgnoreUnexpectedEvent.notify(event);
3161
3148
  }
3162
3149
  #transition(event, target) {
3163
3150
  this.#eventHub.didReceiveEvent.notify(event);
@@ -3166,7 +3153,8 @@ var FSM = class {
3166
3153
  const nextTarget = targetFn(event, this.#currentContext.current);
3167
3154
  let nextState;
3168
3155
  let effects = void 0;
3169
- if (nextTarget === IGNORE) {
3156
+ if (nextTarget === null) {
3157
+ this.#eventHub.didIgnoreEvent.notify(event);
3170
3158
  return;
3171
3159
  }
3172
3160
  if (typeof nextTarget === "string") {
@@ -3385,8 +3373,8 @@ function enableTracing(machine) {
3385
3373
  machine.events.didExitState.subscribe(
3386
3374
  ({ state, durationMs }) => log2(`Exited ${state} after ${durationMs.toFixed(0)}ms`)
3387
3375
  ),
3388
- machine.events.didIgnoreUnexpectedEvent.subscribe(
3389
- (e) => log2("Ignored unexpected event", e.type, e, "(no transition declared)")
3376
+ machine.events.didIgnoreEvent.subscribe(
3377
+ (e) => log2("Ignored event", e.type, e, "(current state won't handle it)")
3390
3378
  )
3391
3379
  ];
3392
3380
  return () => {
@@ -3498,12 +3486,7 @@ function createConnectionStateMachine(delegates, options) {
3498
3486
  );
3499
3487
  const onSocketError = (event) => machine.send({ type: "EXPLICIT_SOCKET_ERROR", event });
3500
3488
  const onSocketClose = (event) => machine.send({ type: "EXPLICIT_SOCKET_CLOSE", event });
3501
- const onSocketMessage = (event) => {
3502
- machine.send({ type: "ALIVE" });
3503
- if (event.data !== "pong") {
3504
- onMessage.notify(event);
3505
- }
3506
- };
3489
+ const onSocketMessage = (event) => event.data === "pong" ? machine.send({ type: "PONG" }) : onMessage.notify(event);
3507
3490
  function teardownSocket(socket) {
3508
3491
  if (socket) {
3509
3492
  socket.removeEventListener("error", onSocketError);
@@ -3673,13 +3656,7 @@ function createConnectionStateMachine(delegates, options) {
3673
3656
  effect: [increaseBackoffDelay, logPrematureErrorOrCloseEvent(err)]
3674
3657
  };
3675
3658
  }
3676
- ).addTransitions("@connecting.busy", {
3677
- // The socket message listener is attached during @connecting.busy (see
3678
- // onEnterAsync above), so server frames (most notably the actor-id
3679
- // handshake) can fire onSocketMessage and emit a ALIVE before we
3680
- // reach @ok.*. That's fine. Heartbeat only matters in @ok.*.
3681
- ALIVE: IGNORE
3682
- });
3659
+ );
3683
3660
  const sendHeartbeat = {
3684
3661
  target: "@ok.awaiting-pong",
3685
3662
  effect: (ctx) => {
@@ -3694,8 +3671,7 @@ function createConnectionStateMachine(delegates, options) {
3694
3671
  machine.addTimedTransition("@ok.connected", HEARTBEAT_INTERVAL, maybeHeartbeat).addTransitions("@ok.connected", {
3695
3672
  NAVIGATOR_OFFLINE: maybeHeartbeat,
3696
3673
  // Don't take the browser's word for it when it says it's offline. Do a ping/pong to make sure.
3697
- WINDOW_GOT_FOCUS: sendHeartbeat,
3698
- ALIVE: IGNORE
3674
+ WINDOW_GOT_FOCUS: sendHeartbeat
3699
3675
  });
3700
3676
  machine.addTransitions("@idle.zombie", {
3701
3677
  WINDOW_GOT_FOCUS: "@connecting.backoff"
@@ -3716,7 +3692,7 @@ function createConnectionStateMachine(delegates, options) {
3716
3692
  clearTimeout(timerID);
3717
3693
  onMessage.pause();
3718
3694
  };
3719
- }).addTransitions("@ok.awaiting-pong", { ALIVE: "@ok.connected" }).addTimedTransition("@ok.awaiting-pong", PONG_TIMEOUT, {
3695
+ }).addTransitions("@ok.awaiting-pong", { PONG: "@ok.connected" }).addTimedTransition("@ok.awaiting-pong", PONG_TIMEOUT, {
3720
3696
  target: "@connecting.busy",
3721
3697
  // Log implicit connection loss and drop the current open socket
3722
3698
  effect: log(
@@ -3729,7 +3705,7 @@ function createConnectionStateMachine(delegates, options) {
3729
3705
  // not. When still OPEN, don't transition.
3730
3706
  EXPLICIT_SOCKET_ERROR: (_, context) => {
3731
3707
  if (_optionalChain([context, 'access', _48 => _48.socket, 'optionalAccess', _49 => _49.readyState]) === 1) {
3732
- return IGNORE;
3708
+ return null;
3733
3709
  }
3734
3710
  return {
3735
3711
  target: "@connecting.backoff",
@@ -5497,7 +5473,9 @@ var OpCode = Object.freeze({
5497
5473
  DELETE_CRDT: 5,
5498
5474
  DELETE_OBJECT_KEY: 6,
5499
5475
  CREATE_MAP: 7,
5500
- CREATE_REGISTER: 8
5476
+ CREATE_REGISTER: 8,
5477
+ CREATE_TEXT: 9,
5478
+ UPDATE_TEXT: 10
5501
5479
  });
5502
5480
  function isIgnoredOp(op) {
5503
5481
  return op.type === OpCode.DELETE_CRDT && op.id === "ACK";
@@ -5508,7 +5486,8 @@ var CrdtType = Object.freeze({
5508
5486
  OBJECT: 0,
5509
5487
  LIST: 1,
5510
5488
  MAP: 2,
5511
- REGISTER: 3
5489
+ REGISTER: 3,
5490
+ TEXT: 4
5512
5491
  });
5513
5492
  function isRootStorageNode(node) {
5514
5493
  return node[0] === "root";
@@ -5525,6 +5504,9 @@ function isMapStorageNode(node) {
5525
5504
  function isRegisterStorageNode(node) {
5526
5505
  return node[1].type === CrdtType.REGISTER;
5527
5506
  }
5507
+ function isTextStorageNode(node) {
5508
+ return node[1].type === CrdtType.TEXT;
5509
+ }
5528
5510
  function isCompactRootNode(node) {
5529
5511
  return node[0] === "root";
5530
5512
  }
@@ -5547,6 +5529,9 @@ function* compactNodesToNodeStream(compactNodes) {
5547
5529
  case CrdtType.REGISTER:
5548
5530
  yield [cnode[0], { type: CrdtType.REGISTER, parentId: cnode[2], parentKey: cnode[3], data: cnode[4] }];
5549
5531
  break;
5532
+ case CrdtType.TEXT:
5533
+ yield [cnode[0], { type: CrdtType.TEXT, parentId: cnode[2], parentKey: cnode[3], data: cnode[4], version: cnode[5] }];
5534
+ break;
5550
5535
  default:
5551
5536
  }
5552
5537
  }
@@ -5575,6 +5560,17 @@ function* nodeStreamToCompactNodes(nodes) {
5575
5560
  const id = node[0];
5576
5561
  const crdt = node[1];
5577
5562
  yield [id, CrdtType.REGISTER, crdt.parentId, crdt.parentKey, crdt.data];
5563
+ } else if (isTextStorageNode(node)) {
5564
+ const id = node[0];
5565
+ const crdt = node[1];
5566
+ yield [
5567
+ id,
5568
+ CrdtType.TEXT,
5569
+ crdt.parentId,
5570
+ crdt.parentKey,
5571
+ crdt.data,
5572
+ crdt.version
5573
+ ];
5578
5574
  } else {
5579
5575
  }
5580
5576
  }
@@ -8231,6 +8227,581 @@ var LiveObject = (_class2 = class _LiveObject extends AbstractCrdt {
8231
8227
  }
8232
8228
  }, _class2.__initStatic(), _class2);
8233
8229
 
8230
+ // src/crdts/liveTextOps.ts
8231
+ function attributesEqual(left, right) {
8232
+ if (left === right) {
8233
+ return true;
8234
+ }
8235
+ if (left === void 0 || right === void 0) {
8236
+ return false;
8237
+ }
8238
+ const leftKeys = Object.keys(left);
8239
+ const rightKeys = Object.keys(right);
8240
+ if (leftKeys.length !== rightKeys.length) {
8241
+ return false;
8242
+ }
8243
+ for (const key of leftKeys) {
8244
+ if (left[key] !== right[key]) {
8245
+ return false;
8246
+ }
8247
+ }
8248
+ return true;
8249
+ }
8250
+ function cloneAttributes(attributes) {
8251
+ return attributes === void 0 ? void 0 : freeze({ ...attributes });
8252
+ }
8253
+ function normalizeSegments(segments) {
8254
+ const normalized = [];
8255
+ for (const segment of segments) {
8256
+ if (segment.text.length === 0) {
8257
+ continue;
8258
+ }
8259
+ const last = normalized.at(-1);
8260
+ const attributes = cloneAttributes(segment.attributes);
8261
+ if (last !== void 0 && attributesEqual(last.attributes, attributes)) {
8262
+ last.text += segment.text;
8263
+ } else {
8264
+ normalized.push({ text: segment.text, attributes });
8265
+ }
8266
+ }
8267
+ return normalized;
8268
+ }
8269
+ function deltaToSegments(delta) {
8270
+ return normalizeSegments(
8271
+ delta.map((item) => ({
8272
+ text: item.text,
8273
+ attributes: item.attributes
8274
+ }))
8275
+ );
8276
+ }
8277
+ function segmentsToDelta(segments) {
8278
+ return segments.map(
8279
+ (segment) => segment.attributes === void 0 ? { text: segment.text } : { text: segment.text, attributes: { ...segment.attributes } }
8280
+ );
8281
+ }
8282
+ function textLength(segments) {
8283
+ return segments.reduce((sum, segment) => sum + segment.text.length, 0);
8284
+ }
8285
+ function splitSegmentsAt(segments, index) {
8286
+ const result = [];
8287
+ let offset = 0;
8288
+ for (const segment of segments) {
8289
+ const end = offset + segment.text.length;
8290
+ if (index > offset && index < end) {
8291
+ const before2 = segment.text.slice(0, index - offset);
8292
+ const after2 = segment.text.slice(index - offset);
8293
+ result.push({ text: before2, attributes: segment.attributes });
8294
+ result.push({ text: after2, attributes: segment.attributes });
8295
+ } else {
8296
+ result.push({ text: segment.text, attributes: segment.attributes });
8297
+ }
8298
+ offset = end;
8299
+ }
8300
+ return result;
8301
+ }
8302
+ function clipRange(index, length, contentLength) {
8303
+ const clippedIndex = Math.max(0, Math.min(index, contentLength));
8304
+ const clippedEnd = Math.max(
8305
+ clippedIndex,
8306
+ Math.min(index + length, contentLength)
8307
+ );
8308
+ return { index: clippedIndex, length: clippedEnd - clippedIndex };
8309
+ }
8310
+ function applyInsert(segments, index, text, attributes) {
8311
+ if (text.length === 0) {
8312
+ return normalizeSegments(segments);
8313
+ }
8314
+ const split = splitSegmentsAt(segments, index);
8315
+ const result = [];
8316
+ let offset = 0;
8317
+ let inserted = false;
8318
+ for (const segment of split) {
8319
+ if (!inserted && offset === index) {
8320
+ result.push({ text, attributes });
8321
+ inserted = true;
8322
+ }
8323
+ result.push(segment);
8324
+ offset += segment.text.length;
8325
+ }
8326
+ if (!inserted) {
8327
+ result.push({ text, attributes });
8328
+ }
8329
+ return normalizeSegments(result);
8330
+ }
8331
+ function extractDeletedSegments(segments, index, length) {
8332
+ const split = splitSegmentsAt(
8333
+ splitSegmentsAt(segments, index),
8334
+ index + length
8335
+ );
8336
+ const deleted = [];
8337
+ let offset = 0;
8338
+ for (const segment of split) {
8339
+ const end = offset + segment.text.length;
8340
+ if (offset >= index && end <= index + length) {
8341
+ deleted.push({
8342
+ text: segment.text,
8343
+ attributes: segment.attributes
8344
+ });
8345
+ }
8346
+ offset = end;
8347
+ }
8348
+ return normalizeSegments(deleted);
8349
+ }
8350
+ function applyDelete(segments, index, length) {
8351
+ const deletedSegments = extractDeletedSegments(segments, index, length);
8352
+ const split = splitSegmentsAt(
8353
+ splitSegmentsAt(segments, index),
8354
+ index + length
8355
+ );
8356
+ const result = [];
8357
+ let offset = 0;
8358
+ let deletedText = "";
8359
+ for (const segment of split) {
8360
+ const end = offset + segment.text.length;
8361
+ if (offset >= index && end <= index + length) {
8362
+ deletedText += segment.text;
8363
+ } else {
8364
+ result.push(segment);
8365
+ }
8366
+ offset = end;
8367
+ }
8368
+ return {
8369
+ segments: normalizeSegments(result),
8370
+ deletedText,
8371
+ deletedSegments
8372
+ };
8373
+ }
8374
+ function applyFormat(segments, index, length, attributes) {
8375
+ const split = splitSegmentsAt(
8376
+ splitSegmentsAt(segments, index),
8377
+ index + length
8378
+ );
8379
+ const result = [];
8380
+ let offset = 0;
8381
+ for (const segment of split) {
8382
+ const end = offset + segment.text.length;
8383
+ if (offset >= index && end <= index + length) {
8384
+ const nextAttributes = {
8385
+ ..._nullishCoalesce(segment.attributes, () => ( {}))
8386
+ };
8387
+ for (const [key, value] of Object.entries(attributes)) {
8388
+ if (value === null) {
8389
+ delete nextAttributes[key];
8390
+ } else {
8391
+ nextAttributes[key] = value;
8392
+ }
8393
+ }
8394
+ result.push({
8395
+ text: segment.text,
8396
+ attributes: Object.keys(nextAttributes).length === 0 ? void 0 : freeze(nextAttributes)
8397
+ });
8398
+ } else {
8399
+ result.push(segment);
8400
+ }
8401
+ offset = end;
8402
+ }
8403
+ return normalizeSegments(result);
8404
+ }
8405
+ function formatReverseOperations(segments, index, length, patch) {
8406
+ const split = splitSegmentsAt(
8407
+ splitSegmentsAt(segments, index),
8408
+ index + length
8409
+ );
8410
+ const result = [];
8411
+ let offset = 0;
8412
+ for (const segment of split) {
8413
+ const end = offset + segment.text.length;
8414
+ if (offset >= index && end <= index + length) {
8415
+ const attributes = {};
8416
+ for (const key of Object.keys(patch)) {
8417
+ attributes[key] = _nullishCoalesce(_optionalChain([segment, 'access', _202 => _202.attributes, 'optionalAccess', _203 => _203[key]]), () => ( null));
8418
+ }
8419
+ result.push({
8420
+ type: "format",
8421
+ index: offset,
8422
+ length: segment.text.length,
8423
+ attributes
8424
+ });
8425
+ }
8426
+ offset = end;
8427
+ }
8428
+ return result;
8429
+ }
8430
+ function mapIndexThroughOperation(index, op) {
8431
+ if (op.type === "insert") {
8432
+ return op.index <= index ? index + op.text.length : index;
8433
+ } else if (op.type === "delete") {
8434
+ if (op.index >= index) {
8435
+ return index;
8436
+ }
8437
+ return Math.max(op.index, index - op.length);
8438
+ } else {
8439
+ return index;
8440
+ }
8441
+ }
8442
+ function mapTextIndexThroughOperations(index, ops) {
8443
+ let mapped = index;
8444
+ for (const op of ops) {
8445
+ mapped = mapIndexThroughOperation(mapped, op);
8446
+ }
8447
+ return mapped;
8448
+ }
8449
+ function rebaseTextOperations(ops, acceptedOps) {
8450
+ return ops.map((op) => {
8451
+ if (op.type === "insert") {
8452
+ return {
8453
+ ...op,
8454
+ index: mapTextIndexThroughOperations(op.index, acceptedOps)
8455
+ };
8456
+ } else if (op.type === "delete" || op.type === "format") {
8457
+ const start = mapTextIndexThroughOperations(op.index, acceptedOps);
8458
+ const end = mapTextIndexThroughOperations(
8459
+ op.index + op.length,
8460
+ acceptedOps
8461
+ );
8462
+ return { ...op, index: start, length: Math.max(0, end - start) };
8463
+ } else {
8464
+ return op;
8465
+ }
8466
+ });
8467
+ }
8468
+ function applyTextOperationsToSegments(segments, ops) {
8469
+ let next = [...segments];
8470
+ for (const op of ops) {
8471
+ if (op.type === "insert") {
8472
+ const index = Math.max(0, Math.min(op.index, textLength(next)));
8473
+ next = applyInsert(next, index, op.text, op.attributes);
8474
+ } else if (op.type === "delete") {
8475
+ const index = Math.max(0, Math.min(op.index, textLength(next)));
8476
+ const clipped = clipRange(index, op.length, textLength(next));
8477
+ next = applyDelete(next, clipped.index, clipped.length).segments;
8478
+ } else {
8479
+ const index = Math.max(0, Math.min(op.index, textLength(next)));
8480
+ const clipped = clipRange(index, op.length, textLength(next));
8481
+ next = applyFormat(next, clipped.index, clipped.length, op.attributes);
8482
+ }
8483
+ }
8484
+ return next;
8485
+ }
8486
+ function applyLiveTextOperations(delta, ops) {
8487
+ return segmentsToDelta(applyTextOperationsToSegments(deltaToSegments(delta), ops));
8488
+ }
8489
+ function invertTextOperations(segments, ops) {
8490
+ let shadow = [...segments];
8491
+ const reverse = [];
8492
+ for (const op of ops) {
8493
+ if (op.type === "insert") {
8494
+ shadow = applyInsert(shadow, op.index, op.text, op.attributes);
8495
+ reverse.unshift({
8496
+ type: "delete",
8497
+ index: op.index,
8498
+ length: op.text.length
8499
+ });
8500
+ } else if (op.type === "delete") {
8501
+ const deletedSegments = extractDeletedSegments(
8502
+ shadow,
8503
+ op.index,
8504
+ op.length
8505
+ );
8506
+ shadow = applyDelete(shadow, op.index, op.length).segments;
8507
+ const inserts = [];
8508
+ let insertIndex = op.index;
8509
+ for (const segment of deletedSegments) {
8510
+ inserts.push({
8511
+ type: "insert",
8512
+ index: insertIndex,
8513
+ text: segment.text,
8514
+ attributes: segment.attributes
8515
+ });
8516
+ insertIndex += segment.text.length;
8517
+ }
8518
+ for (let index = inserts.length - 1; index >= 0; index--) {
8519
+ reverse.unshift(inserts[index]);
8520
+ }
8521
+ } else {
8522
+ const inverse = formatReverseOperations(
8523
+ shadow,
8524
+ op.index,
8525
+ op.length,
8526
+ op.attributes
8527
+ );
8528
+ shadow = applyFormat(shadow, op.index, op.length, op.attributes);
8529
+ reverse.unshift(...inverse.reverse());
8530
+ }
8531
+ }
8532
+ return reverse;
8533
+ }
8534
+
8535
+ // src/crdts/LiveText.ts
8536
+ var LiveText = class _LiveText extends AbstractCrdt {
8537
+ #segments;
8538
+ #version;
8539
+ #pendingOps;
8540
+ constructor(textOrDelta = "", version = 0) {
8541
+ super();
8542
+ this.#segments = typeof textOrDelta === "string" ? textOrDelta.length === 0 ? [] : [{ text: textOrDelta }] : deltaToSegments(textOrDelta);
8543
+ this.#version = version;
8544
+ this.#pendingOps = /* @__PURE__ */ new Map();
8545
+ }
8546
+ get version() {
8547
+ return this.#version;
8548
+ }
8549
+ get length() {
8550
+ return this.toString().length;
8551
+ }
8552
+ /** @internal */
8553
+ static _deserialize([id, item], _parentToChildren, pool) {
8554
+ const text = new _LiveText(item.data, item.version);
8555
+ text._attach(id, pool);
8556
+ return text;
8557
+ }
8558
+ /** @internal */
8559
+ _toOps(parentId, parentKey) {
8560
+ if (this._id === void 0) {
8561
+ throw new Error("Cannot serialize LiveText if it is not attached");
8562
+ }
8563
+ return [
8564
+ {
8565
+ type: OpCode.CREATE_TEXT,
8566
+ id: this._id,
8567
+ parentId,
8568
+ parentKey,
8569
+ data: this.toDelta(),
8570
+ version: this.#version
8571
+ }
8572
+ ];
8573
+ }
8574
+ /** @internal */
8575
+ _serialize() {
8576
+ if (this.parent.type !== "HasParent") {
8577
+ throw new Error("Cannot serialize LiveText if parent is missing");
8578
+ }
8579
+ return {
8580
+ type: CrdtType.TEXT,
8581
+ parentId: nn(this.parent.node._id, "Parent node expected to have ID"),
8582
+ parentKey: this.parent.key,
8583
+ data: this.toDelta(),
8584
+ version: this.#version
8585
+ };
8586
+ }
8587
+ /** @internal */
8588
+ _attachChild(_op) {
8589
+ throw new Error("LiveText cannot contain child nodes");
8590
+ }
8591
+ /** @internal */
8592
+ _detachChild(_crdt) {
8593
+ throw new Error("LiveText cannot contain child nodes");
8594
+ }
8595
+ /** @internal */
8596
+ _apply(op, isLocal) {
8597
+ if (op.type !== OpCode.UPDATE_TEXT) {
8598
+ return super._apply(op, isLocal);
8599
+ }
8600
+ if (isLocal) {
8601
+ this.#pendingOps.set(nn(op.opId), op.ops);
8602
+ return this.#applyOperations(op.ops, _nullishCoalesce(op.version, () => ( this.#version)));
8603
+ }
8604
+ if (op.opId !== void 0) {
8605
+ const pending2 = this.#pendingOps.get(op.opId);
8606
+ this.#pendingOps.delete(op.opId);
8607
+ const otherPending = Array.from(this.#pendingOps.values()).flat();
8608
+ if (pending2 !== void 0 && otherPending.length > 0) {
8609
+ this.#segments = applyTextOperationsToSegments(
8610
+ this.#segments,
8611
+ invertTextOperations(this.#segments, pending2)
8612
+ );
8613
+ const ops2 = rebaseTextOperations(op.ops, otherPending);
8614
+ return this.#applyOperations(
8615
+ ops2,
8616
+ _nullishCoalesce(op.version, () => ( Math.max(this.#version, op.baseVersion + 1)))
8617
+ );
8618
+ }
8619
+ this.#version = _nullishCoalesce(op.version, () => ( Math.max(this.#version, op.baseVersion + 1)));
8620
+ return { modified: false };
8621
+ }
8622
+ const pending = Array.from(this.#pendingOps.values()).flat();
8623
+ const ops = pending.length > 0 ? rebaseTextOperations(op.ops, pending) : op.ops;
8624
+ return this.#applyOperations(ops, _nullishCoalesce(op.version, () => ( this.#version + 1)));
8625
+ }
8626
+ insert(index, text, attributes) {
8627
+ const clippedIndex = Math.max(0, Math.min(index, this.length));
8628
+ this.#dispatch([{ type: "insert", index: clippedIndex, text, attributes }]);
8629
+ }
8630
+ delete(index, length) {
8631
+ const clipped = clipRange(index, length, this.length);
8632
+ if (clipped.length === 0) {
8633
+ return;
8634
+ }
8635
+ this.#dispatch([
8636
+ { type: "delete", index: clipped.index, length: clipped.length }
8637
+ ]);
8638
+ }
8639
+ replace(index, length, text, attributes) {
8640
+ const clipped = clipRange(index, length, this.length);
8641
+ const ops = [];
8642
+ if (clipped.length > 0) {
8643
+ ops.push({
8644
+ type: "delete",
8645
+ index: clipped.index,
8646
+ length: clipped.length
8647
+ });
8648
+ }
8649
+ if (text.length > 0) {
8650
+ ops.push({ type: "insert", index: clipped.index, text, attributes });
8651
+ }
8652
+ this.#dispatch(ops);
8653
+ }
8654
+ format(index, length, attributes) {
8655
+ const clipped = clipRange(index, length, this.length);
8656
+ if (clipped.length === 0) {
8657
+ return;
8658
+ }
8659
+ this.#dispatch([
8660
+ {
8661
+ type: "format",
8662
+ index: clipped.index,
8663
+ length: clipped.length,
8664
+ attributes
8665
+ }
8666
+ ]);
8667
+ }
8668
+ #dispatch(ops) {
8669
+ if (ops.length === 0) {
8670
+ return;
8671
+ }
8672
+ _optionalChain([this, 'access', _204 => _204._pool, 'optionalAccess', _205 => _205.assertStorageIsWritable, 'call', _206 => _206()]);
8673
+ const baseVersion = this.#version;
8674
+ const reverse = this._pool !== void 0 && this._id !== void 0 ? this.#invertOperations(ops) : [];
8675
+ const changes = this.#applyOperationsLocally(ops);
8676
+ if (this._pool !== void 0 && this._id !== void 0) {
8677
+ const opId = this._pool.generateOpId();
8678
+ this.#pendingOps.set(opId, ops);
8679
+ this._pool.dispatch(
8680
+ [
8681
+ {
8682
+ type: OpCode.UPDATE_TEXT,
8683
+ id: this._id,
8684
+ opId,
8685
+ baseVersion,
8686
+ ops: [...ops]
8687
+ }
8688
+ ],
8689
+ reverse,
8690
+ /* @__PURE__ */ new Map([
8691
+ [
8692
+ this._id,
8693
+ {
8694
+ type: "LiveText",
8695
+ node: this,
8696
+ version: this.#version,
8697
+ updates: changes
8698
+ }
8699
+ ]
8700
+ ])
8701
+ );
8702
+ }
8703
+ }
8704
+ #applyOperations(ops, version) {
8705
+ const reverse = this.#invertOperations(ops);
8706
+ const changes = this.#applyOperationsLocally(ops);
8707
+ this.#version = Math.max(this.#version, version);
8708
+ return {
8709
+ reverse,
8710
+ modified: {
8711
+ type: "LiveText",
8712
+ node: this,
8713
+ version: this.#version,
8714
+ updates: changes
8715
+ }
8716
+ };
8717
+ }
8718
+ #applyOperationsLocally(ops) {
8719
+ const changes = [];
8720
+ for (const op of ops) {
8721
+ if (op.type === "insert") {
8722
+ this.#segments = applyInsert(
8723
+ this.#segments,
8724
+ op.index,
8725
+ op.text,
8726
+ op.attributes
8727
+ );
8728
+ changes.push({
8729
+ type: "insert",
8730
+ index: op.index,
8731
+ text: op.text,
8732
+ attributes: op.attributes
8733
+ });
8734
+ } else if (op.type === "delete") {
8735
+ const result = applyDelete(this.#segments, op.index, op.length);
8736
+ this.#segments = result.segments;
8737
+ changes.push({
8738
+ type: "delete",
8739
+ index: op.index,
8740
+ length: op.length,
8741
+ deletedText: result.deletedText
8742
+ });
8743
+ } else {
8744
+ this.#segments = applyFormat(
8745
+ this.#segments,
8746
+ op.index,
8747
+ op.length,
8748
+ op.attributes
8749
+ );
8750
+ changes.push({
8751
+ type: "format",
8752
+ index: op.index,
8753
+ length: op.length,
8754
+ attributes: op.attributes
8755
+ });
8756
+ }
8757
+ }
8758
+ this.invalidate();
8759
+ return changes;
8760
+ }
8761
+ #invertOperations(ops) {
8762
+ return [
8763
+ {
8764
+ type: OpCode.UPDATE_TEXT,
8765
+ id: nn(this._id),
8766
+ baseVersion: this.#version,
8767
+ ops: invertTextOperations(this.#segments, ops)
8768
+ }
8769
+ ];
8770
+ }
8771
+ toString() {
8772
+ return this.#segments.map((segment) => segment.text).join("");
8773
+ }
8774
+ toDelta() {
8775
+ return segmentsToDelta(this.#segments);
8776
+ }
8777
+ toJSON() {
8778
+ return super.toJSON();
8779
+ }
8780
+ /** @internal */
8781
+ _toJSON() {
8782
+ return this.toDelta();
8783
+ }
8784
+ /** @internal */
8785
+ _toTreeNode(key) {
8786
+ return {
8787
+ type: "LiveText",
8788
+ id: _nullishCoalesce(this._id, () => ( nanoid())),
8789
+ key,
8790
+ payload: [
8791
+ {
8792
+ type: "Json",
8793
+ id: `${_nullishCoalesce(this._id, () => ( nanoid()))}:text`,
8794
+ key: "text",
8795
+ payload: this.toString()
8796
+ }
8797
+ ]
8798
+ };
8799
+ }
8800
+ clone() {
8801
+ return new _LiveText(this.toDelta(), this.#version);
8802
+ }
8803
+ };
8804
+
8234
8805
  // src/crdts/liveblocks-helpers.ts
8235
8806
  function creationOpToLiveNode(op) {
8236
8807
  return lsonToLiveNode(creationOpToLson(op));
@@ -8245,6 +8816,8 @@ function creationOpToLson(op) {
8245
8816
  return new LiveMap();
8246
8817
  case OpCode.CREATE_LIST:
8247
8818
  return new LiveList([]);
8819
+ case OpCode.CREATE_TEXT:
8820
+ return new LiveText(op.data, op.version);
8248
8821
  default:
8249
8822
  return assertNever(op, "Unknown creation Op");
8250
8823
  }
@@ -8267,6 +8840,8 @@ function deserialize(node, parentToChildren, pool) {
8267
8840
  return LiveMap._deserialize(node, parentToChildren, pool);
8268
8841
  } else if (isRegisterStorageNode(node)) {
8269
8842
  return LiveRegister._deserialize(node, parentToChildren, pool);
8843
+ } else if (isTextStorageNode(node)) {
8844
+ return LiveText._deserialize(node, parentToChildren, pool);
8270
8845
  } else {
8271
8846
  throw new Error("Unexpected CRDT type");
8272
8847
  }
@@ -8280,12 +8855,14 @@ function deserializeToLson(node, parentToChildren, pool) {
8280
8855
  return LiveMap._deserialize(node, parentToChildren, pool);
8281
8856
  } else if (isRegisterStorageNode(node)) {
8282
8857
  return node[1].data;
8858
+ } else if (isTextStorageNode(node)) {
8859
+ return LiveText._deserialize(node, parentToChildren, pool);
8283
8860
  } else {
8284
8861
  throw new Error("Unexpected CRDT type");
8285
8862
  }
8286
8863
  }
8287
8864
  function isLiveStructure(value) {
8288
- return isLiveList(value) || isLiveMap(value) || isLiveObject(value);
8865
+ return isLiveList(value) || isLiveMap(value) || isLiveObject(value) || isLiveText(value);
8289
8866
  }
8290
8867
  function isLiveNode(value) {
8291
8868
  return isLiveStructure(value) || isLiveRegister(value);
@@ -8299,6 +8876,9 @@ function isLiveMap(value) {
8299
8876
  function isLiveObject(value) {
8300
8877
  return value instanceof LiveObject;
8301
8878
  }
8879
+ function isLiveText(value) {
8880
+ return value instanceof LiveText;
8881
+ }
8302
8882
  function isLiveRegister(value) {
8303
8883
  return value instanceof LiveRegister;
8304
8884
  }
@@ -8308,14 +8888,14 @@ function cloneLson(value) {
8308
8888
  function liveNodeToLson(obj) {
8309
8889
  if (obj instanceof LiveRegister) {
8310
8890
  return obj.data;
8311
- } else if (obj instanceof LiveList || obj instanceof LiveMap || obj instanceof LiveObject) {
8891
+ } else if (obj instanceof LiveList || obj instanceof LiveMap || obj instanceof LiveObject || obj instanceof LiveText) {
8312
8892
  return obj;
8313
8893
  } else {
8314
8894
  return assertNever(obj, "Unknown AbstractCrdt");
8315
8895
  }
8316
8896
  }
8317
8897
  function lsonToLiveNode(value) {
8318
- if (value instanceof LiveObject || value instanceof LiveMap || value instanceof LiveList) {
8898
+ if (value instanceof LiveObject || value instanceof LiveMap || value instanceof LiveList || value instanceof LiveText) {
8319
8899
  return value;
8320
8900
  } else {
8321
8901
  return new LiveRegister(value);
@@ -8340,6 +8920,38 @@ function getTreesDiffOperations(currentItems, newItems) {
8340
8920
  });
8341
8921
  }
8342
8922
  }
8923
+ if (crdt.type === CrdtType.TEXT) {
8924
+ if (currentCrdt.type !== CrdtType.TEXT || stringifyOrLog(crdt.data) !== stringifyOrLog(currentCrdt.data) || crdt.version !== currentCrdt.version) {
8925
+ ops.push({
8926
+ type: OpCode.UPDATE_TEXT,
8927
+ id,
8928
+ baseVersion: currentCrdt.type === CrdtType.TEXT ? currentCrdt.version : 0,
8929
+ version: crdt.version,
8930
+ ops: [
8931
+ {
8932
+ type: "delete",
8933
+ index: 0,
8934
+ length: currentCrdt.type === CrdtType.TEXT ? currentCrdt.data.reduce(
8935
+ (sum, item) => sum + item.text.length,
8936
+ 0
8937
+ ) : 0
8938
+ },
8939
+ ...crdt.data.map(
8940
+ (item, index, items) => item.attributes === void 0 ? {
8941
+ type: "insert",
8942
+ index: items.slice(0, index).reduce((sum, item2) => sum + item2.text.length, 0),
8943
+ text: item.text
8944
+ } : {
8945
+ type: "insert",
8946
+ index: items.slice(0, index).reduce((sum, item2) => sum + item2.text.length, 0),
8947
+ text: item.text,
8948
+ attributes: item.attributes
8949
+ }
8950
+ )
8951
+ ]
8952
+ });
8953
+ }
8954
+ }
8343
8955
  if (crdt.parentKey !== currentCrdt.parentKey) {
8344
8956
  ops.push({
8345
8957
  type: OpCode.SET_PARENT_KEY,
@@ -8388,6 +9000,16 @@ function getTreesDiffOperations(currentItems, newItems) {
8388
9000
  parentKey: crdt.parentKey
8389
9001
  });
8390
9002
  break;
9003
+ case CrdtType.TEXT:
9004
+ ops.push({
9005
+ type: OpCode.CREATE_TEXT,
9006
+ id,
9007
+ parentId: crdt.parentId,
9008
+ parentKey: crdt.parentKey,
9009
+ data: crdt.data,
9010
+ version: crdt.version
9011
+ });
9012
+ break;
8391
9013
  }
8392
9014
  }
8393
9015
  });
@@ -8420,6 +9042,12 @@ function mergeListStorageUpdates(first, second) {
8420
9042
  updates: updates.concat(second.updates)
8421
9043
  };
8422
9044
  }
9045
+ function mergeTextStorageUpdates(first, second) {
9046
+ return {
9047
+ ...second,
9048
+ updates: first.updates.concat(second.updates)
9049
+ };
9050
+ }
8423
9051
  function mergeStorageUpdates(first, second) {
8424
9052
  if (first === void 0) {
8425
9053
  return second;
@@ -8430,6 +9058,8 @@ function mergeStorageUpdates(first, second) {
8430
9058
  return mergeMapStorageUpdates(first, second);
8431
9059
  } else if (first.type === "LiveList" && second.type === "LiveList") {
8432
9060
  return mergeListStorageUpdates(first, second);
9061
+ } else if (first.type === "LiveText" && second.type === "LiveText") {
9062
+ return mergeTextStorageUpdates(first, second);
8433
9063
  } else {
8434
9064
  }
8435
9065
  return second;
@@ -8448,7 +9078,7 @@ function sendToPanel(message, options) {
8448
9078
  ...message,
8449
9079
  source: "liveblocks-devtools-client"
8450
9080
  };
8451
- if (!(_optionalChain([options, 'optionalAccess', _202 => _202.force]) || _bridgeActive)) {
9081
+ if (!(_optionalChain([options, 'optionalAccess', _207 => _207.force]) || _bridgeActive)) {
8452
9082
  return;
8453
9083
  }
8454
9084
  window.postMessage(fullMsg, "*");
@@ -8456,7 +9086,7 @@ function sendToPanel(message, options) {
8456
9086
  var eventSource = makeEventSource();
8457
9087
  if (process.env.NODE_ENV !== "production" && typeof window !== "undefined") {
8458
9088
  window.addEventListener("message", (event) => {
8459
- if (event.source === window && _optionalChain([event, 'access', _203 => _203.data, 'optionalAccess', _204 => _204.source]) === "liveblocks-devtools-panel") {
9089
+ if (event.source === window && _optionalChain([event, 'access', _208 => _208.data, 'optionalAccess', _209 => _209.source]) === "liveblocks-devtools-panel") {
8460
9090
  eventSource.notify(event.data);
8461
9091
  } else {
8462
9092
  }
@@ -8598,7 +9228,7 @@ function fullSync(room) {
8598
9228
  msg: "room::sync::full",
8599
9229
  roomId: room.id,
8600
9230
  status: room.getStatus(),
8601
- storage: _nullishCoalesce(_optionalChain([root, 'optionalAccess', _205 => _205.toTreeNode, 'call', _206 => _206("root"), 'access', _207 => _207.payload]), () => ( null)),
9231
+ storage: _nullishCoalesce(_optionalChain([root, 'optionalAccess', _210 => _210.toTreeNode, 'call', _211 => _211("root"), 'access', _212 => _212.payload]), () => ( null)),
8602
9232
  me,
8603
9233
  others
8604
9234
  });
@@ -9277,15 +9907,15 @@ function installBackgroundTabSpy() {
9277
9907
  const doc = typeof document !== "undefined" ? document : void 0;
9278
9908
  const inBackgroundSince = { current: null };
9279
9909
  function onVisibilityChange() {
9280
- if (_optionalChain([doc, 'optionalAccess', _208 => _208.visibilityState]) === "hidden") {
9910
+ if (_optionalChain([doc, 'optionalAccess', _213 => _213.visibilityState]) === "hidden") {
9281
9911
  inBackgroundSince.current = _nullishCoalesce(inBackgroundSince.current, () => ( Date.now()));
9282
9912
  } else {
9283
9913
  inBackgroundSince.current = null;
9284
9914
  }
9285
9915
  }
9286
- _optionalChain([doc, 'optionalAccess', _209 => _209.addEventListener, 'call', _210 => _210("visibilitychange", onVisibilityChange)]);
9916
+ _optionalChain([doc, 'optionalAccess', _214 => _214.addEventListener, 'call', _215 => _215("visibilitychange", onVisibilityChange)]);
9287
9917
  const unsub = () => {
9288
- _optionalChain([doc, 'optionalAccess', _211 => _211.removeEventListener, 'call', _212 => _212("visibilitychange", onVisibilityChange)]);
9918
+ _optionalChain([doc, 'optionalAccess', _216 => _216.removeEventListener, 'call', _217 => _217("visibilitychange", onVisibilityChange)]);
9289
9919
  };
9290
9920
  return [inBackgroundSince, unsub];
9291
9921
  }
@@ -9476,7 +10106,7 @@ function createRoom(options, config) {
9476
10106
  }
9477
10107
  }
9478
10108
  function isStorageWritable() {
9479
- const scopes = _optionalChain([context, 'access', _213 => _213.dynamicSessionInfoSig, 'access', _214 => _214.get, 'call', _215 => _215(), 'optionalAccess', _216 => _216.scopes]);
10109
+ const scopes = _optionalChain([context, 'access', _218 => _218.dynamicSessionInfoSig, 'access', _219 => _219.get, 'call', _220 => _220(), 'optionalAccess', _221 => _221.scopes]);
9480
10110
  return scopes !== void 0 ? canWriteStorage(scopes) : true;
9481
10111
  }
9482
10112
  const eventHub = {
@@ -9580,7 +10210,7 @@ function createRoom(options, config) {
9580
10210
  context.pool
9581
10211
  );
9582
10212
  }
9583
- const canWrite = _nullishCoalesce(_optionalChain([self, 'access', _217 => _217.get, 'call', _218 => _218(), 'optionalAccess', _219 => _219.canWrite]), () => ( true));
10213
+ const canWrite = _nullishCoalesce(_optionalChain([self, 'access', _222 => _222.get, 'call', _223 => _223(), 'optionalAccess', _224 => _224.canWrite]), () => ( true));
9584
10214
  const root = context.root;
9585
10215
  disableHistory(() => {
9586
10216
  for (const key in context.initialStorage) {
@@ -9711,7 +10341,7 @@ function createRoom(options, config) {
9711
10341
  );
9712
10342
  output.reverse.pushLeft(applyOpResult.reverse);
9713
10343
  }
9714
- if (op.type === OpCode.CREATE_LIST || op.type === OpCode.CREATE_MAP || op.type === OpCode.CREATE_OBJECT) {
10344
+ if (op.type === OpCode.CREATE_LIST || op.type === OpCode.CREATE_MAP || op.type === OpCode.CREATE_OBJECT || op.type === OpCode.CREATE_TEXT) {
9715
10345
  createdNodeIds.add(op.id);
9716
10346
  }
9717
10347
  }
@@ -9731,6 +10361,7 @@ function createRoom(options, config) {
9731
10361
  switch (op.type) {
9732
10362
  case OpCode.DELETE_OBJECT_KEY:
9733
10363
  case OpCode.UPDATE_OBJECT:
10364
+ case OpCode.UPDATE_TEXT:
9734
10365
  case OpCode.DELETE_CRDT: {
9735
10366
  const node = context.pool.nodes.get(op.id);
9736
10367
  if (node === void 0) {
@@ -9755,6 +10386,7 @@ function createRoom(options, config) {
9755
10386
  case OpCode.CREATE_OBJECT:
9756
10387
  case OpCode.CREATE_LIST:
9757
10388
  case OpCode.CREATE_MAP:
10389
+ case OpCode.CREATE_TEXT:
9758
10390
  case OpCode.CREATE_REGISTER: {
9759
10391
  if (op.parentId === void 0) {
9760
10392
  return { modified: false };
@@ -9785,7 +10417,7 @@ function createRoom(options, config) {
9785
10417
  }
9786
10418
  context.myPresence.patch(patch);
9787
10419
  if (context.activeBatch) {
9788
- if (_optionalChain([options2, 'optionalAccess', _220 => _220.addToHistory])) {
10420
+ if (_optionalChain([options2, 'optionalAccess', _225 => _225.addToHistory])) {
9789
10421
  context.activeBatch.reverseOps.pushLeft({
9790
10422
  type: "presence",
9791
10423
  data: oldValues
@@ -9794,7 +10426,7 @@ function createRoom(options, config) {
9794
10426
  context.activeBatch.updates.presence = true;
9795
10427
  } else {
9796
10428
  flushNowOrSoon();
9797
- if (_optionalChain([options2, 'optionalAccess', _221 => _221.addToHistory])) {
10429
+ if (_optionalChain([options2, 'optionalAccess', _226 => _226.addToHistory])) {
9798
10430
  addToUndoStack([{ type: "presence", data: oldValues }]);
9799
10431
  }
9800
10432
  notify({ presence: true });
@@ -9972,11 +10604,11 @@ function createRoom(options, config) {
9972
10604
  break;
9973
10605
  }
9974
10606
  case ServerMsgCode.STORAGE_CHUNK:
9975
- _optionalChain([stopwatch, 'optionalAccess', _222 => _222.lap, 'call', _223 => _223()]);
10607
+ _optionalChain([stopwatch, 'optionalAccess', _227 => _227.lap, 'call', _228 => _228()]);
9976
10608
  nodeMapBuffer.append(compactNodesToNodeStream(message.nodes));
9977
10609
  break;
9978
10610
  case ServerMsgCode.STORAGE_STREAM_END: {
9979
- const timing = _optionalChain([stopwatch, 'optionalAccess', _224 => _224.stop, 'call', _225 => _225()]);
10611
+ const timing = _optionalChain([stopwatch, 'optionalAccess', _229 => _229.stop, 'call', _230 => _230()]);
9980
10612
  if (timing) {
9981
10613
  const ms = (v) => `${v.toFixed(1)}ms`;
9982
10614
  const rest = timing.laps.slice(1);
@@ -10111,11 +10743,11 @@ function createRoom(options, config) {
10111
10743
  } else if (pendingFeedsRequests.has(requestId)) {
10112
10744
  const pending = pendingFeedsRequests.get(requestId);
10113
10745
  pendingFeedsRequests.delete(requestId);
10114
- _optionalChain([pending, 'optionalAccess', _226 => _226.reject, 'call', _227 => _227(err)]);
10746
+ _optionalChain([pending, 'optionalAccess', _231 => _231.reject, 'call', _232 => _232(err)]);
10115
10747
  } else if (pendingFeedMessagesRequests.has(requestId)) {
10116
10748
  const pending = pendingFeedMessagesRequests.get(requestId);
10117
10749
  pendingFeedMessagesRequests.delete(requestId);
10118
- _optionalChain([pending, 'optionalAccess', _228 => _228.reject, 'call', _229 => _229(err)]);
10750
+ _optionalChain([pending, 'optionalAccess', _233 => _233.reject, 'call', _234 => _234(err)]);
10119
10751
  }
10120
10752
  eventHub.feeds.notify(message);
10121
10753
  break;
@@ -10269,10 +10901,10 @@ function createRoom(options, config) {
10269
10901
  timeoutId,
10270
10902
  kind,
10271
10903
  feedId,
10272
- messageId: _optionalChain([options2, 'optionalAccess', _230 => _230.messageId]),
10273
- expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _231 => _231.expectedClientMessageId])
10904
+ messageId: _optionalChain([options2, 'optionalAccess', _235 => _235.messageId]),
10905
+ expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _236 => _236.expectedClientMessageId])
10274
10906
  });
10275
- if (kind === "add-message" && _optionalChain([options2, 'optionalAccess', _232 => _232.expectedClientMessageId]) === void 0) {
10907
+ if (kind === "add-message" && _optionalChain([options2, 'optionalAccess', _237 => _237.expectedClientMessageId]) === void 0) {
10276
10908
  const q = _nullishCoalesce(pendingAddMessageFifoByFeed.get(feedId), () => ( []));
10277
10909
  q.push(requestId);
10278
10910
  pendingAddMessageFifoByFeed.set(feedId, q);
@@ -10323,10 +10955,10 @@ function createRoom(options, config) {
10323
10955
  }
10324
10956
  if (!matched) {
10325
10957
  const q = pendingAddMessageFifoByFeed.get(message.feedId);
10326
- const headId = _optionalChain([q, 'optionalAccess', _233 => _233[0]]);
10958
+ const headId = _optionalChain([q, 'optionalAccess', _238 => _238[0]]);
10327
10959
  if (headId !== void 0) {
10328
10960
  const pending = pendingFeedMutations.get(headId);
10329
- if (_optionalChain([pending, 'optionalAccess', _234 => _234.kind]) === "add-message" && pending.expectedClientMessageId === void 0) {
10961
+ if (_optionalChain([pending, 'optionalAccess', _239 => _239.kind]) === "add-message" && pending.expectedClientMessageId === void 0) {
10330
10962
  settleFeedMutation(headId, "ok");
10331
10963
  }
10332
10964
  }
@@ -10362,7 +10994,7 @@ function createRoom(options, config) {
10362
10994
  const unacknowledgedOps = new Map(context.unacknowledgedOps);
10363
10995
  createOrUpdateRootFromMessage(nodes);
10364
10996
  applyAndSendOfflineOps(unacknowledgedOps);
10365
- _optionalChain([_resolveStoragePromise, 'optionalCall', _235 => _235()]);
10997
+ _optionalChain([_resolveStoragePromise, 'optionalCall', _240 => _240()]);
10366
10998
  notifyStorageStatus();
10367
10999
  eventHub.storageDidLoad.notify();
10368
11000
  }
@@ -10380,7 +11012,7 @@ function createRoom(options, config) {
10380
11012
  } else if (!messages.some((msg) => msg.type === ClientMsgCode.FETCH_STORAGE)) {
10381
11013
  messages.push({ type: ClientMsgCode.FETCH_STORAGE });
10382
11014
  nodeMapBuffer.take();
10383
- _optionalChain([stopwatch, 'optionalAccess', _236 => _236.start, 'call', _237 => _237()]);
11015
+ _optionalChain([stopwatch, 'optionalAccess', _241 => _241.start, 'call', _242 => _242()]);
10384
11016
  }
10385
11017
  if (options2.flush) {
10386
11018
  flushNowOrSoon();
@@ -10436,10 +11068,10 @@ function createRoom(options, config) {
10436
11068
  const message = {
10437
11069
  type: ClientMsgCode.FETCH_FEEDS,
10438
11070
  requestId,
10439
- cursor: _optionalChain([options2, 'optionalAccess', _238 => _238.cursor]),
10440
- since: _optionalChain([options2, 'optionalAccess', _239 => _239.since]),
10441
- limit: _optionalChain([options2, 'optionalAccess', _240 => _240.limit]),
10442
- metadata: _optionalChain([options2, 'optionalAccess', _241 => _241.metadata])
11071
+ cursor: _optionalChain([options2, 'optionalAccess', _243 => _243.cursor]),
11072
+ since: _optionalChain([options2, 'optionalAccess', _244 => _244.since]),
11073
+ limit: _optionalChain([options2, 'optionalAccess', _245 => _245.limit]),
11074
+ metadata: _optionalChain([options2, 'optionalAccess', _246 => _246.metadata])
10443
11075
  };
10444
11076
  context.buffer.messages.push(message);
10445
11077
  flushNowOrSoon();
@@ -10459,9 +11091,9 @@ function createRoom(options, config) {
10459
11091
  type: ClientMsgCode.FETCH_FEED_MESSAGES,
10460
11092
  requestId,
10461
11093
  feedId,
10462
- cursor: _optionalChain([options2, 'optionalAccess', _242 => _242.cursor]),
10463
- since: _optionalChain([options2, 'optionalAccess', _243 => _243.since]),
10464
- limit: _optionalChain([options2, 'optionalAccess', _244 => _244.limit])
11094
+ cursor: _optionalChain([options2, 'optionalAccess', _247 => _247.cursor]),
11095
+ since: _optionalChain([options2, 'optionalAccess', _248 => _248.since]),
11096
+ limit: _optionalChain([options2, 'optionalAccess', _249 => _249.limit])
10465
11097
  };
10466
11098
  context.buffer.messages.push(message);
10467
11099
  flushNowOrSoon();
@@ -10480,8 +11112,8 @@ function createRoom(options, config) {
10480
11112
  type: ClientMsgCode.ADD_FEED,
10481
11113
  requestId,
10482
11114
  feedId,
10483
- metadata: _optionalChain([options2, 'optionalAccess', _245 => _245.metadata]),
10484
- createdAt: _optionalChain([options2, 'optionalAccess', _246 => _246.createdAt])
11115
+ metadata: _optionalChain([options2, 'optionalAccess', _250 => _250.metadata]),
11116
+ createdAt: _optionalChain([options2, 'optionalAccess', _251 => _251.createdAt])
10485
11117
  };
10486
11118
  context.buffer.messages.push(message);
10487
11119
  flushNowOrSoon();
@@ -10515,15 +11147,15 @@ function createRoom(options, config) {
10515
11147
  function addFeedMessage(feedId, data, options2) {
10516
11148
  const requestId = nanoid();
10517
11149
  const promise = registerFeedMutation(requestId, "add-message", feedId, {
10518
- expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _247 => _247.id])
11150
+ expectedClientMessageId: _optionalChain([options2, 'optionalAccess', _252 => _252.id])
10519
11151
  });
10520
11152
  const message = {
10521
11153
  type: ClientMsgCode.ADD_FEED_MESSAGE,
10522
11154
  requestId,
10523
11155
  feedId,
10524
11156
  data,
10525
- id: _optionalChain([options2, 'optionalAccess', _248 => _248.id]),
10526
- createdAt: _optionalChain([options2, 'optionalAccess', _249 => _249.createdAt])
11157
+ id: _optionalChain([options2, 'optionalAccess', _253 => _253.id]),
11158
+ createdAt: _optionalChain([options2, 'optionalAccess', _254 => _254.createdAt])
10527
11159
  };
10528
11160
  context.buffer.messages.push(message);
10529
11161
  flushNowOrSoon();
@@ -10540,7 +11172,7 @@ function createRoom(options, config) {
10540
11172
  feedId,
10541
11173
  messageId,
10542
11174
  data,
10543
- updatedAt: _optionalChain([options2, 'optionalAccess', _250 => _250.updatedAt])
11175
+ updatedAt: _optionalChain([options2, 'optionalAccess', _255 => _255.updatedAt])
10544
11176
  };
10545
11177
  context.buffer.messages.push(message);
10546
11178
  flushNowOrSoon();
@@ -10747,8 +11379,8 @@ function createRoom(options, config) {
10747
11379
  async function getThreads(options2) {
10748
11380
  return httpClient.getThreads({
10749
11381
  roomId,
10750
- query: _optionalChain([options2, 'optionalAccess', _251 => _251.query]),
10751
- cursor: _optionalChain([options2, 'optionalAccess', _252 => _252.cursor])
11382
+ query: _optionalChain([options2, 'optionalAccess', _256 => _256.query]),
11383
+ cursor: _optionalChain([options2, 'optionalAccess', _257 => _257.cursor])
10752
11384
  });
10753
11385
  }
10754
11386
  async function getThread(threadId) {
@@ -10870,7 +11502,7 @@ function createRoom(options, config) {
10870
11502
  function getSubscriptionSettings(options2) {
10871
11503
  return httpClient.getSubscriptionSettings({
10872
11504
  roomId,
10873
- signal: _optionalChain([options2, 'optionalAccess', _253 => _253.signal])
11505
+ signal: _optionalChain([options2, 'optionalAccess', _258 => _258.signal])
10874
11506
  });
10875
11507
  }
10876
11508
  function updateSubscriptionSettings(settings) {
@@ -10892,7 +11524,7 @@ function createRoom(options, config) {
10892
11524
  {
10893
11525
  [kInternal]: {
10894
11526
  get presenceBuffer() {
10895
- return deepClone(_nullishCoalesce(_optionalChain([context, 'access', _254 => _254.buffer, 'access', _255 => _255.presenceUpdates, 'optionalAccess', _256 => _256.data]), () => ( null)));
11527
+ return deepClone(_nullishCoalesce(_optionalChain([context, 'access', _259 => _259.buffer, 'access', _260 => _260.presenceUpdates, 'optionalAccess', _261 => _261.data]), () => ( null)));
10896
11528
  },
10897
11529
  // prettier-ignore
10898
11530
  get undoStack() {
@@ -10907,9 +11539,9 @@ function createRoom(options, config) {
10907
11539
  return context.yjsProvider;
10908
11540
  },
10909
11541
  setYjsProvider(newProvider) {
10910
- _optionalChain([context, 'access', _257 => _257.yjsProvider, 'optionalAccess', _258 => _258.off, 'call', _259 => _259("status", yjsStatusDidChange)]);
11542
+ _optionalChain([context, 'access', _262 => _262.yjsProvider, 'optionalAccess', _263 => _263.off, 'call', _264 => _264("status", yjsStatusDidChange)]);
10911
11543
  context.yjsProvider = newProvider;
10912
- _optionalChain([newProvider, 'optionalAccess', _260 => _260.on, 'call', _261 => _261("status", yjsStatusDidChange)]);
11544
+ _optionalChain([newProvider, 'optionalAccess', _265 => _265.on, 'call', _266 => _266("status", yjsStatusDidChange)]);
10913
11545
  context.yjsProviderDidChange.notify();
10914
11546
  },
10915
11547
  yjsProviderDidChange: context.yjsProviderDidChange.observable,
@@ -10962,7 +11594,7 @@ function createRoom(options, config) {
10962
11594
  source.dispose();
10963
11595
  }
10964
11596
  eventHub.roomWillDestroy.notify();
10965
- _optionalChain([context, 'access', _262 => _262.yjsProvider, 'optionalAccess', _263 => _263.off, 'call', _264 => _264("status", yjsStatusDidChange)]);
11597
+ _optionalChain([context, 'access', _267 => _267.yjsProvider, 'optionalAccess', _268 => _268.off, 'call', _269 => _269("status", yjsStatusDidChange)]);
10966
11598
  syncSourceForStorage.destroy();
10967
11599
  syncSourceForYjs.destroy();
10968
11600
  uninstallBgTabSpy();
@@ -11122,7 +11754,7 @@ function makeClassicSubscribeFn(roomId, events, errorEvents) {
11122
11754
  }
11123
11755
  if (isLiveNode(first)) {
11124
11756
  const node = first;
11125
- if (_optionalChain([options, 'optionalAccess', _265 => _265.isDeep])) {
11757
+ if (_optionalChain([options, 'optionalAccess', _270 => _270.isDeep])) {
11126
11758
  const storageCallback = second;
11127
11759
  return subscribeToLiveStructureDeeply(node, storageCallback);
11128
11760
  } else {
@@ -11208,8 +11840,8 @@ function createClient(options) {
11208
11840
  const authManager = createAuthManager(options, (token) => {
11209
11841
  currentUserId.set(() => token.uid);
11210
11842
  });
11211
- const fetchPolyfill = _optionalChain([clientOptions, 'access', _266 => _266.polyfills, 'optionalAccess', _267 => _267.fetch]) || /* istanbul ignore next */
11212
- _optionalChain([globalThis, 'access', _268 => _268.fetch, 'optionalAccess', _269 => _269.bind, 'call', _270 => _270(globalThis)]);
11843
+ const fetchPolyfill = _optionalChain([clientOptions, 'access', _271 => _271.polyfills, 'optionalAccess', _272 => _272.fetch]) || /* istanbul ignore next */
11844
+ _optionalChain([globalThis, 'access', _273 => _273.fetch, 'optionalAccess', _274 => _274.bind, 'call', _275 => _275(globalThis)]);
11213
11845
  const httpClient = createApiClient({
11214
11846
  baseUrl,
11215
11847
  fetchPolyfill,
@@ -11227,7 +11859,7 @@ function createClient(options) {
11227
11859
  delegates: {
11228
11860
  createSocket: makeCreateSocketDelegateForAi(
11229
11861
  baseUrl,
11230
- _optionalChain([clientOptions, 'access', _271 => _271.polyfills, 'optionalAccess', _272 => _272.WebSocket])
11862
+ _optionalChain([clientOptions, 'access', _276 => _276.polyfills, 'optionalAccess', _277 => _277.WebSocket])
11231
11863
  ),
11232
11864
  authenticate: async () => {
11233
11865
  const resp = await authManager.getAuthValue({
@@ -11297,7 +11929,7 @@ function createClient(options) {
11297
11929
  createSocket: makeCreateSocketDelegateForRoom(
11298
11930
  roomId,
11299
11931
  baseUrl,
11300
- _optionalChain([clientOptions, 'access', _273 => _273.polyfills, 'optionalAccess', _274 => _274.WebSocket])
11932
+ _optionalChain([clientOptions, 'access', _278 => _278.polyfills, 'optionalAccess', _279 => _279.WebSocket])
11301
11933
  ),
11302
11934
  authenticate: makeAuthDelegateForRoom(roomId, authManager)
11303
11935
  })),
@@ -11320,7 +11952,7 @@ function createClient(options) {
11320
11952
  const shouldConnect = _nullishCoalesce(options2.autoConnect, () => ( true));
11321
11953
  if (shouldConnect) {
11322
11954
  if (typeof atob === "undefined") {
11323
- if (_optionalChain([clientOptions, 'access', _275 => _275.polyfills, 'optionalAccess', _276 => _276.atob]) === void 0) {
11955
+ if (_optionalChain([clientOptions, 'access', _280 => _280.polyfills, 'optionalAccess', _281 => _281.atob]) === void 0) {
11324
11956
  throw new Error(
11325
11957
  "You need to polyfill atob to use the client in your environment. Please follow the instructions at https://liveblocks.io/docs/errors/liveblocks-client/atob-polyfill"
11326
11958
  );
@@ -11332,7 +11964,7 @@ function createClient(options) {
11332
11964
  return leaseRoom(newRoomDetails);
11333
11965
  }
11334
11966
  function getRoom(roomId) {
11335
- const room = _optionalChain([roomsById, 'access', _277 => _277.get, 'call', _278 => _278(roomId), 'optionalAccess', _279 => _279.room]);
11967
+ const room = _optionalChain([roomsById, 'access', _282 => _282.get, 'call', _283 => _283(roomId), 'optionalAccess', _284 => _284.room]);
11336
11968
  return room ? room : null;
11337
11969
  }
11338
11970
  function logout() {
@@ -11348,7 +11980,7 @@ function createClient(options) {
11348
11980
  const batchedResolveUsers = new Batch(
11349
11981
  async (batchedUserIds) => {
11350
11982
  const userIds = batchedUserIds.flat();
11351
- const users = await _optionalChain([resolveUsers, 'optionalCall', _280 => _280({ userIds })]);
11983
+ const users = await _optionalChain([resolveUsers, 'optionalCall', _285 => _285({ userIds })]);
11352
11984
  warnOnceIf(
11353
11985
  !resolveUsers,
11354
11986
  "Set the resolveUsers option in createClient to specify user info."
@@ -11365,7 +11997,7 @@ function createClient(options) {
11365
11997
  const batchedResolveRoomsInfo = new Batch(
11366
11998
  async (batchedRoomIds) => {
11367
11999
  const roomIds = batchedRoomIds.flat();
11368
- const roomsInfo = await _optionalChain([resolveRoomsInfo, 'optionalCall', _281 => _281({ roomIds })]);
12000
+ const roomsInfo = await _optionalChain([resolveRoomsInfo, 'optionalCall', _286 => _286({ roomIds })]);
11369
12001
  warnOnceIf(
11370
12002
  !resolveRoomsInfo,
11371
12003
  "Set the resolveRoomsInfo option in createClient to specify room info."
@@ -11382,7 +12014,7 @@ function createClient(options) {
11382
12014
  const batchedResolveGroupsInfo = new Batch(
11383
12015
  async (batchedGroupIds) => {
11384
12016
  const groupIds = batchedGroupIds.flat();
11385
- const groupsInfo = await _optionalChain([resolveGroupsInfo, 'optionalCall', _282 => _282({ groupIds })]);
12017
+ const groupsInfo = await _optionalChain([resolveGroupsInfo, 'optionalCall', _287 => _287({ groupIds })]);
11386
12018
  warnOnceIf(
11387
12019
  !resolveGroupsInfo,
11388
12020
  "Set the resolveGroupsInfo option in createClient to specify group info."
@@ -11441,7 +12073,7 @@ function createClient(options) {
11441
12073
  }
11442
12074
  };
11443
12075
  const win = typeof window !== "undefined" ? window : void 0;
11444
- _optionalChain([win, 'optionalAccess', _283 => _283.addEventListener, 'call', _284 => _284("beforeunload", maybePreventClose)]);
12076
+ _optionalChain([win, 'optionalAccess', _288 => _288.addEventListener, 'call', _289 => _289("beforeunload", maybePreventClose)]);
11445
12077
  }
11446
12078
  async function getNotificationSettings(options2) {
11447
12079
  const plainSettings = await httpClient.getNotificationSettings(options2);
@@ -11568,7 +12200,7 @@ var commentBodyElementsTypes = {
11568
12200
  mention: "inline"
11569
12201
  };
11570
12202
  function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
11571
- if (!body || !_optionalChain([body, 'optionalAccess', _285 => _285.content])) {
12203
+ if (!body || !_optionalChain([body, 'optionalAccess', _290 => _290.content])) {
11572
12204
  return;
11573
12205
  }
11574
12206
  const element = typeof elementOrVisitor === "string" ? elementOrVisitor : void 0;
@@ -11578,13 +12210,13 @@ function traverseCommentBody(body, elementOrVisitor, possiblyVisitor) {
11578
12210
  for (const block of body.content) {
11579
12211
  if (type === "all" || type === "block") {
11580
12212
  if (guard(block)) {
11581
- _optionalChain([visitor, 'optionalCall', _286 => _286(block)]);
12213
+ _optionalChain([visitor, 'optionalCall', _291 => _291(block)]);
11582
12214
  }
11583
12215
  }
11584
12216
  if (type === "all" || type === "inline") {
11585
12217
  for (const inline of block.children) {
11586
12218
  if (guard(inline)) {
11587
- _optionalChain([visitor, 'optionalCall', _287 => _287(inline)]);
12219
+ _optionalChain([visitor, 'optionalCall', _292 => _292(inline)]);
11588
12220
  }
11589
12221
  }
11590
12222
  }
@@ -11754,7 +12386,7 @@ var stringifyCommentBodyPlainElements = {
11754
12386
  text: ({ element }) => element.text,
11755
12387
  link: ({ element }) => _nullishCoalesce(element.text, () => ( element.url)),
11756
12388
  mention: ({ element, user, group }) => {
11757
- return `@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _288 => _288.name]), () => ( _optionalChain([group, 'optionalAccess', _289 => _289.name]))), () => ( element.id))}`;
12389
+ return `@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _293 => _293.name]), () => ( _optionalChain([group, 'optionalAccess', _294 => _294.name]))), () => ( element.id))}`;
11758
12390
  }
11759
12391
  };
11760
12392
  var stringifyCommentBodyHtmlElements = {
@@ -11784,7 +12416,7 @@ var stringifyCommentBodyHtmlElements = {
11784
12416
  return html`<a href="${href}" target="_blank" rel="noopener noreferrer">${element.text ? html`${element.text}` : element.url}</a>`;
11785
12417
  },
11786
12418
  mention: ({ element, user, group }) => {
11787
- return html`<span data-mention>@${_optionalChain([user, 'optionalAccess', _290 => _290.name]) ? html`${_optionalChain([user, 'optionalAccess', _291 => _291.name])}` : _optionalChain([group, 'optionalAccess', _292 => _292.name]) ? html`${_optionalChain([group, 'optionalAccess', _293 => _293.name])}` : element.id}</span>`;
12419
+ return html`<span data-mention>@${_optionalChain([user, 'optionalAccess', _295 => _295.name]) ? html`${_optionalChain([user, 'optionalAccess', _296 => _296.name])}` : _optionalChain([group, 'optionalAccess', _297 => _297.name]) ? html`${_optionalChain([group, 'optionalAccess', _298 => _298.name])}` : element.id}</span>`;
11788
12420
  }
11789
12421
  };
11790
12422
  var stringifyCommentBodyMarkdownElements = {
@@ -11814,20 +12446,20 @@ var stringifyCommentBodyMarkdownElements = {
11814
12446
  return markdown`[${_nullishCoalesce(element.text, () => ( element.url))}](${href})`;
11815
12447
  },
11816
12448
  mention: ({ element, user, group }) => {
11817
- return markdown`@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _294 => _294.name]), () => ( _optionalChain([group, 'optionalAccess', _295 => _295.name]))), () => ( element.id))}`;
12449
+ return markdown`@${_nullishCoalesce(_nullishCoalesce(_optionalChain([user, 'optionalAccess', _299 => _299.name]), () => ( _optionalChain([group, 'optionalAccess', _300 => _300.name]))), () => ( element.id))}`;
11818
12450
  }
11819
12451
  };
11820
12452
  async function stringifyCommentBody(body, options) {
11821
- const format = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _296 => _296.format]), () => ( "plain"));
11822
- const separator = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _297 => _297.separator]), () => ( (format === "markdown" ? "\n\n" : "\n")));
12453
+ const format = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _301 => _301.format]), () => ( "plain"));
12454
+ const separator = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _302 => _302.separator]), () => ( (format === "markdown" ? "\n\n" : "\n")));
11823
12455
  const elements = {
11824
12456
  ...format === "html" ? stringifyCommentBodyHtmlElements : format === "markdown" ? stringifyCommentBodyMarkdownElements : stringifyCommentBodyPlainElements,
11825
- ..._optionalChain([options, 'optionalAccess', _298 => _298.elements])
12457
+ ..._optionalChain([options, 'optionalAccess', _303 => _303.elements])
11826
12458
  };
11827
12459
  const { users: resolvedUsers, groups: resolvedGroupsInfo } = await resolveMentionsInCommentBody(
11828
12460
  body,
11829
- _optionalChain([options, 'optionalAccess', _299 => _299.resolveUsers]),
11830
- _optionalChain([options, 'optionalAccess', _300 => _300.resolveGroupsInfo])
12461
+ _optionalChain([options, 'optionalAccess', _304 => _304.resolveUsers]),
12462
+ _optionalChain([options, 'optionalAccess', _305 => _305.resolveGroupsInfo])
11831
12463
  );
11832
12464
  const blocks = body.content.flatMap((block, blockIndex) => {
11833
12465
  switch (block.type) {
@@ -11909,6 +12541,12 @@ function toPlainLson(lson) {
11909
12541
  liveblocksType: "LiveList",
11910
12542
  data: [...lson].map((item) => toPlainLson(item))
11911
12543
  };
12544
+ } else if (lson instanceof LiveText) {
12545
+ return {
12546
+ liveblocksType: "LiveText",
12547
+ data: lson.toDelta(),
12548
+ version: lson.version
12549
+ };
11912
12550
  } else {
11913
12551
  return lson;
11914
12552
  }
@@ -11962,9 +12600,9 @@ function makePoller(callback, intervalMs, options) {
11962
12600
  const startTime = performance.now();
11963
12601
  const doc = typeof document !== "undefined" ? document : void 0;
11964
12602
  const win = typeof window !== "undefined" ? window : void 0;
11965
- const maxStaleTimeMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _301 => _301.maxStaleTimeMs]), () => ( Number.POSITIVE_INFINITY));
12603
+ const maxStaleTimeMs = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _306 => _306.maxStaleTimeMs]), () => ( Number.POSITIVE_INFINITY));
11966
12604
  const context = {
11967
- inForeground: _optionalChain([doc, 'optionalAccess', _302 => _302.visibilityState]) !== "hidden",
12605
+ inForeground: _optionalChain([doc, 'optionalAccess', _307 => _307.visibilityState]) !== "hidden",
11968
12606
  lastSuccessfulPollAt: startTime,
11969
12607
  count: 0,
11970
12608
  backoff: 0
@@ -12045,11 +12683,11 @@ function makePoller(callback, intervalMs, options) {
12045
12683
  pollNowIfStale();
12046
12684
  }
12047
12685
  function onVisibilityChange() {
12048
- setInForeground(_optionalChain([doc, 'optionalAccess', _303 => _303.visibilityState]) !== "hidden");
12686
+ setInForeground(_optionalChain([doc, 'optionalAccess', _308 => _308.visibilityState]) !== "hidden");
12049
12687
  }
12050
- _optionalChain([doc, 'optionalAccess', _304 => _304.addEventListener, 'call', _305 => _305("visibilitychange", onVisibilityChange)]);
12051
- _optionalChain([win, 'optionalAccess', _306 => _306.addEventListener, 'call', _307 => _307("online", onVisibilityChange)]);
12052
- _optionalChain([win, 'optionalAccess', _308 => _308.addEventListener, 'call', _309 => _309("focus", pollNowIfStale)]);
12688
+ _optionalChain([doc, 'optionalAccess', _309 => _309.addEventListener, 'call', _310 => _310("visibilitychange", onVisibilityChange)]);
12689
+ _optionalChain([win, 'optionalAccess', _311 => _311.addEventListener, 'call', _312 => _312("online", onVisibilityChange)]);
12690
+ _optionalChain([win, 'optionalAccess', _313 => _313.addEventListener, 'call', _314 => _314("focus", pollNowIfStale)]);
12053
12691
  fsm.start();
12054
12692
  return {
12055
12693
  inc,
@@ -12186,5 +12824,8 @@ detectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);
12186
12824
 
12187
12825
 
12188
12826
 
12189
- exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.FeedRequestErrorCode = FeedRequestErrorCode; exports.HttpError = HttpError; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createThreadId = createThreadId; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
12827
+
12828
+
12829
+
12830
+ exports.ClientMsgCode = ClientMsgCode; exports.CrdtType = CrdtType; exports.DefaultMap = DefaultMap; exports.Deque = Deque; exports.DerivedSignal = DerivedSignal; exports.FeedRequestErrorCode = FeedRequestErrorCode; exports.HttpError = HttpError; exports.LiveList = LiveList; exports.LiveMap = LiveMap; exports.LiveObject = LiveObject; exports.LiveText = LiveText; exports.LiveblocksError = LiveblocksError; exports.MENTION_CHARACTER = MENTION_CHARACTER; exports.MutableSignal = MutableSignal; exports.OpCode = OpCode; exports.Permission = Permission; exports.Promise_withResolvers = Promise_withResolvers; exports.ServerMsgCode = ServerMsgCode; exports.Signal = Signal; exports.SortedList = SortedList; exports.TextEditorType = TextEditorType; exports.WebsocketCloseCodes = WebsocketCloseCodes; exports.applyLiveTextOperations = applyLiveTextOperations; exports.asPos = asPos; exports.assert = assert; exports.assertNever = assertNever; exports.autoRetry = autoRetry; exports.b64decode = b64decode; exports.batch = batch; exports.checkBounds = checkBounds; exports.chunk = chunk; exports.cloneLson = cloneLson; exports.compactNodesToNodeStream = compactNodesToNodeStream; exports.compactObject = compactObject; exports.console = fancy_console_exports; exports.convertToCommentData = convertToCommentData; exports.convertToCommentUserReaction = convertToCommentUserReaction; exports.convertToGroupData = convertToGroupData; exports.convertToInboxNotificationData = convertToInboxNotificationData; exports.convertToSubscriptionData = convertToSubscriptionData; exports.convertToThreadData = convertToThreadData; exports.convertToUserSubscriptionData = convertToUserSubscriptionData; exports.createClient = createClient; exports.createCommentAttachmentId = createCommentAttachmentId; exports.createCommentId = createCommentId; exports.createInboxNotificationId = createInboxNotificationId; exports.createManagedPool = createManagedPool; exports.createNotificationSettings = createNotificationSettings; exports.createThreadId = createThreadId; exports.defineAiTool = defineAiTool; exports.deprecate = deprecate; exports.deprecateIf = deprecateIf; exports.detectDupes = detectDupes; exports.entries = entries; exports.errorIf = errorIf; exports.findLastIndex = findLastIndex; exports.freeze = freeze; exports.generateUrl = generateUrl; exports.getMentionsFromCommentBody = getMentionsFromCommentBody; exports.getSubscriptionKey = getSubscriptionKey; exports.html = html; exports.htmlSafe = htmlSafe; exports.isCommentBodyLink = isCommentBodyLink; exports.isCommentBodyMention = isCommentBodyMention; exports.isCommentBodyText = isCommentBodyText; exports.isJsonArray = isJsonArray; exports.isJsonObject = isJsonObject; exports.isJsonScalar = isJsonScalar; exports.isListStorageNode = isListStorageNode; exports.isLiveNode = isLiveNode; exports.isMapStorageNode = isMapStorageNode; exports.isNotificationChannelEnabled = isNotificationChannelEnabled; exports.isNumberOperator = isNumberOperator; exports.isObjectStorageNode = isObjectStorageNode; exports.isPlainObject = isPlainObject; exports.isRegisterStorageNode = isRegisterStorageNode; exports.isRootStorageNode = isRootStorageNode; exports.isStartsWithOperator = isStartsWithOperator; exports.isTextStorageNode = isTextStorageNode; exports.isUrl = isUrl; exports.kInternal = kInternal; exports.keys = keys; exports.makeAbortController = makeAbortController; exports.makeEventSource = makeEventSource; exports.makePoller = makePoller; exports.makePosition = makePosition; exports.mapValues = mapValues; exports.memoizeOnSuccess = memoizeOnSuccess; exports.nanoid = nanoid; exports.nn = nn; exports.nodeStreamToCompactNodes = nodeStreamToCompactNodes; exports.objectToQuery = objectToQuery; exports.patchNotificationSettings = patchNotificationSettings; exports.raise = raise; exports.resolveMentionsInCommentBody = resolveMentionsInCommentBody; exports.sanitizeUrl = sanitizeUrl; exports.shallow = shallow; exports.shallow2 = shallow2; exports.stableStringify = stableStringify; exports.stringifyCommentBody = stringifyCommentBody; exports.throwUsageError = throwUsageError; exports.toPlainLson = toPlainLson; exports.tryParseJson = tryParseJson; exports.url = url; exports.urljoin = urljoin; exports.wait = wait; exports.warnOnce = warnOnce; exports.warnOnceIf = warnOnceIf; exports.withTimeout = withTimeout;
12190
12831
  //# sourceMappingURL=index.cjs.map