-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
90 lines (75 loc) · 1.7 KB
/
index.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
var number = require('./codec/number.js');
var object = require('./codec/object.js');
var flip = exports.flip = function (n) {
var s = n.toString()
var f = ''
for(var i in s) {
f += s[i] == '.' ? '.' : (9 - +s[i])
}
return f
}
function round (n) {
return n < 0 ? Math.ceil(n) : Math.floor(n)
}
function fraction (f) {
return f - round(f)
}
exports.number = number;
exports.string = {
encode: function (s) {
//we'll need to escape the separators
if(!/\x00|\x01/.test(s))
return 'J'+s
else {
return 'J'+s.replace(/\x01/g, '\x01\x01').replace(/\x00/g, '\x01')
}
},
decode: function (s) {
if('J' === s[0])
return s.substring(1) //TODO, unescape things...
}
}
exports.encode = function (t) {
return exports[typeof t].encode(t)
}
exports.decode = function (s) {
if(s === '') return s
if(!decoders[s[0]])
throw new Error('no decoder for:'+JSON.stringify(s))
return decoders[s[0]](s)
}
exports.object = object.factory(exports);
exports.boolean = {
encode: function (b) {
return b ? 'C' : 'B'
},
decode: function (b) {
return 'C' === b
}
}
exports.undefined = {
encode: function (b) {
return 'L'
},
decode: function () {
return undefined
}
}
var decoders = {
A: exports.object.decode, //null
B: exports.boolean.decode, // false
C: exports.boolean.decode, // true
D: exports.number.decode, // number
F: exports.number.decode, // number
// G Date
// H Date
// I Buffer
J: exports.string.decode, // String
K: exports.object.decode, // Array
L: exports.undefined.decode, // undefined
}
exports.LO = null
exports.HI = undefined
//for leveldb, request strings
exports.buffer = false
exports.type = 'charwise'