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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -3
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +60 -44
  5. data/lib/action_cable.rb +2 -1
  6. data/lib/action_cable/channel/base.rb +2 -2
  7. data/lib/action_cable/channel/periodic_timers.rb +3 -3
  8. data/lib/action_cable/channel/streams.rb +4 -4
  9. data/lib/action_cable/connection.rb +4 -1
  10. data/lib/action_cable/connection/base.rb +22 -21
  11. data/lib/action_cable/connection/client_socket.rb +150 -0
  12. data/lib/action_cable/connection/identification.rb +1 -1
  13. data/lib/action_cable/connection/internal_channel.rb +6 -6
  14. data/lib/action_cable/connection/stream.rb +59 -0
  15. data/lib/action_cable/connection/stream_event_loop.rb +94 -0
  16. data/lib/action_cable/connection/subscriptions.rb +0 -1
  17. data/lib/action_cable/connection/web_socket.rb +14 -8
  18. data/lib/action_cable/engine.rb +3 -3
  19. data/lib/action_cable/gem_version.rb +1 -1
  20. data/lib/action_cable/remote_connections.rb +1 -1
  21. data/lib/action_cable/server.rb +0 -4
  22. data/lib/action_cable/server/base.rb +19 -22
  23. data/lib/action_cable/server/broadcasting.rb +1 -8
  24. data/lib/action_cable/server/configuration.rb +25 -5
  25. data/lib/action_cable/server/connections.rb +3 -5
  26. data/lib/action_cable/server/worker.rb +42 -13
  27. data/lib/action_cable/subscription_adapter.rb +8 -0
  28. data/lib/action_cable/subscription_adapter/async.rb +22 -0
  29. data/lib/action_cable/subscription_adapter/base.rb +28 -0
  30. data/lib/action_cable/subscription_adapter/evented_redis.rb +67 -0
  31. data/lib/action_cable/subscription_adapter/inline.rb +35 -0
  32. data/lib/action_cable/subscription_adapter/postgresql.rb +106 -0
  33. data/lib/action_cable/subscription_adapter/redis.rb +163 -0
  34. data/lib/action_cable/subscription_adapter/subscriber_map.rb +53 -0
  35. data/lib/assets/compiled/action_cable.js +473 -0
  36. data/lib/rails/generators/channel/channel_generator.rb +6 -1
  37. metadata +21 -99
  38. data/lib/action_cable/process/logging.rb +0 -10
  39. data/lib/assets/javascripts/action_cable.coffee.erb +0 -23
  40. data/lib/assets/javascripts/action_cable/connection.coffee +0 -84
  41. data/lib/assets/javascripts/action_cable/connection_monitor.coffee +0 -84
  42. data/lib/assets/javascripts/action_cable/consumer.coffee +0 -31
  43. data/lib/assets/javascripts/action_cable/subscription.coffee +0 -68
  44. data/lib/assets/javascripts/action_cable/subscriptions.coffee +0 -78
@@ -1,68 +0,0 @@
1
- # A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.
2
- # It provides a number of callbacks and a method for calling remote procedure calls on the corresponding
3
- # Channel instance on the server side.
4
- #
5
- # An example demonstrates the basic functionality:
6
- #
7
- # App.appearance = App.cable.subscriptions.create "AppearanceChannel",
8
- # connected: ->
9
- # # Called once the subscription has been successfully completed
10
- #
11
- # appear: ->
12
- # @perform 'appear', appearing_on: @appearingOn()
13
- #
14
- # away: ->
15
- # @perform 'away'
16
- #
17
- # appearingOn: ->
18
- # $('main').data 'appearing-on'
19
- #
20
- # The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server
21
- # by calling the `@perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).
22
- # The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.
23
- #
24
- # This is how the server component would look:
25
- #
26
- # class AppearanceChannel < ApplicationActionCable::Channel
27
- # def subscribed
28
- # current_user.appear
29
- # end
30
- #
31
- # def unsubscribed
32
- # current_user.disappear
33
- # end
34
- #
35
- # def appear(data)
36
- # current_user.appear on: data['appearing_on']
37
- # end
38
- #
39
- # def away
40
- # current_user.away
41
- # end
42
- # end
43
- #
44
- # The "AppearanceChannel" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.
45
- # The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the @perform method.
46
- class ActionCable.Subscription
47
- constructor: (@subscriptions, params = {}, mixin) ->
48
- @identifier = JSON.stringify(params)
49
- extend(this, mixin)
50
- @subscriptions.add(this)
51
- @consumer = @subscriptions.consumer
52
-
53
- # Perform a channel action with the optional data passed as an attribute
54
- perform: (action, data = {}) ->
55
- data.action = action
56
- @send(data)
57
-
58
- send: (data) ->
59
- @consumer.send(command: "message", identifier: @identifier, data: JSON.stringify(data))
60
-
61
- unsubscribe: ->
62
- @subscriptions.remove(this)
63
-
64
- extend = (object, properties) ->
65
- if properties?
66
- for key, value of properties
67
- object[key] = value
68
- object
@@ -1,78 +0,0 @@
1
- # Collection class for creating (and internally managing) channel subscriptions. The only method intended to be triggered by the user
2
- # us ActionCable.Subscriptions#create, and it should be called through the consumer like so:
3
- #
4
- # @App = {}
5
- # App.cable = ActionCable.createConsumer "ws://example.com/accounts/1"
6
- # App.appearance = App.cable.subscriptions.create "AppearanceChannel"
7
- #
8
- # For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.
9
- class ActionCable.Subscriptions
10
- constructor: (@consumer) ->
11
- @subscriptions = []
12
- @history = []
13
-
14
- create: (channelName, mixin) ->
15
- channel = channelName
16
- params = if typeof channel is "object" then channel else {channel}
17
- new ActionCable.Subscription this, params, mixin
18
-
19
- # Private
20
-
21
- add: (subscription) ->
22
- @subscriptions.push(subscription)
23
- @notify(subscription, "initialized")
24
- @sendCommand(subscription, "subscribe")
25
-
26
- remove: (subscription) ->
27
- @forget(subscription)
28
-
29
- unless @findAll(subscription.identifier).length
30
- @sendCommand(subscription, "unsubscribe")
31
-
32
- reject: (identifier) ->
33
- for subscription in @findAll(identifier)
34
- @forget(subscription)
35
- @notify(subscription, "rejected")
36
-
37
- forget: (subscription) ->
38
- @subscriptions = (s for s in @subscriptions when s isnt subscription)
39
-
40
- findAll: (identifier) ->
41
- s for s in @subscriptions when s.identifier is identifier
42
-
43
- reload: ->
44
- for subscription in @subscriptions
45
- @sendCommand(subscription, "subscribe")
46
-
47
- notifyAll: (callbackName, args...) ->
48
- for subscription in @subscriptions
49
- @notify(subscription, callbackName, args...)
50
-
51
- notify: (subscription, callbackName, args...) ->
52
- if typeof subscription is "string"
53
- subscriptions = @findAll(subscription)
54
- else
55
- subscriptions = [subscription]
56
-
57
- for subscription in subscriptions
58
- subscription[callbackName]?(args...)
59
-
60
- if callbackName in ["initialized", "connected", "disconnected", "rejected"]
61
- {identifier} = subscription
62
- @record(notification: {identifier, callbackName, args})
63
-
64
- sendCommand: (subscription, command) ->
65
- {identifier} = subscription
66
- if identifier is ActionCable.INTERNAL.identifiers.ping
67
- @consumer.connection.isOpen()
68
- else
69
- @consumer.send({command, identifier})
70
-
71
- record: (data) ->
72
- data.time = new Date()
73
- @history = @history.slice(-19)
74
- @history.push(data)
75
-
76
- toJSON: ->
77
- history: @history
78
- identifiers: (subscription.identifier for subscription in @subscriptions)