@@ -38,6 +38,7 @@ class Session {
38
38
}
39
39
40
40
final Map <int , Completer <Result >> _callRequests = {};
41
+ final Map <int , Function (Result result)> _progressHandlerByRequestID = {};
41
42
final Map <int , RegisterRequest > _registerRequests = {};
42
43
final Map <int , Result Function (Invocation )> _registrations = {};
43
44
final Map <int , UnregisterRequest > _unregisterRequests = {};
@@ -49,9 +50,18 @@ class Session {
49
50
50
51
void _processIncomingMessage (msg.Message message) {
51
52
if (message is msg.Result ) {
52
- var request = _callRequests.remove (message.requestID);
53
- if (request != null ) {
54
- request.complete (Result (args: message.args, kwargs: message.kwargs, details: message.details));
53
+ var progress = message.details["progress" ] ?? false ;
54
+ if (progress) {
55
+ var progressHandler = _progressHandlerByRequestID[message.requestID];
56
+ if (progressHandler != null ) {
57
+ progressHandler (Result (args: message.args, kwargs: message.kwargs));
58
+ }
59
+ } else {
60
+ var request = _callRequests.remove (message.requestID);
61
+ if (request != null ) {
62
+ request.complete (Result (args: message.args, kwargs: message.kwargs, details: message.details));
63
+ }
64
+ _progressHandlerByRequestID.remove (message.requestID);
55
65
}
56
66
} else if (message is msg.Registered ) {
57
67
var request = _registerRequests.remove (message.requestID);
@@ -62,9 +72,17 @@ class Session {
62
72
} else if (message is msg.Invocation ) {
63
73
var endpoint = _registrations[message.registrationID];
64
74
if (endpoint != null ) {
75
+ var invocation = Invocation (args: message.args, kwargs: message.kwargs, details: message.details);
76
+ if (message.details["receive_progress" ] ?? false ) {
77
+ invocation.sendProgress = (args, kwargs) {
78
+ var yield = msg.Yield (message.requestID, args: args, kwargs: kwargs, options: {"progress" : true });
79
+ var data = _wampSession.sendMessage (yield );
80
+ _baseSession.send (data);
81
+ };
82
+ }
65
83
msg.Message msgToSend;
66
84
try {
67
- var result = endpoint (Invocation (args : message.args, kwargs : message.kwargs, details : message.details) );
85
+ var result = endpoint (invocation );
68
86
msgToSend = msg.Yield (message.requestID, args: result.args, kwargs: result.kwargs, options: result.details);
69
87
} on ApplicationError catch (e) {
70
88
msgToSend = msg.Error (message.messageType (), message.requestID, e.message, args: e.args, kwargs: e.kwargs);
@@ -163,9 +181,15 @@ class Session {
163
181
List <dynamic >? args,
164
182
Map <String , dynamic >? kwargs,
165
183
Map <String , dynamic >? options,
184
+ Function (Result result)? progressHandler,
166
185
}) {
167
186
var call = msg.Call (_nextID, procedure, args: args, kwargs: kwargs, options: options);
168
187
188
+ if (progressHandler != null ) {
189
+ call.options["receive_progress" ] = true ;
190
+ _progressHandlerByRequestID[call.requestID] = progressHandler;
191
+ }
192
+
169
193
var completer = Completer <Result >();
170
194
_callRequests[call.requestID] = completer;
171
195
0 commit comments