UNPKG

3.19 kBJavaScriptView Raw
1// read-format.js
2
3exports.format = {
4 map: map,
5 array: array,
6 str: str,
7 bin: bin,
8 ext: ext,
9 uint8: uint8,
10 uint16: uint16,
11 uint32: read(4, Buffer.prototype.readUInt32BE),
12 uint64: read(8, readUInt64BE),
13 int8: read(1, Buffer.prototype.readInt8),
14 int16: read(2, Buffer.prototype.readInt16BE),
15 int32: read(4, Buffer.prototype.readInt32BE),
16 int64: read(8, readInt64BE),
17 float32: read(4, Buffer.prototype.readFloatBE),
18 float64: read(8, Buffer.prototype.readDoubleBE)
19};
20
21var BufferLite = require("./buffer-lite");
22var decode = require("./read-core").decode;
23var codec = require("./ext-preset").preset;
24var BUFFER_SHORTAGE = require("./common").BUFFER_SHORTAGE;
25
26var IS_BUFFER_SHIM = ("TYPED_ARRAY_SUPPORT" in Buffer);
27var NO_ASSERT = true;
28
29function map(decoder, len) {
30 var value = {};
31 var i;
32 var k = new Array(len);
33 var v = new Array(len);
34 for (i = 0; i < len; i++) {
35 k[i] = decode(decoder);
36 v[i] = decode(decoder);
37 }
38 for (i = 0; i < len; i++) {
39 value[k[i]] = v[i];
40 }
41 return value;
42}
43
44function array(decoder, len) {
45 var value = new Array(len);
46 for (var i = 0; i < len; i++) {
47 value[i] = decode(decoder);
48 }
49 return value;
50}
51
52function str(decoder, len) {
53 var start = decoder.offset;
54 var end = decoder.offset = start + len;
55 if (end > decoder.buffer.length) throw BUFFER_SHORTAGE;
56 if (IS_BUFFER_SHIM) {
57 // slower (compat)
58 return BufferLite.readString.call(decoder.buffer, start, end);
59 } else {
60 // 2x faster
61 return decoder.buffer.toString("utf-8", start, end);
62 }
63}
64
65function bin(decoder, len) {
66 var start = decoder.offset;
67 var end = decoder.offset = start + len;
68 if (end > decoder.buffer.length) throw BUFFER_SHORTAGE;
69 return decoder.buffer.slice(start, end);
70}
71
72function ext(decoder, len) {
73 var start = decoder.offset;
74 var end = decoder.offset = start + len + 1;
75 if (end > decoder.buffer.length) throw BUFFER_SHORTAGE;
76 var type = decoder.buffer[start];
77 var unpack = codec.getExtUnpacker(type);
78 if (!unpack) throw new Error("Invalid ext type: " + (type ? ("0x" + type.toString(16)) : type));
79 var buf = decoder.buffer.slice(start + 1, end);
80 return unpack(buf);
81}
82
83function uint8(decoder) {
84 var buffer = decoder.buffer;
85 if (decoder.offset >= buffer.length) throw BUFFER_SHORTAGE;
86 return buffer[decoder.offset++];
87}
88
89function uint16(decoder) {
90 var buffer = decoder.buffer;
91 if (decoder.offset + 2 > buffer.length) throw BUFFER_SHORTAGE;
92 return (buffer[decoder.offset++] << 8) | buffer[decoder.offset++];
93}
94
95function read(len, method) {
96 return function(decoder) {
97 var start = decoder.offset;
98 var end = decoder.offset = start + len;
99 if (end > decoder.buffer.length) throw BUFFER_SHORTAGE;
100 return method.call(decoder.buffer, start, NO_ASSERT);
101 };
102}
103
104function readUInt64BE(start, noAssert) {
105 var upper = this.readUInt32BE(start, noAssert);
106 var lower = this.readUInt32BE(start + 4, noAssert);
107 return upper ? (upper * 4294967296 + lower) : lower;
108}
109
110function readInt64BE(start, noAssert) {
111 var upper = this.readInt32BE(start, noAssert);
112 var lower = this.readUInt32BE(start + 4, noAssert);
113 return upper ? (upper * 4294967296 + lower) : lower;
114}