@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.
@@ -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,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 packet = self:deserializeAndValidate(message, serializedPacket)
237
+ local data = self:deserializeAndValidate(message, serializedPacket)
192
238
  for callback in functions do
193
- callback(packet)
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 packet = self:deserializeAndValidate(message, serializedPacket)
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(player, packet)
254
+ self:executeServerCallback(callback, player, message, data)
209
255
  else
210
- callback(packet)
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 packet = self.serdes:deserializePacket(message, serializedPacket)
216
- self:validateData(message, packet)
217
- return packet
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: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.5",
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",