wampproto 0.1.0

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.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +39 -0
  4. data/CHANGELOG.md +5 -0
  5. data/CODE_OF_CONDUCT.md +84 -0
  6. data/LICENSE +22 -0
  7. data/README.md +35 -0
  8. data/Rakefile +12 -0
  9. data/Steepfile +33 -0
  10. data/lib/wampproto/acceptor/authenticator.rb +14 -0
  11. data/lib/wampproto/acceptor/request.rb +58 -0
  12. data/lib/wampproto/acceptor/response.rb +19 -0
  13. data/lib/wampproto/acceptor.rb +183 -0
  14. data/lib/wampproto/auth/anonymous.rb +14 -0
  15. data/lib/wampproto/auth/base.rb +20 -0
  16. data/lib/wampproto/auth/cra.rb +84 -0
  17. data/lib/wampproto/auth/cryptosign.rb +86 -0
  18. data/lib/wampproto/auth/helpers.rb +25 -0
  19. data/lib/wampproto/auth/ticket.rb +27 -0
  20. data/lib/wampproto/auth.rb +14 -0
  21. data/lib/wampproto/broker.rb +155 -0
  22. data/lib/wampproto/dealer.rb +143 -0
  23. data/lib/wampproto/id_generator.rb +23 -0
  24. data/lib/wampproto/joiner.rb +78 -0
  25. data/lib/wampproto/message/abort.rb +32 -0
  26. data/lib/wampproto/message/authenticate.rb +25 -0
  27. data/lib/wampproto/message/base.rb +30 -0
  28. data/lib/wampproto/message/call.rb +33 -0
  29. data/lib/wampproto/message/challenge.rb +25 -0
  30. data/lib/wampproto/message/error.rb +27 -0
  31. data/lib/wampproto/message/event.rb +33 -0
  32. data/lib/wampproto/message/goodbye.rb +25 -0
  33. data/lib/wampproto/message/hello.rb +64 -0
  34. data/lib/wampproto/message/invocation.rb +33 -0
  35. data/lib/wampproto/message/publish.rb +33 -0
  36. data/lib/wampproto/message/published.rb +25 -0
  37. data/lib/wampproto/message/register.rb +26 -0
  38. data/lib/wampproto/message/registered.rb +25 -0
  39. data/lib/wampproto/message/result.rb +32 -0
  40. data/lib/wampproto/message/subscribe.rb +26 -0
  41. data/lib/wampproto/message/subscribed.rb +25 -0
  42. data/lib/wampproto/message/unregister.rb +25 -0
  43. data/lib/wampproto/message/unregistered.rb +24 -0
  44. data/lib/wampproto/message/unsubscribe.rb +25 -0
  45. data/lib/wampproto/message/unsubscribed.rb +24 -0
  46. data/lib/wampproto/message/welcome.rb +41 -0
  47. data/lib/wampproto/message/yield.rb +32 -0
  48. data/lib/wampproto/message.rb +108 -0
  49. data/lib/wampproto/message_with_recipient.rb +13 -0
  50. data/lib/wampproto/serializer/cbor.rb +18 -0
  51. data/lib/wampproto/serializer/json.rb +18 -0
  52. data/lib/wampproto/serializer/msgpack.rb +18 -0
  53. data/lib/wampproto/serializer.rb +5 -0
  54. data/lib/wampproto/session.rb +144 -0
  55. data/lib/wampproto/session_details.rb +24 -0
  56. data/lib/wampproto/validate.rb +52 -0
  57. data/lib/wampproto/version.rb +5 -0
  58. data/lib/wampproto.rb +32 -0
  59. data/sig/cbor.rbs +5 -0
  60. data/sig/ed25519/signing_key.rbs +7 -0
  61. data/sig/ed25519/verify_key.rbs +7 -0
  62. data/sig/message_pack.rbs +5 -0
  63. data/sig/wampproto/acceptor/authenticator.rbs +9 -0
  64. data/sig/wampproto/acceptor/request.rbs +46 -0
  65. data/sig/wampproto/acceptor/response.rbs +25 -0
  66. data/sig/wampproto/acceptor.rbs +86 -0
  67. data/sig/wampproto/auth/anonymous.rbs +13 -0
  68. data/sig/wampproto/auth/base.rbs +25 -0
  69. data/sig/wampproto/auth/cra.rbs +34 -0
  70. data/sig/wampproto/auth/cryptosign.rbs +38 -0
  71. data/sig/wampproto/auth/helpers.rbs +16 -0
  72. data/sig/wampproto/auth/ticket.rbs +21 -0
  73. data/sig/wampproto/broker.rbs +48 -0
  74. data/sig/wampproto/dealer.rbs +49 -0
  75. data/sig/wampproto/id_generator.rbs +17 -0
  76. data/sig/wampproto/joiner.rbs +43 -0
  77. data/sig/wampproto/message/abort.rbs +31 -0
  78. data/sig/wampproto/message/authenticate.rbs +20 -0
  79. data/sig/wampproto/message/base.rbs +14 -0
  80. data/sig/wampproto/message/call.rbs +34 -0
  81. data/sig/wampproto/message/challenge.rbs +20 -0
  82. data/sig/wampproto/message/error.rbs +28 -0
  83. data/sig/wampproto/message/event.rbs +34 -0
  84. data/sig/wampproto/message/goodbye.rbs +21 -0
  85. data/sig/wampproto/message/hello.rbs +39 -0
  86. data/sig/wampproto/message/invocation.rbs +34 -0
  87. data/sig/wampproto/message/publish.rbs +32 -0
  88. data/sig/wampproto/message/published.rbs +20 -0
  89. data/sig/wampproto/message/register.rbs +24 -0
  90. data/sig/wampproto/message/registered.rbs +20 -0
  91. data/sig/wampproto/message/result.rbs +32 -0
  92. data/sig/wampproto/message/subscribe.rbs +24 -0
  93. data/sig/wampproto/message/subscribed.rbs +20 -0
  94. data/sig/wampproto/message/unregister.rbs +20 -0
  95. data/sig/wampproto/message/unregistered.rbs +16 -0
  96. data/sig/wampproto/message/unsubscribe.rbs +20 -0
  97. data/sig/wampproto/message/unsubscribed.rbs +16 -0
  98. data/sig/wampproto/message/welcome.rbs +36 -0
  99. data/sig/wampproto/message/yield.rbs +30 -0
  100. data/sig/wampproto/message.rbs +59 -0
  101. data/sig/wampproto/message_with_recipient.rbs +15 -0
  102. data/sig/wampproto/serializer/cbor.rbs +10 -0
  103. data/sig/wampproto/serializer/json.rbs +11 -0
  104. data/sig/wampproto/serializer/msgpack.rbs +11 -0
  105. data/sig/wampproto/session.rbs +43 -0
  106. data/sig/wampproto/session_details.rbs +25 -0
  107. data/sig/wampproto/validate.rbs +18 -0
  108. data/sig/wampproto.rbs +17 -0
  109. data/wampproto.gemspec +39 -0
  110. metadata +196 -0
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "message/base"
4
+ require_relative "message/hello"
5
+ require_relative "message/welcome"
6
+ require_relative "message/abort"
7
+ require_relative "message/challenge"
8
+ require_relative "message/authenticate"
9
+ require_relative "message/goodbye"
10
+
11
+ require_relative "message/error"
12
+
13
+ require_relative "message/publish"
14
+ require_relative "message/published"
15
+
16
+ require_relative "message/subscribe"
17
+ require_relative "message/subscribed"
18
+ require_relative "message/unsubscribe"
19
+ require_relative "message/unsubscribed"
20
+ require_relative "message/event"
21
+
22
+ require_relative "message/call"
23
+ require_relative "message/result"
24
+
25
+ require_relative "message/register"
26
+ require_relative "message/registered"
27
+ require_relative "message/unregister"
28
+ require_relative "message/unregistered"
29
+
30
+ require_relative "message/invocation"
31
+ require_relative "message/yield"
32
+
33
+ module Wampproto
34
+ # message root
35
+ module Message
36
+ module Type
37
+ HELLO = 1
38
+ WELCOME = 2
39
+ ABORT = 3
40
+ CHALLENGE = 4
41
+ AUTHENTICATE = 5
42
+ GOODBYE = 6
43
+
44
+ ERROR = 8
45
+
46
+ PUBLISH = 16
47
+ PUBLISHED = 17
48
+
49
+ SUBSCRIBE = 32
50
+ SUBSCRIBED = 33
51
+ UNSUBSCRIBE = 34
52
+ UNSUBSCRIBED = 35
53
+ EVENT = 36
54
+
55
+ CALL = 48
56
+ CANCEL = 49
57
+ RESULT = 50
58
+
59
+ REGISTER = 64
60
+ REGISTERED = 65
61
+ UNREGISTER = 66
62
+ UNREGISTERED = 67
63
+ INVOCATION = 68
64
+ INTERRUPT = 69
65
+ YIELD = 70
66
+ end
67
+
68
+ HANDLER = {
69
+ Type::HELLO => Hello,
70
+ Type::WELCOME => Welcome,
71
+ Type::ABORT => Abort,
72
+ Type::CHALLENGE => Challenge,
73
+ Type::AUTHENTICATE => Authenticate,
74
+ Type::GOODBYE => Goodbye,
75
+
76
+ Type::ERROR => Error,
77
+
78
+ Type::PUBLISH => Publish,
79
+ Type::PUBLISHED => Published,
80
+
81
+ Type::SUBSCRIBE => Subscribe,
82
+ Type::SUBSCRIBED => Subscribed,
83
+ Type::UNSUBSCRIBE => Unsubscribe,
84
+ Type::UNSUBSCRIBED => Unsubscribed,
85
+ Type::EVENT => Event,
86
+
87
+ Type::CALL => Call,
88
+ Type::RESULT => Result,
89
+
90
+ Type::REGISTER => Register,
91
+ Type::REGISTERED => Registered,
92
+ Type::UNREGISTER => Unregister,
93
+ Type::UNREGISTERED => Unregistered,
94
+ Type::INVOCATION => Invocation,
95
+ Type::YIELD => Yield
96
+ }.freeze
97
+
98
+ def self.resolve(wamp_message)
99
+ type, = Validate.array!("Wamp Message", wamp_message)
100
+ begin
101
+ HANDLER[type].parse(wamp_message)
102
+ rescue StandardError => e
103
+ p wamp_message
104
+ raise e
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # handler class for dealer and broker responses
5
+ class MessageWithRecipient
6
+ attr_reader :message, :recipient
7
+
8
+ def initialize(message, recipient)
9
+ @message = message
10
+ @recipient = recipient
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cbor"
4
+
5
+ module Wampproto
6
+ module Serializer
7
+ # Add common API for serializer
8
+ class Cbor
9
+ def self.serialize(message)
10
+ CBOR.encode(message.marshal).unpack("c*")
11
+ end
12
+
13
+ def self.deserialize(message)
14
+ CBOR.decode(message.pack("c*")).then { Message.resolve(_1) }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Wampproto
6
+ module Serializer
7
+ # Add common API for serializer
8
+ class JSON
9
+ def self.serialize(message)
10
+ ::JSON.dump(message.marshal)
11
+ end
12
+
13
+ def self.deserialize(message)
14
+ ::JSON.parse(message).then { Message.resolve(_1) }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "msgpack"
4
+
5
+ module Wampproto
6
+ module Serializer
7
+ # Add common API for serializer
8
+ class Msgpack
9
+ def self.serialize(message)
10
+ ::MessagePack.pack(message.marshal).unpack("c*")
11
+ end
12
+
13
+ def self.deserialize(message)
14
+ ::MessagePack.unpack(message.pack("c*")).then { Message.resolve(_1) }
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "serializer/json"
4
+ require_relative "serializer/msgpack"
5
+ require_relative "serializer/cbor"
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # Session
5
+ class Session # rubocop:disable Metrics/ClassLength
6
+ attr_reader :serializer
7
+
8
+ def initialize(serializer = Serializer::JSON)
9
+ @serializer = serializer
10
+ init_state
11
+ end
12
+
13
+ ACCESSORS = %i[
14
+ call_requests
15
+ register_requests
16
+ registrations
17
+ invocation_requests
18
+ unregister_requests
19
+
20
+ publish_requests
21
+ subscribe_requests
22
+ subscriptions
23
+ unsubscribe_requests
24
+ ].freeze
25
+
26
+ def send_message(msg) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
27
+ case msg
28
+ when Message::Call
29
+ call_requests[msg.request_id] = msg.request_id
30
+ when Message::Register
31
+ register_requests[msg.request_id] = msg.request_id
32
+ when Message::Unregister
33
+ unregister_requests[msg.request_id] = msg.registration_id
34
+ when Message::Yield
35
+ unless invocation_requests.include?(msg.request_id)
36
+ raise ValueError, "cannot yield for unknown invocation request"
37
+ end
38
+
39
+ invocation_requests.delete(msg.request_id)
40
+ when Message::Publish
41
+ publish_requests[msg.request_id] = msg.request_id if msg.options.fetch(:acknowledge, false)
42
+ when Message::Subscribe
43
+ subscribe_requests[msg.request_id] = msg.request_id
44
+ when Message::Unsubscribe
45
+ unsubscribe_requests[msg.request_id] = msg.subscription_id
46
+ when Message::Error
47
+ error_message = "send only supported for invocation error"
48
+ raise ValueError, error_message if msg.message_type != Message::Invocation.type
49
+
50
+ invocation_requests.delete(msg.request_id)
51
+ end
52
+
53
+ serializer.serialize(msg)
54
+ end
55
+
56
+ def receive(data)
57
+ msg = serializer.deserialize(data)
58
+ receive_message(msg)
59
+ end
60
+
61
+ def receive_message(msg) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
62
+ case msg
63
+ when Message::Result
64
+ error_message = "received RESULT for invalid request_id"
65
+ raise ValueError, error_message unless call_requests.delete(msg.request_id)
66
+ when Message::Registered
67
+ error_message = "received REGISTERED for invalid request_id"
68
+ raise ValueError, error_message unless register_requests.delete(msg.request_id)
69
+
70
+ registrations[msg.registration_id] = msg.registration_id
71
+ when Message::Unregistered
72
+ error_message = "received UNREGISTERED for invalid request_id"
73
+ registration_id = unregister_requests.delete(msg.request_id)
74
+ raise ValueError, error_message unless registration_id
75
+
76
+ error_message = "received UNREGISTERED for invalid registration_id"
77
+ raise ValueError, error_message unless registrations.delete(registration_id)
78
+ when Message::Invocation
79
+ error_message = "received INVOCATION for invalid registration_id"
80
+ raise ValueError, error_message unless registrations.delete(msg.registration_id)
81
+
82
+ invocation_requests[msg.request_id] = msg.request_id
83
+ when Message::Published
84
+ error_message = "received PUBLISHED for invalid topic"
85
+ raise ValueError, error_message unless publish_requests.delete(msg.request_id)
86
+ when Message::Subscribed
87
+ error_message = "received SUBSCRIBED for invalid request_id"
88
+ raise ValueError, error_message unless subscribe_requests.delete(msg.request_id)
89
+
90
+ subscriptions[msg.subscription_id] = msg.subscription_id
91
+ when Message::Unsubscribed
92
+ error_message = "received UNSUBSCRIBED for invalid request_id"
93
+ subscription_id = unsubscribe_requests.delete(msg.request_id)
94
+ raise ValueError, error_message unless subscription_id
95
+
96
+ error_message = "received UNSUBSCRIBED for invalid subscription_id"
97
+ raise ValueError, error_message unless subscriptions.delete(subscription_id)
98
+ when Message::Event
99
+ error_message = "received EVENT for invalid subscription_id"
100
+ raise ValueError, error_message unless subscriptions.include?(msg.subscription_id)
101
+ when Message::Error
102
+ case msg.message_type
103
+ when Message::Call.type
104
+ error_message = "received ERROR for invalid call request"
105
+ raise ValueError, error_message unless call_requests.delete(msg.request_id)
106
+ when Message::Register.type
107
+ error_message = "received ERROR for invalid register request"
108
+ raise ValueError, error_message unless register_requests.delete(msg.request_id)
109
+ when Message::Unregister.type
110
+ error_message = "received ERROR for invalid unregister request"
111
+ raise ValueError, error_message unless unregister_requests.delete(msg.request_id)
112
+ when Message::Subscribe.type
113
+ error_message = "received ERROR for invalid subscribe request"
114
+ raise ValueError, error_message unless subscribe_requests.delete(msg.request_id)
115
+ when Message::Unsubscribe.type
116
+ error_message = "received ERROR for invalid unsubscribe request"
117
+ raise ValueError, error_message unless unsubscribe_requests.delete(msg.request_id)
118
+ when Message::Publish.type
119
+ error_message = "received ERROR for invalid publish request"
120
+ raise ValueError, error_message unless publish_requests.delete(msg.request_id)
121
+ else
122
+ error_message = "unknown error message type #{msg.class}"
123
+ raise ValueError, error_message
124
+ end
125
+ when Message::Abort
126
+ p [:session, :abort, msg]
127
+ else
128
+ raise ValueError, "unknown message #{msg.class}"
129
+ end
130
+
131
+ msg
132
+ end
133
+
134
+ private
135
+
136
+ attr_reader(*ACCESSORS)
137
+
138
+ def init_state
139
+ ACCESSORS.each do |attr|
140
+ instance_variable_set("@#{attr}", {})
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # Session Details
5
+ class SessionDetails
6
+ attr_reader :session_id, :realm, :authid, :authrole
7
+
8
+ def initialize(session_id, realm, authid, authrole)
9
+ @session_id = session_id
10
+ @realm = realm
11
+ @authid = authid
12
+ @authrole = authrole
13
+ end
14
+
15
+ def ==(other)
16
+ return false unless other.instance_of?(SessionDetails)
17
+
18
+ session_id == other.session_id &&
19
+ realm == other.realm &&
20
+ authid == other.authid &&
21
+ authrole == other.authrole
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ # validation
5
+ class Validate
6
+ class << self
7
+ def int!(name, value)
8
+ return value if value.is_a?(Integer)
9
+
10
+ raise ArgumentError, "The #{name} argument should be an integer."
11
+ end
12
+
13
+ def string!(name, value)
14
+ return value if value.is_a?(String)
15
+
16
+ raise ArgumentError, "The #{name} argument should be a string."
17
+ end
18
+
19
+ def hash!(name, value)
20
+ return value.transform_keys(&:to_sym) if value.is_a?(Hash)
21
+
22
+ raise ArgumentError, "The #{name} argument should be a dictionary."
23
+ end
24
+
25
+ def array!(name, value)
26
+ return value if value.is_a?(Array)
27
+
28
+ raise ArgumentError, "The #{name} argument should be a list."
29
+ end
30
+
31
+ def length!(array, expected_length)
32
+ return array if array.length == expected_length
33
+
34
+ raise ArgumentError, "The response message length should be #{expected_length} but got #{array.length} "
35
+ end
36
+
37
+ def greater_than_equal!(array, expected_length)
38
+ return array if array.length >= expected_length
39
+
40
+ raise ArgumentError, "The response message length is #{array.length} but it should be #{expected_length} "
41
+ end
42
+
43
+ def options!(options, valid_keys)
44
+ options.each_key do |key|
45
+ raise ArgumentError, "Unrecognized option: #{key.inspect}" unless valid_keys.include?(key)
46
+ end
47
+
48
+ options
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wampproto
4
+ VERSION = "0.1.0"
5
+ end
data/lib/wampproto.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "wampproto/version"
4
+ require_relative "wampproto/validate"
5
+ require_relative "wampproto/message"
6
+ require_relative "wampproto/serializer"
7
+ require_relative "wampproto/auth"
8
+ require_relative "wampproto/id_generator"
9
+ require_relative "wampproto/session_details"
10
+ require_relative "wampproto/joiner"
11
+ require_relative "wampproto/acceptor"
12
+ require_relative "wampproto/session"
13
+ require_relative "wampproto/message_with_recipient"
14
+ require_relative "wampproto/dealer"
15
+ require_relative "wampproto/broker"
16
+
17
+ module Wampproto
18
+ class Error < StandardError; end
19
+
20
+ # ProtocolViolation Exception
21
+ class ProtocolViolation < StandardError
22
+ attr_reader :uri
23
+
24
+ def initialize(msg = "Protocol Violation", uri = "wamp.error.protocol_violation")
25
+ @uri = uri
26
+ super(msg)
27
+ end
28
+ end
29
+
30
+ class ValueError < StandardError
31
+ end
32
+ end
data/sig/cbor.rbs ADDED
@@ -0,0 +1,5 @@
1
+ module CBOR
2
+ def self.encode: (untyped message) -> String
3
+
4
+ def self.decode: (String message) -> untyped
5
+ end
@@ -0,0 +1,7 @@
1
+ module Ed25519
2
+ class SigningKey
3
+ def initialize: (String private_key) -> void
4
+
5
+ def sign: (String challenge) -> untyped
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Ed25519
2
+ class VerifyKey
3
+ def initialize: (String private_key) -> void
4
+
5
+ def verify: (String signature, String message) -> bool
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module MessagePack
2
+ def self.pack: (untyped message) -> String
3
+
4
+ def self.unpack: (String message) -> untyped
5
+ end
@@ -0,0 +1,9 @@
1
+ module Wampproto
2
+ class Acceptor
3
+ # Interface to handle Authentications
4
+ class Authenticator
5
+ def self.authenticate: (Request request) -> Response
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,46 @@
1
+ module Wampproto
2
+ class Acceptor
3
+ # Request object sent for authentication
4
+ class Request
5
+ @hello: Message::Hello
6
+
7
+ extend Forwardable
8
+
9
+ attr_reader realm: String
10
+
11
+ attr_reader authid: String
12
+
13
+ attr_reader authextra: Hash[Symbol, untyped]
14
+
15
+ attr_reader hello: Message::Hello
16
+
17
+ def initialize: (Message::Hello hello) -> void
18
+
19
+ def authmethod: () -> Symbol
20
+
21
+ def public_key: () -> String
22
+
23
+ def secret: () -> nil
24
+
25
+ def ticket: () -> nil
26
+ end
27
+
28
+ # AuthenticateRequest
29
+ class AuthenticateRequest < Request
30
+ @authenticate: Message::Authenticate
31
+
32
+ @hello_request: Request
33
+
34
+ extend Forwardable
35
+
36
+ attr_reader authenticate: Message::Authenticate
37
+
38
+ def initialize: (Message::Authenticate authenticate, Request hello_request) -> void
39
+
40
+ def ticket: () -> (String | nil)
41
+
42
+ def secret: () -> (String | nil)
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,25 @@
1
+ module Wampproto
2
+ class Acceptor
3
+ # Request object sent for authentication
4
+ class Response
5
+ @authid: String
6
+
7
+ @authrole: String
8
+
9
+ @secret: String
10
+
11
+ attr_reader authid: String
12
+
13
+ attr_reader authrole: String
14
+
15
+ attr_reader secret: String
16
+
17
+ def initialize: (String authid, String authrole, ?String? secret) -> void
18
+
19
+ alias ticket secret
20
+
21
+ alias public_key secret
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,86 @@
1
+ module Wampproto
2
+ # Accepts Request
3
+ class Acceptor
4
+ type serializerTypes = (singleton(Serializer::JSON) | singleton(Serializer::Msgpack) | singleton(Serializer::Cbor))
5
+ # type authenticatorsType = Auth::Anonymous | Auth::Ticket | Auth::Cra | Auth::Cryptosign
6
+
7
+ @serializer: serializerTypes
8
+
9
+ @authenticator: singleton(Authenticator)
10
+
11
+ @state: Integer
12
+
13
+ @session_id: Integer
14
+
15
+ @hello: Message::Hello
16
+
17
+ @authid: String
18
+
19
+ @authmethod: String
20
+
21
+ @request: Request
22
+
23
+ @response: Response
24
+
25
+ @challenge: String
26
+
27
+ @public_key: String
28
+
29
+ @auth_request: AuthenticateRequest
30
+
31
+ STATE_NONE: 0
32
+
33
+ STATE_HELLO_RECEIVED: 1
34
+
35
+ STATE_CHALLENGE_SENT: 2
36
+
37
+ STATE_WELCOME_SENT: 3
38
+
39
+ STATE_ERROR: 4
40
+
41
+ ROUTER_ROLES: { dealer: ::Hash[untyped, untyped], broker: ::Hash[untyped, untyped] }
42
+
43
+ attr_reader serializer: serializerTypes
44
+
45
+ attr_reader session_id: Integer
46
+
47
+ attr_reader authmethod: String
48
+
49
+ attr_reader authenticator: singleton(Authenticator)
50
+
51
+ attr_accessor state: Integer
52
+
53
+ attr_accessor session_details: SessionDetails
54
+
55
+ def initialize: (?serializerTypes serializer, ?singleton(Authenticator) authenticator) -> void
56
+
57
+ def receive: (untyped data) -> untyped
58
+
59
+ def receive_message: (Message::Base msg) -> Message::Base
60
+
61
+ private
62
+
63
+ def handle_hello_message: (Message::Hello msg) -> (Message::Challenge | Message::Welcome | Message::Abort)
64
+
65
+ def handle_wampcra_hello: (Message::Hello msg) -> Message::Challenge
66
+
67
+ def handle_ticket_hello: (Message::Hello _msg) -> Message::Challenge
68
+
69
+ def handle_cryptosign_hello: (Message::Hello msg) -> Message::Challenge
70
+
71
+ def handle_anonymous_hello: (Message::Hello msg) -> Message::Welcome
72
+
73
+ def handle_authenticate_message: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
74
+
75
+ def handle_wampcra_authenticate: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
76
+
77
+ def abort_message: () -> Message::Abort
78
+
79
+ def handle_ticket_authenticate: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
80
+
81
+ def handle_cryptosign_authenticate: (Message::Authenticate msg) -> (Message::Welcome | Message::Abort)
82
+
83
+ def create_session_id: () -> Integer
84
+ end
85
+ end
86
+
@@ -0,0 +1,13 @@
1
+ module Wampproto
2
+ module Auth
3
+ # anonymous authentication
4
+ class Anonymous < Base
5
+ @authid: String
6
+
7
+ AUTH_METHOD: "anonymous"
8
+
9
+ def initialize: (?String authid, ?::Hash[Symbol, untyped] authextra) -> void
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,25 @@
1
+ module Wampproto
2
+ module Auth
3
+ # Auth Base
4
+ class Base
5
+ @authmethod: String
6
+
7
+ @authid: String
8
+
9
+ @authextra: Hash[Symbol, untyped]
10
+
11
+ attr_reader authmethod: String
12
+
13
+ attr_reader authid: String
14
+
15
+ attr_reader authextra: Hash[Symbol, untyped]
16
+
17
+ attr_reader details: Hash[Symbol, untyped]
18
+
19
+ def initialize: (String method, String authid, Hash[Symbol, untyped] authextra) -> void
20
+
21
+ def authenticate: (Message::Challenge _challenge) -> String
22
+ end
23
+ end
24
+ end
25
+