datawire_mdk 2.0.15 → 2.0.16

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.
@@ -1,4 +1,4 @@
1
- # Quark 1.0.443 run at 2016-10-05 18:08:41.189562
1
+ # Quark 1.0.452 run at 2016-10-13 16:26:58.627837
2
2
  module Quark
3
3
  require "quark"
4
4
  def self.mdk_discovery; MdkDiscovery; end
@@ -1,4 +1,4 @@
1
- # Quark 1.0.443 run at 2016-10-05 18:08:41.189562
1
+ # Quark 1.0.452 run at 2016-10-13 16:26:58.627837
2
2
  module Quark
3
3
  require "quark"
4
4
  def self.mdk_introspection; MdkIntrospection; end
@@ -1,4 +1,4 @@
1
- # Quark 1.0.443 run at 2016-10-05 18:08:41.189562
1
+ # Quark 1.0.452 run at 2016-10-13 16:26:58.627837
2
2
  module Quark
3
3
  require "quark"
4
4
  def self.mdk_introspection; MdkIntrospection; end
@@ -1,4 +1,4 @@
1
- # Quark 1.0.443 run at 2016-10-05 18:08:41.189562
1
+ # Quark 1.0.452 run at 2016-10-13 16:26:58.627837
2
2
  module Quark
3
3
  require "quark"
4
4
  def self.mdk_introspection; MdkIntrospection; end
data/lib/mdk_protocol.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Quark 1.0.443 run at 2016-10-05 18:08:41.189562
1
+ # Quark 1.0.452 run at 2016-10-13 16:26:58.627837
2
2
  module Quark
3
3
  require "quark"
4
4
  def self.mdk_protocol; MdkProtocol; end
@@ -12,86 +12,32 @@ require_relative 'mdk_runtime' # 0 () ()
12
12
  require_relative 'quark/error' # 0 ('quark',) ()
13
13
 
14
14
 
15
- def self.Discriminator; Discriminator; end
16
- class Discriminator < ::DatawireQuarkCore::QuarkObject
17
- attr_accessor :values
18
- extend ::DatawireQuarkCore::Static
19
-
20
- static mdk_protocol_Discriminator_ref: -> { nil }
21
-
22
-
23
-
24
- def initialize(values)
25
-
26
- self.__init_fields__
27
- (self).values = values
28
-
29
- nil
30
- end
31
-
32
-
33
-
34
-
35
- def matches(value)
36
-
37
- idx = 0
38
- while ((idx) < ((@values).size)) do
39
- if ((value) == ((@values)[idx]))
40
- return true
41
- end
42
- idx = (idx) + (1)
43
- end
44
- return false
45
-
46
- nil
47
- end
48
-
49
- def _getClass()
50
-
51
- return "mdk_protocol.Discriminator"
52
-
53
- nil
54
- end
55
-
56
- def _getField(name)
57
-
58
- if ((name) == ("values"))
59
- return (self).values
60
- end
61
- return nil
62
-
63
- nil
64
- end
15
+ ##
16
+ # Returns whether a list contains a given value.
65
17
 
66
- def _setField(name, value)
67
-
68
- if ((name) == ("values"))
69
- (self).values = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
18
+ def self.contains(values, value)
19
+
20
+ idx = 0
21
+ while ((idx) < ((values).size)) do
22
+ if ((value) == ((values)[idx]))
23
+ return true
70
24
  end
71
-
72
- nil
73
- end
74
-
75
- def __init_fields__()
76
-
77
- self.values = nil
78
-
79
- nil
25
+ idx = (idx) + (1)
80
26
  end
81
-
82
-
83
- end
84
- Discriminator.unlazy_statics
85
-
86
- def self.anyof(values)
87
-
88
- return ::Quark.mdk_protocol.Discriminator.new(values)
27
+ return false
89
28
 
90
29
 
91
30
  nil
92
31
  end
93
32
 
94
33
  def self.Serializable; Serializable; end
34
+ ##
35
+ # JSON serializable object.
36
+ #
37
+ # If it has have a String field called _json_type, that will be set as the
38
+ # 'type' field in serialized JSON.
39
+ #
40
+
95
41
  class Serializable < ::DatawireQuarkCore::QuarkObject
96
42
  extend ::DatawireQuarkCore::Static
97
43
 
@@ -109,29 +55,15 @@ class Serializable < ::DatawireQuarkCore::QuarkObject
109
55
 
110
56
 
111
57
  ##
112
- # The given class must have a construct() static method that takes the JSON-encoded type,
113
- # or a constructor that takes no arguments.
114
- #
58
+ # Decode JSON into a particular class. XXX TURN INTO FUNCTION
115
59
 
116
- def self.decodeClass(clazz, encoded)
60
+ def self.decodeClassName(name, encoded)
117
61
 
118
62
  json = ::DatawireQuarkCore::JSONObject.parse(encoded)
119
- type = (json).getObjectItem("type").getString()
120
- meth = clazz.getMethod("construct")
121
- obj = nil
122
- if ((meth) != (nil))
123
- obj = ::DatawireQuarkCore.cast(meth.invoke(nil, ::DatawireQuarkCore::List.new([type]))) { ::Quark.mdk_protocol.Serializable }
124
- if ((obj) == (nil))
125
- logger = ::Quark.quark._getLogger("protocol")
126
- logger.warn(((((clazz.getName()) + (".")) + (meth.getName())) + (" could not understand this json: ")) + (encoded))
127
- return ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_protocol.Serializable }
128
- end
129
- clazz = ::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(obj))
130
- else
131
- obj = ::DatawireQuarkCore.cast(clazz.construct(::DatawireQuarkCore::List.new([]))) { ::Quark.mdk_protocol.Serializable }
132
- if ((obj) == (nil))
133
- raise (((("could not construct ") + (clazz.getName())) + (" from this json: ")) + (encoded))
134
- end
63
+ clazz = ::Quark.quark.reflect.QuarkClass.get(name)
64
+ obj = ::DatawireQuarkCore.cast(clazz.construct(::DatawireQuarkCore::List.new([]))) { ::Quark.mdk_protocol.Serializable }
65
+ if ((obj) == (nil))
66
+ raise (((("could not construct ") + (clazz.getName())) + (" from this json: ")) + (encoded))
135
67
  end
136
68
  ::Quark.quark.fromJSON(clazz, obj, json)
137
69
  return obj
@@ -139,20 +71,13 @@ class Serializable < ::DatawireQuarkCore::QuarkObject
139
71
  nil
140
72
  end
141
73
 
142
- def self.decodeClassName(name, encoded)
143
-
144
- return ::Quark.mdk_protocol.Serializable.decodeClass(::Quark.quark.reflect.QuarkClass.get(name), encoded)
145
-
146
- nil
147
- end
148
-
149
74
  def encode()
150
75
 
151
76
  clazz = ::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(self))
152
77
  json = ::Quark.quark.toJSON(self, clazz)
153
- desc = ::DatawireQuarkCore.cast((self)._getField("_discriminator")) { ::Quark.mdk_protocol.Discriminator }
154
- if ((desc) != (nil))
155
- (json).setObjectItem(("type"), (::DatawireQuarkCore::JSONObject.new.setString(((desc).values)[0])))
78
+ jsonType = ::DatawireQuarkCore.cast((self)._getField("_json_type")) { ::String }
79
+ if ((jsonType) != (nil))
80
+ (json).setObjectItem(("type"), (::DatawireQuarkCore::JSONObject.new.setString(jsonType)))
156
81
  end
157
82
  encoded = json.toString()
158
83
  return encoded
@@ -535,120 +460,15 @@ class SharedContext < ::Quark.mdk_protocol.Serializable
535
460
  end
536
461
  SharedContext.unlazy_statics
537
462
 
538
- def self.ProtocolHandler; ProtocolHandler; end
539
- class ProtocolHandler < ::DatawireQuarkCore::QuarkObject
540
- extend ::DatawireQuarkCore::Static
541
-
542
- static mdk_protocol_ProtocolHandler_ref: -> { nil }
543
-
544
-
545
-
546
- def initialize()
547
- self.__init_fields__
548
-
549
- nil
550
- end
551
-
552
-
553
-
554
-
555
- def onOpen(open)
556
- raise NotImplementedError, '`ProtocolHandler.onOpen` is an abstract method'
557
-
558
- nil
559
- end
560
-
561
- def onClose(close)
562
- raise NotImplementedError, '`ProtocolHandler.onClose` is an abstract method'
563
-
564
- nil
565
- end
566
-
567
- def __init_fields__()
568
-
569
-
570
- nil
571
- end
572
-
573
-
574
- end
575
- ProtocolHandler.unlazy_statics
576
-
577
- def self.ProtocolEvent; ProtocolEvent; end
578
- class ProtocolEvent < ::Quark.mdk_protocol.Serializable
579
- extend ::DatawireQuarkCore::Static
580
-
581
- static mdk_protocol_ProtocolEvent_ref: -> { nil }
582
-
583
-
584
-
585
- def initialize()
586
-
587
- super()
588
-
589
- nil
590
- end
591
-
592
-
593
-
594
-
595
- def self.construct(type)
596
-
597
- if (::Quark.mdk_protocol.Open._discriminator.matches(type))
598
- return ::Quark.mdk_protocol.Open.new()
599
- end
600
- if (::Quark.mdk_protocol.Close._discriminator.matches(type))
601
- return ::Quark.mdk_protocol.Close.new()
602
- end
603
- return ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_protocol.ProtocolEvent }
604
-
605
- nil
606
- end
607
-
608
- def dispatch(handler)
609
- raise NotImplementedError, '`ProtocolEvent.dispatch` is an abstract method'
610
-
611
- nil
612
- end
613
-
614
- def _getClass()
615
-
616
- return "mdk_protocol.ProtocolEvent"
617
-
618
- nil
619
- end
620
-
621
- def _getField(name)
622
-
623
- return nil
624
-
625
- nil
626
- end
627
-
628
- def _setField(name, value)
629
-
630
- nil
631
-
632
- nil
633
- end
634
-
635
- def __init_fields__()
636
-
637
- super
638
-
639
- nil
640
- end
641
-
642
-
643
- end
644
- ProtocolEvent.unlazy_statics
645
-
646
463
  def self.Open; Open; end
647
- class Open < ::Quark.mdk_protocol.ProtocolEvent
464
+ ##
465
+ # A message sent whenever a new connection is opened, by both sides.
466
+
467
+ class Open < ::Quark.mdk_protocol.Serializable
648
468
  attr_accessor :version, :properties
649
469
  extend ::DatawireQuarkCore::Static
650
470
 
651
- static _discriminator: -> { ::Quark.mdk_protocol.anyof(::DatawireQuarkCore::List.new(["open", "mdk.protocol.Open", "discovery.protocol.Open"])) }
471
+ static _json_type: -> { "open" }
652
472
  static mdk_protocol_Open_ref: -> { nil }
653
473
 
654
474
 
@@ -663,13 +483,6 @@ class Open < ::Quark.mdk_protocol.ProtocolEvent
663
483
 
664
484
 
665
485
 
666
- def dispatch(handler)
667
-
668
- handler.onOpen(self)
669
-
670
- nil
671
- end
672
-
673
486
  def _getClass()
674
487
 
675
488
  return "mdk_protocol.Open"
@@ -679,8 +492,8 @@ class Open < ::Quark.mdk_protocol.ProtocolEvent
679
492
 
680
493
  def _getField(name)
681
494
 
682
- if ((name) == ("_discriminator"))
683
- return ::Quark.mdk_protocol.Open._discriminator
495
+ if ((name) == ("_json_type"))
496
+ return ::Quark.mdk_protocol.Open._json_type
684
497
  end
685
498
  if ((name) == ("version"))
686
499
  return (self).version
@@ -695,8 +508,8 @@ class Open < ::Quark.mdk_protocol.ProtocolEvent
695
508
 
696
509
  def _setField(name, value)
697
510
 
698
- if ((name) == ("_discriminator"))
699
- ::Quark.mdk_protocol.Open._discriminator = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.Discriminator }
511
+ if ((name) == ("_json_type"))
512
+ ::Quark.mdk_protocol.Open._json_type = ::DatawireQuarkCore.cast(value) { ::String }
700
513
  end
701
514
  if ((name) == ("version"))
702
515
  (self).version = ::DatawireQuarkCore.cast(value) { ::String }
@@ -804,11 +617,11 @@ def self.Close; Close; end
804
617
  ##
805
618
  # Close the event stream.
806
619
 
807
- class Close < ::Quark.mdk_protocol.ProtocolEvent
620
+ class Close < ::Quark.mdk_protocol.Serializable
808
621
  attr_accessor :error
809
622
  extend ::DatawireQuarkCore::Static
810
623
 
811
- static _discriminator: -> { ::Quark.mdk_protocol.anyof(::DatawireQuarkCore::List.new(["close", "mdk.protocol.Close", "discovery.protocol.Close"])) }
624
+ static _json_type: -> { "close" }
812
625
  static mdk_protocol_Close_ref: -> { nil }
813
626
 
814
627
 
@@ -823,13 +636,6 @@ class Close < ::Quark.mdk_protocol.ProtocolEvent
823
636
 
824
637
 
825
638
 
826
- def dispatch(handler)
827
-
828
- handler.onClose(self)
829
-
830
- nil
831
- end
832
-
833
639
  def _getClass()
834
640
 
835
641
  return "mdk_protocol.Close"
@@ -839,8 +645,8 @@ class Close < ::Quark.mdk_protocol.ProtocolEvent
839
645
 
840
646
  def _getField(name)
841
647
 
842
- if ((name) == ("_discriminator"))
843
- return ::Quark.mdk_protocol.Close._discriminator
648
+ if ((name) == ("_json_type"))
649
+ return ::Quark.mdk_protocol.Close._json_type
844
650
  end
845
651
  if ((name) == ("error"))
846
652
  return (self).error
@@ -852,8 +658,8 @@ class Close < ::Quark.mdk_protocol.ProtocolEvent
852
658
 
853
659
  def _setField(name, value)
854
660
 
855
- if ((name) == ("_discriminator"))
856
- ::Quark.mdk_protocol.Close._discriminator = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.Discriminator }
661
+ if ((name) == ("_json_type"))
662
+ ::Quark.mdk_protocol.Close._json_type = ::DatawireQuarkCore.cast(value) { ::String }
857
663
  end
858
664
  if ((name) == ("error"))
859
665
  (self).error = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.ProtocolError }
@@ -874,25 +680,19 @@ class Close < ::Quark.mdk_protocol.ProtocolEvent
874
680
  end
875
681
  Close.unlazy_statics
876
682
 
877
- def self.WSClient; WSClient; end
683
+ def self.Pump; Pump; end
878
684
  ##
879
- # Common protocol machinery for web socket based protocol clients.
685
+ # Sent to a subscriber every once in a while, to tell subscribers they can send data.
880
686
 
881
- class WSClient < ::DatawireQuarkCore::QuarkObject
882
- attr_accessor :logger, :firstDelay, :maxDelay, :reconnectDelay, :ttl, :tick, :sock, :sockUrl, :lastConnectAttempt, :lastHeartbeat, :timeService, :schedulingActor, :websockets, :dispatcher
687
+ class Pump < ::DatawireQuarkCore::QuarkObject
883
688
  extend ::DatawireQuarkCore::Static
884
689
 
885
- static mdk_protocol_WSClient_ref: -> { nil }
690
+ static mdk_protocol_Pump_ref: -> { nil }
886
691
 
887
692
 
888
693
 
889
- def initialize(runtime)
890
-
694
+ def initialize()
891
695
  self.__init_fields__
892
- (self).dispatcher = (runtime).dispatcher
893
- (self).timeService = runtime.getTimeService()
894
- (self).schedulingActor = runtime.getScheduleService()
895
- (self).websockets = runtime.getWebSocketsService()
896
696
 
897
697
  nil
898
698
  end
@@ -900,207 +700,671 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
900
700
 
901
701
 
902
702
 
903
- def url()
904
- raise NotImplementedError, '`WSClient.url` is an abstract method'
703
+ def _getClass()
704
+
705
+ return "mdk_protocol.Pump"
905
706
 
906
707
  nil
907
708
  end
908
709
 
909
- def token()
910
- raise NotImplementedError, '`WSClient.token` is an abstract method'
710
+ def _getField(name)
711
+
712
+ return nil
911
713
 
912
714
  nil
913
715
  end
914
716
 
915
- def isStarted()
916
- raise NotImplementedError, '`WSClient.isStarted` is an abstract method'
717
+ def _setField(name, value)
718
+
719
+ nil
917
720
 
918
721
  nil
919
722
  end
920
723
 
921
- def isConnected()
724
+ def __init_fields__()
922
725
 
923
- return (@sock) != (nil)
924
726
 
925
727
  nil
926
728
  end
927
729
 
928
- def schedule(time)
730
+
731
+ end
732
+ Pump.unlazy_statics
733
+
734
+ def self.WSConnected; WSConnected; end
735
+ ##
736
+ # Sent to a subscriber when connection happens.
737
+
738
+ class WSConnected < ::DatawireQuarkCore::QuarkObject
739
+ attr_accessor :websock
740
+ extend ::DatawireQuarkCore::Static
741
+
742
+ static mdk_protocol_WSConnected_ref: -> { nil }
743
+
744
+
745
+
746
+ def initialize(websock)
929
747
 
930
- (self).dispatcher.tell(self, ::Quark.mdk_runtime.Schedule.new("wakeup", time), (self).schedulingActor)
748
+ self.__init_fields__
749
+ (self).websock = websock
931
750
 
932
751
  nil
933
752
  end
934
753
 
935
- def scheduleReconnect()
754
+
755
+
756
+
757
+ def _getClass()
936
758
 
937
- self.schedule(@reconnectDelay)
759
+ return "mdk_protocol.WSConnected"
938
760
 
939
761
  nil
940
762
  end
941
763
 
942
- def onOpen(open)
764
+ def _getField(name)
943
765
 
944
- nil
766
+ if ((name) == ("websock"))
767
+ return (self).websock
768
+ end
769
+ return nil
945
770
 
946
771
  nil
947
772
  end
948
773
 
949
- def doBackoff()
774
+ def _setField(name, value)
950
775
 
951
- @reconnectDelay = (2.0) * (@reconnectDelay)
952
- if ((@reconnectDelay) > (@maxDelay))
953
- @reconnectDelay = @maxDelay
776
+ if ((name) == ("websock"))
777
+ (self).websock = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.Actor }
954
778
  end
955
- @logger.info((("backing off, reconnecting in ") + ((@reconnectDelay).to_s)) + (" seconds"))
956
779
 
957
780
  nil
958
781
  end
959
782
 
960
- def onClose(close)
783
+ def __init_fields__()
961
784
 
962
- @logger.info(("close: ") + ((close).to_s))
963
- if (((close).error) == (nil))
964
- @reconnectDelay = @firstDelay
965
- else
966
- self.doBackoff()
967
- end
785
+ self.websock = nil
968
786
 
969
787
  nil
970
788
  end
971
789
 
972
- def onStart(dispatcher)
790
+
791
+ end
792
+ WSConnected.unlazy_statics
793
+
794
+ def self.DecodedMessage; DecodedMessage; end
795
+ ##
796
+ # Sent to a subscriber when a message is received.
797
+
798
+ class DecodedMessage < ::DatawireQuarkCore::QuarkObject
799
+ attr_accessor :message
800
+ extend ::DatawireQuarkCore::Static
801
+
802
+ static mdk_protocol_DecodedMessage_ref: -> { nil }
803
+
804
+
805
+
806
+ def initialize(message)
973
807
 
974
- self.schedule(0.0)
808
+ self.__init_fields__
809
+ (self).message = message
975
810
 
976
811
  nil
977
812
  end
978
813
 
979
- def onStop()
814
+
815
+
816
+
817
+ def _getClass()
980
818
 
981
- if (self.isConnected())
982
- self.shutdown()
983
- (self).dispatcher.tell(self, ::Quark.mdk_runtime.WSClose.new(), @sock)
984
- @sock = ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_runtime.WSActor }
985
- end
819
+ return "mdk_protocol.DecodedMessage"
986
820
 
987
821
  nil
988
822
  end
989
823
 
990
- def onMessage(origin, message)
824
+ def _getField(name)
991
825
 
992
- typeId = (::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(message))).id
993
- if ((typeId) == ("mdk_runtime.Happening"))
994
- self.onScheduledEvent()
995
- return
826
+ if ((name) == ("message"))
827
+ return (self).message
996
828
  end
997
- if ((typeId) == ("mdk_runtime.WSClosed"))
998
- self.onWSClosed()
999
- return
829
+ return nil
830
+
831
+ nil
832
+ end
833
+
834
+ def _setField(name, value)
835
+
836
+ if ((name) == ("message"))
837
+ (self).message = value
1000
838
  end
1001
- if ((typeId) == ("mdk_runtime.WSMessage"))
1002
- wsmessage = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_runtime.WSMessage }
1003
- self.onWSMessage((wsmessage).body)
839
+
840
+ nil
841
+ end
842
+
843
+ def __init_fields__()
844
+
845
+ self.message = nil
846
+
847
+ nil
848
+ end
849
+
850
+
851
+ end
852
+ DecodedMessage.unlazy_statics
853
+
854
+ def self.WSClientSubscriber; WSClientSubscriber; end
855
+ ##
856
+ # Higher-level interface for subscribers, to be utilized with _subscriberDispatch.
857
+
858
+ class WSClientSubscriber < ::DatawireQuarkCore::QuarkObject
859
+ extend ::DatawireQuarkCore::Static
860
+
861
+ static mdk_protocol_WSClientSubscriber_ref: -> { nil }
862
+
863
+
864
+
865
+ def initialize()
866
+ self.__init_fields__
867
+
868
+ nil
869
+ end
870
+
871
+
872
+
873
+
874
+ ##
875
+ # Handle an incoming decoded JSON message received from the server.
876
+
877
+ def onMessageFromServer(message)
878
+ raise NotImplementedError, '`WSClientSubscriber.onMessageFromServer` is an abstract method'
879
+
880
+ nil
881
+ end
882
+
883
+ ##
884
+ # Called with WebSocket actor when the WSClient connects to the server.
885
+
886
+ def onWSConnected(websocket)
887
+ raise NotImplementedError, '`WSClientSubscriber.onWSConnected` is an abstract method'
888
+
889
+ nil
890
+ end
891
+
892
+ ##
893
+ # Called when the WSClient notifies the subscriber it can send data.
894
+
895
+ def onPump()
896
+ raise NotImplementedError, '`WSClientSubscriber.onPump` is an abstract method'
897
+
898
+ nil
899
+ end
900
+
901
+ def __init_fields__()
902
+
903
+
904
+ nil
905
+ end
906
+
907
+
908
+ end
909
+ WSClientSubscriber.unlazy_statics
910
+
911
+ ##
912
+ # Dispatch actor messages to a WSClientSubscriber.
913
+ #
914
+ # Call this in onMessage to handle DecodedMessage, WSConnected and Pump messages
915
+ # from the WSClient.
916
+ #
917
+
918
+ def self._subscriberDispatch(subscriber, message)
919
+
920
+ klass = (::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(message))).id
921
+ if ((klass) == ("mdk_protocol.WSConnected"))
922
+ connected = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_protocol.WSConnected }
923
+ subscriber.onWSConnected((connected).websock)
924
+ return
925
+ end
926
+ if ((klass) == ("mdk_protocol.Pump"))
927
+ subscriber.onPump()
928
+ return
929
+ end
930
+ if ((klass) == ("mdk_protocol.DecodedMessage"))
931
+ decoded = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_protocol.DecodedMessage }
932
+ subscriber.onMessageFromServer((decoded).message)
933
+ return
934
+ end
935
+
936
+
937
+ nil
938
+ end
939
+
940
+ def self.OpenCloseSubscriber; OpenCloseSubscriber; end
941
+ ##
942
+ # Handle Open and Close messages.
943
+
944
+ class OpenCloseSubscriber < ::DatawireQuarkCore::QuarkObject
945
+ attr_accessor :_dispatcher, :_wsclient
946
+ extend ::DatawireQuarkCore::Static
947
+
948
+ static mdk_protocol_OpenCloseSubscriber_ref: -> { nil }
949
+
950
+
951
+
952
+ def initialize(client)
953
+
954
+ self.__init_fields__
955
+ (self)._wsclient = client
956
+ (self)._wsclient.subscribe(self)
957
+
958
+ nil
959
+ end
960
+
961
+
962
+
963
+
964
+ def onStart(dispatcher)
965
+
966
+ (self)._dispatcher = dispatcher
967
+
968
+ nil
969
+ end
970
+
971
+ def onMessage(origin, message)
972
+
973
+ ::Quark.mdk_protocol._subscriberDispatch(self, message)
974
+
975
+ nil
976
+ end
977
+
978
+ def onStop()
979
+
980
+ nil
981
+
982
+ nil
983
+ end
984
+
985
+ def onMessageFromServer(message)
986
+
987
+ type = (::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(message))).id
988
+ if ((type) == ("mdk_protocol.Open"))
989
+ self.onOpen()
990
+ return
991
+ end
992
+ if ((type) == ("mdk_protocol.Close"))
993
+ close = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_protocol.Close }
994
+ self.onClose(close)
1004
995
  return
1005
996
  end
1006
997
 
1007
998
  nil
1008
999
  end
1009
1000
 
1010
- def onScheduledEvent()
1001
+ def onWSConnected(websocket)
1011
1002
 
1012
- rightNow = (((self).timeService.time()) * (1000.0)).round()
1013
- heartbeatInterval = (((@ttl) / (2.0)) * (1000.0)).round()
1014
- reconnectInterval = ((@reconnectDelay) * (1000.0)).round()
1015
- if (self.isConnected())
1016
- if (self.isStarted())
1017
- self.pump()
1018
- if (((rightNow) - (@lastHeartbeat)) >= (heartbeatInterval))
1019
- self.doHeartbeat()
1020
- end
1021
- end
1022
- else
1023
- if ((self.isStarted()) && (((rightNow) - (@lastConnectAttempt)) >= (reconnectInterval)))
1024
- self.doOpen()
1025
- end
1003
+ (self)._dispatcher.tell(self, ::Quark.mdk_protocol.Open.new().encode(), websocket)
1004
+
1005
+ nil
1006
+ end
1007
+
1008
+ def onPump()
1009
+
1010
+ nil
1011
+
1012
+ nil
1013
+ end
1014
+
1015
+ def onOpen()
1016
+
1017
+ nil
1018
+
1019
+ nil
1020
+ end
1021
+
1022
+ def onClose(close)
1023
+
1024
+ (self)._wsclient.onClose(((close).error) != (nil))
1025
+
1026
+ nil
1027
+ end
1028
+
1029
+ def _getClass()
1030
+
1031
+ return "mdk_protocol.OpenCloseSubscriber"
1032
+
1033
+ nil
1034
+ end
1035
+
1036
+ def _getField(name)
1037
+
1038
+ if ((name) == ("_dispatcher"))
1039
+ return (self)._dispatcher
1026
1040
  end
1027
- if (self.isStarted())
1028
- self.schedule(@tick)
1041
+ if ((name) == ("_wsclient"))
1042
+ return (self)._wsclient
1029
1043
  end
1044
+ return nil
1030
1045
 
1031
1046
  nil
1032
1047
  end
1033
1048
 
1034
- def doOpen()
1049
+ def _setField(name, value)
1035
1050
 
1036
- self.open(self.url())
1037
- @lastConnectAttempt = (((self).timeService.time()) * (1000.0)).round()
1051
+ if ((name) == ("_dispatcher"))
1052
+ (self)._dispatcher = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.MessageDispatcher }
1053
+ end
1054
+ if ((name) == ("_wsclient"))
1055
+ (self)._wsclient = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.WSClient }
1056
+ end
1038
1057
 
1039
1058
  nil
1040
1059
  end
1041
1060
 
1042
- def doHeartbeat()
1061
+ def __init_fields__()
1043
1062
 
1044
- self.heartbeat()
1045
- @lastHeartbeat = (((self).timeService.time()) * (1000.0)).round()
1063
+ self._dispatcher = nil
1064
+ self._wsclient = nil
1046
1065
 
1047
1066
  nil
1048
1067
  end
1049
1068
 
1050
- def open(url)
1069
+
1070
+ end
1071
+ OpenCloseSubscriber.unlazy_statics
1072
+
1073
+ def self.JSONParser; JSONParser; end
1074
+ ##
1075
+ # Convert JSON-encoded strings into objects.
1076
+
1077
+ class JSONParser < ::DatawireQuarkCore::QuarkObject
1078
+ attr_accessor :_typeToClass
1079
+ extend ::DatawireQuarkCore::Static
1080
+
1081
+ static mdk_protocol_JSONParser_ref: -> { nil }
1082
+
1083
+
1084
+
1085
+ def initialize()
1086
+ self.__init_fields__
1087
+
1088
+ nil
1089
+ end
1090
+
1091
+
1092
+
1093
+
1094
+ ##
1095
+ # Register a type field and the corresponding class.
1096
+
1097
+ def register(type, cls)
1051
1098
 
1052
- @sockUrl = url
1053
- tok = self.token()
1054
- if ((tok) != (nil))
1055
- url = ((url) + ("?token=")) + (tok)
1099
+ ((self)._typeToClass)[type] = (cls)
1100
+
1101
+ nil
1102
+ end
1103
+
1104
+ ##
1105
+ # Decode a String into an Object.
1106
+
1107
+ def decode(message)
1108
+
1109
+ json = ::DatawireQuarkCore::JSONObject.parse(message)
1110
+ cls = ((self)._typeToClass)[json.getObjectItem("type").getString()]
1111
+ if ((cls) == (nil))
1112
+ return nil
1056
1113
  end
1057
- @logger.info(("opening ") + (@sockUrl))
1058
- (self).websockets.connect(url, self).andEither(::Quark.quark._BoundMethod.new(self, "onWSConnected", ::DatawireQuarkCore::List.new([])), ::Quark.quark._BoundMethod.new(self, "onWSError", ::DatawireQuarkCore::List.new([])))
1114
+ instance = cls.construct(::DatawireQuarkCore::List.new([]))
1115
+ ::Quark.quark.fromJSON(cls, instance, json)
1116
+ return instance
1059
1117
 
1060
1118
  nil
1061
1119
  end
1062
1120
 
1063
- def startup()
1121
+ def _getClass()
1122
+
1123
+ return "mdk_protocol.JSONParser"
1124
+
1125
+ nil
1126
+ end
1127
+
1128
+ def _getField(name)
1064
1129
 
1130
+ if ((name) == ("_typeToClass"))
1131
+ return (self)._typeToClass
1132
+ end
1133
+ return nil
1134
+
1065
1135
  nil
1136
+ end
1137
+
1138
+ def _setField(name, value)
1139
+
1140
+ if ((name) == ("_typeToClass"))
1141
+ (self)._typeToClass = ::DatawireQuarkCore.cast(value) { ::Hash }
1142
+ end
1066
1143
 
1067
1144
  nil
1068
1145
  end
1069
1146
 
1070
- def pump()
1147
+ def __init_fields__()
1148
+
1149
+ self._typeToClass = {}
1150
+
1151
+ nil
1152
+ end
1153
+
1154
+
1155
+ end
1156
+ JSONParser.unlazy_statics
1157
+
1158
+ def self.WSClient; WSClient; end
1159
+ ##
1160
+ # Common protocol machinery for web socket based protocol clients.
1161
+
1162
+ class WSClient < ::DatawireQuarkCore::QuarkObject
1163
+ attr_accessor :logger, :firstDelay, :maxDelay, :reconnectDelay, :ttl, :tick, :sock, :lastConnectAttempt, :timeService, :schedulingActor, :websockets, :dispatcher, :url, :token, :subscribers, :_started, :_parser
1164
+ extend ::DatawireQuarkCore::Static
1165
+
1166
+ static quark_List_mdk_runtime_actors_Actor__ref: -> { nil }
1167
+ static mdk_protocol_WSClient_ref: -> { nil }
1168
+
1169
+
1170
+
1171
+ def initialize(runtime, parser, url, token)
1172
+
1173
+ self.__init_fields__
1174
+ (self).dispatcher = (runtime).dispatcher
1175
+ (self).timeService = runtime.getTimeService()
1176
+ (self).schedulingActor = runtime.getScheduleService()
1177
+ (self).websockets = runtime.getWebSocketsService()
1178
+ (self).url = url
1179
+ (self).token = token
1180
+ (self)._parser = parser
1181
+
1182
+ nil
1183
+ end
1184
+
1185
+
1186
+
1187
+
1188
+ ##
1189
+ # Subscribe to messages from the server.
1190
+ #
1191
+ # Do this before starting the WSClient.
1192
+ #
1193
+ # The given Actor subscribes to WSConnected, all WSMessage received by the
1194
+ # WSClient, as well as a periodic Pump message.
1195
+ #
1196
+
1197
+ def subscribe(subscriber)
1198
+
1199
+ ((self).subscribers) << (subscriber)
1200
+
1201
+ nil
1202
+ end
1203
+
1204
+ def isStarted()
1205
+
1206
+ return @_started
1207
+
1208
+ nil
1209
+ end
1210
+
1211
+ def isConnected()
1212
+
1213
+ return (@sock) != (nil)
1214
+
1215
+ nil
1216
+ end
1217
+
1218
+ def schedule(time)
1219
+
1220
+ (self).dispatcher.tell(self, ::Quark.mdk_runtime.Schedule.new("wakeup", time), (self).schedulingActor)
1221
+
1222
+ nil
1223
+ end
1224
+
1225
+ def scheduleReconnect()
1226
+
1227
+ self.schedule(@reconnectDelay)
1228
+
1229
+ nil
1230
+ end
1231
+
1232
+ ##
1233
+ # Called when the connection is closed via message by the server.
1234
+
1235
+ def onClose(error)
1071
1236
 
1237
+ @logger.info("close!")
1238
+ if (error)
1239
+ self.doBackoff()
1240
+ else
1241
+ @reconnectDelay = @firstDelay
1242
+ end
1243
+
1072
1244
  nil
1245
+ end
1246
+
1247
+ def doBackoff()
1248
+
1249
+ @reconnectDelay = (2.0) * (@reconnectDelay)
1250
+ if ((@reconnectDelay) > (@maxDelay))
1251
+ @reconnectDelay = @maxDelay
1252
+ end
1253
+ @logger.info((("backing off, reconnecting in ") + ((@reconnectDelay).to_s)) + (" seconds"))
1073
1254
 
1074
1255
  nil
1075
1256
  end
1076
1257
 
1077
- def heartbeat()
1258
+ def onStart(dispatcher)
1078
1259
 
1260
+ (self)._started = true
1261
+ self.schedule(0.0)
1262
+
1079
1263
  nil
1264
+ end
1265
+
1266
+ def onStop()
1267
+
1268
+ (self)._started = false
1269
+ if (self.isConnected())
1270
+ (self).dispatcher.tell(self, ::Quark.mdk_runtime.WSClose.new(), @sock)
1271
+ @sock = ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_runtime.WSActor }
1272
+ end
1080
1273
 
1081
1274
  nil
1082
1275
  end
1083
1276
 
1084
- def shutdown()
1277
+ def onMessage(origin, message)
1278
+
1279
+ typeId = (::Quark.quark.reflect.QuarkClass.get(::DatawireQuarkCore._getClass(message))).id
1280
+ if ((typeId) == ("mdk_runtime.Happening"))
1281
+ self.onScheduledEvent()
1282
+ return
1283
+ end
1284
+ if ((typeId) == ("mdk_runtime.WSClosed"))
1285
+ self.onWSClosed()
1286
+ return
1287
+ end
1288
+ if ((typeId) == ("mdk_runtime.WSMessage"))
1289
+ wsmessage = ::DatawireQuarkCore.cast(message) { ::Quark.mdk_runtime.WSMessage }
1290
+ parsed = (self)._parser.decode((wsmessage).body)
1291
+ if ((parsed) == (nil))
1292
+ return
1293
+ end
1294
+ decoded = ::Quark.mdk_protocol.DecodedMessage.new(parsed)
1295
+ idx = 0
1296
+ while ((idx) < (((self).subscribers).size)) do
1297
+ (self).dispatcher.tell(self, decoded, ((self).subscribers)[idx])
1298
+ idx = (idx) + (1)
1299
+ end
1300
+ return
1301
+ end
1302
+
1303
+ nil
1304
+ end
1305
+
1306
+ def onScheduledEvent()
1085
1307
 
1308
+ rightNow = (((self).timeService.time()) * (1000.0)).round()
1309
+ reconnectInterval = ((@reconnectDelay) * (1000.0)).round()
1310
+ if (self.isConnected())
1311
+ if (self.isStarted())
1312
+ self.pump()
1313
+ end
1314
+ else
1315
+ if ((self.isStarted()) && (((rightNow) - (@lastConnectAttempt)) >= (reconnectInterval)))
1316
+ self.doOpen()
1317
+ end
1318
+ end
1319
+ if (self.isStarted())
1320
+ self.schedule(@tick)
1321
+ end
1322
+
1086
1323
  nil
1324
+ end
1325
+
1326
+ def doOpen()
1327
+
1328
+ @lastConnectAttempt = (((self).timeService.time()) * (1000.0)).round()
1329
+ sockUrl = @url
1330
+ if ((@token) != (nil))
1331
+ sockUrl = ((sockUrl) + ("?token=")) + (@token)
1332
+ end
1333
+ @logger.info(("opening ") + (@url))
1334
+ (self).websockets.connect(sockUrl, self).andEither(::Quark.quark._BoundMethod.new(self, "onWSConnected", ::DatawireQuarkCore::List.new([])), ::Quark.quark._BoundMethod.new(self, "onWSError", ::DatawireQuarkCore::List.new([])))
1087
1335
 
1088
1336
  nil
1089
1337
  end
1090
1338
 
1091
- def onWSMessage(message)
1339
+ def startup()
1092
1340
 
1341
+ message = ::Quark.mdk_protocol.WSConnected.new((self).sock)
1342
+ idx = 0
1343
+ while ((idx) < ((@subscribers).size)) do
1344
+ (self).dispatcher.tell(self, message, (@subscribers)[idx])
1345
+ idx = (idx) + (1)
1346
+ end
1347
+
1093
1348
  nil
1349
+ end
1350
+
1351
+ def pump()
1352
+
1353
+ message = ::Quark.mdk_protocol.Pump.new()
1354
+ idx = 0
1355
+ while ((idx) < ((@subscribers).size)) do
1356
+ (self).dispatcher.tell(self, message, (@subscribers)[idx])
1357
+ idx = (idx) + (1)
1358
+ end
1094
1359
 
1095
1360
  nil
1096
1361
  end
1097
1362
 
1098
1363
  def onWSConnected(socket)
1099
1364
 
1100
- @logger.info(((("connected to ") + (@sockUrl)) + (" via ")) + ((socket).to_s))
1365
+ @logger.info(((("connected to ") + (@url)) + (" via ")) + ((socket).to_s))
1101
1366
  @reconnectDelay = @firstDelay
1102
1367
  @sock = socket
1103
- (self).dispatcher.tell(self, ::Quark.mdk_protocol.Open.new().encode(), @sock)
1104
1368
  self.startup()
1105
1369
  self.pump()
1106
1370
 
@@ -1117,7 +1381,7 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
1117
1381
 
1118
1382
  def onWSClosed()
1119
1383
 
1120
- @logger.info(("closed ") + (@sockUrl))
1384
+ @logger.info(("closed ") + (@url))
1121
1385
  @sock = ::DatawireQuarkCore.cast(nil) { ::Quark.mdk_runtime.WSActor }
1122
1386
 
1123
1387
  nil
@@ -1153,15 +1417,9 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
1153
1417
  if ((name) == ("sock"))
1154
1418
  return (self).sock
1155
1419
  end
1156
- if ((name) == ("sockUrl"))
1157
- return (self).sockUrl
1158
- end
1159
1420
  if ((name) == ("lastConnectAttempt"))
1160
1421
  return (self).lastConnectAttempt
1161
1422
  end
1162
- if ((name) == ("lastHeartbeat"))
1163
- return (self).lastHeartbeat
1164
- end
1165
1423
  if ((name) == ("timeService"))
1166
1424
  return (self).timeService
1167
1425
  end
@@ -1174,6 +1432,21 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
1174
1432
  if ((name) == ("dispatcher"))
1175
1433
  return (self).dispatcher
1176
1434
  end
1435
+ if ((name) == ("url"))
1436
+ return (self).url
1437
+ end
1438
+ if ((name) == ("token"))
1439
+ return (self).token
1440
+ end
1441
+ if ((name) == ("subscribers"))
1442
+ return (self).subscribers
1443
+ end
1444
+ if ((name) == ("_started"))
1445
+ return (self)._started
1446
+ end
1447
+ if ((name) == ("_parser"))
1448
+ return (self)._parser
1449
+ end
1177
1450
  return nil
1178
1451
 
1179
1452
  nil
@@ -1202,15 +1475,9 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
1202
1475
  if ((name) == ("sock"))
1203
1476
  (self).sock = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.WSActor }
1204
1477
  end
1205
- if ((name) == ("sockUrl"))
1206
- (self).sockUrl = ::DatawireQuarkCore.cast(value) { ::String }
1207
- end
1208
1478
  if ((name) == ("lastConnectAttempt"))
1209
1479
  (self).lastConnectAttempt = ::DatawireQuarkCore.cast(value) { ::Integer }
1210
1480
  end
1211
- if ((name) == ("lastHeartbeat"))
1212
- (self).lastHeartbeat = ::DatawireQuarkCore.cast(value) { ::Integer }
1213
- end
1214
1481
  if ((name) == ("timeService"))
1215
1482
  (self).timeService = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.Time }
1216
1483
  end
@@ -1223,6 +1490,21 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
1223
1490
  if ((name) == ("dispatcher"))
1224
1491
  (self).dispatcher = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_runtime.actors.MessageDispatcher }
1225
1492
  end
1493
+ if ((name) == ("url"))
1494
+ (self).url = ::DatawireQuarkCore.cast(value) { ::String }
1495
+ end
1496
+ if ((name) == ("token"))
1497
+ (self).token = ::DatawireQuarkCore.cast(value) { ::String }
1498
+ end
1499
+ if ((name) == ("subscribers"))
1500
+ (self).subscribers = ::DatawireQuarkCore.cast(value) { ::DatawireQuarkCore::List }
1501
+ end
1502
+ if ((name) == ("_started"))
1503
+ (self)._started = ::DatawireQuarkCore.cast(value) { ::Object }
1504
+ end
1505
+ if ((name) == ("_parser"))
1506
+ (self)._parser = ::DatawireQuarkCore.cast(value) { ::Quark.mdk_protocol.JSONParser }
1507
+ end
1226
1508
 
1227
1509
  nil
1228
1510
  end
@@ -1236,13 +1518,16 @@ class WSClient < ::DatawireQuarkCore::QuarkObject
1236
1518
  self.ttl = 30.0
1237
1519
  self.tick = 1.0
1238
1520
  self.sock = nil
1239
- self.sockUrl = nil
1240
1521
  self.lastConnectAttempt = 0
1241
- self.lastHeartbeat = 0
1242
1522
  self.timeService = nil
1243
1523
  self.schedulingActor = nil
1244
1524
  self.websockets = nil
1245
1525
  self.dispatcher = nil
1526
+ self.url = nil
1527
+ self.token = nil
1528
+ self.subscribers = ::DatawireQuarkCore::List.new([])
1529
+ self._started = false
1530
+ self._parser = nil
1246
1531
 
1247
1532
  nil
1248
1533
  end