jason-rails 0.6.7 → 0.7.3

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +38 -0
  3. data/Gemfile.lock +6 -4
  4. data/README.md +16 -14
  5. data/app/controllers/jason/jason_controller.rb +26 -4
  6. data/app/workers/jason/outbound_message_queue_worker.rb +1 -1
  7. data/client/lib/JasonProvider.d.ts +2 -1
  8. data/client/lib/JasonProvider.js +2 -2
  9. data/client/lib/addRelations.d.ts +1 -0
  10. data/client/lib/addRelations.js +39 -0
  11. data/client/lib/createJasonReducers.js +4 -2
  12. data/client/lib/createOptDis.d.ts +1 -1
  13. data/client/lib/createOptDis.js +9 -8
  14. data/client/lib/createServerActionQueue.d.ts +3 -2
  15. data/client/lib/createServerActionQueue.js +32 -6
  16. data/client/lib/createServerActionQueue.test.js +61 -6
  17. data/client/lib/createThenable.d.ts +1 -0
  18. data/client/lib/createThenable.js +5 -0
  19. data/client/lib/index.d.ts +7 -1
  20. data/client/lib/index.js +3 -1
  21. data/client/lib/transportAdapters/actionCableAdapter.js +24 -4
  22. data/client/lib/transportAdapters/pusherAdapter.js +1 -1
  23. data/client/lib/useDraft.d.ts +1 -0
  24. data/client/lib/useDraft.js +13 -0
  25. data/client/lib/useEager.d.ts +1 -1
  26. data/client/lib/useEager.js +10 -5
  27. data/client/lib/useJason.d.ts +2 -1
  28. data/client/lib/useJason.js +4 -6
  29. data/client/package.json +1 -1
  30. data/client/src/JasonProvider.tsx +2 -2
  31. data/client/src/addRelations.ts +33 -0
  32. data/client/src/createJasonReducers.ts +4 -2
  33. data/client/src/createOptDis.ts +10 -8
  34. data/client/src/createServerActionQueue.test.ts +60 -6
  35. data/client/src/createServerActionQueue.ts +41 -6
  36. data/client/src/index.ts +2 -0
  37. data/client/src/transportAdapters/actionCableAdapter.ts +24 -5
  38. data/client/src/transportAdapters/pusherAdapter.ts +1 -2
  39. data/client/src/useDraft.ts +17 -0
  40. data/client/src/useEager.ts +9 -6
  41. data/client/src/useJason.ts +3 -6
  42. data/lib/jason.rb +4 -1
  43. data/lib/jason/api_model.rb +0 -4
  44. data/lib/jason/channel.rb +0 -7
  45. data/lib/jason/conditions_matcher.rb +88 -0
  46. data/lib/jason/consistency_checker.rb +65 -0
  47. data/lib/jason/graph_helper.rb +4 -0
  48. data/lib/jason/publisher.rb +39 -37
  49. data/lib/jason/subscription.rb +63 -18
  50. data/lib/jason/version.rb +1 -1
  51. metadata +12 -5
  52. data/client/src/makeEager.ts +0 -46
  53. data/lib/jason/publisher_old.rb +0 -112
  54. data/lib/jason/subscription_old.rb +0 -171
@@ -48,15 +48,31 @@ class Jason::Subscription
48
48
  end
49
49
  end
50
50
 
51
+ def self.all_for_model(model_name)
52
+ $redis_jason.smembers("jason:models:#{model_name}:all:subscriptions")
53
+ end
54
+
51
55
  def self.for_instance(model_name, id, include_all = true)
52
56
  subs = $redis_jason.smembers("jason:models:#{model_name}:#{id}:subscriptions")
53
57
  if include_all
54
- subs += $redis_jason.smembers("jason:models:#{model_name}:all:subscriptions")
58
+ subs += all_for_model(model_name)
55
59
  end
56
-
57
60
  subs
58
61
  end
59
62
 
63
+ # returns [
64
+ # { condition: { post_id: 123 }, subscription_ids: [] }
65
+ # ]
66
+ def self.conditions_for_model(model_name)
67
+ rows = $redis_jason.smembers("jason:models:#{model_name}:conditions").map do |row|
68
+ JSON.parse(row)
69
+ end
70
+ conditions = rows.group_by { |row| row['conditions'] }
71
+ conditions.map do |conditions, rows|
72
+ { 'conditions' => conditions, 'subscription_ids' => rows.map { |row| row['subscription_id'] } }
73
+ end
74
+ end
75
+
60
76
  def self.for_model(model_name)
61
77
 
62
78
  end
@@ -163,10 +179,14 @@ class Jason::Subscription
163
179
  subscription.apply_id_changeset(id_changeset)
164
180
  subscription.broadcast_id_changeset(id_changeset)
165
181
  end
182
+
183
+ #########
184
+ # ---> Join the community
185
+ # Subs where changed is parent + parent is an _all_ or _condition_ subscription
186
+
166
187
  end
167
188
 
168
189
  def self.remove_ids(model_name, ids)
169
- # td: finish this
170
190
  ids.each do |instance_id|
171
191
  for_instance(model_name, instance_id, false).each do |sub_id|
172
192
  subscription = find_by_id(sub_id)
@@ -176,11 +196,13 @@ class Jason::Subscription
176
196
  subscription.broadcast_id_changeset(id_changeset)
177
197
  end
178
198
  end
179
- end
180
-
181
- # Add ID to any _all_ subscriptions
182
- def self.add_id(model_name, id)
183
199
 
200
+ all_for_model(model_name).each do |sub_id|
201
+ subscription = find_by_id(sub_id)
202
+ ids.each do |id|
203
+ subscription.destroy(model_name, id)
204
+ end
205
+ end
184
206
  end
185
207
 
186
208
  def self.all
@@ -203,6 +225,28 @@ class Jason::Subscription
203
225
  end
204
226
  end
205
227
 
228
+ def remove_id(model_name, id)
229
+ id_changeset = graph_helper.apply_remove_node("#{model_name}:#{id}")
230
+ apply_id_changeset(id_changeset)
231
+ broadcast_id_changeset(id_changeset)
232
+ end
233
+
234
+ def add_id(model_name, id)
235
+ id_changeset = graph_helper.apply_update({
236
+ add: [
237
+ {
238
+ model_names: [model_name],
239
+ instance_ids: [[id]]
240
+ },
241
+ # Add IDs of child models
242
+ load_ids_for_sub_models(model_name, id)
243
+ ]
244
+ })
245
+
246
+ apply_id_changeset(id_changeset)
247
+ broadcast_id_changeset(id_changeset)
248
+ end
249
+
206
250
  def remove_ids(model_name, ids)
207
251
  $redis_jason.srem("jason:subscriptions:#{id}:ids:#{model_name}", ids)
208
252
  ids.each do |instance_id|
@@ -238,13 +282,18 @@ class Jason::Subscription
238
282
  all_models = includes_helper.all_models(model_name)
239
283
 
240
284
  relation = model_name.classify.constantize.all.eager_load(includes_tree)
241
-
242
285
  if model_name == model
243
286
  if conditions.blank?
244
287
  $redis_jason.sadd("jason:models:#{model_name}:all:subscriptions", id)
245
288
  all_models -= [model_name]
246
- else
289
+ elsif conditions.keys == ['id']
247
290
  relation = relation.where(conditions)
291
+ else
292
+ $redis_jason.sadd("jason:models:#{model_name}:conditions", {
293
+ 'conditions' => conditions,
294
+ 'subscription_id' => self.id
295
+ }.to_json)
296
+ relation = Jason::ConditionsMatcher.new(relation.klass).apply_conditions(relation, conditions)
248
297
  end
249
298
  else
250
299
  raise "Must supply IDs for sub models" if ids.nil?
@@ -257,7 +306,7 @@ class Jason::Subscription
257
306
 
258
307
  # pluck returns only a 1D array if only 1 arg passed
259
308
  if all_models.size == 1
260
- instance_ids = [instance_ids]
309
+ instance_ids = instance_ids.map { |id| [id] }
261
310
  end
262
311
 
263
312
  return { model_names: all_models, instance_ids: instance_ids }
@@ -266,12 +315,12 @@ class Jason::Subscription
266
315
  # 'posts', [post#1, post#2,...]
267
316
  def set_ids_for_sub_models(model_name = model, ids = nil, enforce: false)
268
317
  edge_set = load_ids_for_sub_models(model_name, ids)
269
-
270
318
  # Build the tree
271
319
  id_changeset = graph_helper.apply_update({
272
320
  add: [edge_set],
273
321
  enforce: enforce
274
322
  })
323
+
275
324
  apply_id_changeset(id_changeset)
276
325
  end
277
326
 
@@ -287,6 +336,7 @@ class Jason::Subscription
287
336
  end
288
337
  $redis_jason.del("jason:subscriptions:#{id}:ids:#{model_name}")
289
338
  end
339
+ $redis_jason.del("jason:subscriptions:#{id}:graph")
290
340
  end
291
341
 
292
342
  def ids(model_name = model)
@@ -328,10 +378,6 @@ class Jason::Subscription
328
378
  def remove_consumer(consumer_id)
329
379
  $redis_jason.srem("jason:subscriptions:#{id}:consumers", consumer_id)
330
380
  $redis_jason.hdel("jason:consumers", consumer_id)
331
-
332
- if consumer_count == 0
333
- clear_all_ids
334
- end
335
381
  end
336
382
 
337
383
  def consumer_count
@@ -344,8 +390,8 @@ class Jason::Subscription
344
390
 
345
391
  def user_can_access?(user)
346
392
  # td: implement the authorization logic here
347
- return true if Jason.authorization_service.blank?
348
- Jason.authorization_service.call(user, model, conditions, includes_helper.all_models - [model])
393
+ return true if Jason.subscription_authorization_service.blank?
394
+ Jason.subscription_authorization_service.call(user, model, conditions, includes_helper.all_models - [model])
349
395
  end
350
396
 
351
397
  def get
@@ -381,7 +427,6 @@ class Jason::Subscription
381
427
  # Remove subscription state
382
428
  if hard
383
429
  clear_all_ids
384
- $redis_jason.del("jason:subscriptions:#{id}:graph")
385
430
  end
386
431
 
387
432
  set_ids_for_sub_models(enforce: true)
data/lib/jason/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jason
2
- VERSION = "0.6.7"
2
+ VERSION = "0.7.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jason-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.7
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Rees
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-24 00:00:00.000000000 Z
11
+ date: 2021-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -152,6 +152,8 @@ files:
152
152
  - client/lib/JasonProvider.js
153
153
  - client/lib/actionFactory.d.ts
154
154
  - client/lib/actionFactory.js
155
+ - client/lib/addRelations.d.ts
156
+ - client/lib/addRelations.js
155
157
  - client/lib/createActions.d.ts
156
158
  - client/lib/createActions.js
157
159
  - client/lib/createJasonReducers.d.ts
@@ -164,6 +166,8 @@ files:
164
166
  - client/lib/createServerActionQueue.js
165
167
  - client/lib/createServerActionQueue.test.d.ts
166
168
  - client/lib/createServerActionQueue.test.js
169
+ - client/lib/createThenable.d.ts
170
+ - client/lib/createThenable.js
167
171
  - client/lib/createTransportAdapter.d.ts
168
172
  - client/lib/createTransportAdapter.js
169
173
  - client/lib/deepCamelizeKeys.d.ts
@@ -184,6 +188,8 @@ files:
184
188
  - client/lib/transportAdapters/pusherAdapter.js
185
189
  - client/lib/useAct.d.ts
186
190
  - client/lib/useAct.js
191
+ - client/lib/useDraft.d.ts
192
+ - client/lib/useDraft.js
187
193
  - client/lib/useEager.d.ts
188
194
  - client/lib/useEager.js
189
195
  - client/lib/useJason.d.ts
@@ -196,6 +202,7 @@ files:
196
202
  - client/src/JasonContext.ts
197
203
  - client/src/JasonProvider.tsx
198
204
  - client/src/actionFactory.ts
205
+ - client/src/addRelations.ts
199
206
  - client/src/createActions.ts
200
207
  - client/src/createJasonReducers.ts
201
208
  - client/src/createOptDis.ts
@@ -206,12 +213,12 @@ files:
206
213
  - client/src/deepCamelizeKeys.test.ts
207
214
  - client/src/deepCamelizeKeys.ts
208
215
  - client/src/index.ts
209
- - client/src/makeEager.ts
210
216
  - client/src/pruneIdsMiddleware.ts
211
217
  - client/src/restClient.ts
212
218
  - client/src/transportAdapters/actionCableAdapter.ts
213
219
  - client/src/transportAdapters/pusherAdapter.ts
214
220
  - client/src/useAct.ts
221
+ - client/src/useDraft.ts
215
222
  - client/src/useEager.ts
216
223
  - client/src/useJason.test.ts
217
224
  - client/src/useJason.ts
@@ -224,14 +231,14 @@ files:
224
231
  - lib/jason/api_model.rb
225
232
  - lib/jason/broadcaster.rb
226
233
  - lib/jason/channel.rb
234
+ - lib/jason/conditions_matcher.rb
235
+ - lib/jason/consistency_checker.rb
227
236
  - lib/jason/engine.rb
228
237
  - lib/jason/graph_helper.rb
229
238
  - lib/jason/includes_helper.rb
230
239
  - lib/jason/lua_generator.rb
231
240
  - lib/jason/publisher.rb
232
- - lib/jason/publisher_old.rb
233
241
  - lib/jason/subscription.rb
234
- - lib/jason/subscription_old.rb
235
242
  - lib/jason/version.rb
236
243
  homepage: https://github.com/jamesr2323/jason
237
244
  licenses:
@@ -1,46 +0,0 @@
1
- import pluralize from 'pluralize'
2
- import _ from 'lodash'
3
- import { useSelector } from 'react-redux'
4
-
5
- export default function (schema) {
6
- function addRelations(s, objects, objectType, relations) {
7
- // first find out relation name
8
- if (_.isArray(relations)) {
9
- relations.forEach(relation => {
10
- objects = addRelations(s, objects, objectType, relation)
11
- })
12
- } else if (typeof(relations) === 'object') {
13
- const relation = Object.keys(relations)[0]
14
- const subRelations = relations[relation]
15
-
16
- objects = addRelations(s, objects, objectType, relation)
17
- objects[relation] = addRelations(s, objects[relation], pluralize(relation), subRelations)
18
- // #
19
- } else if (typeof(relations) === 'string') {
20
- const relation = relations
21
- if (_.isArray(objects)) {
22
- objects = objects.map(obj => addRelations(s, obj, objectType, relation))
23
- } else {
24
- const relatedObjects = _.values(s[pluralize(relation)].entities)
25
-
26
- if(pluralize.isSingular(relation)) {
27
- objects = { ...objects, [relation]: _.find(relatedObjects, { id: objects[relation + 'Id'] }) }
28
- } else {
29
- objects = { ...objects, [relation]: relatedObjects.filter(e => e[pluralize.singular(objectType) + 'Id'] === objects.id) }
30
- }
31
- }
32
- }
33
-
34
- return objects
35
- }
36
-
37
- function useEager(entity, id = null, relations = []) {
38
- if (id) {
39
- return useSelector(s => addRelations(s, { ...s[entity].entities[String(id)] }, entity, relations), _.isEqual)
40
- } else {
41
- return useSelector(s => addRelations(s, _.values(s[entity].entities), entity, relations), _.isEqual)
42
- }
43
- }
44
-
45
- return useEager
46
- }
@@ -1,112 +0,0 @@
1
- module Jason::PublisherOld
2
- extend ActiveSupport::Concern
3
-
4
- def cache_json
5
- as_json_config = api_model.as_json_config
6
- scope = api_model.scope
7
-
8
- if self.persisted? && (scope.blank? || self.class.unscoped.send(scope).exists?(self.id))
9
- payload = self.reload.as_json(as_json_config)
10
- $redis_jason.hset("jason:#{self.class.name.underscore}:cache", self.id, payload.to_json)
11
- else
12
- $redis_jason.hdel("jason:#{self.class.name.underscore}:cache", self.id)
13
- end
14
- end
15
-
16
- def publish_json
17
- cache_json
18
- return if skip_publish_json
19
-
20
- self.class.jason_subscriptions.each do |id, config_json|
21
- config = JSON.parse(config_json)
22
-
23
- if (config['conditions'] || {}).all? { |field, value| self.send(field) == value }
24
- Jason::Subscription.new(id: id).update(self.class.name.underscore)
25
- end
26
- end
27
- end
28
-
29
- def publish_json_if_changed
30
- subscribed_fields = api_model.subscribed_fields
31
- publish_json if (self.previous_changes.keys.map(&:to_sym) & subscribed_fields).present? || !self.persisted?
32
- end
33
-
34
- class_methods do
35
- def subscriptions
36
- $redis_jason.hgetall("jason:#{self.name.underscore}:subscriptions")
37
- end
38
-
39
- def jason_subscriptions
40
- $redis_jason.hgetall("jason:#{self.name.underscore}:subscriptions")
41
- end
42
-
43
- def publish_all(instances)
44
- instances.each(&:cache_json)
45
-
46
- subscriptions.each do |id, config_json|
47
- Jason::Subscription.new(id: id).update(self.name.underscore)
48
- end
49
- end
50
-
51
- def flush_cache
52
- $redis_jason.del("jason:#{self.name.underscore}:cache")
53
- end
54
-
55
- def setup_json
56
- self.after_initialize -> {
57
- @api_model = Jason::ApiModel.new(self.class.name.underscore)
58
- }
59
- self.after_commit :publish_json_if_changed
60
-
61
- include_models = Jason::ApiModel.new(self.name.underscore).include_models
62
-
63
- include_models.map do |assoc|
64
- puts assoc
65
- reflection = self.reflect_on_association(assoc.to_sym)
66
- reflection.klass.after_commit -> {
67
- subscribed_fields = Jason::ApiModel.new(self.class.name.underscore).subscribed_fields
68
- puts subscribed_fields.inspect
69
-
70
- if (self.previous_changes.keys.map(&:to_sym) & subscribed_fields).present?
71
- self.send(reflection.inverse_of.name)&.publish_json
72
- end
73
- }
74
- end
75
- end
76
-
77
- def find_or_create_by_id(params)
78
- object = find_by(id: params[:id])
79
-
80
- if object
81
- object.update(params)
82
- elsif params[:hidden]
83
- return false ## If an object is passed with hidden = true but didn't already exist, it's safe to never create it
84
- else
85
- object = create!(params)
86
- end
87
-
88
- object
89
- end
90
-
91
- def find_or_create_by_id!(params)
92
- object = find_by(id: params[:id])
93
-
94
- if object
95
- object.update!(params)
96
- elsif params[:hidden]
97
- ## TODO: We're diverging from semantics of the Rails bang! methods here, which would normally either raise or return an object. Find a way to make this better.
98
- return false ## If an object is passed with hidden = true but didn't already exist, it's safe to never create it
99
- else
100
- object = create!(params)
101
- end
102
-
103
- object
104
- end
105
- end
106
-
107
- included do
108
- attr_accessor :skip_publish_json, :api_model
109
-
110
- setup_json
111
- end
112
- end
@@ -1,171 +0,0 @@
1
- class Jason::SubscriptionOld
2
- attr_accessor :id, :config
3
-
4
- def initialize(id: nil, config: nil)
5
- if id
6
- @id = id
7
- raw_config = $redis_jason.hgetall("jason:subscriptions:#{id}").map { |k,v| [k, JSON.parse(v)] }.to_h
8
- set_config(raw_config)
9
- else
10
- @id = Digest::MD5.hexdigest(config.to_json)
11
- configure(config)
12
- end
13
- end
14
-
15
- def set_config(raw_config)
16
- @config = raw_config.with_indifferent_access.map { |k,v| [k.underscore.to_s, v] }.to_h
17
- end
18
-
19
- def configure(raw_config)
20
- set_config(raw_config)
21
- $redis_jason.hmset("jason:subscriptions:#{id}", *config.map { |k,v| [k, v.to_json]}.flatten)
22
- end
23
-
24
- def destroy
25
- config.each do |model, value|
26
- $redis_jason.srem("jason:#{model.to_s.underscore}:subscriptions", id)
27
- end
28
- $redis_jason.del("jason:subscriptions:#{id}")
29
- end
30
-
31
- def add_consumer(consumer_id)
32
- before_consumer_count = consumer_count
33
- $redis_jason.sadd("jason:subscriptions:#{id}:consumers", consumer_id)
34
- $redis_jason.hset("jason:consumers", consumer_id, Time.now.utc)
35
-
36
- add_subscriptions
37
- publish_all
38
- end
39
-
40
- def remove_consumer(consumer_id)
41
- $redis_jason.srem("jason:subscriptions:#{id}:consumers", consumer_id)
42
- $redis_jason.hdel("jason:consumers", consumer_id)
43
-
44
- if consumer_count == 0
45
- remove_subscriptions
46
- end
47
- end
48
-
49
- def consumer_count
50
- $redis_jason.scard("jason:subscriptions:#{id}:consumers")
51
- end
52
-
53
- def channel
54
- "jason:#{id}"
55
- end
56
-
57
- def publish_all
58
- config.each do |model, model_config|
59
- klass = model.to_s.classify.constantize
60
- conditions = model_config['conditions'] || {}
61
- klass.where(conditions).find_each(&:cache_json)
62
- update(model)
63
- end
64
- end
65
-
66
- def add_subscriptions
67
- config.each do |model, value|
68
- $redis_jason.hset("jason:#{model.to_s.underscore}:subscriptions", id, value.to_json)
69
- update(model)
70
- end
71
- end
72
-
73
- def remove_subscriptions
74
- config.each do |model, _|
75
- $redis_jason.hdel("jason:#{model.to_s.underscore}:subscriptions", id)
76
- end
77
- end
78
-
79
- def self.publish_all
80
- JASON_API_MODEL.each do |model, _v|
81
- klass = model.to_s.classify.constantize
82
- klass.publish_all(klass.all) if klass.respond_to?(:publish_all)
83
- end
84
- end
85
-
86
- def get(model_name)
87
- LuaGenerator.new.index_hash_by_set("jason:cache:#{model_name}", "")
88
-
89
- value = JSON.parse($redis_jason.get("#{channel}:#{model}:value") || '[]')
90
- idx = $redis_jason.get("#{channel}:#{model}:idx").to_i
91
-
92
- {
93
- type: 'payload',
94
- md5Hash: id,
95
- model: model,
96
- value: value,
97
- idx: idx
98
- }
99
- end
100
-
101
- def get_diff(old_value, value)
102
- JsonDiff.generate(old_value, value)
103
- end
104
-
105
- def deep_stringify(value)
106
- if value.is_a?(Hash)
107
- value.deep_stringify_keys
108
- elsif value.is_a?(Array)
109
- value.map { |x| x.deep_stringify_keys }
110
- end
111
- end
112
-
113
- def get_throttle
114
- if !$throttle_rate || !$throttle_timeout || Time.now.utc > $throttle_timeout
115
- $throttle_timeout = Time.now.utc + 5.seconds
116
- $throttle_rate = ($redis_jason.get('global_throttle_rate') || 0).to_i
117
- else
118
- $throttle_rate
119
- end
120
- end
121
-
122
- # Atomically update and return patch
123
- def update(model)
124
- start_time = Time.now.utc
125
- conditions = config[model]['conditions']
126
-
127
- value = $redis_jason.hgetall("jason:#{model}:cache")
128
- .values.map { |v| JSON.parse(v) }
129
- .select { |v| (conditions || {}).all? { |field, value| v[field] == value } }
130
- .sort_by { |v| v['id'] }
131
-
132
- # lfsa = last finished, started at
133
- # If another job that started after this one, finished before this one, skip sending this state update
134
- if Time.parse($redis_jason.get("jason:#{channel}:lfsa") || '1970-01-01 00:00:00 UTC') < start_time
135
- $redis_jason.set("jason:#{channel}:lfsa", start_time)
136
- else
137
- return
138
- end
139
-
140
- value = deep_stringify(value)
141
-
142
- # If value has changed, return old value and new idx. Otherwise do nothing.
143
- cmd = <<~LUA
144
- local old_val=redis.call('get', ARGV[1] .. ':value')
145
- if old_val ~= ARGV[2] then
146
- redis.call('set', ARGV[1] .. ':value', ARGV[2])
147
- local new_idx = redis.call('incr', ARGV[1] .. ':idx')
148
- return { new_idx, old_val }
149
- end
150
- LUA
151
-
152
- result = $redis_jason.eval cmd, [], ["#{channel}:#{model}", value.to_json]
153
- return if result.blank?
154
-
155
- idx = result[0]
156
- old_value = JSON.parse(result[1] || '[]')
157
- diff = get_diff(old_value, value)
158
-
159
- end_time = Time.now.utc
160
-
161
- payload = {
162
- model: model,
163
- md5Hash: id,
164
- diff: diff,
165
- idx: idx.to_i,
166
- latency: ((end_time - start_time)*1000).round
167
- }
168
-
169
- ActionCable.server.broadcast("jason:#{id}", payload)
170
- end
171
- end