@rbxts/tether 1.1.2 → 1.1.3

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/README.md CHANGED
@@ -91,9 +91,9 @@ export function rateLimit(interval: number): SharedMiddleware {
91
91
  ```ts
92
92
  import type { ServerMiddleware } from "@rbxts/tether";
93
93
 
94
- export function incrementNumberData<T extends number>(): ServerMiddleware<T> {
95
- return () => (data, updateData) =>
96
- updateData(data as T + 1 as T); // sets the data to be used by the any subsequent middlewares as well as sent through the remote
94
+ export function incrementNumberData(): ServerMiddleware<number> {
95
+ // sets the data to be used by the any subsequent middlewares as well as sent through the remote
96
+ return () => (data, updateData) => updateData(data + 1);
97
97
  }
98
98
  ```
99
99
 
@@ -111,8 +111,10 @@ messaging.middleware
111
111
  // the data associated with the message at runtime using type guards
112
112
  .useServer(Message.Test, [BuiltinMiddlewares.validateServer()])
113
113
  // logs every message fired
114
- .useServerGlobal([logServer()]);
115
- .useClientGlobal([logClient()]);
114
+ .useServerGlobal([logServer()])
115
+ .useClientGlobal([logClient()])
116
+ .useServer(Message.Test, [incrementNumberData()]) // error! - data for Message.Test is not a number
117
+ .useServerGlobal([incrementNumberData()]); // error! - global data type is always 'unknown', we cannot guarantee a number
116
118
 
117
119
  export const enum Message {
118
120
  Test
@@ -1,8 +1,12 @@
1
1
  import { Modding } from "@flamework/core";
2
- import { type SerializerMetadata } from "@rbxts/flamework-binary-serializer";
2
+ import { DataType, type SerializerMetadata } from "@rbxts/flamework-binary-serializer";
3
3
  import Destroyable from "@rbxts/destroyable";
4
4
  import { MiddlewareProvider } from "./middleware";
5
- import type { ClientMessageCallback, ServerMessageCallback } from "./structs";
5
+ import type { ClientMessageCallback, ServerMessageCallback, BaseMessage } from "./structs";
6
+ interface TetherPacket<Data> {
7
+ readonly message: DataType.u8;
8
+ readonly data?: Data;
9
+ }
6
10
  export declare class MessageEmitter<MessageData> extends Destroyable {
7
11
  readonly middleware: MiddlewareProvider<MessageData>;
8
12
  private readonly clientCallbacks;
@@ -12,17 +16,17 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
12
16
  private clientEvents;
13
17
  /** @metadata macro */
14
18
  static create<MessageData>(metaForEachMessage?: Modding.Many<{
15
- [Kind in keyof MessageData]: MessageData[Kind] extends undefined ? undefined : Modding.Many<SerializerMetadata<MessageData[Kind]>>;
19
+ [Kind in keyof MessageData]: MessageData[Kind] extends undefined ? undefined : Modding.Many<SerializerMetadata<TetherPacket<MessageData[Kind]>>>;
16
20
  }>): MessageEmitter<MessageData>;
17
21
  private constructor();
18
22
  /**.
19
23
  * @returns A destructor function that disconnects the callback from the message
20
24
  */
21
- onServerMessage<Kind extends keyof MessageData>(message: Kind, callback: ServerMessageCallback<MessageData[Kind]>): () => void;
25
+ onServerMessage<Kind extends keyof MessageData>(message: Kind & BaseMessage, callback: ServerMessageCallback<MessageData[Kind]>): () => void;
22
26
  /**.
23
27
  * @returns A destructor function that disconnects the callback from the message
24
28
  */
25
- onClientMessage<Kind extends keyof MessageData>(message: Kind, callback: ClientMessageCallback<MessageData[Kind]>): () => void;
29
+ onClientMessage<Kind extends keyof MessageData>(message: Kind & BaseMessage, callback: ClientMessageCallback<MessageData[Kind]>): () => void;
26
30
  private on;
27
31
  /**
28
32
  * Emits a message to all connected clients
@@ -31,7 +35,7 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
31
35
  * @param data The data associated with the message
32
36
  * @param unreliable Whether the message should be sent unreliably
33
37
  */
34
- emitServer<Kind extends keyof MessageData>(message: Kind, data?: MessageData[Kind], unreliable?: boolean): void;
38
+ emitServer<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind], unreliable?: boolean): void;
35
39
  /**
36
40
  * Emits a message to a specific client
37
41
  *
@@ -40,7 +44,7 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
40
44
  * @param data The data associated with the message
41
45
  * @param unreliable Whether the message should be sent unreliably
42
46
  */
43
- emitClient<Kind extends keyof MessageData>(player: Player, message: Kind, data?: MessageData[Kind], unreliable?: boolean): void;
47
+ emitClient<Kind extends keyof MessageData>(player: Player, message: Kind & BaseMessage, data?: MessageData[Kind], unreliable?: boolean): void;
44
48
  /**
45
49
  * Emits a message to all connected clients
46
50
  *
@@ -48,7 +52,7 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
48
52
  * @param data The data associated with the message
49
53
  * @param unreliable Whether the message should be sent unreliably
50
54
  */
51
- emitAllClients<Kind extends keyof MessageData>(message: Kind, data?: MessageData[Kind], unreliable?: boolean): void;
55
+ emitAllClients<Kind extends keyof MessageData>(message: Kind & BaseMessage, data?: MessageData[Kind], unreliable?: boolean): void;
52
56
  private initialize;
53
57
  private getPacket;
54
58
  /** @metadata macro */
@@ -57,3 +61,4 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
57
61
  private createMessageSerializer;
58
62
  private getSerializer;
59
63
  }
64
+ export {};
@@ -42,14 +42,14 @@ do
42
42
  self.serverEvents = GlobalEvents:createServer({}, {
43
43
  incomingIds = { "sendServerMessage", "sendUnreliableServerMessage" },
44
44
  incoming = {
45
- sendServerMessage = { { t.union(t.string, t.number), t.optional(t.interface({
45
+ sendServerMessage = { { t.interface({
46
46
  buffer = t.typeof("buffer"),
47
47
  blobs = t.array(t.any),
48
- })) }, nil },
49
- sendUnreliableServerMessage = { { t.union(t.string, t.number), t.optional(t.interface({
48
+ }) }, nil },
49
+ sendUnreliableServerMessage = { { t.interface({
50
50
  buffer = t.typeof("buffer"),
51
51
  blobs = t.array(t.any),
52
- })) }, nil },
52
+ }) }, nil },
53
53
  },
54
54
  incomingUnreliable = {
55
55
  sendUnreliableServerMessage = true,
@@ -65,14 +65,14 @@ do
65
65
  self.clientEvents = GlobalEvents:createClient({}, {
66
66
  incomingIds = { "sendClientMessage", "sendUnreliableClientMessage" },
67
67
  incoming = {
68
- sendClientMessage = { { t.union(t.string, t.number), t.optional(t.interface({
68
+ sendClientMessage = { { t.interface({
69
69
  buffer = t.typeof("buffer"),
70
70
  blobs = t.array(t.any),
71
- })) }, nil },
72
- sendUnreliableClientMessage = { { t.union(t.string, t.number), t.optional(t.interface({
71
+ }) }, nil },
72
+ sendUnreliableClientMessage = { { t.interface({
73
73
  buffer = t.typeof("buffer"),
74
74
  blobs = t.array(t.any),
75
- })) }, nil },
75
+ }) }, nil },
76
76
  },
77
77
  incomingUnreliable = {
78
78
  sendUnreliableClientMessage = true,
@@ -96,7 +96,7 @@ do
96
96
  if meta == nil then
97
97
  continue
98
98
  end
99
- emitter:addSerializer(kind, meta)
99
+ emitter:addSerializer(tonumber(kind), meta)
100
100
  end
101
101
  return emitter:initialize()
102
102
  end
@@ -149,7 +149,7 @@ do
149
149
  end
150
150
  end
151
151
  local send = if unreliable then self.clientEvents.sendUnreliableServerMessage else self.clientEvents.sendServerMessage
152
- send(message, self:getPacket(message, data))
152
+ send(self:getPacket(message, data))
153
153
  end
154
154
  function MessageEmitter:emitClient(player, message, data, unreliable)
155
155
  if unreliable == nil then
@@ -172,7 +172,7 @@ do
172
172
  end
173
173
  end
174
174
  local send = if unreliable then self.serverEvents.sendUnreliableClientMessage else self.serverEvents.sendClientMessage
175
- send(player, message, self:getPacket(message, data))
175
+ send(player, self:getPacket(message, data))
176
176
  end
177
177
  function MessageEmitter:emitAllClients(message, data, unreliable)
178
178
  if unreliable == nil then
@@ -199,18 +199,13 @@ do
199
199
  end
200
200
  end
201
201
  local send = if unreliable then self.serverEvents.sendUnreliableClientMessage else self.serverEvents.sendClientMessage
202
- send:broadcast(message, self:getPacket(message, data))
202
+ send:broadcast(self:getPacket(message, data))
203
203
  end
204
204
  function MessageEmitter:initialize()
205
205
  if RunService:IsClient() then
206
- self.janitor:Add(self.clientEvents.sendClientMessage:connect(function(sentMessage, packet)
207
- local _clientCallbacks = self.clientCallbacks
208
- local _sentMessage = sentMessage
209
- local _condition = _clientCallbacks[_sentMessage]
210
- if _condition == nil then
211
- _condition = {}
212
- end
213
- local messageCallbacks = _condition
206
+ self.janitor:Add(self.clientEvents.sendClientMessage:connect(function(serializedPacket)
207
+ local sentMessage = buffer.readu8(serializedPacket.buffer, 0)
208
+ local messageCallbacks = self.clientCallbacks[sentMessage] or {}
214
209
  -- ▼ ReadonlySet.size ▼
215
210
  local _size = 0
216
211
  for _ in messageCallbacks do
@@ -221,20 +216,15 @@ do
221
216
  return nil
222
217
  end
223
218
  local serializer = self:getSerializer(sentMessage)
224
- local data = if packet ~= nil then serializer.deserialize(packet.buffer, packet.blobs) else nil
219
+ local packet = serializer.deserialize(serializedPacket.buffer, serializedPacket.blobs)
225
220
  for callback in messageCallbacks do
226
- callback(data)
221
+ callback(packet.data)
227
222
  end
228
223
  end))
229
224
  else
230
- self.janitor:Add(self.serverEvents.sendServerMessage:connect(function(player, sentMessage, packet)
231
- local _serverCallbacks = self.serverCallbacks
232
- local _sentMessage = sentMessage
233
- local _condition = _serverCallbacks[_sentMessage]
234
- if _condition == nil then
235
- _condition = {}
236
- end
237
- local messageCallbacks = _condition
225
+ self.janitor:Add(self.serverEvents.sendServerMessage:connect(function(player, serializedPacket)
226
+ local sentMessage = buffer.readu8(serializedPacket.buffer, 0)
227
+ local messageCallbacks = self.serverCallbacks[sentMessage] or {}
238
228
  -- ▼ ReadonlySet.size ▼
239
229
  local _size = 0
240
230
  for _ in messageCallbacks do
@@ -245,9 +235,9 @@ do
245
235
  return nil
246
236
  end
247
237
  local serializer = self:getSerializer(sentMessage)
248
- local data = if packet ~= nil then serializer.deserialize(packet.buffer, packet.blobs) else nil
238
+ local packet = serializer.deserialize(serializedPacket.buffer, serializedPacket.blobs)
249
239
  for callback in messageCallbacks do
250
- callback(player, data)
240
+ callback(player, packet.data)
251
241
  end
252
242
  end))
253
243
  end
@@ -255,7 +245,10 @@ do
255
245
  end
256
246
  function MessageEmitter:getPacket(message, data)
257
247
  local serializer = self:getSerializer(message)
258
- return if data == nil then nil else serializer.serialize(data)
248
+ return serializer.serialize({
249
+ message = message,
250
+ data = data,
251
+ })
259
252
  end
260
253
  function MessageEmitter:addSerializer(message, meta)
261
254
  self.serializers[message] = self:createMessageSerializer(meta)
@@ -264,7 +257,7 @@ do
264
257
  return createBinarySerializer(meta)
265
258
  end
266
259
  function MessageEmitter:getSerializer(message)
267
- return self.serializers[tostring(message)]
260
+ return self.serializers[message]
268
261
  end
269
262
  end
270
263
  return {
@@ -14,16 +14,16 @@ export declare class MiddlewareProvider<MessageData> {
14
14
  private readonly clientMiddlewares;
15
15
  private readonly serverMiddlewares;
16
16
  /** @hidden */
17
- getClient<Kind extends keyof MessageData>(message: Kind): ClientMiddleware<MessageData[Kind]>[];
17
+ getClient<Kind extends keyof MessageData>(message: Kind & BaseMessage): ClientMiddleware<MessageData[Kind]>[];
18
18
  /** @hidden */
19
- getServer<Kind extends keyof MessageData>(message: Kind): ServerMiddleware<MessageData[Kind]>[];
19
+ getServer<Kind extends keyof MessageData>(message: Kind & BaseMessage): ServerMiddleware<MessageData[Kind]>[];
20
20
  /** @hidden */
21
21
  getClientGlobal<Data>(): ClientMiddleware<Data>[];
22
22
  /** @hidden */
23
23
  getServerGlobal<Data>(): ServerMiddleware<Data>[];
24
- useClient<Kind extends keyof MessageData>(message: Kind, middlewares: ClientMiddleware<MessageData[Kind]> | readonly ClientMiddleware<MessageData[Kind]>[], order?: number): this;
25
- useServer<Kind extends keyof MessageData>(message: Kind, middlewares: ServerMiddleware<MessageData[Kind]> | readonly ServerMiddleware<MessageData[Kind]>[], order?: number): this;
26
- useShared<Kind extends keyof MessageData>(message: Kind, middlewares: SharedMiddleware | readonly SharedMiddleware[], order?: number): this;
24
+ useClient<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: ClientMiddleware<MessageData[Kind]> | readonly ClientMiddleware<MessageData[Kind]>[], order?: number): this;
25
+ useServer<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: ServerMiddleware<MessageData[Kind]> | readonly ServerMiddleware<MessageData[Kind]>[], order?: number): this;
26
+ useShared<Kind extends keyof MessageData>(message: Kind & BaseMessage, middlewares: SharedMiddleware | readonly SharedMiddleware[], order?: number): this;
27
27
  useClientGlobal(middlewares: ClientMiddleware | readonly ClientMiddleware[], order?: number): this;
28
28
  useServerGlobal(middlewares: ServerMiddleware | readonly ServerMiddleware[], order?: number): this;
29
29
  useSharedGlobal(middlewares: SharedMiddleware | readonly SharedMiddleware[], order?: number): this;
package/out/structs.d.ts CHANGED
@@ -2,12 +2,12 @@ import type { Networking } from "@flamework/networking";
2
2
  export type MessageCallback<T = unknown> = ServerMessageCallback<T> | ClientMessageCallback<T>;
3
3
  export type ClientMessageCallback<T = unknown> = (data: T) => void;
4
4
  export type ServerMessageCallback<T = unknown> = (player: Player, data: T) => void;
5
- export type BaseMessage = number | string | symbol;
5
+ export type BaseMessage = number;
6
6
  export interface SerializedPacket {
7
7
  readonly buffer: buffer;
8
8
  readonly blobs: defined[];
9
9
  }
10
- export type MessageEvent = (kind: BaseMessage, packet?: SerializedPacket) => void;
10
+ export type MessageEvent = (packet: SerializedPacket) => void;
11
11
  export type UnreliableMessageEvent = Networking.Unreliable<MessageEvent>;
12
12
  export interface ServerEvents {
13
13
  sendServerMessage: MessageEvent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rbxts/tether",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "main": "out/init.lua",
5
5
  "scripts": {
6
6
  "build": "rbxtsc",