seapig-client 0.0.4 → 0.0.5

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 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