wampproto 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/wampproto/dealer.rb +35 -23
- data/lib/wampproto/session.rb +3 -2
- data/lib/wampproto/version.rb +1 -1
- data/sig/wampproto/dealer.rbs +5 -5
- data/wampproto.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f63bc10a2b52f090c1d8bf9b76b688c1c2501169b4cb7aca4e71d07314e26247
|
4
|
+
data.tar.gz: 617f88f1242ac8369ea2f8bc2b3a6ad7bbf63f47c64de91108e932af2954de62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1520e1c65e7a61af12622b9826a0d26e27e0d794d16a35225b9a7e7936c534c364c1e4c4bad0605571d80672c573c071b5ef3369de161866e76ea2d60736461
|
7
|
+
data.tar.gz: 29a3cf9dd9cbfe57d1b1a283df2781311d6888dad3cf66aee1ceca8f0a4e8ecbd03d7f5d6eb0c14e6774ff4e02df7382d7297b1d3a50ebdad4a6acf562c46742
|
data/lib/wampproto/dealer.rb
CHANGED
@@ -2,15 +2,16 @@
|
|
2
2
|
|
3
3
|
module Wampproto
|
4
4
|
# Wamprpoto Dealer handler
|
5
|
-
class Dealer
|
6
|
-
|
5
|
+
class Dealer # rubocop:disable Metrics/ClassLength
|
6
|
+
PendingInvocation = Struct.new(:caller_id, :callee_id, :call_id, :invocation_id, :receive_progress, :progress)
|
7
|
+
|
8
|
+
attr_reader :registrations_by_procedure, :registrations_by_session, :pending_calls, :id_gen,
|
7
9
|
:sessions
|
8
10
|
|
9
11
|
def initialize(id_gen = IdGenerator.new)
|
10
12
|
@registrations_by_session = {}
|
11
13
|
@registrations_by_procedure = Hash.new { |h, k| h[k] = {} }
|
12
14
|
@pending_calls = {}
|
13
|
-
@pending_invocations = {}
|
14
15
|
@id_gen = id_gen
|
15
16
|
@sessions = {}
|
16
17
|
end
|
@@ -63,23 +64,18 @@ module Wampproto
|
|
63
64
|
|
64
65
|
registration_id, callee_id = registrations.first
|
65
66
|
|
66
|
-
pending_calls[callee_id] = {} unless pending_calls.include?(callee_id)
|
67
|
-
pending_invocations[callee_id] = {} unless pending_invocations.include?(callee_id)
|
68
|
-
|
69
|
-
# we received call from the "caller" lets call that request_id "1"
|
70
|
-
# we need to send invocation message to "callee" let call that request_id "10"
|
71
|
-
# we need "caller" id after we have received yield so that request_id will be "10"
|
72
|
-
# we need to send request to "caller" to the original request_id 1
|
73
67
|
request_id = id_gen.next
|
74
68
|
|
75
|
-
|
69
|
+
details = invocation_details_for(session_id, message)
|
76
70
|
|
77
|
-
pending_calls[callee_id]
|
71
|
+
pending_calls[[callee_id, request_id]] = PendingInvocation.new(
|
72
|
+
session_id, callee_id, message.request_id, request_id, details[:receive_progress]
|
73
|
+
)
|
78
74
|
|
79
75
|
invocation = Message::Invocation.new(
|
80
76
|
request_id,
|
81
77
|
registration_id,
|
82
|
-
|
78
|
+
details,
|
83
79
|
*message.args,
|
84
80
|
**message.kwargs
|
85
81
|
)
|
@@ -88,26 +84,42 @@ module Wampproto
|
|
88
84
|
end
|
89
85
|
|
90
86
|
def invocation_details_for(session_id, message)
|
91
|
-
|
87
|
+
options = {}
|
88
|
+
return options if message.options.empty?
|
89
|
+
|
90
|
+
receive_progress = message.options[:receive_progress]
|
91
|
+
options.merge!(receive_progress: true) if receive_progress
|
92
|
+
|
93
|
+
return options unless message.options.include?(:disclose_me)
|
92
94
|
|
93
95
|
session = sessions[session_id]
|
94
|
-
{ caller: session_id, caller_authid: session.authid, caller_authrole: session.authrole }
|
96
|
+
options.merge({ caller: session_id, caller_authid: session.authid, caller_authrole: session.authrole })
|
95
97
|
end
|
96
98
|
|
97
|
-
def handle_yield(session_id, message)
|
98
|
-
|
99
|
+
def handle_yield(session_id, message) # rubocop:disable Metrics/AbcSize
|
100
|
+
pending_invocation = pending_calls[[session_id, message.request_id]]
|
99
101
|
error_message = "no pending calls for session #{session_id}"
|
100
|
-
raise ValueError, error_message if
|
102
|
+
raise ValueError, error_message if pending_invocation.nil?
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
+
caller_id = pending_invocation.caller_id
|
105
|
+
request_id = pending_invocation.call_id
|
106
|
+
pending_calls.delete([session_id, message.request_id]) unless message.options[:progress]
|
104
107
|
|
105
|
-
|
106
|
-
|
107
|
-
result = Message::Result.new(request_id, {}, *message.args, **message.kwargs)
|
108
|
+
result = Message::Result.new(request_id, result_details_for(session_id, message), *message.args, **message.kwargs)
|
108
109
|
MessageWithRecipient.new(result, caller_id)
|
109
110
|
end
|
110
111
|
|
112
|
+
def result_details_for(session_id, message)
|
113
|
+
options = {}
|
114
|
+
return options if message.options.empty?
|
115
|
+
|
116
|
+
pending_invocation = pending_calls[[session_id, message.request_id]]
|
117
|
+
|
118
|
+
progress = message.options[:progress] && pending_invocation.receive_progress
|
119
|
+
options.merge!(progress:) if progress
|
120
|
+
options
|
121
|
+
end
|
122
|
+
|
111
123
|
def handle_register(session_id, message)
|
112
124
|
error_message = "cannot register, session #{session_id} doesn't exist"
|
113
125
|
raise ValueError, error_message unless registrations_by_session.include?(session_id)
|
data/lib/wampproto/session.rb
CHANGED
@@ -36,7 +36,7 @@ module Wampproto
|
|
36
36
|
raise ValueError, "cannot yield for unknown invocation request"
|
37
37
|
end
|
38
38
|
|
39
|
-
invocation_requests.delete(msg.request_id)
|
39
|
+
invocation_requests.delete(msg.request_id) unless msg.options[:progress]
|
40
40
|
when Message::Publish
|
41
41
|
publish_requests[msg.request_id] = msg.request_id if msg.options.fetch(:acknowledge, false)
|
42
42
|
when Message::Subscribe
|
@@ -62,7 +62,8 @@ module Wampproto
|
|
62
62
|
case msg
|
63
63
|
when Message::Result
|
64
64
|
error_message = "received RESULT for invalid request_id"
|
65
|
-
|
65
|
+
request_id = msg.details[:progress] ? call_requests.fetch(msg.request_id) : call_requests.delete(msg.request_id)
|
66
|
+
raise ValueError, error_message unless request_id
|
66
67
|
when Message::Registered
|
67
68
|
error_message = "received REGISTERED for invalid request_id"
|
68
69
|
raise ValueError, error_message unless register_requests.delete(msg.request_id)
|
data/lib/wampproto/version.rb
CHANGED
data/sig/wampproto/dealer.rbs
CHANGED
@@ -7,9 +7,9 @@ module Wampproto
|
|
7
7
|
|
8
8
|
@sessions: Hash[Integer, SessionDetails]
|
9
9
|
|
10
|
-
|
10
|
+
PendingInvocation: untyped
|
11
11
|
|
12
|
-
@
|
12
|
+
@pending_calls: Hash[[Integer, Integer], untyped]
|
13
13
|
|
14
14
|
@id_gen: IdGenerator
|
15
15
|
|
@@ -19,9 +19,7 @@ module Wampproto
|
|
19
19
|
|
20
20
|
attr_reader sessions: Hash[Integer, SessionDetails]
|
21
21
|
|
22
|
-
attr_reader pending_calls: Hash[Integer,
|
23
|
-
|
24
|
-
attr_reader pending_invocations: Hash[Integer, Hash[Integer, Integer]]
|
22
|
+
attr_reader pending_calls: Hash[[Integer, Integer], untyped]
|
25
23
|
|
26
24
|
attr_reader id_gen: IdGenerator
|
27
25
|
|
@@ -44,6 +42,8 @@ module Wampproto
|
|
44
42
|
def handle_unregister: (Integer session_id, Message::Unregister message) -> (nil | MessageWithRecipient)
|
45
43
|
|
46
44
|
def invocation_details_for: (Integer session_id, untyped message) -> Hash[Symbol, untyped]
|
45
|
+
|
46
|
+
def result_details_for: (Integer _session_id, untyped message) -> Hash[Symbol, untyped]
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
data/wampproto.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
34
34
|
spec.require_paths = ["lib"]
|
35
35
|
|
36
|
+
spec.add_dependency "base64", "~> 0.2.0"
|
36
37
|
spec.add_dependency "cbor", "~> 0.5.9.8"
|
37
38
|
spec.add_dependency "ed25519", "~> 1.3"
|
38
39
|
spec.add_dependency "msgpack", "~> 1.7.2"
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wampproto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ismail Akram
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-05-
|
11
|
+
date: 2024-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: base64
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.2.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: cbor
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -189,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
203
|
- !ruby/object:Gem::Version
|
190
204
|
version: '0'
|
191
205
|
requirements: []
|
192
|
-
rubygems_version: 3.
|
206
|
+
rubygems_version: 3.5.9
|
193
207
|
signing_key:
|
194
208
|
specification_version: 4
|
195
209
|
summary: Sans-IO WAMP protocol implementation in Ruby
|