actioncable 5.0.0.beta1.1 → 5.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -3
- data/MIT-LICENSE +1 -1
- data/README.md +60 -44
- data/lib/action_cable.rb +2 -1
- data/lib/action_cable/channel/base.rb +2 -2
- data/lib/action_cable/channel/periodic_timers.rb +3 -3
- data/lib/action_cable/channel/streams.rb +4 -4
- data/lib/action_cable/connection.rb +4 -1
- data/lib/action_cable/connection/base.rb +22 -21
- data/lib/action_cable/connection/client_socket.rb +150 -0
- data/lib/action_cable/connection/identification.rb +1 -1
- data/lib/action_cable/connection/internal_channel.rb +6 -6
- data/lib/action_cable/connection/stream.rb +59 -0
- data/lib/action_cable/connection/stream_event_loop.rb +94 -0
- data/lib/action_cable/connection/subscriptions.rb +0 -1
- data/lib/action_cable/connection/web_socket.rb +14 -8
- data/lib/action_cable/engine.rb +3 -3
- data/lib/action_cable/gem_version.rb +1 -1
- data/lib/action_cable/remote_connections.rb +1 -1
- data/lib/action_cable/server.rb +0 -4
- data/lib/action_cable/server/base.rb +19 -22
- data/lib/action_cable/server/broadcasting.rb +1 -8
- data/lib/action_cable/server/configuration.rb +25 -5
- data/lib/action_cable/server/connections.rb +3 -5
- data/lib/action_cable/server/worker.rb +42 -13
- data/lib/action_cable/subscription_adapter.rb +8 -0
- data/lib/action_cable/subscription_adapter/async.rb +22 -0
- data/lib/action_cable/subscription_adapter/base.rb +28 -0
- data/lib/action_cable/subscription_adapter/evented_redis.rb +67 -0
- data/lib/action_cable/subscription_adapter/inline.rb +35 -0
- data/lib/action_cable/subscription_adapter/postgresql.rb +106 -0
- data/lib/action_cable/subscription_adapter/redis.rb +163 -0
- data/lib/action_cable/subscription_adapter/subscriber_map.rb +53 -0
- data/lib/assets/compiled/action_cable.js +473 -0
- data/lib/rails/generators/channel/channel_generator.rb +6 -1
- metadata +21 -99
- data/lib/action_cable/process/logging.rb +0 -10
- data/lib/assets/javascripts/action_cable.coffee.erb +0 -23
- data/lib/assets/javascripts/action_cable/connection.coffee +0 -84
- data/lib/assets/javascripts/action_cable/connection_monitor.coffee +0 -84
- data/lib/assets/javascripts/action_cable/consumer.coffee +0 -31
- data/lib/assets/javascripts/action_cable/subscription.coffee +0 -68
- data/lib/assets/javascripts/action_cable/subscriptions.coffee +0 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 666a8feb5df8f5f6a523f81a826c1a2fbd23a1c3
|
4
|
+
data.tar.gz: 85b3d45b716f55eed7b2b8aad82e69dd7f00c1e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be0531d119c3792067b0cc54609830700ea1eacb28dd6199775e13b3914a83a90cdbc6e44d10d434a14dabc159e7dc2d7df0b984e3a3e748b4e8ec42ea554def
|
7
|
+
data.tar.gz: 75e01690a3a351949df277f14492b79f050518a9c8f5e5a72a68df0f83595df635b9bfedea7f53e9882e0d0bac302fed69c5f79ce535ae765d22da607dc65fce
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,28 @@
|
|
1
|
-
## Rails 5.0.0.
|
1
|
+
## Rails 5.0.0.beta2 (February 01, 2016) ##
|
2
|
+
|
3
|
+
* Support PostgreSQL pubsub adapter.
|
4
|
+
|
5
|
+
*Jon Moss*
|
6
|
+
|
7
|
+
* Remove EventMachine dependency.
|
8
|
+
|
9
|
+
*Matthew Draper*
|
2
10
|
|
3
|
-
*
|
11
|
+
* Remove Celluloid dependency.
|
4
12
|
|
13
|
+
*Mike Perham*
|
14
|
+
|
15
|
+
* Create notion of an `ActionCable::SubscriptionAdapter`.
|
16
|
+
Separate out Redis functionality into
|
17
|
+
`ActionCable::SubscriptionAdapter::Redis`, and add a
|
18
|
+
PostgreSQL adapter as well. Configuration file for
|
19
|
+
ActionCable was changed from`config/redis/cable.yml` to
|
20
|
+
`config/cable.yml`.
|
21
|
+
|
22
|
+
*Jon Moss*
|
23
|
+
|
24
|
+
## Rails 5.0.0.beta1 (December 18, 2015) ##
|
5
25
|
|
6
26
|
* Added to Rails!
|
7
27
|
|
8
|
-
*DHH*
|
28
|
+
*DHH*
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Action Cable
|
1
|
+
# Action Cable – Integrated WebSockets for Rails
|
2
2
|
|
3
3
|
Action Cable seamlessly integrates WebSockets with the rest of your Rails application.
|
4
4
|
It allows for real-time features to be written in Ruby in the same style
|
@@ -16,7 +16,7 @@ WebSockets open to your application if they use multiple browser tabs or devices
|
|
16
16
|
The client of a WebSocket connection is called the consumer.
|
17
17
|
|
18
18
|
Each consumer can in turn subscribe to multiple cable channels. Each channel encapsulates
|
19
|
-
a logical unit of work, similar to what a controller does in a regular MVC setup. For example,
|
19
|
+
a logical unit of work, similar to what a controller does in a regular MVC setup. For example,
|
20
20
|
you could have a `ChatChannel` and a `AppearancesChannel`, and a consumer could be subscribed to either
|
21
21
|
or to both of these channels. At the very least, a consumer should be subscribed to one channel.
|
22
22
|
|
@@ -66,6 +66,13 @@ end
|
|
66
66
|
Here `identified_by` is a connection identifier that can be used to find the specific connection again or later.
|
67
67
|
Note that anything marked as an identifier will automatically create a delegate by the same name on any channel instances created off the connection.
|
68
68
|
|
69
|
+
This relies on the fact that you will already have handled authentication of the user, and
|
70
|
+
that a successful authentication sets a signed cookie with the `user_id`. This cookie is then
|
71
|
+
automatically sent to the connection instance when a new connection is attempted, and you
|
72
|
+
use that to set the `current_user`. By identifying the connection by this same current_user,
|
73
|
+
you're also ensuring that you can later retrieve all open connections by a given user (and
|
74
|
+
potentially disconnect them all if the user is deleted or deauthorized).
|
75
|
+
|
69
76
|
Then you should define your `ApplicationCable::Channel` class in Ruby. This is the place where you put
|
70
77
|
shared logic between your channels.
|
71
78
|
|
@@ -77,13 +84,6 @@ module ApplicationCable
|
|
77
84
|
end
|
78
85
|
```
|
79
86
|
|
80
|
-
This relies on the fact that you will already have handled authentication of the user, and
|
81
|
-
that a successful authentication sets a signed cookie with the `user_id`. This cookie is then
|
82
|
-
automatically sent to the connection instance when a new connection is attempted, and you
|
83
|
-
use that to set the `current_user`. By identifying the connection by this same current_user,
|
84
|
-
you're also ensuring that you can later retrieve all open connections by a given user (and
|
85
|
-
potentially disconnect them all if the user is deleted or deauthorized).
|
86
|
-
|
87
87
|
The client-side needs to setup a consumer instance of this connection. That's done like so:
|
88
88
|
|
89
89
|
```coffeescript
|
@@ -91,7 +91,7 @@ The client-side needs to setup a consumer instance of this connection. That's do
|
|
91
91
|
#= require action_cable
|
92
92
|
|
93
93
|
@App = {}
|
94
|
-
App.cable =
|
94
|
+
App.cable = ActionCable.createConsumer("ws://cable.example.com")
|
95
95
|
```
|
96
96
|
|
97
97
|
The ws://cable.example.com address must point to your set of Action Cable servers, and it
|
@@ -298,11 +298,12 @@ See the [rails/actioncable-examples](http://github.com/rails/actioncable-example
|
|
298
298
|
|
299
299
|
## Configuration
|
300
300
|
|
301
|
-
Action Cable has
|
301
|
+
Action Cable has three required configurations: the Redis connection, allowed request origins, and the cable server url (which can optionally be set on the client side).
|
302
302
|
|
303
303
|
### Redis
|
304
304
|
|
305
|
-
By default, `ActionCable::Server::Base` will look for a configuration file in `Rails.root.join('config/
|
305
|
+
By default, `ActionCable::Server::Base` will look for a configuration file in `Rails.root.join('config/cable.yml')`.
|
306
|
+
This file must specify a Redis url for each Rails environment. It may use the following format:
|
306
307
|
|
307
308
|
```yaml
|
308
309
|
production: &production
|
@@ -312,11 +313,10 @@ development: &development
|
|
312
313
|
test: *development
|
313
314
|
```
|
314
315
|
|
315
|
-
|
316
|
-
a Rails initializer with something like:
|
316
|
+
You can also change the location of the Redis config file in a Rails initializer with something like:
|
317
317
|
|
318
318
|
```ruby
|
319
|
-
Rails.application.paths.add "config/
|
319
|
+
Rails.application.paths.add "config/cable", with: "somewhere/else/cable.yml"
|
320
320
|
```
|
321
321
|
|
322
322
|
### Allowed Request Origins
|
@@ -327,29 +327,31 @@ Action Cable will only accept requests from specified origins, which are passed
|
|
327
327
|
ActionCable.server.config.allowed_request_origins = ['http://rubyonrails.com', /http:\/\/ruby.*/]
|
328
328
|
```
|
329
329
|
|
330
|
+
When running in the development environment, this defaults to "http://localhost:3000".
|
331
|
+
|
330
332
|
To disable and allow requests from any origin:
|
331
333
|
|
332
334
|
```ruby
|
333
335
|
ActionCable.server.config.disable_request_forgery_protection = true
|
334
336
|
```
|
335
337
|
|
336
|
-
|
338
|
+
### Consumer Configuration
|
337
339
|
|
338
|
-
|
340
|
+
Once you have decided how to run your cable server (see below), you must provide the server url (or path) to your client-side setup.
|
341
|
+
There are two ways you can do this.
|
339
342
|
|
340
|
-
The
|
343
|
+
The first is to simply pass it in when creating your consumer. For a standalone server,
|
344
|
+
this would be something like: `App.cable = ActionCable.createConsumer("ws://example.com:28080")`, and for an in-app server,
|
345
|
+
something like: `App.cable = ActionCable.createConsumer("/cable")`.
|
341
346
|
|
342
|
-
|
343
|
-
|
344
|
-
-> request { request.env['bc.account_id'] || "no-account" },
|
345
|
-
:action_cable,
|
346
|
-
-> request { request.uuid }
|
347
|
-
]
|
348
|
-
```
|
347
|
+
The second option is to pass the server url through the `action_cable_meta_tag` in your layout.
|
348
|
+
This uses a url or path typically set via `config.action_cable.url` in the environment configuration files, or defaults to "/cable".
|
349
349
|
|
350
|
-
|
350
|
+
This method is especially useful if your websocket url might change between environments. If you host your production server via https, you will need to use the wss scheme
|
351
351
|
for your ActionCable server, but development might remain http and use the ws scheme. You might use localhost in development and your
|
352
|
-
domain in production.
|
352
|
+
domain in production.
|
353
|
+
|
354
|
+
In any case, to vary the websocket url between environments, add the following configuration to each environment:
|
353
355
|
|
354
356
|
```ruby
|
355
357
|
config.action_cable.url = "ws://example.com:28080"
|
@@ -364,7 +366,19 @@ Then add the following line to your layout before your JavaScript tag:
|
|
364
366
|
And finally, create your consumer like so:
|
365
367
|
|
366
368
|
```coffeescript
|
367
|
-
App.cable =
|
369
|
+
App.cable = ActionCable.createConsumer()
|
370
|
+
```
|
371
|
+
|
372
|
+
### Other Configurations
|
373
|
+
|
374
|
+
The other common option to configure is the log tags applied to the per-connection logger. Here's close to what we're using in Basecamp:
|
375
|
+
|
376
|
+
```ruby
|
377
|
+
ActionCable.server.config.log_tags = [
|
378
|
+
-> request { request.env['bc.account_id'] || "no-account" },
|
379
|
+
:action_cable,
|
380
|
+
-> request { request.uuid }
|
381
|
+
]
|
368
382
|
```
|
369
383
|
|
370
384
|
For a full list of all configuration options, see the `ActionCable::Server::Configuration` class.
|
@@ -383,8 +397,6 @@ application. The recommended basic setup is as follows:
|
|
383
397
|
require ::File.expand_path('../../config/environment', __FILE__)
|
384
398
|
Rails.application.eager_load!
|
385
399
|
|
386
|
-
require 'action_cable/process/logging'
|
387
|
-
|
388
400
|
run ActionCable.server
|
389
401
|
```
|
390
402
|
|
@@ -394,22 +406,19 @@ Then you start the server using a binstub in bin/cable ala:
|
|
394
406
|
bundle exec puma -p 28080 cable/config.ru
|
395
407
|
```
|
396
408
|
|
397
|
-
The above will start a cable server on port 28080.
|
398
|
-
`App.cable = Cable.createConsumer("ws://basecamp.dev:28080")`.
|
409
|
+
The above will start a cable server on port 28080.
|
399
410
|
|
400
411
|
### In app
|
401
412
|
|
402
|
-
If you are using a threaded server like Puma or Thin, the current implementation of ActionCable can run side-along with your Rails application. For example, to listen for WebSocket requests on `/
|
413
|
+
If you are using a threaded server like Puma or Thin, the current implementation of ActionCable can run side-along with your Rails application. For example, to listen for WebSocket requests on `/cable`, mount the server at that path:
|
403
414
|
|
404
415
|
```ruby
|
405
416
|
# config/routes.rb
|
406
417
|
Example::Application.routes.draw do
|
407
|
-
|
418
|
+
mount ActionCable.server => '/cable'
|
408
419
|
end
|
409
420
|
```
|
410
421
|
|
411
|
-
You can use `App.cable = Cable.createConsumer("/websocket")` to connect to the cable server.
|
412
|
-
|
413
422
|
For every instance of your server you create and for every worker your server spawns, you will also have a new instance of ActionCable, but the use of Redis keeps messages synced across connections.
|
414
423
|
|
415
424
|
### Notes
|
@@ -427,16 +436,15 @@ messages back and forth over the WebSocket cable connection. This dependency may
|
|
427
436
|
be alleviated in the future, but for the moment that's what it is. So be sure to have
|
428
437
|
Redis installed and running.
|
429
438
|
|
430
|
-
The Ruby side of things is built on top of [faye-websocket](https://github.com/faye/faye-websocket-ruby) and [
|
439
|
+
The Ruby side of things is built on top of [faye-websocket](https://github.com/faye/faye-websocket-ruby) and [concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby).
|
431
440
|
|
432
441
|
|
433
442
|
## Deployment
|
434
443
|
|
435
|
-
Action Cable is powered by a combination of
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
with no problem, as long as you haven't committed any thread-safety sins.
|
444
|
+
Action Cable is powered by a combination of websockets and threads. All of the
|
445
|
+
connection management is handled internally by utilizing Ruby’s native thread
|
446
|
+
support, which means you can use all your regular Rails models with no problems
|
447
|
+
as long as you haven’t committed any thread-safety sins.
|
440
448
|
|
441
449
|
But this also means that Action Cable needs to run in its own server process.
|
442
450
|
So you'll have one set of server processes for your normal web work, and another
|
@@ -452,6 +460,14 @@ Action Cable is released under the MIT license:
|
|
452
460
|
|
453
461
|
## Support
|
454
462
|
|
455
|
-
|
463
|
+
API documentation is at:
|
464
|
+
|
465
|
+
* http://api.rubyonrails.org
|
466
|
+
|
467
|
+
Bug reports can be filed for the Ruby on Rails project here:
|
468
|
+
|
469
|
+
* https://github.com/rails/rails/issues
|
470
|
+
|
471
|
+
Feature requests should be discussed on the rails-core mailing list here:
|
456
472
|
|
457
|
-
* https://
|
473
|
+
* https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
|
data/lib/action_cable.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2015 Basecamp, LLC
|
2
|
+
# Copyright (c) 2015-2016 Basecamp, LLC
|
3
3
|
#
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
# a copy of this software and associated documentation files (the
|
@@ -47,4 +47,5 @@ module ActionCable
|
|
47
47
|
autoload :Connection
|
48
48
|
autoload :Channel
|
49
49
|
autoload :RemoteConnections
|
50
|
+
autoload :SubscriptionAdapter
|
50
51
|
end
|
@@ -133,8 +133,8 @@ module ActionCable
|
|
133
133
|
@identifier = identifier
|
134
134
|
@params = params
|
135
135
|
|
136
|
-
# When a channel is streaming via
|
137
|
-
# transmission until
|
136
|
+
# When a channel is streaming via pubsub, we want to delay the confirmation
|
137
|
+
# transmission until pubsub subscription is confirmed.
|
138
138
|
@defer_subscription_confirmation = false
|
139
139
|
|
140
140
|
@reject_subscription = nil
|
@@ -27,14 +27,14 @@ module ActionCable
|
|
27
27
|
|
28
28
|
def start_periodic_timers
|
29
29
|
self.class.periodic_timers.each do |callback, options|
|
30
|
-
active_periodic_timers <<
|
31
|
-
connection.worker_pool.
|
30
|
+
active_periodic_timers << Concurrent::TimerTask.new(execution_interval: options[:every]) do
|
31
|
+
connection.worker_pool.async_run_periodic_timer(self, callback)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
def stop_periodic_timers
|
37
|
-
active_periodic_timers.each { |timer| timer.
|
37
|
+
active_periodic_timers.each { |timer| timer.shutdown }
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -75,11 +75,11 @@ module ActionCable
|
|
75
75
|
callback ||= default_stream_callback(broadcasting)
|
76
76
|
streams << [ broadcasting, callback ]
|
77
77
|
|
78
|
-
|
79
|
-
pubsub.subscribe(broadcasting,
|
78
|
+
Concurrent.global_io_executor.post do
|
79
|
+
pubsub.subscribe(broadcasting, callback, lambda do
|
80
80
|
transmit_subscription_confirmation
|
81
81
|
logger.info "#{self.class.name} is streaming from #{broadcasting}"
|
82
|
-
end
|
82
|
+
end)
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
@@ -92,7 +92,7 @@ module ActionCable
|
|
92
92
|
|
93
93
|
def stop_all_streams
|
94
94
|
streams.each do |broadcasting, callback|
|
95
|
-
pubsub.
|
95
|
+
pubsub.unsubscribe broadcasting, callback
|
96
96
|
logger.info "#{self.class.name} stopped streaming from #{broadcasting}"
|
97
97
|
end.clear
|
98
98
|
end
|
@@ -5,12 +5,15 @@ module ActionCable
|
|
5
5
|
eager_autoload do
|
6
6
|
autoload :Authorization
|
7
7
|
autoload :Base
|
8
|
+
autoload :ClientSocket
|
8
9
|
autoload :Identification
|
9
10
|
autoload :InternalChannel
|
10
11
|
autoload :MessageBuffer
|
11
|
-
autoload :
|
12
|
+
autoload :Stream
|
13
|
+
autoload :StreamEventLoop
|
12
14
|
autoload :Subscriptions
|
13
15
|
autoload :TaggedLoggerProxy
|
16
|
+
autoload :WebSocket
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
@@ -48,21 +48,19 @@ module ActionCable
|
|
48
48
|
include InternalChannel
|
49
49
|
include Authorization
|
50
50
|
|
51
|
-
attr_reader :server, :env, :subscriptions
|
52
|
-
delegate :worker_pool, :pubsub, to: :server
|
53
|
-
|
54
|
-
attr_reader :logger
|
51
|
+
attr_reader :server, :env, :subscriptions, :logger
|
52
|
+
delegate :stream_event_loop, :worker_pool, :pubsub, to: :server
|
55
53
|
|
56
54
|
def initialize(server, env)
|
57
55
|
@server, @env = server, env
|
58
56
|
|
59
57
|
@logger = new_tagged_logger
|
60
58
|
|
61
|
-
@websocket = ActionCable::Connection::WebSocket.new(env)
|
59
|
+
@websocket = ActionCable::Connection::WebSocket.new(env, self, stream_event_loop)
|
62
60
|
@subscriptions = ActionCable::Connection::Subscriptions.new(self)
|
63
61
|
@message_buffer = ActionCable::Connection::MessageBuffer.new(self)
|
64
62
|
|
65
|
-
@
|
63
|
+
@_internal_subscriptions = nil
|
66
64
|
@started_at = Time.now
|
67
65
|
end
|
68
66
|
|
@@ -72,10 +70,6 @@ module ActionCable
|
|
72
70
|
logger.info started_request_message
|
73
71
|
|
74
72
|
if websocket.possible? && allow_request_origin?
|
75
|
-
websocket.on(:open) { |event| send_async :on_open }
|
76
|
-
websocket.on(:message) { |event| on_message event.data }
|
77
|
-
websocket.on(:close) { |event| send_async :on_close }
|
78
|
-
|
79
73
|
respond_to_successful_request
|
80
74
|
else
|
81
75
|
respond_to_invalid_request
|
@@ -105,7 +99,7 @@ module ActionCable
|
|
105
99
|
|
106
100
|
# Invoke a method on the connection asynchronously through the pool of thread workers.
|
107
101
|
def send_async(method, *arguments)
|
108
|
-
worker_pool.
|
102
|
+
worker_pool.async_invoke(self, method, *arguments)
|
109
103
|
end
|
110
104
|
|
111
105
|
# Return a basic hash of statistics for the connection keyed with `identifier`, `started_at`, and `subscriptions`.
|
@@ -123,6 +117,21 @@ module ActionCable
|
|
123
117
|
transmit ActiveSupport::JSON.encode(identifier: ActionCable::INTERNAL[:identifiers][:ping], message: Time.now.to_i)
|
124
118
|
end
|
125
119
|
|
120
|
+
def on_open # :nodoc:
|
121
|
+
send_async :handle_open
|
122
|
+
end
|
123
|
+
|
124
|
+
def on_message(message) # :nodoc:
|
125
|
+
message_buffer.append message
|
126
|
+
end
|
127
|
+
|
128
|
+
def on_error(message) # :nodoc:
|
129
|
+
# ignore
|
130
|
+
end
|
131
|
+
|
132
|
+
def on_close(reason, code) # :nodoc:
|
133
|
+
send_async :handle_close
|
134
|
+
end
|
126
135
|
|
127
136
|
protected
|
128
137
|
# The request that initiated the WebSocket connection is available here. This gives access to the environment, cookies, etc.
|
@@ -138,13 +147,11 @@ module ActionCable
|
|
138
147
|
request.cookie_jar
|
139
148
|
end
|
140
149
|
|
141
|
-
|
142
|
-
protected
|
143
150
|
attr_reader :websocket
|
144
151
|
attr_reader :message_buffer
|
145
152
|
|
146
153
|
private
|
147
|
-
def
|
154
|
+
def handle_open
|
148
155
|
connect if respond_to?(:connect)
|
149
156
|
subscribe_to_internal_channel
|
150
157
|
beat
|
@@ -155,11 +162,7 @@ module ActionCable
|
|
155
162
|
respond_to_invalid_request
|
156
163
|
end
|
157
164
|
|
158
|
-
def
|
159
|
-
message_buffer.append message
|
160
|
-
end
|
161
|
-
|
162
|
-
def on_close
|
165
|
+
def handle_close
|
163
166
|
logger.info finished_request_message
|
164
167
|
|
165
168
|
server.remove_connection(self)
|
@@ -170,7 +173,6 @@ module ActionCable
|
|
170
173
|
disconnect if respond_to?(:disconnect)
|
171
174
|
end
|
172
175
|
|
173
|
-
|
174
176
|
def allow_request_origin?
|
175
177
|
return true if server.config.disable_request_forgery_protection
|
176
178
|
|
@@ -193,7 +195,6 @@ module ActionCable
|
|
193
195
|
[ 404, { 'Content-Type' => 'text/plain' }, [ 'Page not found' ] ]
|
194
196
|
end
|
195
197
|
|
196
|
-
|
197
198
|
# Tags are declared in the server but computed in the connection. This allows us per-connection tailored tags.
|
198
199
|
def new_tagged_logger
|
199
200
|
TaggedLoggerProxy.new server.logger,
|