Skip to content

Commit cfd5b45

Browse files
Implemented errback chain
1 parent 930e3b3 commit cfd5b45

File tree

11 files changed

+131
-77
lines changed

11 files changed

+131
-77
lines changed

GM Netcode.resource_order

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
{
22
"FolderOrderSettings": [
3-
{"name":"Classes","order":2,"path":"folders/Scripts/Netcode/Classes.yy",},
4-
{"name":"TCP","order":4,"path":"folders/Scripts/Netcode/TCP.yy",},
5-
{"name":"WebSocket","order":5,"path":"folders/Scripts/Netcode/WebSocket.yy",},
3+
{"name":"Classes","order":3,"path":"folders/Scripts/Netcode/Classes.yy",},
4+
{"name":"WebSocket","order":1,"path":"folders/Scripts/Netcode/Protocol/WebSocket.yy",},
5+
{"name":"RPC","order":2,"path":"folders/Scripts/Netcode/RPC.yy",},
6+
{"name":"Protocol","order":6,"path":"folders/Scripts/Netcode/Protocol.yy",},
67
],
78
"ResourceOrderSettings": [
89
{"name":"Socket","order":4,"path":"scripts/Socket/Socket.yy",},
910
{"name":"Client","order":2,"path":"scripts/Client/Client.yy",},
1011
{"name":"obj_client","order":1,"path":"objects/obj_client/obj_client.yy",},
1112
{"name":"obj_client_status","order":3,"path":"objects/obj_client_status/obj_client_status.yy",},
12-
{"name":"RPC","order":1,"path":"scripts/RPC/RPC.yy",},
1313
{"name":"obj_controller","order":1,"path":"objects/obj_controller/obj_controller.yy",},
1414
{"name":"Server","order":3,"path":"scripts/Server/Server.yy",},
1515
{"name":"WebSocket","order":1,"path":"scripts/WebSocket/WebSocket.yy",},
1616
{"name":"Manager","order":2,"path":"scripts/Manager/Manager.yy",},
1717
{"name":"TCPSocket","order":1,"path":"scripts/TCPSocket/TCPSocket.yy",},
1818
{"name":"GameClient","order":1,"path":"scripts/GameClient/GameClient.yy",},
19+
{"name":"RPCRequest","order":1,"path":"scripts/RPCRequest/RPCRequest.yy",},
1920
{"name":"obj_server_status","order":2,"path":"objects/obj_server_status/obj_server_status.yy",},
2021
],
2122
}

GM Netcode.yyp

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/GameClient/GameClient.gml

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,45 @@ function GameClient(_ip, _port) : TCPSocket(_ip, _port) constructor {
3535
.onCallback(function(_result) {
3636
show_debug_message(_result);
3737
});
38-
// Example with chaining callbacks
39-
rpc.sendRequest("sum", [1, 2])
38+
// Example with callback chain
39+
rpc.sendRequest("sum", [1, 5])
4040
.onCallback(function(_result) {
41-
return rpc.sendRequest("sum", [_result, 3])
41+
// Result is sum(1, 5) = 6, then request sum(6, 15)
42+
return rpc.sendRequest("sum", [_result, 15])
4243
})
4344
.onCallback(function(_result) {
45+
// This callback isn't executed because the result was higher than 10 (error)
4446
return rpc.sendRequest("sum", [_result, 4])
4547
})
4648
.onCallback(function(_result) {
47-
show_debug_message(_result); // 1 + 2 + 3 + 4 = 10
49+
// This callback isn't executed because the previous one wasn't executed
50+
show_debug_message(_result);
4851
})
4952
.onError(function(_error) {
53+
// This is executed because sum(6, 16) resulted in an error
5054
show_debug_message(_error.message);
55+
return rpc.sendRequest("sum", [1, 2]);
56+
})
57+
.onCallback(function(_result) {
58+
// Result is sum(1, 2) = 3, then request sum(3, 3)
59+
return rpc.sendRequest("sum", [_result, 3])
60+
})
61+
.onCallback(function(_result) {
62+
// Result is sum(3, 3) = 6, then request sum(6, 4)
63+
return rpc.sendRequest("sum", [_result, 5])
64+
})
65+
.onCallback(function(_result) {
66+
// Result is 10
67+
show_debug_message(_result);
68+
})
69+
.onFinally(function() {
70+
// Always execute this
71+
show_debug_message("Finally");
5172
});
5273
sendPing();
5374
});
5475
static step = function() {
55-
if (mouse_check_button_pressed(mb_left)) {
76+
if (mouse_check_button(mb_left)) {
5677
// Send notification to create ball
5778
rpc.sendNotification("create_ball", {
5879
x: mouse_x,

scripts/RPC/RPC.gml

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -137,63 +137,3 @@ function RPC(_socket) constructor {
137137
return increment;
138138
}
139139
}
140-
function RPCRequest(_id, _timeout, _parent) constructor {
141-
self.requestID = _id;
142-
self.parent = _parent;
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-
}
184-
self.call = call_later(_timeout, time_source_units_seconds, function() {
185-
var _requests = parent.requests;
186-
if (!_requests.hasElement(requestID)) return;
187-
var _request = _requests.getElement(requestID);
188-
var _error = {
189-
code: -32603,
190-
message: "Timeout error"
191-
};
192-
_request.runErrback(_error);
193-
_requests.removeElement(requestID);
194-
});
195-
static cancel = function() {
196-
call_cancel(call);
197-
}
198-
}
199-

scripts/RPC/RPC.yy

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/RPCRequest/RPCRequest.gml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
function RPCRequest(_id, _timeout, _parent) constructor {
2+
self.requestID = _id;
3+
self.parent = _parent;
4+
self.callbacks = [[]];
5+
self.errbacks = [];
6+
self.finallyMethod = undefined;
7+
self.errorLevel = 0;
8+
self.runLevel = 0;
9+
static onCallback = function(_callback) {
10+
array_push(self.callbacks[self.errorLevel], _callback);
11+
return self;
12+
}
13+
static onError = function(_errback) {
14+
array_push(self.errbacks, _errback);
15+
self.errorLevel += 1;
16+
if (self.errorLevel >= array_length(self.callbacks)) {
17+
self.callbacks[self.errorLevel] = [];
18+
}
19+
return self;
20+
}
21+
static onFinally = function(_finally) {
22+
self.finallyMethod = _finally;
23+
return self;
24+
}
25+
static copy = function(_request) {
26+
self.runLevel = _request.runLevel;
27+
self.callbacks = _request.callbacks;
28+
self.errbacks = _request.errbacks;
29+
self.onFinally(_request.finallyMethod);
30+
}
31+
static runCallback = function(_params) {
32+
if (runLevel < array_length(callbacks) && array_length(callbacks[runLevel]) > 0) {
33+
var _callback_array = callbacks[runLevel];
34+
var _callback = _callback_array[0];
35+
if (is_method(_callback)) {
36+
var _callback_result = _callback(_params);
37+
if (is_struct(_callback_result) && is_instanceof(_callback_result, RPCRequest)) {
38+
array_delete(_callback_array, 0, 1);
39+
_callback_result.copy(self);
40+
return;
41+
}
42+
}
43+
}
44+
self.runFinally();
45+
}
46+
static runErrback = function(_error) {
47+
if (runLevel < array_length(errbacks)) {
48+
var _errback = errbacks[runLevel];
49+
if (is_method(_errback)) {
50+
var _error_result = _errback(_error);
51+
if (is_struct(_error_result) && is_instanceof(_error_result, RPCRequest)) {
52+
runLevel++;
53+
_error_result.copy(self);
54+
return;
55+
}
56+
}
57+
}
58+
self.runFinally();
59+
}
60+
static runFinally = function() {
61+
if (!is_method(finallyMethod)) return;
62+
self.finallyMethod();
63+
}
64+
self.call = call_later(_timeout, time_source_units_seconds, function() {
65+
var _requests = parent.requests;
66+
if (!_requests.hasElement(requestID)) return;
67+
var _request = _requests.getElement(requestID);
68+
var _error = {
69+
code: -32603,
70+
message: "Timeout error"
71+
};
72+
_request.runErrback(_error);
73+
_requests.removeElement(requestID);
74+
});
75+
static cancel = function() {
76+
call_cancel(call);
77+
}
78+
}

scripts/RPCRequest/RPCRequest.yy

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/TCPServer/TCPServer.yy

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/TCPSocket/TCPSocket.yy

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/WebSocket/WebSocket.yy

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)