hkroger-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.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +328 -0
  3. data/Gemfile +27 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +237 -0
  6. data/Rakefile +72 -0
  7. data/bin/thin-socketrails +45 -0
  8. data/lib/assets/javascripts/websocket_rails/abstract_connection.js.coffee +45 -0
  9. data/lib/assets/javascripts/websocket_rails/channel.js.coffee +70 -0
  10. data/lib/assets/javascripts/websocket_rails/event.js.coffee +42 -0
  11. data/lib/assets/javascripts/websocket_rails/http_connection.js.coffee +66 -0
  12. data/lib/assets/javascripts/websocket_rails/main.js +6 -0
  13. data/lib/assets/javascripts/websocket_rails/websocket_connection.js.coffee +29 -0
  14. data/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee +158 -0
  15. data/lib/config.ru +3 -0
  16. data/lib/generators/websocket_rails/install/install_generator.rb +33 -0
  17. data/lib/generators/websocket_rails/install/templates/events.rb +14 -0
  18. data/lib/generators/websocket_rails/install/templates/websocket_rails.rb +63 -0
  19. data/lib/hkroger-websocket-rails.rb +1 -0
  20. data/lib/rails/app/controllers/websocket_rails/delegation_controller.rb +13 -0
  21. data/lib/rails/config/routes.rb +7 -0
  22. data/lib/rails/tasks/websocket_rails.tasks +42 -0
  23. data/lib/spec_helpers/matchers/route_matchers.rb +65 -0
  24. data/lib/spec_helpers/matchers/trigger_matchers.rb +113 -0
  25. data/lib/spec_helpers/spec_helper_event.rb +34 -0
  26. data/lib/websocket-rails.rb +108 -0
  27. data/lib/websocket_rails/base_controller.rb +197 -0
  28. data/lib/websocket_rails/channel.rb +97 -0
  29. data/lib/websocket_rails/channel_manager.rb +55 -0
  30. data/lib/websocket_rails/configuration.rb +169 -0
  31. data/lib/websocket_rails/connection_adapters.rb +195 -0
  32. data/lib/websocket_rails/connection_adapters/http.rb +120 -0
  33. data/lib/websocket_rails/connection_adapters/web_socket.rb +36 -0
  34. data/lib/websocket_rails/connection_manager.rb +119 -0
  35. data/lib/websocket_rails/controller_factory.rb +80 -0
  36. data/lib/websocket_rails/data_store.rb +145 -0
  37. data/lib/websocket_rails/dispatcher.rb +129 -0
  38. data/lib/websocket_rails/engine.rb +26 -0
  39. data/lib/websocket_rails/event.rb +189 -0
  40. data/lib/websocket_rails/event_map.rb +184 -0
  41. data/lib/websocket_rails/event_queue.rb +33 -0
  42. data/lib/websocket_rails/internal_events.rb +37 -0
  43. data/lib/websocket_rails/logging.rb +133 -0
  44. data/lib/websocket_rails/spec_helpers.rb +3 -0
  45. data/lib/websocket_rails/synchronization.rb +182 -0
  46. data/lib/websocket_rails/user_manager.rb +276 -0
  47. data/lib/websocket_rails/version.rb +3 -0
  48. data/spec/dummy/Rakefile +7 -0
  49. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  50. data/spec/dummy/app/controllers/chat_controller.rb +53 -0
  51. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  52. data/spec/dummy/app/models/user.rb +2 -0
  53. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  54. data/spec/dummy/config.ru +4 -0
  55. data/spec/dummy/config/application.rb +45 -0
  56. data/spec/dummy/config/boot.rb +10 -0
  57. data/spec/dummy/config/database.yml +22 -0
  58. data/spec/dummy/config/environment.rb +5 -0
  59. data/spec/dummy/config/environments/development.rb +26 -0
  60. data/spec/dummy/config/environments/production.rb +49 -0
  61. data/spec/dummy/config/environments/test.rb +34 -0
  62. data/spec/dummy/config/events.rb +7 -0
  63. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  64. data/spec/dummy/config/initializers/inflections.rb +10 -0
  65. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  66. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  67. data/spec/dummy/config/initializers/session_store.rb +8 -0
  68. data/spec/dummy/config/locales/en.yml +5 -0
  69. data/spec/dummy/config/routes.rb +58 -0
  70. data/spec/dummy/db/development.sqlite3 +0 -0
  71. data/spec/dummy/db/migrate/20130902222552_create_users.rb +10 -0
  72. data/spec/dummy/db/schema.rb +23 -0
  73. data/spec/dummy/db/test.sqlite3 +0 -0
  74. data/spec/dummy/log/development.log +17 -0
  75. data/spec/dummy/log/production.log +0 -0
  76. data/spec/dummy/log/server.log +0 -0
  77. data/spec/dummy/public/404.html +26 -0
  78. data/spec/dummy/public/422.html +26 -0
  79. data/spec/dummy/public/500.html +26 -0
  80. data/spec/dummy/public/favicon.ico +0 -0
  81. data/spec/dummy/public/javascripts/application.js +2 -0
  82. data/spec/dummy/public/javascripts/controls.js +965 -0
  83. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  84. data/spec/dummy/public/javascripts/effects.js +1123 -0
  85. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  86. data/spec/dummy/public/javascripts/rails.js +202 -0
  87. data/spec/dummy/script/rails +6 -0
  88. data/spec/integration/connection_manager_spec.rb +135 -0
  89. data/spec/javascripts/support/jasmine.yml +52 -0
  90. data/spec/javascripts/support/jasmine_helper.rb +38 -0
  91. data/spec/javascripts/support/vendor/sinon-1.7.1.js +4343 -0
  92. data/spec/javascripts/websocket_rails/channel_spec.coffee +112 -0
  93. data/spec/javascripts/websocket_rails/event_spec.coffee +69 -0
  94. data/spec/javascripts/websocket_rails/helpers.coffee +6 -0
  95. data/spec/javascripts/websocket_rails/websocket_connection_spec.coffee +158 -0
  96. data/spec/javascripts/websocket_rails/websocket_rails_spec.coffee +274 -0
  97. data/spec/spec_helper.rb +41 -0
  98. data/spec/spec_helpers/matchers/route_matchers_spec.rb +109 -0
  99. data/spec/spec_helpers/matchers/trigger_matchers_spec.rb +247 -0
  100. data/spec/spec_helpers/spec_helper_event_spec.rb +66 -0
  101. data/spec/support/helper_methods.rb +42 -0
  102. data/spec/support/mock_web_socket.rb +41 -0
  103. data/spec/unit/base_controller_spec.rb +74 -0
  104. data/spec/unit/channel_manager_spec.rb +58 -0
  105. data/spec/unit/channel_spec.rb +169 -0
  106. data/spec/unit/connection_adapters/http_spec.rb +88 -0
  107. data/spec/unit/connection_adapters/web_socket_spec.rb +30 -0
  108. data/spec/unit/connection_adapters_spec.rb +259 -0
  109. data/spec/unit/connection_manager_spec.rb +148 -0
  110. data/spec/unit/controller_factory_spec.rb +76 -0
  111. data/spec/unit/data_store_spec.rb +106 -0
  112. data/spec/unit/dispatcher_spec.rb +203 -0
  113. data/spec/unit/event_map_spec.rb +120 -0
  114. data/spec/unit/event_queue_spec.rb +36 -0
  115. data/spec/unit/event_spec.rb +181 -0
  116. data/spec/unit/logging_spec.rb +162 -0
  117. data/spec/unit/synchronization_spec.rb +150 -0
  118. data/spec/unit/target_validator_spec.rb +88 -0
  119. data/spec/unit/user_manager_spec.rb +165 -0
  120. metadata +320 -0
data/lib/config.ru ADDED
@@ -0,0 +1,3 @@
1
+ require "websocket-rails"
2
+
3
+ run WebsocketRails::ConnectionManager.new
@@ -0,0 +1,33 @@
1
+ require 'rails'
2
+
3
+ module WebsocketRails
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path("../templates", __FILE__)
7
+
8
+ desc "Create the events.rb initializer and require the JS client in the application.js manifest."
9
+
10
+ class_option :manifest, :type => :string, :aliases => "-m", :default => 'application.js',
11
+ :desc => "Javascript manifest file to modify (or create)"
12
+
13
+ def create_events_initializer_file
14
+ template 'events.rb', File.join('config', 'events.rb')
15
+ template 'websocket_rails.rb', File.join('config', 'initializers', 'websocket_rails.rb')
16
+ end
17
+
18
+ def inject_websocket_rails_client
19
+ manifest = options[:manifest]
20
+ js_path = "app/assets/javascripts"
21
+
22
+ create_file("#{js_path}/#{manifest}") unless File.exists?("#{js_path}/#{manifest}")
23
+
24
+ append_to_file "#{js_path}/#{manifest}" do
25
+ out = ""
26
+ out << "//= require websocket_rails/main"
27
+ out << "\n"
28
+ out << "\n"
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ WebsocketRails::EventMap.describe do
2
+ # You can use this file to map incoming events to controller actions.
3
+ # One event can be mapped to any number of controller actions. The
4
+ # actions will be executed in the order they were subscribed.
5
+ #
6
+ # Uncomment and edit the next line to handle the client connected event:
7
+ # subscribe :client_connected, :to => Controller, :with_method => :method_name
8
+ #
9
+ # Here is an example of mapping namespaced events:
10
+ # namespace :product do
11
+ # subscribe :new, :to => ProductController, :with_method => :new_product
12
+ # end
13
+ # The above will handle an event triggered on the client like `product.new`.
14
+ end
@@ -0,0 +1,63 @@
1
+ WebsocketRails.setup do |config|
2
+
3
+ # Uncomment to override the default log level. The log level can be
4
+ # any of the standard Logger log levels. By default it will mirror the
5
+ # current Rails environment log level.
6
+ # config.log_level = :debug
7
+
8
+ # Uncomment to change the default log file path.
9
+ # config.log_path = "#{Rails.root}/log/websocket_rails.log"
10
+
11
+ # Set to true if you wish to log the internal websocket_rails events
12
+ # such as the keepalive `websocket_rails.ping` event.
13
+ # config.log_internal_events = false
14
+
15
+ # Change to true to enable standalone server mode
16
+ # Start the standalone server with rake websocket_rails:start_server
17
+ # * Requires Redis
18
+ config.standalone = false
19
+
20
+ # Change to true to enable channel synchronization between
21
+ # multiple server instances.
22
+ # * Requires Redis.
23
+ config.synchronize = false
24
+
25
+ # Prevent Thin from daemonizing (default is true)
26
+ # config.daemonize = false
27
+
28
+ # Uncomment and edit to point to a different redis instance.
29
+ # Will not be used unless standalone or synchronization mode
30
+ # is enabled.
31
+ # config.redis_options = {:host => 'localhost', :port => '6379'}
32
+
33
+ # By default, all subscribers in to a channel will be removed
34
+ # when that channel is made private. If you don't wish active
35
+ # subscribers to be removed from a previously public channel
36
+ # when making it private, set the following to true.
37
+ # config.keep_subscribers_when_private = false
38
+
39
+ # Set to true if you wish to broadcast channel subscriber_join and
40
+ # subscriber_part events. All subscribers of a channel will be
41
+ # notified when other clients join and part the channel. If you are
42
+ # using the UserManager, the current_user object will be sent along
43
+ # with the event.
44
+ # config.broadcast_subscriber_events = true
45
+
46
+ # Used as the key for the WebsocketRails.users Hash. This method
47
+ # will be called on the `current_user` object in your controller
48
+ # if one exists. If `current_user` does not exist or does not
49
+ # respond to the identifier, the key will default to `connection.id`
50
+ # config.user_identifier = :id
51
+
52
+ # Uncomment and change this option to override the class associated
53
+ # with your `current_user` object. This class will be used when
54
+ # synchronization is enabled and you trigger events from background
55
+ # jobs using the WebsocketRails.users UserManager.
56
+ # config.user_class = User
57
+
58
+ # Supporting HTTP streaming on Internet Explorer versions 8 & 9
59
+ # requires CORS to be enabled for GET "/websocket" request.
60
+ # List here the origin domains allowed to perform the request.
61
+ # config.allowed_origins = ['http://localhost:3000']
62
+
63
+ end
@@ -0,0 +1 @@
1
+ require "websocket-rails"
@@ -0,0 +1,13 @@
1
+ module WebsocketRails
2
+ # This class provides a means for accessing the Rails
3
+ # controller helper methods defined in a user's application
4
+ # or in gems that the user has added to the project.
5
+ #
6
+ # Each active connection creates and stores it's own
7
+ # instance with the correct @_request and @_env objects
8
+ # set. WebsocketRails::BaseController sends missing
9
+ # methods to the active connection's delegation controller
10
+ # instance.
11
+ class DelegationController < ApplicationController
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ Rails.application.routes.draw do
2
+ if Rails.version >= '4.0.0'
3
+ match "/websocket", :to => WebsocketRails::ConnectionManager.new, via: [:get, :post]
4
+ else
5
+ match "/websocket", :to => WebsocketRails::ConnectionManager.new
6
+ end
7
+ end
@@ -0,0 +1,42 @@
1
+ namespace :websocket_rails do
2
+ desc 'Start the WebsocketRails standalone server.'
3
+ task :start_server do
4
+ require "thin"
5
+ load "#{Rails.root}/config/initializers/websocket_rails.rb"
6
+ load "#{Rails.root}/config/events.rb"
7
+
8
+ options = WebsocketRails.config.thin_options
9
+
10
+ warn_if_standalone_not_enabled!
11
+
12
+ if options[:daemonize]
13
+ fork do
14
+ Thin::Controllers::Controller.new(options).start
15
+ end
16
+ else
17
+ Thin::Controllers::Controller.new(options).start
18
+ end
19
+
20
+ puts "Websocket Rails Standalone Server listening on port #{options[:port]}"
21
+ end
22
+
23
+ desc 'Stop the WebsocketRails standalone server.'
24
+ task :stop_server do
25
+ require "thin"
26
+ load "#{Rails.root}/config/initializers/websocket_rails.rb"
27
+ load "#{Rails.root}/config/events.rb"
28
+
29
+ options = WebsocketRails.config.thin_options
30
+
31
+ warn_if_standalone_not_enabled!
32
+
33
+ Thin::Controllers::Controller.new(options).stop
34
+ end
35
+ end
36
+
37
+ def warn_if_standalone_not_enabled!
38
+ return if WebsocketRails.standalone?
39
+ puts "Fail!"
40
+ puts "You must enable standalone mode in your websocket_rails.rb initializer to use the standalone server."
41
+ exit 1
42
+ end
@@ -0,0 +1,65 @@
1
+ module WebsocketRails
2
+
3
+ module SpecHelpers
4
+
5
+ def self.verify_route(event, target, non_exclusive)
6
+
7
+ raise ArgumentError, 'event must be of type SpecHelperEvent' unless event.is_a? WebsocketRails::SpecHelperEvent
8
+ target_class, target_method = WebsocketRails::TargetValidator.validate_target target
9
+
10
+ result = false
11
+ no_of_routes = 0
12
+ event.dispatcher.event_map.routes_for event do |controller_class, method|
13
+ no_of_routes += 1
14
+ controller = controller_class.new
15
+ if controller.class == target_class and method == target_method
16
+ result = true
17
+ end
18
+ end
19
+ result and (non_exclusive or no_of_routes == 1)
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+
27
+ RSpec::Matchers.define :be_routed_to do |target|
28
+
29
+ match do |event|
30
+ WebsocketRails::SpecHelpers.verify_route event, target, true
31
+ end
32
+
33
+ failure_message_for_should do |event|
34
+ "expected event #{event.name} to be routed to target #{target}"
35
+ end
36
+
37
+ failure_message_for_should_not do |event|
38
+ "expected event #{event.name} not to be routed to target #{target}"
39
+ end
40
+
41
+ description do
42
+ "be routed to target #{target}"
43
+ end
44
+
45
+ end
46
+
47
+ RSpec::Matchers.define :be_routed_only_to do |target|
48
+
49
+ match do |event|
50
+ WebsocketRails::SpecHelpers.verify_route event, target, false
51
+ end
52
+
53
+ failure_message_for_should do |event|
54
+ "expected event #{event.name} to be routed only to target #{target}"
55
+ end
56
+
57
+ failure_message_for_should_not do |event|
58
+ "expected event #{event.name} not to be routed only to target #{target}"
59
+ end
60
+
61
+ description do
62
+ "be routed only to target #{target}"
63
+ end
64
+
65
+ end
@@ -0,0 +1,113 @@
1
+ module WebsocketRails
2
+
3
+ module SpecHelpers
4
+
5
+ def self.compare_trigger_data(event, data)
6
+ return true if data.nil?
7
+ return true if data == :any and event.data
8
+ return true if data == :nil and event.data.nil?
9
+ data.eql? event.data
10
+ end
11
+
12
+ def self.expected_data_for_spec_message(data)
13
+ case data
14
+ when nil
15
+ ''
16
+ when :nil
17
+ ' with no data'
18
+ when :any
19
+ ' with some data'
20
+ else
21
+ " with data #{data}"
22
+ end
23
+ end
24
+
25
+ def self.actual_data_for_spec_message(data)
26
+ data ? "with data #{data}": 'with no data'
27
+ end
28
+
29
+ def self.actual_for_spec_message(event, success)
30
+ if event.triggered?
31
+ if success.nil?
32
+ "triggered message #{actual_data_for_spec_message(event.data)}"
33
+ else
34
+ "triggered #{event.success ? 'a success' : 'a failure' } message #{actual_data_for_spec_message(event.data)}"
35
+ end
36
+ else
37
+ 'did not trigger any message'
38
+ end
39
+ end
40
+
41
+ def self.verify_trigger(event, data, success)
42
+ return false unless event.triggered?
43
+ return false unless compare_trigger_data(event, data)
44
+ success.nil? || success == event.success
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+
52
+ RSpec::Matchers.define :trigger_message do |data|
53
+
54
+ match do |event|
55
+ WebsocketRails::SpecHelpers.verify_trigger event, data, nil
56
+ end
57
+
58
+ failure_message_for_should do |event|
59
+ "expected #{event.encoded_name} to trigger message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}, " +
60
+ "instead it #{WebsocketRails::SpecHelpers.actual_for_spec_message event, nil}"
61
+ end
62
+
63
+ failure_message_for_should_not do |event|
64
+ "expected #{event.encoded_name} not to trigger message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
65
+ end
66
+
67
+ description do
68
+ "trigger message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
69
+ end
70
+
71
+ end
72
+
73
+ RSpec::Matchers.define :trigger_success_message do |data|
74
+
75
+ match do |event|
76
+ WebsocketRails::SpecHelpers.verify_trigger event, data, true
77
+ end
78
+
79
+ failure_message_for_should do |event|
80
+ "expected #{event.encoded_name} to trigger success message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}, "+
81
+ "instead it #{WebsocketRails::SpecHelpers.actual_for_spec_message event, true}"
82
+ end
83
+
84
+ failure_message_for_should_not do |event|
85
+ "expected #{event.encoded_name} not to trigger success message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
86
+ end
87
+
88
+ description do
89
+ "trigger success message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
90
+ end
91
+
92
+ end
93
+
94
+ RSpec::Matchers.define :trigger_failure_message do |data|
95
+
96
+ match do |event|
97
+ WebsocketRails::SpecHelpers.verify_trigger event, data, false
98
+ end
99
+
100
+ failure_message_for_should do |event|
101
+ "expected #{event.encoded_name} to trigger failure message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}, " +
102
+ "instead it #{WebsocketRails::SpecHelpers.actual_for_spec_message event, true}"
103
+ end
104
+
105
+ failure_message_for_should_not do |event|
106
+ "expected #{event.encoded_name} not to trigger failure message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
107
+ end
108
+
109
+ description do
110
+ "trigger failure message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
111
+ end
112
+
113
+ end
@@ -0,0 +1,34 @@
1
+ module WebsocketRails
2
+
3
+ class SpecHelperEvent < Event
4
+
5
+ attr_reader :dispatcher, :triggered
6
+
7
+ alias :triggered? :triggered
8
+
9
+ def initialize(event_name,options={})
10
+ super(event_name, options)
11
+ @triggered = false
12
+ @dispatcher = Dispatcher.new(nil)
13
+ end
14
+
15
+ def trigger
16
+ @triggered = true
17
+ end
18
+
19
+ def dispatch
20
+ @dispatcher.dispatch(self)
21
+ self
22
+ end
23
+
24
+ def connection
25
+ OpenStruct.new(:id => 1)
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ def create_event(name, data)
33
+ WebsocketRails::SpecHelperEvent.new(name, {data: data})
34
+ end
@@ -0,0 +1,108 @@
1
+ require "active_support/dependencies"
2
+ require "logger"
3
+ require "thin"
4
+
5
+ module WebsocketRails
6
+
7
+ class << self
8
+ def setup
9
+ yield config
10
+ end
11
+
12
+ def config
13
+ @config ||= Configuration.new
14
+ end
15
+
16
+ def synchronize?
17
+ config.synchronize == true || config.standalone == true
18
+ end
19
+
20
+ def standalone?
21
+ config.standalone == true
22
+ end
23
+
24
+ def logger
25
+ config.logger
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ require 'websocket_rails/engine'
32
+
33
+ require 'websocket_rails/configuration'
34
+ require 'websocket_rails/logging'
35
+ require 'websocket_rails/synchronization'
36
+ require 'websocket_rails/connection_manager'
37
+ require 'websocket_rails/dispatcher'
38
+ require 'websocket_rails/controller_factory'
39
+ require 'websocket_rails/event'
40
+ require 'websocket_rails/event_map'
41
+ require 'websocket_rails/event_queue'
42
+ require 'websocket_rails/channel'
43
+ require 'websocket_rails/channel_manager'
44
+ require 'websocket_rails/user_manager'
45
+ require 'websocket_rails/base_controller'
46
+ require 'websocket_rails/internal_events'
47
+
48
+ require 'websocket_rails/connection_adapters'
49
+ require 'websocket_rails/connection_adapters/http'
50
+ require 'websocket_rails/connection_adapters/web_socket'
51
+
52
+ # Exceptions
53
+ class WebsocketRails::InvalidConnectionError < StandardError
54
+ def rack_response
55
+ [400,{'Content-Type' => 'text/plain'},['invalid connection']]
56
+ end
57
+ end
58
+
59
+ class WebsocketRails::EventRoutingError < StandardError
60
+
61
+ attr_reader :event, :controller, :method
62
+
63
+ def initialize(event, controller, method)
64
+ @event = event
65
+ @controller = controller
66
+ end
67
+
68
+ def to_s
69
+ out = "Routing Error:\n"
70
+ out << "Event: #{event.name}\n"
71
+ out << "Controller #{controller.class} does not respond to #{method}"
72
+ out
73
+ end
74
+
75
+ def to_json
76
+ super({
77
+ :error => "EventRoutingError",
78
+ :event => event.name,
79
+ :method => method,
80
+ :reason => "Controller #{controller.class} does not respond to #{method}"
81
+ })
82
+ end
83
+
84
+ end
85
+
86
+ class WebsocketRails::ConfigDeprecationError < StandardError
87
+ def to_s
88
+ out = "Deprecation Error:\n\n\t"
89
+ out << "config/initializers/events.rb has been moved to config/events.rb\n\t"
90
+ out << "Make sure events.rb is in the proper location and the old one has been removed.\n\t"
91
+ out << "More information can be found in the wiki.\n\n"
92
+ end
93
+ end
94
+
95
+ raise WebsocketRails::ConfigDeprecationError if File.exists?("config/initializers/events.rb")
96
+
97
+
98
+ # Deprecation Notices
99
+ class WebsocketRails::Dispatcher
100
+ def self.describe_events(&block)
101
+ raise "This method has been deprecated. Please use WebsocketRails::EventMap.describe instead."
102
+ end
103
+ end
104
+ class WebsocketRails::Events
105
+ def self.describe_events(&block)
106
+ raise "This method has been deprecated. Please use WebsocketRails::EventMap.describe instead."
107
+ end
108
+ end