-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.es6.js
130 lines (111 loc) · 2.57 KB
/
parser.es6.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
'use strict';
module.exports = parse
var read = require('binary-types').read.be
function* parse() {
var first = yield -1
// positive fixint
if (first < 0x80)
return first
// fixmap
if (first < 0x90)
return yield* parseMap(first & 0xF)
// fixarray
if (first < 0xA0)
return yield* parseArray(first & 0xF)
// fixstr
if (first < 0xC0)
return (yield (first & 0x1F)).toString()
// nil
if (first === 0xC0)
return null
// 0xC1 intentionally missing
// false
if (first === 0xC2)
return false
// true
if (first === 0xC3)
return true
// bin 8
if (first === 0xC4)
return yield (yield -1)
// bin 16
if (first === 0xC5)
return yield (yield* read.u16())
// bin 32
if (first === 0xC6)
return yield (yield* read.u32())
// ext 8
// ext 16
// ext 32
// float 32
if (first === 0xCA)
return yield* read.f32()
// float 64
if (first === 0xCB)
return yield* read.f64()
// uint 8
if (first === 0xCC)
return yield* read.u8()
// uint 16
if (first === 0xCD)
return yield* read.u16()
// uint 32
if (first === 0xCE)
return yield* read.u32()
// int 64 @ 0xCF intentionally unimplemented
// int 8
if (first === 0xD0)
return (yield 1).readInt8(0, true)
// int 16
if (first === 0xD1)
return (yield 2).readInt16BE(0, true)
// int 32
if (first === 0xD2)
return (yield 4).readInt32BE(0, true)
// int 64 @ 0xD3 intentionally unimplemented
// fixext 1
// fixext 2
// fixext 4
// fixext 8
// fixext 16
// str 8
if (first === 0xD9)
return (yield (yield -1)).toString()
// str 16
if (first === 0xDA)
return (yield (yield 2).readUInt16BE(0, true)).toString()
// str 32
if (first === 0xDB)
return (yield (yield 4).readUInt32BE(0, true)).toString()
// array 16
if (first === 0xDC)
return yield* parseArray((yield 2).readUInt16BE(0, true))
// array 32
if (first === 0xDD)
return yield* parseArray((yield 4).readUInt32BE(0, true))
// map 16
if (first === 0xDE)
return yield* parseMap((yield 2).readUInt16BE(0, true))
// map 32
if (first === 0xDF)
return yield* parseMap((yield 4).readUInt32BE(0, true))
// negative fixint
if (first >= 0xE0)
return (first & 0x1F) - 32
throw new Error('unknown msgpack type 0x' + first.toString(16))
}
function* parseArray(len) {
var arr = []
for (var i = 0; i < len; i++)
arr.push(yield* parse())
return arr
}
function* parseMap(len) {
var obj = {}
for (var i = 0; i < len; i++) {
var key = yield* parse()
, val = yield* parse()
obj[key] = val
}
return obj
}