@@ -30,6 +30,7 @@ class Session {
30
30
}
31
31
32
32
final Map <int , Completer <Result >> _callRequests = {};
33
+ final Map <int , Function (List <dynamic > args, Map <String , dynamic > kwargs)> _progressHandlerByRequestID = {};
33
34
final Map <int , RegisterRequest > _registerRequests = {};
34
35
final Map <int , Result Function (Invocation )> _registrations = {};
35
36
final Map <int , UnregisterRequest > _unregisterRequests = {};
@@ -40,9 +41,18 @@ class Session {
40
41
41
42
void _processIncomingMessage (msg.Message message) {
42
43
if (message is msg.Result ) {
43
- var request = _callRequests.remove (message.requestID);
44
- if (request != null ) {
45
- request.complete (Result (args: message.args, kwargs: message.kwargs, details: message.details));
44
+ var progress = message.details["progress" ] ?? false ;
45
+ if (progress) {
46
+ var progressHandler = _progressHandlerByRequestID[message.requestID];
47
+ if (progressHandler != null ) {
48
+ progressHandler (message.args, message.kwargs);
49
+ }
50
+ } else {
51
+ var request = _callRequests.remove (message.requestID);
52
+ if (request != null ) {
53
+ request.complete (Result (args: message.args, kwargs: message.kwargs, details: message.details));
54
+ }
55
+ _progressHandlerByRequestID.remove (message.requestID);
46
56
}
47
57
} else if (message is msg.Registered ) {
48
58
var request = _registerRequests.remove (message.requestID);
@@ -53,7 +63,15 @@ class Session {
53
63
} else if (message is msg.Invocation ) {
54
64
var endpoint = _registrations[message.registrationID];
55
65
if (endpoint != null ) {
56
- Result result = endpoint (Invocation (args: message.args, kwargs: message.kwargs, details: message.details));
66
+ var invocation = Invocation (args: message.args, kwargs: message.kwargs, details: message.details);
67
+ if (message.details["receive_progress" ] ?? false ) {
68
+ invocation.sendProgress = (args, kwargs) {
69
+ var yield = msg.Yield (message.requestID, args: args, kwargs: kwargs, options: {"progress" : true });
70
+ var data = _wampSession.sendMessage (yield );
71
+ _baseSession.send (data);
72
+ };
73
+ }
74
+ Result result = endpoint (invocation);
57
75
Object data = _wampSession.sendMessage (
58
76
msg.Yield (message.requestID, args: result.args, kwargs: result.kwargs, options: result.details),
59
77
);
@@ -133,6 +151,24 @@ class Session {
133
151
return completer.future;
134
152
}
135
153
154
+ Future <Result > callProgressive (
155
+ String procedure,
156
+ Function (List <dynamic > args, Map <String , dynamic > kwargs) progressHandler, {
157
+ List <dynamic >? args,
158
+ Map <String , dynamic >? kwargs,
159
+ Map <String , dynamic >? options,
160
+ }) async {
161
+ var call = msg.Call (_nextID, procedure, args: args, kwargs: kwargs, options: {"receive_progress" : true });
162
+
163
+ var completer = Completer <Result >();
164
+ _callRequests[call.requestID] = completer;
165
+
166
+ _baseSession.send (_wampSession.sendMessage (call));
167
+ _progressHandlerByRequestID[call.requestID] = progressHandler;
168
+
169
+ return completer.future;
170
+ }
171
+
136
172
Future <Registration > register (String procedure, Result Function (Invocation ) endpoint) {
137
173
var register = msg.Register (_nextID, procedure);
138
174
0 commit comments