@@ -28,18 +28,18 @@ function RPC(_socket) constructor {
2828 // /
2929 // / @param {String} method - Name of the method to be invoked.
3030 // / @param {Struct|Array} params - Parameters to be used in the request.
31- // / @param {Function} callback - Function to execute when the result is received successfully.
32- // / @param {Function} errback - Function to execute when an error occurs.
3331 // / @param {Function} socket - Socket to which the request will be sent.
3432 // / @param {Real} timeout - Time, in seconds, to wait for the request result before timing out.
35- static sendRequest = function (_method, _params, _callback, _errback, _socket = socket, _timeout = timeout) {
33+ static sendRequest = function (_method, _params, _socket = socket, _timeout = timeout) {
3634 var _id = generateID ();
3735 sendJSON ({
3836 " method" : _method,
3937 " params" : _params,
4038 " id" : _id
4139 }, _socket);
42- requests.setElement (_id, new RPCRequest (_id, _callback, _errback, _timeout, self));
40+ var _request = new RPCRequest (_id, _timeout, self);
41+ requests.setElement (_id, _request);
42+ return _request;
4343 }
4444 static sendNotification = function (_method, _params, _socket = socket) {
4545 sendJSON ({
@@ -109,10 +109,7 @@ function RPC(_socket) constructor {
109109 var _id = _data.id ;
110110 if (requests.hasElement (_id)) {
111111 var _request = requests.getElement (_id);
112- var _call = _request.callback ;
113- if (is_method (_call)) {
114- _call (_data.result );
115- }
112+ var _callback_result = _request.runCallback (_data.result );
116113 _request.cancel ();
117114 requests.removeElement (_id);
118115 } else {
@@ -126,10 +123,7 @@ function RPC(_socket) constructor {
126123 var _id = _data.id ;
127124 if (requests.hasElement (_id)) {
128125 var _request = requests.getElement (_id);
129- var _call = _request.errback ;
130- if (is_method (_call)) {
131- _call (_error);
132- }
126+ _request.runErrback (_error);
133127 _request.cancel ();
134128 requests.removeElement (_id);
135129 }
@@ -143,22 +137,59 @@ function RPC(_socket) constructor {
143137 return increment;
144138 }
145139}
146- function RPCRequest (_id, _callback, _errback, _timeout, _parent) constructor {
140+ function RPCRequest (_id, _timeout, _parent) constructor {
147141 self.requestID = _id;
148142 self.parent = _parent;
149- self.callback = _callback;
150- self.errback = _errback;
143+ self.callbacks = [];
144+ self.errback = undefined;
145+ self.finallyMethod = undefined;
146+ static onCallback = function (_callback) {
147+ array_push (self.callbacks , _callback);
148+ return self;
149+ }
150+ static onError = function (_errback) {
151+ self.errback = _errback;
152+ return self;
153+ }
154+ static onFinally = function (_finally) {
155+ self.finallyMethod = _finally;
156+ return self;
157+ }
158+ static runCallback = function (_params) {
159+ if (array_length (self.callbacks ) > 0 ) {
160+ var _callback = self.callbacks [0 ];
161+ if (is_method (_callback)) {
162+ var _callback_result = _callback (_params);
163+ if (is_struct (_callback_result) && is_instanceof (_callback_result, RPCRequest)) {
164+ array_delete (callbacks, 0 , 1 );
165+ _callback_result.callbacks = callbacks;
166+ _callback_result.onError (errback);
167+ _callback_result.onFinally (finallyMethod);
168+ return ;
169+ }
170+ }
171+ }
172+ runFinally ();
173+ }
174+ static runErrback = function (_error) {
175+ if (is_method (self.errback )) {
176+ self.errback (_error);
177+ }
178+ self.runFinally ();
179+ }
180+ static runFinally = function () {
181+ if (!is_method (finallyMethod)) return ;
182+ self.finallyMethod ();
183+ }
151184 self.call = call_later (_timeout, time_source_units_seconds, function () {
152185 var _requests = parent.requests ;
153186 if (!_requests.hasElement (requestID)) return ;
154- var _call = _requests.getElement (requestID). errback ;
187+ var _request = _requests.getElement (requestID);
155188 var _error = {
156189 code: -32603 ,
157190 message: " Timeout error"
158191 };
159- if (is_method (_call)) {
160- _call (_error);
161- }
192+ _request.runErrback (_error);
162193 _requests.removeElement (requestID);
163194 });
164195 static cancel = function () {
0 commit comments