UNPKG

2.86 kBtext/coffeescriptView Raw
1crema = require "crema"
2MessageBuilder = require("./message").Builder
3pushPlugin = require "./push/plugin"
4pullPlugin = require "./pull/plugin"
5collectPlugin = require "./collect/plugin"
6plugins = require "./plugins"
7disposable = require "disposable"
8_ = require "underscore"
9
10
11class Router
12
13 ###
14 ###
15
16 constructor: () ->
17
18 # gets plugged into by the plugin handler
19 @directors = {}
20
21 # expose the parser - crema really is a private lib - it could change
22 # anytime. This makes things a little more abstracted, a little more maintainable. That and dryer.
23 @parse = crema
24
25 @_messageBuilder = new MessageBuilder @
26
27 # registers the plugins to the router, and message writer
28 @_plugins = new plugins @
29
30 # register the default plugins
31 # 1-many notification
32 @use pushPlugin
33
34 # 1-1 request
35 @use pullPlugin
36
37 # 1-many request
38 @use collectPlugin
39
40 ###
41 uses a dispatcher
42 ###
43
44
45 use: (plugin) -> @_plugins.add plugin
46
47 ###
48 ###
49
50 using: () -> @_plugins.using()
51
52
53 ###
54 listens for a request
55 ###
56
57 on: (routeOrListeners, ops, callback) ->
58
59 if typeof ops == 'function'
60 callback = ops
61 ops = {}
62
63
64 listenerDisposables = disposable.create()
65
66 # easier setting up listeners if it's an object vs
67 # calling .on each time
68 if typeof routeOrListeners == "object" and not callback
69 for type of routeOrListeners
70 listenerDisposables.add @.on(type, routeOrListeners[type])
71 return listenerDisposables
72
73
74 if typeof routeOrListeners == "string"
75 routes = crema routeOrListeners
76 else if routeOrListeners instanceof Array
77 routes = routeOrListeners
78 else
79 routes = [routeOrListeners]
80
81 for route in routes
82 do (route) =>
83
84 route.type = ops.type if ops.type
85 _.extend route.tags, ops.tags if ops.tags
86
87 listenerDisposables.add @director(route.type).addListener(route, callback)
88
89 ## notify the plugins of a new listener
90 @_plugins.newListener route: route, callback: callback
91
92
93 # finally return self
94 listenerDisposables
95
96 ###
97 returns the given director, or throws an error if it doesn't exist
98 ###
99
100 director: (type) ->
101 director = @directors[type]
102 throw new Error "director #{type} does not exist" if not director
103 return director
104
105 ###
106 ###
107
108 channels: (ops) ->
109
110 channels = []
111
112 for name of @directors
113 director = @directors[name]
114 channels = channels.concat director.channels ops
115
116 return channels
117
118
119 dispatch: (messageWriter) -> @director(messageWriter.type).dispatch(messageWriter)
120
121 ###
122 abreviated
123 ###
124
125 req: () -> @request.apply this, arguments
126
127 ###
128 Initializes a new request
129 ###
130
131 request: (channel, query, headers) ->
132
133 @_messageBuilder.
134 clean().
135 channel(if typeof channel is "string" then crema.parseChannel(channel) else channel).
136 query(query).
137 headers(headers);
138
139
140
141
142
143module.exports = Router
\No newline at end of file