jason-rails 0.6.4 → 0.7.0
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 +4 -4
- data/CHANGELOG.md +38 -0
- data/Gemfile.lock +7 -2
- data/README.md +4 -12
- data/app/controllers/jason/{api_controller.rb → jason_controller.rb} +1 -1
- data/app/controllers/jason/{api/pusher_controller.rb → pusher_controller.rb} +1 -1
- data/app/workers/jason/outbound_message_queue_worker.rb +21 -0
- data/client/lib/addRelations.d.ts +1 -0
- data/client/lib/addRelations.js +39 -0
- data/client/lib/createJasonReducers.js +4 -2
- data/client/lib/createOptDis.d.ts +1 -1
- data/client/lib/createOptDis.js +9 -8
- data/client/lib/createServerActionQueue.d.ts +3 -2
- data/client/lib/createServerActionQueue.js +32 -6
- data/client/lib/createServerActionQueue.test.js +61 -6
- data/client/lib/createThenable.d.ts +1 -0
- data/client/lib/createThenable.js +5 -0
- data/client/lib/transportAdapters/actionCableAdapter.js +24 -4
- data/client/lib/transportAdapters/pusherAdapter.js +1 -1
- data/client/lib/useDraft.d.ts +1 -0
- data/client/lib/useDraft.js +13 -0
- data/client/lib/useEager.d.ts +1 -1
- data/client/lib/useEager.js +10 -5
- data/client/lib/useJason.js +2 -4
- data/client/package.json +1 -1
- data/client/src/addRelations.ts +33 -0
- data/client/src/createJasonReducers.ts +4 -2
- data/client/src/createOptDis.ts +10 -8
- data/client/src/createServerActionQueue.test.ts +60 -6
- data/client/src/createServerActionQueue.ts +41 -6
- data/client/src/transportAdapters/actionCableAdapter.ts +24 -5
- data/client/src/transportAdapters/pusherAdapter.ts +1 -2
- data/client/src/useDraft.ts +17 -0
- data/client/src/useEager.ts +9 -6
- data/client/src/useJason.ts +1 -4
- data/config/routes.rb +6 -6
- data/jason-rails.gemspec +1 -0
- data/lib/jason.rb +7 -3
- data/lib/jason/api_model.rb +0 -4
- data/lib/jason/broadcaster.rb +2 -1
- data/lib/jason/channel.rb +0 -7
- data/lib/jason/conditions_matcher.rb +88 -0
- data/lib/jason/consistency_checker.rb +61 -0
- data/lib/jason/graph_helper.rb +19 -4
- data/lib/jason/publisher.rb +40 -7
- data/lib/jason/subscription.rb +77 -17
- data/lib/jason/version.rb +1 -1
- metadata +30 -5
- data/client/src/makeEager.ts +0 -46
data/lib/jason/subscription.rb
CHANGED
@@ -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 +=
|
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
|
-
|
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 = [
|
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,11 +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
|
-
add: [edge_set]
|
320
|
+
add: [edge_set],
|
321
|
+
enforce: enforce
|
273
322
|
})
|
323
|
+
|
274
324
|
apply_id_changeset(id_changeset)
|
275
325
|
end
|
276
326
|
|
@@ -286,6 +336,7 @@ class Jason::Subscription
|
|
286
336
|
end
|
287
337
|
$redis_jason.del("jason:subscriptions:#{id}:ids:#{model_name}")
|
288
338
|
end
|
339
|
+
$redis_jason.del("jason:subscriptions:#{id}:graph")
|
289
340
|
end
|
290
341
|
|
291
342
|
def ids(model_name = model)
|
@@ -320,17 +371,13 @@ class Jason::Subscription
|
|
320
371
|
$redis_jason.hset("jason:consumers", consumer_id, Time.now.utc)
|
321
372
|
|
322
373
|
if before_consumer_count == 0
|
323
|
-
set_ids_for_sub_models
|
374
|
+
set_ids_for_sub_models(enforce: true)
|
324
375
|
end
|
325
376
|
end
|
326
377
|
|
327
378
|
def remove_consumer(consumer_id)
|
328
379
|
$redis_jason.srem("jason:subscriptions:#{id}:consumers", consumer_id)
|
329
380
|
$redis_jason.hdel("jason:consumers", consumer_id)
|
330
|
-
|
331
|
-
if consumer_count == 0
|
332
|
-
clear_all_ids
|
333
|
-
end
|
334
381
|
end
|
335
382
|
|
336
383
|
def consumer_count
|
@@ -375,6 +422,19 @@ class Jason::Subscription
|
|
375
422
|
}
|
376
423
|
end
|
377
424
|
|
425
|
+
# To be used as a fallback when some corruption of the subscription has taken place
|
426
|
+
def reset!(hard: false)
|
427
|
+
# Remove subscription state
|
428
|
+
if hard
|
429
|
+
clear_all_ids
|
430
|
+
end
|
431
|
+
|
432
|
+
set_ids_for_sub_models(enforce: true)
|
433
|
+
includes_helper.all_models.each do |model_name|
|
434
|
+
broadcaster.broadcast(get_for_model(model_name))
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
378
438
|
def add(model_name, instance_id)
|
379
439
|
idx = $redis_jason.incr("jason:subscription:#{id}:#{model_name}:idx")
|
380
440
|
payload = JSON.parse($redis_jason.hget("jason:cache:#{model_name}", instance_id) || '{}')
|
data/lib/jason/version.rb
CHANGED
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.
|
4
|
+
version: 0.7.0
|
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
|
11
|
+
date: 2021-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sidekiq
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description:
|
112
126
|
email:
|
113
127
|
- jarees@gmail.com
|
@@ -119,14 +133,16 @@ files:
|
|
119
133
|
- ".rspec"
|
120
134
|
- ".ruby-version"
|
121
135
|
- ".travis.yml"
|
136
|
+
- CHANGELOG.md
|
122
137
|
- CODE_OF_CONDUCT.md
|
123
138
|
- Gemfile
|
124
139
|
- Gemfile.lock
|
125
140
|
- LICENSE.txt
|
126
141
|
- README.md
|
127
142
|
- Rakefile
|
128
|
-
- app/controllers/jason/
|
129
|
-
- app/controllers/jason/
|
143
|
+
- app/controllers/jason/jason_controller.rb
|
144
|
+
- app/controllers/jason/pusher_controller.rb
|
145
|
+
- app/workers/jason/outbound_message_queue_worker.rb
|
130
146
|
- bin/console
|
131
147
|
- bin/setup
|
132
148
|
- client/babel.config.js
|
@@ -136,6 +152,8 @@ files:
|
|
136
152
|
- client/lib/JasonProvider.js
|
137
153
|
- client/lib/actionFactory.d.ts
|
138
154
|
- client/lib/actionFactory.js
|
155
|
+
- client/lib/addRelations.d.ts
|
156
|
+
- client/lib/addRelations.js
|
139
157
|
- client/lib/createActions.d.ts
|
140
158
|
- client/lib/createActions.js
|
141
159
|
- client/lib/createJasonReducers.d.ts
|
@@ -148,6 +166,8 @@ files:
|
|
148
166
|
- client/lib/createServerActionQueue.js
|
149
167
|
- client/lib/createServerActionQueue.test.d.ts
|
150
168
|
- client/lib/createServerActionQueue.test.js
|
169
|
+
- client/lib/createThenable.d.ts
|
170
|
+
- client/lib/createThenable.js
|
151
171
|
- client/lib/createTransportAdapter.d.ts
|
152
172
|
- client/lib/createTransportAdapter.js
|
153
173
|
- client/lib/deepCamelizeKeys.d.ts
|
@@ -168,6 +188,8 @@ files:
|
|
168
188
|
- client/lib/transportAdapters/pusherAdapter.js
|
169
189
|
- client/lib/useAct.d.ts
|
170
190
|
- client/lib/useAct.js
|
191
|
+
- client/lib/useDraft.d.ts
|
192
|
+
- client/lib/useDraft.js
|
171
193
|
- client/lib/useEager.d.ts
|
172
194
|
- client/lib/useEager.js
|
173
195
|
- client/lib/useJason.d.ts
|
@@ -180,6 +202,7 @@ files:
|
|
180
202
|
- client/src/JasonContext.ts
|
181
203
|
- client/src/JasonProvider.tsx
|
182
204
|
- client/src/actionFactory.ts
|
205
|
+
- client/src/addRelations.ts
|
183
206
|
- client/src/createActions.ts
|
184
207
|
- client/src/createJasonReducers.ts
|
185
208
|
- client/src/createOptDis.ts
|
@@ -190,12 +213,12 @@ files:
|
|
190
213
|
- client/src/deepCamelizeKeys.test.ts
|
191
214
|
- client/src/deepCamelizeKeys.ts
|
192
215
|
- client/src/index.ts
|
193
|
-
- client/src/makeEager.ts
|
194
216
|
- client/src/pruneIdsMiddleware.ts
|
195
217
|
- client/src/restClient.ts
|
196
218
|
- client/src/transportAdapters/actionCableAdapter.ts
|
197
219
|
- client/src/transportAdapters/pusherAdapter.ts
|
198
220
|
- client/src/useAct.ts
|
221
|
+
- client/src/useDraft.ts
|
199
222
|
- client/src/useEager.ts
|
200
223
|
- client/src/useJason.test.ts
|
201
224
|
- client/src/useJason.ts
|
@@ -208,6 +231,8 @@ files:
|
|
208
231
|
- lib/jason/api_model.rb
|
209
232
|
- lib/jason/broadcaster.rb
|
210
233
|
- lib/jason/channel.rb
|
234
|
+
- lib/jason/conditions_matcher.rb
|
235
|
+
- lib/jason/consistency_checker.rb
|
211
236
|
- lib/jason/engine.rb
|
212
237
|
- lib/jason/graph_helper.rb
|
213
238
|
- lib/jason/includes_helper.rb
|
data/client/src/makeEager.ts
DELETED
@@ -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
|
-
}
|