cbor-x 1.3.1 → 1.4.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.
- package/LICENSE +21 -21
- package/README.md +347 -346
- package/SECURITY.md +11 -11
- package/benchmark.md +73 -73
- package/browser.js +11 -11
- package/decode.d.ts +2 -44
- package/decode.js +1169 -1160
- package/dist/index.js +2156 -2139
- package/dist/index.min.js +94 -83
- package/dist/node.cjs +2268 -2249
- package/dist/test.js +691 -1251
- package/encode.d.ts +1 -6
- package/encode.js +1041 -1033
- package/index.d.ts +61 -11
- package/index.js +3 -3
- package/iterators.js +85 -85
- package/node-index.js +24 -22
- package/package.json +82 -76
- package/rollup.config.js +45 -45
- package/stream.js +57 -57
- package/webpack.config.js +19 -19
- package/dist/index.js.map +0 -1
- package/dist/node-index.js +0 -93
package/dist/test.js
CHANGED
|
@@ -1,1267 +1,707 @@
|
|
|
1
|
-
(function (CBOR, chai) {
|
|
1
|
+
(function (CBOR, chai, fs) {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
chai = chai && Object.prototype.hasOwnProperty.call(chai, 'default') ? chai['default'] : chai;
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
ArticleId: "Qy3gwKWSoaWRmbmFEQA",
|
|
16
|
-
Authors: null,
|
|
17
|
-
CochraneID: null,
|
|
18
|
-
Confidential: false,
|
|
19
|
-
CorporateAuthor: null,
|
|
20
|
-
Country: "Bulgaria, Canada, Hungary, Israel, Norway, Slovakia, United Kingdom, United States",
|
|
21
|
-
CustomData: null,
|
|
22
|
-
DatabaseType: "ClinicalTrials.gov",
|
|
23
|
-
DOI: null,
|
|
24
|
-
EmbaseAccessionNumber: null,
|
|
25
|
-
Emtree: null,
|
|
26
|
-
ErrataText: null,
|
|
27
|
-
FullTextURL: null,
|
|
28
|
-
Institution: null,
|
|
29
|
-
ISSN: null,
|
|
30
|
-
Issue: null,
|
|
31
|
-
JournalTitle: null,
|
|
32
|
-
MedlineID: null,
|
|
33
|
-
MeSH: "Hypercholesterolemia|Antibodies, Monoclonal",
|
|
34
|
-
Pages: null,
|
|
35
|
-
ParentChildStatus: null,
|
|
36
|
-
ParentID: null,
|
|
37
|
-
PublicationDate: "March 21, 2017",
|
|
38
|
-
PublicationYear: 2017,
|
|
39
|
-
PubType: null,
|
|
40
|
-
ReferenceStudy: null,
|
|
41
|
-
SecondarySourceID: null,
|
|
42
|
-
Source: "Regeneron Pharmaceuticals",
|
|
43
|
-
SourceReferenceId: "NCT01926782",
|
|
44
|
-
TaStudyDesign: "Randomized",
|
|
45
|
-
Title: "A Randomized, Double-Blind, Placebo-Controlled Study to Evaluate the Efficacy and Safety of an Every Four Weeks Treatment Regimen of Alirocumab in Patients With Primary Hypercholesterolemia",
|
|
46
|
-
TrialOutcome: null,
|
|
47
|
-
Volume: null,
|
|
48
|
-
Id: 179246831,
|
|
49
|
-
Created: "2020-04-10T14:48:20.4384957Z",
|
|
50
|
-
VersionNo: 2,
|
|
51
|
-
ExtractData: null,
|
|
52
|
-
Digitized: true,
|
|
53
|
-
IsRapidExtract: false,
|
|
54
|
-
IsUploaded: false
|
|
55
|
-
};
|
|
56
|
-
var design = "Randomized Controlled Trial";
|
|
57
|
-
var conditions = [
|
|
58
|
-
{
|
|
59
|
-
label: "Cholesterol Total Increased",
|
|
60
|
-
id: "SUE_c"
|
|
61
|
-
}
|
|
62
|
-
];
|
|
63
|
-
var phase = 3;
|
|
64
|
-
var name = "NCT01926782";
|
|
65
|
-
var trialIds = [
|
|
66
|
-
"NCT01926782"
|
|
67
|
-
];
|
|
68
|
-
var acronyms = [
|
|
6
|
+
const sampleData = JSON.parse(fs.readFileSync(new URL('./example4.json', (document.currentScript && document.currentScript.src || new URL('test.js', document.baseURI).href))));
|
|
7
|
+
|
|
8
|
+
const senmlData = [
|
|
9
|
+
{ bn: '/3303/0/5700', bt: 1278887, v: 35.5 },
|
|
10
|
+
{ t: 10, v: 34 },
|
|
11
|
+
{ t: 20, v: 33 },
|
|
12
|
+
{ t: 30, v: 32 },
|
|
13
|
+
{ t: 40, v: 31 },
|
|
14
|
+
{ t: 50, v: 30 }
|
|
69
15
|
];
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
ageSD: 11.3,
|
|
80
|
-
male: 37.83783783783784,
|
|
81
|
-
Interventions: [
|
|
82
|
-
{
|
|
83
|
-
termIds: [
|
|
84
|
-
[
|
|
85
|
-
"SUBYEL",
|
|
86
|
-
"SUB_Oc"
|
|
87
|
-
],
|
|
88
|
-
[
|
|
89
|
-
"SUNUVb"
|
|
90
|
-
]
|
|
91
|
-
]
|
|
92
|
-
}
|
|
93
|
-
],
|
|
94
|
-
analyzeAs: "Alirocumab",
|
|
95
|
-
analyzableScore: 1.0717734625362931,
|
|
96
|
-
matchingScore: 0
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
Id: "zB",
|
|
100
|
-
RefId: "B6|O3~Alirocumab 300 mg Q4W/Up 150 mg Q2W Without Concomitant Statin",
|
|
101
|
-
OriginalName: "Alirocumab 300 mg Q4W/Up 150 mg Q2W Without Concomitant Statin",
|
|
102
|
-
N: 146,
|
|
103
|
-
age: 59.2,
|
|
104
|
-
ageSD: 10.8,
|
|
105
|
-
male: 45.205479452054796,
|
|
106
|
-
Interventions: [
|
|
107
|
-
{
|
|
108
|
-
termIds: [
|
|
109
|
-
[
|
|
110
|
-
"SUBYEL",
|
|
111
|
-
"SUB_Oc"
|
|
112
|
-
]
|
|
113
|
-
]
|
|
114
|
-
}
|
|
115
|
-
],
|
|
116
|
-
analyzeAs: "Statins",
|
|
117
|
-
analyzableScore: 1.0717734625362931,
|
|
118
|
-
matchingScore: 0
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
Id: "3!",
|
|
122
|
-
RefId: "B4|O1~Placebo Q2W Without Concomitant Statin",
|
|
123
|
-
OriginalName: "Placebo Q2W Without Concomitant Statin",
|
|
124
|
-
N: 73,
|
|
125
|
-
age: 59.4,
|
|
126
|
-
ageSD: 10.2,
|
|
127
|
-
male: 54.794520547945204,
|
|
128
|
-
Interventions: [
|
|
129
|
-
{
|
|
130
|
-
termIds: [
|
|
131
|
-
[
|
|
132
|
-
"SUGeLS"
|
|
133
|
-
],
|
|
134
|
-
[
|
|
135
|
-
"SUBYEL",
|
|
136
|
-
"SUB_Oc"
|
|
137
|
-
]
|
|
138
|
-
]
|
|
139
|
-
}
|
|
140
|
-
],
|
|
141
|
-
analyzeAs: "Control",
|
|
142
|
-
analyzableScore: 1.2020833333333334,
|
|
143
|
-
matchingScore: 0
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
Id: "tv",
|
|
147
|
-
RefId: "E3",
|
|
148
|
-
OriginalName: "Alirocumab 300 mg Q4W/Up 150 mg Q2W",
|
|
149
|
-
Interventions: [
|
|
150
|
-
{
|
|
151
|
-
termIds: [
|
|
152
|
-
[
|
|
153
|
-
"SUCO54",
|
|
154
|
-
"SUNUVb"
|
|
155
|
-
]
|
|
156
|
-
]
|
|
157
|
-
}
|
|
158
|
-
]
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
Id: "jt",
|
|
162
|
-
RefId: "B3|O3~Alirocumab 300 mg Q4W/Up 150 mg Q2W With Concomitant Statin",
|
|
163
|
-
OriginalName: "Alirocumab 300 mg Q4W/Up 150 mg Q2W With Concomitant Statin",
|
|
164
|
-
N: 312,
|
|
165
|
-
age: 61.6,
|
|
166
|
-
ageSD: 10,
|
|
167
|
-
male: 60.8974358974359,
|
|
168
|
-
Interventions: [
|
|
169
|
-
{
|
|
170
|
-
termIds: [
|
|
171
|
-
[
|
|
172
|
-
"SUBYEL",
|
|
173
|
-
"SUB_Oc"
|
|
174
|
-
]
|
|
175
|
-
]
|
|
176
|
-
}
|
|
177
|
-
]
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
Id: "5!",
|
|
181
|
-
RefId: "E2",
|
|
182
|
-
OriginalName: "Alirocumab 75 mg Q2W/Up 150 mg Q2W",
|
|
183
|
-
Interventions: [
|
|
184
|
-
{
|
|
185
|
-
termIds: [
|
|
186
|
-
[
|
|
187
|
-
"SUNUVb"
|
|
188
|
-
]
|
|
189
|
-
]
|
|
190
|
-
}
|
|
191
|
-
]
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
Id: "4E",
|
|
195
|
-
RefId: "B2|O2~Alirocumab 75 mg Q2W/Up 150 mg Q2W With Concomitant Statin",
|
|
196
|
-
OriginalName: "Alirocumab 75 mg Q2W/Up 150 mg Q2W With Concomitant Statin",
|
|
197
|
-
N: 78,
|
|
198
|
-
age: 60.7,
|
|
199
|
-
ageSD: 9.1,
|
|
200
|
-
male: 65.38461538461539,
|
|
201
|
-
Interventions: [
|
|
202
|
-
{
|
|
203
|
-
termIds: [
|
|
204
|
-
[
|
|
205
|
-
"SUBYEL",
|
|
206
|
-
"SUB_Oc"
|
|
207
|
-
],
|
|
208
|
-
[
|
|
209
|
-
"SUNUVb"
|
|
210
|
-
]
|
|
211
|
-
]
|
|
212
|
-
}
|
|
213
|
-
]
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
Id: "i4",
|
|
217
|
-
Interventions: [
|
|
218
|
-
{
|
|
219
|
-
Id: "Ya",
|
|
220
|
-
Name: 178613599,
|
|
221
|
-
Treatments: [
|
|
222
|
-
{
|
|
223
|
-
Id: "((",
|
|
224
|
-
Phase: "k)"
|
|
225
|
-
}
|
|
226
|
-
],
|
|
227
|
-
Type: "Drug",
|
|
228
|
-
termIds: [
|
|
229
|
-
[
|
|
230
|
-
"SUGeLS"
|
|
231
|
-
],
|
|
232
|
-
[
|
|
233
|
-
"SUNUVb"
|
|
234
|
-
]
|
|
235
|
-
],
|
|
236
|
-
terms: [
|
|
237
|
-
[
|
|
238
|
-
"Placebo"
|
|
239
|
-
],
|
|
240
|
-
[
|
|
241
|
-
"Alirocumab"
|
|
242
|
-
]
|
|
243
|
-
]
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
Id: "o)",
|
|
247
|
-
Name: 2159990,
|
|
248
|
-
Treatments: [
|
|
249
|
-
{
|
|
250
|
-
Id: "1$",
|
|
251
|
-
Phase: "k)"
|
|
252
|
-
}
|
|
253
|
-
],
|
|
254
|
-
Type: "Drug",
|
|
255
|
-
termIds: [
|
|
256
|
-
[
|
|
257
|
-
"SUBYEL"
|
|
258
|
-
]
|
|
259
|
-
],
|
|
260
|
-
terms: [
|
|
261
|
-
[
|
|
262
|
-
"Statins"
|
|
263
|
-
]
|
|
264
|
-
]
|
|
265
|
-
}
|
|
266
|
-
],
|
|
267
|
-
RefId: "E1|Placebo Q2W",
|
|
268
|
-
OriginalName: "Placebo Q2W"
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
Id: "Ls",
|
|
272
|
-
RefId: "B1|O1~Placebo Q2W With Concomitant Statin",
|
|
273
|
-
OriginalName: "Placebo Q2W With Concomitant Statin",
|
|
274
|
-
N: 157,
|
|
275
|
-
age: 61.6,
|
|
276
|
-
ageSD: 9.7,
|
|
277
|
-
male: 64.3312101910828,
|
|
278
|
-
Interventions: [
|
|
279
|
-
{
|
|
280
|
-
termIds: [
|
|
281
|
-
[
|
|
282
|
-
"SUGeLS"
|
|
283
|
-
],
|
|
284
|
-
[
|
|
285
|
-
"SUBYEL",
|
|
286
|
-
"SUB_Oc"
|
|
287
|
-
]
|
|
288
|
-
]
|
|
289
|
-
}
|
|
290
|
-
]
|
|
16
|
+
|
|
17
|
+
const senmlKeys = { bs: -6, bv: -5, bu: -4, bt: -3, bn: -2, n: 0, u: 1, v: 2, vs: 3, t: 6, ut: 7, vd: 8 };
|
|
18
|
+
|
|
19
|
+
//import inspector from 'inspector'; inspector.open(9229, null, true); debugger
|
|
20
|
+
function tryRequire(module) {
|
|
21
|
+
try {
|
|
22
|
+
return require(module)
|
|
23
|
+
} catch(error) {
|
|
24
|
+
return {}
|
|
291
25
|
}
|
|
292
|
-
|
|
293
|
-
var
|
|
294
|
-
|
|
295
|
-
var
|
|
296
|
-
var
|
|
297
|
-
var
|
|
298
|
-
var
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
26
|
+
}
|
|
27
|
+
var assert = chai.assert;
|
|
28
|
+
|
|
29
|
+
var Encoder = CBOR.Encoder;
|
|
30
|
+
var decode = CBOR.decode;
|
|
31
|
+
var encode = CBOR.encode;
|
|
32
|
+
var DECIMAL_FIT = CBOR.DECIMAL_FIT;
|
|
33
|
+
|
|
34
|
+
var addExtension = CBOR.addExtension;
|
|
35
|
+
|
|
36
|
+
var zlib = tryRequire('zlib');
|
|
37
|
+
var deflateSync = zlib.deflateSync;
|
|
38
|
+
var inflateSync = zlib.inflateSync;
|
|
39
|
+
var deflateSync = zlib.brotliCompressSync;
|
|
40
|
+
var inflateSync = zlib.brotliDecompressSync;
|
|
41
|
+
var constants = zlib.constants;
|
|
42
|
+
|
|
43
|
+
var ITERATIONS = 4000;
|
|
44
|
+
|
|
45
|
+
suite('CBOR basic tests', function(){
|
|
46
|
+
test('encode/decode with keyMaps (basic)', function() {
|
|
47
|
+
var data = senmlData;
|
|
48
|
+
let cborSenml = new Encoder({ useRecords: false, keyMap: senmlKeys });
|
|
49
|
+
let cborBasic = new Encoder();
|
|
50
|
+
var serialized = cborSenml.encode(data);
|
|
51
|
+
var deserialized = cborSenml.decode(serialized);
|
|
52
|
+
assert(serialized.length < cborBasic.encode(data).length);
|
|
53
|
+
assert.deepEqual(deserialized, data);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('encode/decode with keyMaps and Records)', function() {
|
|
57
|
+
var data = senmlData;
|
|
58
|
+
let cborSenml = new Encoder({ useRecords: true, keyMap: senmlKeys });
|
|
59
|
+
let cborBasic = new Encoder();
|
|
60
|
+
var serialized = cborSenml.encode(data);
|
|
61
|
+
var deserialized = cborSenml.decode(serialized);
|
|
62
|
+
assert(serialized.length < cborBasic.encode(data).length);
|
|
63
|
+
assert.deepEqual(deserialized, data);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('encode/decode data', function(){
|
|
67
|
+
var data = {
|
|
68
|
+
data: [
|
|
69
|
+
{ a: 1, name: 'one', type: 'odd', isOdd: true },
|
|
70
|
+
{ a: 2, name: 'two', type: 'even'},
|
|
71
|
+
{ a: 3, name: 'three', type: 'odd', isOdd: true },
|
|
72
|
+
{ a: 4, name: 'four', type: 'even'},
|
|
73
|
+
{ a: 5, name: 'five', type: 'odd', isOdd: true },
|
|
74
|
+
{ a: 6, name: 'six', type: 'even', isOdd: null }
|
|
75
|
+
],
|
|
76
|
+
description: 'some names',
|
|
77
|
+
types: ['odd', 'even'],
|
|
78
|
+
convertEnumToNum: [
|
|
79
|
+
{ prop: 'test' },
|
|
80
|
+
{ prop: 'test' },
|
|
81
|
+
{ prop: 'test' },
|
|
82
|
+
{ prop: 1 },
|
|
83
|
+
{ prop: 2 },
|
|
84
|
+
{ prop: [undefined] },
|
|
85
|
+
{ prop: null }
|
|
308
86
|
]
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
type: "Change",
|
|
363
|
-
unit: "%",
|
|
364
|
-
termIds: [
|
|
365
|
-
[
|
|
366
|
-
"SUF0R",
|
|
367
|
-
"SUBskP"
|
|
87
|
+
};
|
|
88
|
+
let structures = [];
|
|
89
|
+
let encoder = new Encoder({ structures });
|
|
90
|
+
var serialized = encoder.encode(data);
|
|
91
|
+
serialized = encoder.encode(data);
|
|
92
|
+
var deserialized = encoder.decode(serialized);
|
|
93
|
+
assert.deepEqual(deserialized, data);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('mixed structures, shared', function(){
|
|
97
|
+
let data1 = { a: 1, b: 2, c: 3 };
|
|
98
|
+
let data2 = { a: 1, b: 2, d: 4 };
|
|
99
|
+
let data3 = { a: 1, b: 2, e: 5 };
|
|
100
|
+
let structures = [];
|
|
101
|
+
let encoder = new Encoder({ structures });
|
|
102
|
+
var serialized = encoder.encode(data1);
|
|
103
|
+
var deserialized = encoder.decode(serialized);
|
|
104
|
+
assert.deepEqual(deserialized, data1);
|
|
105
|
+
var serialized = encoder.encode(data2);
|
|
106
|
+
var deserialized = encoder.decode(serialized);
|
|
107
|
+
assert.deepEqual(deserialized, data2);
|
|
108
|
+
var serialized = encoder.encode(data3);
|
|
109
|
+
var deserialized = encoder.decode(serialized);
|
|
110
|
+
assert.deepEqual(deserialized, data3);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('mixed structures, unshared', function(){
|
|
114
|
+
let data = [];
|
|
115
|
+
let encoder = new Encoder({ });
|
|
116
|
+
for (let i = 0; i< 1000; i++) {
|
|
117
|
+
data.push({a: 1, ['test' + i]: i});
|
|
118
|
+
}
|
|
119
|
+
var serialized = encoder.encode(data);
|
|
120
|
+
var deserialized = encoder.decode(serialized);
|
|
121
|
+
assert.deepEqual(deserialized, data);
|
|
122
|
+
serialized = encoder.encode(data);
|
|
123
|
+
deserialized = encoder.decode(serialized);
|
|
124
|
+
assert.deepEqual(deserialized, data);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test('mixed array', function(){
|
|
128
|
+
var data = [
|
|
129
|
+
'one',
|
|
130
|
+
'two',
|
|
131
|
+
'one',
|
|
132
|
+
10,
|
|
133
|
+
11,
|
|
134
|
+
null,
|
|
135
|
+
true,
|
|
136
|
+
'three',
|
|
137
|
+
'three',
|
|
138
|
+
'one', [
|
|
139
|
+
3, -5, -50, -400,1.3, -5.3, true
|
|
368
140
|
]
|
|
369
|
-
]
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
141
|
+
];
|
|
142
|
+
let structures = [];
|
|
143
|
+
let encoder = new Encoder({ structures });
|
|
144
|
+
var serialized = encoder.encode(data);
|
|
145
|
+
var deserialized = encoder.decode(serialized);
|
|
146
|
+
assert.deepEqual(deserialized, data);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test('255 chars', function() {
|
|
150
|
+
const data = 'RRZG9A6I7xupPeOZhxcOcioFsuhszGOdyDUcbRf4Zef2kdPIfC9RaLO4jTM5JhuZvTsF09fbRHMGtqk7YAgu3vespeTe9l61ziZ6VrMnYu2CamK96wCkmz0VUXyqaiUoTPgzk414LS9yYrd5uh7w18ksJF5SlC2e91rukWvNqAZJjYN3jpkqHNOFchCwFrhbxq2Lrv1kSJPYCx9blRg2hGmYqTbElLTZHv20iNqwZeQbRMgSBPT6vnbCBPnOh1W';
|
|
151
|
+
var serialized = CBOR.encode(data);
|
|
152
|
+
var deserialized = CBOR.decode(serialized);
|
|
153
|
+
assert.equal(deserialized, data);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test('encode/decode sample data', function(){
|
|
157
|
+
var data = sampleData;
|
|
158
|
+
var serialized = CBOR.encode(data);
|
|
159
|
+
var deserialized = CBOR.decode(serialized);
|
|
160
|
+
assert.deepEqual(deserialized, data);
|
|
161
|
+
var serialized = CBOR.encode(data);
|
|
162
|
+
var deserialized = CBOR.decode(serialized);
|
|
163
|
+
assert.deepEqual(deserialized, data);
|
|
164
|
+
});
|
|
165
|
+
test('encode/decode sample data with records', function(){
|
|
166
|
+
var data = sampleData;
|
|
167
|
+
let sharedSerialized;
|
|
168
|
+
let encoder = new Encoder({ getStructures() { return }, saveStructures(shared) { sharedSerialized = encode(shared); }, useRecords: true });
|
|
169
|
+
var serialized = encoder.encode(data);
|
|
170
|
+
encoder = new Encoder({ getStructures() { return decode(sharedSerialized) }, saveStructures(shared) { sharedSerialized = encode(shared); }, useRecords: true });
|
|
171
|
+
var deserialized = encoder.decode(serialized);
|
|
172
|
+
assert.deepEqual(deserialized, data);
|
|
173
|
+
});
|
|
174
|
+
test('encode/decode sample data with packing', function(){
|
|
175
|
+
var data = sampleData;
|
|
176
|
+
let encoder = new Encoder({ pack: true, useRecords: false });
|
|
177
|
+
var serialized = encoder.encode(data);
|
|
178
|
+
var deserialized = encoder.decode(serialized);
|
|
179
|
+
assert.deepEqual(deserialized, data);
|
|
180
|
+
});
|
|
181
|
+
test('encode/decode sample data with packing and records', function(){
|
|
182
|
+
var data = sampleData;
|
|
183
|
+
let encoder = new Encoder({ useStringRefs: true });
|
|
184
|
+
var serialized = encoder.encode(data);
|
|
185
|
+
var deserialized = encoder.decode(serialized);
|
|
186
|
+
assert.deepEqual(deserialized, data);
|
|
187
|
+
});
|
|
188
|
+
test('encode/decode sample data with shared packing and records', function(){
|
|
189
|
+
let encoder = new Encoder({ useRecords: true });
|
|
190
|
+
let finishPack = encoder.findCommonStringsToPack();
|
|
191
|
+
for (let i = 0; i < 20; i++) {
|
|
192
|
+
let data = {
|
|
193
|
+
shouldShare: 'same each time',
|
|
194
|
+
shouldShare2: 'same each time 2',
|
|
195
|
+
shouldntShare: 'different each time ' + i
|
|
196
|
+
};
|
|
197
|
+
if (i == 10)
|
|
198
|
+
finishPack({});
|
|
199
|
+
var serialized = encoder.encode(data);
|
|
200
|
+
var deserialized = encoder.decode(serialized);
|
|
201
|
+
assert.deepEqual(deserialized, data);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
test('encode/decode sample data with individual packing, shared packing and records', function(){
|
|
205
|
+
let encoder = new Encoder({ pack: true, useRecords: true });
|
|
206
|
+
let finishPack = encoder.findCommonStringsToPack();
|
|
207
|
+
for (let i = 0; i < 20; i++) {
|
|
208
|
+
let data = {
|
|
209
|
+
shouldShare: 'same each time',
|
|
210
|
+
shouldShare2: 'same each time',
|
|
211
|
+
shouldntShare: 'different each time ' + i,
|
|
212
|
+
shouldntShare2: 'different each time ' + i,
|
|
213
|
+
noPack: 'no packing ' + i,
|
|
214
|
+
};
|
|
215
|
+
if (i == 10)
|
|
216
|
+
finishPack({ threshold: 5 });
|
|
217
|
+
var serialized = encoder.encode(data);
|
|
218
|
+
var deserialized = encoder.decode(serialized);
|
|
219
|
+
assert.deepEqual(deserialized, data);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
test('pack/unpack sample data with bundled strings', function(){
|
|
223
|
+
var data = sampleData;
|
|
224
|
+
let encoder = new Encoder({ /*structures,*/ useRecords: false, bundleStrings: true });
|
|
225
|
+
var serialized = encoder.encode(data);
|
|
226
|
+
var deserialized = encoder.decode(serialized);
|
|
227
|
+
assert.deepEqual(deserialized, data);
|
|
228
|
+
});
|
|
229
|
+
test('pack/unpack sample data with self-descriptive header', function(){
|
|
230
|
+
var data = sampleData;
|
|
231
|
+
let encoder = new Encoder({ useSelfDescribedHeader: true });
|
|
232
|
+
var serialized = encoder.encode(data);
|
|
233
|
+
var deserialized = encoder.decode(serialized);
|
|
234
|
+
assert.deepEqual(deserialized, data);
|
|
235
|
+
assert.equal(serialized[0], 0xd9);
|
|
236
|
+
assert.equal(serialized[1], 0xd9);
|
|
237
|
+
assert.equal(serialized[2], 0xf7);
|
|
238
|
+
});
|
|
239
|
+
if (typeof Buffer != 'undefined')
|
|
240
|
+
test('replace data', function(){
|
|
241
|
+
var data1 = {
|
|
242
|
+
data: [
|
|
243
|
+
{ a: 1, name: 'one', type: 'odd', isOdd: true, a: '13 characters' },
|
|
244
|
+
{ a: 2, name: 'two', type: 'even', a: '11 characte' },
|
|
245
|
+
{ a: 3, name: 'three', type: 'odd', isOdd: true, a: '12 character' },
|
|
246
|
+
{ a: 4, name: 'four', type: 'even', a: '9 charact'},
|
|
247
|
+
{ a: 5, name: 'five', type: 'odd', isOdd: true, a: '14 characters!' },
|
|
248
|
+
{ a: 6, name: 'six', type: 'even', isOdd: null }
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
var data2 = {
|
|
252
|
+
data: [
|
|
253
|
+
{ foo: 7, name: 'one', type: 'odd', isOdd: true },
|
|
254
|
+
{ foo: 8, name: 'two', type: 'even'},
|
|
255
|
+
{ foo: 9, name: 'three', type: 'odd', isOdd: true },
|
|
256
|
+
{ foo: 10, name: 'four', type: 'even'},
|
|
257
|
+
{ foo: 11, name: 'five', type: 'odd', isOdd: true },
|
|
258
|
+
{ foo: 12, name: 'six', type: 'even', isOdd: null }
|
|
259
|
+
],
|
|
260
|
+
};
|
|
261
|
+
var serialized1 = encode(data1);
|
|
262
|
+
var serialized2 = encode(data2);
|
|
263
|
+
var b = Buffer.alloc(8000);
|
|
264
|
+
serialized1.copy(b);
|
|
265
|
+
var deserialized1 = decode(b, serialized1.length);
|
|
266
|
+
serialized2.copy(b);
|
|
267
|
+
var deserialized2 = decode(b, serialized2.length);
|
|
268
|
+
assert.deepEqual(deserialized1, data1);
|
|
269
|
+
assert.deepEqual(deserialized2, data2);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
test('extended class encode/decode', function(){
|
|
273
|
+
function Extended() {
|
|
274
|
+
|
|
275
|
+
}
|
|
276
|
+
Extended.prototype.getDouble = function() {
|
|
277
|
+
return this.value * 2
|
|
278
|
+
};
|
|
279
|
+
var instance = new Extended();
|
|
280
|
+
instance.value = 4;
|
|
281
|
+
instance.string = 'decode this: ᾜ';
|
|
282
|
+
var data = {
|
|
283
|
+
prop1: 'has multi-byte: ᾜ',
|
|
284
|
+
extendedInstance: instance,
|
|
285
|
+
prop2: 'more string',
|
|
286
|
+
num: 3,
|
|
287
|
+
};
|
|
288
|
+
let encoder = new Encoder();
|
|
289
|
+
addExtension({
|
|
290
|
+
Class: Extended,
|
|
291
|
+
tag: 300,
|
|
292
|
+
decode: function(data) {
|
|
293
|
+
let e = new Extended();
|
|
294
|
+
e.value = data[0];
|
|
295
|
+
e.string = data[1];
|
|
296
|
+
return e
|
|
391
297
|
},
|
|
392
|
-
{
|
|
393
|
-
|
|
394
|
-
unit: "%",
|
|
395
|
-
group: "jt",
|
|
396
|
-
varType: "se",
|
|
397
|
-
N: 302,
|
|
398
|
-
se: 1.5,
|
|
399
|
-
sd: 26.07
|
|
298
|
+
encode: function(instance) {
|
|
299
|
+
return encoder.encode([instance.value, instance.string])
|
|
400
300
|
}
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
id: "179246393",
|
|
422
|
-
type: "Change",
|
|
423
|
-
unit: "%",
|
|
424
|
-
termIds: [
|
|
425
|
-
[
|
|
426
|
-
"SUF0R",
|
|
427
|
-
"SUBskP"
|
|
428
|
-
]
|
|
429
|
-
],
|
|
430
|
-
quantifiers: [
|
|
431
|
-
],
|
|
432
|
-
name: "Calculated LDL-C in Not Receiving Concomitant Statin Therapy - On-Treatment Analysis",
|
|
433
|
-
cells: [
|
|
434
|
-
{
|
|
435
|
-
number: -0.5,
|
|
436
|
-
unit: "%",
|
|
437
|
-
group: "3!",
|
|
438
|
-
varType: "se",
|
|
439
|
-
N: 70,
|
|
440
|
-
se: 2,
|
|
441
|
-
sd: 16.73
|
|
442
|
-
},
|
|
443
|
-
{
|
|
444
|
-
number: -53.9,
|
|
445
|
-
unit: "%",
|
|
446
|
-
group: "4r",
|
|
447
|
-
varType: "se",
|
|
448
|
-
N: 37,
|
|
449
|
-
se: 2.7,
|
|
450
|
-
sd: 16.42
|
|
451
|
-
},
|
|
452
|
-
{
|
|
453
|
-
number: -60,
|
|
454
|
-
unit: "%",
|
|
455
|
-
group: "zB",
|
|
456
|
-
varType: "se",
|
|
457
|
-
N: 141,
|
|
458
|
-
se: 1.4,
|
|
459
|
-
sd: 16.62
|
|
301
|
+
});
|
|
302
|
+
var serialized = encode(data);
|
|
303
|
+
var deserialized = decode(serialized);
|
|
304
|
+
assert.deepEqual(data, deserialized);
|
|
305
|
+
assert.equal(deserialized.extendedInstance.getDouble(), 8);
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
test.skip('text decoder', function() {
|
|
309
|
+
let td = new TextDecoder('ISO-8859-15');
|
|
310
|
+
let b = Buffer.alloc(3);
|
|
311
|
+
for (var i = 0; i < 256; i++) {
|
|
312
|
+
b[0] = i;
|
|
313
|
+
b[1] = 0;
|
|
314
|
+
b[2] = 0;
|
|
315
|
+
let s = td.decode(b);
|
|
316
|
+
if (!require('CBOR-extract').isOneByte(s)) {
|
|
317
|
+
console.log(i.toString(16), s.length);
|
|
318
|
+
}
|
|
460
319
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
"Number": 12,
|
|
469
|
-
Unit: "wk"
|
|
470
|
-
},
|
|
471
|
-
Type: "Total",
|
|
472
|
-
days: 84,
|
|
473
|
-
description: "12wk"
|
|
474
|
-
},
|
|
475
|
-
score: 2.08,
|
|
476
|
-
matchingTerm: "SUF0R",
|
|
477
|
-
suggestedPositive: false,
|
|
478
|
-
sourceUnit: "%"
|
|
479
|
-
},
|
|
480
|
-
{
|
|
481
|
-
id: "179246394",
|
|
482
|
-
type: "Change",
|
|
483
|
-
unit: "%",
|
|
484
|
-
termIds: [
|
|
485
|
-
[
|
|
486
|
-
"SUF0R",
|
|
487
|
-
"SUBskP"
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
test('structured cloning: self reference', function() {
|
|
323
|
+
let object = {
|
|
324
|
+
test: 'string',
|
|
325
|
+
children: [
|
|
326
|
+
{ name: 'child' }
|
|
488
327
|
]
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
]
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
328
|
+
};
|
|
329
|
+
object.self = object;
|
|
330
|
+
object.children[1] = object;
|
|
331
|
+
object.children[2] = object.children[0];
|
|
332
|
+
object.childrenAgain = object.children;
|
|
333
|
+
let encoder = new Encoder({
|
|
334
|
+
structuredClone: true,
|
|
335
|
+
});
|
|
336
|
+
var serialized = encoder.encode(object);
|
|
337
|
+
var deserialized = encoder.decode(serialized);
|
|
338
|
+
assert.equal(deserialized.self, deserialized);
|
|
339
|
+
assert.equal(deserialized.children[0].name, 'child');
|
|
340
|
+
assert.equal(deserialized.children[1], deserialized);
|
|
341
|
+
assert.equal(deserialized.children[0], deserialized.children[2]);
|
|
342
|
+
assert.equal(deserialized.children, deserialized.childrenAgain);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
test('structured cloning: types', function() {
|
|
346
|
+
let b = typeof Buffer != 'undefined' ? Buffer.alloc(20) : new Uint8Array(20);
|
|
347
|
+
let fa = new Float32Array(b.buffer, 8, 2);
|
|
348
|
+
fa[0] = 2.25;
|
|
349
|
+
fa[1] = 6;
|
|
350
|
+
let f64a = new Float64Array([2.3, 4.7]);
|
|
351
|
+
let map = new Map();
|
|
352
|
+
map.set('key', 'value');
|
|
353
|
+
let object = {
|
|
354
|
+
error: new Error('test'),
|
|
355
|
+
set: new Set(['a', 'b']),
|
|
356
|
+
regexp: /test/gi,
|
|
357
|
+
map,
|
|
358
|
+
float32Array: fa,
|
|
359
|
+
float64Array: f64a,
|
|
360
|
+
uint16Array: new Uint16Array([3,4])
|
|
361
|
+
};
|
|
362
|
+
let encoder = new Encoder({
|
|
363
|
+
structuredClone: true,
|
|
364
|
+
});
|
|
365
|
+
var serialized = encoder.encode(object);
|
|
366
|
+
var deserialized = encoder.decode(serialized);
|
|
367
|
+
assert.deepEqual(Array.from(deserialized.set), Array.from(object.set));
|
|
368
|
+
assert.equal(deserialized.map.get('key'), 'value');
|
|
369
|
+
assert.equal(deserialized.error.message, object.error.message);
|
|
370
|
+
assert.equal(deserialized.regexp.test('TEST'), true);
|
|
371
|
+
assert.equal(deserialized.float32Array.constructor.name, 'Float32Array');
|
|
372
|
+
assert.equal(deserialized.float32Array[0], 2.25);
|
|
373
|
+
assert.equal(deserialized.float32Array[1], 6);
|
|
374
|
+
assert.equal(deserialized.float64Array[0], 2.3);
|
|
375
|
+
assert.equal(deserialized.float64Array[1], 4.7);
|
|
376
|
+
assert.equal(deserialized.uint16Array.constructor.name, 'Uint16Array');
|
|
377
|
+
assert.equal(deserialized.uint16Array[0], 3);
|
|
378
|
+
assert.equal(deserialized.uint16Array[1], 4);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
test('explicit maps and sets', function () {
|
|
382
|
+
let map = new Map();
|
|
383
|
+
map.set('key', { inside: 'value'});
|
|
384
|
+
let object = {
|
|
385
|
+
set: new Set(['a', 'b']),
|
|
386
|
+
map,
|
|
387
|
+
};
|
|
388
|
+
var serialized = encode(object); // default encoder
|
|
389
|
+
var deserialized = decode(serialized);
|
|
390
|
+
assert.deepEqual(Array.from(deserialized.set), Array.from(object.set));
|
|
391
|
+
assert.equal(deserialized.map.get('key').inside, 'value');
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
test('object without prototype', function(){
|
|
395
|
+
var data = Object.create(null);
|
|
396
|
+
data.test = 3;
|
|
397
|
+
var serialized = encode(data);
|
|
398
|
+
var deserialized = decode(serialized);
|
|
399
|
+
assert.deepEqual(deserialized, data);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
test('big buffer', function() {
|
|
403
|
+
var size = 100000000;
|
|
404
|
+
var data = new Uint8Array(size).fill(1);
|
|
405
|
+
var encoded = encode(data);
|
|
406
|
+
var decoded = decode(encoded);
|
|
407
|
+
assert.equal(decoded.length, size);
|
|
408
|
+
});
|
|
409
|
+
test('little buffer', function() {
|
|
410
|
+
var data = typeof Buffer == 'undefined' ? new Uint8Array(0) : Buffer.alloc(0);
|
|
411
|
+
var encoded = encode(data);
|
|
412
|
+
assert.equal(encoded.length, 1); // make sure to use canonical form
|
|
413
|
+
var decoded = decode(encoded);
|
|
414
|
+
assert.equal(decoded.length, 0);
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
test('random strings', function(){
|
|
418
|
+
var data = [];
|
|
419
|
+
for (var i = 0; i < 2000; i++) {
|
|
420
|
+
var str = 'test';
|
|
421
|
+
while (Math.random() < 0.7 && str.length < 0x100000) {
|
|
422
|
+
str = str + String.fromCharCode(90/(Math.random() + 0.01)) + str;
|
|
520
423
|
}
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
424
|
+
data.push(str);
|
|
425
|
+
}
|
|
426
|
+
var serialized = encode(data);
|
|
427
|
+
var deserialized = decode(serialized);
|
|
428
|
+
assert.deepEqual(deserialized, data);
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
test('map/date', function(){
|
|
432
|
+
var map = new Map();
|
|
433
|
+
map.set(4, 'four');
|
|
434
|
+
map.set('three', 3);
|
|
435
|
+
let year2039 = new Date('2039-07-05T16:22:35.792Z');
|
|
436
|
+
let year2038 = new Date('2038-08-06T00:19:02.911Z');
|
|
437
|
+
|
|
438
|
+
var data = {
|
|
439
|
+
map: map,
|
|
440
|
+
date: new Date(1532219539733),
|
|
441
|
+
farFutureDate: new Date(3532219539133),
|
|
442
|
+
ancient: new Date(-3532219539133),
|
|
443
|
+
year2038,
|
|
444
|
+
year2039,
|
|
445
|
+
invalidDate: new Date('invalid')
|
|
446
|
+
};
|
|
447
|
+
let encoder = new Encoder();
|
|
448
|
+
var serialized = encoder.encode(data);
|
|
449
|
+
var deserialized = encoder.decode(serialized);
|
|
450
|
+
assert.equal(deserialized.map.get(4), 'four');
|
|
451
|
+
assert.equal(deserialized.map.get('three'), 3);
|
|
452
|
+
assert.equal(deserialized.date.getTime(), 1532219539733);
|
|
453
|
+
assert.equal(deserialized.farFutureDate.getTime(), 3532219539133);
|
|
454
|
+
assert.equal(deserialized.ancient.getTime(), -3532219539133);
|
|
455
|
+
assert.equal(deserialized.year2038.getTime(), year2038.getTime());
|
|
456
|
+
assert.equal(deserialized.year2039.getTime(), year2039.getTime());
|
|
457
|
+
assert.equal(deserialized.invalidDate.toString(), 'Invalid Date');
|
|
458
|
+
});
|
|
459
|
+
test('map/date with options', function(){
|
|
460
|
+
var map = new Map();
|
|
461
|
+
map.set(4, 'four');
|
|
462
|
+
map.set('three', 3);
|
|
463
|
+
var data = {
|
|
464
|
+
map: map,
|
|
465
|
+
date: new Date(1532219539011),
|
|
466
|
+
invalidDate: new Date('invalid')
|
|
467
|
+
};
|
|
468
|
+
let encoder = new Encoder({
|
|
469
|
+
mapsAsObjects: true,
|
|
470
|
+
useTimestamp32: true,
|
|
471
|
+
useTag259ForMaps: false,
|
|
472
|
+
});
|
|
473
|
+
var serialized = encoder.encode(data);
|
|
474
|
+
var deserialized = encoder.decode(serialized);
|
|
475
|
+
assert.equal(deserialized.map[4], 'four');
|
|
476
|
+
assert.equal(deserialized.map.three, 3);
|
|
477
|
+
assert.equal(deserialized.date.getTime(), 1532219539000);
|
|
478
|
+
assert.isTrue(isNaN(deserialized.invalidDate.getTime()));
|
|
479
|
+
});
|
|
480
|
+
test('key caching', function() {
|
|
481
|
+
var data = {
|
|
482
|
+
foo: 2,
|
|
483
|
+
bar: 'test',
|
|
484
|
+
four: 4,
|
|
485
|
+
seven: 7,
|
|
486
|
+
foz: 3,
|
|
487
|
+
};
|
|
488
|
+
var serialized = CBOR.encode(data);
|
|
489
|
+
var deserialized = CBOR.decode(serialized);
|
|
490
|
+
assert.deepEqual(deserialized, data);
|
|
491
|
+
// do multiple times to test caching
|
|
492
|
+
var serialized = CBOR.encode(data);
|
|
493
|
+
var deserialized = CBOR.decode(serialized);
|
|
494
|
+
assert.deepEqual(deserialized, data);
|
|
495
|
+
var serialized = CBOR.encode(data);
|
|
496
|
+
var deserialized = CBOR.decode(serialized);
|
|
497
|
+
assert.deepEqual(deserialized, data);
|
|
498
|
+
});
|
|
499
|
+
test('strings', function() {
|
|
500
|
+
var data = [''];
|
|
501
|
+
var serialized = encode(data);
|
|
502
|
+
var deserialized = decode(serialized);
|
|
503
|
+
assert.deepEqual(deserialized, data);
|
|
504
|
+
// do multiple times
|
|
505
|
+
var serialized = encode(data);
|
|
506
|
+
var deserialized = decode(serialized);
|
|
507
|
+
assert.deepEqual(deserialized, data);
|
|
508
|
+
data = 'decode this: ᾜ';
|
|
509
|
+
var serialized = encode(data);
|
|
510
|
+
var deserialized = decode(serialized);
|
|
511
|
+
assert.deepEqual(deserialized, data);
|
|
512
|
+
data = 'decode this that is longer but without any non-latin characters';
|
|
513
|
+
var serialized = encode(data);
|
|
514
|
+
var deserialized = decode(serialized);
|
|
515
|
+
assert.deepEqual(deserialized, data);
|
|
516
|
+
});
|
|
517
|
+
test('decimal float32', function() {
|
|
518
|
+
var data = {
|
|
519
|
+
a: 2.526,
|
|
520
|
+
b: 0.0035235,
|
|
521
|
+
c: 0.00000000000352501,
|
|
522
|
+
d: 3252.77,
|
|
523
|
+
};
|
|
524
|
+
let encoder = new Encoder({
|
|
525
|
+
useFloat32: DECIMAL_FIT
|
|
526
|
+
});
|
|
527
|
+
var serialized = encoder.encode(data);
|
|
528
|
+
assert.equal(serialized.length, 36);
|
|
529
|
+
var deserialized = encoder.decode(serialized);
|
|
530
|
+
assert.deepEqual(deserialized, data);
|
|
531
|
+
});
|
|
532
|
+
test('bigint to float', function() {
|
|
533
|
+
var data = {
|
|
534
|
+
a: 325283295382932843n
|
|
535
|
+
};
|
|
536
|
+
let encoder = new Encoder({
|
|
537
|
+
int64AsNumber: true
|
|
538
|
+
});
|
|
539
|
+
var serialized = encoder.encode(data);
|
|
540
|
+
var deserialized = encoder.decode(serialized);
|
|
541
|
+
assert.deepEqual(deserialized.a, 325283295382932843);
|
|
542
|
+
});
|
|
543
|
+
test('numbers', function(){
|
|
544
|
+
var data = {
|
|
545
|
+
bigEncodable: 48978578104322,
|
|
546
|
+
dateEpoch: 1530886513200,
|
|
547
|
+
realBig: 3432235352353255323,
|
|
548
|
+
decimal: 32.55234,
|
|
549
|
+
negative: -34.11,
|
|
550
|
+
exponential: 0.234e123,
|
|
551
|
+
tiny: 3.233e-120,
|
|
552
|
+
zero: 0,
|
|
553
|
+
//negativeZero: -0,
|
|
554
|
+
Infinity: Infinity
|
|
555
|
+
};
|
|
556
|
+
var serialized = encode(data);
|
|
557
|
+
var deserialized = decode(serialized);
|
|
558
|
+
assert.deepEqual(deserialized, data);
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
test('encode ArrayBuffer', function() {
|
|
562
|
+
let ua = new Uint8Array([3, 4, 5]);
|
|
563
|
+
let encoded = encode(ua.buffer);
|
|
564
|
+
let decoded = decode(encoded);
|
|
565
|
+
assert.equal(decoded[0], 3);
|
|
566
|
+
assert.equal(decoded[0], 3);
|
|
567
|
+
assert.equal(decoded[1], 4);
|
|
568
|
+
assert.equal(decoded[2], 5);
|
|
569
|
+
assert.equal(decoded.byteLength, 3);
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
test('iterator/indefinite length array', function(){
|
|
573
|
+
class NotArray {
|
|
574
|
+
}
|
|
575
|
+
let data = ['a', 'b', 'c', ['d']]; // iterable
|
|
576
|
+
data.constructor = NotArray;
|
|
577
|
+
var serialized = encode(data);
|
|
578
|
+
var deserialized = decode(serialized);
|
|
579
|
+
assert.deepEqual(deserialized, data);
|
|
580
|
+
});
|
|
581
|
+
test('bigint', function(){
|
|
582
|
+
var data = {
|
|
583
|
+
bigintSmall: 352n,
|
|
584
|
+
bigintSmallNegative: -333335252n,
|
|
585
|
+
bigintBig: 2n**64n - 1n, // biggest possible
|
|
586
|
+
bigintBigNegative: -(2n**63n), // largest negative
|
|
587
|
+
mixedWithNormal: 44,
|
|
588
|
+
};
|
|
589
|
+
var serialized = encode(data);
|
|
590
|
+
var deserialized = decode(serialized);
|
|
591
|
+
assert.deepEqual(deserialized, data);
|
|
592
|
+
var tooBigInt = {
|
|
593
|
+
tooBig: 2n**66n
|
|
594
|
+
};
|
|
595
|
+
assert.throws(function(){ serialized = encode(tooBigInt); });
|
|
596
|
+
let encoder = new Encoder({
|
|
597
|
+
largeBigIntToFloat: true
|
|
598
|
+
});
|
|
599
|
+
serialized = encoder.encode(tooBigInt);
|
|
600
|
+
deserialized = decode(serialized);
|
|
601
|
+
assert.isTrue(deserialized.tooBig > 2n**65n);
|
|
602
|
+
});
|
|
603
|
+
|
|
604
|
+
test('buffers', function() {
|
|
605
|
+
var data = {
|
|
606
|
+
buffer1: new Uint8Array([2,3,4]),
|
|
607
|
+
buffer2: new Uint8Array(encode(sampleData))
|
|
608
|
+
};
|
|
609
|
+
var serialized = encode(data);
|
|
610
|
+
var deserialized = decode(serialized);
|
|
611
|
+
assert.deepEqual(deserialized, data);
|
|
612
|
+
let encoder = new Encoder({ tagUint8Array: true });
|
|
613
|
+
serialized = encoder.encode(new Uint8Array([2,3,4]));
|
|
614
|
+
assert.equal(serialized[0], 0xd8);
|
|
615
|
+
encoder = new Encoder({ tagUint8Array: false });
|
|
616
|
+
serialized = encoder.encode(new Uint8Array([2,3,4]));
|
|
617
|
+
assert.equal(serialized[0], 0x43);
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
test('noteencode test', function() {
|
|
621
|
+
const data = {
|
|
622
|
+
foo: 1,
|
|
623
|
+
bar: [1, 2, 3, 4, 'abc', 'def'],
|
|
624
|
+
foobar: {
|
|
625
|
+
foo: true,
|
|
626
|
+
bar: -2147483649,
|
|
627
|
+
foobar: {
|
|
628
|
+
foo: new Uint8Array([1, 2, 3, 4, 5]),
|
|
629
|
+
bar: 1.5,
|
|
630
|
+
foobar: [true, false, 'abcdefghijkmonpqrstuvwxyz']
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
};
|
|
634
|
+
var serialized = encode(data);
|
|
635
|
+
var deserialized = decode(serialized);
|
|
636
|
+
var deserialized = decode(serialized);
|
|
637
|
+
var deserialized = decode(serialized);
|
|
638
|
+
assert.deepEqual(deserialized, data);
|
|
639
|
+
});
|
|
640
|
+
|
|
641
|
+
test('utf16 causing expansion', function() {
|
|
642
|
+
this.timeout(10000);
|
|
643
|
+
let data = {fixstr: 'ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝ', str8:'ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝ'};
|
|
644
|
+
var serialized = encode(data);
|
|
645
|
+
var deserialized = decode(serialized);
|
|
646
|
+
assert.deepEqual(deserialized, data);
|
|
647
|
+
});
|
|
648
|
+
test('decodeMultiple', () => {
|
|
649
|
+
let values = CBOR.decodeMultiple(new Uint8Array([1, 2, 3, 4]));
|
|
650
|
+
assert.deepEqual(values, [1, 2, 3, 4]);
|
|
651
|
+
values = [];
|
|
652
|
+
CBOR.decodeMultiple(new Uint8Array([1, 2, 3, 4]), value => values.push(value));
|
|
653
|
+
assert.deepEqual(values, [1, 2, 3, 4]);
|
|
654
|
+
});
|
|
655
|
+
test('bad input', function() {
|
|
656
|
+
let badInput = Buffer.from('7b2273657269616c6e6f223a2265343a30222c226970223a223139322e3136382e312e3335222c226b6579223a226770735f736563726574227d', 'hex');
|
|
657
|
+
assert.throws(function(){ decode(badInput); }); // should throw, not crash
|
|
658
|
+
});
|
|
659
|
+
});
|
|
660
|
+
suite('CBOR performance tests', function(){
|
|
661
|
+
test('performance JSON.parse', function() {
|
|
662
|
+
var data = sampleData;
|
|
663
|
+
this.timeout(10000);
|
|
664
|
+
var serialized = JSON.stringify(data);
|
|
665
|
+
console.log('JSON size', serialized.length);
|
|
666
|
+
for (var i = 0; i < ITERATIONS; i++) {
|
|
667
|
+
var deserialized = JSON.parse(serialized);
|
|
668
|
+
}
|
|
669
|
+
});
|
|
670
|
+
test('performance JSON.stringify', function() {
|
|
671
|
+
var data = sampleData;
|
|
672
|
+
this.timeout(10000);
|
|
673
|
+
for (var i = 0; i < ITERATIONS; i++) {
|
|
674
|
+
var serialized = JSON.stringify(data);
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
test('performance decode', function() {
|
|
678
|
+
var data = sampleData;
|
|
679
|
+
this.timeout(10000);
|
|
680
|
+
let structures = [];
|
|
681
|
+
var serialized = encode(data);
|
|
682
|
+
console.log('CBOR size', serialized.length);
|
|
683
|
+
let encoder = new Encoder({ structures, bundleStrings: true });
|
|
684
|
+
var serialized = encoder.encode(data);
|
|
685
|
+
console.log('CBOR w/ record ext size', serialized.length);
|
|
686
|
+
for (var i = 0; i < ITERATIONS; i++) {
|
|
687
|
+
var deserialized = encoder.decode(serialized);
|
|
688
|
+
}
|
|
689
|
+
});
|
|
690
|
+
test('performance encode', function() {
|
|
691
|
+
var data = sampleData;
|
|
692
|
+
this.timeout(10000);
|
|
693
|
+
let structures = [];
|
|
694
|
+
let encoder = new Encoder({ structures, bundleStrings: true });
|
|
695
|
+
let buffer = typeof Buffer != 'undefined' ? Buffer.alloc(0x10000) : new Uint8Array(0x10000);
|
|
583
696
|
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
const senmlKeys = { bs: -6, bv: -5, bu: -4, bt: -3, bn: -2, n: 0, u: 1, v: 2, vs: 3, t: 6, ut: 7, vd: 8 };
|
|
594
|
-
|
|
595
|
-
//import inspector from 'inspector'; inspector.open(9229, null, true); debugger
|
|
596
|
-
function tryRequire(module) {
|
|
597
|
-
try {
|
|
598
|
-
return require(module)
|
|
599
|
-
} catch(error) {
|
|
600
|
-
return {}
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
var assert = chai.assert;
|
|
604
|
-
|
|
605
|
-
var Encoder = CBOR.Encoder;
|
|
606
|
-
var decode = CBOR.decode;
|
|
607
|
-
var encode = CBOR.encode;
|
|
608
|
-
var DECIMAL_FIT = CBOR.DECIMAL_FIT;
|
|
609
|
-
|
|
610
|
-
var addExtension = CBOR.addExtension;
|
|
611
|
-
|
|
612
|
-
var zlib = tryRequire('zlib');
|
|
613
|
-
var deflateSync = zlib.deflateSync;
|
|
614
|
-
var inflateSync = zlib.inflateSync;
|
|
615
|
-
var deflateSync = zlib.brotliCompressSync;
|
|
616
|
-
var inflateSync = zlib.brotliDecompressSync;
|
|
617
|
-
var constants = zlib.constants;
|
|
618
|
-
|
|
619
|
-
var ITERATIONS = 4000;
|
|
620
|
-
|
|
621
|
-
suite('CBOR basic tests', function(){
|
|
622
|
-
|
|
623
|
-
test('encode/decode with keyMaps (basic)', function() {
|
|
624
|
-
var data = senmlData;
|
|
625
|
-
let cborSenml = new Encoder({ useRecords: false, keyMap: senmlKeys });
|
|
626
|
-
let cborBasic = new Encoder();
|
|
627
|
-
var serialized = cborSenml.encode(data);
|
|
628
|
-
var deserialized = cborSenml.decode(serialized);
|
|
629
|
-
assert(serialized.length < cborBasic.encode(data).length);
|
|
630
|
-
assert.deepEqual(deserialized, data);
|
|
631
|
-
});
|
|
632
|
-
|
|
633
|
-
test('encode/decode with keyMaps and Records)', function() {
|
|
634
|
-
var data = senmlData;
|
|
635
|
-
let cborSenml = new Encoder({ useRecords: true, keyMap: senmlKeys });
|
|
636
|
-
let cborBasic = new Encoder();
|
|
637
|
-
var serialized = cborSenml.encode(data);
|
|
638
|
-
var deserialized = cborSenml.decode(serialized);
|
|
639
|
-
assert(serialized.length < cborBasic.encode(data).length);
|
|
640
|
-
assert.deepEqual(deserialized, data);
|
|
641
|
-
});
|
|
642
|
-
|
|
643
|
-
test('encode/decode data', function(){
|
|
644
|
-
var data = {
|
|
645
|
-
data: [
|
|
646
|
-
{ a: 1, name: 'one', type: 'odd', isOdd: true },
|
|
647
|
-
{ a: 2, name: 'two', type: 'even'},
|
|
648
|
-
{ a: 3, name: 'three', type: 'odd', isOdd: true },
|
|
649
|
-
{ a: 4, name: 'four', type: 'even'},
|
|
650
|
-
{ a: 5, name: 'five', type: 'odd', isOdd: true },
|
|
651
|
-
{ a: 6, name: 'six', type: 'even', isOdd: null }
|
|
652
|
-
],
|
|
653
|
-
description: 'some names',
|
|
654
|
-
types: ['odd', 'even'],
|
|
655
|
-
convertEnumToNum: [
|
|
656
|
-
{ prop: 'test' },
|
|
657
|
-
{ prop: 'test' },
|
|
658
|
-
{ prop: 'test' },
|
|
659
|
-
{ prop: 1 },
|
|
660
|
-
{ prop: 2 },
|
|
661
|
-
{ prop: [undefined] },
|
|
662
|
-
{ prop: null }
|
|
663
|
-
]
|
|
664
|
-
};
|
|
665
|
-
let structures = [];
|
|
666
|
-
let encoder = new Encoder({ structures });
|
|
667
|
-
var serialized = encoder.encode(data);
|
|
668
|
-
serialized = encoder.encode(data);
|
|
669
|
-
var deserialized = encoder.decode(serialized);
|
|
670
|
-
assert.deepEqual(deserialized, data);
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
test('mixed structures, shared', function(){
|
|
674
|
-
let data1 = { a: 1, b: 2, c: 3 };
|
|
675
|
-
let data2 = { a: 1, b: 2, d: 4 };
|
|
676
|
-
let data3 = { a: 1, b: 2, e: 5 };
|
|
677
|
-
let structures = [];
|
|
678
|
-
let encoder = new Encoder({ structures });
|
|
679
|
-
var serialized = encoder.encode(data1);
|
|
680
|
-
var deserialized = encoder.decode(serialized);
|
|
681
|
-
assert.deepEqual(deserialized, data1);
|
|
682
|
-
var serialized = encoder.encode(data2);
|
|
683
|
-
var deserialized = encoder.decode(serialized);
|
|
684
|
-
assert.deepEqual(deserialized, data2);
|
|
685
|
-
var serialized = encoder.encode(data3);
|
|
686
|
-
var deserialized = encoder.decode(serialized);
|
|
687
|
-
assert.deepEqual(deserialized, data3);
|
|
688
|
-
});
|
|
689
|
-
|
|
690
|
-
test('mixed structures, unshared', function(){
|
|
691
|
-
let data = [];
|
|
692
|
-
let encoder = new Encoder({ });
|
|
693
|
-
for (let i = 0; i< 1000; i++) {
|
|
694
|
-
data.push({a: 1, ['test' + i]: i});
|
|
695
|
-
}
|
|
696
|
-
var serialized = encoder.encode(data);
|
|
697
|
-
var deserialized = encoder.decode(serialized);
|
|
698
|
-
assert.deepEqual(deserialized, data);
|
|
699
|
-
serialized = encoder.encode(data);
|
|
700
|
-
deserialized = encoder.decode(serialized);
|
|
701
|
-
assert.deepEqual(deserialized, data);
|
|
702
|
-
});
|
|
703
|
-
|
|
704
|
-
test('mixed array', function(){
|
|
705
|
-
var data = [
|
|
706
|
-
'one',
|
|
707
|
-
'two',
|
|
708
|
-
'one',
|
|
709
|
-
10,
|
|
710
|
-
11,
|
|
711
|
-
null,
|
|
712
|
-
true,
|
|
713
|
-
'three',
|
|
714
|
-
'three',
|
|
715
|
-
'one', [
|
|
716
|
-
3, -5, -50, -400,1.3, -5.3, true
|
|
717
|
-
]
|
|
718
|
-
];
|
|
719
|
-
let structures = [];
|
|
720
|
-
let encoder = new Encoder({ structures });
|
|
721
|
-
var serialized = encoder.encode(data);
|
|
722
|
-
var deserialized = encoder.decode(serialized);
|
|
723
|
-
assert.deepEqual(deserialized, data);
|
|
724
|
-
});
|
|
725
|
-
|
|
726
|
-
test('255 chars', function() {
|
|
727
|
-
const data = 'RRZG9A6I7xupPeOZhxcOcioFsuhszGOdyDUcbRf4Zef2kdPIfC9RaLO4jTM5JhuZvTsF09fbRHMGtqk7YAgu3vespeTe9l61ziZ6VrMnYu2CamK96wCkmz0VUXyqaiUoTPgzk414LS9yYrd5uh7w18ksJF5SlC2e91rukWvNqAZJjYN3jpkqHNOFchCwFrhbxq2Lrv1kSJPYCx9blRg2hGmYqTbElLTZHv20iNqwZeQbRMgSBPT6vnbCBPnOh1W';
|
|
728
|
-
var serialized = CBOR.encode(data);
|
|
729
|
-
var deserialized = CBOR.decode(serialized);
|
|
730
|
-
assert.equal(deserialized, data);
|
|
731
|
-
});
|
|
732
|
-
|
|
733
|
-
test('encode/decode sample data', function(){
|
|
734
|
-
var data = sampleData;
|
|
735
|
-
var serialized = CBOR.encode(data);
|
|
736
|
-
var deserialized = CBOR.decode(serialized);
|
|
737
|
-
assert.deepEqual(deserialized, data);
|
|
738
|
-
var serialized = CBOR.encode(data);
|
|
739
|
-
var deserialized = CBOR.decode(serialized);
|
|
740
|
-
assert.deepEqual(deserialized, data);
|
|
741
|
-
});
|
|
742
|
-
test('encode/decode sample data with records', function(){
|
|
743
|
-
var data = sampleData;
|
|
744
|
-
let sharedSerialized;
|
|
745
|
-
let encoder = new Encoder({ getStructures() { return }, saveStructures(shared) { sharedSerialized = encode(shared); }, useRecords: true });
|
|
746
|
-
var serialized = encoder.encode(data);
|
|
747
|
-
encoder = new Encoder({ getStructures() { return decode(sharedSerialized) }, saveStructures(shared) { sharedSerialized = encode(shared); }, useRecords: true });
|
|
748
|
-
var deserialized = encoder.decode(serialized);
|
|
749
|
-
assert.deepEqual(deserialized, data);
|
|
750
|
-
});
|
|
751
|
-
test('encode/decode sample data with packing', function(){
|
|
752
|
-
var data = sampleData;
|
|
753
|
-
let encoder = new Encoder({ pack: true, useRecords: false });
|
|
754
|
-
var serialized = encoder.encode(data);
|
|
755
|
-
var deserialized = encoder.decode(serialized);
|
|
756
|
-
assert.deepEqual(deserialized, data);
|
|
757
|
-
});
|
|
758
|
-
test('encode/decode sample data with packing and records', function(){
|
|
759
|
-
var data = sampleData;
|
|
760
|
-
let encoder = new Encoder({ useStringRefs: true });
|
|
761
|
-
var serialized = encoder.encode(data);
|
|
762
|
-
var deserialized = encoder.decode(serialized);
|
|
763
|
-
assert.deepEqual(deserialized, data);
|
|
764
|
-
});
|
|
765
|
-
test('encode/decode sample data with shared packing and records', function(){
|
|
766
|
-
let encoder = new Encoder({ useRecords: true });
|
|
767
|
-
let finishPack = encoder.findCommonStringsToPack();
|
|
768
|
-
for (let i = 0; i < 20; i++) {
|
|
769
|
-
let data = {
|
|
770
|
-
shouldShare: 'same each time',
|
|
771
|
-
shouldShare2: 'same each time 2',
|
|
772
|
-
shouldntShare: 'different each time ' + i
|
|
773
|
-
};
|
|
774
|
-
if (i == 10)
|
|
775
|
-
finishPack({});
|
|
776
|
-
var serialized = encoder.encode(data);
|
|
777
|
-
var deserialized = encoder.decode(serialized);
|
|
778
|
-
assert.deepEqual(deserialized, data);
|
|
779
|
-
}
|
|
780
|
-
});
|
|
781
|
-
test('encode/decode sample data with individual packing, shared packing and records', function(){
|
|
782
|
-
let encoder = new Encoder({ pack: true, useRecords: true });
|
|
783
|
-
let finishPack = encoder.findCommonStringsToPack();
|
|
784
|
-
for (let i = 0; i < 20; i++) {
|
|
785
|
-
let data = {
|
|
786
|
-
shouldShare: 'same each time',
|
|
787
|
-
shouldShare2: 'same each time',
|
|
788
|
-
shouldntShare: 'different each time ' + i,
|
|
789
|
-
shouldntShare2: 'different each time ' + i,
|
|
790
|
-
noPack: 'no packing ' + i,
|
|
791
|
-
};
|
|
792
|
-
if (i == 10)
|
|
793
|
-
finishPack({ threshold: 5 });
|
|
794
|
-
var serialized = encoder.encode(data);
|
|
795
|
-
var deserialized = encoder.decode(serialized);
|
|
796
|
-
assert.deepEqual(deserialized, data);
|
|
797
|
-
}
|
|
798
|
-
});
|
|
799
|
-
test('pack/unpack sample data with bundled strings', function(){
|
|
800
|
-
var data = sampleData;
|
|
801
|
-
let encoder = new Encoder({ /*structures,*/ useRecords: false, bundleStrings: true });
|
|
802
|
-
var serialized = encoder.encode(data);
|
|
803
|
-
var deserialized = encoder.decode(serialized);
|
|
804
|
-
assert.deepEqual(deserialized, data);
|
|
805
|
-
});
|
|
806
|
-
test('pack/unpack sample data with self-descriptive header', function(){
|
|
807
|
-
var data = sampleData;
|
|
808
|
-
let encoder = new Encoder({ useSelfDescribedHeader: true });
|
|
809
|
-
var serialized = encoder.encode(data);
|
|
810
|
-
var deserialized = encoder.decode(serialized);
|
|
811
|
-
assert.deepEqual(deserialized, data);
|
|
812
|
-
assert.equal(serialized[0], 0xd9);
|
|
813
|
-
assert.equal(serialized[1], 0xd9);
|
|
814
|
-
assert.equal(serialized[2], 0xf7);
|
|
815
|
-
});
|
|
816
|
-
if (typeof Buffer != 'undefined')
|
|
817
|
-
test('replace data', function(){
|
|
818
|
-
var data1 = {
|
|
819
|
-
data: [
|
|
820
|
-
{ a: 1, name: 'one', type: 'odd', isOdd: true, a: '13 characters' },
|
|
821
|
-
{ a: 2, name: 'two', type: 'even', a: '11 characte' },
|
|
822
|
-
{ a: 3, name: 'three', type: 'odd', isOdd: true, a: '12 character' },
|
|
823
|
-
{ a: 4, name: 'four', type: 'even', a: '9 charact'},
|
|
824
|
-
{ a: 5, name: 'five', type: 'odd', isOdd: true, a: '14 characters!' },
|
|
825
|
-
{ a: 6, name: 'six', type: 'even', isOdd: null }
|
|
826
|
-
],
|
|
827
|
-
};
|
|
828
|
-
var data2 = {
|
|
829
|
-
data: [
|
|
830
|
-
{ foo: 7, name: 'one', type: 'odd', isOdd: true },
|
|
831
|
-
{ foo: 8, name: 'two', type: 'even'},
|
|
832
|
-
{ foo: 9, name: 'three', type: 'odd', isOdd: true },
|
|
833
|
-
{ foo: 10, name: 'four', type: 'even'},
|
|
834
|
-
{ foo: 11, name: 'five', type: 'odd', isOdd: true },
|
|
835
|
-
{ foo: 12, name: 'six', type: 'even', isOdd: null }
|
|
836
|
-
],
|
|
837
|
-
};
|
|
838
|
-
var serialized1 = encode(data1);
|
|
839
|
-
var serialized2 = encode(data2);
|
|
840
|
-
var b = Buffer.alloc(8000);
|
|
841
|
-
serialized1.copy(b);
|
|
842
|
-
var deserialized1 = decode(b, serialized1.length);
|
|
843
|
-
serialized2.copy(b);
|
|
844
|
-
var deserialized2 = decode(b, serialized2.length);
|
|
845
|
-
assert.deepEqual(deserialized1, data1);
|
|
846
|
-
assert.deepEqual(deserialized2, data2);
|
|
847
|
-
});
|
|
848
|
-
|
|
849
|
-
test('extended class encode/decode', function(){
|
|
850
|
-
function Extended() {
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
Extended.prototype.getDouble = function() {
|
|
854
|
-
return this.value * 2
|
|
855
|
-
};
|
|
856
|
-
var instance = new Extended();
|
|
857
|
-
instance.value = 4;
|
|
858
|
-
instance.string = 'decode this: ᾜ';
|
|
859
|
-
var data = {
|
|
860
|
-
prop1: 'has multi-byte: ᾜ',
|
|
861
|
-
extendedInstance: instance,
|
|
862
|
-
prop2: 'more string',
|
|
863
|
-
num: 3,
|
|
864
|
-
};
|
|
865
|
-
let encoder = new Encoder();
|
|
866
|
-
addExtension({
|
|
867
|
-
Class: Extended,
|
|
868
|
-
tag: 300,
|
|
869
|
-
decode: function(data) {
|
|
870
|
-
let e = new Extended();
|
|
871
|
-
e.value = data[0];
|
|
872
|
-
e.string = data[1];
|
|
873
|
-
return e
|
|
874
|
-
},
|
|
875
|
-
encode: function(instance) {
|
|
876
|
-
return encoder.encode([instance.value, instance.string])
|
|
877
|
-
}
|
|
878
|
-
});
|
|
879
|
-
var serialized = encode(data);
|
|
880
|
-
var deserialized = decode(serialized);
|
|
881
|
-
assert.deepEqual(data, deserialized);
|
|
882
|
-
assert.equal(deserialized.extendedInstance.getDouble(), 8);
|
|
883
|
-
});
|
|
884
|
-
|
|
885
|
-
test.skip('text decoder', function() {
|
|
886
|
-
let td = new TextDecoder('ISO-8859-15');
|
|
887
|
-
let b = Buffer.alloc(3);
|
|
888
|
-
for (var i = 0; i < 256; i++) {
|
|
889
|
-
b[0] = i;
|
|
890
|
-
b[1] = 0;
|
|
891
|
-
b[2] = 0;
|
|
892
|
-
let s = td.decode(b);
|
|
893
|
-
if (!require('CBOR-extract').isOneByte(s)) {
|
|
894
|
-
console.log(i.toString(16), s.length);
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
|
-
});
|
|
898
|
-
|
|
899
|
-
test('structured cloning: self reference', function() {
|
|
900
|
-
let object = {
|
|
901
|
-
test: 'string',
|
|
902
|
-
children: [
|
|
903
|
-
{ name: 'child' }
|
|
904
|
-
]
|
|
905
|
-
};
|
|
906
|
-
object.self = object;
|
|
907
|
-
object.children[1] = object;
|
|
908
|
-
object.children[2] = object.children[0];
|
|
909
|
-
object.childrenAgain = object.children;
|
|
910
|
-
let encoder = new Encoder({
|
|
911
|
-
structuredClone: true,
|
|
912
|
-
});
|
|
913
|
-
var serialized = encoder.encode(object);
|
|
914
|
-
var deserialized = encoder.decode(serialized);
|
|
915
|
-
assert.equal(deserialized.self, deserialized);
|
|
916
|
-
assert.equal(deserialized.children[0].name, 'child');
|
|
917
|
-
assert.equal(deserialized.children[1], deserialized);
|
|
918
|
-
assert.equal(deserialized.children[0], deserialized.children[2]);
|
|
919
|
-
assert.equal(deserialized.children, deserialized.childrenAgain);
|
|
920
|
-
});
|
|
921
|
-
|
|
922
|
-
test('structured cloning: types', function() {
|
|
923
|
-
let b = typeof Buffer != 'undefined' ? Buffer.alloc(20) : new Uint8Array(20);
|
|
924
|
-
let fa = new Float32Array(b.buffer, 8, 2);
|
|
925
|
-
fa[0] = 2.25;
|
|
926
|
-
fa[1] = 6;
|
|
927
|
-
let f64a = new Float64Array([2.3, 4.7]);
|
|
928
|
-
let map = new Map();
|
|
929
|
-
map.set('key', 'value');
|
|
930
|
-
let object = {
|
|
931
|
-
error: new Error('test'),
|
|
932
|
-
set: new Set(['a', 'b']),
|
|
933
|
-
regexp: /test/gi,
|
|
934
|
-
map,
|
|
935
|
-
float32Array: fa,
|
|
936
|
-
float64Array: f64a,
|
|
937
|
-
uint16Array: new Uint16Array([3,4])
|
|
938
|
-
};
|
|
939
|
-
let encoder = new Encoder({
|
|
940
|
-
structuredClone: true,
|
|
941
|
-
});
|
|
942
|
-
var serialized = encoder.encode(object);
|
|
943
|
-
var deserialized = encoder.decode(serialized);
|
|
944
|
-
assert.deepEqual(Array.from(deserialized.set), Array.from(object.set));
|
|
945
|
-
assert.equal(deserialized.map.get('key'), 'value');
|
|
946
|
-
assert.equal(deserialized.error.message, object.error.message);
|
|
947
|
-
assert.equal(deserialized.regexp.test('TEST'), true);
|
|
948
|
-
assert.equal(deserialized.float32Array.constructor.name, 'Float32Array');
|
|
949
|
-
assert.equal(deserialized.float32Array[0], 2.25);
|
|
950
|
-
assert.equal(deserialized.float32Array[1], 6);
|
|
951
|
-
assert.equal(deserialized.float64Array[0], 2.3);
|
|
952
|
-
assert.equal(deserialized.float64Array[1], 4.7);
|
|
953
|
-
assert.equal(deserialized.uint16Array.constructor.name, 'Uint16Array');
|
|
954
|
-
assert.equal(deserialized.uint16Array[0], 3);
|
|
955
|
-
assert.equal(deserialized.uint16Array[1], 4);
|
|
956
|
-
});
|
|
957
|
-
|
|
958
|
-
test('explicit maps and sets', function () {
|
|
959
|
-
let map = new Map();
|
|
960
|
-
map.set('key', { inside: 'value'});
|
|
961
|
-
let object = {
|
|
962
|
-
set: new Set(['a', 'b']),
|
|
963
|
-
map,
|
|
964
|
-
};
|
|
965
|
-
var serialized = encode(object); // default encoder
|
|
966
|
-
var deserialized = decode(serialized);
|
|
967
|
-
assert.deepEqual(Array.from(deserialized.set), Array.from(object.set));
|
|
968
|
-
assert.equal(deserialized.map.get('key').inside, 'value');
|
|
969
|
-
});
|
|
970
|
-
|
|
971
|
-
test('object without prototype', function(){
|
|
972
|
-
var data = Object.create(null);
|
|
973
|
-
data.test = 3;
|
|
974
|
-
var serialized = encode(data);
|
|
975
|
-
var deserialized = decode(serialized);
|
|
976
|
-
assert.deepEqual(deserialized, data);
|
|
977
|
-
});
|
|
978
|
-
|
|
979
|
-
test('big buffer', function() {
|
|
980
|
-
var size = 100000000;
|
|
981
|
-
var data = new Uint8Array(size).fill(1);
|
|
982
|
-
var encoded = encode(data);
|
|
983
|
-
var decoded = decode(encoded);
|
|
984
|
-
assert.equal(decoded.length, size);
|
|
985
|
-
});
|
|
986
|
-
test('little buffer', function() {
|
|
987
|
-
var data = typeof Buffer == 'undefined' ? new Uint8Array(0) : Buffer.alloc(0);
|
|
988
|
-
var encoded = encode(data);
|
|
989
|
-
assert.equal(encoded.length, 1); // make sure to use canonical form
|
|
990
|
-
var decoded = decode(encoded);
|
|
991
|
-
assert.equal(decoded.length, 0);
|
|
992
|
-
});
|
|
993
|
-
|
|
994
|
-
test('random strings', function(){
|
|
995
|
-
var data = [];
|
|
996
|
-
for (var i = 0; i < 2000; i++) {
|
|
997
|
-
var str = 'test';
|
|
998
|
-
while (Math.random() < 0.7 && str.length < 0x100000) {
|
|
999
|
-
str = str + String.fromCharCode(90/(Math.random() + 0.01)) + str;
|
|
1000
|
-
}
|
|
1001
|
-
data.push(str);
|
|
1002
|
-
}
|
|
1003
|
-
var serialized = encode(data);
|
|
1004
|
-
var deserialized = decode(serialized);
|
|
1005
|
-
assert.deepEqual(deserialized, data);
|
|
1006
|
-
});
|
|
1007
|
-
|
|
1008
|
-
test('map/date', function(){
|
|
1009
|
-
var map = new Map();
|
|
1010
|
-
map.set(4, 'four');
|
|
1011
|
-
map.set('three', 3);
|
|
1012
|
-
let year2039 = new Date('2039-07-05T16:22:35.792Z');
|
|
1013
|
-
let year2038 = new Date('2038-08-06T00:19:02.911Z');
|
|
1014
|
-
|
|
1015
|
-
var data = {
|
|
1016
|
-
map: map,
|
|
1017
|
-
date: new Date(1532219539733),
|
|
1018
|
-
farFutureDate: new Date(3532219539133),
|
|
1019
|
-
ancient: new Date(-3532219539133),
|
|
1020
|
-
year2038,
|
|
1021
|
-
year2039,
|
|
1022
|
-
invalidDate: new Date('invalid')
|
|
1023
|
-
};
|
|
1024
|
-
let encoder = new Encoder();
|
|
1025
|
-
var serialized = encoder.encode(data);
|
|
1026
|
-
var deserialized = encoder.decode(serialized);
|
|
1027
|
-
assert.equal(deserialized.map.get(4), 'four');
|
|
1028
|
-
assert.equal(deserialized.map.get('three'), 3);
|
|
1029
|
-
assert.equal(deserialized.date.getTime(), 1532219539733);
|
|
1030
|
-
assert.equal(deserialized.farFutureDate.getTime(), 3532219539133);
|
|
1031
|
-
assert.equal(deserialized.ancient.getTime(), -3532219539133);
|
|
1032
|
-
assert.equal(deserialized.year2038.getTime(), year2038.getTime());
|
|
1033
|
-
assert.equal(deserialized.year2039.getTime(), year2039.getTime());
|
|
1034
|
-
assert.equal(deserialized.invalidDate.toString(), 'Invalid Date');
|
|
1035
|
-
});
|
|
1036
|
-
test('map/date with options', function(){
|
|
1037
|
-
var map = new Map();
|
|
1038
|
-
map.set(4, 'four');
|
|
1039
|
-
map.set('three', 3);
|
|
1040
|
-
var data = {
|
|
1041
|
-
map: map,
|
|
1042
|
-
date: new Date(1532219539011),
|
|
1043
|
-
invalidDate: new Date('invalid')
|
|
1044
|
-
};
|
|
1045
|
-
let encoder = new Encoder({
|
|
1046
|
-
mapsAsObjects: true,
|
|
1047
|
-
useTimestamp32: true,
|
|
1048
|
-
useTag259ForMaps: false,
|
|
1049
|
-
});
|
|
1050
|
-
var serialized = encoder.encode(data);
|
|
1051
|
-
var deserialized = encoder.decode(serialized);
|
|
1052
|
-
assert.equal(deserialized.map[4], 'four');
|
|
1053
|
-
assert.equal(deserialized.map.three, 3);
|
|
1054
|
-
assert.equal(deserialized.date.getTime(), 1532219539000);
|
|
1055
|
-
assert.isTrue(isNaN(deserialized.invalidDate.getTime()));
|
|
1056
|
-
});
|
|
1057
|
-
test('key caching', function() {
|
|
1058
|
-
var data = {
|
|
1059
|
-
foo: 2,
|
|
1060
|
-
bar: 'test',
|
|
1061
|
-
four: 4,
|
|
1062
|
-
seven: 7,
|
|
1063
|
-
foz: 3,
|
|
1064
|
-
};
|
|
1065
|
-
var serialized = CBOR.encode(data);
|
|
1066
|
-
var deserialized = CBOR.decode(serialized);
|
|
1067
|
-
assert.deepEqual(deserialized, data);
|
|
1068
|
-
// do multiple times to test caching
|
|
1069
|
-
var serialized = CBOR.encode(data);
|
|
1070
|
-
var deserialized = CBOR.decode(serialized);
|
|
1071
|
-
assert.deepEqual(deserialized, data);
|
|
1072
|
-
var serialized = CBOR.encode(data);
|
|
1073
|
-
var deserialized = CBOR.decode(serialized);
|
|
1074
|
-
assert.deepEqual(deserialized, data);
|
|
1075
|
-
});
|
|
1076
|
-
test('strings', function() {
|
|
1077
|
-
var data = [''];
|
|
1078
|
-
var serialized = encode(data);
|
|
1079
|
-
var deserialized = decode(serialized);
|
|
1080
|
-
assert.deepEqual(deserialized, data);
|
|
1081
|
-
// do multiple times
|
|
1082
|
-
var serialized = encode(data);
|
|
1083
|
-
var deserialized = decode(serialized);
|
|
1084
|
-
assert.deepEqual(deserialized, data);
|
|
1085
|
-
data = 'decode this: ᾜ';
|
|
1086
|
-
var serialized = encode(data);
|
|
1087
|
-
var deserialized = decode(serialized);
|
|
1088
|
-
assert.deepEqual(deserialized, data);
|
|
1089
|
-
data = 'decode this that is longer but without any non-latin characters';
|
|
1090
|
-
var serialized = encode(data);
|
|
1091
|
-
var deserialized = decode(serialized);
|
|
1092
|
-
assert.deepEqual(deserialized, data);
|
|
1093
|
-
});
|
|
1094
|
-
test('decimal float32', function() {
|
|
1095
|
-
var data = {
|
|
1096
|
-
a: 2.526,
|
|
1097
|
-
b: 0.0035235,
|
|
1098
|
-
c: 0.00000000000352501,
|
|
1099
|
-
d: 3252.77,
|
|
1100
|
-
};
|
|
1101
|
-
let encoder = new Encoder({
|
|
1102
|
-
useFloat32: DECIMAL_FIT
|
|
1103
|
-
});
|
|
1104
|
-
var serialized = encoder.encode(data);
|
|
1105
|
-
assert.equal(serialized.length, 36);
|
|
1106
|
-
var deserialized = encoder.decode(serialized);
|
|
1107
|
-
assert.deepEqual(deserialized, data);
|
|
1108
|
-
});
|
|
1109
|
-
test('bigint to float', function() {
|
|
1110
|
-
var data = {
|
|
1111
|
-
a: 325283295382932843n
|
|
1112
|
-
};
|
|
1113
|
-
let encoder = new Encoder({
|
|
1114
|
-
int64AsNumber: true
|
|
1115
|
-
});
|
|
1116
|
-
var serialized = encoder.encode(data);
|
|
1117
|
-
var deserialized = encoder.decode(serialized);
|
|
1118
|
-
assert.deepEqual(deserialized.a, 325283295382932843);
|
|
1119
|
-
});
|
|
1120
|
-
test('numbers', function(){
|
|
1121
|
-
var data = {
|
|
1122
|
-
bigEncodable: 48978578104322,
|
|
1123
|
-
dateEpoch: 1530886513200,
|
|
1124
|
-
realBig: 3432235352353255323,
|
|
1125
|
-
decimal: 32.55234,
|
|
1126
|
-
negative: -34.11,
|
|
1127
|
-
exponential: 0.234e123,
|
|
1128
|
-
tiny: 3.233e-120,
|
|
1129
|
-
zero: 0,
|
|
1130
|
-
//negativeZero: -0,
|
|
1131
|
-
Infinity: Infinity
|
|
1132
|
-
};
|
|
1133
|
-
var serialized = encode(data);
|
|
1134
|
-
var deserialized = decode(serialized);
|
|
1135
|
-
assert.deepEqual(deserialized, data);
|
|
1136
|
-
});
|
|
1137
|
-
|
|
1138
|
-
test('iterator/indefinite length array', function(){
|
|
1139
|
-
class NotArray {
|
|
1140
|
-
}
|
|
1141
|
-
let data = ['a', 'b', 'c', ['d']]; // iterable
|
|
1142
|
-
data.constructor = NotArray;
|
|
1143
|
-
var serialized = encode(data);
|
|
1144
|
-
var deserialized = decode(serialized);
|
|
1145
|
-
assert.deepEqual(deserialized, data);
|
|
1146
|
-
});
|
|
1147
|
-
test('bigint', function(){
|
|
1148
|
-
var data = {
|
|
1149
|
-
bigintSmall: 352n,
|
|
1150
|
-
bigintSmallNegative: -333335252n,
|
|
1151
|
-
bigintBig: 2n**64n - 1n, // biggest possible
|
|
1152
|
-
bigintBigNegative: -(2n**63n), // largest negative
|
|
1153
|
-
mixedWithNormal: 44,
|
|
1154
|
-
};
|
|
1155
|
-
var serialized = encode(data);
|
|
1156
|
-
var deserialized = decode(serialized);
|
|
1157
|
-
assert.deepEqual(deserialized, data);
|
|
1158
|
-
var tooBigInt = {
|
|
1159
|
-
tooBig: 2n**66n
|
|
1160
|
-
};
|
|
1161
|
-
assert.throws(function(){ serialized = encode(tooBigInt); });
|
|
1162
|
-
let encoder = new Encoder({
|
|
1163
|
-
largeBigIntToFloat: true
|
|
1164
|
-
});
|
|
1165
|
-
serialized = encoder.encode(tooBigInt);
|
|
1166
|
-
deserialized = decode(serialized);
|
|
1167
|
-
assert.isTrue(deserialized.tooBig > 2n**65n);
|
|
1168
|
-
});
|
|
1169
|
-
|
|
1170
|
-
test('buffers', function() {
|
|
1171
|
-
var data = {
|
|
1172
|
-
buffer1: new Uint8Array([2,3,4]),
|
|
1173
|
-
buffer2: new Uint8Array(encode(sampleData))
|
|
1174
|
-
};
|
|
1175
|
-
var serialized = encode(data);
|
|
1176
|
-
var deserialized = decode(serialized);
|
|
1177
|
-
assert.deepEqual(deserialized, data);
|
|
1178
|
-
});
|
|
1179
|
-
|
|
1180
|
-
test('noteencode test', function() {
|
|
1181
|
-
const data = {
|
|
1182
|
-
foo: 1,
|
|
1183
|
-
bar: [1, 2, 3, 4, 'abc', 'def'],
|
|
1184
|
-
foobar: {
|
|
1185
|
-
foo: true,
|
|
1186
|
-
bar: -2147483649,
|
|
1187
|
-
foobar: {
|
|
1188
|
-
foo: new Uint8Array([1, 2, 3, 4, 5]),
|
|
1189
|
-
bar: 1.5,
|
|
1190
|
-
foobar: [true, false, 'abcdefghijkmonpqrstuvwxyz']
|
|
1191
|
-
}
|
|
1192
|
-
}
|
|
1193
|
-
};
|
|
1194
|
-
var serialized = encode(data);
|
|
1195
|
-
var deserialized = decode(serialized);
|
|
1196
|
-
var deserialized = decode(serialized);
|
|
1197
|
-
var deserialized = decode(serialized);
|
|
1198
|
-
assert.deepEqual(deserialized, data);
|
|
1199
|
-
});
|
|
1200
|
-
|
|
1201
|
-
test('utf16 causing expansion', function() {
|
|
1202
|
-
this.timeout(10000);
|
|
1203
|
-
let data = {fixstr: 'ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝ', str8:'ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝ'};
|
|
1204
|
-
var serialized = encode(data);
|
|
1205
|
-
var deserialized = decode(serialized);
|
|
1206
|
-
assert.deepEqual(deserialized, data);
|
|
1207
|
-
});
|
|
1208
|
-
test('decodeMultiple', () => {
|
|
1209
|
-
let values = CBOR.decodeMultiple(new Uint8Array([1, 2, 3, 4]));
|
|
1210
|
-
assert.deepEqual(values, [1, 2, 3, 4]);
|
|
1211
|
-
values = [];
|
|
1212
|
-
CBOR.decodeMultiple(new Uint8Array([1, 2, 3, 4]), value => values.push(value));
|
|
1213
|
-
assert.deepEqual(values, [1, 2, 3, 4]);
|
|
1214
|
-
});
|
|
1215
|
-
test('bad input', function() {
|
|
1216
|
-
let badInput = Buffer.from('7b2273657269616c6e6f223a2265343a30222c226970223a223139322e3136382e312e3335222c226b6579223a226770735f736563726574227d', 'hex');
|
|
1217
|
-
assert.throws(function(){ decode(badInput); }); // should throw, not crash
|
|
1218
|
-
});
|
|
1219
|
-
});
|
|
1220
|
-
suite('CBOR performance tests', function(){
|
|
1221
|
-
test('performance JSON.parse', function() {
|
|
1222
|
-
var data = sampleData;
|
|
1223
|
-
this.timeout(10000);
|
|
1224
|
-
var serialized = JSON.stringify(data);
|
|
1225
|
-
console.log('JSON size', serialized.length);
|
|
1226
|
-
for (var i = 0; i < ITERATIONS; i++) {
|
|
1227
|
-
var deserialized = JSON.parse(serialized);
|
|
1228
|
-
}
|
|
1229
|
-
});
|
|
1230
|
-
test('performance JSON.stringify', function() {
|
|
1231
|
-
var data = sampleData;
|
|
1232
|
-
this.timeout(10000);
|
|
1233
|
-
for (var i = 0; i < ITERATIONS; i++) {
|
|
1234
|
-
var serialized = JSON.stringify(data);
|
|
1235
|
-
}
|
|
1236
|
-
});
|
|
1237
|
-
test('performance decode', function() {
|
|
1238
|
-
var data = sampleData;
|
|
1239
|
-
this.timeout(10000);
|
|
1240
|
-
let structures = [];
|
|
1241
|
-
var serialized = encode(data);
|
|
1242
|
-
console.log('CBOR size', serialized.length);
|
|
1243
|
-
let encoder = new Encoder({ structures, bundleStrings: true });
|
|
1244
|
-
var serialized = encoder.encode(data);
|
|
1245
|
-
console.log('CBOR w/ record ext size', serialized.length);
|
|
1246
|
-
for (var i = 0; i < ITERATIONS; i++) {
|
|
1247
|
-
var deserialized = encoder.decode(serialized);
|
|
1248
|
-
}
|
|
1249
|
-
});
|
|
1250
|
-
test('performance encode', function() {
|
|
1251
|
-
var data = sampleData;
|
|
1252
|
-
this.timeout(10000);
|
|
1253
|
-
let structures = [];
|
|
1254
|
-
let encoder = new Encoder({ structures, bundleStrings: true });
|
|
1255
|
-
let buffer = typeof Buffer != 'undefined' ? Buffer.alloc(0x10000) : new Uint8Array(0x10000);
|
|
1256
|
-
|
|
1257
|
-
for (var i = 0; i < ITERATIONS; i++) {
|
|
1258
|
-
//serialized = encode(data, { shared: sharedStructure })
|
|
1259
|
-
encoder.useBuffer(buffer);
|
|
1260
|
-
var serialized = encoder.encode(data);
|
|
1261
|
-
//var serializedGzip = deflateSync(serialized)
|
|
1262
|
-
}
|
|
1263
|
-
//console.log('serialized', serialized.length, global.propertyComparisons)
|
|
1264
|
-
});
|
|
697
|
+
for (var i = 0; i < ITERATIONS; i++) {
|
|
698
|
+
//serialized = encode(data, { shared: sharedStructure })
|
|
699
|
+
encoder.useBuffer(buffer);
|
|
700
|
+
var serialized = encoder.encode(data);
|
|
701
|
+
//var serializedGzip = deflateSync(serialized)
|
|
702
|
+
}
|
|
703
|
+
//console.log('serialized', serialized.length, global.propertyComparisons)
|
|
704
|
+
});
|
|
1265
705
|
});
|
|
1266
706
|
|
|
1267
|
-
}(CBOR, chai));
|
|
707
|
+
}(CBOR, chai, fs));
|