wwl-websocket-rails 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +328 -0
- data/Gemfile +27 -0
- data/MIT-LICENSE +20 -0
- data/README.md +239 -0
- data/Rakefile +72 -0
- data/bin/thin-socketrails +45 -0
- data/lib/assets/javascripts/websocket_rails/abstract_connection.js.coffee +45 -0
- data/lib/assets/javascripts/websocket_rails/channel.js.coffee +70 -0
- data/lib/assets/javascripts/websocket_rails/event.js.coffee +46 -0
- data/lib/assets/javascripts/websocket_rails/http_connection.js.coffee +66 -0
- data/lib/assets/javascripts/websocket_rails/main.js +6 -0
- data/lib/assets/javascripts/websocket_rails/websocket_connection.js.coffee +29 -0
- data/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee +158 -0
- data/lib/config.ru +3 -0
- data/lib/generators/websocket_rails/install/install_generator.rb +33 -0
- data/lib/generators/websocket_rails/install/templates/events.rb +14 -0
- data/lib/generators/websocket_rails/install/templates/websocket_rails.rb +68 -0
- data/lib/rails/app/controllers/websocket_rails/delegation_controller.rb +13 -0
- data/lib/rails/config/routes.rb +7 -0
- data/lib/rails/tasks/websocket_rails.tasks +42 -0
- data/lib/spec_helpers/matchers/route_matchers.rb +65 -0
- data/lib/spec_helpers/matchers/trigger_matchers.rb +138 -0
- data/lib/spec_helpers/spec_helper_event.rb +34 -0
- data/lib/websocket-rails.rb +108 -0
- data/lib/websocket_rails/base_controller.rb +208 -0
- data/lib/websocket_rails/channel.rb +97 -0
- data/lib/websocket_rails/channel_manager.rb +55 -0
- data/lib/websocket_rails/configuration.rb +177 -0
- data/lib/websocket_rails/connection_adapters/http.rb +120 -0
- data/lib/websocket_rails/connection_adapters/web_socket.rb +35 -0
- data/lib/websocket_rails/connection_adapters.rb +195 -0
- data/lib/websocket_rails/connection_manager.rb +119 -0
- data/lib/websocket_rails/controller_factory.rb +80 -0
- data/lib/websocket_rails/data_store.rb +145 -0
- data/lib/websocket_rails/dispatcher.rb +129 -0
- data/lib/websocket_rails/engine.rb +26 -0
- data/lib/websocket_rails/event.rb +193 -0
- data/lib/websocket_rails/event_map.rb +184 -0
- data/lib/websocket_rails/event_queue.rb +33 -0
- data/lib/websocket_rails/internal_events.rb +37 -0
- data/lib/websocket_rails/logging.rb +133 -0
- data/lib/websocket_rails/spec_helpers.rb +3 -0
- data/lib/websocket_rails/synchronization.rb +178 -0
- data/lib/websocket_rails/user_manager.rb +276 -0
- data/lib/websocket_rails/version.rb +3 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/chat_controller.rb +53 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/user.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +26 -0
- data/spec/dummy/config/environments/production.rb +49 -0
- data/spec/dummy/config/environments/test.rb +34 -0
- data/spec/dummy/config/events.rb +7 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20130902222552_create_users.rb +10 -0
- data/spec/dummy/db/schema.rb +23 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +17 -0
- data/spec/dummy/log/production.log +0 -0
- data/spec/dummy/log/server.log +0 -0
- data/spec/dummy/log/test.log +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/javascripts/application.js +2 -0
- data/spec/dummy/public/javascripts/controls.js +965 -0
- data/spec/dummy/public/javascripts/dragdrop.js +974 -0
- data/spec/dummy/public/javascripts/effects.js +1123 -0
- data/spec/dummy/public/javascripts/prototype.js +6001 -0
- data/spec/dummy/public/javascripts/rails.js +202 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/integration/connection_manager_spec.rb +135 -0
- data/spec/javascripts/support/jasmine.yml +52 -0
- data/spec/javascripts/support/jasmine_helper.rb +38 -0
- data/spec/javascripts/support/vendor/sinon-1.7.1.js +4343 -0
- data/spec/javascripts/websocket_rails/channel_spec.coffee +112 -0
- data/spec/javascripts/websocket_rails/event_spec.coffee +81 -0
- data/spec/javascripts/websocket_rails/helpers.coffee +6 -0
- data/spec/javascripts/websocket_rails/websocket_connection_spec.coffee +158 -0
- data/spec/javascripts/websocket_rails/websocket_rails_spec.coffee +273 -0
- data/spec/spec_helper.rb +41 -0
- data/spec/spec_helpers/matchers/route_matchers_spec.rb +109 -0
- data/spec/spec_helpers/matchers/trigger_matchers_spec.rb +358 -0
- data/spec/spec_helpers/spec_helper_event_spec.rb +66 -0
- data/spec/support/helper_methods.rb +42 -0
- data/spec/support/mock_web_socket.rb +41 -0
- data/spec/unit/base_controller_spec.rb +74 -0
- data/spec/unit/channel_manager_spec.rb +58 -0
- data/spec/unit/channel_spec.rb +169 -0
- data/spec/unit/connection_adapters/http_spec.rb +88 -0
- data/spec/unit/connection_adapters/web_socket_spec.rb +30 -0
- data/spec/unit/connection_adapters_spec.rb +259 -0
- data/spec/unit/connection_manager_spec.rb +148 -0
- data/spec/unit/controller_factory_spec.rb +76 -0
- data/spec/unit/data_store_spec.rb +106 -0
- data/spec/unit/dispatcher_spec.rb +203 -0
- data/spec/unit/event_map_spec.rb +120 -0
- data/spec/unit/event_queue_spec.rb +36 -0
- data/spec/unit/event_spec.rb +181 -0
- data/spec/unit/logging_spec.rb +162 -0
- data/spec/unit/synchronization_spec.rb +150 -0
- data/spec/unit/target_validator_spec.rb +88 -0
- data/spec/unit/user_manager_spec.rb +165 -0
- metadata +320 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 597346f03088e98723978a05f9a3bda02b4bb2dc
|
|
4
|
+
data.tar.gz: e6d09575099ea548eff0218b781e7ddd21484349
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: cecbfecaa3337f54302ce33e08ac70f1eacfcdde7582420ff51e0a89283d54a2133de131514d40b6c52e58b66fc38fb29b37199034a10b4703d3d9832aacbd76
|
|
7
|
+
data.tar.gz: 56cb845c697ae92e2328a1deb5220c12472fa90f1a2a55467e224e61355282474c772a6ef07c873bfe7f6107284e5e2eb3b534c61dd1f9a9bad3857334822954
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# WebsocketRails Change Log
|
|
2
|
+
|
|
3
|
+
## Version 0.7.0
|
|
4
|
+
|
|
5
|
+
March 14 2014
|
|
6
|
+
|
|
7
|
+
* Add verification of parsing results in Event. (Prevents a possible
|
|
8
|
+
denial of service attack when sending improperly formatted but valid
|
|
9
|
+
JSON. Thanks to @maharifu
|
|
10
|
+
|
|
11
|
+
* Support HTTP streaming for Internet Explorer versions 8+ by using
|
|
12
|
+
XDomainRequest - Thanks to @lkol
|
|
13
|
+
|
|
14
|
+
* Added a possibility to set channel success and failure callbacks on
|
|
15
|
+
subscribe. - Thanks to @lkol
|
|
16
|
+
|
|
17
|
+
* Rescue symbolizing of channel names. fixes #166 - Thanks to @KazW
|
|
18
|
+
|
|
19
|
+
* Refactor *.coffee files. Add reconnect() method. - Thanks to @jtomaszewski
|
|
20
|
+
|
|
21
|
+
* Add Channel tokens to prevent unauthorized subscriptions to channels.
|
|
22
|
+
Thanks - @moaa and @elthariel
|
|
23
|
+
|
|
24
|
+
* Fixed a bug where a newline was being outputted in the log regardless of log level - Thanks to @markmalek
|
|
25
|
+
|
|
26
|
+
* Properly handle WSS and WS protocols in the JavaScript client - Thanks
|
|
27
|
+
to @markee
|
|
28
|
+
|
|
29
|
+
* Defer #on_open to EM.next_tick. fixes #135 - Thanks to @moaa
|
|
30
|
+
|
|
31
|
+
* Add subscriber Join/Part events for channels - Thanks to @moaa
|
|
32
|
+
|
|
33
|
+
* Convert controller's `action_name` to a string to get AbstractController::Callbacks (`before_action`) working properly [fixes #150] - Thanks to @Pitr
|
|
34
|
+
|
|
35
|
+
## Version 0.6.2
|
|
36
|
+
|
|
37
|
+
September 8 2013
|
|
38
|
+
|
|
39
|
+
* Updated Dispatcher#broadcast_message to work with the new
|
|
40
|
+
ConnectionManager connections hash. - Thanks to @Frustrate @moaa
|
|
41
|
+
|
|
42
|
+
## Version 0.6.1
|
|
43
|
+
|
|
44
|
+
September 6 2013
|
|
45
|
+
|
|
46
|
+
* Fixed the loading of event routes when launched in the production
|
|
47
|
+
environment.
|
|
48
|
+
|
|
49
|
+
## Version 0.6.0
|
|
50
|
+
|
|
51
|
+
September 3 2013
|
|
52
|
+
|
|
53
|
+
* Added the UserManager accessible through the `WebsocketRails.users`
|
|
54
|
+
method. This allows for triggering events on individual logged in users
|
|
55
|
+
from anywhere inside of your application without the need to create a
|
|
56
|
+
channel for that user.
|
|
57
|
+
|
|
58
|
+
## Version 0.5.0
|
|
59
|
+
|
|
60
|
+
September 2 2013
|
|
61
|
+
|
|
62
|
+
* Use window.location.protocol to choose between ws:// and wss://
|
|
63
|
+
shcheme. - Thanks to @depili
|
|
64
|
+
* Override ConnectionManager#inspect to clean up the output from `rake
|
|
65
|
+
routes`
|
|
66
|
+
* Added a basic Global UserManager for triggering events on specific users
|
|
67
|
+
from anywhere inside your app without creating a dedicated user channel.
|
|
68
|
+
* Deprecate the old controller observer system and implement full Rails
|
|
69
|
+
AbstractController::Callbacks support. - Thanks to @pitr
|
|
70
|
+
* Reload the events.rb event route file each time an event is fired. -
|
|
71
|
+
Thanks to @moaa
|
|
72
|
+
* Separated the event route file and WebsocketRails configuration files.
|
|
73
|
+
The events.rb now lives in `config/events.rb`. The configuration should
|
|
74
|
+
remain in an initializer located at `config/initializers/websocket_rails.rb`. - Thanks to @moaa
|
|
75
|
+
|
|
76
|
+
## Version 0.4.9
|
|
77
|
+
|
|
78
|
+
July 9 2013
|
|
79
|
+
|
|
80
|
+
* Updated JavaScript client to properly keep track of the connection state.
|
|
81
|
+
* Added .connection_stale() function to the JavaScript client for easily checking connection state.
|
|
82
|
+
|
|
83
|
+
## Version 0.4.8
|
|
84
|
+
|
|
85
|
+
July 6 2013
|
|
86
|
+
|
|
87
|
+
* Fix error with class reloading in development with Rails 4
|
|
88
|
+
* Added `connection.close!` method to allow for manually disconnecting users from a WebsocketRails controller.
|
|
89
|
+
* Add a way to unsubscribe from channels via the JavaScript client. - Thanks to @Oxynum
|
|
90
|
+
* Fix handling of `on_error` event in the JavaScript client. - Thanks to @imton
|
|
91
|
+
|
|
92
|
+
## Version 0.4.7
|
|
93
|
+
|
|
94
|
+
June 6 2013
|
|
95
|
+
|
|
96
|
+
* Fix observer system - Thanks to @pitr
|
|
97
|
+
* Fix spelling mistake in ConnectionAdapters#inspect - Thanks to
|
|
98
|
+
@bmxpert1
|
|
99
|
+
* Prevent duplicate events from being triggered when events are added
|
|
100
|
+
directly to Redis from an outside process. - Thanks to @moaa
|
|
101
|
+
* Only log event data if it is a Hash or String to drastically reduce
|
|
102
|
+
the log file size. - Thanks to @florianguenther
|
|
103
|
+
* Fix the intermittent uninitialized constant
|
|
104
|
+
"WebsocketRails::InternalEvents" error in development. - Thanks to
|
|
105
|
+
@DarkSwoop
|
|
106
|
+
|
|
107
|
+
## Version 0.4.6
|
|
108
|
+
|
|
109
|
+
May 9 2013
|
|
110
|
+
|
|
111
|
+
* Manually load the Faye::WebSocket Thin adapter to support the latest
|
|
112
|
+
version of the Faye::WebSocket gem. - Thanks to @Traxmaxx
|
|
113
|
+
|
|
114
|
+
## Version 0.4.5
|
|
115
|
+
|
|
116
|
+
May 5 2013
|
|
117
|
+
|
|
118
|
+
* Fix controller class reloading in development. - Thanks to @florianguenther
|
|
119
|
+
|
|
120
|
+
## Version 0.4.4
|
|
121
|
+
|
|
122
|
+
April 28 2013
|
|
123
|
+
|
|
124
|
+
* Remove existing subscribers from a channel when making it private to
|
|
125
|
+
eliminate the potential for malicious users to eavesdrop on private
|
|
126
|
+
channels. Addresses issue #72.
|
|
127
|
+
* Prevent the server from crashing when receiving an uploaded file.
|
|
128
|
+
Addresses issue #68.
|
|
129
|
+
* Allow custom routes for the WebSocket server. Users of are
|
|
130
|
+
no longer forced to use the `/websocket` route. - Thanks to @Cominch
|
|
131
|
+
|
|
132
|
+
## Version 0.4.3
|
|
133
|
+
|
|
134
|
+
March 12 2013
|
|
135
|
+
|
|
136
|
+
* Change the log output in Channel#trigger_event. Fixes issue #61.
|
|
137
|
+
* Cancel the ping timer when removing disconnecting a Connection.
|
|
138
|
+
* Fix uninitialized constant WebsocketRails::Internal controller error.
|
|
139
|
+
|
|
140
|
+
## Version 0.4.2
|
|
141
|
+
|
|
142
|
+
March 1 2013
|
|
143
|
+
|
|
144
|
+
* Check to make sure ActiveRecord is defined before calling
|
|
145
|
+
ActiveRecord::RecordInvalid in Dispatcher. Fixes issue #54. - Thanks to
|
|
146
|
+
@nessche
|
|
147
|
+
|
|
148
|
+
## Version 0.4.1
|
|
149
|
+
|
|
150
|
+
February 28 2013
|
|
151
|
+
|
|
152
|
+
* Fix bug in ControllerFactory#reload! that prevented the handling of
|
|
153
|
+
internal events when running in the Development environment. Fixes issue #50. - Thanks to @nessche
|
|
154
|
+
|
|
155
|
+
* Only reload controller classes when Rails config.cache_classes is set
|
|
156
|
+
to false instead of always reloading when in the Rails development
|
|
157
|
+
environment. This better respects the Rails configuration options.
|
|
158
|
+
Addresses issue #51. - Thanks to @ngauthier
|
|
159
|
+
|
|
160
|
+
* Update the Rails engine to handle the new Rails 4 route path. Checks
|
|
161
|
+
the Rails version and adds the correct path for the routes file. Fixes
|
|
162
|
+
issue #49. - Thanks to @sgerrand
|
|
163
|
+
|
|
164
|
+
## Version 0.4.0
|
|
165
|
+
|
|
166
|
+
February 27 2013
|
|
167
|
+
|
|
168
|
+
__There have been a few breaking changes in the public API since the
|
|
169
|
+
last release. Please review the list below and consult the Wiki for more
|
|
170
|
+
information regarding the usage of the new features.__
|
|
171
|
+
|
|
172
|
+
* Controller instances no longer persist between events that are
|
|
173
|
+
triggered. Each event is processed by a new controller instance,
|
|
174
|
+
similar to a standard Rails request. Since you can no longer use
|
|
175
|
+
instance variables to temporarily persist data between events, there is
|
|
176
|
+
a new Controller Data Store that can be used for this purpose. This
|
|
177
|
+
change addresses issue #31.
|
|
178
|
+
|
|
179
|
+
* The original DataStore class has been deprecated. In it's place are
|
|
180
|
+
the new Controller Data Store and Connection Data Store. As mentioned
|
|
181
|
+
above, the Controller Data Store can be used to persist data between
|
|
182
|
+
events in much the same way that you would use instance variables. The
|
|
183
|
+
Connection Data Store acts like the Rails session store. Use it to store
|
|
184
|
+
data private to a connection. Data in the Connection Data Store can be
|
|
185
|
+
accessed from any controller. Check out the Wiki for more information on
|
|
186
|
+
both.
|
|
187
|
+
|
|
188
|
+
* The `websocket_rails.reload_controllers` event has been deprecated.
|
|
189
|
+
The new Controller instantiation model allows for automatic controller
|
|
190
|
+
class reloading while in the development environment. You no longer
|
|
191
|
+
need to trigger an event to pick up code changes in controllers while
|
|
192
|
+
connections are active.
|
|
193
|
+
|
|
194
|
+
* Real logging support has _finally_ been implemented. Check out the
|
|
195
|
+
configuration WIki for more information on the various logging options
|
|
196
|
+
available.
|
|
197
|
+
|
|
198
|
+
## Version 0.3.0
|
|
199
|
+
|
|
200
|
+
February 6 2013
|
|
201
|
+
|
|
202
|
+
* Extend the event router DSL to accept routes similar to the routes.rb
|
|
203
|
+
shorthand `controller#action`. - Thanks to @nessche.
|
|
204
|
+
|
|
205
|
+
* Add a custom RSpec matcher suite for verifying event routes
|
|
206
|
+
and easily asserting that WebsocketRails controller actions are
|
|
207
|
+
triggering events correctly. - Also thanks to @nessche.
|
|
208
|
+
|
|
209
|
+
* Fix fiber yielded across threads bug when running in standalone mode
|
|
210
|
+
by disabling Thin threaded mode as default option.
|
|
211
|
+
|
|
212
|
+
## Version 0.2.1
|
|
213
|
+
|
|
214
|
+
January 29 2013
|
|
215
|
+
|
|
216
|
+
* Fix default redis driver issue that was causing problems when using
|
|
217
|
+
redis while event machine was not running.
|
|
218
|
+
|
|
219
|
+
* Fix undefined data store value issue. Thanks to @burninggramma.
|
|
220
|
+
|
|
221
|
+
## Version 0.2.0
|
|
222
|
+
|
|
223
|
+
November 25 2012
|
|
224
|
+
|
|
225
|
+
* Add standalone server mode to support non event machine
|
|
226
|
+
based web servers.
|
|
227
|
+
|
|
228
|
+
## Version 0.1.9
|
|
229
|
+
|
|
230
|
+
November 19 2012
|
|
231
|
+
|
|
232
|
+
* Fix bug that crashed the server when receiving badly formed messages
|
|
233
|
+
through an open websocket. Fixes issue #27.
|
|
234
|
+
|
|
235
|
+
* Add support for communication between multiple server instances and
|
|
236
|
+
background jobs. Solves scaling problems discussed in issue #21.
|
|
237
|
+
|
|
238
|
+
* Fixed client_disconnected event firing twice - Thanks to
|
|
239
|
+
@nickdesaulniers
|
|
240
|
+
|
|
241
|
+
## Version 0.1.8
|
|
242
|
+
|
|
243
|
+
July 18 2012
|
|
244
|
+
|
|
245
|
+
* Fix bug in Channel#trigger preventing the data from coming through
|
|
246
|
+
properly.
|
|
247
|
+
|
|
248
|
+
## Version 0.1.7
|
|
249
|
+
|
|
250
|
+
July 17 2012
|
|
251
|
+
|
|
252
|
+
* Fixed botched release of 0.1.6
|
|
253
|
+
* Reorganized directory structure
|
|
254
|
+
|
|
255
|
+
## Version 0.1.6
|
|
256
|
+
|
|
257
|
+
July 17 2012
|
|
258
|
+
|
|
259
|
+
* Added private channel support - Thanks to @MhdSyrwan
|
|
260
|
+
* Added DSL method for marking channels as private.
|
|
261
|
+
* Added support for attaching success and failure callbacks to triggered
|
|
262
|
+
events on the JavaScript client.
|
|
263
|
+
* Fixed JSON parsing bug in HTTP streaming client when multiple events
|
|
264
|
+
were received together.
|
|
265
|
+
* Added connection keepalive ping/pong timers to ensure clients do not
|
|
266
|
+
disconnect automatically. Ensures HTTP streaming works well on Heroku.
|
|
267
|
+
* Removed the requirement of using the thin-socketrails executable. The
|
|
268
|
+
executable will be removed entirely in the next release.
|
|
269
|
+
* Added Jasmine specs for CoffeeScript client.
|
|
270
|
+
* Exceptions triggered in controller actions are now serialized and
|
|
271
|
+
passed to the failure callback on the client that triggered the
|
|
272
|
+
action.
|
|
273
|
+
* Events triggered on the client before the connection is fully
|
|
274
|
+
established are now queued and sent in bulk once the connection is
|
|
275
|
+
ready.
|
|
276
|
+
|
|
277
|
+
## Version 0.1.5
|
|
278
|
+
|
|
279
|
+
July 3 2012
|
|
280
|
+
|
|
281
|
+
* Fixed bug in JavaScript client that caused Channels not to dispatch
|
|
282
|
+
correctly.
|
|
283
|
+
* Rewrote JavaScript client in CoffeeScript.
|
|
284
|
+
* Created project Wiki
|
|
285
|
+
|
|
286
|
+
## Version 0.1.4
|
|
287
|
+
|
|
288
|
+
June 30 2012
|
|
289
|
+
|
|
290
|
+
* Added channel support
|
|
291
|
+
* Fix the JavaScript client to work on the iPad - Thanks to @adamkittelson
|
|
292
|
+
* Add an event queue on the connection object to allow for queueing up
|
|
293
|
+
multiple events before flushing to the client.
|
|
294
|
+
* Add generator for creating the events.rb intializer and requiring the
|
|
295
|
+
client in the application.js sprockets manifest file.
|
|
296
|
+
|
|
297
|
+
## Version 0.1.3
|
|
298
|
+
|
|
299
|
+
June 22 2012
|
|
300
|
+
|
|
301
|
+
* Added support for namespaced events.
|
|
302
|
+
* Improved event machine scheduling for action processing.
|
|
303
|
+
* Made a client's connection ID private.
|
|
304
|
+
* Bugfixes in the JavaScript event dispatchers.
|
|
305
|
+
|
|
306
|
+
## Version 0.1.2
|
|
307
|
+
|
|
308
|
+
June 10 2012
|
|
309
|
+
|
|
310
|
+
* Added streaming HTTP support as a fallback from WebSockets.
|
|
311
|
+
* Added example JavaScript event dispatchers.
|
|
312
|
+
|
|
313
|
+
## Version 0.1.1
|
|
314
|
+
|
|
315
|
+
June 2 2012
|
|
316
|
+
|
|
317
|
+
* Created project home page.
|
|
318
|
+
* Improved test coverage and cleaned up the internals.
|
|
319
|
+
|
|
320
|
+
## Version 0.1.0
|
|
321
|
+
|
|
322
|
+
April 14 2012
|
|
323
|
+
|
|
324
|
+
* Complete project rewrite.
|
|
325
|
+
* Removed websocket-rack dependency.
|
|
326
|
+
* Enhanced documentation.
|
|
327
|
+
* Added event observers in WebsocketRail Controllers.
|
|
328
|
+
* First stable release!
|
data/Gemfile
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
source "http://rubygems.org"
|
|
2
|
+
|
|
3
|
+
gemspec
|
|
4
|
+
|
|
5
|
+
gem "rspec-rails", ">=2.14.0"
|
|
6
|
+
gem "therubyrhino"
|
|
7
|
+
gem "therubyracer"
|
|
8
|
+
gem "jasmine"
|
|
9
|
+
gem "headless"
|
|
10
|
+
gem "selenium-webdriver"
|
|
11
|
+
gem "coffee-script"
|
|
12
|
+
gem "thin"
|
|
13
|
+
gem "eventmachine"
|
|
14
|
+
gem "faye-websocket"
|
|
15
|
+
gem "simplecov"
|
|
16
|
+
gem "ruby_gntp"
|
|
17
|
+
gem "guard"
|
|
18
|
+
gem "guard-rspec"
|
|
19
|
+
gem "guard-coffeescript"
|
|
20
|
+
gem "rb-fsevent"
|
|
21
|
+
|
|
22
|
+
platforms :jruby do
|
|
23
|
+
gem 'activerecord-jdbcsqlite3-adapter', :require => 'jdbc-sqlite3', :require => 'arjdbc'
|
|
24
|
+
end
|
|
25
|
+
platforms :ruby do
|
|
26
|
+
gem 'sqlite3'
|
|
27
|
+
end
|
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2012 Dan Knox and Kyle Whalen
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Websocket-Rails
|
|
2
|
+
|
|
3
|
+
[](https://travis-ci.org/websocket-rails/websocket-rails)
|
|
4
|
+
[](http://badge.fury.io/rb/websocket-rails)
|
|
5
|
+
[](https://codeclimate.com/github/websocket-rails/websocket-rails)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
If you haven't done so yet, check out the [Project
|
|
9
|
+
Page](http://websocket-rails.github.io) to get a feel for the project direction. Feedback is very much appreciated. Post an issue on the issue tracker or [shoot us an email](mailto:support@threedotloft.com) to give us your thoughts.
|
|
10
|
+
|
|
11
|
+
**Find us on IRC #websocket-rails**
|
|
12
|
+
|
|
13
|
+
Stop by #websocket-rails on freenode if you would like to chat or have any
|
|
14
|
+
questions.
|
|
15
|
+
|
|
16
|
+
## Recent Updates
|
|
17
|
+
|
|
18
|
+
Check out the [CHANGELOG](https://github.com/websocket-rails/websocket-rails/blob/master/CHANGELOG.md) to find out what's new.
|
|
19
|
+
|
|
20
|
+
As of version 0.2.0, non event machine based web servers such as Phusion
|
|
21
|
+
Passenger are supported through the use of the [Standalone Server Mode](https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode).
|
|
22
|
+
|
|
23
|
+
## Overview
|
|
24
|
+
|
|
25
|
+
Start treating client side events as first class citizens inside your
|
|
26
|
+
Rails application with a built in WebSocket server. Sure, WebSockets
|
|
27
|
+
aren't quite universal yet. That's why we also support streaming HTTP.
|
|
28
|
+
Oh, and if you don't mind running a separate process, you can support
|
|
29
|
+
just about any browser with Flash sockets.
|
|
30
|
+
|
|
31
|
+
## Installation and Usage Guides
|
|
32
|
+
|
|
33
|
+
* [Installation
|
|
34
|
+
Guide](https://github.com/websocket-rails/websocket-rails/wiki/Installation-and-Setup)
|
|
35
|
+
* [Event
|
|
36
|
+
Router](https://github.com/websocket-rails/websocket-rails/wiki/The-Event-Router)
|
|
37
|
+
* [WebsocketRails Controllers](https://github.com/websocket-rails/websocket-rails/wiki/WebsocketRails Controllers)
|
|
38
|
+
* [Using the JavaScript
|
|
39
|
+
Client](https://github.com/websocket-rails/websocket-rails/wiki/Using-the-JavaScript-Client)
|
|
40
|
+
* [Using
|
|
41
|
+
Channels](https://github.com/websocket-rails/websocket-rails/wiki/Working-with-Channels)
|
|
42
|
+
* [Using Private Channels](https://github.com/websocket-rails/websocket-rails/wiki/Using-Private-Channels)
|
|
43
|
+
* [The
|
|
44
|
+
DataStore](https://github.com/websocket-rails/websocket-rails/wiki/Using-the-DataStore)
|
|
45
|
+
* [Reloading Controllers In Development](https://github.com/websocket-rails/websocket-rails/wiki/Reloading-Controllers-In-Development)
|
|
46
|
+
* [Multiple Servers and Background Jobs](https://github.com/websocket-rails/websocket-rails/wiki/Multiple-Servers-and-Background-Jobs)
|
|
47
|
+
* [Standalone Server Mode](https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode)
|
|
48
|
+
|
|
49
|
+
## Handle Events With Class
|
|
50
|
+
|
|
51
|
+
Map events to controller actions using an Event Router.
|
|
52
|
+
|
|
53
|
+
````ruby
|
|
54
|
+
WebsocketRails::EventMap.describe do
|
|
55
|
+
namespace :tasks do
|
|
56
|
+
|
|
57
|
+
# using a Hash to specify the target
|
|
58
|
+
subscribe :create, :to => TaskController, :with_method => :create
|
|
59
|
+
|
|
60
|
+
# using the same syntax as routes.rb
|
|
61
|
+
subscribe :update, 'task#update'
|
|
62
|
+
|
|
63
|
+
# if your controller is not a top-level object
|
|
64
|
+
subscribe :create_admin, :to => Admin::TaskController, :with_method => :create
|
|
65
|
+
|
|
66
|
+
subscribe :update_admin, 'admin/task#update'
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
````
|
|
71
|
+
|
|
72
|
+
Trigger events using our JavaScript client.
|
|
73
|
+
|
|
74
|
+
````javascript
|
|
75
|
+
var task = {
|
|
76
|
+
name: 'Start taking advantage of WebSockets',
|
|
77
|
+
completed: false
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
var dispatcher = new WebSocketRails('localhost:3000/websocket');
|
|
81
|
+
|
|
82
|
+
dispatcher.trigger('tasks.create', task);
|
|
83
|
+
````
|
|
84
|
+
|
|
85
|
+
Handle events in your controller.
|
|
86
|
+
|
|
87
|
+
````ruby
|
|
88
|
+
class TaskController < WebsocketRails::BaseController
|
|
89
|
+
def create
|
|
90
|
+
# The `message` method contains the data received
|
|
91
|
+
task = Task.new message
|
|
92
|
+
if task.save
|
|
93
|
+
send_message :create_success, task, :namespace => :tasks
|
|
94
|
+
else
|
|
95
|
+
send_message :create_fail, task, :namespace => :tasks
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
````
|
|
100
|
+
|
|
101
|
+
Receive the response in the client.
|
|
102
|
+
|
|
103
|
+
````javascript
|
|
104
|
+
dispatcher.bind('tasks.create_success', function(task) {
|
|
105
|
+
console.log('successfully created ' + task.name);
|
|
106
|
+
});
|
|
107
|
+
````
|
|
108
|
+
|
|
109
|
+
Or just attach success and failure callbacks to your client events.
|
|
110
|
+
|
|
111
|
+
````javascript
|
|
112
|
+
var success = function(task) { console.log("Created: " + task.name); }
|
|
113
|
+
|
|
114
|
+
var failure = function(task) {
|
|
115
|
+
console.log("Failed to create Product: " + product.name)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
dispatcher.trigger('products.create', task, success, failure);
|
|
119
|
+
````
|
|
120
|
+
|
|
121
|
+
Then trigger them in your controller:
|
|
122
|
+
|
|
123
|
+
````ruby
|
|
124
|
+
def create
|
|
125
|
+
task = Task.create message
|
|
126
|
+
if task.save
|
|
127
|
+
trigger_success task
|
|
128
|
+
else
|
|
129
|
+
trigger_failure task
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
````
|
|
133
|
+
|
|
134
|
+
Note that if you do not trigger the event, a success will be automatically triggered with no data. You can change this behavior by editing the gem configurations and add : `config.trigger_success_by_default = false`.
|
|
135
|
+
|
|
136
|
+
If you're feeling truly lazy, just trigger the failure callback with an
|
|
137
|
+
exception.
|
|
138
|
+
|
|
139
|
+
````ruby
|
|
140
|
+
def create
|
|
141
|
+
task = Task.create! message
|
|
142
|
+
trigger_success task # trigger success if the save went alright
|
|
143
|
+
end
|
|
144
|
+
````
|
|
145
|
+
|
|
146
|
+
That controller is starting to look pretty clean.
|
|
147
|
+
|
|
148
|
+
Now in the failure callback on the client we have access to the record
|
|
149
|
+
and the errors.
|
|
150
|
+
|
|
151
|
+
````javascript
|
|
152
|
+
var failureCallback = function(task) {
|
|
153
|
+
console.log( task.name );
|
|
154
|
+
console.log( task.errors );
|
|
155
|
+
console.log( "You have " + task.errors.length + " errors." );
|
|
156
|
+
}
|
|
157
|
+
````
|
|
158
|
+
|
|
159
|
+
You can stop listening to an event now by using the unbind function.
|
|
160
|
+
|
|
161
|
+
````javascript
|
|
162
|
+
dispatcher.unbind('tasks.create_success');
|
|
163
|
+
````
|
|
164
|
+
|
|
165
|
+
## Channel Support
|
|
166
|
+
|
|
167
|
+
Keep your users up to date without waiting for them to refresh the page.
|
|
168
|
+
Subscribe them to a channel and update it from wherever you please.
|
|
169
|
+
|
|
170
|
+
Tune in on the client side.
|
|
171
|
+
|
|
172
|
+
````javascript
|
|
173
|
+
channel = dispatcher.subscribe('posts');
|
|
174
|
+
channel.bind('new', function(post) {
|
|
175
|
+
console.log('a new post about '+post.title+' arrived!');
|
|
176
|
+
});
|
|
177
|
+
````
|
|
178
|
+
|
|
179
|
+
Broadcast to the channel from anywhere inside your Rails application. An
|
|
180
|
+
existing controller, a model, a background job, or a new WebsocketRails
|
|
181
|
+
controller.
|
|
182
|
+
|
|
183
|
+
````ruby
|
|
184
|
+
latest_post = Post.latest
|
|
185
|
+
WebsocketRails[:posts].trigger 'new', latest_post
|
|
186
|
+
````
|
|
187
|
+
|
|
188
|
+
## Private Channel Support
|
|
189
|
+
|
|
190
|
+
Need to restrict access to a particular channel? No problem. We've got
|
|
191
|
+
that.
|
|
192
|
+
|
|
193
|
+
Private channels give you the ability to authorize a user's
|
|
194
|
+
subscription using the authorization mechanism of your choice.
|
|
195
|
+
|
|
196
|
+
Just tell WebsocketRails which channels you would like to make private by using the `private_channel` method in the Event Router.
|
|
197
|
+
Then handle the channel authorization by subscribing to the `websocket_rails.subscribe_private` event.
|
|
198
|
+
|
|
199
|
+
````ruby
|
|
200
|
+
WebsocketRails::EventMap.describe do
|
|
201
|
+
private_channel :secret_posts
|
|
202
|
+
|
|
203
|
+
namespace :websocket_rails
|
|
204
|
+
subscribe :subscribe_private, :to => AuthorizationController, :with_method => :authorize_channels
|
|
205
|
+
end
|
|
206
|
+
````
|
|
207
|
+
|
|
208
|
+
Or you can always mark any channel as private later on.
|
|
209
|
+
|
|
210
|
+
````ruby
|
|
211
|
+
WebsocketRails[:secret_posts].make_private
|
|
212
|
+
````
|
|
213
|
+
|
|
214
|
+
On the client side, you can use the `dispatcher.subscribe_private()`
|
|
215
|
+
method to subscribe to a private channel.
|
|
216
|
+
|
|
217
|
+
Read the [Private Channel Wiki](https://github.com/websocket-rails/websocket-rails/wiki/Using-Private-Channels) for more information on subscribing to private channels from the JavaScript client and handling the authorization in your controller.
|
|
218
|
+
|
|
219
|
+
## Credit where credit is due
|
|
220
|
+
|
|
221
|
+
Big thanks to our [contributors](https://github.com/websocket-rails/websocket-rails/graphs/contributors) who have helped keep this project moving.
|
|
222
|
+
|
|
223
|
+
Special thanks to [@nessche](https://github.com/nessche) who provided the improved routing DSL and RSpec matcher suite.
|
|
224
|
+
|
|
225
|
+
The `websocket-rails` organization logo was kindly provided by [Uken Games](http://www.uken.com/).
|
|
226
|
+
|
|
227
|
+
## Development
|
|
228
|
+
|
|
229
|
+
Please check out the [Development Guide](https://github.com/websocket-rails/websocket-rails/wiki/Development) if you are interested in contributing. It should cover everything you need to get up and running.
|
|
230
|
+
|
|
231
|
+
## Core Team
|
|
232
|
+
|
|
233
|
+
The current `websocket-rails` core team consists of the following individuals:
|
|
234
|
+
|
|
235
|
+
* [@DanKnox](https://github.com/DanKnox)
|
|
236
|
+
* [@Pitr](https://github.com/pitr)
|
|
237
|
+
* [@moaa](https://github.com/moaa)
|
|
238
|
+
|
|
239
|
+
New contributors and pull requests are always welcome.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'rake'
|
|
4
|
+
begin
|
|
5
|
+
require 'bundler/setup'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
begin
|
|
11
|
+
require 'rdoc/task'
|
|
12
|
+
rescue LoadError
|
|
13
|
+
require 'rdoc/rdoc'
|
|
14
|
+
require 'rake/rdoctask'
|
|
15
|
+
RDoc::Task = Rake::RDocTask
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Bundler::GemHelper.install_tasks
|
|
19
|
+
|
|
20
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
21
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
22
|
+
rdoc.title = 'websocket-rails'
|
|
23
|
+
rdoc.options << '--line-numbers'
|
|
24
|
+
rdoc.rdoc_files.include('README.md')
|
|
25
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
require 'rspec/core/rake_task'
|
|
29
|
+
|
|
30
|
+
desc 'Default: run RSpec and Jasmine specs.'
|
|
31
|
+
task :default => :spec_and_jasmine
|
|
32
|
+
|
|
33
|
+
desc "Run specs"
|
|
34
|
+
RSpec::Core::RakeTask.new do |t|
|
|
35
|
+
t.pattern = "./spec/**/*_spec.rb"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc "Run rspec and jasmine:ci at the same time"
|
|
39
|
+
task :spec_and_jasmine do
|
|
40
|
+
Rake::Task["spec"].execute
|
|
41
|
+
Rake::Task["jasmine:ci:headless"].execute
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
desc "Generate code coverage"
|
|
45
|
+
task :coverage do
|
|
46
|
+
ENV['COVERAGE'] = 'true'
|
|
47
|
+
Rake::Task["spec"].execute
|
|
48
|
+
`open coverage/index.html`
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
begin
|
|
52
|
+
require 'jasmine'
|
|
53
|
+
load 'jasmine/tasks/jasmine.rake'
|
|
54
|
+
rescue LoadError
|
|
55
|
+
task :jasmine do
|
|
56
|
+
abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
require 'headless'
|
|
61
|
+
require 'selenium-webdriver'
|
|
62
|
+
|
|
63
|
+
namespace :jasmine do
|
|
64
|
+
namespace :ci do
|
|
65
|
+
desc "Run Jasmine CI build headlessly"
|
|
66
|
+
task :headless do
|
|
67
|
+
ENV['DISPLAY'] = ':99.0'
|
|
68
|
+
puts "Running Jasmine Headlessly"
|
|
69
|
+
Rake::Task['jasmine:ci'].invoke
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|