@@ -38,6 +38,7 @@ class Session {
38
38
}
39
39
40
40
final Map <int , Completer <Result >> _callRequests = {};
41
+ final Map <int , Function (List <dynamic >? args, Map <String , dynamic >? kwargs)> _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 (message.args, 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,7 +72,15 @@ class Session {
62
72
} else if (message is msg.Invocation ) {
63
73
var endpoint = _registrations[message.registrationID];
64
74
if (endpoint != null ) {
65
- Result result = endpoint (Invocation (args: message.args, kwargs: message.kwargs, details: message.details));
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
+ }
83
+ Result result = endpoint (invocation);
66
84
Object data = _wampSession.sendMessage (
67
85
msg.Yield (message.requestID, args: result.args, kwargs: result.kwargs, options: result.details),
68
86
);
@@ -166,6 +184,24 @@ class Session {
166
184
return completer.future;
167
185
}
168
186
187
+ Future <Result > callProgressive (
188
+ String procedure,
189
+ Function (List <dynamic >? args, Map <String , dynamic >? kwargs) progressHandler, {
190
+ List <dynamic >? args,
191
+ Map <String , dynamic >? kwargs,
192
+ Map <String , dynamic >? options,
193
+ }) async {
194
+ var call = msg.Call (_nextID, procedure, args: args, kwargs: kwargs, options: {"receive_progress" : true });
195
+
196
+ var completer = Completer <Result >();
197
+ _callRequests[call.requestID] = completer;
198
+
199
+ _baseSession.send (_wampSession.sendMessage (call));
200
+ _progressHandlerByRequestID[call.requestID] = progressHandler;
201
+
202
+ return completer.future;
203
+ }
204
+
169
205
Future <Registration > register (
170
206
String procedure,
171
207
Result Function (Invocation invocation) endpoint, {
0 commit comments