@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 +7 -5
- package/out/message-emitter.d.ts +13 -8
- package/out/message-emitter.luau +27 -34
- package/out/middleware.d.ts +5 -5
- package/out/structs.d.ts +2 -2
- package/package.json +1 -1
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
|
|
95
|
-
|
|
96
|
-
|
|
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
|
package/out/message-emitter.d.ts
CHANGED
|
@@ -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 {};
|
package/out/message-emitter.luau
CHANGED
|
@@ -42,14 +42,14 @@ do
|
|
|
42
42
|
self.serverEvents = GlobalEvents:createServer({}, {
|
|
43
43
|
incomingIds = { "sendServerMessage", "sendUnreliableServerMessage" },
|
|
44
44
|
incoming = {
|
|
45
|
-
sendServerMessage = { { t.
|
|
45
|
+
sendServerMessage = { { t.interface({
|
|
46
46
|
buffer = t.typeof("buffer"),
|
|
47
47
|
blobs = t.array(t.any),
|
|
48
|
-
})
|
|
49
|
-
sendUnreliableServerMessage = { { t.
|
|
48
|
+
}) }, nil },
|
|
49
|
+
sendUnreliableServerMessage = { { t.interface({
|
|
50
50
|
buffer = t.typeof("buffer"),
|
|
51
51
|
blobs = t.array(t.any),
|
|
52
|
-
})
|
|
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.
|
|
68
|
+
sendClientMessage = { { t.interface({
|
|
69
69
|
buffer = t.typeof("buffer"),
|
|
70
70
|
blobs = t.array(t.any),
|
|
71
|
-
})
|
|
72
|
-
sendUnreliableClientMessage = { { t.
|
|
71
|
+
}) }, nil },
|
|
72
|
+
sendUnreliableClientMessage = { { t.interface({
|
|
73
73
|
buffer = t.typeof("buffer"),
|
|
74
74
|
blobs = t.array(t.any),
|
|
75
|
-
})
|
|
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(
|
|
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,
|
|
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(
|
|
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(
|
|
207
|
-
local
|
|
208
|
-
local
|
|
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
|
|
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,
|
|
231
|
-
local
|
|
232
|
-
local
|
|
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
|
|
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
|
|
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[
|
|
260
|
+
return self.serializers[message]
|
|
268
261
|
end
|
|
269
262
|
end
|
|
270
263
|
return {
|
package/out/middleware.d.ts
CHANGED
|
@@ -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
|
|
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 = (
|
|
10
|
+
export type MessageEvent = (packet: SerializedPacket) => void;
|
|
11
11
|
export type UnreliableMessageEvent = Networking.Unreliable<MessageEvent>;
|
|
12
12
|
export interface ServerEvents {
|
|
13
13
|
sendServerMessage: MessageEvent;
|