datawire_mdk 2.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 +7 -0
- data/lib/datawire-quark-core.rb +1213 -0
- data/lib/datawire_mdk_md.rb +54752 -0
- data/lib/mdk.rb +962 -0
- data/lib/mdk_discovery.rb +1518 -0
- data/lib/mdk_discovery/protocol.rb +818 -0
- data/lib/mdk_discovery/synapse.rb +267 -0
- data/lib/mdk_introspection.rb +281 -0
- data/lib/mdk_introspection/aws.rb +101 -0
- data/lib/mdk_introspection/kubernetes.rb +125 -0
- data/lib/mdk_protocol.rb +1255 -0
- data/lib/mdk_runtime.rb +2135 -0
- data/lib/mdk_runtime/actors.rb +457 -0
- data/lib/mdk_runtime/files.rb +575 -0
- data/lib/mdk_runtime/promise.rb +814 -0
- data/lib/mdk_tracing.rb +369 -0
- data/lib/mdk_tracing/api.rb +188 -0
- data/lib/mdk_tracing/protocol.rb +850 -0
- data/lib/mdk_util.rb +141 -0
- data/lib/quark.rb +3684 -0
- data/lib/quark/behaviors.rb +494 -0
- data/lib/quark/concurrent.rb +1250 -0
- data/lib/quark/error.rb +84 -0
- data/lib/quark/logging.rb +278 -0
- data/lib/quark/mock.rb +1223 -0
- data/lib/quark/os.rb +286 -0
- data/lib/quark/reflect.rb +489 -0
- data/lib/quark/spi.rb +130 -0
- data/lib/quark/spi_api.rb +489 -0
- data/lib/quark/spi_api_tracing.rb +1426 -0
- data/lib/quark/test.rb +766 -0
- metadata +142 -0
@@ -0,0 +1,101 @@
|
|
1
|
+
# Quark 1.0.406 run at 2016-08-31 13:21:53.028839
|
2
|
+
module Quark
|
3
|
+
require "quark"
|
4
|
+
def self.mdk_introspection; MdkIntrospection; end
|
5
|
+
module MdkIntrospection
|
6
|
+
def self.aws; Aws; end
|
7
|
+
module Aws
|
8
|
+
require "datawire-quark-core"
|
9
|
+
require_relative '../quark/reflect' # 0 ('quark',) ('mdk_introspection',)
|
10
|
+
require_relative '../mdk_introspection' # 0 () ('mdk_introspection',)
|
11
|
+
require_relative '../mdk_runtime' # 0 () ('mdk_introspection',)
|
12
|
+
require_relative '../datawire_mdk_md' # 0 () ('mdk_introspection',)
|
13
|
+
|
14
|
+
|
15
|
+
def self.Ec2Host; Ec2Host; end
|
16
|
+
class Ec2Host < ::DatawireQuarkCore::QuarkObject
|
17
|
+
attr_accessor :scope, :env
|
18
|
+
extend ::DatawireQuarkCore::Static
|
19
|
+
|
20
|
+
static mdk_introspection_aws_Ec2Host_ref: -> { nil }
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
def initialize(env, scope)
|
25
|
+
|
26
|
+
self.__init_fields__
|
27
|
+
(self).scope = (scope).upcase
|
28
|
+
(self).env = env
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def self.metadataHost(env)
|
37
|
+
|
38
|
+
return env.var("DATAWIRE_METADATA_HOST_OVERRIDE").orElseGet("169.254.169.254")
|
39
|
+
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def get()
|
44
|
+
|
45
|
+
if ((@scope) == ("INTERNAL"))
|
46
|
+
return ::DatawireQuarkCore.url_get((("http://") + (::Quark.mdk_introspection.aws.Ec2Host.metadataHost(@env))) + ("/latest/meta-data/local-hostname"))
|
47
|
+
end
|
48
|
+
if ((@scope) == ("PUBLIC"))
|
49
|
+
return ::DatawireQuarkCore.url_get((("http://") + (::Quark.mdk_introspection.aws.Ec2Host.metadataHost(@env))) + ("/latest/meta-data/public-hostname"))
|
50
|
+
end
|
51
|
+
return ::DatawireQuarkCore.cast(nil) { ::String }
|
52
|
+
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def _getClass()
|
57
|
+
|
58
|
+
return "mdk_introspection.aws.Ec2Host"
|
59
|
+
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def _getField(name)
|
64
|
+
|
65
|
+
if ((name) == ("scope"))
|
66
|
+
return (self).scope
|
67
|
+
end
|
68
|
+
if ((name) == ("env"))
|
69
|
+
return (self).env
|
70
|
+
end
|
71
|
+
return nil
|
72
|
+
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def _setField(name, value)
|
77
|
+
|
78
|
+
if ((name) == ("scope"))
|
79
|
+
(self).scope = ::DatawireQuarkCore.cast(value) { ::String }
|
80
|
+
end
|
81
|
+
if ((name) == ("env"))
|
82
|
+
(self).env = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.EnvironmentVariables }
|
83
|
+
end
|
84
|
+
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
|
88
|
+
def __init_fields__()
|
89
|
+
|
90
|
+
self.scope = nil
|
91
|
+
self.env = nil
|
92
|
+
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
end
|
98
|
+
Ec2Host.unlazy_statics
|
99
|
+
end # module Aws
|
100
|
+
end # module MdkIntrospection
|
101
|
+
end # module Quark
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# Quark 1.0.406 run at 2016-08-31 13:21:53.028839
|
2
|
+
module Quark
|
3
|
+
require "quark"
|
4
|
+
def self.mdk_introspection; MdkIntrospection; end
|
5
|
+
module MdkIntrospection
|
6
|
+
def self.kubernetes; Kubernetes; end
|
7
|
+
module Kubernetes
|
8
|
+
require "datawire-quark-core"
|
9
|
+
require_relative '../quark/reflect' # 0 ('quark',) ('mdk_introspection',)
|
10
|
+
require_relative '../mdk_introspection' # 0 () ('mdk_introspection',)
|
11
|
+
require_relative '../datawire_mdk_md' # 0 () ('mdk_introspection',)
|
12
|
+
|
13
|
+
|
14
|
+
def self.KubernetesHost; KubernetesHost; end
|
15
|
+
class KubernetesHost < ::DatawireQuarkCore::QuarkObject
|
16
|
+
extend ::DatawireQuarkCore::Static
|
17
|
+
|
18
|
+
static mdk_introspection_kubernetes_KubernetesHost_ref: -> { nil }
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
def initialize()
|
23
|
+
self.__init_fields__
|
24
|
+
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
def get()
|
32
|
+
|
33
|
+
return ::DatawireQuarkCore.cast(nil) { ::String }
|
34
|
+
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def _getClass()
|
39
|
+
|
40
|
+
return "mdk_introspection.kubernetes.KubernetesHost"
|
41
|
+
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def _getField(name)
|
46
|
+
|
47
|
+
return nil
|
48
|
+
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def _setField(name, value)
|
53
|
+
|
54
|
+
nil
|
55
|
+
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def __init_fields__()
|
60
|
+
|
61
|
+
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end
|
67
|
+
KubernetesHost.unlazy_statics
|
68
|
+
|
69
|
+
def self.KubernetesPort; KubernetesPort; end
|
70
|
+
class KubernetesPort < ::DatawireQuarkCore::QuarkObject
|
71
|
+
extend ::DatawireQuarkCore::Static
|
72
|
+
|
73
|
+
static mdk_introspection_kubernetes_KubernetesPort_ref: -> { nil }
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
def initialize()
|
78
|
+
self.__init_fields__
|
79
|
+
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
def get()
|
87
|
+
|
88
|
+
return ::DatawireQuarkCore.cast(nil) { ::Integer }
|
89
|
+
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
|
93
|
+
def _getClass()
|
94
|
+
|
95
|
+
return "mdk_introspection.kubernetes.KubernetesPort"
|
96
|
+
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
def _getField(name)
|
101
|
+
|
102
|
+
return nil
|
103
|
+
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
|
107
|
+
def _setField(name, value)
|
108
|
+
|
109
|
+
nil
|
110
|
+
|
111
|
+
nil
|
112
|
+
end
|
113
|
+
|
114
|
+
def __init_fields__()
|
115
|
+
|
116
|
+
|
117
|
+
nil
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
end
|
122
|
+
KubernetesPort.unlazy_statics
|
123
|
+
end # module Kubernetes
|
124
|
+
end # module MdkIntrospection
|
125
|
+
end # module Quark
|
data/lib/mdk_protocol.rb
ADDED
@@ -0,0 +1,1255 @@
|
|
1
|
+
# Quark 1.0.406 run at 2016-08-31 13:21:53.028839
|
2
|
+
module Quark
|
3
|
+
require "quark"
|
4
|
+
def self.mdk_protocol; MdkProtocol; end
|
5
|
+
module MdkProtocol
|
6
|
+
require "datawire-quark-core"
|
7
|
+
require_relative 'quark/reflect' # 0 ('quark',) ()
|
8
|
+
require_relative 'datawire_mdk_md' # 0 () ()
|
9
|
+
require_relative 'quark' # 0 () ()
|
10
|
+
require_relative 'quark/concurrent' # 0 ('quark',) ()
|
11
|
+
require_relative 'mdk_runtime/actors' # 0 ('mdk_runtime',) ()
|
12
|
+
require_relative 'mdk_runtime' # 0 () ()
|
13
|
+
require_relative 'quark/error' # 0 ('quark',) ()
|
14
|
+
|
15
|
+
|
16
|
+
def self.Discriminator; Discriminator; end
|
17
|
+
class Discriminator < ::DatawireQuarkCore::QuarkObject
|
18
|
+
attr_accessor :values
|
19
|
+
extend ::DatawireQuarkCore::Static
|
20
|
+
|
21
|
+
static mdk_protocol_Discriminator_ref: -> { nil }
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
def initialize(values)
|
26
|
+
|
27
|
+
self.__init_fields__
|
28
|
+
(self).values = values
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def matches(value)
|
37
|
+
|
38
|
+
idx = 0
|
39
|
+
while ((idx) < ((@values).size)) do
|
40
|
+
if ((value) == ((@values)[idx]))
|
41
|
+
return true
|
42
|
+
end
|
43
|
+
idx = (idx) + (1)
|
44
|
+
end
|
45
|
+
return false
|
46
|
+
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def _getClass()
|
51
|
+
|
52
|
+
return "mdk_protocol.Discriminator"
|
53
|
+
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def _getField(name)
|
58
|
+
|
59
|
+
if ((name) == ("values"))
|
60
|
+
return (self).values
|
61
|
+
end
|
62
|
+
return nil
|
63
|
+
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def _setField(name, value)
|
68
|
+
|
69
|
+
if ((name) == ("values"))
|
70
|
+
(self).values = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
|
71
|
+
end
|
72
|
+
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def __init_fields__()
|
77
|
+
|
78
|
+
self.values = nil
|
79
|
+
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
end
|
85
|
+
Discriminator.unlazy_statics
|
86
|
+
|
87
|
+
def self.anyof(values)
|
88
|
+
|
89
|
+
return ::Quark.mdk_protocol.Discriminator.new(values)
|
90
|
+
|
91
|
+
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.Serializable; Serializable; end
|
96
|
+
class Serializable < ::DatawireQuarkCore::QuarkObject
|
97
|
+
extend ::DatawireQuarkCore::Static
|
98
|
+
|
99
|
+
static mdk_protocol_Serializable_ref: -> { nil }
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
def initialize()
|
104
|
+
self.__init_fields__
|
105
|
+
|
106
|
+
nil
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
##
|
113
|
+
# The given class must have a construct() static method that takes the JSON-encoded type,
|
114
|
+
# or a constructor that takes no arguments.
|
115
|
+
#
|
116
|
+
|
117
|
+
def self.decodeClass(clazz, encoded)
|
118
|
+
|
119
|
+
json = ::DatawireQuarkCore::JSONObject.parse(encoded)
|
120
|
+
type = (json).getObjectItem("type").getString()
|
121
|
+
meth = clazz.getMethod("construct")
|
122
|
+
obj = nil
|
123
|
+
if ((meth) != (nil))
|
124
|
+
obj = ::DatawireQuarkCore.cast(meth.invoke(nil, ::DatawireQuarkCore::List.new([type]))) { ::Quark.mdk_protocol.Serializable }
|
125
|
+
if ((obj) == (nil))
|
126
|
+
logger = ::Quark.quark._getLogger("protocol")
|
127
|
+
logger.warn(((((clazz.getName()) + (".")) + (meth.getName())) + (" could not understand this json: ")) + (encoded))
|
128
|
+
return ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_protocol.Serializable }
|
129
|
+
end
|
130
|
+
clazz = ::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(obj))
|
131
|
+
else
|
132
|
+
obj = ::DatawireQuarkCore.cast(clazz.construct(::DatawireQuarkCore::List.new([]))) { ::Quark.mdk_protocol.Serializable }
|
133
|
+
if ((obj) == (nil))
|
134
|
+
raise (((("could not construct ") + (clazz.getName())) + (" from this json: ")) + (encoded))
|
135
|
+
end
|
136
|
+
end
|
137
|
+
::Quark.quark.fromJSON(clazz, obj, json)
|
138
|
+
return obj
|
139
|
+
|
140
|
+
nil
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.decodeClassName(name, encoded)
|
144
|
+
|
145
|
+
return ::Quark.mdk_protocol.Serializable.decodeClass(::Quark.quark.reflect.QuarkClass.get(name), encoded)
|
146
|
+
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def encode()
|
151
|
+
|
152
|
+
clazz = ::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(self))
|
153
|
+
json = ::Quark.quark.toJSON(self, clazz)
|
154
|
+
desc = ::DatawireQuarkCore.cast((self)._getField("_discriminator")) { ::Quark.mdk_protocol.Discriminator }
|
155
|
+
if ((desc) != (nil))
|
156
|
+
(json).setObjectItem(("type"), (::DatawireQuarkCore::JSONObject.new.setString(((desc).values)[0])))
|
157
|
+
end
|
158
|
+
encoded = json.toString()
|
159
|
+
return encoded
|
160
|
+
|
161
|
+
nil
|
162
|
+
end
|
163
|
+
|
164
|
+
def _getClass()
|
165
|
+
|
166
|
+
return "mdk_protocol.Serializable"
|
167
|
+
|
168
|
+
nil
|
169
|
+
end
|
170
|
+
|
171
|
+
def _getField(name)
|
172
|
+
|
173
|
+
return nil
|
174
|
+
|
175
|
+
nil
|
176
|
+
end
|
177
|
+
|
178
|
+
def _setField(name, value)
|
179
|
+
|
180
|
+
nil
|
181
|
+
|
182
|
+
nil
|
183
|
+
end
|
184
|
+
|
185
|
+
def __init_fields__()
|
186
|
+
|
187
|
+
|
188
|
+
nil
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
end
|
193
|
+
Serializable.unlazy_statics
|
194
|
+
|
195
|
+
def self.LamportClock; LamportClock; end
|
196
|
+
##
|
197
|
+
# A Lamport Clock is a logical structure meant to allow partial causal ordering. Ours is a list of
|
198
|
+
# integers such that adding an integer implies adding a new level to the causality tree.
|
199
|
+
#
|
200
|
+
# Within a level, time is indicated by incrementing the clock, so
|
201
|
+
#
|
202
|
+
# [1,2,3] comes before [1,2,4] which comes before [1,2,5]
|
203
|
+
#
|
204
|
+
# Adding an element to the clock implies causality, so [1,2,4,1-N] is _by definition_ a sequence that was
|
205
|
+
# _caused by_ the sequence of [1,2,1-3].
|
206
|
+
#
|
207
|
+
# Note that LamportClock is lowish-level support. SharedContext puts some more structure around this, too.
|
208
|
+
#
|
209
|
+
|
210
|
+
class LamportClock < ::Quark.mdk_protocol.Serializable
|
211
|
+
attr_accessor :_mutex, :clocks
|
212
|
+
extend ::DatawireQuarkCore::Static
|
213
|
+
|
214
|
+
static quark_List_quark_int__ref: -> { nil }
|
215
|
+
static mdk_protocol_LamportClock_ref: -> { nil }
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
def initialize()
|
220
|
+
|
221
|
+
super()
|
222
|
+
|
223
|
+
nil
|
224
|
+
end
|
225
|
+
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
def self.decode(encoded)
|
230
|
+
|
231
|
+
return ::DatawireQuarkCore.cast(::Quark.mdk_protocol.Serializable.decodeClassName("mdk_protocol.LamportClock", encoded)) { ::Quark.mdk_protocol.LamportClock }
|
232
|
+
|
233
|
+
nil
|
234
|
+
end
|
235
|
+
|
236
|
+
##
|
237
|
+
# Return a neatly-formatted list of all of our clock elements (e.g. 1,2,4,1) for use as a name or
|
238
|
+
# a key.
|
239
|
+
#
|
240
|
+
|
241
|
+
def key()
|
242
|
+
|
243
|
+
@_mutex.acquire()
|
244
|
+
tmp = ::DatawireQuarkCore::List.new([])
|
245
|
+
i = 0
|
246
|
+
while ((i) < (((self).clocks).size)) do
|
247
|
+
(tmp) << ((((self).clocks)[i]).to_s)
|
248
|
+
i = (i) + (1)
|
249
|
+
end
|
250
|
+
str = (tmp).join(",")
|
251
|
+
@_mutex.release()
|
252
|
+
return str
|
253
|
+
|
254
|
+
nil
|
255
|
+
end
|
256
|
+
|
257
|
+
def toString()
|
258
|
+
|
259
|
+
@_mutex.acquire()
|
260
|
+
str = (("<LamportClock ") + (self.key())) + (">")
|
261
|
+
@_mutex.release()
|
262
|
+
return str
|
263
|
+
|
264
|
+
nil
|
265
|
+
end
|
266
|
+
|
267
|
+
##
|
268
|
+
# Enter a new level of causality. Returns the value to pass to later pass to leave to get back to the
|
269
|
+
# current level of causality.
|
270
|
+
#
|
271
|
+
|
272
|
+
def enter()
|
273
|
+
|
274
|
+
@_mutex.acquire()
|
275
|
+
current = -(1)
|
276
|
+
((self).clocks) << (0)
|
277
|
+
current = ((self).clocks).size
|
278
|
+
@_mutex.release()
|
279
|
+
return current
|
280
|
+
|
281
|
+
nil
|
282
|
+
end
|
283
|
+
|
284
|
+
##
|
285
|
+
# Leave deeper levels of causality. popTo should be the value returned when you enter()d this level.
|
286
|
+
#
|
287
|
+
|
288
|
+
def leave(popTo)
|
289
|
+
|
290
|
+
@_mutex.acquire()
|
291
|
+
current = -(1)
|
292
|
+
(self).clocks = ::Quark.quark.ListUtil.new().slice((self).clocks, 0, popTo)
|
293
|
+
current = ((self).clocks).size
|
294
|
+
@_mutex.release()
|
295
|
+
return current
|
296
|
+
|
297
|
+
nil
|
298
|
+
end
|
299
|
+
|
300
|
+
##
|
301
|
+
# Increment the clock for our current level of causality (which is always the last element in the list).
|
302
|
+
# If there are no elements in our clock, do nothing.
|
303
|
+
#
|
304
|
+
|
305
|
+
def tick()
|
306
|
+
|
307
|
+
@_mutex.acquire()
|
308
|
+
current = ((self).clocks).size
|
309
|
+
if ((current) > (0))
|
310
|
+
((self).clocks)[(current) - (1)] = ((((self).clocks)[(current) - (1)]) + (1))
|
311
|
+
end
|
312
|
+
@_mutex.release()
|
313
|
+
|
314
|
+
nil
|
315
|
+
end
|
316
|
+
|
317
|
+
def _getClass()
|
318
|
+
|
319
|
+
return "mdk_protocol.LamportClock"
|
320
|
+
|
321
|
+
nil
|
322
|
+
end
|
323
|
+
|
324
|
+
def _getField(name)
|
325
|
+
|
326
|
+
if ((name) == ("_mutex"))
|
327
|
+
return (self)._mutex
|
328
|
+
end
|
329
|
+
if ((name) == ("clocks"))
|
330
|
+
return (self).clocks
|
331
|
+
end
|
332
|
+
return nil
|
333
|
+
|
334
|
+
nil
|
335
|
+
end
|
336
|
+
|
337
|
+
def _setField(name, value)
|
338
|
+
|
339
|
+
if ((name) == ("_mutex"))
|
340
|
+
(self)._mutex = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::Lock }
|
341
|
+
end
|
342
|
+
if ((name) == ("clocks"))
|
343
|
+
(self).clocks = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
|
344
|
+
end
|
345
|
+
|
346
|
+
nil
|
347
|
+
end
|
348
|
+
|
349
|
+
def __init_fields__()
|
350
|
+
|
351
|
+
super
|
352
|
+
self._mutex = ::DatawireQuarkCore::Lock.new()
|
353
|
+
self.clocks = ::DatawireQuarkCore::List.new([])
|
354
|
+
|
355
|
+
nil
|
356
|
+
end
|
357
|
+
|
358
|
+
|
359
|
+
end
|
360
|
+
LamportClock.unlazy_statics
|
361
|
+
|
362
|
+
def self.SharedContext; SharedContext; end
|
363
|
+
class SharedContext < ::Quark.mdk_protocol.Serializable
|
364
|
+
attr_accessor :traceId, :clock, :properties, :_lastEntry
|
365
|
+
extend ::DatawireQuarkCore::Static
|
366
|
+
|
367
|
+
static mdk_protocol_SharedContext_ref: -> { nil }
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
def initialize()
|
372
|
+
|
373
|
+
super()
|
374
|
+
(self)._lastEntry = (self).clock.enter()
|
375
|
+
|
376
|
+
nil
|
377
|
+
end
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
|
382
|
+
##
|
383
|
+
# Set the traceId for this SharedContext.
|
384
|
+
|
385
|
+
def withTraceId(traceId)
|
386
|
+
|
387
|
+
(self).traceId = traceId
|
388
|
+
return self
|
389
|
+
|
390
|
+
nil
|
391
|
+
end
|
392
|
+
|
393
|
+
def self.decode(encoded)
|
394
|
+
|
395
|
+
return ::DatawireQuarkCore.cast(::Quark.mdk_protocol.Serializable.decodeClassName("mdk_protocol.SharedContext", encoded)) { ::Quark.mdk_protocol.SharedContext }
|
396
|
+
|
397
|
+
nil
|
398
|
+
end
|
399
|
+
|
400
|
+
def clockStr(pfx)
|
401
|
+
|
402
|
+
cs = ""
|
403
|
+
if (((self).clock) != (nil))
|
404
|
+
cs = (pfx) + ((self).clock.key())
|
405
|
+
end
|
406
|
+
return cs
|
407
|
+
|
408
|
+
nil
|
409
|
+
end
|
410
|
+
|
411
|
+
def key()
|
412
|
+
|
413
|
+
return ((self).traceId) + (self.clockStr(":"))
|
414
|
+
|
415
|
+
nil
|
416
|
+
end
|
417
|
+
|
418
|
+
def toString()
|
419
|
+
|
420
|
+
return ((("<SCTX t:") + ((self).traceId)) + (self.clockStr(" c:"))) + (">")
|
421
|
+
|
422
|
+
nil
|
423
|
+
end
|
424
|
+
|
425
|
+
##
|
426
|
+
# Tick the clock at our current causality level.
|
427
|
+
#
|
428
|
+
|
429
|
+
def tick()
|
430
|
+
|
431
|
+
(self).clock.tick()
|
432
|
+
|
433
|
+
nil
|
434
|
+
end
|
435
|
+
|
436
|
+
##
|
437
|
+
# Return a SharedContext one level deeper in causality.
|
438
|
+
#
|
439
|
+
# NOTE WELL: THIS RETURNS A NEW SharedContext RATHER THAN MODIFYING THIS ONE. It is NOT SUPPORTED
|
440
|
+
# to modify the causality level of a SharedContext in place.
|
441
|
+
#
|
442
|
+
|
443
|
+
def start_span()
|
444
|
+
|
445
|
+
self.tick()
|
446
|
+
newContext = ::Quark.mdk_protocol.SharedContext.decode(self.encode())
|
447
|
+
(newContext)._lastEntry = (newContext).clock.enter()
|
448
|
+
return newContext
|
449
|
+
|
450
|
+
nil
|
451
|
+
end
|
452
|
+
|
453
|
+
##
|
454
|
+
# Return a SharedContext one level higher in causality. In practice, most callers should probably stop
|
455
|
+
# using this context, and the new one, after calling this method.
|
456
|
+
#
|
457
|
+
# NOTE WELL: THIS RETURNS A NEW SharedContext RATHER THAN MODIFYING THIS ONE. It is NOT SUPPORTED
|
458
|
+
# to modify the causality level of a SharedContext in place.
|
459
|
+
#
|
460
|
+
|
461
|
+
def finish_span()
|
462
|
+
|
463
|
+
newContext = ::Quark.mdk_protocol.SharedContext.decode(self.encode())
|
464
|
+
(newContext)._lastEntry = (newContext).clock.leave((newContext)._lastEntry)
|
465
|
+
return newContext
|
466
|
+
|
467
|
+
nil
|
468
|
+
end
|
469
|
+
|
470
|
+
##
|
471
|
+
# Return a copy of a SharedContext.
|
472
|
+
|
473
|
+
def copy()
|
474
|
+
|
475
|
+
return ::Quark.mdk_protocol.SharedContext.decode(self.encode())
|
476
|
+
|
477
|
+
nil
|
478
|
+
end
|
479
|
+
|
480
|
+
def _getClass()
|
481
|
+
|
482
|
+
return "mdk_protocol.SharedContext"
|
483
|
+
|
484
|
+
nil
|
485
|
+
end
|
486
|
+
|
487
|
+
def _getField(name)
|
488
|
+
|
489
|
+
if ((name) == ("traceId"))
|
490
|
+
return (self).traceId
|
491
|
+
end
|
492
|
+
if ((name) == ("clock"))
|
493
|
+
return (self).clock
|
494
|
+
end
|
495
|
+
if ((name) == ("properties"))
|
496
|
+
return (self).properties
|
497
|
+
end
|
498
|
+
if ((name) == ("_lastEntry"))
|
499
|
+
return (self)._lastEntry
|
500
|
+
end
|
501
|
+
return nil
|
502
|
+
|
503
|
+
nil
|
504
|
+
end
|
505
|
+
|
506
|
+
def _setField(name, value)
|
507
|
+
|
508
|
+
if ((name) == ("traceId"))
|
509
|
+
(self).traceId = ::DatawireQuarkCore.cast(value) { ::String }
|
510
|
+
end
|
511
|
+
if ((name) == ("clock"))
|
512
|
+
(self).clock = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.LamportClock }
|
513
|
+
end
|
514
|
+
if ((name) == ("properties"))
|
515
|
+
(self).properties = ::DatawireQuarkCore.cast(value) { ::Hash }
|
516
|
+
end
|
517
|
+
if ((name) == ("_lastEntry"))
|
518
|
+
(self)._lastEntry = ::DatawireQuarkCore.cast(value) { ::Integer }
|
519
|
+
end
|
520
|
+
|
521
|
+
nil
|
522
|
+
end
|
523
|
+
|
524
|
+
def __init_fields__()
|
525
|
+
|
526
|
+
super
|
527
|
+
self.traceId = ::Quark.quark.concurrent.Context.runtime().uuid()
|
528
|
+
self.clock = ::Quark.mdk_protocol.LamportClock.new()
|
529
|
+
self.properties = {}
|
530
|
+
self._lastEntry = 0
|
531
|
+
|
532
|
+
nil
|
533
|
+
end
|
534
|
+
|
535
|
+
|
536
|
+
end
|
537
|
+
SharedContext.unlazy_statics
|
538
|
+
|
539
|
+
def self.ProtocolHandler; ProtocolHandler; end
|
540
|
+
class ProtocolHandler < ::DatawireQuarkCore::QuarkObject
|
541
|
+
extend ::DatawireQuarkCore::Static
|
542
|
+
|
543
|
+
static mdk_protocol_ProtocolHandler_ref: -> { nil }
|
544
|
+
|
545
|
+
|
546
|
+
|
547
|
+
def initialize()
|
548
|
+
self.__init_fields__
|
549
|
+
|
550
|
+
nil
|
551
|
+
end
|
552
|
+
|
553
|
+
|
554
|
+
|
555
|
+
|
556
|
+
def onOpen(open)
|
557
|
+
raise NotImplementedError, '`ProtocolHandler.onOpen` is an abstract method'
|
558
|
+
|
559
|
+
nil
|
560
|
+
end
|
561
|
+
|
562
|
+
def onClose(close)
|
563
|
+
raise NotImplementedError, '`ProtocolHandler.onClose` is an abstract method'
|
564
|
+
|
565
|
+
nil
|
566
|
+
end
|
567
|
+
|
568
|
+
def __init_fields__()
|
569
|
+
|
570
|
+
|
571
|
+
nil
|
572
|
+
end
|
573
|
+
|
574
|
+
|
575
|
+
end
|
576
|
+
ProtocolHandler.unlazy_statics
|
577
|
+
|
578
|
+
def self.ProtocolEvent; ProtocolEvent; end
|
579
|
+
class ProtocolEvent < ::Quark.mdk_protocol.Serializable
|
580
|
+
extend ::DatawireQuarkCore::Static
|
581
|
+
|
582
|
+
static mdk_protocol_ProtocolEvent_ref: -> { nil }
|
583
|
+
|
584
|
+
|
585
|
+
|
586
|
+
def initialize()
|
587
|
+
|
588
|
+
super()
|
589
|
+
|
590
|
+
nil
|
591
|
+
end
|
592
|
+
|
593
|
+
|
594
|
+
|
595
|
+
|
596
|
+
def self.construct(type)
|
597
|
+
|
598
|
+
if (::Quark.mdk_protocol.Open._discriminator.matches(type))
|
599
|
+
return ::Quark.mdk_protocol.Open.new()
|
600
|
+
end
|
601
|
+
if (::Quark.mdk_protocol.Close._discriminator.matches(type))
|
602
|
+
return ::Quark.mdk_protocol.Close.new()
|
603
|
+
end
|
604
|
+
return ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_protocol.ProtocolEvent }
|
605
|
+
|
606
|
+
nil
|
607
|
+
end
|
608
|
+
|
609
|
+
def dispatch(handler)
|
610
|
+
raise NotImplementedError, '`ProtocolEvent.dispatch` is an abstract method'
|
611
|
+
|
612
|
+
nil
|
613
|
+
end
|
614
|
+
|
615
|
+
def _getClass()
|
616
|
+
|
617
|
+
return "mdk_protocol.ProtocolEvent"
|
618
|
+
|
619
|
+
nil
|
620
|
+
end
|
621
|
+
|
622
|
+
def _getField(name)
|
623
|
+
|
624
|
+
return nil
|
625
|
+
|
626
|
+
nil
|
627
|
+
end
|
628
|
+
|
629
|
+
def _setField(name, value)
|
630
|
+
|
631
|
+
nil
|
632
|
+
|
633
|
+
nil
|
634
|
+
end
|
635
|
+
|
636
|
+
def __init_fields__()
|
637
|
+
|
638
|
+
super
|
639
|
+
|
640
|
+
nil
|
641
|
+
end
|
642
|
+
|
643
|
+
|
644
|
+
end
|
645
|
+
ProtocolEvent.unlazy_statics
|
646
|
+
|
647
|
+
def self.Open; Open; end
|
648
|
+
class Open < ::Quark.mdk_protocol.ProtocolEvent
|
649
|
+
attr_accessor :version, :properties
|
650
|
+
extend ::DatawireQuarkCore::Static
|
651
|
+
|
652
|
+
static _discriminator: -> { ::Quark.mdk_protocol.anyof(::DatawireQuarkCore::List.new(["open", "mdk.protocol.Open", "discovery.protocol.Open"])) }
|
653
|
+
static mdk_protocol_Open_ref: -> { nil }
|
654
|
+
|
655
|
+
|
656
|
+
|
657
|
+
def initialize()
|
658
|
+
|
659
|
+
super()
|
660
|
+
|
661
|
+
nil
|
662
|
+
end
|
663
|
+
|
664
|
+
|
665
|
+
|
666
|
+
|
667
|
+
def dispatch(handler)
|
668
|
+
|
669
|
+
handler.onOpen(self)
|
670
|
+
|
671
|
+
nil
|
672
|
+
end
|
673
|
+
|
674
|
+
def _getClass()
|
675
|
+
|
676
|
+
return "mdk_protocol.Open"
|
677
|
+
|
678
|
+
nil
|
679
|
+
end
|
680
|
+
|
681
|
+
def _getField(name)
|
682
|
+
|
683
|
+
if ((name) == ("_discriminator"))
|
684
|
+
return ::Quark.mdk_protocol.Open._discriminator
|
685
|
+
end
|
686
|
+
if ((name) == ("version"))
|
687
|
+
return (self).version
|
688
|
+
end
|
689
|
+
if ((name) == ("properties"))
|
690
|
+
return (self).properties
|
691
|
+
end
|
692
|
+
return nil
|
693
|
+
|
694
|
+
nil
|
695
|
+
end
|
696
|
+
|
697
|
+
def _setField(name, value)
|
698
|
+
|
699
|
+
if ((name) == ("_discriminator"))
|
700
|
+
::Quark.mdk_protocol.Open._discriminator = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.Discriminator }
|
701
|
+
end
|
702
|
+
if ((name) == ("version"))
|
703
|
+
(self).version = ::DatawireQuarkCore.cast(value) { ::String }
|
704
|
+
end
|
705
|
+
if ((name) == ("properties"))
|
706
|
+
(self).properties = ::DatawireQuarkCore.cast(value) { ::Hash }
|
707
|
+
end
|
708
|
+
|
709
|
+
nil
|
710
|
+
end
|
711
|
+
|
712
|
+
def __init_fields__()
|
713
|
+
|
714
|
+
super
|
715
|
+
self.version = "2.0.0"
|
716
|
+
self.properties = {}
|
717
|
+
|
718
|
+
nil
|
719
|
+
end
|
720
|
+
|
721
|
+
|
722
|
+
end
|
723
|
+
Open.unlazy_statics
|
724
|
+
|
725
|
+
def self.ProtocolError; ProtocolError; end
|
726
|
+
##
|
727
|
+
# A value class for sending error informationto a remote peer.
|
728
|
+
|
729
|
+
class ProtocolError < ::DatawireQuarkCore::QuarkObject
|
730
|
+
attr_accessor :code, :title, :detail, :id
|
731
|
+
extend ::DatawireQuarkCore::Static
|
732
|
+
|
733
|
+
static mdk_protocol_ProtocolError_ref: -> { nil }
|
734
|
+
|
735
|
+
|
736
|
+
|
737
|
+
def initialize()
|
738
|
+
self.__init_fields__
|
739
|
+
|
740
|
+
nil
|
741
|
+
end
|
742
|
+
|
743
|
+
|
744
|
+
|
745
|
+
|
746
|
+
def _getClass()
|
747
|
+
|
748
|
+
return "mdk_protocol.ProtocolError"
|
749
|
+
|
750
|
+
nil
|
751
|
+
end
|
752
|
+
|
753
|
+
def _getField(name)
|
754
|
+
|
755
|
+
if ((name) == ("code"))
|
756
|
+
return (self).code
|
757
|
+
end
|
758
|
+
if ((name) == ("title"))
|
759
|
+
return (self).title
|
760
|
+
end
|
761
|
+
if ((name) == ("detail"))
|
762
|
+
return (self).detail
|
763
|
+
end
|
764
|
+
if ((name) == ("id"))
|
765
|
+
return (self).id
|
766
|
+
end
|
767
|
+
return nil
|
768
|
+
|
769
|
+
nil
|
770
|
+
end
|
771
|
+
|
772
|
+
def _setField(name, value)
|
773
|
+
|
774
|
+
if ((name) == ("code"))
|
775
|
+
(self).code = ::DatawireQuarkCore.cast(value) { ::String }
|
776
|
+
end
|
777
|
+
if ((name) == ("title"))
|
778
|
+
(self).title = ::DatawireQuarkCore.cast(value) { ::String }
|
779
|
+
end
|
780
|
+
if ((name) == ("detail"))
|
781
|
+
(self).detail = ::DatawireQuarkCore.cast(value) { ::String }
|
782
|
+
end
|
783
|
+
if ((name) == ("id"))
|
784
|
+
(self).id = ::DatawireQuarkCore.cast(value) { ::String }
|
785
|
+
end
|
786
|
+
|
787
|
+
nil
|
788
|
+
end
|
789
|
+
|
790
|
+
def __init_fields__()
|
791
|
+
|
792
|
+
self.code = nil
|
793
|
+
self.title = nil
|
794
|
+
self.detail = nil
|
795
|
+
self.id = nil
|
796
|
+
|
797
|
+
nil
|
798
|
+
end
|
799
|
+
|
800
|
+
|
801
|
+
end
|
802
|
+
ProtocolError.unlazy_statics
|
803
|
+
|
804
|
+
def self.Close; Close; end
|
805
|
+
##
|
806
|
+
# Close the event stream.
|
807
|
+
|
808
|
+
class Close < ::Quark.mdk_protocol.ProtocolEvent
|
809
|
+
attr_accessor :error
|
810
|
+
extend ::DatawireQuarkCore::Static
|
811
|
+
|
812
|
+
static _discriminator: -> { ::Quark.mdk_protocol.anyof(::DatawireQuarkCore::List.new(["close", "mdk.protocol.Close", "discovery.protocol.Close"])) }
|
813
|
+
static mdk_protocol_Close_ref: -> { nil }
|
814
|
+
|
815
|
+
|
816
|
+
|
817
|
+
def initialize()
|
818
|
+
|
819
|
+
super()
|
820
|
+
|
821
|
+
nil
|
822
|
+
end
|
823
|
+
|
824
|
+
|
825
|
+
|
826
|
+
|
827
|
+
def dispatch(handler)
|
828
|
+
|
829
|
+
handler.onClose(self)
|
830
|
+
|
831
|
+
nil
|
832
|
+
end
|
833
|
+
|
834
|
+
def _getClass()
|
835
|
+
|
836
|
+
return "mdk_protocol.Close"
|
837
|
+
|
838
|
+
nil
|
839
|
+
end
|
840
|
+
|
841
|
+
def _getField(name)
|
842
|
+
|
843
|
+
if ((name) == ("_discriminator"))
|
844
|
+
return ::Quark.mdk_protocol.Close._discriminator
|
845
|
+
end
|
846
|
+
if ((name) == ("error"))
|
847
|
+
return (self).error
|
848
|
+
end
|
849
|
+
return nil
|
850
|
+
|
851
|
+
nil
|
852
|
+
end
|
853
|
+
|
854
|
+
def _setField(name, value)
|
855
|
+
|
856
|
+
if ((name) == ("_discriminator"))
|
857
|
+
::Quark.mdk_protocol.Close._discriminator = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.Discriminator }
|
858
|
+
end
|
859
|
+
if ((name) == ("error"))
|
860
|
+
(self).error = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.ProtocolError }
|
861
|
+
end
|
862
|
+
|
863
|
+
nil
|
864
|
+
end
|
865
|
+
|
866
|
+
def __init_fields__()
|
867
|
+
|
868
|
+
super
|
869
|
+
self.error = nil
|
870
|
+
|
871
|
+
nil
|
872
|
+
end
|
873
|
+
|
874
|
+
|
875
|
+
end
|
876
|
+
Close.unlazy_statics
|
877
|
+
|
878
|
+
def self.WSClient; WSClient; end
|
879
|
+
##
|
880
|
+
# Common protocol machinery for web socket based protocol clients.
|
881
|
+
|
882
|
+
class WSClient < ::DatawireQuarkCore::QuarkObject
|
883
|
+
attr_accessor :logger, :firstDelay, :maxDelay, :reconnectDelay, :ttl, :tick, :sock, :sockUrl, :lastConnectAttempt, :lastHeartbeat, :timeService, :schedulingActor, :websockets, :dispatcher
|
884
|
+
extend ::DatawireQuarkCore::Static
|
885
|
+
|
886
|
+
static mdk_protocol_WSClient_ref: -> { nil }
|
887
|
+
|
888
|
+
|
889
|
+
|
890
|
+
def initialize(runtime)
|
891
|
+
|
892
|
+
self.__init_fields__
|
893
|
+
(self).dispatcher = (runtime).dispatcher
|
894
|
+
(self).timeService = runtime.getTimeService()
|
895
|
+
(self).schedulingActor = runtime.getScheduleService()
|
896
|
+
(self).websockets = runtime.getWebSocketsService()
|
897
|
+
|
898
|
+
nil
|
899
|
+
end
|
900
|
+
|
901
|
+
|
902
|
+
|
903
|
+
|
904
|
+
def url()
|
905
|
+
raise NotImplementedError, '`WSClient.url` is an abstract method'
|
906
|
+
|
907
|
+
nil
|
908
|
+
end
|
909
|
+
|
910
|
+
def token()
|
911
|
+
raise NotImplementedError, '`WSClient.token` is an abstract method'
|
912
|
+
|
913
|
+
nil
|
914
|
+
end
|
915
|
+
|
916
|
+
def isStarted()
|
917
|
+
raise NotImplementedError, '`WSClient.isStarted` is an abstract method'
|
918
|
+
|
919
|
+
nil
|
920
|
+
end
|
921
|
+
|
922
|
+
def isConnected()
|
923
|
+
|
924
|
+
return (@sock) != (nil)
|
925
|
+
|
926
|
+
nil
|
927
|
+
end
|
928
|
+
|
929
|
+
def schedule(time)
|
930
|
+
|
931
|
+
(self).dispatcher.tell(self, ::Quark.mdk_runtime.Schedule.new("wakeup", time), (self).schedulingActor)
|
932
|
+
|
933
|
+
nil
|
934
|
+
end
|
935
|
+
|
936
|
+
def scheduleReconnect()
|
937
|
+
|
938
|
+
self.schedule(@reconnectDelay)
|
939
|
+
|
940
|
+
nil
|
941
|
+
end
|
942
|
+
|
943
|
+
def onOpen(open)
|
944
|
+
|
945
|
+
nil
|
946
|
+
|
947
|
+
nil
|
948
|
+
end
|
949
|
+
|
950
|
+
def doBackoff()
|
951
|
+
|
952
|
+
@reconnectDelay = (2.0) * (@reconnectDelay)
|
953
|
+
if ((@reconnectDelay) > (@maxDelay))
|
954
|
+
@reconnectDelay = @maxDelay
|
955
|
+
end
|
956
|
+
@logger.info((("backing off, reconnecting in ") + ((@reconnectDelay).to_s)) + (" seconds"))
|
957
|
+
|
958
|
+
nil
|
959
|
+
end
|
960
|
+
|
961
|
+
def onClose(close)
|
962
|
+
|
963
|
+
@logger.info(("close: ") + ((close).to_s))
|
964
|
+
if (((close).error) == (nil))
|
965
|
+
@reconnectDelay = @firstDelay
|
966
|
+
else
|
967
|
+
self.doBackoff()
|
968
|
+
end
|
969
|
+
|
970
|
+
nil
|
971
|
+
end
|
972
|
+
|
973
|
+
def onStart(dispatcher)
|
974
|
+
|
975
|
+
self.schedule(0.0)
|
976
|
+
|
977
|
+
nil
|
978
|
+
end
|
979
|
+
|
980
|
+
def onStop()
|
981
|
+
|
982
|
+
if (self.isConnected())
|
983
|
+
self.shutdown()
|
984
|
+
(self).dispatcher.tell(self, ::Quark.mdk_runtime.WSClose.new(), @sock)
|
985
|
+
@sock = ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_runtime.WSActor }
|
986
|
+
end
|
987
|
+
|
988
|
+
nil
|
989
|
+
end
|
990
|
+
|
991
|
+
def onMessage(origin, message)
|
992
|
+
|
993
|
+
typeId = (::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(message))).id
|
994
|
+
if ((typeId) == ("mdk_runtime.Happening"))
|
995
|
+
self.onScheduledEvent()
|
996
|
+
return
|
997
|
+
end
|
998
|
+
if ((typeId) == ("mdk_runtime.WSClosed"))
|
999
|
+
self.onWSClosed()
|
1000
|
+
return
|
1001
|
+
end
|
1002
|
+
if ((typeId) == ("mdk_runtime.WSMessage"))
|
1003
|
+
wsmessage = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_runtime.WSMessage }
|
1004
|
+
self.onWSMessage((wsmessage).body)
|
1005
|
+
return
|
1006
|
+
end
|
1007
|
+
|
1008
|
+
nil
|
1009
|
+
end
|
1010
|
+
|
1011
|
+
def onScheduledEvent()
|
1012
|
+
|
1013
|
+
rightNow = (((self).timeService.time()) * (1000.0)).round()
|
1014
|
+
heartbeatInterval = (((@ttl) / (2.0)) * (1000.0)).round()
|
1015
|
+
reconnectInterval = ((@reconnectDelay) * (1000.0)).round()
|
1016
|
+
if (self.isConnected())
|
1017
|
+
if (self.isStarted())
|
1018
|
+
self.pump()
|
1019
|
+
if (((rightNow) - (@lastHeartbeat)) >= (heartbeatInterval))
|
1020
|
+
self.doHeartbeat()
|
1021
|
+
end
|
1022
|
+
end
|
1023
|
+
else
|
1024
|
+
if ((self.isStarted()) && (((rightNow) - (@lastConnectAttempt)) >= (reconnectInterval)))
|
1025
|
+
self.doOpen()
|
1026
|
+
end
|
1027
|
+
end
|
1028
|
+
if (self.isStarted())
|
1029
|
+
self.schedule(@tick)
|
1030
|
+
end
|
1031
|
+
|
1032
|
+
nil
|
1033
|
+
end
|
1034
|
+
|
1035
|
+
def doOpen()
|
1036
|
+
|
1037
|
+
self.open(self.url())
|
1038
|
+
@lastConnectAttempt = (((self).timeService.time()) * (1000.0)).round()
|
1039
|
+
|
1040
|
+
nil
|
1041
|
+
end
|
1042
|
+
|
1043
|
+
def doHeartbeat()
|
1044
|
+
|
1045
|
+
self.heartbeat()
|
1046
|
+
@lastHeartbeat = (((self).timeService.time()) * (1000.0)).round()
|
1047
|
+
|
1048
|
+
nil
|
1049
|
+
end
|
1050
|
+
|
1051
|
+
def open(url)
|
1052
|
+
|
1053
|
+
@sockUrl = url
|
1054
|
+
tok = self.token()
|
1055
|
+
if ((tok) != (nil))
|
1056
|
+
url = ((url) + ("?token=")) + (tok)
|
1057
|
+
end
|
1058
|
+
@logger.info(("opening ") + (@sockUrl))
|
1059
|
+
(self).websockets.connect(url, self).andEither(::Quark.quark._BoundMethod.new(self, "onWSConnected", ::DatawireQuarkCore::List.new([])), ::Quark.quark._BoundMethod.new(self, "onWSError", ::DatawireQuarkCore::List.new([])))
|
1060
|
+
|
1061
|
+
nil
|
1062
|
+
end
|
1063
|
+
|
1064
|
+
def startup()
|
1065
|
+
|
1066
|
+
nil
|
1067
|
+
|
1068
|
+
nil
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
def pump()
|
1072
|
+
|
1073
|
+
nil
|
1074
|
+
|
1075
|
+
nil
|
1076
|
+
end
|
1077
|
+
|
1078
|
+
def heartbeat()
|
1079
|
+
|
1080
|
+
nil
|
1081
|
+
|
1082
|
+
nil
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
def shutdown()
|
1086
|
+
|
1087
|
+
nil
|
1088
|
+
|
1089
|
+
nil
|
1090
|
+
end
|
1091
|
+
|
1092
|
+
def onWSMessage(message)
|
1093
|
+
|
1094
|
+
nil
|
1095
|
+
|
1096
|
+
nil
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
def onWSConnected(socket)
|
1100
|
+
|
1101
|
+
@logger.info(((("connected to ") + (@sockUrl)) + (" via ")) + ((socket).to_s))
|
1102
|
+
@reconnectDelay = @firstDelay
|
1103
|
+
@sock = socket
|
1104
|
+
(self).dispatcher.tell(self, ::Quark.mdk_protocol.Open.new().encode(), @sock)
|
1105
|
+
self.startup()
|
1106
|
+
self.pump()
|
1107
|
+
|
1108
|
+
nil
|
1109
|
+
end
|
1110
|
+
|
1111
|
+
def onWSError(error)
|
1112
|
+
|
1113
|
+
@logger.error(("onWSError in protocol! ") + (error.toString()))
|
1114
|
+
self.doBackoff()
|
1115
|
+
|
1116
|
+
nil
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
def onWSClosed()
|
1120
|
+
|
1121
|
+
@logger.info(("closed ") + (@sockUrl))
|
1122
|
+
@sock = ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_runtime.WSActor }
|
1123
|
+
|
1124
|
+
nil
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def _getClass()
|
1128
|
+
|
1129
|
+
return "mdk_protocol.WSClient"
|
1130
|
+
|
1131
|
+
nil
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
def _getField(name)
|
1135
|
+
|
1136
|
+
if ((name) == ("logger"))
|
1137
|
+
return (self).logger
|
1138
|
+
end
|
1139
|
+
if ((name) == ("firstDelay"))
|
1140
|
+
return (self).firstDelay
|
1141
|
+
end
|
1142
|
+
if ((name) == ("maxDelay"))
|
1143
|
+
return (self).maxDelay
|
1144
|
+
end
|
1145
|
+
if ((name) == ("reconnectDelay"))
|
1146
|
+
return (self).reconnectDelay
|
1147
|
+
end
|
1148
|
+
if ((name) == ("ttl"))
|
1149
|
+
return (self).ttl
|
1150
|
+
end
|
1151
|
+
if ((name) == ("tick"))
|
1152
|
+
return (self).tick
|
1153
|
+
end
|
1154
|
+
if ((name) == ("sock"))
|
1155
|
+
return (self).sock
|
1156
|
+
end
|
1157
|
+
if ((name) == ("sockUrl"))
|
1158
|
+
return (self).sockUrl
|
1159
|
+
end
|
1160
|
+
if ((name) == ("lastConnectAttempt"))
|
1161
|
+
return (self).lastConnectAttempt
|
1162
|
+
end
|
1163
|
+
if ((name) == ("lastHeartbeat"))
|
1164
|
+
return (self).lastHeartbeat
|
1165
|
+
end
|
1166
|
+
if ((name) == ("timeService"))
|
1167
|
+
return (self).timeService
|
1168
|
+
end
|
1169
|
+
if ((name) == ("schedulingActor"))
|
1170
|
+
return (self).schedulingActor
|
1171
|
+
end
|
1172
|
+
if ((name) == ("websockets"))
|
1173
|
+
return (self).websockets
|
1174
|
+
end
|
1175
|
+
if ((name) == ("dispatcher"))
|
1176
|
+
return (self).dispatcher
|
1177
|
+
end
|
1178
|
+
return nil
|
1179
|
+
|
1180
|
+
nil
|
1181
|
+
end
|
1182
|
+
|
1183
|
+
def _setField(name, value)
|
1184
|
+
|
1185
|
+
if ((name) == ("logger"))
|
1186
|
+
(self).logger = value
|
1187
|
+
end
|
1188
|
+
if ((name) == ("firstDelay"))
|
1189
|
+
(self).firstDelay = ::DatawireQuarkCore.cast(value) { ::Float }
|
1190
|
+
end
|
1191
|
+
if ((name) == ("maxDelay"))
|
1192
|
+
(self).maxDelay = ::DatawireQuarkCore.cast(value) { ::Float }
|
1193
|
+
end
|
1194
|
+
if ((name) == ("reconnectDelay"))
|
1195
|
+
(self).reconnectDelay = ::DatawireQuarkCore.cast(value) { ::Float }
|
1196
|
+
end
|
1197
|
+
if ((name) == ("ttl"))
|
1198
|
+
(self).ttl = ::DatawireQuarkCore.cast(value) { ::Float }
|
1199
|
+
end
|
1200
|
+
if ((name) == ("tick"))
|
1201
|
+
(self).tick = ::DatawireQuarkCore.cast(value) { ::Float }
|
1202
|
+
end
|
1203
|
+
if ((name) == ("sock"))
|
1204
|
+
(self).sock = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.WSActor }
|
1205
|
+
end
|
1206
|
+
if ((name) == ("sockUrl"))
|
1207
|
+
(self).sockUrl = ::DatawireQuarkCore.cast(value) { ::String }
|
1208
|
+
end
|
1209
|
+
if ((name) == ("lastConnectAttempt"))
|
1210
|
+
(self).lastConnectAttempt = ::DatawireQuarkCore.cast(value) { ::Integer }
|
1211
|
+
end
|
1212
|
+
if ((name) == ("lastHeartbeat"))
|
1213
|
+
(self).lastHeartbeat = ::DatawireQuarkCore.cast(value) { ::Integer }
|
1214
|
+
end
|
1215
|
+
if ((name) == ("timeService"))
|
1216
|
+
(self).timeService = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.Time }
|
1217
|
+
end
|
1218
|
+
if ((name) == ("schedulingActor"))
|
1219
|
+
(self).schedulingActor = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.Actor }
|
1220
|
+
end
|
1221
|
+
if ((name) == ("websockets"))
|
1222
|
+
(self).websockets = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.WebSockets }
|
1223
|
+
end
|
1224
|
+
if ((name) == ("dispatcher"))
|
1225
|
+
(self).dispatcher = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.MessageDispatcher }
|
1226
|
+
end
|
1227
|
+
|
1228
|
+
nil
|
1229
|
+
end
|
1230
|
+
|
1231
|
+
def __init_fields__()
|
1232
|
+
|
1233
|
+
self.logger = ::Quark.quark._getLogger("protocol")
|
1234
|
+
self.firstDelay = 1.0
|
1235
|
+
self.maxDelay = 16.0
|
1236
|
+
self.reconnectDelay = @firstDelay
|
1237
|
+
self.ttl = 30.0
|
1238
|
+
self.tick = 1.0
|
1239
|
+
self.sock = nil
|
1240
|
+
self.sockUrl = nil
|
1241
|
+
self.lastConnectAttempt = 0
|
1242
|
+
self.lastHeartbeat = 0
|
1243
|
+
self.timeService = nil
|
1244
|
+
self.schedulingActor = nil
|
1245
|
+
self.websockets = nil
|
1246
|
+
self.dispatcher = nil
|
1247
|
+
|
1248
|
+
nil
|
1249
|
+
end
|
1250
|
+
|
1251
|
+
|
1252
|
+
end
|
1253
|
+
WSClient.unlazy_statics
|
1254
|
+
end # module MdkProtocol
|
1255
|
+
end # module Quark
|