@nice2dev/ui-graphics 1.0.4 → 1.0.5

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 (183) hide show
  1. package/dist/cjs/animation/AnimationEditor.js +1 -1
  2. package/dist/cjs/animation/Audience.js +1 -1
  3. package/dist/cjs/core/LocalUI.js +1 -1
  4. package/dist/cjs/core/yjsCollaboration.js +2 -2
  5. package/dist/cjs/core/yjsCollaboration.js.map +1 -1
  6. package/dist/cjs/game/GameAsset2dEditor.js +1 -1
  7. package/dist/cjs/node_modules/lib0/array.js +103 -0
  8. package/dist/cjs/node_modules/lib0/array.js.map +1 -0
  9. package/dist/cjs/node_modules/lib0/binary.js +42 -0
  10. package/dist/cjs/node_modules/lib0/binary.js.map +1 -0
  11. package/dist/cjs/node_modules/lib0/broadcastchannel.js +121 -0
  12. package/dist/cjs/node_modules/lib0/broadcastchannel.js.map +1 -0
  13. package/dist/cjs/node_modules/lib0/buffer.js +103 -0
  14. package/dist/cjs/node_modules/lib0/buffer.js.map +1 -0
  15. package/dist/cjs/node_modules/lib0/conditions.js +18 -0
  16. package/dist/cjs/node_modules/lib0/conditions.js.map +1 -0
  17. package/dist/cjs/node_modules/lib0/decoding.js +460 -0
  18. package/dist/cjs/node_modules/lib0/decoding.js.map +1 -0
  19. package/dist/cjs/node_modules/lib0/dom.js +55 -0
  20. package/dist/cjs/node_modules/lib0/dom.js.map +1 -0
  21. package/dist/cjs/node_modules/lib0/encoding.js +688 -0
  22. package/dist/cjs/node_modules/lib0/encoding.js.map +1 -0
  23. package/dist/cjs/node_modules/lib0/environment.js +129 -0
  24. package/dist/cjs/node_modules/lib0/environment.js.map +1 -0
  25. package/dist/cjs/node_modules/lib0/error.js +37 -0
  26. package/dist/cjs/node_modules/lib0/error.js.map +1 -0
  27. package/dist/cjs/node_modules/lib0/function.js +135 -0
  28. package/dist/cjs/node_modules/lib0/function.js.map +1 -0
  29. package/dist/cjs/node_modules/lib0/iterator.js +52 -0
  30. package/dist/cjs/node_modules/lib0/iterator.js.map +1 -0
  31. package/dist/cjs/node_modules/lib0/logging.common.js +63 -0
  32. package/dist/cjs/node_modules/lib0/logging.common.js.map +1 -0
  33. package/dist/cjs/node_modules/lib0/logging.js +128 -0
  34. package/dist/cjs/node_modules/lib0/logging.js.map +1 -0
  35. package/dist/cjs/node_modules/lib0/map.js +108 -0
  36. package/dist/cjs/node_modules/lib0/map.js.map +1 -0
  37. package/dist/cjs/node_modules/lib0/math.js +44 -0
  38. package/dist/cjs/node_modules/lib0/math.js.map +1 -0
  39. package/dist/cjs/node_modules/lib0/number.js +21 -0
  40. package/dist/cjs/node_modules/lib0/number.js.map +1 -0
  41. package/dist/cjs/node_modules/lib0/object.js +132 -0
  42. package/dist/cjs/node_modules/lib0/object.js.map +1 -0
  43. package/dist/cjs/node_modules/lib0/observable.js +168 -0
  44. package/dist/cjs/node_modules/lib0/observable.js.map +1 -0
  45. package/dist/cjs/node_modules/lib0/pair.js +33 -0
  46. package/dist/cjs/node_modules/lib0/pair.js.map +1 -0
  47. package/dist/cjs/node_modules/lib0/prng.js +95 -0
  48. package/dist/cjs/node_modules/lib0/prng.js.map +1 -0
  49. package/dist/cjs/node_modules/lib0/promise.js +33 -0
  50. package/dist/cjs/node_modules/lib0/promise.js.map +1 -0
  51. package/dist/cjs/node_modules/lib0/random.js +28 -0
  52. package/dist/cjs/node_modules/lib0/random.js.map +1 -0
  53. package/dist/cjs/node_modules/lib0/schema.js +1168 -0
  54. package/dist/cjs/node_modules/lib0/schema.js.map +1 -0
  55. package/dist/cjs/node_modules/lib0/set.js +12 -0
  56. package/dist/cjs/node_modules/lib0/set.js.map +1 -0
  57. package/dist/cjs/node_modules/lib0/storage.js +79 -0
  58. package/dist/cjs/node_modules/lib0/storage.js.map +1 -0
  59. package/dist/cjs/node_modules/lib0/string.js +94 -0
  60. package/dist/cjs/node_modules/lib0/string.js.map +1 -0
  61. package/dist/cjs/node_modules/lib0/symbol.js +15 -0
  62. package/dist/cjs/node_modules/lib0/symbol.js.map +1 -0
  63. package/dist/cjs/node_modules/lib0/time.js +18 -0
  64. package/dist/cjs/node_modules/lib0/time.js.map +1 -0
  65. package/dist/cjs/node_modules/lib0/trait/equality.js +32 -0
  66. package/dist/cjs/node_modules/lib0/trait/equality.js.map +1 -0
  67. package/dist/cjs/node_modules/lib0/url.js +20 -0
  68. package/dist/cjs/node_modules/lib0/url.js.map +1 -0
  69. package/dist/cjs/node_modules/lib0/webcrypto.js +8 -0
  70. package/dist/cjs/node_modules/lib0/webcrypto.js.map +1 -0
  71. package/dist/cjs/node_modules/y-protocols/auth.js +27 -0
  72. package/dist/cjs/node_modules/y-protocols/auth.js.map +1 -0
  73. package/dist/cjs/node_modules/y-protocols/awareness.js +277 -0
  74. package/dist/cjs/node_modules/y-protocols/awareness.js.map +1 -0
  75. package/dist/cjs/node_modules/y-protocols/sync.js +149 -0
  76. package/dist/cjs/node_modules/y-protocols/sync.js.map +1 -0
  77. package/dist/cjs/node_modules/y-websocket/src/y-websocket.js +521 -0
  78. package/dist/cjs/node_modules/y-websocket/src/y-websocket.js.map +1 -0
  79. package/dist/cjs/node_modules/yjs/dist/yjs.js +10399 -0
  80. package/dist/cjs/node_modules/yjs/dist/yjs.js.map +1 -0
  81. package/dist/cjs/packages/ui/dist/index.js +65997 -0
  82. package/dist/cjs/packages/ui/dist/index.js.map +1 -0
  83. package/dist/cjs/pixel/PixelEditor.js +1 -1
  84. package/dist/cjs/pixel/PixelEditorMenuBar.js +1 -1
  85. package/dist/cjs/pixel/PixelEditorRightPanel.js +1 -1
  86. package/dist/cjs/pixel/PixelEditorTimeline.js +1 -1
  87. package/dist/cjs/pixel/PixelEditorToolbar.js +1 -1
  88. package/dist/cjs/pixel/SpriteGeneratorPanel.js +1 -1
  89. package/dist/cjs/vector/VectorEditor.js +1 -1
  90. package/dist/cjs/vector/VectorEditorMenuBar.js +1 -1
  91. package/dist/cjs/vector/VectorEditorRightPanel.js +1 -1
  92. package/dist/esm/animation/AnimationEditor.js +5 -5
  93. package/dist/esm/animation/Audience.js +2 -2
  94. package/dist/esm/core/LocalUI.js +4 -4
  95. package/dist/esm/core/yjsCollaboration.js +2 -2
  96. package/dist/esm/core/yjsCollaboration.js.map +1 -1
  97. package/dist/esm/game/GameAsset2dEditor.js +19 -19
  98. package/dist/esm/node_modules/lib0/array.js +95 -0
  99. package/dist/esm/node_modules/lib0/array.js.map +1 -0
  100. package/dist/esm/node_modules/lib0/binary.js +30 -0
  101. package/dist/esm/node_modules/lib0/binary.js.map +1 -0
  102. package/dist/esm/node_modules/lib0/broadcastchannel.js +117 -0
  103. package/dist/esm/node_modules/lib0/broadcastchannel.js.map +1 -0
  104. package/dist/esm/node_modules/lib0/buffer.js +96 -0
  105. package/dist/esm/node_modules/lib0/buffer.js.map +1 -0
  106. package/dist/esm/node_modules/lib0/conditions.js +16 -0
  107. package/dist/esm/node_modules/lib0/conditions.js.map +1 -0
  108. package/dist/esm/node_modules/lib0/decoding.js +439 -0
  109. package/dist/esm/node_modules/lib0/decoding.js.map +1 -0
  110. package/dist/esm/node_modules/lib0/dom.js +48 -0
  111. package/dist/esm/node_modules/lib0/dom.js.map +1 -0
  112. package/dist/esm/node_modules/lib0/encoding.js +663 -0
  113. package/dist/esm/node_modules/lib0/encoding.js.map +1 -0
  114. package/dist/esm/node_modules/lib0/environment.js +121 -0
  115. package/dist/esm/node_modules/lib0/environment.js.map +1 -0
  116. package/dist/esm/node_modules/lib0/error.js +33 -0
  117. package/dist/esm/node_modules/lib0/error.js.map +1 -0
  118. package/dist/esm/node_modules/lib0/function.js +130 -0
  119. package/dist/esm/node_modules/lib0/function.js.map +1 -0
  120. package/dist/esm/node_modules/lib0/iterator.js +48 -0
  121. package/dist/esm/node_modules/lib0/iterator.js.map +1 -0
  122. package/dist/esm/node_modules/lib0/logging.common.js +52 -0
  123. package/dist/esm/node_modules/lib0/logging.common.js.map +1 -0
  124. package/dist/esm/node_modules/lib0/logging.js +115 -0
  125. package/dist/esm/node_modules/lib0/logging.js.map +1 -0
  126. package/dist/esm/node_modules/lib0/map.js +102 -0
  127. package/dist/esm/node_modules/lib0/map.js.map +1 -0
  128. package/dist/esm/node_modules/lib0/math.js +37 -0
  129. package/dist/esm/node_modules/lib0/math.js.map +1 -0
  130. package/dist/esm/node_modules/lib0/number.js +17 -0
  131. package/dist/esm/node_modules/lib0/number.js.map +1 -0
  132. package/dist/esm/node_modules/lib0/object.js +119 -0
  133. package/dist/esm/node_modules/lib0/object.js.map +1 -0
  134. package/dist/esm/node_modules/lib0/observable.js +165 -0
  135. package/dist/esm/node_modules/lib0/observable.js.map +1 -0
  136. package/dist/esm/node_modules/lib0/pair.js +30 -0
  137. package/dist/esm/node_modules/lib0/pair.js.map +1 -0
  138. package/dist/esm/node_modules/lib0/prng.js +87 -0
  139. package/dist/esm/node_modules/lib0/prng.js.map +1 -0
  140. package/dist/esm/node_modules/lib0/promise.js +31 -0
  141. package/dist/esm/node_modules/lib0/promise.js.map +1 -0
  142. package/dist/esm/node_modules/lib0/random.js +25 -0
  143. package/dist/esm/node_modules/lib0/random.js.map +1 -0
  144. package/dist/esm/node_modules/lib0/schema.js +1113 -0
  145. package/dist/esm/node_modules/lib0/schema.js.map +1 -0
  146. package/dist/esm/node_modules/lib0/set.js +10 -0
  147. package/dist/esm/node_modules/lib0/set.js.map +1 -0
  148. package/dist/esm/node_modules/lib0/storage.js +75 -0
  149. package/dist/esm/node_modules/lib0/storage.js.map +1 -0
  150. package/dist/esm/node_modules/lib0/string.js +85 -0
  151. package/dist/esm/node_modules/lib0/string.js.map +1 -0
  152. package/dist/esm/node_modules/lib0/symbol.js +13 -0
  153. package/dist/esm/node_modules/lib0/symbol.js.map +1 -0
  154. package/dist/esm/node_modules/lib0/time.js +16 -0
  155. package/dist/esm/node_modules/lib0/time.js.map +1 -0
  156. package/dist/esm/node_modules/lib0/trait/equality.js +29 -0
  157. package/dist/esm/node_modules/lib0/trait/equality.js.map +1 -0
  158. package/dist/esm/node_modules/lib0/url.js +18 -0
  159. package/dist/esm/node_modules/lib0/url.js.map +1 -0
  160. package/dist/esm/node_modules/lib0/webcrypto.js +6 -0
  161. package/dist/esm/node_modules/lib0/webcrypto.js.map +1 -0
  162. package/dist/esm/node_modules/y-protocols/auth.js +24 -0
  163. package/dist/esm/node_modules/y-protocols/auth.js.map +1 -0
  164. package/dist/esm/node_modules/y-protocols/awareness.js +271 -0
  165. package/dist/esm/node_modules/y-protocols/awareness.js.map +1 -0
  166. package/dist/esm/node_modules/y-protocols/sync.js +138 -0
  167. package/dist/esm/node_modules/y-protocols/sync.js.map +1 -0
  168. package/dist/esm/node_modules/y-websocket/src/y-websocket.js +515 -0
  169. package/dist/esm/node_modules/y-websocket/src/y-websocket.js.map +1 -0
  170. package/dist/esm/node_modules/yjs/dist/yjs.js +10295 -0
  171. package/dist/esm/node_modules/yjs/dist/yjs.js.map +1 -0
  172. package/dist/esm/packages/ui/dist/index.js +65571 -0
  173. package/dist/esm/packages/ui/dist/index.js.map +1 -0
  174. package/dist/esm/pixel/PixelEditor.js +3 -3
  175. package/dist/esm/pixel/PixelEditorMenuBar.js +2 -2
  176. package/dist/esm/pixel/PixelEditorRightPanel.js +3 -3
  177. package/dist/esm/pixel/PixelEditorTimeline.js +2 -2
  178. package/dist/esm/pixel/PixelEditorToolbar.js +2 -2
  179. package/dist/esm/pixel/SpriteGeneratorPanel.js +8 -8
  180. package/dist/esm/vector/VectorEditor.js +3 -3
  181. package/dist/esm/vector/VectorEditorMenuBar.js +3 -3
  182. package/dist/esm/vector/VectorEditorRightPanel.js +13 -13
  183. package/package.json +1 -1
@@ -0,0 +1,688 @@
1
+ 'use strict';
2
+
3
+ var math = require('./math.js');
4
+ var number = require('./number.js');
5
+ var binary = require('./binary.js');
6
+ var string = require('./string.js');
7
+ var array = require('./array.js');
8
+
9
+ /**
10
+ * Efficient schema-less binary encoding with support for variable length encoding.
11
+ *
12
+ * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.
13
+ *
14
+ * Encodes numbers in little-endian order (least to most significant byte order)
15
+ * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)
16
+ * which is also used in Protocol Buffers.
17
+ *
18
+ * ```js
19
+ * // encoding step
20
+ * const encoder = encoding.createEncoder()
21
+ * encoding.writeVarUint(encoder, 256)
22
+ * encoding.writeVarString(encoder, 'Hello world!')
23
+ * const buf = encoding.toUint8Array(encoder)
24
+ * ```
25
+ *
26
+ * ```js
27
+ * // decoding step
28
+ * const decoder = decoding.createDecoder(buf)
29
+ * decoding.readVarUint(decoder) // => 256
30
+ * decoding.readVarString(decoder) // => 'Hello world!'
31
+ * decoding.hasContent(decoder) // => false - all data is read
32
+ * ```
33
+ *
34
+ * @module encoding
35
+ */
36
+
37
+
38
+ /**
39
+ * A BinaryEncoder handles the encoding to an Uint8Array.
40
+ */
41
+ class Encoder {
42
+ constructor () {
43
+ this.cpos = 0;
44
+ this.cbuf = new Uint8Array(100);
45
+ /**
46
+ * @type {Array<Uint8Array>}
47
+ */
48
+ this.bufs = [];
49
+ }
50
+ }
51
+
52
+ /**
53
+ * @function
54
+ * @return {Encoder}
55
+ */
56
+ const createEncoder = () => new Encoder();
57
+
58
+ /**
59
+ * The current length of the encoded data.
60
+ *
61
+ * @function
62
+ * @param {Encoder} encoder
63
+ * @return {number}
64
+ */
65
+ const length = encoder => {
66
+ let len = encoder.cpos;
67
+ for (let i = 0; i < encoder.bufs.length; i++) {
68
+ len += encoder.bufs[i].length;
69
+ }
70
+ return len
71
+ };
72
+
73
+ /**
74
+ * Transform to Uint8Array.
75
+ *
76
+ * @function
77
+ * @param {Encoder} encoder
78
+ * @return {Uint8Array<ArrayBuffer>} The created ArrayBuffer.
79
+ */
80
+ const toUint8Array = encoder => {
81
+ const uint8arr = new Uint8Array(length(encoder));
82
+ let curPos = 0;
83
+ for (let i = 0; i < encoder.bufs.length; i++) {
84
+ const d = encoder.bufs[i];
85
+ uint8arr.set(d, curPos);
86
+ curPos += d.length;
87
+ }
88
+ uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos);
89
+ return uint8arr
90
+ };
91
+
92
+ /**
93
+ * Verify that it is possible to write `len` bytes wtihout checking. If
94
+ * necessary, a new Buffer with the required length is attached.
95
+ *
96
+ * @param {Encoder} encoder
97
+ * @param {number} len
98
+ */
99
+ const verifyLen = (encoder, len) => {
100
+ const bufferLen = encoder.cbuf.length;
101
+ if (bufferLen - encoder.cpos < len) {
102
+ encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos));
103
+ encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2);
104
+ encoder.cpos = 0;
105
+ }
106
+ };
107
+
108
+ /**
109
+ * Write one byte to the encoder.
110
+ *
111
+ * @function
112
+ * @param {Encoder} encoder
113
+ * @param {number} num The byte that is to be encoded.
114
+ */
115
+ const write = (encoder, num) => {
116
+ const bufferLen = encoder.cbuf.length;
117
+ if (encoder.cpos === bufferLen) {
118
+ encoder.bufs.push(encoder.cbuf);
119
+ encoder.cbuf = new Uint8Array(bufferLen * 2);
120
+ encoder.cpos = 0;
121
+ }
122
+ encoder.cbuf[encoder.cpos++] = num;
123
+ };
124
+
125
+ /**
126
+ * Write one byte as an unsigned integer.
127
+ *
128
+ * @function
129
+ * @param {Encoder} encoder
130
+ * @param {number} num The number that is to be encoded.
131
+ */
132
+ const writeUint8 = write;
133
+
134
+ /**
135
+ * Write a variable length unsigned integer. Max encodable integer is 2^53.
136
+ *
137
+ * @function
138
+ * @param {Encoder} encoder
139
+ * @param {number} num The number that is to be encoded.
140
+ */
141
+ const writeVarUint = (encoder, num) => {
142
+ while (num > binary.BITS7) {
143
+ write(encoder, binary.BIT8 | (binary.BITS7 & num));
144
+ num = math.floor(num / 128); // shift >>> 7
145
+ }
146
+ write(encoder, binary.BITS7 & num);
147
+ };
148
+
149
+ /**
150
+ * Write a variable length integer.
151
+ *
152
+ * We use the 7th bit instead for signaling that this is a negative number.
153
+ *
154
+ * @function
155
+ * @param {Encoder} encoder
156
+ * @param {number} num The number that is to be encoded.
157
+ */
158
+ const writeVarInt = (encoder, num) => {
159
+ const isNegative = math.isNegativeZero(num);
160
+ if (isNegative) {
161
+ num = -num;
162
+ }
163
+ // |- whether to continue reading |- whether is negative |- number
164
+ write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num));
165
+ num = math.floor(num / 64); // shift >>> 6
166
+ // We don't need to consider the case of num === 0 so we can use a different
167
+ // pattern here than above.
168
+ while (num > 0) {
169
+ write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num));
170
+ num = math.floor(num / 128); // shift >>> 7
171
+ }
172
+ };
173
+
174
+ /**
175
+ * A cache to store strings temporarily
176
+ */
177
+ const _strBuffer = new Uint8Array(30000);
178
+ const _maxStrBSize = _strBuffer.length / 3;
179
+
180
+ /**
181
+ * Write a variable length string.
182
+ *
183
+ * @function
184
+ * @param {Encoder} encoder
185
+ * @param {String} str The string that is to be encoded.
186
+ */
187
+ const _writeVarStringNative = (encoder, str) => {
188
+ if (str.length < _maxStrBSize) {
189
+ // We can encode the string into the existing buffer
190
+ /* c8 ignore next */
191
+ const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0;
192
+ writeVarUint(encoder, written);
193
+ for (let i = 0; i < written; i++) {
194
+ write(encoder, _strBuffer[i]);
195
+ }
196
+ } else {
197
+ writeVarUint8Array(encoder, string.encodeUtf8(str));
198
+ }
199
+ };
200
+
201
+ /**
202
+ * Write a variable length string.
203
+ *
204
+ * @function
205
+ * @param {Encoder} encoder
206
+ * @param {String} str The string that is to be encoded.
207
+ */
208
+ const _writeVarStringPolyfill = (encoder, str) => {
209
+ const encodedString = unescape(encodeURIComponent(str));
210
+ const len = encodedString.length;
211
+ writeVarUint(encoder, len);
212
+ for (let i = 0; i < len; i++) {
213
+ write(encoder, /** @type {number} */ (encodedString.codePointAt(i)));
214
+ }
215
+ };
216
+
217
+ /**
218
+ * Write a variable length string.
219
+ *
220
+ * @function
221
+ * @param {Encoder} encoder
222
+ * @param {String} str The string that is to be encoded.
223
+ */
224
+ /* c8 ignore next */
225
+ const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill;
226
+
227
+ /**
228
+ * Write the content of another Encoder.
229
+ *
230
+ * @TODO: can be improved!
231
+ * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.
232
+ * Encoders start with a rather big initial buffer.
233
+ *
234
+ * @function
235
+ * @param {Encoder} encoder The enUint8Arr
236
+ * @param {Encoder} append The BinaryEncoder to be written.
237
+ */
238
+ const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append));
239
+
240
+ /**
241
+ * Append fixed-length Uint8Array to the encoder.
242
+ *
243
+ * @function
244
+ * @param {Encoder} encoder
245
+ * @param {Uint8Array} uint8Array
246
+ */
247
+ const writeUint8Array = (encoder, uint8Array) => {
248
+ const bufferLen = encoder.cbuf.length;
249
+ const cpos = encoder.cpos;
250
+ const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length);
251
+ const rightCopyLen = uint8Array.length - leftCopyLen;
252
+ encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos);
253
+ encoder.cpos += leftCopyLen;
254
+ if (rightCopyLen > 0) {
255
+ // Still something to write, write right half..
256
+ // Append new buffer
257
+ encoder.bufs.push(encoder.cbuf);
258
+ // must have at least size of remaining buffer
259
+ encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen));
260
+ // copy array
261
+ encoder.cbuf.set(uint8Array.subarray(leftCopyLen));
262
+ encoder.cpos = rightCopyLen;
263
+ }
264
+ };
265
+
266
+ /**
267
+ * Append an Uint8Array to Encoder.
268
+ *
269
+ * @function
270
+ * @param {Encoder} encoder
271
+ * @param {Uint8Array} uint8Array
272
+ */
273
+ const writeVarUint8Array = (encoder, uint8Array) => {
274
+ writeVarUint(encoder, uint8Array.byteLength);
275
+ writeUint8Array(encoder, uint8Array);
276
+ };
277
+
278
+ /**
279
+ * Create an DataView of the next `len` bytes. Use it to write data after
280
+ * calling this function.
281
+ *
282
+ * ```js
283
+ * // write float32 using DataView
284
+ * const dv = writeOnDataView(encoder, 4)
285
+ * dv.setFloat32(0, 1.1)
286
+ * // read float32 using DataView
287
+ * const dv = readFromDataView(encoder, 4)
288
+ * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)
289
+ * ```
290
+ *
291
+ * @param {Encoder} encoder
292
+ * @param {number} len
293
+ * @return {DataView}
294
+ */
295
+ const writeOnDataView = (encoder, len) => {
296
+ verifyLen(encoder, len);
297
+ const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len);
298
+ encoder.cpos += len;
299
+ return dview
300
+ };
301
+
302
+ /**
303
+ * @param {Encoder} encoder
304
+ * @param {number} num
305
+ */
306
+ const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false);
307
+
308
+ /**
309
+ * @param {Encoder} encoder
310
+ * @param {number} num
311
+ */
312
+ const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false);
313
+
314
+ /**
315
+ * @param {Encoder} encoder
316
+ * @param {bigint} num
317
+ */
318
+ const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false);
319
+
320
+ const floatTestBed = new DataView(new ArrayBuffer(4));
321
+ /**
322
+ * Check if a number can be encoded as a 32 bit float.
323
+ *
324
+ * @param {number} num
325
+ * @return {boolean}
326
+ */
327
+ const isFloat32 = num => {
328
+ floatTestBed.setFloat32(0, num);
329
+ return floatTestBed.getFloat32(0) === num
330
+ };
331
+
332
+ /**
333
+ * @typedef {Array<AnyEncodable>} AnyEncodableArray
334
+ */
335
+
336
+ /**
337
+ * @typedef {undefined|null|number|bigint|boolean|string|{[k:string]:AnyEncodable}|AnyEncodableArray|Uint8Array} AnyEncodable
338
+ */
339
+
340
+ /**
341
+ * Encode data with efficient binary format.
342
+ *
343
+ * Differences to JSON:
344
+ * • Transforms data to a binary format (not to a string)
345
+ * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)
346
+ * • Numbers are efficiently encoded either as a variable length integer, as a
347
+ * 32 bit float, as a 64 bit float, or as a 64 bit bigint.
348
+ *
349
+ * Encoding table:
350
+ *
351
+ * | Data Type | Prefix | Encoding Method | Comment |
352
+ * | ------------------- | -------- | ------------------ | ------- |
353
+ * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |
354
+ * | null | 126 | | |
355
+ * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |
356
+ * | float32 | 124 | writeFloat32 | |
357
+ * | float64 | 123 | writeFloat64 | |
358
+ * | bigint | 122 | writeBigInt64 | |
359
+ * | boolean (false) | 121 | | True and false are different data types so we save the following byte |
360
+ * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |
361
+ * | string | 119 | writeVarString | |
362
+ * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |
363
+ * | array<any> | 117 | custom | Writes {length} then {length} json values |
364
+ * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |
365
+ *
366
+ * Reasons for the decreasing prefix:
367
+ * We need the first bit for extendability (later we may want to encode the
368
+ * prefix with writeVarUint). The remaining 7 bits are divided as follows:
369
+ * [0-30] the beginning of the data range is used for custom purposes
370
+ * (defined by the function that uses this library)
371
+ * [31-127] the end of the data range is used for data encoding by
372
+ * lib0/encoding.js
373
+ *
374
+ * @param {Encoder} encoder
375
+ * @param {AnyEncodable} data
376
+ */
377
+ const writeAny = (encoder, data) => {
378
+ switch (typeof data) {
379
+ case 'string':
380
+ // TYPE 119: STRING
381
+ write(encoder, 119);
382
+ writeVarString(encoder, data);
383
+ break
384
+ case 'number':
385
+ if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {
386
+ // TYPE 125: INTEGER
387
+ write(encoder, 125);
388
+ writeVarInt(encoder, data);
389
+ } else if (isFloat32(data)) {
390
+ // TYPE 124: FLOAT32
391
+ write(encoder, 124);
392
+ writeFloat32(encoder, data);
393
+ } else {
394
+ // TYPE 123: FLOAT64
395
+ write(encoder, 123);
396
+ writeFloat64(encoder, data);
397
+ }
398
+ break
399
+ case 'bigint':
400
+ // TYPE 122: BigInt
401
+ write(encoder, 122);
402
+ writeBigInt64(encoder, data);
403
+ break
404
+ case 'object':
405
+ if (data === null) {
406
+ // TYPE 126: null
407
+ write(encoder, 126);
408
+ } else if (array.isArray(data)) {
409
+ // TYPE 117: Array
410
+ write(encoder, 117);
411
+ writeVarUint(encoder, data.length);
412
+ for (let i = 0; i < data.length; i++) {
413
+ writeAny(encoder, data[i]);
414
+ }
415
+ } else if (data instanceof Uint8Array) {
416
+ // TYPE 116: ArrayBuffer
417
+ write(encoder, 116);
418
+ writeVarUint8Array(encoder, data);
419
+ } else {
420
+ // TYPE 118: Object
421
+ write(encoder, 118);
422
+ const keys = Object.keys(data);
423
+ writeVarUint(encoder, keys.length);
424
+ for (let i = 0; i < keys.length; i++) {
425
+ const key = keys[i];
426
+ writeVarString(encoder, key);
427
+ writeAny(encoder, data[key]);
428
+ }
429
+ }
430
+ break
431
+ case 'boolean':
432
+ // TYPE 120/121: boolean (true/false)
433
+ write(encoder, data ? 120 : 121);
434
+ break
435
+ default:
436
+ // TYPE 127: undefined
437
+ write(encoder, 127);
438
+ }
439
+ };
440
+
441
+ /**
442
+ * Now come a few stateful encoder that have their own classes.
443
+ */
444
+
445
+ /**
446
+ * Basic Run Length Encoder - a basic compression implementation.
447
+ *
448
+ * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.
449
+ *
450
+ * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf
451
+ *
452
+ * @note T must not be null!
453
+ *
454
+ * @template T
455
+ */
456
+ class RleEncoder extends Encoder {
457
+ /**
458
+ * @param {function(Encoder, T):void} writer
459
+ */
460
+ constructor (writer) {
461
+ super();
462
+ /**
463
+ * The writer
464
+ */
465
+ this.w = writer;
466
+ /**
467
+ * Current state
468
+ * @type {T|null}
469
+ */
470
+ this.s = null;
471
+ this.count = 0;
472
+ }
473
+
474
+ /**
475
+ * @param {T} v
476
+ */
477
+ write (v) {
478
+ if (this.s === v) {
479
+ this.count++;
480
+ } else {
481
+ if (this.count > 0) {
482
+ // flush counter, unless this is the first value (count = 0)
483
+ writeVarUint(this, this.count - 1); // since count is always > 0, we can decrement by one. non-standard encoding ftw
484
+ }
485
+ this.count = 1;
486
+ // write first value
487
+ this.w(this, v);
488
+ this.s = v;
489
+ }
490
+ }
491
+ }
492
+
493
+ /**
494
+ * @param {UintOptRleEncoder} encoder
495
+ */
496
+ const flushUintOptRleEncoder = encoder => {
497
+ if (encoder.count > 0) {
498
+ // flush counter, unless this is the first value (count = 0)
499
+ // case 1: just a single value. set sign to positive
500
+ // case 2: write several values. set sign to negative to indicate that there is a length coming
501
+ writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s);
502
+ if (encoder.count > 1) {
503
+ writeVarUint(encoder.encoder, encoder.count - 2); // since count is always > 1, we can decrement by one. non-standard encoding ftw
504
+ }
505
+ }
506
+ };
507
+
508
+ /**
509
+ * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.
510
+ *
511
+ * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write
512
+ * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.
513
+ *
514
+ * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)
515
+ */
516
+ class UintOptRleEncoder {
517
+ constructor () {
518
+ this.encoder = new Encoder();
519
+ /**
520
+ * @type {number}
521
+ */
522
+ this.s = 0;
523
+ this.count = 0;
524
+ }
525
+
526
+ /**
527
+ * @param {number} v
528
+ */
529
+ write (v) {
530
+ if (this.s === v) {
531
+ this.count++;
532
+ } else {
533
+ flushUintOptRleEncoder(this);
534
+ this.count = 1;
535
+ this.s = v;
536
+ }
537
+ }
538
+
539
+ /**
540
+ * Flush the encoded state and transform this to a Uint8Array.
541
+ *
542
+ * Note that this should only be called once.
543
+ */
544
+ toUint8Array () {
545
+ flushUintOptRleEncoder(this);
546
+ return toUint8Array(this.encoder)
547
+ }
548
+ }
549
+
550
+ /**
551
+ * @param {IntDiffOptRleEncoder} encoder
552
+ */
553
+ const flushIntDiffOptRleEncoder = encoder => {
554
+ if (encoder.count > 0) {
555
+ // 31 bit making up the diff | wether to write the counter
556
+ // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)
557
+ const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1);
558
+ // flush counter, unless this is the first value (count = 0)
559
+ // case 1: just a single value. set first bit to positive
560
+ // case 2: write several values. set first bit to negative to indicate that there is a length coming
561
+ writeVarInt(encoder.encoder, encodedDiff);
562
+ if (encoder.count > 1) {
563
+ writeVarUint(encoder.encoder, encoder.count - 2); // since count is always > 1, we can decrement by one. non-standard encoding ftw
564
+ }
565
+ }
566
+ };
567
+
568
+ /**
569
+ * A combination of the IntDiffEncoder and the UintOptRleEncoder.
570
+ *
571
+ * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes
572
+ * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!
573
+ *
574
+ * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])
575
+ *
576
+ * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:
577
+ * * 1 bit that denotes whether the next value is a count (LSB)
578
+ * * 1 bit that denotes whether this value is negative (MSB - 1)
579
+ * * 1 bit that denotes whether to continue reading the variable length integer (MSB)
580
+ *
581
+ * Therefore, only five bits remain to encode diff ranges.
582
+ *
583
+ * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.
584
+ */
585
+ class IntDiffOptRleEncoder {
586
+ constructor () {
587
+ this.encoder = new Encoder();
588
+ /**
589
+ * @type {number}
590
+ */
591
+ this.s = 0;
592
+ this.count = 0;
593
+ this.diff = 0;
594
+ }
595
+
596
+ /**
597
+ * @param {number} v
598
+ */
599
+ write (v) {
600
+ if (this.diff === v - this.s) {
601
+ this.s = v;
602
+ this.count++;
603
+ } else {
604
+ flushIntDiffOptRleEncoder(this);
605
+ this.count = 1;
606
+ this.diff = v - this.s;
607
+ this.s = v;
608
+ }
609
+ }
610
+
611
+ /**
612
+ * Flush the encoded state and transform this to a Uint8Array.
613
+ *
614
+ * Note that this should only be called once.
615
+ */
616
+ toUint8Array () {
617
+ flushIntDiffOptRleEncoder(this);
618
+ return toUint8Array(this.encoder)
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Optimized String Encoder.
624
+ *
625
+ * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.
626
+ * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).
627
+ *
628
+ * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.
629
+ *
630
+ * The lengths are encoded using a UintOptRleEncoder.
631
+ */
632
+ class StringEncoder {
633
+ constructor () {
634
+ /**
635
+ * @type {Array<string>}
636
+ */
637
+ this.sarr = [];
638
+ this.s = '';
639
+ this.lensE = new UintOptRleEncoder();
640
+ }
641
+
642
+ /**
643
+ * @param {string} string
644
+ */
645
+ write (string) {
646
+ this.s += string;
647
+ if (this.s.length > 19) {
648
+ this.sarr.push(this.s);
649
+ this.s = '';
650
+ }
651
+ this.lensE.write(string.length);
652
+ }
653
+
654
+ toUint8Array () {
655
+ const encoder = new Encoder();
656
+ this.sarr.push(this.s);
657
+ this.s = '';
658
+ writeVarString(encoder, this.sarr.join(''));
659
+ writeUint8Array(encoder, this.lensE.toUint8Array());
660
+ return toUint8Array(encoder)
661
+ }
662
+ }
663
+
664
+ exports.Encoder = Encoder;
665
+ exports.IntDiffOptRleEncoder = IntDiffOptRleEncoder;
666
+ exports.RleEncoder = RleEncoder;
667
+ exports.StringEncoder = StringEncoder;
668
+ exports.UintOptRleEncoder = UintOptRleEncoder;
669
+ exports._writeVarStringNative = _writeVarStringNative;
670
+ exports._writeVarStringPolyfill = _writeVarStringPolyfill;
671
+ exports.createEncoder = createEncoder;
672
+ exports.length = length;
673
+ exports.toUint8Array = toUint8Array;
674
+ exports.verifyLen = verifyLen;
675
+ exports.write = write;
676
+ exports.writeAny = writeAny;
677
+ exports.writeBigInt64 = writeBigInt64;
678
+ exports.writeBinaryEncoder = writeBinaryEncoder;
679
+ exports.writeFloat32 = writeFloat32;
680
+ exports.writeFloat64 = writeFloat64;
681
+ exports.writeOnDataView = writeOnDataView;
682
+ exports.writeUint8 = writeUint8;
683
+ exports.writeUint8Array = writeUint8Array;
684
+ exports.writeVarInt = writeVarInt;
685
+ exports.writeVarString = writeVarString;
686
+ exports.writeVarUint = writeVarUint;
687
+ exports.writeVarUint8Array = writeVarUint8Array;
688
+ //# sourceMappingURL=encoding.js.map