hyper-resource 1.0.0.lap52 → 1.0.0.lap53

Sign up to get free protection for your applications and to get access to all the features.
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