hyper-resource 1.0.0.lap52 → 1.0.0.lap53

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
  SHA256:
3
- metadata.gz: 41dc65786cdf2de22be1a66f7488e76fe351eb860ee88f2da30425cebba57972
4
- data.tar.gz: 1762216f5514efa11b5c6be372b139e7cb96b80c3b18e75be633919bdf7bc95c
3
+ metadata.gz: 2fdb0a8d50f4f15b310d470b2e409627c2793c0512907b643b57919d204f58bb
4
+ data.tar.gz: b61972174d030887f5d07b4a3a299f77ce0b7c816a97b4c882d18e26d9c28235
5
5
  SHA512:
6
- metadata.gz: 8d3b3dd31ebcccd1ee8ed93e57c7886b7d183dac79e9641f5cb2cdaa384051b87b1a29e6dba68d08111188b14dbb943db1b655e0cf21382f830dc2ed3e5bf833
7
- data.tar.gz: 6299398e17aca9704eff38065617ccf92e9428d2be2eb5f7f5ec04ef074c78e388ae3b102342e6985159a88d520a78ff5e63811be1b5c271158896b9647b0c52
6
+ metadata.gz: 3a4c12776795ea0c9cfbc88af0114e436b7b774fe7ddea644bbf06ef8d922721c8e5d290805c3bd148edcbda23c828c402a144a61eca4e6249ae68928bd2d0f1
7
+ data.tar.gz: 3577ebf9be0425fad5d02e0a4151b3915b96cb037155c663c3a2f8333b1471f565d3fb494917d2f6e5fc2ebb1dac02be3ac531f86345a4adb179dbaacf203423
@@ -326,7 +326,7 @@ module HyperRecord
326
326
  _notify_class_observers
327
327
  rest_methods[name][:result]
328
328
  end.fail do |response|
329
- error_message = "#{self.to_s}.#{name}, a rest_method, failed to fetch records!"
329
+ error_message = "#{self.to_s}.#{name}, a rest_method, failed to execute!"
330
330
  `console.error(error_message)`
331
331
  response
332
332
  end
@@ -360,14 +360,14 @@ module HyperRecord
360
360
  _notify_observers
361
361
  @rest_methods_hash[name][:result]
362
362
  end.fail do |response|
363
- error_message = "#{self.class.to_s}[#{self.id}].#{name}, a rest_method, failed to fetch records!"
363
+ error_message = "#{self.class.to_s}[#{self.id}].#{name}, a rest_method, failed to execute!"
364
364
  `console.error(error_message)`
365
365
  response
366
366
  end
367
367
  end
368
368
  define_method(name) do |*args|
369
369
  _register_observer
370
- if self.id && (@rest_methods_hash[name][:force] || !@rest_methods_hash[name].has_key?(:result))
370
+ if self.id && (self.class.rest_methods[name][:force] || @rest_methods_hash[name][:force] || !@rest_methods_hash[name].has_key?(:result))
371
371
  self.send("promise_#{name}", *args)
372
372
  end
373
373
  if @rest_methods_hash[name].has_key?(:result)
@@ -0,0 +1,186 @@
1
+ module HyperRecord
2
+ module PubSub
3
+ def self.included(base)
4
+ base.extend(HyperRecord::PubSub::ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def _pusher_client
9
+ Hyperloop.pusher_instance ||= Pusher::Client.new(
10
+ app_id: Hyperloop.pusher[:app_id],
11
+ key: Hyperloop.pusher[:key],
12
+ secret: Hyperloop.pusher[:secret],
13
+ cluster: Hyperloop.pusher[:cluster]
14
+ )
15
+ end
16
+
17
+ def publish_relation(base_record, relation_name, record = nil)
18
+ subscribers = Hyperloop.redis_instance.hgetall("HRPS__#{base_record.class}__#{base_record.id}__#{relation_name}")
19
+ time_now = Time.now.to_f
20
+ scrub_time = time_now - 24.hours.to_f
21
+ message = {
22
+ record_type: base_record.class.to_s,
23
+ id: base_record.id,
24
+ updated_at: base_record.updated_at,
25
+ relation: relation_name
26
+ }
27
+ if record
28
+ message[:cause] = {}
29
+ message[:cause][:record_type] = record.class.to_s
30
+ message[:cause][:id] = record.id
31
+ message[:cause][:updated_at] = record.updated_at
32
+ end
33
+ subscribers.each do |session_id, last_requested|
34
+ if last_requested.to_f < scrub_time
35
+ Hyperloop.redis_instance.hdel("HRPS__#{base_record.class}__#{base_record.id}__#{relation_name}", session_id)
36
+ next
37
+ end
38
+ if Hyperloop.resource_transport == :pusher
39
+ _pusher_client.trigger("hyper-record-update-channel-#{session_id}", 'update', message)
40
+ end
41
+ end
42
+ end
43
+
44
+ def publish_record(record)
45
+ subscribers = Hyperloop.redis_instance.hgetall("HRPS__#{record.class}__#{record.id}")
46
+ time_now = Time.now.to_f
47
+ scrub_time = time_now - 24.hours.to_f
48
+
49
+ message = {
50
+ record_type: record.class.to_s,
51
+ id: record.id,
52
+ updated_at: record.updated_at
53
+ }
54
+ message[:destroyed] = true if record.destroyed?
55
+
56
+ subscribers.each_slice(50) do |slice|
57
+ channel_array= []
58
+ slice.each do |session_id, last_requested|
59
+ if last_requested.to_f < scrub_time
60
+ Hyperloop.redis_instance.hdel("HRPS__#{record.class}__#{record.id}", session_id)
61
+ next
62
+ end
63
+ channel_array << "hyper-record-update-channel-#{session_id}"
64
+ end
65
+ if Hyperloop.resource_transport == :pusher && channel_array.size > 0
66
+ _pusher_client.trigger(channel_array, 'update', message)
67
+ end
68
+ end
69
+ Hyperloop.redis_instance.del("HRPS__#{record.class}__#{record.id}") if record.destroyed?
70
+ end
71
+
72
+ def publish_scope(record_class, scope_name)
73
+ subscribers = Hyperloop.redis_instance.hgetall("HRPS__#{record_class}__scope__#{scope_name}")
74
+ time_now = Time.now.to_f
75
+ scrub_time = time_now - 24.hours.to_f
76
+ subscribers.each do |session_id, last_requested|
77
+ if last_requested.to_f < scrub_time
78
+ Hyperloop.redis_instance.hdel("HRPS__#{record_class}__scope__#{scope_name}", session_id)
79
+ next
80
+ end
81
+ message = {
82
+ record_type: record_class.to_s,
83
+ scope: scope_name
84
+ }
85
+ if Hyperloop.resource_transport == :pusher
86
+ _pusher_client.trigger("hyper-record-update-channel-#{session_id}", 'update', message)
87
+ end
88
+ end
89
+ end
90
+
91
+ def subscribe_relation(relation, base_record = nil, relation_name = nil)
92
+ return unless session.id
93
+ time_now = Time.now.to_f.to_s
94
+ session_id = session.id.to_s
95
+ Hyperloop.redis_instance.pipelined do
96
+ if relation.is_a?(Enumerable)
97
+ # has_many
98
+ relation.each do |record|
99
+ Hyperloop.redis_instance.hset("HRPS__#{record.class}__#{record.id}", session_id, time_now)
100
+ end
101
+ elsif !relation.nil?
102
+ # has_one, belongs_to
103
+ Hyperloop.redis_instance.hset("HRPS__#{relation.class}__#{relation.id}", session_id, time_now)
104
+ end
105
+ Hyperloop.redis_instance.hset("HRPS__#{base_record.class}__#{base_record.id}__#{relation_name}", session_id, time_now) if base_record && relation_name
106
+ end
107
+ end
108
+
109
+ def subscribe_record(record)
110
+ return unless session.id
111
+ Hyperloop.redis_instance.hset "HRPS__#{record.class}__#{record.id}", session.id.to_s, Time.now.to_f.to_s
112
+ end
113
+
114
+ def subscribe_scope(collection, record_class = nil, scope_name = nil)
115
+ return unless session.id
116
+ time_now = Time.now.to_f.to_s
117
+ session_id = session.id.to_s
118
+ Hyperloop.redis_instance.pipelined do
119
+ if collection.is_a?(Enumerable)
120
+ collection.each do |record|
121
+ Hyperloop.redis_instance.hset("HRPS__#{record.class}__#{record.id}", session_id, time_now)
122
+ end
123
+ end
124
+ Hyperloop.redis_instance.hset("HRPS__#{record_class}__scope__#{scope_name}", session_id, time_now) if record_class && scope_name
125
+ end
126
+ end
127
+
128
+ def pub_sub_relation(relation, base_record, relation_name, causing_record = nil)
129
+ subscribe_relation(relation, base_record, relation_name)
130
+ publish_relation(base_record, relation_name, causing_record)
131
+ end
132
+
133
+ def pub_sub_record(record)
134
+ subscribe_record(record)
135
+ publish_record(record)
136
+ end
137
+
138
+ def pub_sub_scope(collection, record_class, scope_name)
139
+ subscribe_scope(collection, record_class, scope_name)
140
+ publish_scope(record_class, scope_name)
141
+ end
142
+
143
+ def session
144
+ @_hyper_resource_session
145
+ end
146
+ end
147
+
148
+ # instance methods
149
+
150
+ def publish_relation(base_record, relation_name, record = nil)
151
+ self.class.publish_relation(base_record, relation_name, record)
152
+ end
153
+
154
+ def publish_record(record)
155
+ self.class.publish_record(record)
156
+ end
157
+
158
+ def publish_scope(record_class, scope_name)
159
+ self.class.publish_scope(record_class, scope_name)
160
+ end
161
+
162
+ def subscribe_relation(relation, base_record = nil, relation_name = nil)
163
+ self.class.subscribe_relation(relation, base_record, relation_name)
164
+ end
165
+
166
+ def subscribe_record(record)
167
+ self.class.subscribe_record(record)
168
+ end
169
+
170
+ def subscribe_scope(collection, record_class = nil, scope_name = nil)
171
+ self.class.subscribe_scope(collection, record_class, scope_name)
172
+ end
173
+
174
+ def pub_sub_relation(relation, base_record, relation_name, causing_record = nil)
175
+ self.class.pub_sub_relation(relation, base_record, relation_name, causing_record)
176
+ end
177
+
178
+ def pub_sub_record(record)
179
+ self.class.pub_sub_record(record)
180
+ end
181
+
182
+ def pub_sub_scope(collection, record_class, scope_name)
183
+ self.class.pub_sub_scope(collection, record_class, scope_name)
184
+ end
185
+ end
186
+ end
data/lib/hyper_record.rb CHANGED
@@ -16,6 +16,7 @@ if RUBY_ENGINE == 'opal'
16
16
  end
17
17
  else
18
18
  require 'hyper_record/server_class_methods'
19
+ require 'hyper_record/pub_sub'
19
20
  end
20
21
 
21
22
 
@@ -7,6 +7,7 @@ if RUBY_ENGINE == 'opal'
7
7
  else
8
8
  module Hyperloop
9
9
  define_setting(:pusher, {})
10
+ define_setting(:pusher_instance, nil)
10
11
  define_setting(:redis_instance, nil)
11
12
  define_setting(:resource_api_base_path, '/api')
12
13
  define_setting(:resource_transport, :pusher)
@@ -7,7 +7,7 @@ module Hyperloop
7
7
 
8
8
  module ClassMethods
9
9
  def _pusher_client
10
- @pusher_client ||= Pusher::Client.new(
10
+ Hyperloop.pusher_instance ||= Pusher::Client.new(
11
11
  app_id: Hyperloop.pusher[:app_id],
12
12
  key: Hyperloop.pusher[:key],
13
13
  secret: Hyperloop.pusher[:secret],
@@ -1,5 +1,5 @@
1
1
  module Hyperloop
2
2
  module Resource
3
- VERSION = '1.0.0.lap52'
3
+ VERSION = '1.0.0.lap53'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper-resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.lap52
4
+ version: 1.0.0.lap53
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
@@ -208,6 +208,7 @@ files:
208
208
  - lib/hyper_record/client_instance_methods.rb
209
209
  - lib/hyper_record/collection.rb
210
210
  - lib/hyper_record/dummy_value.rb
211
+ - lib/hyper_record/pub_sub.rb
211
212
  - lib/hyper_record/server_class_methods.rb
212
213
  - lib/hyperloop/resource/client_drivers.rb
213
214
  - lib/hyperloop/resource/config.rb