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 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.spec == msg['spec']}.\
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.state = update.skel.state
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
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'goat'
3
- s.version = '0.3.27'
3
+ s.version = '0.3.29'
4
4
  s.summary = 'Pre-release beta version of Goat'
5
5
  s.author = 'Patrick Collison'
6
6
  s.email = 'patrick@collison.ie'
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.state)
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.state)
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.spec
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
- attr_reader :pgid, :id, :spec
15
- attr_accessor :dom, :state
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
- def cls; @class; end
22
+ raise "Unknown keys supplied: #{hash.keys.join(', ')}" unless hash.keys.empty?
23
+ end
18
24
 
19
- def initialize(pgid, cls, id, spec, state, dom)
20
- @pgid = pgid
21
- @class = cls
22
- @id = id
23
- @state = state
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
- self.new(h['pgid'], h['class'], h['id'], h['spec'], h['state'], Marshal.load(h['dom']))
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
- 'pgid' => @pgid,
35
- 'class' => @class,
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
 
@@ -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: 37
4
+ hash: 41
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 27
10
- version: 0.3.27
9
+ - 29
10
+ version: 0.3.29
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Collison