forked from gbezyuk/logux-sync
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidate.js
105 lines (80 loc) · 2.46 KB
/
validate.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
var SyncError = require('./sync-error')
function isNumber (value) {
return typeof value === 'number'
}
function isString (value) {
return typeof value === 'string'
}
function isObject (value) {
return typeof value === 'object' && typeof value.length !== 'number'
}
function isArray (value) {
return typeof value === 'object' && typeof value.length === 'number'
}
function isTwoNumbers (value) {
return isArray(value) && value.length === 2 &&
isNumber(value[0]) && isNumber(value[0])
}
function isNodeId (value) {
return isString(value) || isNumber(value)
}
var validators = {
connect: function connect (msg) {
return isTwoNumbers(msg[1]) && isNodeId(msg[2]) && isNumber(msg[3]) &&
(msg.length === 4 || (msg.length === 5 && isObject(msg[4])))
},
connected: function connected (msg) {
return isTwoNumbers(msg[1]) && isNodeId(msg[2]) && isTwoNumbers(msg[3]) &&
(msg.length === 4 || (msg.length === 5 && isObject(msg[4])))
},
ping: function ping (msg) {
return msg.length === 2 && isNumber(msg[1])
},
pong: function pong (msg) {
return msg.length === 2 && isNumber(msg[1])
},
sync: function sync (msg) {
if (!isNumber(msg[1])) return false
if (msg.length % 2 !== 0) return false
for (var i = 2; i < msg.length; i++) {
if (!isObject(msg[i])) return false
if (i % 2 === 0 && !isString(msg[i].type)) return false
}
return true
},
synced: function synced (msg) {
return msg.length === 2 && isNumber(msg[1])
},
error: function error (msg) {
return (msg.length === 2 || msg.length === 3) && isString(msg[1])
},
duilian: function duilian (msg) {
return (msg.length === 2) && isString(msg[1])
},
debug: function debug (msg) {
return (msg.length === 3) && isString(msg[1]) &&
(msg[1] === 'error' && isString(msg[2]))
}
}
function wrongFormat (sync, msg) {
sync.sendError(new SyncError(sync, 'wrong-format', JSON.stringify(msg)))
sync.connection.disconnect('error')
return false
}
function validate (sync, msg) {
if (!isArray(msg)) return wrongFormat(sync, msg)
var name = msg[0]
if (!isString(name)) return wrongFormat(sync, msg)
var validator = validators[name]
if (!validator || !sync[name + 'Message']) {
sync.sendError(new SyncError(sync, 'unknown-message', name))
sync.connection.disconnect('error')
return false
}
if (!validator(msg)) {
return wrongFormat(sync, msg)
} else {
return true
}
}
module.exports = validate