UNPKG

4.76 kBJavaScriptView Raw
1'use strict'
2
3const ChatServiceError = require('./ChatServiceError')
4const FastMap = require('collections/fast-map')
5const Promise = require('bluebird')
6const _ = require('lodash')
7const check = require('check-types')
8const { possiblyCallback } = require('./utils')
9
10// Commands arguments type and count validation.
11class ArgumentsValidator {
12
13 constructor (server) {
14 this.server = server
15 this.checkers = new FastMap()
16 this.directMessagesChecker = this.server.directMessagesChecker
17 this.roomMessagesChecker = this.server.roomMessagesChecker
18 this.customCheckers = {
19 directMessage: [ null, this.directMessagesChecker ],
20 roomMessage: [ null, this.roomMessagesChecker ]
21 }
22 let commands = this.server.rpcRequestsNames
23 for (let cmd of commands) {
24 this.checkers.set(cmd, this[cmd]())
25 }
26 }
27
28 checkArguments (name, ...args) {
29 let [nargs, cb] = possiblyCallback(args)
30 return Promise.try(() => {
31 let checkers = this.checkers.get(name)
32 if (!checkers) {
33 let error = new ChatServiceError('noCommand', name)
34 return Promise.reject(error)
35 }
36 let error = this.checkTypes(checkers, nargs)
37 if (error) { return Promise.reject(error) }
38 let customCheckers = this.customCheckers[name] || []
39 return Promise.each(customCheckers, (checker, idx) => {
40 if (checker) {
41 return Promise.fromCallback(fn => checker(nargs[idx], fn))
42 } else {
43 return Promise.resolve()
44 }
45 }).return()
46 }).asCallback(cb)
47 }
48
49 getArgsCount (name) {
50 let checker = this.checkers.get(name)
51 return checker ? checker.length : 0
52 }
53
54 splitArguments (name, oargs) {
55 let nargs = this.getArgsCount(name)
56 let args = _.slice(oargs, 0, nargs)
57 let restArgs = _.slice(oargs, nargs)
58 return {args, restArgs}
59 }
60
61 checkMessage (msg) {
62 return check.object(msg) &&
63 check.string(msg.textMessage) &&
64 _.keys(msg).length === 1
65 }
66
67 checkObject (obj) {
68 return check.object(obj)
69 }
70
71 checkTypes (checkers, args) {
72 if (args.length !== checkers.length) {
73 return new ChatServiceError(
74 'wrongArgumentsCount', checkers.length, args.length)
75 }
76 for (let idx = 0; idx < checkers.length; idx++) {
77 let checker = checkers[idx]
78 if (!checker(args[idx])) {
79 return new ChatServiceError('badArgument', idx, args[idx])
80 }
81 }
82 return null
83 }
84
85 directAddToList (listName, userNames) {
86 return [
87 check.string,
88 check.array.of.string
89 ]
90 }
91
92 directGetAccessList (listName) {
93 return [
94 check.string
95 ]
96 }
97
98 directGetWhitelistMode () {
99 return []
100 }
101
102 directMessage (toUser, msg) {
103 return [
104 check.string,
105 this.directMessagesChecker ? this.checkObject : this.checkMessage
106 ]
107 }
108
109 directRemoveFromList (listName, userNames) {
110 return [
111 check.string,
112 check.array.of.string
113 ]
114 }
115
116 directSetWhitelistMode (mode) {
117 return [
118 check.boolean
119 ]
120 }
121
122 listOwnSockets () {
123 return []
124 }
125
126 roomAddToList (roomName, listName, userNames) {
127 return [
128 check.string,
129 check.string,
130 check.array.of.string
131 ]
132 }
133
134 roomCreate (roomName, mode) {
135 return [
136 check.string,
137 check.boolean
138 ]
139 }
140
141 roomDelete (roomName) {
142 return [
143 check.string
144 ]
145 }
146
147 roomGetAccessList (roomName, listName) {
148 return [
149 check.string,
150 check.string
151 ]
152 }
153
154 roomGetOwner (roomName) {
155 return [
156 check.string
157 ]
158 }
159
160 roomGetWhitelistMode (roomName) {
161 return [
162 check.string
163 ]
164 }
165
166 roomRecentHistory (roomName) {
167 return [
168 check.string
169 ]
170 }
171
172 roomHistoryGet (roomName, id, limit) {
173 return [
174 check.string,
175 str => check.greaterOrEqual(str, 0),
176 str => check.greaterOrEqual(str, 1)
177 ]
178 }
179
180 roomHistoryInfo (roomName) {
181 return [
182 check.string
183 ]
184 }
185
186 roomJoin (roomName) {
187 return [
188 check.string
189 ]
190 }
191
192 roomLeave (roomName) {
193 return [
194 check.string
195 ]
196 }
197
198 roomMessage (roomName, msg) {
199 return [
200 check.string,
201 this.roomMessagesChecker ? this.checkObject : this.checkMessage
202 ]
203 }
204
205 roomNotificationsInfo (roomName) {
206 return [
207 check.string
208 ]
209 }
210
211 roomRemoveFromList (roomName, listName, userNames) {
212 return [
213 check.string,
214 check.string,
215 check.array.of.string
216 ]
217 }
218
219 roomSetWhitelistMode (roomName, mode) {
220 return [
221 check.string,
222 check.boolean
223 ]
224 }
225
226 roomUserSeen (roomName, userName) {
227 return [
228 check.string,
229 check.string
230 ]
231 }
232
233 systemMessage (data) {
234 return [
235 () => true
236 ]
237 }
238}
239
240module.exports = ArgumentsValidator