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