@rbxts/tether 1.4.3 → 1.4.5
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 +78 -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,52 @@ do
|
|
|
167
167
|
self:executeFunctions(isServer, message, packet)
|
|
168
168
|
end
|
|
169
169
|
end
|
|
170
|
+
function MessageEmitter:runServerReceiveMiddlewares(message, player, data)
|
|
171
|
+
local ctx = {
|
|
172
|
+
message = message,
|
|
173
|
+
data = data,
|
|
174
|
+
getRawData = function()
|
|
175
|
+
return self.serdes:serializePacket(message, data)
|
|
176
|
+
end,
|
|
177
|
+
}
|
|
178
|
+
for _, middleware in self.middleware:getServerReceive(message) do
|
|
179
|
+
local result = middleware(player, ctx)
|
|
180
|
+
if not self:validateData(message, ctx.data, "Invalid data after server receive middleware") then
|
|
181
|
+
return { true, ctx.data }
|
|
182
|
+
end
|
|
183
|
+
if result == DropRequest then
|
|
184
|
+
self.middleware:notifyRequestDropped(message, "Server receive middleware")
|
|
185
|
+
return { true, ctx.data }
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
if not self:validateData(message, ctx.data) then
|
|
189
|
+
return { true, ctx.data }
|
|
190
|
+
end
|
|
191
|
+
return { false, ctx.data }
|
|
192
|
+
end
|
|
193
|
+
function MessageEmitter:runClientReceiveMiddlewares(message, data)
|
|
194
|
+
local ctx = {
|
|
195
|
+
message = message,
|
|
196
|
+
data = data,
|
|
197
|
+
getRawData = function()
|
|
198
|
+
return self.serdes:serializePacket(message, data)
|
|
199
|
+
end,
|
|
200
|
+
}
|
|
201
|
+
for _, middleware in self.middleware:getClientReceive(message) do
|
|
202
|
+
local result = middleware(ctx)
|
|
203
|
+
if not self:validateData(message, ctx.data, "Invalid data after client receive middleware") then
|
|
204
|
+
return { true, ctx.data }
|
|
205
|
+
end
|
|
206
|
+
if result == DropRequest then
|
|
207
|
+
self.middleware:notifyRequestDropped(message, "Client receive middleware")
|
|
208
|
+
return { true, ctx.data }
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
if not self:validateData(message, ctx.data) then
|
|
212
|
+
return { true, ctx.data }
|
|
213
|
+
end
|
|
214
|
+
return { false, ctx.data }
|
|
215
|
+
end
|
|
170
216
|
function MessageEmitter:validateData(message, data, requestDropReason)
|
|
171
217
|
if requestDropReason == nil then
|
|
172
218
|
requestDropReason = "Invalid data"
|
|
@@ -188,9 +234,9 @@ do
|
|
|
188
234
|
if functions == nil then
|
|
189
235
|
return nil
|
|
190
236
|
end
|
|
191
|
-
local
|
|
237
|
+
local data = self:deserializeAndValidate(message, serializedPacket)
|
|
192
238
|
for callback in functions do
|
|
193
|
-
callback
|
|
239
|
+
self:executeClientCallback(callback, message, data)
|
|
194
240
|
end
|
|
195
241
|
end
|
|
196
242
|
function MessageEmitter:executeEventCallbacks(isServer, message, serializedPacket, player)
|
|
@@ -200,21 +246,39 @@ do
|
|
|
200
246
|
if callbacks == nil then
|
|
201
247
|
return nil
|
|
202
248
|
end
|
|
203
|
-
local
|
|
249
|
+
local data = self:deserializeAndValidate(message, serializedPacket)
|
|
204
250
|
for callback in callbacks do
|
|
205
251
|
if isServer then
|
|
206
252
|
local _arg0 = player ~= nil
|
|
207
253
|
assert(_arg0)
|
|
208
|
-
callback
|
|
254
|
+
self:executeServerCallback(callback, player, message, data)
|
|
209
255
|
else
|
|
210
|
-
callback
|
|
256
|
+
self:executeClientCallback(callback, message, data)
|
|
211
257
|
end
|
|
212
258
|
end
|
|
213
259
|
end
|
|
260
|
+
function MessageEmitter:executeServerCallback(callback, player, message, data)
|
|
261
|
+
local _binding = self:runServerReceiveMiddlewares(message, player, data)
|
|
262
|
+
local dropRequest = _binding[1]
|
|
263
|
+
local newData = _binding[2]
|
|
264
|
+
if dropRequest then
|
|
265
|
+
return nil
|
|
266
|
+
end
|
|
267
|
+
callback(player, newData)
|
|
268
|
+
end
|
|
269
|
+
function MessageEmitter:executeClientCallback(callback, message, data)
|
|
270
|
+
local _binding = self:runClientReceiveMiddlewares(message, data)
|
|
271
|
+
local dropRequest = _binding[1]
|
|
272
|
+
local newData = _binding[2]
|
|
273
|
+
if dropRequest then
|
|
274
|
+
return nil
|
|
275
|
+
end
|
|
276
|
+
callback(newData)
|
|
277
|
+
end
|
|
214
278
|
function MessageEmitter:deserializeAndValidate(message, serializedPacket)
|
|
215
|
-
local
|
|
216
|
-
self:validateData(message,
|
|
217
|
-
return
|
|
279
|
+
local data = self.serdes:deserializePacket(message, serializedPacket)
|
|
280
|
+
self:validateData(message, data)
|
|
281
|
+
return data
|
|
218
282
|
end
|
|
219
283
|
end
|
|
220
284
|
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
|