@meshagent/meshagent 0.0.11 → 0.0.13

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.
Files changed (127) hide show
  1. package/dist/browser/agent-client.d.ts +88 -0
  2. package/dist/browser/agent-client.js +174 -0
  3. package/dist/browser/agent.d.ts +103 -0
  4. package/dist/browser/agent.js +229 -0
  5. package/dist/browser/client.d.ts +90 -0
  6. package/dist/browser/client.js +449 -0
  7. package/dist/browser/completer.d.ts +9 -0
  8. package/dist/browser/completer.js +25 -0
  9. package/dist/browser/data-types.d.ts +44 -0
  10. package/dist/browser/data-types.js +119 -0
  11. package/dist/browser/database-client.d.ts +77 -0
  12. package/dist/browser/database-client.js +113 -0
  13. package/dist/browser/developer-client.d.ts +13 -0
  14. package/dist/browser/developer-client.js +35 -0
  15. package/dist/browser/document.d.ts +84 -0
  16. package/dist/browser/document.js +531 -0
  17. package/dist/browser/entrypoint.d.ts +49722 -0
  18. package/dist/browser/entrypoint.js +8659 -0
  19. package/dist/browser/event-emitter.d.ts +13 -0
  20. package/dist/browser/event-emitter.js +38 -0
  21. package/dist/browser/helpers.d.ts +26 -0
  22. package/dist/browser/helpers.js +79 -0
  23. package/dist/browser/index.d.ts +24 -0
  24. package/dist/browser/index.js +40 -0
  25. package/dist/browser/messaging-client.d.ts +76 -0
  26. package/dist/browser/messaging-client.js +248 -0
  27. package/dist/browser/participant-token.d.ts +36 -0
  28. package/dist/browser/participant-token.js +104 -0
  29. package/dist/browser/participant.d.ts +18 -0
  30. package/dist/browser/participant.js +42 -0
  31. package/dist/browser/protocol.d.ts +87 -0
  32. package/dist/browser/protocol.js +305 -0
  33. package/dist/browser/queues-client.d.ts +26 -0
  34. package/dist/browser/queues-client.js +47 -0
  35. package/dist/browser/requirement.d.ts +25 -0
  36. package/dist/browser/requirement.js +49 -0
  37. package/dist/browser/response.d.ts +60 -0
  38. package/dist/browser/response.js +138 -0
  39. package/dist/browser/room-client.d.ts +43 -0
  40. package/dist/browser/room-client.js +109 -0
  41. package/dist/browser/room-event.d.ts +60 -0
  42. package/dist/browser/room-event.js +82 -0
  43. package/dist/browser/room-server-client.d.ts +19 -0
  44. package/dist/browser/room-server-client.js +50 -0
  45. package/dist/browser/runtime.d.ts +6 -0
  46. package/dist/browser/runtime.js +8 -0
  47. package/dist/browser/schema.d.ts +83 -0
  48. package/dist/browser/schema.js +321 -0
  49. package/dist/browser/storage-client.d.ts +38 -0
  50. package/dist/browser/storage-client.js +86 -0
  51. package/dist/browser/stream-controller.d.ts +8 -0
  52. package/dist/browser/stream-controller.js +55 -0
  53. package/dist/browser/sync-client.d.ts +33 -0
  54. package/dist/browser/sync-client.js +123 -0
  55. package/dist/browser/utils.d.ts +14 -0
  56. package/dist/browser/utils.js +59 -0
  57. package/dist/node/agent-client.d.ts +88 -0
  58. package/dist/node/agent-client.js +174 -0
  59. package/dist/node/agent.d.ts +103 -0
  60. package/dist/node/agent.js +229 -0
  61. package/dist/node/client.d.ts +90 -0
  62. package/dist/node/client.js +449 -0
  63. package/dist/node/completer.d.ts +9 -0
  64. package/dist/node/completer.js +25 -0
  65. package/dist/node/data-types.d.ts +44 -0
  66. package/dist/node/data-types.js +119 -0
  67. package/dist/node/database-client.d.ts +77 -0
  68. package/dist/node/database-client.js +113 -0
  69. package/dist/node/developer-client.d.ts +13 -0
  70. package/dist/node/developer-client.js +35 -0
  71. package/dist/node/document.d.ts +84 -0
  72. package/dist/node/document.js +531 -0
  73. package/dist/node/entrypoint.d.ts +49722 -0
  74. package/dist/node/entrypoint.js +6321 -0
  75. package/dist/node/event-emitter.d.ts +13 -0
  76. package/dist/node/event-emitter.js +38 -0
  77. package/dist/node/helpers.d.ts +26 -0
  78. package/dist/node/helpers.js +79 -0
  79. package/dist/node/index.d.ts +24 -0
  80. package/dist/node/index.js +40 -0
  81. package/dist/node/messaging-client.d.ts +76 -0
  82. package/dist/node/messaging-client.js +248 -0
  83. package/dist/node/participant-token.d.ts +36 -0
  84. package/dist/node/participant-token.js +104 -0
  85. package/dist/node/participant.d.ts +18 -0
  86. package/dist/node/participant.js +42 -0
  87. package/dist/node/protocol.d.ts +87 -0
  88. package/dist/node/protocol.js +305 -0
  89. package/dist/node/queues-client.d.ts +26 -0
  90. package/dist/node/queues-client.js +47 -0
  91. package/dist/node/requirement.d.ts +25 -0
  92. package/dist/node/requirement.js +49 -0
  93. package/dist/node/response.d.ts +60 -0
  94. package/dist/node/response.js +138 -0
  95. package/dist/node/room-client.d.ts +43 -0
  96. package/dist/node/room-client.js +109 -0
  97. package/dist/node/room-event.d.ts +60 -0
  98. package/dist/node/room-event.js +82 -0
  99. package/dist/node/room-server-client.d.ts +19 -0
  100. package/dist/node/room-server-client.js +50 -0
  101. package/dist/node/runtime.d.ts +6 -0
  102. package/dist/node/runtime.js +8 -0
  103. package/dist/node/schema.d.ts +83 -0
  104. package/dist/node/schema.js +321 -0
  105. package/dist/node/storage-client.d.ts +38 -0
  106. package/dist/node/storage-client.js +86 -0
  107. package/dist/node/stream-controller.d.ts +8 -0
  108. package/dist/node/stream-controller.js +55 -0
  109. package/dist/node/sync-client.d.ts +33 -0
  110. package/dist/node/sync-client.js +123 -0
  111. package/dist/node/utils.d.ts +14 -0
  112. package/dist/node/utils.js +59 -0
  113. package/package.json +35 -22
  114. package/README.md +0 -0
  115. package/babel.config.cjs +0 -3
  116. package/client.js +0 -422
  117. package/dist/entrypoint.js +0 -11262
  118. package/dist/entrypoint.js.map +0 -7
  119. package/document-server-client.js +0 -246
  120. package/entrypoint.js +0 -11568
  121. package/index.js +0 -2
  122. package/protocol.js +0 -459
  123. package/server.js +0 -310
  124. package/test/assert.js +0 -19
  125. package/test/document-server-client.test.js +0 -33
  126. package/test/document.test.js +0 -313
  127. package/test/protocol.test.js +0 -64
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RefCount = exports.decoder = exports.encoder = void 0;
4
+ exports.splitMessagePayload = splitMessagePayload;
5
+ exports.splitMessageHeader = splitMessageHeader;
6
+ exports.packMessage = packMessage;
7
+ exports.mergeUint8Arrays = mergeUint8Arrays;
8
+ exports.blobToArrayBuffer = blobToArrayBuffer;
9
+ const text_encoding_1 = require("@kayahr/text-encoding");
10
+ const encoder = new text_encoding_1.TextEncoder();
11
+ exports.encoder = encoder;
12
+ const decoder = new text_encoding_1.TextDecoder();
13
+ exports.decoder = decoder;
14
+ function splitMessagePayload(packet) {
15
+ const dataView = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
16
+ const headerSize = dataView.getUint32(4, false) + dataView.getUint32(0, false) * Math.pow(2, 32);
17
+ return packet.subarray(8 + headerSize, packet.length);
18
+ }
19
+ function splitMessageHeader(packet) {
20
+ const dataView = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);
21
+ const headerSize = dataView.getUint32(4, false) + dataView.getUint32(0, false) * Math.pow(2, 32);
22
+ const payload = packet.subarray(8, 8 + headerSize);
23
+ return decoder.decode(payload);
24
+ }
25
+ function packMessage(request, data) {
26
+ const jsonMessage = encoder.encode(JSON.stringify(request));
27
+ const size = jsonMessage.length;
28
+ const header = new Uint8Array(4 * 2);
29
+ const dataView = new DataView(header.buffer);
30
+ dataView.setUint32(0, (size & 0x000fffff00000000) / Math.pow(2, 32), false);
31
+ dataView.setUint32(4, size & 0xffffffff, false);
32
+ return mergeUint8Arrays(header, jsonMessage, data ?? new Uint8Array(0));
33
+ }
34
+ function mergeUint8Arrays(...arrays) {
35
+ const totalSize = arrays.reduce((acc, e) => acc + e.length, 0);
36
+ const merged = new Uint8Array(totalSize);
37
+ arrays.forEach((array, i, arrays) => {
38
+ const offset = arrays
39
+ .slice(0, i)
40
+ .reduce((acc, e) => acc + e.length, 0);
41
+ merged.set(array, offset);
42
+ });
43
+ return merged;
44
+ }
45
+ function blobToArrayBuffer(blob) {
46
+ return new Promise((resolve, reject) => {
47
+ const reader = new FileReader();
48
+ reader.onload = () => resolve(reader.result);
49
+ reader.onerror = () => reject(reader.error);
50
+ reader.readAsArrayBuffer(blob);
51
+ });
52
+ }
53
+ class RefCount {
54
+ constructor(ref) {
55
+ this.ref = ref;
56
+ this.count = 1;
57
+ }
58
+ }
59
+ exports.RefCount = RefCount;
package/package.json CHANGED
@@ -1,33 +1,46 @@
1
1
  {
2
2
  "name": "@meshagent/meshagent",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "Meshagent Client",
5
5
  "homepage": "https://www.meshagent.com",
6
- "main": "index.js",
7
- "type": "module",
8
6
  "scripts": {
9
- "build": "esbuild entrypoint.js --sourcemap --tree-shaking=true --bundle --outdir=dist --target=esnext '--define:process={\"env\":\"production\",\"NODE_ENV\":\"production\"}' --define:global=window --analyze --format=cjs",
10
- "test": "jest"
7
+ "test": "mocha dist/node/test/*.js",
8
+ "build": "./scripts/build.sh",
9
+ "build-browser-test": "node ./build-browser-test.js"
11
10
  },
12
- "dependencies": {
13
- "@babel/core": "^7.26.0",
14
- "@babel/preset-env": "^7.26.0",
15
- "@kayahr/text-encoding": "^1.3.0",
16
- "base-64": "^1.0.0",
17
- "uuid": "^11.0.3",
18
- "ws": "^8.18.0",
19
- "y-indexeddb": "^9.0.12",
20
- "yjs": "^13.6.7"
11
+ "author": "Powerboards",
12
+ "license": "Apache-2.0",
13
+ "main": "./dist/node/index.js",
14
+ "exports": {
15
+ ".": {
16
+ "browser": "./dist/browser/index.js",
17
+ "default": "./dist/node/index.js"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "browser": {
22
+ "./dist/node/index.js": "./dist/browser/index.js"
21
23
  },
24
+ "files": [
25
+ "dist",
26
+ "!dist/**/test"
27
+ ],
22
28
  "devDependencies": {
23
- "@eslint/js": "^9.14.0",
29
+ "@types/chai": "^5.0.1",
30
+ "@types/mocha": "^10.0.10",
31
+ "@types/node": "^22.13.9",
32
+ "@types/ws": "^8.18.0",
33
+ "chai": "^5.2.0",
24
34
  "esbuild": "^0.25.0",
25
- "eslint": "^9.14.0",
26
- "eslint-plugin-import": "^2.31.0",
27
- "globals": "^15.12.0",
28
- "jest": "^29.7.0",
29
- "mocha": "^11.1.0"
35
+ "esm": "^3.2.25",
36
+ "mocha": "^11.1.0",
37
+ "typescript": "^5.8.2"
30
38
  },
31
- "author": "",
32
- "license": "Apache-2.0"
39
+ "dependencies": {
40
+ "@kayahr/text-encoding": "^2.0.0",
41
+ "isomorphic-ws": "^5.0.0",
42
+ "jose": "^6.0.8",
43
+ "uuid": "^11.0.5",
44
+ "ws": "^8.18.0"
45
+ }
33
46
  }
package/README.md DELETED
File without changes
package/babel.config.cjs DELETED
@@ -1,3 +0,0 @@
1
- module.exports = {
2
- presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
3
- };
package/client.js DELETED
@@ -1,422 +0,0 @@
1
-
2
- import { v4 } from "uuid";
3
-
4
- const uuid = v4;
5
-
6
- export class XmlElement {
7
- constructor(
8
- parent,
9
- { tagName, attributes },
10
- doc,
11
- ) {
12
- this._data = {
13
- tagName: tagName,
14
- attributes: attributes,
15
- children: [],
16
- };
17
- this._parent = parent;
18
- this._doc = doc;
19
- }
20
-
21
- get doc() {
22
- return this._doc;
23
- }
24
-
25
- getNodeByID(id) {
26
- if(id == this.id) {
27
- return this;
28
- }
29
- for(let child of this.getChildren()) {
30
- if(child instanceof XmlElement) {
31
- let n = child.getNodeByID(id);
32
- if(n != null) {
33
- return n;
34
- }
35
- }
36
- }
37
- return null;
38
- }
39
-
40
- get id() {
41
- return this.getAttribute("$id")
42
- }
43
-
44
- get tagName() {
45
- return this._data["tagName"];
46
- }
47
-
48
- get parent() {
49
- return this._parent;
50
- }
51
-
52
- getAttribute(name) {
53
- return this._data["attributes"][name];
54
- }
55
-
56
- setAttribute(name, value) {
57
- this.doc.sendChanges({"documentID" : this.doc.id,
58
- "changes" : [{
59
- "nodeID": this.id,
60
- "setAttributes": {
61
- [name] : value
62
- }
63
- }]});
64
- }
65
-
66
- removeAttribute(name) {
67
- this.doc.sendChanges({"documentID" : this.doc.id,
68
- "changes" : [{
69
- "nodeID": this.id,
70
- "removeAttributes": [name],
71
- }]});
72
- }
73
-
74
- createChildElement(tagName, attributes) {
75
- let elementData = {
76
- "name" : tagName,
77
- "attributes" : {
78
- "$id" : uuid(),
79
- ...attributes,
80
- },
81
- "children" : this._defaultChildren(tagName),
82
- };
83
- this.doc.sendChanges({"documentID" : this.doc.id,
84
- "changes" : [{
85
- "nodeID": this.id,
86
- "insertChildren": {
87
- "children": [
88
- {
89
- "element" : elementData
90
- }
91
- ]
92
- }
93
- }]});
94
- return this.getNodeByID(elementData.attributes.id);
95
- }
96
-
97
- createChildElementAt(index, tagName, attributes) {
98
- let elementData = {
99
- "name" : tagName,
100
- "attributes" : {
101
- "$id" : uuid(),
102
- ...attributes,
103
- },
104
- "children" : this._defaultChildren(tagName),
105
- };
106
- this.doc.sendChanges({"documentID" : this.doc.id,
107
- "changes":[{
108
- "nodeID": this.id,
109
- "insertChildren": {
110
- "index" : index,
111
- "children": [
112
- {
113
- "element": elementData,
114
- }
115
- ]
116
- }
117
- }]});
118
- return this.getNodeByID(elementData.attributes.id);
119
- }
120
-
121
- createChildElementAfter(element, tagName, attributes) {
122
- if(element.parent?.id != this.id) {
123
- throw Error("Element does not belong to this node");
124
- }
125
- let elementData = {
126
- "name" : tagName,
127
- "attributes" : {
128
- "$id" : uuid(),
129
- ...attributes,
130
- },
131
- "children" : this._defaultChildren(tagName),
132
- };
133
- this.doc.sendChanges({"documentID" : this.doc.id,
134
- "changes":[{
135
- "nodeID": this.id,
136
- "insertChildren": {
137
- "after" : element.id,
138
- "children": [
139
- {
140
- "element": elementData,
141
- }
142
- ]
143
- }
144
- }]});
145
- return this.getNodeByID(elementData.attributes.id);
146
- }
147
-
148
- _defaultChildren(tagName) {
149
- if(tagName == "text") {
150
- return [{
151
- "text" : {
152
- "delta" : []
153
- }
154
- }];
155
- }
156
- return [];
157
- }
158
-
159
- delete() {
160
- this.doc.sendChanges({"documentID" : this.doc.id,
161
- "changes":[{
162
- "nodeID": this.id,
163
- "delete": {
164
- }
165
- }]});
166
- }
167
-
168
- getChildren() {
169
- return this._data["children"];
170
- }
171
- }
172
-
173
- export class XmlText {
174
- constructor(parent, data, doc) {
175
- this._data = data;
176
- this.parent = parent;
177
- this.doc = doc;
178
- }
179
-
180
- get delta() {
181
- return this._data.delta;
182
- }
183
-
184
- insert(index, text, attributes) {
185
- this.doc.sendChanges({"documentID" : this.doc.id,
186
- "changes":[{
187
- "nodeID" : this.parent.id,
188
- "insertText" : {
189
- "index" : index,
190
- "text" : text,
191
- "attributes" : attributes,
192
- }
193
- }]});
194
- }
195
-
196
- format(from, length, attributes) {
197
- this.doc.sendChanges({"documentID" : this.doc.id,
198
- "changes":[{
199
- "nodeID" : this.parent.id,
200
- "formatText" : {
201
- "from" : from,
202
- "length" : length,
203
- "attributes" : attributes,
204
- }
205
- }]});
206
- }
207
-
208
- delete(index, length) {
209
- this.doc.sendChanges({"documentID" : this.doc.id,
210
- "changes":[{
211
- "nodeID" : this.parent.id,
212
- "deleteText" : {
213
- "index" : index,
214
- "length" : length,
215
- }
216
- }]});
217
- }
218
- }
219
-
220
- export class ClientXmlDocument {
221
- constructor({ id, sendChanges }) {
222
- this._root = new XmlElement(null, { tagName: "root", attributes: {}, children: [] }, this);
223
- this.sendChanges = sendChanges;
224
- this._id = id;
225
- }
226
-
227
- get id() {
228
- return this._id;
229
- }
230
-
231
- get root() {
232
- return this._root;
233
- }
234
-
235
- _createNode(parent, data) {
236
-
237
- if(data.element) {
238
- const element = new XmlElement(parent, data.element, this);
239
- if(data.element.children) {
240
- for(let child of data.element.children) {
241
- element._data["children"].push(this._createNode(element, child));
242
- }
243
- }
244
- return element;
245
- } else if(data.text) {
246
- return new XmlText(parent, data.text, this);
247
- } else {
248
- throw new Error("Unsupported "+JSON.stringify(data));
249
- }
250
- }
251
-
252
- receiveChanges(message) {
253
- const nodeID = message.target;
254
- const target = message.root ? this.root : this.root.getNodeByID(nodeID);
255
-
256
- // process element deltas
257
- let retain = 0;
258
- for(let delta of message.elements) {
259
- if(delta.retain) {
260
- retain += delta.retain;
261
- }
262
- if(delta.insert) {
263
- for(let insert of delta.insert) {
264
- if(insert.element) {
265
- target._data["children"].splice(retain, 0, this._createNode(target, insert, this));
266
- retain++;
267
- } else if(insert.text) {
268
- target._data["children"].splice(retain, 0, this._createNode(target, insert, this));
269
- retain++;
270
- } else {
271
- throw new Error("Unsupported element delta");
272
- }
273
- }
274
- } else if(delta.delete) {
275
- target._data["children"].splice(retain, delta.delete);
276
- retain -= delta.delete;
277
- }
278
- }
279
-
280
- // process text deltas
281
- if(message.text.length != 0) {
282
-
283
- if(target.tagName != "text") {
284
- throw new Error("Node is not a text node: "+target.tagName)
285
- }
286
- const textNode = target._data["children"][0];
287
- retain = 0;
288
- let i = 0;
289
- let offset = 0;
290
- let targetDelta = textNode._data["delta"];
291
- if(!targetDelta) {
292
- throw new Error("Text node is missing delta")
293
- }
294
-
295
- for(let delta of message.text) {
296
-
297
-
298
- if(delta.insert) {
299
- if(i == targetDelta.length) {
300
- targetDelta.push({ insert: delta.insert, attributes: delta.attributes ?? {} });
301
- i++;
302
- offset += delta.insert.length;
303
- retain += delta.insert.length;
304
- } else {
305
- let str = targetDelta[i].insert;
306
- targetDelta[i].insert = str.slice(0, retain - offset) + delta.insert + str.slice(retain - offset);
307
- retain += delta.insert.length;
308
- }
309
- } else if(delta.delete) {
310
- let deleted = 0;
311
- while(delta.delete > deleted) {
312
- let remaining = delta.delete - deleted;
313
-
314
- // delete ends after item
315
- if(retain > offset) {
316
- // delete end
317
- let str = targetDelta[i].insert;
318
- let start = str.slice(0,retain - offset);
319
- let end = str.slice(retain - offset);
320
-
321
- if(remaining >= end.length) {
322
- targetDelta[i].insert = start;
323
- deleted += end.length;
324
- i++;
325
- offset += str.length;
326
- } else {
327
- targetDelta[i].insert = start + end.slice(remaining);
328
- deleted += targetDelta[i].insert.length;
329
- }
330
-
331
- // TODO? increase retain?
332
- } else if(delta.delete - deleted >= targetDelta[i].insert.length) {
333
- deleted += targetDelta[i].insert.length;
334
- offset += targetDelta.splice(i, 1);
335
- } else {
336
- // delete ends inside item, delete front
337
- let str = targetDelta[i].insert;
338
- let start = str.substr(0, remaining);
339
- let end = str.slice(remaining);
340
- targetDelta[i].insert = end;
341
- deleted += start.length;
342
- }
343
- }
344
- } else if(delta.attributes) {
345
-
346
- let formatted = 0;
347
- while(delta.retain > formatted) {
348
- // format ends after item
349
- let remaining = delta.retain - formatted;
350
-
351
- if(retain > offset) {
352
- // format end
353
- let str = targetDelta[i].insert;
354
- let start = str.slice(0,retain - offset);
355
- let end = str.slice(retain - offset);
356
-
357
-
358
- if(remaining >= end.length) {
359
- targetDelta[i].insert = start;
360
- targetDelta.splice(i+1, 0, { insert: end, attributes: {...targetDelta[i].attributes, ...delta.attributes} });
361
-
362
- formatted += end.length;
363
- // move to next item
364
- i++;
365
- i++;
366
- offset += str.length;
367
- } else {
368
- targetDelta[i].insert = start;
369
- targetDelta.splice(i+1, 0, { insert: end.slice(0, remaining), attributes: {...targetDelta[i].attributes, ...delta.attributes} });
370
- targetDelta.splice(i+2, 0, { insert: end.slice(remaining), attributes: {...targetDelta[i].attributes } });
371
-
372
- formatted += remaining;
373
- i++;
374
- i++;
375
- i++;
376
- offset += start.length + remaining;
377
- }
378
- } else if(delta.retain - formatted >= targetDelta[i].insert.length) {
379
- formatted += targetDelta[i].insert.length;
380
-
381
- // format whole item
382
- for(let k of Object.keys(delta.attributes)) {
383
- targetDelta[i].attributes[k] = delta.attributes[k];
384
- }
385
- offset += targetDelta[i].insert.length;
386
- i++;
387
- } else {
388
- // format ends inside item, format front
389
- let str = targetDelta[i].insert;
390
- let start = str.substr(0, remaining);
391
- let end = str.slice(remaining);
392
- targetDelta[i].insert = start;
393
- targetDelta.push({ insert: end, attributes: { ...targetDelta[i].attributes, }})
394
- for(let k of Object.keys(delta.attributes)) {
395
- targetDelta[i].attributes[k] = delta.attributes[k];
396
- }
397
- formatted += (delta.retain - formatted);
398
- }
399
- }
400
- retain += delta.retain;
401
- } else if(delta.retain) {
402
- if(delta.retain) {
403
- retain += delta.retain;
404
- }
405
-
406
- while(retain > offset + targetDelta[i]?.insert.length ?? 0) {
407
- offset += targetDelta[i].insert.length;
408
- i++;
409
- }
410
- }
411
- }
412
- }
413
-
414
- message.attributes.set.forEach(change => {
415
- target._data["attributes"][change.name] = change.value;
416
- });
417
-
418
- message.attributes.delete.forEach(name => {
419
- delete target._data["attributes"][name];
420
- });
421
- }
422
- }