Skip to content

Commit b83ba9c

Browse files
Implement progressive call results
1 parent 64ca6f4 commit b83ba9c

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

lib/src/session.dart

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class Session {
3838
}
3939

4040
final Map<int, Completer<Result>> _callRequests = {};
41+
final Map<int, Function(Result result)> _progressHandlerByRequestID = {};
4142
final Map<int, RegisterRequest> _registerRequests = {};
4243
final Map<int, Result Function(Invocation)> _registrations = {};
4344
final Map<int, UnregisterRequest> _unregisterRequests = {};
@@ -49,9 +50,18 @@ class Session {
4950

5051
void _processIncomingMessage(msg.Message message) {
5152
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);
5565
}
5666
} else if (message is msg.Registered) {
5767
var request = _registerRequests.remove(message.requestID);
@@ -62,9 +72,17 @@ class Session {
6272
} else if (message is msg.Invocation) {
6373
var endpoint = _registrations[message.registrationID];
6474
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+
}
6583
msg.Message msgToSend;
6684
try {
67-
var result = endpoint(Invocation(args: message.args, kwargs: message.kwargs, details: message.details));
85+
var result = endpoint(invocation);
6886
msgToSend = msg.Yield(message.requestID, args: result.args, kwargs: result.kwargs, options: result.details);
6987
} on ApplicationError catch (e) {
7088
msgToSend = msg.Error(message.messageType(), message.requestID, e.message, args: e.args, kwargs: e.kwargs);
@@ -163,9 +181,15 @@ class Session {
163181
List<dynamic>? args,
164182
Map<String, dynamic>? kwargs,
165183
Map<String, dynamic>? options,
184+
Function(Result result)? progressHandler,
166185
}) {
167186
var call = msg.Call(_nextID, procedure, args: args, kwargs: kwargs, options: options);
168187

188+
if (progressHandler != null) {
189+
call.options["receive_progress"] = true;
190+
_progressHandlerByRequestID[call.requestID] = progressHandler;
191+
}
192+
169193
var completer = Completer<Result>();
170194
_callRequests[call.requestID] = completer;
171195

lib/src/types.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ class Invocation {
162162
final List<dynamic> args;
163163
final Map<String, dynamic> kwargs;
164164
final Map<String, dynamic> details;
165+
166+
late Function(List<dynamic>? args, Map<String, dynamic>? kwargs) sendProgress;
165167
}
166168

167169
class UnregisterRequest {

0 commit comments

Comments
 (0)