goat 0.3.27 → 0.3.29
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.
- data/bin/state-srv +41 -7
- data/goat.gemspec +1 -1
- data/lib/goat.rb +12 -10
- data/lib/goat/common.rb +31 -19
- data/lib/goat/state-srv.rb +2 -2
- metadata +3 -3
data/bin/state-srv
CHANGED
@@ -32,6 +32,8 @@ module Goat
|
|
32
32
|
@channelsrvs = {}
|
33
33
|
@page_versions = {}
|
34
34
|
@page_updates = {}
|
35
|
+
@page_users = {}
|
36
|
+
@user_pages = {}
|
35
37
|
end
|
36
38
|
|
37
39
|
def add_component(pgid, skel)
|
@@ -52,8 +54,10 @@ module Goat
|
|
52
54
|
@components_by_id[cid]
|
53
55
|
end
|
54
56
|
|
55
|
-
def initialize_page(pgid)
|
57
|
+
def initialize_page(pgid, user)
|
56
58
|
@page_versions[pgid] = 0
|
59
|
+
@page_users[pgid] = user
|
60
|
+
user_pages(user) << pgid if user
|
57
61
|
@registration_times[pgid] = Time.now
|
58
62
|
end
|
59
63
|
|
@@ -65,6 +69,14 @@ module Goat
|
|
65
69
|
@page_versions[pgid]
|
66
70
|
end
|
67
71
|
|
72
|
+
def page_user(pgid)
|
73
|
+
@page_users[pgid]
|
74
|
+
end
|
75
|
+
|
76
|
+
def user_pages(user)
|
77
|
+
@user_pages[user] ||= Set.new
|
78
|
+
end
|
79
|
+
|
68
80
|
def find_page(pgid)
|
69
81
|
@components_by_page[pgid] ||= Set.new
|
70
82
|
end
|
@@ -126,6 +138,10 @@ module Goat
|
|
126
138
|
Goat.logw "(No components for #{pgid})"
|
127
139
|
end
|
128
140
|
|
141
|
+
if user = @page_users[pgid]
|
142
|
+
user_pages(user).delete(pgid)
|
143
|
+
end
|
144
|
+
@page_users.delete(pgid)
|
129
145
|
@page_updates.delete(pgid)
|
130
146
|
@last_connected.delete(pgid)
|
131
147
|
@page_connections.delete(pgid)
|
@@ -180,7 +196,7 @@ module Goat
|
|
180
196
|
|
181
197
|
class Delegate
|
182
198
|
@registry = Registry.new
|
183
|
-
|
199
|
+
|
184
200
|
def self.registry; @registry; end
|
185
201
|
|
186
202
|
class << self
|
@@ -193,7 +209,7 @@ module Goat
|
|
193
209
|
end
|
194
210
|
|
195
211
|
def register_page(msg)
|
196
|
-
ensure_keys(msg, %w{pgid components})
|
212
|
+
ensure_keys(msg, %w{pgid user components})
|
197
213
|
|
198
214
|
pgid = msg['pgid']
|
199
215
|
|
@@ -203,7 +219,7 @@ module Goat
|
|
203
219
|
|
204
220
|
Goat.logd("registered #{msg['components'].count} components")
|
205
221
|
|
206
|
-
@registry.initialize_page(pgid)
|
222
|
+
@registry.initialize_page(pgid, msg['user'])
|
207
223
|
|
208
224
|
nil
|
209
225
|
end
|
@@ -213,7 +229,7 @@ module Goat
|
|
213
229
|
|
214
230
|
# return newest components first
|
215
231
|
@registry.components_by_class(msg['class']).\
|
216
|
-
select{|c| c.
|
232
|
+
select{|c| c.live_spec == msg['spec']}.\
|
217
233
|
select{|c| @registry.connected?(c.pgid) || \
|
218
234
|
@registry.last_connected_delta(c.pgid) < 120 || \
|
219
235
|
@registry.registration_delta(c.pgid) < 20}.\
|
@@ -280,7 +296,7 @@ module Goat
|
|
280
296
|
|
281
297
|
if comp
|
282
298
|
comp.dom = update.skel.dom
|
283
|
-
comp.
|
299
|
+
comp.live_state = update.skel.live_state
|
284
300
|
|
285
301
|
@registry.incr_page_version(comp.pgid)
|
286
302
|
|
@@ -288,7 +304,7 @@ module Goat
|
|
288
304
|
|
289
305
|
@registry.add_update(comp.pgid, txn, update)
|
290
306
|
else
|
291
|
-
$stderr.puts "Couldn't find component #{id}"
|
307
|
+
$stderr.puts "Couldn't find component #{update.skel.id}"
|
292
308
|
end
|
293
309
|
end
|
294
310
|
|
@@ -343,12 +359,30 @@ module Goat
|
|
343
359
|
end
|
344
360
|
|
345
361
|
def run
|
362
|
+
Goat.logd "Garbage collecting. Live objects: #{ObjectSpace.live_objects}"
|
346
363
|
@registry.connected_pages.each do |pgid|
|
347
364
|
if @registry.last_connected_delta(pgid) > (60 * 60)
|
348
365
|
Goat.logd "Deleting page #{pgid}"
|
349
366
|
@registry.delete_page(pgid)
|
367
|
+
else
|
368
|
+
user = @registry.page_user(pgid)
|
369
|
+
if user
|
370
|
+
pgs = @registry.user_pages(user).sort_by {|pg| @registry.last_connected_delta(pg)}
|
371
|
+
if pgs.count > 5
|
372
|
+
pgs[5..-1].each do |pg|
|
373
|
+
if @registry.last_connected_delta(pg) > 10 \
|
374
|
+
&& !@registry.connected?(pg) \
|
375
|
+
&& @registry.registration_delta(pg) > 10
|
376
|
+
Goat.logd "Deleting page #{pg} because user #{user} has too many pages open"
|
377
|
+
@registry.delete_page(pg)
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
350
382
|
end
|
351
383
|
end
|
384
|
+
|
385
|
+
Goat.logd "Done. Live objects: #{ObjectSpace.live_objects}"
|
352
386
|
end
|
353
387
|
end
|
354
388
|
|
data/goat.gemspec
CHANGED
data/lib/goat.rb
CHANGED
@@ -568,7 +568,7 @@ module Goat
|
|
568
568
|
if opts[:live]
|
569
569
|
if skel = StateSrvClient.fetch_component(cid)
|
570
570
|
component = Kernel.fetch_class(cls).from_skel(skel)
|
571
|
-
component.deserialize(skel.
|
571
|
+
component.deserialize(skel.live_state)
|
572
572
|
|
573
573
|
args << component
|
574
574
|
else
|
@@ -784,7 +784,7 @@ module Goat
|
|
784
784
|
c.skel
|
785
785
|
end
|
786
786
|
|
787
|
-
StateSrvClient.register_page(@id, pg_spec)
|
787
|
+
StateSrvClient.register_page(@id, self.user, pg_spec)
|
788
788
|
end
|
789
789
|
|
790
790
|
def _dom; self.dom; end
|
@@ -848,6 +848,8 @@ module Goat
|
|
848
848
|
def erb=(erb); @erb = erb; #TODO make it work properly, but not support embenned components
|
849
849
|
end
|
850
850
|
def title=(title); @title = title; end
|
851
|
+
|
852
|
+
def user; end
|
851
853
|
end
|
852
854
|
|
853
855
|
class PageCanvas
|
@@ -1130,7 +1132,7 @@ module Goat
|
|
1130
1132
|
def self.rerender(skel)
|
1131
1133
|
Profile.in(:create_component)
|
1132
1134
|
c = Kernel.fetch_class(skel.cls).from_skel(skel)
|
1133
|
-
c.deserialize(skel.
|
1135
|
+
c.deserialize(skel.live_state)
|
1134
1136
|
Profile.out(:create_component)
|
1135
1137
|
|
1136
1138
|
c.rerender
|
@@ -1173,12 +1175,12 @@ module Goat
|
|
1173
1175
|
|
1174
1176
|
def skel
|
1175
1177
|
ComponentSkeleton.new(
|
1176
|
-
@pgid,
|
1177
|
-
self.class.name,
|
1178
|
-
@id,
|
1179
|
-
live_spec,
|
1180
|
-
serialize,
|
1181
|
-
@expanded_dom
|
1178
|
+
'pgid' => @pgid,
|
1179
|
+
'class' => self.class.name,
|
1180
|
+
'id' => @id,
|
1181
|
+
'live_spec' => live_spec,
|
1182
|
+
'live_state' => serialize,
|
1183
|
+
'dom' => @expanded_dom
|
1182
1184
|
)
|
1183
1185
|
end
|
1184
1186
|
|
@@ -1192,7 +1194,7 @@ module Goat
|
|
1192
1194
|
@id = skel.id
|
1193
1195
|
@pgid = skel.pgid
|
1194
1196
|
@old_dom = skel.dom
|
1195
|
-
@live_spec = skel.
|
1197
|
+
@live_spec = skel.live_spec
|
1196
1198
|
end
|
1197
1199
|
|
1198
1200
|
def rerender_partially(diff)
|
data/lib/goat/common.rb
CHANGED
@@ -11,33 +11,45 @@ module Goat
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class ComponentSkeleton
|
14
|
-
|
15
|
-
|
14
|
+
def ensure_keys(h, spec)
|
15
|
+
hash = h.clone
|
16
|
+
spec[:required].each do |k|
|
17
|
+
raise "#{k} not present" unless h.include?(k)
|
18
|
+
hash.delete(k)
|
19
|
+
end
|
20
|
+
spec[:optional].each {|k| hash.delete(k)}
|
16
21
|
|
17
|
-
|
22
|
+
raise "Unknown keys supplied: #{hash.keys.join(', ')}" unless hash.keys.empty?
|
23
|
+
end
|
18
24
|
|
19
|
-
def initialize(
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@
|
24
|
-
@dom = dom
|
25
|
-
@spec = spec
|
25
|
+
def initialize(h={})
|
26
|
+
ensure_keys(h,
|
27
|
+
:required => %w{pgid class id live_spec live_state dom}, :optional => []
|
28
|
+
)
|
29
|
+
@hash = h
|
26
30
|
end
|
27
31
|
|
32
|
+
# in which we fail at DRY:
|
33
|
+
def cls; @hash['class']; end
|
34
|
+
def pgid; @hash['pgid']; end
|
35
|
+
def id; @hash['id']; end
|
36
|
+
def live_spec; @hash['live_spec']; end
|
37
|
+
def live_state; @hash['live_state']; end
|
38
|
+
def dom; @hash['dom']; end
|
39
|
+
|
40
|
+
def dom=(d); @hash['dom'] = d; end
|
41
|
+
def live_state=(s); @hash['live_state'] = s; end
|
42
|
+
|
28
43
|
def self.from_hash(h)
|
29
|
-
|
44
|
+
hash = h.clone
|
45
|
+
hash['dom'] = Marshal.load(h['dom'])
|
46
|
+
self.new(hash)
|
30
47
|
end
|
31
48
|
|
32
49
|
def to_hash
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
'id' => @id,
|
37
|
-
'spec' => @spec,
|
38
|
-
'state' => @state,
|
39
|
-
'dom' => Marshal.dump(@dom),
|
40
|
-
}
|
50
|
+
hash = @hash.clone
|
51
|
+
hash['dom'] = Marshal.dump(@hash['dom'])
|
52
|
+
hash
|
41
53
|
end
|
42
54
|
end
|
43
55
|
|
data/lib/goat/state-srv.rb
CHANGED
@@ -10,8 +10,8 @@ module Goat
|
|
10
10
|
StateSrvConnection.send_message(type, m, sync)
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.register_page(pgid, cs)
|
14
|
-
send_message('register_page', 'pgid' => pgid, 'components' => cs.map(&:to_hash))
|
13
|
+
def self.register_page(pgid, user, cs)
|
14
|
+
send_message('register_page', 'pgid' => pgid, 'user' => user, 'components' => cs.map(&:to_hash))
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.live_components(cls, spec)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 41
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 29
|
10
|
+
version: 0.3.29
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Patrick Collison
|