action_cable_notifications 0.1.10 → 0.1.14

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 93a9012143b6b7d56623ffc5fa9f1af2b7d6e903
4
- data.tar.gz: 33e6cc435a5e149a7899a83c97aced3c3815d841
3
+ metadata.gz: 6f1c452c20e07a93aa050d60b61d6a5c2fdba4a1
4
+ data.tar.gz: da28fc564086ef82612b56f209bd365df1d80127
5
5
  SHA512:
6
- metadata.gz: 90f782dc30ebf6f14d961e020e1965b713305eba0b6ab7775441bc180afb6ad3b857ad84f629b190a9a41078f9df6b11ead947c867cbad79b15380286255bae9
7
- data.tar.gz: c6f608b919a1ac36263908afbf0132dbb7044c3f214b706600c625c5ffefc5be1182eb6afd49256d1da7404ef9c317f4778feb02f591f873b5f0fc188d5c5c79
6
+ metadata.gz: a769b28967a738637247207f4113cbebe510a2526a44099daed32be698e2207ce93b7b566b46f9344dab5092a62207bbb4f17f54246b9dc7e01b416388489cff
7
+ data.tar.gz: 50f9b8030b96f4aeaf82a7a5f8b030c627c577525128e9b8e6697425b883adab7585591c3879cce64a5498a2d99bbf1c14483f6254274a69fa604159922be118
@@ -11,4 +11,4 @@
11
11
  // about supported directives.
12
12
  //
13
13
  //= require lodash
14
- //= require_tree .
14
+ //= require ./cable_notifications
@@ -0,0 +1,13 @@
1
+ #= export CableNotifications
2
+ #= require_self
3
+ #= require './store'
4
+ #= require './collection'
5
+
6
+ @CableNotifications =
7
+ stores: []
8
+
9
+ # Register a new store
10
+ registerStore: (store, callbacks) ->
11
+ new_store = new CableNotifications.Store(store, callbacks)
12
+ @stores.push new_store
13
+ new_store
@@ -0,0 +1,40 @@
1
+ class CableNotifications.Collection
2
+ constructor: (@store, @name) ->
3
+ @data = []
4
+ @channelInfo = null
5
+
6
+ # Private methods
7
+ #######################################
8
+
9
+ find: (selector={}) ->
10
+ _.find(@data, selector)
11
+
12
+ findIndex: (selector={}) ->
13
+ _.findIndex(@data, selector)
14
+
15
+ insert: (record) ->
16
+ @data.push (record)
17
+
18
+ remove: (selector={}) ->
19
+ index = @findIndex(selector)
20
+ if index < 0
21
+ console.warn("Couldn't find a matching record: #{selector}")
22
+ else
23
+ record = @data.splice(index, 1)
24
+
25
+ update: (selector={}, fields, options) ->
26
+ record = @find(selector)
27
+ if !record
28
+ if options.upsert
29
+ @insert(fields)
30
+ else
31
+ console.warn("Couldn't find a matching record: #{selector}")
32
+ else
33
+ _.extend(record, fields)
34
+
35
+ # http://docs.meteor.com/#/full/upsert
36
+ upsert: (selector={}, fields) ->
37
+ @update(selector, fields, {upsert: true})
38
+
39
+ filter: (selector={}) ->
40
+ _.filter(@data, selector)
@@ -0,0 +1,62 @@
1
+ # Default callbacks for internal storage of received packets
2
+ class CableNotifications.Store.DefaultCallbacks
3
+ constructor: (@collections) ->
4
+
5
+ # Helper function
6
+ processPacketHelper = (packet, collection) ->
7
+ index = -1
8
+ record = null
9
+
10
+ local_collection = @collections[collection || packet.collection].data
11
+ if !local_collection
12
+ console.warn("[update_many]: Collection #{collection_name} doesn't exist")
13
+ else
14
+ index = _.find(local_collection, (record) -> record.id == packet.id)
15
+ if (index >= 0)
16
+ record = local_collection[index]
17
+
18
+ return {
19
+ collection: local_collection
20
+ index: index
21
+ record: record
22
+ }
23
+
24
+ # Callbacks
25
+ ##################################################
26
+
27
+ collection_remove: (packet, collection) ->
28
+ console.warn 'Method not implemented: collection_remove '
29
+
30
+ create: (packet, collection) ->
31
+ data = processPacketHelper(packet, collection)
32
+ if data.record
33
+ console.warn 'Expected not to find a document already present for an add: ' + data.record
34
+ else
35
+ data.collection.push(packet.data)
36
+
37
+ update: (packet, collection) ->
38
+ data = processPacketHelper(packet, collection)
39
+ if !data.record
40
+ console.warn 'Expected to find a document to change'
41
+ else if !_.isEmpty(packet.data)
42
+ _.extend(data.record, packet.data)
43
+
44
+ update_many: (packet, collection) ->
45
+ collection_name = collection || packet.collection
46
+ local_collection = @collections[collection_name].data
47
+ if !local_collection
48
+ console.warn("[update_many]: Collection #{collection_name} doesn't exist")
49
+ else
50
+ _.each packet.data, (fields) ->
51
+ record = _.findIndex(local_collection, (r) -> r.id == fields.id)
52
+ if record>=0
53
+ _.extend(local_collection[record], fields)
54
+ else
55
+ local_collection.push(fields)
56
+
57
+ destroy: (packet, collection) ->
58
+ data = processPacketHelper(packet, collection)
59
+ if !data.record
60
+ console.warn 'Expected to find a document to remove'
61
+ else
62
+ data.collection.splice(data.index, 1)
@@ -0,0 +1,54 @@
1
+ #= require_self
2
+ #= require './default_callbacks'
3
+
4
+ class CableNotifications.Store
5
+ constructor: (@name, @callbacks) ->
6
+ @collections = {}
7
+ @channels = {}
8
+
9
+ if !@callbacks
10
+ @callbacks = new CableNotifications.Store.DefaultCallbacks(@collections)
11
+
12
+ this
13
+
14
+ # Private methods
15
+ #######################################
16
+
17
+ packetReceived = (channelInfo, collection) ->
18
+ (packet) ->
19
+ @storePacket(packet, collection)
20
+ channelInfo.callbacks.received?.apply channelInfo.channel, arguments
21
+
22
+ # Public methods
23
+ #######################################
24
+
25
+ # Register a new collection
26
+ registerCollection: (collection) ->
27
+ if @collections[collection]
28
+ console.warn '[registerCollection]: Collection already exists'
29
+ else
30
+ @collections[collection] = new CableNotifications.Collection(this, collection)
31
+ @collections[collection]
32
+
33
+ # Sync store using ActionCable received events
34
+ # collection parameter overrides the collection name specified in the incoming packets for this channel
35
+ syncToChannel: (channel, collection) ->
36
+ channelId = JSON.parse(channel.identifier)?.channel
37
+
38
+ if !channelId
39
+ console.warn "[syncToChannel]: Channel specified doesn't have an identifier"
40
+ else
41
+ @channels[channelId] =
42
+ channel: channel
43
+ callbacks: {
44
+ received: channel.received
45
+ }
46
+
47
+ channel.received = packetReceived(@channels[channelId], collection).bind(this)
48
+ channel
49
+
50
+ # Dispatch received packet to registered stores
51
+ # collection overrides the collection name specified in the incoming packet
52
+ storePacket: (packet, collection) ->
53
+ if packet && packet.msg
54
+ @callbacks[packet.msg]?(packet, collection)
@@ -1 +1 @@
1
- //= require_tree ./action_cable_notifications
1
+ //= require ./action_cable_notifications/application
@@ -59,7 +59,7 @@ module ActionCableNotifications
59
59
  if options.present?
60
60
  {
61
61
  collection: self.model_name.collection,
62
- msg: 'collection_add',
62
+ msg: 'update_many',
63
63
  data: self.scoped_collection(options[:scope])
64
64
  }
65
65
  end
@@ -3,14 +3,20 @@ module ActionCableNotifications
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
+ attr_accessor :stream_notification_options
6
7
  # Actions to be done when the module is included
7
8
  end
8
9
 
10
+ def get_initial_values
11
+ transmit self.stream_notification_options[:model].notify_initial self.stream_notification_options[:broadcasting]
12
+ end
13
+
9
14
  private
10
15
 
11
16
  def stream_notifications_for(model, options = {}, &block)
12
17
  # Default options
13
18
  options = {
19
+ model: model,
14
20
  actions: [:create, :update, :destroy],
15
21
  broadcasting: model.model_name.collection,
16
22
  callback: nil,
@@ -20,6 +26,9 @@ module ActionCableNotifications
20
26
  scope: :all # Default collection scope
21
27
  }.merge(options)
22
28
 
29
+ # Sets channel options
30
+ self.stream_notification_options = options
31
+
23
32
  # Checks if model already includes notification callbacks
24
33
  if !model.respond_to? :ActionCableNotificationsOptions
25
34
  model.send('include', ActionCableNotifications::Callbacks)
@@ -37,7 +46,7 @@ module ActionCableNotifications
37
46
  # Transmit initial state if required
38
47
  if options[:include_initial]
39
48
  # XXX: Check if data should be transmitted
40
- transmit model.notify_initial options[:broadcasting]
49
+ get_initial_values
41
50
  end
42
51
 
43
52
  end
@@ -1,3 +1,3 @@
1
1
  module ActionCableNotifications
2
- VERSION = '0.1.10'
2
+ VERSION = '0.1.14'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_cable_notifications
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - ByS Sistemas de Control
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-12 00:00:00.000000000 Z
11
+ date: 2016-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -72,7 +72,10 @@ files:
72
72
  - app/assets/config/action_cable_notifications_manifest.js
73
73
  - app/assets/javascripts/action_cable_notifications.js
74
74
  - app/assets/javascripts/action_cable_notifications/application.js
75
- - app/assets/javascripts/action_cable_notifications/sync_to_store.coffee
75
+ - app/assets/javascripts/action_cable_notifications/cable_notifications.coffee
76
+ - app/assets/javascripts/action_cable_notifications/collection.coffee
77
+ - app/assets/javascripts/action_cable_notifications/default_callbacks.coffee
78
+ - app/assets/javascripts/action_cable_notifications/store.coffee
76
79
  - app/assets/stylesheets/action_cable_notifications/application.css
77
80
  - app/controllers/action_cable_notifications/application_controller.rb
78
81
  - app/helpers/action_cable_notifications/application_helper.rb
@@ -1,107 +0,0 @@
1
- class CableNotifications
2
-
3
- #
4
- # Private variables
5
- #####################################
6
-
7
- registered_stores = {}
8
-
9
- #
10
- # Public variables
11
- #####################################
12
-
13
- collections: null
14
-
15
- #
16
- # Private methods
17
- #####################################
18
-
19
- processPacketHelper = (packet, collection) ->
20
- local_collection = @collections[collection || packet.collection]
21
- index = null
22
- record = null
23
-
24
- index = _.findIndex(local_collection, (record) -> record.id == packet.id)
25
- if (index >= 0)
26
- record = local_collection[index]
27
-
28
- return {
29
- collection: local_collection
30
- index: index
31
- record: record
32
- }
33
-
34
- # Default callbacks for internal storage of received packets
35
- # Need to set include_initial: true in broadcasting options
36
- default_callbacks =
37
- initialize: (collection) ->
38
- @collections[collection] = []
39
-
40
- collection_add: (packet, collection) ->
41
- for index, row of packet.data
42
- @collections[collection || packet.collection].push( row )
43
-
44
- collection_remove: (packet, collection) ->
45
- console.warn 'Method not implemented: collection_remove '
46
-
47
- create: (packet, collection) ->
48
- data = processPacketHelper(packet, collection)
49
- if data.record
50
- console.warn 'Expected not to find a document already present for an add: ' + data.record
51
- else
52
- data.collection.push(packet.data)
53
-
54
- update: (packet, collection) ->
55
- data = processPacketHelper(packet, collection)
56
- if !data.record
57
- console.warn 'Expected to find a document to change'
58
- else if !_.isEmpty(packet.data)
59
- _.extend(data.record, packet.data)
60
-
61
- update_many: (packet, collection) ->
62
- local_collection = @collections[collection || packet.collection]
63
- _.each packet.data, (fields) ->
64
- record = _.findIndex(local_collection, (r) -> r.id == fields.id)
65
- if record
66
- _.extend(local_collection[index], fields)
67
-
68
- destroy: (packet, collection) ->
69
- data = processPacketHelper(packet, collection)
70
- if !data.record
71
- console.warn 'Expected to find a document to remove'
72
- else
73
- data.collection.splice(data.index, 1)
74
-
75
- #
76
- # Public methods
77
- #####################################
78
- constructor: ->
79
- @collections = {}
80
-
81
- # Binds local methods and callbacks to this class
82
- for name, callback of default_callbacks
83
- default_callbacks[name] = callback.bind(this)
84
-
85
- processPacketHelper = processPacketHelper.bind(this)
86
-
87
- # Registers a new store
88
- registerStore: (collection, callbacks) ->
89
- if callbacks
90
- registered_stores[collection] = callbacks
91
- else
92
- registered_stores[collection] = default_callbacks
93
-
94
- # Initialize registered store
95
- registered_stores[collection].initialize?(collection)
96
-
97
- # Dispatch received packet to registered stores
98
- storePacket: (packet, collection) ->
99
- if packet && packet.msg
100
- for store, callbacks of registered_stores
101
- callbacks[packet.msg]?(packet, collection)
102
-
103
-
104
- # Export to global namespace
105
- #######################################
106
- @App = {} unless @App
107
- @App.cable_notifications = new CableNotifications()