@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.
@@ -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:runClientMiddlewares(message, data, player)
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:runClientMiddlewares(message, data)
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
- runClientMiddlewares<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind], player?: Player | Player[]): [boolean, MessageData[Kind]];
32
+ runClientSendMiddlewares<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind], player?: Player | Player[]): [boolean, MessageData[Kind]];
33
33
  /** @hidden */
34
- runServerMiddlewares<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind]): [boolean, MessageData[Kind]];
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:runClientMiddlewares(message, data, player)
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 { false, ctx.data }
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 { false, ctx.data }
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:runServerMiddlewares(message, data)
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 { false, ctx.data }
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 { false, ctx.data }
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 packet = self:deserializeAndValidate(message, serializedPacket)
243
+ local data = self:deserializeAndValidate(message, serializedPacket)
192
244
  for callback in functions do
193
- callback(packet)
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 packet = self:deserializeAndValidate(message, serializedPacket)
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(player, packet)
260
+ self:executeServerCallback(callback, player, message, data)
209
261
  else
210
- callback(packet)
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 packet = self.serdes:deserializePacket(message, serializedPacket)
216
- self:validateData(message, packet)
217
- return packet
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:runServerMiddlewares(message, data)
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
@@ -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 clientMiddlewares;
24
- private readonly serverMiddlewares;
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;
@@ -16,8 +16,10 @@ do
16
16
  function MiddlewareProvider:constructor()
17
17
  self.clientGlobalMiddlewares = {}
18
18
  self.serverGlobalMiddlewares = {}
19
- self.clientMiddlewares = {}
20
- self.serverMiddlewares = {}
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
- if self.clientMiddlewares[message] == nil then
44
- self.clientMiddlewares[message] = {}
45
+ local _exp = self.clientSendMiddlewares
46
+ if _exp[message] == nil then
47
+ _exp[message] = {}
45
48
  end
46
- return self.clientMiddlewares[message]
49
+ return _exp[message]
47
50
  end
48
51
  function MiddlewareProvider:getServer(message)
49
- if self.serverMiddlewares[message] == nil then
50
- self.serverMiddlewares[message] = {}
52
+ local _exp = self.serverSendMiddlewares
53
+ if _exp[message] == nil then
54
+ _exp[message] = {}
51
55
  end
52
- return self.serverMiddlewares[message]
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 = "unreliableMessage"
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rbxts/tether",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "main": "out/init.luau",
5
5
  "scripts": {
6
6
  "setup-rokit": "rokit trust lune-org/lune && rokit trust rojo-rbx/rojo && rokit install",