wampproto 0.1.1 → 0.1.2
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.
- 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
|