seapig-client 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c85c9742df745b66c263c58793d7651c2e47f081
4
- data.tar.gz: d8f5c63f05b55914e2a2514da60f4a66f64ac717
3
+ metadata.gz: 40e03252696dd652e32f57c27c9eb21bc5b46305
4
+ data.tar.gz: 57da37b0536d9ce54d22d08b697140d7828bf59c
5
5
  SHA512:
6
- metadata.gz: a346602a2e0ac18c9a333685471d0c2125ffd603704a7e76059ec96dc207f0297536ece9acd36effd95a71218a23b8532bfa8a8364cbad470bf55a86853412da
7
- data.tar.gz: e9321722d529bce9ede40dda180bcbafd5deeeee9839ed5c13905bd720770b79b4035b19a7aad4f4ea543aa9ef67c2c168f29d055affe0fe9a47e60f091af20e
6
+ metadata.gz: 466f428a9e0ec11d2adec3595a90ae6abdb1cbd36cd1e06165a95e7658404d431d0f2264d77f08ac7e9b53512804ca4b962425d4fb82fd642efcedcf052c8ef9
7
+ data.tar.gz: d2c93c3b8427851dfea92da95c77f81abea1693294916a27ce25107c6ea6d44cc7f2ab887d344a2f732bad4aca1b05edc3a75a1ba75febb3e8eb31447c58a236
data/bin/seapig-worker CHANGED
@@ -1,28 +1,16 @@
1
1
  #!/bin/env ruby
2
2
 
3
- require 'websocket-eventmachine-client'
4
- require 'json'
5
- require 'jsondiff'
3
+ require 'seapig-client'
6
4
 
7
5
 
8
6
  class Producer
9
7
 
10
- @producers_by_regexp = {}
11
- @patterns = []
12
-
13
- def self.patterns
14
- @patterns
15
- end
16
-
17
-
18
- def self.init
19
- @producers_by_regexp = Hash[*ObjectSpace.each_object(Class).select { |klass| klass < Producer }.map { |klass| klass.patterns.map { |pattern| [Regexp.new(Regexp.escape(pattern).gsub('\*','.*?')), klass] }}.flatten]
20
- @patterns = @producers_by_regexp.values.map { |klass| klass.patterns }.flatten
8
+ class << self
9
+ attr_reader :patterns
21
10
  end
22
11
 
23
-
24
- def self.for(object_id)
25
- @producers_by_regexp.each_pair.find { |pattern,generator| object_id =~ pattern }[1]
12
+ def self.all
13
+ @producers ||= ObjectSpace.each_object(Class).select { |klass| klass < Producer }
26
14
  end
27
15
 
28
16
  end
@@ -31,37 +19,25 @@ end
31
19
  Dir[load_path+'/seapigs/*.rb'].each { |f| require f }
32
20
  }
33
21
 
34
- Producer.init
35
22
 
36
23
 
37
- EM.run {
38
24
 
39
- socket = WebSocket::EventMachine::Client.connect(uri: ARGV[0])
25
+ EM.run {
40
26
 
41
-
42
- socket.onopen {
43
- socket.send(JSON.dump(action: 'client-options-set', options: {name: 'worker'}))
44
- Producer.patterns.each { |pattern|
45
- socket.send JSON.dump(action: 'object-producer-register', pattern: pattern)
27
+ server = SeapigServer.new(ARGV[0], name: 'worker')
28
+
29
+ Producer.all.each { |producer|
30
+ producer.patterns.each { |pattern|
31
+ object = server.master(pattern)
32
+ object.onproduce { |object_id|
33
+ start = Time.new
34
+ puts 'Generating '+object_id
35
+ data,version = producer.produce(object_id)
36
+ object.set(data, version)
37
+ puts 'Generated %25s in %5.2fs'%[object_id, (Time.new-start).to_f]
38
+ }
46
39
  }
47
40
  }
48
41
 
49
-
50
- socket.onmessage { |message|
51
- message = JSON.load message
52
- case message['action']
53
- when 'object-produce'
54
- start = Time.new
55
- object, version = Producer.for(object_id = message['id']).produce(object_id)
56
- puts 'Generated %25s in %5.2fs'%[object_id, (Time.new-start).to_f]
57
- socket.send JSON.dump(action: 'object-patch', id: object_id, old_version: 0, new_version: version, value: object)
58
- end
59
- }
60
-
61
-
62
- socket.onclose { |code, reason|
63
- EM.stop
64
- }
65
-
66
42
  }
67
43
 
data/lib/seapig/client.rb CHANGED
@@ -45,7 +45,6 @@ class SeapigServer
45
45
  }
46
46
  @master_objects.each_pair { |object_id, object|
47
47
  @socket.send JSON.dump(action: 'object-producer-register', pattern: object_id)
48
- object.upload(0, {})
49
48
  }
50
49
  @last_communication_at = Time.new.to_f
51
50
  }
@@ -63,6 +62,7 @@ class SeapigServer
63
62
  object.destroy(message) if object.matches?(message['id'])
64
63
  }
65
64
  when 'object-produce'
65
+ @master_objects[message['id']].onproduce_proc.call(message['id']) if @master_objects[message['id']].onproduce_proc
66
66
  @master_objects[message['id']].upload(0,{}) if @master_objects[message['id']]
67
67
  else
68
68
  p :wtf, message
@@ -71,10 +71,15 @@ class SeapigServer
71
71
  }
72
72
 
73
73
  @socket.onclose { |code, reason|
74
- puts 'Seapig connection died unexpectedly, reconnecting'
74
+ puts 'Seapig connection died unexpectedly (code:'+code.inspect+', reason:'+reason.inspect+'), reconnecting in 1s'
75
+ sleep 1
75
76
  connect
76
77
  }
77
78
 
79
+ @socket.onerror { |error|
80
+ puts 'Seapig error: '+error.inspect
81
+ }
82
+
78
83
  @socket.onping {
79
84
  @last_communication_at = Time.new.to_f
80
85
  }
@@ -82,7 +87,8 @@ class SeapigServer
82
87
  end
83
88
 
84
89
 
85
- def disconnect
90
+
91
+ def disconnect(detach_fd: false)
86
92
  @connected = false
87
93
  if @timeout_timer
88
94
  @timeout_timer.cancel
@@ -90,15 +96,18 @@ class SeapigServer
90
96
  end
91
97
  if @socket
92
98
  @socket.onclose {}
93
- @socket.close
99
+ if detach_fd
100
+ IO.new(@socket.detach).close
101
+ else
102
+ @socket.close
103
+ end
94
104
  @socket = nil
95
105
  end
96
106
  end
97
107
 
98
108
 
99
109
  def detach_fd
100
- @connected = false
101
- IO.new(@socket.detach).close
110
+ disconnect(true)
102
111
  end
103
112
 
104
113
 
@@ -120,7 +129,7 @@ end
120
129
 
121
130
  class SeapigObject < Hash
122
131
 
123
- attr_accessor :version, :object_id, :valid
132
+ attr_accessor :version, :object_id, :valid, :onproduce_proc, :stall
124
133
 
125
134
 
126
135
  def matches?(id)
@@ -132,14 +141,21 @@ class SeapigObject < Hash
132
141
  @server = server
133
142
  @object_id = object_id
134
143
  @version = 0
135
- @onchange = nil
144
+ @onchange_proc = nil
145
+ @onproduce_proc = nil
136
146
  @valid = false
137
147
  @shadow = JSON.load(JSON.dump(self))
148
+ @stall = false
138
149
  end
139
150
 
140
151
 
141
152
  def onchange(&block)
142
- @onchange = block
153
+ @onchange_proc = block
154
+ end
155
+
156
+
157
+ def onproduce(&block)
158
+ @onproduce_proc = block
143
159
  end
144
160
 
145
161
 
@@ -156,10 +172,23 @@ class SeapigObject < Hash
156
172
  Hana::Patch.new(message['patch']).apply(self)
157
173
  @version = message['new_version']
158
174
  @valid = true
159
- @onchange.call(self) if @onchange
175
+ @onchange_proc.call(self) if @onchange_proc
160
176
  end
161
177
 
162
178
 
179
+ def set(data, version)
180
+ if data
181
+ @stall = false
182
+ self.clear
183
+ self.merge!(data)
184
+ @shadow = sanitized
185
+ else
186
+ @stall = true
187
+ end
188
+ @version = version
189
+ end
190
+
191
+
163
192
  def changed
164
193
  old_version = @version
165
194
  old_object = @shadow
@@ -180,8 +209,12 @@ class SeapigObject < Hash
180
209
  action: 'object-patch',
181
210
  old_version: old_version,
182
211
  new_version: @version,
183
- patch: JsonDiff.generate(old_object, @shadow)
184
212
  }
213
+ if old_version == 0 or @stall
214
+ message.merge!(value: (if @stall then false else @shadow end))
215
+ else
216
+ message.merge!(patch: JsonDiff.generate(old_object, @shadow))
217
+ end
185
218
  @server.socket.send JSON.dump(message)
186
219
  end
187
220
 
@@ -1,3 +1,3 @@
1
1
  module Seapig
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seapig-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - yunta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-13 00:00:00.000000000 Z
11
+ date: 2016-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket-eventmachine-client