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