@rbxts/tether 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/emitters/client-emitter.luau +2 -2
- package/out/emitters/message-emitter.d.ts +6 -2
- package/out/emitters/message-emitter.luau +84 -14
- package/out/emitters/server-emitter.luau +1 -1
- package/out/middleware.d.ts +17 -2
- package/out/middleware.luau +79 -8
- package/out/relayer.luau +1 -1
- package/package.json +1 -1
|
@@ -33,7 +33,7 @@ do
|
|
|
33
33
|
error("[tether::error] Cannot emit message from client to client")
|
|
34
34
|
end
|
|
35
35
|
task.spawn(function()
|
|
36
|
-
local _binding = self.master:
|
|
36
|
+
local _binding = self.master:runClientSendMiddlewares(message, data, player)
|
|
37
37
|
local dropRequest = _binding[1]
|
|
38
38
|
local newData = _binding[2]
|
|
39
39
|
if dropRequest then
|
|
@@ -80,7 +80,7 @@ do
|
|
|
80
80
|
error("[tether::error] Cannot emit message from client to all clients")
|
|
81
81
|
end
|
|
82
82
|
task.spawn(function()
|
|
83
|
-
local _binding = self.master:
|
|
83
|
+
local _binding = self.master:runClientSendMiddlewares(message, data)
|
|
84
84
|
local dropRequest = _binding[1]
|
|
85
85
|
local newData = _binding[2]
|
|
86
86
|
if dropRequest then
|
|
@@ -29,13 +29,17 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
|
|
|
29
29
|
static create<MessageData>(options?: Partial<MessageEmitterOptions<MessageData>>, meta?: Modding.Many<MessageEmitterMetadata<MessageData>>): MessageEmitter<MessageData>;
|
|
30
30
|
private constructor();
|
|
31
31
|
/** @hidden */
|
|
32
|
-
|
|
32
|
+
runClientSendMiddlewares<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind], player?: Player | Player[]): [boolean, MessageData[Kind]];
|
|
33
33
|
/** @hidden */
|
|
34
|
-
|
|
34
|
+
runServerSendMiddlewares<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind]): [boolean, MessageData[Kind]];
|
|
35
35
|
/** @hidden */
|
|
36
36
|
onRemoteFire(isServer: boolean, serializedPackets: SerializedPacket[], player?: Player): void;
|
|
37
|
+
private runServerReceiveMiddlewares;
|
|
38
|
+
private runClientReceiveMiddlewares;
|
|
37
39
|
private validateData;
|
|
38
40
|
private executeFunctions;
|
|
39
41
|
private executeEventCallbacks;
|
|
42
|
+
private executeServerCallback;
|
|
43
|
+
private executeClientCallback;
|
|
40
44
|
private deserializeAndValidate;
|
|
41
45
|
}
|
|
@@ -84,7 +84,7 @@ do
|
|
|
84
84
|
end
|
|
85
85
|
return emitter
|
|
86
86
|
end
|
|
87
|
-
function MessageEmitter:
|
|
87
|
+
function MessageEmitter:runClientSendMiddlewares(message, data, player)
|
|
88
88
|
if not self:validateData(message, data) then
|
|
89
89
|
return { true, data }
|
|
90
90
|
end
|
|
@@ -99,7 +99,7 @@ do
|
|
|
99
99
|
for _, globalMiddleware in self.middleware:getClientGlobal() do
|
|
100
100
|
local result = globalMiddleware(players, ctx)
|
|
101
101
|
if not self:validateData(message, ctx.data, "Invalid data after global client middleware") then
|
|
102
|
-
return {
|
|
102
|
+
return { true, ctx.data }
|
|
103
103
|
end
|
|
104
104
|
if result == DropRequest then
|
|
105
105
|
self.middleware:notifyRequestDropped(message, "Global client middleware")
|
|
@@ -109,7 +109,7 @@ do
|
|
|
109
109
|
for _, middleware in self.middleware:getClient(message) do
|
|
110
110
|
local result = middleware(players, ctx)
|
|
111
111
|
if not self:validateData(message, ctx.data, "Invalid data after client middleware") then
|
|
112
|
-
return {
|
|
112
|
+
return { true, ctx.data }
|
|
113
113
|
end
|
|
114
114
|
if result == DropRequest then
|
|
115
115
|
self.middleware:notifyRequestDropped(message, "Client middleware")
|
|
@@ -121,7 +121,7 @@ do
|
|
|
121
121
|
end
|
|
122
122
|
return { false, ctx.data }
|
|
123
123
|
end
|
|
124
|
-
function MessageEmitter:
|
|
124
|
+
function MessageEmitter:runServerSendMiddlewares(message, data)
|
|
125
125
|
if not self:validateData(message, data) then
|
|
126
126
|
return { true, data }
|
|
127
127
|
end
|
|
@@ -134,7 +134,7 @@ do
|
|
|
134
134
|
}
|
|
135
135
|
for _, globalMiddleware in self.middleware:getServerGlobal() do
|
|
136
136
|
if not self:validateData(message, ctx.data, "Invalid data after global server middleware") then
|
|
137
|
-
return {
|
|
137
|
+
return { true, ctx.data }
|
|
138
138
|
end
|
|
139
139
|
local result = globalMiddleware(ctx)
|
|
140
140
|
if result == DropRequest then
|
|
@@ -144,7 +144,7 @@ do
|
|
|
144
144
|
end
|
|
145
145
|
for _, middleware in self.middleware:getServer(message) do
|
|
146
146
|
if not self:validateData(message, ctx.data, "Invalid data after server middleware") then
|
|
147
|
-
return {
|
|
147
|
+
return { true, ctx.data }
|
|
148
148
|
end
|
|
149
149
|
local result = middleware(ctx)
|
|
150
150
|
if result == DropRequest then
|
|
@@ -167,6 +167,58 @@ do
|
|
|
167
167
|
self:executeFunctions(isServer, message, packet)
|
|
168
168
|
end
|
|
169
169
|
end
|
|
170
|
+
function MessageEmitter:runServerReceiveMiddlewares(message, player, data)
|
|
171
|
+
if not self:validateData(message, data) then
|
|
172
|
+
return { true, data }
|
|
173
|
+
end
|
|
174
|
+
local ctx = {
|
|
175
|
+
message = message,
|
|
176
|
+
data = data,
|
|
177
|
+
getRawData = function()
|
|
178
|
+
return self.serdes:serializePacket(message, data)
|
|
179
|
+
end,
|
|
180
|
+
}
|
|
181
|
+
for _, middleware in self.middleware:getServerReceive(message) do
|
|
182
|
+
if not self:validateData(message, ctx.data, "Invalid data after server receive middleware") then
|
|
183
|
+
return { true, ctx.data }
|
|
184
|
+
end
|
|
185
|
+
local result = middleware(player, ctx)
|
|
186
|
+
if result == DropRequest then
|
|
187
|
+
self.middleware:notifyRequestDropped(message, "Server receive middleware")
|
|
188
|
+
return { true, ctx.data }
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
if not self:validateData(message, ctx.data) then
|
|
192
|
+
return { true, ctx.data }
|
|
193
|
+
end
|
|
194
|
+
return { false, ctx.data }
|
|
195
|
+
end
|
|
196
|
+
function MessageEmitter:runClientReceiveMiddlewares(message, data)
|
|
197
|
+
if not self:validateData(message, data) then
|
|
198
|
+
return { true, data }
|
|
199
|
+
end
|
|
200
|
+
local ctx = {
|
|
201
|
+
message = message,
|
|
202
|
+
data = data,
|
|
203
|
+
getRawData = function()
|
|
204
|
+
return self.serdes:serializePacket(message, data)
|
|
205
|
+
end,
|
|
206
|
+
}
|
|
207
|
+
for _, middleware in self.middleware:getClientReceive(message) do
|
|
208
|
+
if not self:validateData(message, ctx.data, "Invalid data after client receive middleware") then
|
|
209
|
+
return { true, ctx.data }
|
|
210
|
+
end
|
|
211
|
+
local result = middleware(ctx)
|
|
212
|
+
if result == DropRequest then
|
|
213
|
+
self.middleware:notifyRequestDropped(message, "Client receive middleware")
|
|
214
|
+
return { true, ctx.data }
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
if not self:validateData(message, ctx.data) then
|
|
218
|
+
return { true, ctx.data }
|
|
219
|
+
end
|
|
220
|
+
return { false, ctx.data }
|
|
221
|
+
end
|
|
170
222
|
function MessageEmitter:validateData(message, data, requestDropReason)
|
|
171
223
|
if requestDropReason == nil then
|
|
172
224
|
requestDropReason = "Invalid data"
|
|
@@ -188,9 +240,9 @@ do
|
|
|
188
240
|
if functions == nil then
|
|
189
241
|
return nil
|
|
190
242
|
end
|
|
191
|
-
local
|
|
243
|
+
local data = self:deserializeAndValidate(message, serializedPacket)
|
|
192
244
|
for callback in functions do
|
|
193
|
-
callback
|
|
245
|
+
self:executeClientCallback(callback, message, data)
|
|
194
246
|
end
|
|
195
247
|
end
|
|
196
248
|
function MessageEmitter:executeEventCallbacks(isServer, message, serializedPacket, player)
|
|
@@ -200,21 +252,39 @@ do
|
|
|
200
252
|
if callbacks == nil then
|
|
201
253
|
return nil
|
|
202
254
|
end
|
|
203
|
-
local
|
|
255
|
+
local data = self:deserializeAndValidate(message, serializedPacket)
|
|
204
256
|
for callback in callbacks do
|
|
205
257
|
if isServer then
|
|
206
258
|
local _arg0 = player ~= nil
|
|
207
259
|
assert(_arg0)
|
|
208
|
-
callback
|
|
260
|
+
self:executeServerCallback(callback, player, message, data)
|
|
209
261
|
else
|
|
210
|
-
callback
|
|
262
|
+
self:executeClientCallback(callback, message, data)
|
|
211
263
|
end
|
|
212
264
|
end
|
|
213
265
|
end
|
|
266
|
+
function MessageEmitter:executeServerCallback(callback, player, message, data)
|
|
267
|
+
local _binding = self:runServerReceiveMiddlewares(message, player, data)
|
|
268
|
+
local dropRequest = _binding[1]
|
|
269
|
+
local newData = _binding[2]
|
|
270
|
+
if dropRequest then
|
|
271
|
+
return nil
|
|
272
|
+
end
|
|
273
|
+
callback(player, newData)
|
|
274
|
+
end
|
|
275
|
+
function MessageEmitter:executeClientCallback(callback, message, data)
|
|
276
|
+
local _binding = self:runClientReceiveMiddlewares(message, data)
|
|
277
|
+
local dropRequest = _binding[1]
|
|
278
|
+
local newData = _binding[2]
|
|
279
|
+
if dropRequest then
|
|
280
|
+
return nil
|
|
281
|
+
end
|
|
282
|
+
callback(newData)
|
|
283
|
+
end
|
|
214
284
|
function MessageEmitter:deserializeAndValidate(message, serializedPacket)
|
|
215
|
-
local
|
|
216
|
-
self:validateData(message,
|
|
217
|
-
return
|
|
285
|
+
local data = self.serdes:deserializePacket(message, serializedPacket)
|
|
286
|
+
self:validateData(message, data)
|
|
287
|
+
return data
|
|
218
288
|
end
|
|
219
289
|
end
|
|
220
290
|
return {
|
|
@@ -31,7 +31,7 @@ do
|
|
|
31
31
|
error("[tether::error] Cannot emit message from server to server")
|
|
32
32
|
end
|
|
33
33
|
task.spawn(function()
|
|
34
|
-
local _binding = self.master:
|
|
34
|
+
local _binding = self.master:runServerSendMiddlewares(message, data)
|
|
35
35
|
local dropRequest = _binding[1]
|
|
36
36
|
local newData = _binding[2]
|
|
37
37
|
if dropRequest then
|
package/out/middleware.d.ts
CHANGED
|
@@ -20,9 +20,17 @@ type RequestDropCallback = (message: BaseMessage, reason?: string) => void;
|
|
|
20
20
|
export declare class MiddlewareProvider<MessageData> {
|
|
21
21
|
private readonly clientGlobalMiddlewares;
|
|
22
22
|
private readonly serverGlobalMiddlewares;
|
|
23
|
-
private readonly
|
|
24
|
-
private readonly
|
|
23
|
+
private readonly clientSendMiddlewares;
|
|
24
|
+
private readonly serverSendMiddlewares;
|
|
25
|
+
private readonly serverReceiveMiddlewares;
|
|
26
|
+
private readonly clientReceiveMiddlewares;
|
|
25
27
|
private readonly requestDroppedCallbacks;
|
|
28
|
+
/**
|
|
29
|
+
* Registers a callback to be called whenever a message is dropped.
|
|
30
|
+
* The callback will receive the message that was dropped and an optional reason string.
|
|
31
|
+
*
|
|
32
|
+
* @returns A function that can be called to unregister the callback.
|
|
33
|
+
*/
|
|
26
34
|
onRequestDropped(callback: RequestDropCallback): () => void;
|
|
27
35
|
/** @hidden */
|
|
28
36
|
notifyRequestDropped(message: BaseMessage, reason?: string): void;
|
|
@@ -34,9 +42,16 @@ export declare class MiddlewareProvider<MessageData> {
|
|
|
34
42
|
getClientGlobal<Data>(): ClientMiddleware<Data>[];
|
|
35
43
|
/** @hidden */
|
|
36
44
|
getServerGlobal<Data>(): ServerMiddleware<Data>[];
|
|
45
|
+
/** @hidden */
|
|
46
|
+
getClientReceive<Kind extends keyof MessageData>(message: Kind & BaseMessage): ServerMiddleware<MessageData[Kind]>[];
|
|
47
|
+
/** @hidden */
|
|
48
|
+
getServerReceive<Kind extends keyof MessageData>(message: Kind & BaseMessage): ClientMiddleware<MessageData[Kind]>[];
|
|
37
49
|
useClient<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: ClientMiddleware<MessageData[Kind]> | readonly ClientMiddleware<MessageData[Kind]>[] | ClientMiddleware | readonly ClientMiddleware[], order?: number): this;
|
|
38
50
|
useServer<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: ServerMiddleware<MessageData[Kind]> | readonly ServerMiddleware<MessageData[Kind]>[] | ServerMiddleware | readonly ServerMiddleware[], order?: number): this;
|
|
39
51
|
useShared<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: SharedMiddleware<MessageData[Kind]> | readonly SharedMiddleware<MessageData[Kind]>[] | SharedMiddleware | readonly SharedMiddleware[], order?: number): this;
|
|
52
|
+
useClientReceive<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: ServerMiddleware<MessageData[Kind]> | readonly ServerMiddleware<MessageData[Kind]>[] | ServerMiddleware | readonly ServerMiddleware[], order?: number): this;
|
|
53
|
+
useServerReceive<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: ClientMiddleware<MessageData[Kind]> | readonly ClientMiddleware<MessageData[Kind]>[] | ClientMiddleware | readonly ClientMiddleware[], order?: number): this;
|
|
54
|
+
useSharedReceive<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: SharedMiddleware<MessageData[Kind]> | readonly SharedMiddleware<MessageData[Kind]>[] | SharedMiddleware | readonly SharedMiddleware[], order?: number): this;
|
|
40
55
|
useClientGlobal(middlewares: ClientMiddleware | readonly ClientMiddleware[], order?: number): this;
|
|
41
56
|
useServerGlobal(middlewares: ServerMiddleware | readonly ServerMiddleware[], order?: number): this;
|
|
42
57
|
useSharedGlobal(middlewares: SharedMiddleware | readonly SharedMiddleware[], order?: number): this;
|
package/out/middleware.luau
CHANGED
|
@@ -16,8 +16,10 @@ do
|
|
|
16
16
|
function MiddlewareProvider:constructor()
|
|
17
17
|
self.clientGlobalMiddlewares = {}
|
|
18
18
|
self.serverGlobalMiddlewares = {}
|
|
19
|
-
self.
|
|
20
|
-
self.
|
|
19
|
+
self.clientSendMiddlewares = {}
|
|
20
|
+
self.serverSendMiddlewares = {}
|
|
21
|
+
self.serverReceiveMiddlewares = {}
|
|
22
|
+
self.clientReceiveMiddlewares = {}
|
|
21
23
|
self.requestDroppedCallbacks = {}
|
|
22
24
|
end
|
|
23
25
|
function MiddlewareProvider:onRequestDropped(callback)
|
|
@@ -40,16 +42,18 @@ do
|
|
|
40
42
|
end
|
|
41
43
|
end
|
|
42
44
|
function MiddlewareProvider:getClient(message)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
local _exp = self.clientSendMiddlewares
|
|
46
|
+
if _exp[message] == nil then
|
|
47
|
+
_exp[message] = {}
|
|
45
48
|
end
|
|
46
|
-
return
|
|
49
|
+
return _exp[message]
|
|
47
50
|
end
|
|
48
51
|
function MiddlewareProvider:getServer(message)
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
local _exp = self.serverSendMiddlewares
|
|
53
|
+
if _exp[message] == nil then
|
|
54
|
+
_exp[message] = {}
|
|
51
55
|
end
|
|
52
|
-
return
|
|
56
|
+
return _exp[message]
|
|
53
57
|
end
|
|
54
58
|
function MiddlewareProvider:getClientGlobal()
|
|
55
59
|
return self.clientGlobalMiddlewares
|
|
@@ -57,6 +61,20 @@ do
|
|
|
57
61
|
function MiddlewareProvider:getServerGlobal()
|
|
58
62
|
return self.serverGlobalMiddlewares
|
|
59
63
|
end
|
|
64
|
+
function MiddlewareProvider:getClientReceive(message)
|
|
65
|
+
local _exp = self.clientReceiveMiddlewares
|
|
66
|
+
if _exp[message] == nil then
|
|
67
|
+
_exp[message] = {}
|
|
68
|
+
end
|
|
69
|
+
return _exp[message]
|
|
70
|
+
end
|
|
71
|
+
function MiddlewareProvider:getServerReceive(message)
|
|
72
|
+
local _exp = self.serverReceiveMiddlewares
|
|
73
|
+
if _exp[message] == nil then
|
|
74
|
+
_exp[message] = {}
|
|
75
|
+
end
|
|
76
|
+
return _exp[message]
|
|
77
|
+
end
|
|
60
78
|
function MiddlewareProvider:useClient(message, middlewares, order)
|
|
61
79
|
local messageMiddleware = self:getClient(message)
|
|
62
80
|
local _middlewares = middlewares
|
|
@@ -110,6 +128,59 @@ do
|
|
|
110
128
|
self:useServer(message, server, order)
|
|
111
129
|
return self:useClient(message, client, order)
|
|
112
130
|
end
|
|
131
|
+
function MiddlewareProvider:useClientReceive(message, middlewares, order)
|
|
132
|
+
local messageMiddleware = self:getClientReceive(message)
|
|
133
|
+
local _middlewares = middlewares
|
|
134
|
+
if type(_middlewares) == "function" then
|
|
135
|
+
local _condition = order
|
|
136
|
+
if _condition == nil then
|
|
137
|
+
_condition = #messageMiddleware - 1
|
|
138
|
+
end
|
|
139
|
+
local _middlewares_1 = middlewares
|
|
140
|
+
table.insert(messageMiddleware, _condition + 1, _middlewares_1)
|
|
141
|
+
else
|
|
142
|
+
for _, middleware in middlewares do
|
|
143
|
+
self:useClientReceive(message, middleware, order)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
return self
|
|
147
|
+
end
|
|
148
|
+
function MiddlewareProvider:useServerReceive(message, middlewares, order)
|
|
149
|
+
local messageMiddleware = self:getServerReceive(message)
|
|
150
|
+
local _middlewares = middlewares
|
|
151
|
+
if type(_middlewares) == "function" then
|
|
152
|
+
local _condition = order
|
|
153
|
+
if _condition == nil then
|
|
154
|
+
_condition = #messageMiddleware - 1
|
|
155
|
+
end
|
|
156
|
+
local _middlewares_1 = middlewares
|
|
157
|
+
table.insert(messageMiddleware, _condition + 1, _middlewares_1)
|
|
158
|
+
else
|
|
159
|
+
for _, middleware in middlewares do
|
|
160
|
+
self:useServerReceive(message, middleware, order)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
return self
|
|
164
|
+
end
|
|
165
|
+
function MiddlewareProvider:useSharedReceive(message, middlewares, order)
|
|
166
|
+
local client = middlewares
|
|
167
|
+
local _middlewares = middlewares
|
|
168
|
+
local _exp = (if type(_middlewares) == "function" then { middlewares } else middlewares)
|
|
169
|
+
-- ▼ ReadonlyArray.map ▼
|
|
170
|
+
local _newValue = table.create(#_exp)
|
|
171
|
+
local _callback = function(middleware)
|
|
172
|
+
return function(_, ctx)
|
|
173
|
+
return middleware(ctx)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
for _k, _v in _exp do
|
|
177
|
+
_newValue[_k] = _callback(_v, _k - 1, _exp)
|
|
178
|
+
end
|
|
179
|
+
-- ▲ ReadonlyArray.map ▲
|
|
180
|
+
local server = _newValue
|
|
181
|
+
self:useServerReceive(message, server, order)
|
|
182
|
+
return self:useClientReceive(message, client, order)
|
|
183
|
+
end
|
|
113
184
|
function MiddlewareProvider:useClientGlobal(middlewares, order)
|
|
114
185
|
local globalMiddleware = self:getClientGlobal()
|
|
115
186
|
local _middlewares = middlewares
|
package/out/relayer.luau
CHANGED
|
@@ -23,7 +23,7 @@ do
|
|
|
23
23
|
end
|
|
24
24
|
local sendUnreliableMessage
|
|
25
25
|
do
|
|
26
|
-
local name = "
|
|
26
|
+
local name = "sendUnreliableMessage"
|
|
27
27
|
local existing = ReplicatedStorage:FindFirstChild(name)
|
|
28
28
|
local remote = (existing or Instance.new("UnreliableRemoteEvent", ReplicatedStorage))
|
|
29
29
|
if existing == nil then
|