datawire_mdk 2.0.15 → 2.0.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -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