UNPKG

3.49 kBtext/coffeescriptView Raw
1Reader = require "./io/reader"
2Writer = require "./io/writer"
3outcome = require "outcome"
4
5
6
7
8
9exports.Reader = class MessageReader extends Reader
10
11 ###
12 constructor
13 ###
14
15 constructor: (@writer, @from, @channel, @query, @sanitized = {}, @headers = {}, @filter = {}, @callback = null) ->
16 super writer
17
18
19
20exports.Writer = class MessageWriter extends Writer
21
22 ###
23 ###
24
25 constructor: (@_ops) ->
26
27 @channel = _ops.channel
28 @callback = _ops.callback
29 @next = _ops.next
30 @filter = _ops.filter or {}
31 @pre = _ops.pre
32 @type = _ops.type
33 @from = _ops.from
34 @headers = _ops.headers
35 @query = _ops.query
36 @sanitized = _ops.sanitized
37
38
39 super()
40
41
42 ###
43 ###
44
45 reader: (index, numListeners) ->
46 return new MessageReader @,
47 @from,
48 @channel,
49 @query,
50 @sanitized,
51 @headers,
52 @filter,
53 @callback
54
55
56
57exports.Builder = class
58
59 ###
60 ###
61
62 constructor: (@router) -> @clean()
63
64 ###
65 options which control how the request
66 is handled. This can fill out the entire request vs using the methods given
67 ###
68
69 options: (value) ->
70 return @_ops if !arguments.length
71 @_ops = value || {}
72 @
73
74 ###
75 ###
76
77 clean: () ->
78 @_ops = {}
79 @from(@router)
80
81
82 ###
83 filterable tags
84 ###
85
86 tag: (keyOrTags, value) ->
87 @_objParam 'filter', arguments, (value) ->
88
89 if typeof value == 'boolean'
90 return { $exists: value }
91
92 return value
93
94 ###
95 DEPRECATED
96 ###
97
98 headers: (value) -> @header value
99
100 ###
101 The header data explaining the message, such as tags, content type, etc.
102 ###
103
104 header: (keyOrHeaders, value) -> @_objParam 'headers', arguments
105
106 ###
107 ###
108
109 type: (value) -> @_param 'type', arguments
110
111 ###
112 ###
113
114 from: (value) -> @_param 'from', arguments
115
116 ###
117 ###
118
119 to: (value) -> @_param 'to', arguments
120
121 ###
122 ###
123
124 channel: (value) -> @_param 'channel', arguments
125
126 ###
127 Query would be something like ?name=craig&last=condon
128 ###
129
130 query: (value) -> @_param 'query', arguments
131
132
133 ###
134 data that has been cleaned up after validation
135 ###
136
137 sanitized: (value) -> @_param 'sanitized', arguments
138
139
140 ###
141 response handler, or ack
142 deprecated
143 ###
144
145 response: (callback) -> @_param 'response', arguments
146
147 ###
148 on error callback
149 ###
150
151 error: (callback) -> @_param 'error', arguments
152
153 ###
154 on success callback
155 ###
156
157 success: (callback) -> @_param 'success', arguments
158
159 ###
160 append middleware to the end
161 ###
162
163 next: (middleware) -> @_param 'next', arguments
164
165 ###
166 prepend middleware
167 ###
168
169 pre: (middleware) -> @_param 'pre', arguments
170
171 ###
172 ###
173
174 dispatch: (type) ->
175
176 @_ops.callback = outcome error: @error(), success: @success(), callback: @response()
177
178 @type type if type
179 writer = new MessageWriter @_ops
180 @router.dispatch writer
181 writer
182
183 ###
184 DEPRECATED
185 ###
186
187 hasListeners: () -> @exists()
188
189 ###
190 ###
191
192 exists: () -> !!@router.director(@type()).getListeners({channel: @_ops.channel, filter: @_ops.filter }, false).length
193
194 ###
195 ###
196
197 _param: (name, args) ->
198 return @_ops[name] if !args.length
199 @_ops[name] = args[0]
200 @
201
202
203 ###
204 ###
205
206 _objParam: (name, args, getValue) ->
207 return @_ops[name] if !args.length
208
209 @_ops[name] = {} if not @_ops[name]
210
211 keyOrObj = args[0]
212 value = args[1]
213
214
215 # obj(key, value)
216 if typeof keyOrObj == 'string'
217
218 # just one arg passed? return the value
219 if args.length == 1 then return @_ops.headers[keyOrObj]
220
221 @_ops[name][keyOrObj] = if getValue then getValue value else value
222
223 else
224 @_objParam name, [key, keyOrObj[key]], getValue for key of keyOrObj
225
226 @
227