zkjson 0.4.1 → 0.5.0

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.
@@ -0,0 +1,425 @@
1
+ const { bits, tobits } = require("./utils.js")
2
+ function add(arr, currBitLen, value, valueWidth) {
3
+ const mask = valueWidth >= 32 ? 0xffffffff : (1 << valueWidth) - 1
4
+ value &= mask
5
+ const used = currBitLen & 31
6
+
7
+ const free = used === 0 ? 32 : 32 - used
8
+ if (valueWidth <= free) {
9
+ if (used === 0) arr.push(value)
10
+ else arr[arr.length - 1] = (arr[arr.length - 1] << valueWidth) | value
11
+ return currBitLen + valueWidth
12
+ }
13
+ const high = value >>> (valueWidth - free)
14
+ if (used === 0) arr.push(high)
15
+ else arr[arr.length - 1] = (arr[arr.length - 1] << free) | high
16
+ currBitLen += free
17
+ let remaining = valueWidth - free
18
+ if (remaining <= 32) {
19
+ arr.push(value & ((1 << remaining) - 1))
20
+ return currBitLen + remaining
21
+ }
22
+ while (remaining > 32) {
23
+ arr.push((value >>> (remaining - 32)) & 0xffffffff)
24
+ currBitLen += 32
25
+ remaining -= 32
26
+ }
27
+ if (remaining > 0) {
28
+ arr.push(value & ((1 << remaining) - 1))
29
+ currBitLen += remaining
30
+ }
31
+ return currBitLen
32
+ }
33
+
34
+ class u8 {
35
+ constructor(size = 1000, log = false) {
36
+ this.size = size
37
+ this.log = log
38
+ this.obj = new Uint8Array(size)
39
+ this.dic = new Uint8Array(size)
40
+ this.len = 0
41
+ this.tlen = 0
42
+ this.dlen = 0
43
+ this.jlen = 0
44
+ this.dcount = 0
45
+ this.rcount = 0
46
+ this.tcount = 0
47
+ this.dlinks = []
48
+ this.dlinks_len = 0
49
+ this.types = []
50
+ this.types_len = 0
51
+ this.keys = []
52
+ this.keys_len = 0
53
+ this.indexes = []
54
+ this.indexes_len = 0
55
+ this.dc = []
56
+ this.dc_len = 0
57
+ this.nums = []
58
+ this.nums_len = 0
59
+ this.dvals = []
60
+ this.dvals_len = 0
61
+ this.oid = 0
62
+ this.iid = 0
63
+ }
64
+ push_dlink(v, flag = 0) {
65
+ const d = bits(this.dcount + 1)
66
+ this.dlinks_len = add(this.dlinks, this.dlinks_len, flag, 1)
67
+ this.dlinks_len = add(this.dlinks, this.dlinks_len, v, d)
68
+ if (flag === 1) this.rcount++
69
+ }
70
+ push_type(v) {
71
+ let count = this.tcount
72
+ if (count > 3) {
73
+ this.types_len = add(this.types, this.types_len, 0, 3)
74
+ if (count < 16) {
75
+ const d = count < 4 ? 2 : bits(count)
76
+ this.types_len = add(this.types, this.types_len, d - 2, 2)
77
+ this.types_len = add(this.types, this.types_len, count, d)
78
+ } else {
79
+ this.types_len = add(this.types, this.types_len, 3, 2)
80
+ while (count >= 128) {
81
+ this.types_len = add(
82
+ this.types,
83
+ this.types_len,
84
+ (count & 0x7f) | 0x80,
85
+ 8,
86
+ )
87
+ count >>>= 7
88
+ }
89
+ this.types_len = add(this.types, this.types_len, count, 8)
90
+ }
91
+ this.types_len = add(this.types, this.types_len, v, 3)
92
+ } else {
93
+ for (let i = 0; i < count; i++) {
94
+ this.types_len = add(this.types, this.types_len, v, 3)
95
+ }
96
+ }
97
+ this.tcount = 1
98
+ }
99
+ push_keylen(v) {
100
+ if (v < 16) {
101
+ const d = v < 4 ? 2 : bits(v)
102
+ this.keys_len = add(this.keys, this.keys_len, d - 2, 2)
103
+ this.keys_len = add(this.keys, this.keys_len, v, d)
104
+ } else {
105
+ this.keys_len = add(this.keys, this.keys_len, 3, 2)
106
+ while (v >= 128) {
107
+ this.keys_len = add(this.keys, this.keys_len, (v & 0x7f) | 0x80, 8)
108
+ v >>>= 7
109
+ }
110
+ this.keys_len = add(this.keys, this.keys_len, v, 8)
111
+ }
112
+ }
113
+ push_index(v) {
114
+ if (v < 16) {
115
+ const d = v < 4 ? 2 : bits(v)
116
+ this.indexes_len = add(this.indexes, this.indexes_len, d - 2, 2)
117
+ this.indexes_len = add(this.indexes, this.indexes_len, v, d)
118
+ } else {
119
+ this.indexes_len = add(this.indexes, this.indexes_len, 3, 2)
120
+ while (v >= 128) {
121
+ this.indexes_len = add(
122
+ this.indexes,
123
+ this.indexes_len,
124
+ (v & 0x7f) | 0x80,
125
+ 8,
126
+ )
127
+ v >>>= 7
128
+ }
129
+ this.indexes_len = add(this.indexes, this.indexes_len, v, 8)
130
+ }
131
+ }
132
+
133
+ push_int(v) {
134
+ if (v < 64) {
135
+ const d = v < 8 ? 3 : v < 16 ? 4 : 6
136
+ const flag = v < 8 ? 0 : v < 16 ? 1 : 2
137
+ this.nums_len = add(this.nums, this.nums_len, flag, 2)
138
+ this.nums_len = add(this.nums, this.nums_len, v, d)
139
+ } else {
140
+ this.nums_len = add(this.nums, this.nums_len, 3, 2)
141
+ while (v >= 128) {
142
+ this.nums_len = add(this.nums, this.nums_len, (v & 0x7f) | 0x80, 8)
143
+ v >>>= 7
144
+ }
145
+ this.nums_len = add(this.nums, this.nums_len, v, 8)
146
+ }
147
+ }
148
+ push_float(neg, v) {
149
+ if (v < 4) this.push_int(neg ? 4 + v : v)
150
+ else this.push_int(neg ? 4 : 0)
151
+ }
152
+
153
+ calc_dcount() {
154
+ const v = this.rcount
155
+ if (v < 16) {
156
+ const d = v < 4 ? 2 : bits(v)
157
+ this.dc_len = add(this.dc, this.dc_len, d - 2, 2)
158
+ this.dc_len = add(this.dc, this.dc_len, v, d)
159
+ } else {
160
+ this.dc_len = add(this.dc, this.dc_len, 3, 2)
161
+ while (v >= 128) {
162
+ this.dc_len = add(this.dc, this.dc_len, (v & 0x7f) | 0x80, 8)
163
+ v >>>= 7
164
+ }
165
+ this.dc_len = add(this.dc, this.dc_len, v, 8)
166
+ }
167
+ }
168
+ reset() {
169
+ this.len = 0
170
+ this.tlen = 0
171
+ this.dlen = 0
172
+ this.jlen = 0
173
+ this.dcount = 0
174
+ this.rcount = 0
175
+ this.tcount = 0
176
+ this.dlinks = []
177
+ this.dlinks_len = 0
178
+ this.types = []
179
+ this.types_len = 0
180
+ this.keys = []
181
+ this.keys_len = 0
182
+ this.indexes = []
183
+ this.indexes_len = 0
184
+ this.dc = []
185
+ this.dc_len = 0
186
+ this.nums = []
187
+ this.nums_len = 0
188
+ this.dvals = []
189
+ this.dvals_len = 0
190
+ this.oid = 0
191
+ this.iid = 0
192
+ }
193
+ push_d(v) {
194
+ this.dic[this.dlen++] = v
195
+ }
196
+
197
+ push(v) {
198
+ this.obj[this.len++] = v
199
+ }
200
+ to128_d(n) {
201
+ while (n >= 128) {
202
+ this.dic[this.dlen++] = (n & 0x7f) | 0x80
203
+ n >>>= 7
204
+ }
205
+ this.dic[this.dlen++] = n
206
+ }
207
+
208
+ to128(n) {
209
+ while (n >= 128) {
210
+ this.obj[this.len++] = (n & 0x7f) | 0x80
211
+ n >>>= 7
212
+ }
213
+ this.obj[this.len++] = n
214
+ }
215
+ copy() {
216
+ this.obj.set(this.temp.subarray(0, this.tlen), this.len)
217
+ this.len += this.tlen
218
+ }
219
+
220
+ dump() {
221
+ this.calc_dcount()
222
+ let total = 0
223
+ if (this.log) {
224
+ console.log(total, "rcount", this.dc, this.dc_len, this.rcount)
225
+ total += this.dc_len
226
+ console.log(total, "dlinks", this.dlinks, this.dlinks_len)
227
+ total += this.dlinks_len
228
+ console.log(total, "keylens", this.keys, this.keys_len)
229
+ total += this.keys_len
230
+ console.log(total, "types", this.types, this.types_len)
231
+ total += this.types_len
232
+ console.log(total, "nums", this.nums, this.nums_len)
233
+ total += this.nums_len
234
+ console.log(total, "indexes", this.indexes, this.indexes_len)
235
+ total += this.indexes_len
236
+ }
237
+ const _total =
238
+ this.dc_len +
239
+ this.dlinks_len +
240
+ this.types_len +
241
+ this.keys_len +
242
+ this.nums_len +
243
+ this.indexes_len
244
+
245
+ const pad_len = (8 - (_total % 8)) % 8
246
+ if (this.log) {
247
+ console.log(total, "pad", 0, pad_len)
248
+ total += pad_len
249
+ }
250
+ const bit_len = (_total + pad_len) / 8
251
+ const len = bit_len + this.len + this.dlen
252
+ const arr = new Uint8Array(len)
253
+
254
+ let outIndex = 0
255
+ let accumulator = 0
256
+ let accBits = 0
257
+
258
+ function writeNumberBits(num, bitsLength) {
259
+ while (bitsLength > 0) {
260
+ const free = 8 - accBits
261
+ if (bitsLength <= free) {
262
+ accumulator =
263
+ (accumulator << bitsLength) | (num & ((1 << bitsLength) - 1))
264
+ accBits += bitsLength
265
+ bitsLength = 0
266
+ if (accBits === 8) {
267
+ arr[outIndex++] = accumulator
268
+ accumulator = 0
269
+ accBits = 0
270
+ }
271
+ } else {
272
+ const shift = bitsLength - free
273
+ const part = num >> shift
274
+ accumulator = (accumulator << free) | (part & ((1 << free) - 1))
275
+ arr[outIndex++] = accumulator
276
+ num = num & ((1 << shift) - 1)
277
+ bitsLength -= free
278
+ accumulator = 0
279
+ accBits = 0
280
+ }
281
+ }
282
+ }
283
+
284
+ function writeBits(valueArray, bitsLength) {
285
+ let remaining = bitsLength
286
+ for (let i = 0; i < valueArray.length; i++) {
287
+ const bitsForThis = remaining > 32 ? 32 : remaining
288
+ writeNumberBits(valueArray[i] >>> 0, bitsForThis)
289
+ remaining -= bitsForThis
290
+ }
291
+ }
292
+ writeBits(this.dc, this.dc_len)
293
+ writeBits(this.dlinks, this.dlinks_len)
294
+ writeBits(this.keys, this.keys_len)
295
+ writeBits(this.types, this.types_len)
296
+ writeBits(this.nums, this.nums_len)
297
+ writeBits(this.indexes, this.indexes_len)
298
+ if (pad_len > 0) writeBits([0], pad_len)
299
+ if (this.log) {
300
+ console.log()
301
+ console.log(total, "dic", this.dic.subarray(0, this.dlen))
302
+ total += this.dlen * 8
303
+ console.log()
304
+ console.log(total, "obj", this.obj.subarray(0, this.len))
305
+ console.log()
306
+ }
307
+ arr.set(this.dic.subarray(0, this.dlen), bit_len)
308
+ arr.set(this.obj.subarray(0, this.len), bit_len + this.dlen)
309
+ return arr
310
+ }
311
+ }
312
+
313
+ function pushPathStr(u, v2, prev = null) {
314
+ if (u.dcount > 0) u.push_dlink(prev === null ? 0 : prev + 1)
315
+ const len = v2.length
316
+ u.push_keylen(len + 2)
317
+ if (len === 0) u.push_d(1)
318
+ else for (let i = 0; i < len; i++) u.to128_d(v2.charCodeAt(i))
319
+ u.dcount++
320
+ }
321
+
322
+ function pushPathNum(u, v2, prev = null, keylen) {
323
+ if (u.dcount > 0) u.push_dlink(prev === null ? 0 : prev + 1)
324
+ u.push_keylen(keylen)
325
+ const id = keylen === 0 ? u.iid++ : u.oid++
326
+ u.push_index(id)
327
+ u.dcount++
328
+ }
329
+
330
+ function encode_x(v, u) {
331
+ u.reset()
332
+ u.push_type(_encode_x(v, u))
333
+ return u.dump()
334
+ }
335
+
336
+ function getPrecision(v) {
337
+ const s = v.toString()
338
+ const dot = s.indexOf(".")
339
+ if (dot === -1) return 0
340
+ const frac = s.slice(dot + 1).replace(/0+$/, "")
341
+ return frac.length
342
+ }
343
+
344
+ // 0: repeat, 1: null, 2: true, 3: false, 4: uint, 5: neg, 6: float, 7: str
345
+ function _encode_x(
346
+ v,
347
+ u,
348
+ plen = 0,
349
+ prev = null,
350
+ prev_type = null,
351
+ index = null,
352
+ ) {
353
+ if (typeof v === "number") {
354
+ if (prev !== null) u.push_dlink(prev + 1, 1)
355
+ // need various num types
356
+ let moved = v % 1 === v ? 0 : getPrecision(v)
357
+ const type = moved === 0 ? (v < 0 ? 5 : 4) : 6
358
+ if (prev_type !== null && prev_type !== 4) u.push_type(prev_type)
359
+ else u.tcount++
360
+ if (moved > 0) {
361
+ u.push_float(v < 0, moved + 1)
362
+ if (moved > 2) u.push_int(moved + 1)
363
+ }
364
+ u.push_int((v < 0 ? -1 : 1) * v * Math.pow(10, moved))
365
+ return type
366
+ } else if (typeof v === "boolean") {
367
+ if (prev !== null) u.push_dlink(prev + 1, 1)
368
+ const type = v ? 2 : 3
369
+ if (prev_type !== null && prev_type !== type) u.push_type(prev_type)
370
+ else u.tcount++
371
+ return type
372
+ } else if (v === null) {
373
+ if (prev !== null) u.push_dlink(prev + 1, 1)
374
+ if (prev_type !== null && prev_type !== 1) u.push_type(prev_type)
375
+ else u.tcount++
376
+ return 1
377
+ } else if (typeof v === "string") {
378
+ if (prev !== null) u.push_dlink(prev + 1, 1)
379
+ if (prev_type !== null && prev_type !== 7) u.push_type(prev_type)
380
+ else u.tcount++
381
+ const len = v.length
382
+ u.to128(len)
383
+ for (let i = 0; i < len; i++) u.to128(v.charCodeAt(i))
384
+ return 7
385
+ } else if (Array.isArray(v)) {
386
+ if (v.length === 0) {
387
+ if (prev !== null) u.push_dlink(prev + 1, 1)
388
+ u.push_type(prev_type)
389
+ u.push_float(false, 1)
390
+ return 6
391
+ } else {
392
+ const _prev = u.dcount
393
+ pushPathNum(u, index, prev, 0)
394
+ let i = 0
395
+ for (const v2 of v) {
396
+ prev_type = _encode_x(v2, u, plen + 1, _prev, prev_type, i)
397
+ i++
398
+ }
399
+ }
400
+ return prev_type
401
+ } else if (typeof v === "object") {
402
+ if (Object.keys(v).length === 0) {
403
+ if (prev !== null) u.push_dlink(prev + 1, 1)
404
+ u.push_type(prev_type)
405
+ u.push_float(true, 1)
406
+ return 6
407
+ } else {
408
+ pushPathNum(u, 0, prev, 1)
409
+ const __prev = u.dcount
410
+ for (const k in v) {
411
+ const _prev = u.dcount
412
+ pushPathStr(u, k, __prev - 1)
413
+ prev_type = _encode_x(v[k], u, plen + 1, _prev, prev_type)
414
+ }
415
+ return prev_type
416
+ }
417
+ }
418
+ }
419
+
420
+ function decode_x(v, d) {
421
+ d.decode(v)
422
+ return d.json
423
+ }
424
+
425
+ module.exports = { encode_x, decode_x, u8 }