jason-rails 0.7.5 → 0.8.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 +9 -0
- data/Gemfile.lock +1 -1
- data/README.md +2 -1
- data/client/package.json +1 -1
- data/lib/jason/lua_generator.rb +20 -6
- data/lib/jason/publisher.rb +5 -1
- data/lib/jason/subscription.rb +11 -8
- data/lib/jason/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 592a7eab8028ae28815abbf0d401d98b2ceabc0009f30713f68795da21adb165
|
4
|
+
data.tar.gz: 315f5088e258dcab9755dc92f4de03f3f2f016cf6698d3619f022c1e7d601e9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a33fdc1d57462a97b7dd571222ff314cc77338e5172fcfc662f3e1fd5f008deed299abcd870900d0b50805944af822b462f6adee46953895499ce49f69df6680
|
7
|
+
data.tar.gz: 8ec1a59761856754f09bb7b6431d3d45d319daf9d4c7f030b8c7c2301c28ab2d0393952c4d7339a4d6310da2689c3cba8c71048deed931e0d3c4b0cf5c2fc2f1
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## v0.8.0
|
2
|
+
- Cold cache handling:
|
3
|
+
- Expiry is now set on all cached models of one week
|
4
|
+
- Code now handles case where cached model is missing and repopulates the cache
|
5
|
+
|
6
|
+
## v0.7.5
|
7
|
+
- Fixed JS errors when payloads arrive on websockets after the subscription has been unmounted
|
8
|
+
- Fixed errors during initialization due to calling `cache_all` on a Rails model before it had fully initialized.
|
9
|
+
|
1
10
|
## v0.7.3
|
2
11
|
- Added: Add JasonContext to exports, for use in scenarios where you need to forward the context into some other React reconciler (e.g. `react-three-fiber`)
|
3
12
|
- Fixed: Unneeded `reload` in Publisher resulting in extra database calls
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -21,7 +21,7 @@ An alternative way of thinking about Jason is "what if we applied the Flux/Redux
|
|
21
21
|
Add the gem and the NPM package
|
22
22
|
|
23
23
|
```ruby
|
24
|
-
gem 'jason-rails'
|
24
|
+
gem 'jason-rails', require: 'jason'
|
25
25
|
```
|
26
26
|
|
27
27
|
```bash
|
@@ -180,6 +180,7 @@ Development is primarily driven by the needs of projects we're using Jason in. I
|
|
180
180
|
|
181
181
|
## Publishing a new version
|
182
182
|
- Update `version.rb`
|
183
|
+
- Update CHANGELOG
|
183
184
|
- `gem build`
|
184
185
|
- `gem push`
|
185
186
|
- `npm version [major/minor/patch]`
|
data/client/package.json
CHANGED
data/lib/jason/lua_generator.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
class Jason::LuaGenerator
|
2
2
|
## TODO load these scripts and evalsha
|
3
3
|
def cache_json(model_name, id, payload)
|
4
|
+
expiry = 7*24*60*60 + rand(6*60*60)
|
5
|
+
|
6
|
+
# ensure the content expires first
|
4
7
|
cmd = <<~LUA
|
5
8
|
local gidx = redis.call('INCR', 'jason:gidx')
|
6
|
-
redis.call( '
|
7
|
-
redis.call( '
|
9
|
+
redis.call( 'setex', 'jason:cache:' .. ARGV[1] .. ':' .. ARGV[2] .. ':gidx', #{expiry}, gidx )
|
10
|
+
redis.call( 'setex', 'jason:cache:' .. ARGV[1] .. ':' .. ARGV[2], #{expiry - 60}, ARGV[3] )
|
8
11
|
return gidx
|
9
12
|
LUA
|
10
13
|
|
@@ -15,15 +18,26 @@ class Jason::LuaGenerator
|
|
15
18
|
# If value has changed, return old value and new idx. Otherwise do nothing.
|
16
19
|
cmd = <<~LUA
|
17
20
|
local t = {}
|
18
|
-
local
|
21
|
+
local insts = {}
|
22
|
+
local miss_ids = {}
|
19
23
|
local ids = redis.call('smembers', 'jason:subscriptions:' .. ARGV[2] .. ':ids:' .. ARGV[1])
|
20
24
|
|
21
25
|
for k,id in pairs(ids) do
|
22
|
-
|
26
|
+
local result = redis.call( 'get', 'jason:cache:' .. ARGV[1] .. ':' .. id)
|
27
|
+
if (result == false) then
|
28
|
+
miss_ids[#miss_ids+1] = id
|
29
|
+
else
|
30
|
+
insts[#insts+1] = result
|
31
|
+
end
|
23
32
|
end
|
24
33
|
|
25
|
-
|
26
|
-
|
34
|
+
if next(miss_ids) == nil then
|
35
|
+
t[#t+1] = insts
|
36
|
+
t[#t+1] = redis.call( 'get', 'jason:subscription:' .. ARGV[2] .. ':' .. ARGV[1] .. ':idx' )
|
37
|
+
else
|
38
|
+
t[#t+1] = miss_ids
|
39
|
+
t[#t+1] = 'missing'
|
40
|
+
end
|
27
41
|
|
28
42
|
return t
|
29
43
|
LUA
|
data/lib/jason/publisher.rb
CHANGED
@@ -124,7 +124,7 @@ module Jason::Publisher
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def jason_cached_value
|
127
|
-
JSON.parse($redis_jason.
|
127
|
+
JSON.parse($redis_jason.get("jason:cache:#{self.class.name.underscore}:#{id}") || '{}')
|
128
128
|
end
|
129
129
|
|
130
130
|
class_methods do
|
@@ -132,6 +132,10 @@ module Jason::Publisher
|
|
132
132
|
all.find_each(&:cache_json)
|
133
133
|
end
|
134
134
|
|
135
|
+
def cache_for(ids)
|
136
|
+
where(id: ids).find_each(&:cache_json)
|
137
|
+
end
|
138
|
+
|
135
139
|
def has_jason?
|
136
140
|
true
|
137
141
|
end
|
data/lib/jason/subscription.rb
CHANGED
@@ -399,16 +399,17 @@ class Jason::Subscription
|
|
399
399
|
end
|
400
400
|
|
401
401
|
def get_for_model(model_name)
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
end
|
407
|
-
instance_jsons = instance_jsons_hash.values
|
408
|
-
else
|
402
|
+
instance_jsons, idx = Jason::LuaGenerator.new.get_payload(model_name, id)
|
403
|
+
if idx == 'missing'
|
404
|
+
# warm cache and then retry
|
405
|
+
model_klass(model_name).cache_for(instance_jsons)
|
409
406
|
instance_jsons, idx = Jason::LuaGenerator.new.get_payload(model_name, id)
|
410
407
|
end
|
411
408
|
|
409
|
+
if instance_jsons.any? { |json| json.blank? }
|
410
|
+
raise Jason::MissingCacheError
|
411
|
+
end
|
412
|
+
|
412
413
|
payload = instance_jsons.map do |instance_json|
|
413
414
|
instance_json ? JSON.parse(instance_json) : {}
|
414
415
|
end
|
@@ -437,7 +438,7 @@ class Jason::Subscription
|
|
437
438
|
|
438
439
|
def add(model_name, instance_id)
|
439
440
|
idx = $redis_jason.incr("jason:subscription:#{id}:#{model_name}:idx")
|
440
|
-
payload = JSON.parse($redis_jason.
|
441
|
+
payload = JSON.parse($redis_jason.get("jason:cache:#{model_name}:#{instance_id}") || '{}')
|
441
442
|
|
442
443
|
payload = {
|
443
444
|
id: instance_id,
|
@@ -479,3 +480,5 @@ class Jason::Subscription
|
|
479
480
|
broadcaster.broadcast(payload)
|
480
481
|
end
|
481
482
|
end
|
483
|
+
|
484
|
+
class Jason::MissingCacheError < StandardError; end
|
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.8.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:
|
11
|
+
date: 2022-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|