Skip to content

Commit c39d66b

Browse files
Implement progressive call results
1 parent f15ea45 commit c39d66b

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

lib/src/session.dart

Lines changed: 40 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(List<dynamic>? args, Map<String, dynamic>? kwargs)> _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(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);
5565
}
5666
} else if (message is msg.Registered) {
5767
var request = _registerRequests.remove(message.requestID);
@@ -62,7 +72,15 @@ class Session {
6272
} else if (message is msg.Invocation) {
6373
var endpoint = _registrations[message.registrationID];
6474
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);
6684
Object data = _wampSession.sendMessage(
6785
msg.Yield(message.requestID, args: result.args, kwargs: result.kwargs, options: result.details),
6886
);
@@ -166,6 +184,24 @@ class Session {
166184
return completer.future;
167185
}
168186

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+
169205
Future<Registration> register(
170206
String procedure,
171207
Result Function(Invocation invocation) endpoint, {

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)