@@ -7,11 +7,10 @@ export type Packable =
7
7
| number
8
8
| boolean
9
9
| Date
10
- | Blob
11
10
| ArrayBuffer
12
11
| Array < Packable >
13
12
| { [ key : string ] : Packable }
14
- | ( { BYTES_PER_ELEMENT : number ; buffer : ArrayBuffer } & DataView ) ;
13
+ | ( { BYTES_PER_ELEMENT : number } & ArrayBufferView ) ;
15
14
export type Unpackable =
16
15
| null
17
16
| undefined
@@ -289,15 +288,12 @@ class Unpacker {
289
288
}
290
289
}
291
290
292
- class Packer {
293
- private bufferBuilder : BufferBuilder ;
294
-
295
- constructor ( ) {
296
- this . bufferBuilder = new BufferBuilder ( ) ;
297
- }
291
+ export class Packer {
292
+ private _bufferBuilder = new BufferBuilder ( ) ;
293
+ private _textEncoder = new TextEncoder ( ) ;
298
294
299
295
getBuffer ( ) {
300
- return this . bufferBuilder . getBuffer ( ) ;
296
+ return this . _bufferBuilder . toArrayBuffer ( ) ;
301
297
}
302
298
303
299
pack ( value : Packable ) {
@@ -311,21 +307,19 @@ class Packer {
311
307
}
312
308
} else if ( typeof value === "boolean" ) {
313
309
if ( value === true ) {
314
- this . bufferBuilder . append ( 0xc3 ) ;
310
+ this . _bufferBuilder . append ( 0xc3 ) ;
315
311
} else if ( value === false ) {
316
- this . bufferBuilder . append ( 0xc2 ) ;
312
+ this . _bufferBuilder . append ( 0xc2 ) ;
317
313
}
318
314
} else if ( value === undefined ) {
319
- this . bufferBuilder . append ( 0xc1 ) ;
315
+ this . _bufferBuilder . append ( 0xc1 ) ;
320
316
} else if ( typeof value === "object" ) {
321
317
if ( value === null ) {
322
- this . bufferBuilder . append ( 0xc0 ) ;
318
+ this . _bufferBuilder . append ( 0xc0 ) ;
323
319
} else {
324
320
const constructor = value . constructor ;
325
321
if ( value instanceof Array ) {
326
322
this . pack_array ( value ) ;
327
- } else if ( value instanceof Blob ) {
328
- this . pack_bin ( value ) ;
329
323
} else if ( value instanceof ArrayBuffer ) {
330
324
this . pack_bin ( new Uint8Array ( value ) ) ;
331
325
} else if ( "BYTES_PER_ELEMENT" in value ) {
@@ -345,52 +339,53 @@ class Packer {
345
339
} else {
346
340
throw new Error ( `Type "${ typeof value } " not yet supported` ) ;
347
341
}
348
- this . bufferBuilder . flush ( ) ;
342
+ this . _bufferBuilder . flush ( ) ;
349
343
}
350
344
351
- pack_bin ( blob : Blob | Uint8Array ) {
352
- const length = blob instanceof Uint8Array ? blob . length : blob . size ;
345
+ pack_bin ( blob : Uint8Array ) {
346
+ const length = blob . length ;
353
347
354
348
if ( length <= 0x0f ) {
355
349
this . pack_uint8 ( 0xa0 + length ) ;
356
350
} else if ( length <= 0xffff ) {
357
- this . bufferBuilder . append ( 0xda ) ;
351
+ this . _bufferBuilder . append ( 0xda ) ;
358
352
this . pack_uint16 ( length ) ;
359
353
} else if ( length <= 0xffffffff ) {
360
- this . bufferBuilder . append ( 0xdb ) ;
354
+ this . _bufferBuilder . append ( 0xdb ) ;
361
355
this . pack_uint32 ( length ) ;
362
356
} else {
363
357
throw new Error ( "Invalid length" ) ;
364
358
}
365
- this . bufferBuilder . append ( blob ) ;
359
+ this . _bufferBuilder . append_buffer ( blob ) ;
366
360
}
367
361
368
362
pack_string ( str : string ) {
369
- const length = utf8Length ( str ) ;
363
+ const encoded = this . _textEncoder . encode ( str ) ;
364
+ const length = encoded . length ;
370
365
371
366
if ( length <= 0x0f ) {
372
367
this . pack_uint8 ( 0xb0 + length ) ;
373
368
} else if ( length <= 0xffff ) {
374
- this . bufferBuilder . append ( 0xd8 ) ;
369
+ this . _bufferBuilder . append ( 0xd8 ) ;
375
370
this . pack_uint16 ( length ) ;
376
371
} else if ( length <= 0xffffffff ) {
377
- this . bufferBuilder . append ( 0xd9 ) ;
372
+ this . _bufferBuilder . append ( 0xd9 ) ;
378
373
this . pack_uint32 ( length ) ;
379
374
} else {
380
375
throw new Error ( "Invalid length" ) ;
381
376
}
382
- this . bufferBuilder . append ( str ) ;
377
+ this . _bufferBuilder . append_buffer ( encoded ) ;
383
378
}
384
379
385
380
pack_array ( ary : Packable [ ] ) {
386
381
const length = ary . length ;
387
382
if ( length <= 0x0f ) {
388
383
this . pack_uint8 ( 0x90 + length ) ;
389
384
} else if ( length <= 0xffff ) {
390
- this . bufferBuilder . append ( 0xdc ) ;
385
+ this . _bufferBuilder . append ( 0xdc ) ;
391
386
this . pack_uint16 ( length ) ;
392
387
} else if ( length <= 0xffffffff ) {
393
- this . bufferBuilder . append ( 0xdd ) ;
388
+ this . _bufferBuilder . append ( 0xdd ) ;
394
389
this . pack_uint32 ( length ) ;
395
390
} else {
396
391
throw new Error ( "Invalid length" ) ;
@@ -402,30 +397,30 @@ class Packer {
402
397
403
398
pack_integer ( num : number ) {
404
399
if ( num >= - 0x20 && num <= 0x7f ) {
405
- this . bufferBuilder . append ( num & 0xff ) ;
400
+ this . _bufferBuilder . append ( num & 0xff ) ;
406
401
} else if ( num >= 0x00 && num <= 0xff ) {
407
- this . bufferBuilder . append ( 0xcc ) ;
402
+ this . _bufferBuilder . append ( 0xcc ) ;
408
403
this . pack_uint8 ( num ) ;
409
404
} else if ( num >= - 0x80 && num <= 0x7f ) {
410
- this . bufferBuilder . append ( 0xd0 ) ;
405
+ this . _bufferBuilder . append ( 0xd0 ) ;
411
406
this . pack_int8 ( num ) ;
412
407
} else if ( num >= 0x0000 && num <= 0xffff ) {
413
- this . bufferBuilder . append ( 0xcd ) ;
408
+ this . _bufferBuilder . append ( 0xcd ) ;
414
409
this . pack_uint16 ( num ) ;
415
410
} else if ( num >= - 0x8000 && num <= 0x7fff ) {
416
- this . bufferBuilder . append ( 0xd1 ) ;
411
+ this . _bufferBuilder . append ( 0xd1 ) ;
417
412
this . pack_int16 ( num ) ;
418
413
} else if ( num >= 0x00000000 && num <= 0xffffffff ) {
419
- this . bufferBuilder . append ( 0xce ) ;
414
+ this . _bufferBuilder . append ( 0xce ) ;
420
415
this . pack_uint32 ( num ) ;
421
416
} else if ( num >= - 0x80000000 && num <= 0x7fffffff ) {
422
- this . bufferBuilder . append ( 0xd2 ) ;
417
+ this . _bufferBuilder . append ( 0xd2 ) ;
423
418
this . pack_int32 ( num ) ;
424
419
} else if ( num >= - 0x8000000000000000 && num <= 0x7fffffffffffffff ) {
425
- this . bufferBuilder . append ( 0xd3 ) ;
420
+ this . _bufferBuilder . append ( 0xd3 ) ;
426
421
this . pack_int64 ( num ) ;
427
422
} else if ( num >= 0x0000000000000000 && num <= 0xffffffffffffffff ) {
428
- this . bufferBuilder . append ( 0xcf ) ;
423
+ this . _bufferBuilder . append ( 0xcf ) ;
429
424
this . pack_uint64 ( num ) ;
430
425
} else {
431
426
throw new Error ( "Invalid integer" ) ;
@@ -445,7 +440,7 @@ class Packer {
445
440
const h32 =
446
441
( sign << 31 ) | ( ( exp + 1023 ) << 20 ) | ( ( frac1 / b32 ) & 0x0fffff ) ;
447
442
const l32 = frac1 % b32 ;
448
- this . bufferBuilder . append ( 0xcb ) ;
443
+ this . _bufferBuilder . append ( 0xcb ) ;
449
444
this . pack_int32 ( h32 ) ;
450
445
this . pack_int32 ( l32 ) ;
451
446
}
@@ -456,10 +451,10 @@ class Packer {
456
451
if ( length <= 0x0f ) {
457
452
this . pack_uint8 ( 0x80 + length ) ;
458
453
} else if ( length <= 0xffff ) {
459
- this . bufferBuilder . append ( 0xde ) ;
454
+ this . _bufferBuilder . append ( 0xde ) ;
460
455
this . pack_uint16 ( length ) ;
461
456
} else if ( length <= 0xffffffff ) {
462
- this . bufferBuilder . append ( 0xdf ) ;
457
+ this . _bufferBuilder . append ( 0xdf ) ;
463
458
this . pack_uint32 ( length ) ;
464
459
} else {
465
460
throw new Error ( "Invalid length" ) ;
@@ -474,84 +469,61 @@ class Packer {
474
469
}
475
470
476
471
pack_uint8 ( num : number ) {
477
- this . bufferBuilder . append ( num ) ;
472
+ this . _bufferBuilder . append ( num ) ;
478
473
}
479
474
480
475
pack_uint16 ( num : number ) {
481
- this . bufferBuilder . append ( num >> 8 ) ;
482
- this . bufferBuilder . append ( num & 0xff ) ;
476
+ this . _bufferBuilder . append ( num >> 8 ) ;
477
+ this . _bufferBuilder . append ( num & 0xff ) ;
483
478
}
484
479
485
480
pack_uint32 ( num : number ) {
486
481
const n = num & 0xffffffff ;
487
- this . bufferBuilder . append ( ( n & 0xff000000 ) >>> 24 ) ;
488
- this . bufferBuilder . append ( ( n & 0x00ff0000 ) >>> 16 ) ;
489
- this . bufferBuilder . append ( ( n & 0x0000ff00 ) >>> 8 ) ;
490
- this . bufferBuilder . append ( n & 0x000000ff ) ;
482
+ this . _bufferBuilder . append ( ( n & 0xff000000 ) >>> 24 ) ;
483
+ this . _bufferBuilder . append ( ( n & 0x00ff0000 ) >>> 16 ) ;
484
+ this . _bufferBuilder . append ( ( n & 0x0000ff00 ) >>> 8 ) ;
485
+ this . _bufferBuilder . append ( n & 0x000000ff ) ;
491
486
}
492
487
493
488
pack_uint64 ( num : number ) {
494
489
const high = num / 2 ** 32 ;
495
490
const low = num % 2 ** 32 ;
496
- this . bufferBuilder . append ( ( high & 0xff000000 ) >>> 24 ) ;
497
- this . bufferBuilder . append ( ( high & 0x00ff0000 ) >>> 16 ) ;
498
- this . bufferBuilder . append ( ( high & 0x0000ff00 ) >>> 8 ) ;
499
- this . bufferBuilder . append ( high & 0x000000ff ) ;
500
- this . bufferBuilder . append ( ( low & 0xff000000 ) >>> 24 ) ;
501
- this . bufferBuilder . append ( ( low & 0x00ff0000 ) >>> 16 ) ;
502
- this . bufferBuilder . append ( ( low & 0x0000ff00 ) >>> 8 ) ;
503
- this . bufferBuilder . append ( low & 0x000000ff ) ;
491
+ this . _bufferBuilder . append ( ( high & 0xff000000 ) >>> 24 ) ;
492
+ this . _bufferBuilder . append ( ( high & 0x00ff0000 ) >>> 16 ) ;
493
+ this . _bufferBuilder . append ( ( high & 0x0000ff00 ) >>> 8 ) ;
494
+ this . _bufferBuilder . append ( high & 0x000000ff ) ;
495
+ this . _bufferBuilder . append ( ( low & 0xff000000 ) >>> 24 ) ;
496
+ this . _bufferBuilder . append ( ( low & 0x00ff0000 ) >>> 16 ) ;
497
+ this . _bufferBuilder . append ( ( low & 0x0000ff00 ) >>> 8 ) ;
498
+ this . _bufferBuilder . append ( low & 0x000000ff ) ;
504
499
}
505
500
506
501
pack_int8 ( num : number ) {
507
- this . bufferBuilder . append ( num & 0xff ) ;
502
+ this . _bufferBuilder . append ( num & 0xff ) ;
508
503
}
509
504
510
505
pack_int16 ( num : number ) {
511
- this . bufferBuilder . append ( ( num & 0xff00 ) >> 8 ) ;
512
- this . bufferBuilder . append ( num & 0xff ) ;
506
+ this . _bufferBuilder . append ( ( num & 0xff00 ) >> 8 ) ;
507
+ this . _bufferBuilder . append ( num & 0xff ) ;
513
508
}
514
509
515
510
pack_int32 ( num : number ) {
516
- this . bufferBuilder . append ( ( num >>> 24 ) & 0xff ) ;
517
- this . bufferBuilder . append ( ( num & 0x00ff0000 ) >>> 16 ) ;
518
- this . bufferBuilder . append ( ( num & 0x0000ff00 ) >>> 8 ) ;
519
- this . bufferBuilder . append ( num & 0x000000ff ) ;
511
+ this . _bufferBuilder . append ( ( num >>> 24 ) & 0xff ) ;
512
+ this . _bufferBuilder . append ( ( num & 0x00ff0000 ) >>> 16 ) ;
513
+ this . _bufferBuilder . append ( ( num & 0x0000ff00 ) >>> 8 ) ;
514
+ this . _bufferBuilder . append ( num & 0x000000ff ) ;
520
515
}
521
516
522
517
pack_int64 ( num : number ) {
523
518
const high = Math . floor ( num / 2 ** 32 ) ;
524
519
const low = num % 2 ** 32 ;
525
- this . bufferBuilder . append ( ( high & 0xff000000 ) >>> 24 ) ;
526
- this . bufferBuilder . append ( ( high & 0x00ff0000 ) >>> 16 ) ;
527
- this . bufferBuilder . append ( ( high & 0x0000ff00 ) >>> 8 ) ;
528
- this . bufferBuilder . append ( high & 0x000000ff ) ;
529
- this . bufferBuilder . append ( ( low & 0xff000000 ) >>> 24 ) ;
530
- this . bufferBuilder . append ( ( low & 0x00ff0000 ) >>> 16 ) ;
531
- this . bufferBuilder . append ( ( low & 0x0000ff00 ) >>> 8 ) ;
532
- this . bufferBuilder . append ( low & 0x000000ff ) ;
533
- }
534
- }
535
-
536
- function _utf8Replace ( m : string ) {
537
- const code = m . codePointAt ( 0 ) ! ;
538
-
539
- if ( code <= 0x7ff ) return "00" ;
540
- if ( code <= 0xffff ) return "000" ;
541
- if ( code <= 0x1fffff ) return "0000" ;
542
- if ( code <= 0x3ffffff ) return "00000" ;
543
- return "000000" ;
544
- }
545
-
546
- function utf8Length ( str : string ) {
547
- if ( str . length > 600 ) {
548
- // Blob method faster for large strings
549
- return new Blob ( [ str ] ) . size ;
550
- } else {
551
- return str . replace (
552
- // eslint-disable-next-line no-control-regex
553
- / [ \ud800 - \udbff ] [ \udc00 - \udfff ] | [ ^ \u0000 - \u007f ] / g,
554
- _utf8Replace ,
555
- ) . length ;
520
+ this . _bufferBuilder . append ( ( high & 0xff000000 ) >>> 24 ) ;
521
+ this . _bufferBuilder . append ( ( high & 0x00ff0000 ) >>> 16 ) ;
522
+ this . _bufferBuilder . append ( ( high & 0x0000ff00 ) >>> 8 ) ;
523
+ this . _bufferBuilder . append ( high & 0x000000ff ) ;
524
+ this . _bufferBuilder . append ( ( low & 0xff000000 ) >>> 24 ) ;
525
+ this . _bufferBuilder . append ( ( low & 0x00ff0000 ) >>> 16 ) ;
526
+ this . _bufferBuilder . append ( ( low & 0x0000ff00 ) >>> 8 ) ;
527
+ this . _bufferBuilder . append ( low & 0x000000ff ) ;
556
528
}
557
529
}
0 commit comments