@alexgyver/bson 2.2.0 → 3.0.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/bson.js +244 -191
- package/bson.min.js +1 -1
- package/package.json +2 -2
- package/test/index.html +6 -2
package/bson.js
CHANGED
|
@@ -1,230 +1,283 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
|
|
1
|
+
//#region Const
|
|
2
|
+
// type
|
|
3
|
+
const BS_TYPE_MASK = 0b11000000;
|
|
4
|
+
const BS_SUBT = 0 << 6;
|
|
5
|
+
const BS_INT = 1 << 6;
|
|
6
|
+
const BS_STR = 2 << 6;
|
|
7
|
+
const BS_CODE = 3 << 6;
|
|
8
|
+
|
|
9
|
+
// subtype
|
|
10
|
+
const BS_SUBT_MASK = 0b00111000;
|
|
11
|
+
const BS_NULL = 0 << 3;
|
|
12
|
+
const BS_BOOL = 1 << 3;
|
|
13
|
+
const BS_CONT = 2 << 3;
|
|
14
|
+
const BS_FLOAT = 3 << 3;
|
|
15
|
+
const BS_BIN = 4 << 3;
|
|
16
|
+
|
|
17
|
+
// type int
|
|
18
|
+
const BS_INT_SMALL = 1 << 5;
|
|
19
|
+
const BS_INT_NEG = 1 << 4;
|
|
20
|
+
const BS_GET_SMALLV = x => x & 0b11111;
|
|
21
|
+
const BS_GET_INT_LEN = x => x & 0b1111;
|
|
22
|
+
|
|
23
|
+
// type string
|
|
24
|
+
// type code
|
|
25
|
+
const BS_EXT_BITS = 5;
|
|
26
|
+
const BS_EXT_FLAG = 1 << BS_EXT_BITS;
|
|
27
|
+
const BS_EXT_MASK = BS_EXT_FLAG - 1;
|
|
28
|
+
const BS_MAX_EXT_LEN = (1 << (BS_EXT_BITS + 8)) - 1;
|
|
29
|
+
const BS_GET_LSB = x => x & BS_EXT_MASK;
|
|
30
|
+
const BS_GET_MSB = x => x >> BS_EXT_BITS;
|
|
31
|
+
const BS_CODE_PREFIX = "__BS#";
|
|
9
32
|
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const BS_CONT_CLOSE =
|
|
33
|
+
// subtype cont
|
|
34
|
+
const BS_CONT_ARR = 0 << 0;
|
|
35
|
+
const BS_CONT_OBJ = 1 << 0;
|
|
36
|
+
const BS_CONT_CLOSE = 0 << 1;
|
|
37
|
+
const BS_CONT_OPEN = 1 << 1;
|
|
14
38
|
|
|
15
|
-
|
|
39
|
+
// subtype float
|
|
40
|
+
const BS_GET_FLOAT_LEN = x => 1 << ((x) & 0b111);
|
|
41
|
+
const BS_FLOAT_F32 = 2;
|
|
16
42
|
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
const BS_DATA_MASK = 0b00011111;
|
|
20
|
-
const BS_DATA = x => x & BS_DATA_MASK;
|
|
43
|
+
// subtype bin
|
|
44
|
+
const BS_GET_BIN_LEN = x => x & 0b111;
|
|
21
45
|
|
|
22
|
-
|
|
23
|
-
|
|
46
|
+
//#region BSDecoder
|
|
47
|
+
export class BSDecoder {
|
|
48
|
+
offset = 0;
|
|
49
|
+
cont = 'root';
|
|
50
|
+
tdec = new TextDecoder();
|
|
24
51
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
constructor(buf, codes) {
|
|
53
|
+
this.buf = buf;
|
|
54
|
+
this.codes = codes;
|
|
55
|
+
}
|
|
29
56
|
|
|
30
|
-
|
|
57
|
+
decode() {
|
|
58
|
+
if (!(this.buf instanceof Uint8Array) || !this.buf.length) return undefined;
|
|
31
59
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
60
|
+
let res = this._decode();
|
|
61
|
+
if (this.offset != this.buf.length) throw this._err("Broken packet");
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
64
|
+
read(len) {
|
|
65
|
+
if (this.offset + len > this.buf.length) {
|
|
66
|
+
throw this._err("Overflow");
|
|
67
|
+
}
|
|
68
|
+
let res = this.buf.subarray(this.offset, this.offset + len);
|
|
69
|
+
this.offset += len;
|
|
70
|
+
return res;
|
|
71
|
+
}
|
|
72
|
+
readB() {
|
|
73
|
+
return this.read(1)[0];
|
|
74
|
+
}
|
|
75
|
+
readInt(len) {
|
|
76
|
+
let val = 0;
|
|
77
|
+
let bytes = this.read(len);
|
|
78
|
+
while (len--) val = (val << 8) | bytes[len];
|
|
79
|
+
return val;
|
|
80
|
+
}
|
|
81
|
+
_ext(hdr) {
|
|
82
|
+
return BS_GET_LSB(hdr) | ((hdr & BS_EXT_FLAG) ? (this.readB() << BS_EXT_BITS) : 0);
|
|
83
|
+
}
|
|
84
|
+
_close(res, isObj) {
|
|
85
|
+
if (res && res.__close !== undefined) {
|
|
86
|
+
if (isObj === res.__close) return true;
|
|
87
|
+
throw this._err("Wrong close");
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
_err(e) {
|
|
92
|
+
return new Error(e + ' in ' + JSON.stringify(this.cont));
|
|
93
|
+
}
|
|
94
|
+
_decode() {
|
|
95
|
+
const header = this.readB();
|
|
35
96
|
|
|
36
|
-
|
|
97
|
+
let type = header & BS_TYPE_MASK;
|
|
98
|
+
if (type == BS_SUBT) type = header & BS_SUBT_MASK;
|
|
37
99
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export function decodeBson(buf, codes = []) {
|
|
44
|
-
if (!(buf instanceof Uint8Array)) return undefined;
|
|
45
|
-
|
|
46
|
-
const reader = {
|
|
47
|
-
buf,
|
|
48
|
-
offset: 0,
|
|
49
|
-
decoder: new TextDecoder(),
|
|
50
|
-
read(len) {
|
|
51
|
-
if (this.offset + len > buf.length) {
|
|
52
|
-
throw new Error("Overflow");
|
|
53
|
-
}
|
|
54
|
-
const res = this.buf.subarray(this.offset, this.offset + len);
|
|
55
|
-
this.offset += len;
|
|
56
|
-
return res;
|
|
57
|
-
},
|
|
58
|
-
readB() {
|
|
59
|
-
return this.read(1)[0];
|
|
60
|
-
}
|
|
61
|
-
};
|
|
100
|
+
switch (type) {
|
|
101
|
+
case BS_CONT:
|
|
102
|
+
if (header & BS_CONT_OPEN) {
|
|
103
|
+
let isObj = !!(header & BS_CONT_OBJ);
|
|
104
|
+
let cont = isObj ? {} : [];
|
|
62
105
|
|
|
63
|
-
|
|
64
|
-
|
|
106
|
+
while (true) {
|
|
107
|
+
this.cont = cont;
|
|
108
|
+
|
|
109
|
+
let res = this._decode();
|
|
110
|
+
if (this._close(res, isObj)) return cont;
|
|
111
|
+
|
|
112
|
+
if (isObj) {
|
|
113
|
+
let val = this._decode();
|
|
114
|
+
if (this._close(val, isObj)) throw this._err("Missed value");
|
|
65
115
|
|
|
66
|
-
|
|
67
|
-
const header = r.readB();
|
|
68
|
-
const data = BS_DATA(header);
|
|
69
|
-
|
|
70
|
-
switch (BS_TYPE(header)) {
|
|
71
|
-
case BS_CONTAINER:
|
|
72
|
-
if (data & BS_CONT_OPEN) {
|
|
73
|
-
let isArr = !!(data & BS_CONT_ARR);
|
|
74
|
-
let cont = isArr ? [] : {};
|
|
75
|
-
let expect = false;
|
|
76
|
-
let key;
|
|
77
|
-
|
|
78
|
-
while (true) {
|
|
79
|
-
let res = _decode(r, codes);
|
|
80
|
-
|
|
81
|
-
if (res && res.__close !== undefined) {
|
|
82
|
-
if (isArr === res.__close) {
|
|
83
|
-
if (!isArr && expect) throw new Error("Missed value: " + JSON.stringify(cont));
|
|
84
|
-
return cont;
|
|
116
|
+
cont[String(res)] = val;
|
|
85
117
|
} else {
|
|
86
|
-
|
|
118
|
+
cont.push(res);
|
|
87
119
|
}
|
|
88
120
|
}
|
|
121
|
+
}
|
|
122
|
+
return { __close: !!(header & BS_CONT_OBJ) };
|
|
89
123
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
124
|
+
case BS_INT:
|
|
125
|
+
if (header & BS_INT_SMALL) {
|
|
126
|
+
return BS_GET_SMALLV(header);
|
|
127
|
+
} else {
|
|
128
|
+
let val = this.readInt(BS_GET_INT_LEN(header));
|
|
129
|
+
return (header & BS_INT_NEG) ? -val : val;
|
|
97
130
|
}
|
|
98
|
-
} else if (data & BS_CONT_CLOSE) {
|
|
99
|
-
return { __close: !!(data & BS_CONT_ARR) };
|
|
100
|
-
} else {
|
|
101
|
-
throw new Error("Unknown cont: " + JSON.stringify(cont));
|
|
102
|
-
}
|
|
103
|
-
// break;
|
|
104
131
|
|
|
105
|
-
|
|
106
|
-
|
|
132
|
+
case BS_STR:
|
|
133
|
+
return this.tdec.decode(this.read(this._ext(header)));
|
|
107
134
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return r.decoder.decode(r.read(len));
|
|
111
|
-
}
|
|
135
|
+
case BS_CODE:
|
|
136
|
+
return this.codes[this._ext(header)];
|
|
112
137
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (!size) return 0;
|
|
138
|
+
case BS_NULL:
|
|
139
|
+
return null;
|
|
116
140
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
while (size--) value = (value << 8n) | BigInt(bytes[size]);
|
|
141
|
+
case BS_BOOL:
|
|
142
|
+
return !!(header & 1);
|
|
120
143
|
|
|
121
|
-
|
|
122
|
-
|
|
144
|
+
case BS_FLOAT: {
|
|
145
|
+
let len = BS_GET_FLOAT_LEN(header);
|
|
146
|
+
const b = this.read(len);
|
|
147
|
+
let view = new DataView(b.buffer, b.byteOffset, len);
|
|
148
|
+
return (len == 4) ? view.getFloat32(0, true) : ((len == 8) ? view.getFloat64(0, true) : 0);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
case BS_BIN:
|
|
152
|
+
return this.read(this.readInt(BS_GET_BIN_LEN(header))).slice();
|
|
123
153
|
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
//#region BSEncoder
|
|
158
|
+
export class BSEncoder {
|
|
159
|
+
arr = [];
|
|
160
|
+
tenc = new TextEncoder();
|
|
161
|
+
|
|
162
|
+
constructor(codes = []) {
|
|
163
|
+
this.codes = codes;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
getArray() {
|
|
167
|
+
return Uint8Array.from(this.arr);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
encode(val) {
|
|
171
|
+
let a = this.arr;
|
|
172
|
+
|
|
173
|
+
if (Array.isArray(val)) {
|
|
174
|
+
a.push(BS_SUBT | BS_CONT | BS_CONT_ARR | BS_CONT_OPEN);
|
|
175
|
+
val.forEach(v => this.encode(v));
|
|
176
|
+
a.push(BS_SUBT | BS_CONT | BS_CONT_ARR | BS_CONT_CLOSE);
|
|
177
|
+
} else {
|
|
178
|
+
switch (typeof val) {
|
|
179
|
+
case 'object':
|
|
180
|
+
if (val === null) {
|
|
181
|
+
a.push(BS_SUBT | BS_NULL);
|
|
182
|
+
} else if (val instanceof Uint8Array) {
|
|
183
|
+
let lenb = this._int(val.length);
|
|
184
|
+
a.push(BS_SUBT | BS_BIN | lenb.length);
|
|
185
|
+
a.push(...lenb);
|
|
186
|
+
a.push(...val);
|
|
187
|
+
} else {
|
|
188
|
+
a.push(BS_SUBT | BS_CONT | BS_CONT_OBJ | BS_CONT_OPEN);
|
|
189
|
+
for (const [key, value] of Object.entries(val)) {
|
|
190
|
+
this.encode(key);
|
|
191
|
+
this.encode(value);
|
|
192
|
+
}
|
|
193
|
+
a.push(BS_SUBT | BS_CONT | BS_CONT_OBJ | BS_CONT_CLOSE);
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
124
196
|
|
|
125
|
-
|
|
126
|
-
|
|
197
|
+
case 'number':
|
|
198
|
+
if (Number.isInteger(val)) {
|
|
199
|
+
if (val >= 0 && val < BS_INT_SMALL) {
|
|
200
|
+
a.push(BS_INT | BS_INT_SMALL | val);
|
|
201
|
+
} else {
|
|
202
|
+
let neg = val < 0;
|
|
203
|
+
if (neg) val = -val;
|
|
204
|
+
let bytes = this._int(val);
|
|
205
|
+
a.push(BS_INT | (neg ? BS_INT_NEG : 0) | bytes.length);
|
|
206
|
+
a.push(...bytes);
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
const buffer = new ArrayBuffer(4);
|
|
210
|
+
new DataView(buffer).setFloat32(0, val, true);
|
|
211
|
+
a.push(BS_SUBT | BS_FLOAT | BS_FLOAT_F32);
|
|
212
|
+
a.push(...new Uint8Array(buffer));
|
|
213
|
+
}
|
|
214
|
+
break;
|
|
215
|
+
|
|
216
|
+
case 'string':
|
|
217
|
+
if (val.startsWith(BS_CODE_PREFIX)) {
|
|
218
|
+
val = val.slice(BS_CODE_PREFIX.length);
|
|
219
|
+
let code = this.codes.indexOf(val);
|
|
220
|
+
if (code >= 0) this._ext(BS_CODE, code);
|
|
221
|
+
else this.encode(val);
|
|
222
|
+
} else {
|
|
223
|
+
const bytes = this.tenc.encode(val);
|
|
224
|
+
const len = Math.min(bytes.length, BS_MAX_EXT_LEN);
|
|
225
|
+
this._ext(BS_STR, len);
|
|
226
|
+
a.push(...bytes.slice(0, len));
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
127
229
|
|
|
128
|
-
|
|
129
|
-
|
|
230
|
+
case 'boolean':
|
|
231
|
+
a.push(BS_SUBT | BS_BOOL | !!val);
|
|
232
|
+
break;
|
|
130
233
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
234
|
+
default:
|
|
235
|
+
a.push(BS_SUBT | BS_NULL);
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
134
238
|
}
|
|
135
239
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
240
|
+
return this;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
_int(v) {
|
|
244
|
+
let t = [];
|
|
245
|
+
while (v) {
|
|
246
|
+
t.push(v & 0xFF);
|
|
247
|
+
v >>= 8;
|
|
248
|
+
}
|
|
249
|
+
return t;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
_ext(t, v) {
|
|
253
|
+
let a = this.arr;
|
|
254
|
+
if (v < BS_EXT_FLAG) {
|
|
255
|
+
a.push(t | v);
|
|
256
|
+
} else {
|
|
257
|
+
a.push(t | BS_EXT_FLAG | BS_GET_LSB(v));
|
|
258
|
+
a.push(BS_GET_MSB(v));
|
|
139
259
|
}
|
|
140
260
|
}
|
|
141
261
|
}
|
|
142
262
|
|
|
263
|
+
//#region helper
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* @param {Uint8Array} buf
|
|
267
|
+
* @param {Array} codes
|
|
268
|
+
* @returns {Object|Array|*}
|
|
269
|
+
*/
|
|
270
|
+
export function decodeBson(buf, codes = []) {
|
|
271
|
+
return new BSDecoder(buf, codes).decode();
|
|
272
|
+
}
|
|
273
|
+
|
|
143
274
|
/**
|
|
144
275
|
* @param {*} val
|
|
276
|
+
* @param {Array} codes
|
|
145
277
|
* @returns {Uint8Array}
|
|
146
278
|
*/
|
|
147
279
|
export function encodeBson(val, codes = []) {
|
|
148
|
-
|
|
149
|
-
_encode(val, arr, codes);
|
|
150
|
-
return Uint8Array.from(arr);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function _encode(val, arr, codes) {
|
|
154
|
-
if (Array.isArray(val)) {
|
|
155
|
-
arr.push(BS_CONTAINER | BS_CONT_ARR | BS_CONT_OPEN);
|
|
156
|
-
val.forEach(v => _encode(v, arr, codes));
|
|
157
|
-
arr.push(BS_CONTAINER | BS_CONT_ARR | BS_CONT_CLOSE);
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
switch (typeof val) {
|
|
162
|
-
case 'object':
|
|
163
|
-
if (val === null) {
|
|
164
|
-
arr.push(BS_NULL);
|
|
165
|
-
} else if (val instanceof Uint8Array) {
|
|
166
|
-
const len = Math.min(val.length, BS_MAX_LEN);
|
|
167
|
-
arr.push(BS_BINARY | BS_D16_MSB(len));
|
|
168
|
-
arr.push(BS_D16_LSB(len));
|
|
169
|
-
arr.push(...val.slice(0, len));
|
|
170
|
-
} else {
|
|
171
|
-
arr.push(BS_CONTAINER | BS_CONT_OBJ | BS_CONT_OPEN);
|
|
172
|
-
for (const [key, value] of Object.entries(val)) {
|
|
173
|
-
_encode(key, arr, codes);
|
|
174
|
-
_encode(value, arr, codes);
|
|
175
|
-
}
|
|
176
|
-
arr.push(BS_CONTAINER | BS_CONT_OBJ | BS_CONT_CLOSE);
|
|
177
|
-
}
|
|
178
|
-
break;
|
|
179
|
-
|
|
180
|
-
case 'bigint':
|
|
181
|
-
case 'number':
|
|
182
|
-
if (Number.isInteger(val)) {
|
|
183
|
-
val = BigInt(val);
|
|
184
|
-
const neg = val < 0;
|
|
185
|
-
if (neg) val = -val;
|
|
186
|
-
let bytes = [];
|
|
187
|
-
while (val) {
|
|
188
|
-
bytes.push(Number(val & 0xFFn));
|
|
189
|
-
val >>= 8n;
|
|
190
|
-
}
|
|
191
|
-
arr.push(BS_INTEGER | (neg ? BS_NEG_MASK : 0) | bytes.length);
|
|
192
|
-
arr.push(...bytes);
|
|
193
|
-
} else {
|
|
194
|
-
const buffer = new ArrayBuffer(BS_FLOAT_SIZE);
|
|
195
|
-
new DataView(buffer).setFloat32(0, val, true);
|
|
196
|
-
arr.push(BS_FLOAT);
|
|
197
|
-
arr.push(...new Uint8Array(buffer));
|
|
198
|
-
}
|
|
199
|
-
break;
|
|
200
|
-
|
|
201
|
-
case 'string':
|
|
202
|
-
if (val.startsWith(BS_CODE_PREFIX)) {
|
|
203
|
-
val = val.slice(BS_CODE_PREFIX.length);
|
|
204
|
-
let code = codes.indexOf(val);
|
|
205
|
-
if (code >= 0) {
|
|
206
|
-
arr.push(BS_CODE | BS_D16_MSB(code));
|
|
207
|
-
arr.push(BS_D16_LSB(code));
|
|
208
|
-
} else {
|
|
209
|
-
_encode(val, arr, codes);
|
|
210
|
-
}
|
|
211
|
-
} else {
|
|
212
|
-
const bytes = new TextEncoder().encode(val);
|
|
213
|
-
const len = Math.min(bytes.length, BS_MAX_LEN);
|
|
214
|
-
arr.push(BS_STRING | BS_D16_MSB(len));
|
|
215
|
-
arr.push(BS_D16_LSB(len));
|
|
216
|
-
arr.push(...bytes.slice(0, len));
|
|
217
|
-
}
|
|
218
|
-
break;
|
|
219
|
-
|
|
220
|
-
case 'boolean':
|
|
221
|
-
arr.push(BS_BOOLEAN | !!val);
|
|
222
|
-
break;
|
|
223
|
-
|
|
224
|
-
default:
|
|
225
|
-
arr.push(BS_NULL);
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
280
|
+
return new BSEncoder(codes).encode(val).getArray();
|
|
228
281
|
}
|
|
229
282
|
|
|
230
283
|
export function getCode(name) {
|
package/bson.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e={d:(r
|
|
1
|
+
var e={d:(t,r)=>{for(var s in r)e.o(r,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:r[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};e.d(t,{$R:()=>h,GF:()=>i,QC:()=>c,lo:()=>o,mp:()=>n});const r=e=>31&e,s="__BS#";class n{offset=0;cont="root";tdec=new TextDecoder;constructor(e,t){this.buf=e,this.codes=t}decode(){if(!(this.buf instanceof Uint8Array&&this.buf.length))return;let e=this._decode();if(this.offset!=this.buf.length)throw this._err("Broken packet");return e}read(e){if(this.offset+e>this.buf.length)throw this._err("Overflow");let t=this.buf.subarray(this.offset,this.offset+e);return this.offset+=e,t}readB(){return this.read(1)[0]}readInt(e){let t=0,r=this.read(e);for(;e--;)t=t<<8|r[e];return t}_ext(e){return r(e)|(32&e?this.readB()<<5:0)}_close(e,t){if(e&&void 0!==e.__close){if(t===e.__close)return!0;throw this._err("Wrong close")}return!1}_err(e){return new Error(e+" in "+JSON.stringify(this.cont))}_decode(){const e=this.readB();let t=192&e;switch(0==t&&(t=56&e),t){case 16:if(2&e){let t=!!(1&e),r=t?{}:[];for(;;){this.cont=r;let e=this._decode();if(this._close(e,t))return r;if(t){let s=this._decode();if(this._close(s,t))throw this._err("Missed value");r[String(e)]=s}else r.push(e)}}return{__close:!!(1&e)};case 64:if(32&e)return 31&e;{let t=this.readInt(15&e);return 16&e?-t:t}case 128:return this.tdec.decode(this.read(this._ext(e)));case 192:return this.codes[this._ext(e)];case 0:return null;case 8:return!!(1&e);case 24:{let t=(e=>1<<(7&e))(e);const r=this.read(t);let s=new DataView(r.buffer,r.byteOffset,t);return 4==t?s.getFloat32(0,!0):8==t?s.getFloat64(0,!0):0}case 32:return this.read(this.readInt((e=>7&e)(e))).slice()}}}class i{arr=[];tenc=new TextEncoder;constructor(e=[]){this.codes=e}getArray(){return Uint8Array.from(this.arr)}encode(e){let t=this.arr;if(Array.isArray(e))t.push(18),e.forEach(e=>this.encode(e)),t.push(16);else switch(typeof e){case"object":if(null===e)t.push(0);else if(e instanceof Uint8Array){let r=this._int(e.length);t.push(32|r.length),t.push(...r),t.push(...e)}else{t.push(19);for(const[t,r]of Object.entries(e))this.encode(t),this.encode(r);t.push(17)}break;case"number":if(Number.isInteger(e))if(e>=0&&e<32)t.push(96|e);else{let r=e<0;r&&(e=-e);let s=this._int(e);t.push(64|(r?16:0)|s.length),t.push(...s)}else{const r=new ArrayBuffer(4);new DataView(r).setFloat32(0,e,!0),t.push(26),t.push(...new Uint8Array(r))}break;case"string":if(e.startsWith(s)){e=e.slice(s.length);let t=this.codes.indexOf(e);t>=0?this._ext(192,t):this.encode(e)}else{const r=this.tenc.encode(e),s=Math.min(r.length,8191);this._ext(128,s),t.push(...r.slice(0,s))}break;case"boolean":t.push(8|!!e);break;default:t.push(0)}return this}_int(e){let t=[];for(;e;)t.push(255&e),e>>=8;return t}_ext(e,t){let s=this.arr;t<32?s.push(e|t):(s.push(32|e|r(t)),s.push(t>>5))}}function o(e,t=[]){return new n(e,t).decode()}function h(e,t=[]){return new i(t).encode(e).getArray()}function c(e){return s+e}const a=t.mp,u=t.GF,l=t.lo,f=t.$R,d=t.QC;export{a as BSDecoder,u as BSEncoder,l as decodeBson,f as encodeBson,d as getCode};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alexgyver/bson",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Decode BSON from BSON Arduino library",
|
|
5
5
|
"main": "./bson.js",
|
|
6
6
|
"module": "./bson.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"webpack": "^5.105.4",
|
|
18
|
-
"webpack-cli": "^
|
|
18
|
+
"webpack-cli": "^7.0.0",
|
|
19
19
|
"webpack-dev-server": "^5.2.3",
|
|
20
20
|
"style-loader": "^4.0.0",
|
|
21
21
|
"css-loader": "^7.1.4"
|
package/test/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<p id="out" style="white-space: break-spaces;"></p>
|
|
6
6
|
|
|
7
7
|
<script type="module">
|
|
8
|
-
import { decodeBson, encodeBson, getCode } from 'https://gyverlibs.github.io/bson.js/dist/bson.js';
|
|
9
|
-
|
|
8
|
+
// import { decodeBson, encodeBson, getCode } from 'https://gyverlibs.github.io/bson.js/dist/bson.js';
|
|
9
|
+
import { decodeBson, encodeBson, getCode } from '/bson.js';
|
|
10
10
|
|
|
11
11
|
const url = 'http://192.168.1.54';
|
|
12
12
|
|
|
@@ -18,13 +18,17 @@
|
|
|
18
18
|
|
|
19
19
|
// =========== encode ===========
|
|
20
20
|
let test = {
|
|
21
|
+
sint: 20,
|
|
21
22
|
int: 123,
|
|
23
|
+
nint: -123,
|
|
22
24
|
float: 3.14,
|
|
23
25
|
arr: [
|
|
24
26
|
"str",
|
|
27
|
+
"0123456789012345678901234567890123456789",
|
|
25
28
|
true,
|
|
26
29
|
1234,
|
|
27
30
|
new Uint8Array([1, 2, 3]),
|
|
31
|
+
new Uint8Array([]),
|
|
28
32
|
],
|
|
29
33
|
obj: {
|
|
30
34
|
str2: "str2",
|