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 +4 -4
- data/bin/seapig-worker +18 -42
- data/lib/seapig/client.rb +44 -11
- data/lib/seapig/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40e03252696dd652e32f57c27c9eb21bc5b46305
|
4
|
+
data.tar.gz: 57da37b0536d9ce54d22d08b697140d7828bf59c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 '
|
4
|
-
require 'json'
|
5
|
-
require 'jsondiff'
|
3
|
+
require 'seapig-client'
|
6
4
|
|
7
5
|
|
8
6
|
class Producer
|
9
7
|
|
10
|
-
|
11
|
-
|
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
|
-
|
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
|
-
|
25
|
+
EM.run {
|
40
26
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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
|
|
data/lib/seapig/version.rb
CHANGED
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
|
+
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-
|
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
|