@rbxts/tether 1.2.5 → 1.2.7
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.
|
@@ -2,7 +2,6 @@ import { Modding } from "@flamework/core";
|
|
|
2
2
|
import type { SerializerMetadata } from "@rbxts/flamework-binary-serializer";
|
|
3
3
|
import type { Any } from "ts-toolbelt";
|
|
4
4
|
import { type SharedMiddleware } from "./middleware";
|
|
5
|
-
import type { TetherPacket } from "./structs";
|
|
6
5
|
export declare namespace BuiltinMiddlewares {
|
|
7
6
|
/**
|
|
8
7
|
* Creates a shared middleware that will simulate a ping of the given amount when a message is sent
|
|
@@ -39,5 +38,5 @@ export declare namespace BuiltinMiddlewares {
|
|
|
39
38
|
* @returns A shared middleware that will log a message whenever a message is sent.
|
|
40
39
|
* @metadata macro
|
|
41
40
|
*/
|
|
42
|
-
function debug<T>(schema?: Modding.Many<Any.Equals<T, unknown> extends 1 ? undefined : SerializerMetadata<
|
|
41
|
+
function debug<T>(schema?: Modding.Many<Any.Equals<T, unknown> extends 1 ? undefined : SerializerMetadata<T>>): SharedMiddleware<T>;
|
|
43
42
|
}
|
|
@@ -93,20 +93,16 @@ do
|
|
|
93
93
|
local rawData = getRawData()
|
|
94
94
|
local bufferSize = buffer.len(rawData.buffer)
|
|
95
95
|
local blobsSize = #rawData.blobs * BLOB_SIZE
|
|
96
|
-
local schemaString = if schema ~= nil then " " .. table.concat(string.split(repr(schema[
|
|
96
|
+
local schemaString = if schema ~= nil then " " .. table.concat(string.split(repr(schema[1], {
|
|
97
97
|
pretty = true,
|
|
98
98
|
}), "\n"), "\n ") else "unknown"
|
|
99
|
-
local text = { "\n", horizontalLine, "\n", "Packet sent to ", (if RunService:IsServer() then "client" else "server"), "!\n", " - Message: ", message, "\n", " - Data: ",
|
|
99
|
+
local text = { "\n", horizontalLine, "\n", "Packet sent to ", (if RunService:IsServer() then "client" else "server"), "!\n", " - Message: ", message, "\n", " - Data: ", repr(data, {
|
|
100
|
+
pretty = true,
|
|
101
|
+
}), "\n", " - Raw data:\n", " - Buffer: ", bufferToString(rawData.buffer), "\n", " - Blobs: ", repr(rawData.blobs, {
|
|
100
102
|
pretty = false,
|
|
101
103
|
robloxClassName = true,
|
|
102
104
|
}), "\n", " - Packet size: ", bufferSize + blobsSize, " bytes\n", " - Buffer: ", bufferSize, " bytes\n", " - Blobs: ", blobsSize, " bytes\n", " - Schema: ", schemaString, "\n", horizontalLine, "\n" }
|
|
103
|
-
|
|
104
|
-
local _result = table.create(#text)
|
|
105
|
-
for _k, _v in text do
|
|
106
|
-
_result[_k] = tostring(_v)
|
|
107
|
-
end
|
|
108
|
-
-- ▲ ReadonlyArray.join ▲
|
|
109
|
-
print(table.concat(_result, ""))
|
|
105
|
+
print(table.concat(text, ""))
|
|
110
106
|
end
|
|
111
107
|
end
|
|
112
108
|
end
|
package/out/message-emitter.luau
CHANGED
|
@@ -7,15 +7,15 @@ local _services = TS.import(script, TS.getModule(script, "@rbxts", "services"))
|
|
|
7
7
|
local Players = _services.Players
|
|
8
8
|
local RunService = _services.RunService
|
|
9
9
|
local Destroyable = TS.import(script, TS.getModule(script, "@rbxts", "destroyable").out).default
|
|
10
|
+
local repr = TS.import(script, TS.getModule(script, "@rbxts", "repr").out)
|
|
10
11
|
local _middleware = TS.import(script, script.Parent, "middleware")
|
|
11
12
|
local DropRequest = _middleware.DropRequest
|
|
12
13
|
local MiddlewareProvider = _middleware.MiddlewareProvider
|
|
13
14
|
-- TODO: error when trying to do something like server.emit() from the server
|
|
14
|
-
local messageSerializer = createBinarySerializer({ "object_raw", { { "message", { "u8" } }, { "data", { "literal", {}, -1 } } } })
|
|
15
15
|
local remotes = Networking.createEvent("@rbxts/tether:message-emitter@remotes")
|
|
16
16
|
local metaGenerationFailed = "[@rbxts/tether]: Failed to generate message metadata - make sure you have the Flamework transformer and are using Flamework macro-friendly types in your schemas"
|
|
17
|
-
local guardFailed = function(message)
|
|
18
|
-
return `[@rbxts/tether]: Type validation guard failed for message '{message}' - check your sent data`
|
|
17
|
+
local guardFailed = function(message, data)
|
|
18
|
+
return `[@rbxts/tether]: Type validation guard failed for message '{message}' - check your sent data\nSent data: {repr(data)}`
|
|
19
19
|
end
|
|
20
20
|
local MessageEmitter
|
|
21
21
|
do
|
|
@@ -300,10 +300,12 @@ do
|
|
|
300
300
|
incomingIds = { "sendServerMessage", "sendUnreliableServerMessage" },
|
|
301
301
|
incoming = {
|
|
302
302
|
sendServerMessage = { { t.interface({
|
|
303
|
+
messageBuffer = t.typeof("buffer"),
|
|
303
304
|
buffer = t.typeof("buffer"),
|
|
304
305
|
blobs = t.array(t.any),
|
|
305
306
|
}) }, nil },
|
|
306
307
|
sendUnreliableServerMessage = { { t.interface({
|
|
308
|
+
messageBuffer = t.typeof("buffer"),
|
|
307
309
|
buffer = t.typeof("buffer"),
|
|
308
310
|
blobs = t.array(t.any),
|
|
309
311
|
}) }, nil },
|
|
@@ -323,10 +325,12 @@ do
|
|
|
323
325
|
incomingIds = { "sendClientMessage", "sendUnreliableClientMessage" },
|
|
324
326
|
incoming = {
|
|
325
327
|
sendClientMessage = { { t.interface({
|
|
328
|
+
messageBuffer = t.typeof("buffer"),
|
|
326
329
|
buffer = t.typeof("buffer"),
|
|
327
330
|
blobs = t.array(t.any),
|
|
328
331
|
}) }, nil },
|
|
329
332
|
sendUnreliableClientMessage = { { t.interface({
|
|
333
|
+
messageBuffer = t.typeof("buffer"),
|
|
330
334
|
buffer = t.typeof("buffer"),
|
|
331
335
|
blobs = t.array(t.any),
|
|
332
336
|
}) }, nil },
|
|
@@ -355,7 +359,6 @@ do
|
|
|
355
359
|
local numberKind = tonumber(kind)
|
|
356
360
|
emitter.guards[numberKind] = guard
|
|
357
361
|
if serializerMetadata == nil then
|
|
358
|
-
emitter.serializers[numberKind] = messageSerializer
|
|
359
362
|
continue
|
|
360
363
|
end
|
|
361
364
|
emitter:addSerializer(numberKind, serializerMetadata)
|
|
@@ -368,7 +371,7 @@ do
|
|
|
368
371
|
local guard = _guards[_message]
|
|
369
372
|
local guardPassed = guard(data)
|
|
370
373
|
if not guardPassed then
|
|
371
|
-
warn(guardFailed(message))
|
|
374
|
+
warn(guardFailed(message, data))
|
|
372
375
|
end
|
|
373
376
|
return guardPassed
|
|
374
377
|
end
|
|
@@ -391,8 +394,10 @@ do
|
|
|
391
394
|
return self
|
|
392
395
|
end
|
|
393
396
|
function MessageEmitter:onRemoteFire(serializedPacket, player)
|
|
394
|
-
|
|
395
|
-
|
|
397
|
+
if buffer.len(serializedPacket.messageBuffer) > 1 then
|
|
398
|
+
return warn("[@rbxts/tether]: Rejected message because message buffer was larger than one byte")
|
|
399
|
+
end
|
|
400
|
+
local message = buffer.readu8(serializedPacket.messageBuffer, 0)
|
|
396
401
|
self:executeEventCallbacks(message, serializedPacket, player)
|
|
397
402
|
self:executeFunctions(message, serializedPacket)
|
|
398
403
|
end
|
|
@@ -411,11 +416,7 @@ do
|
|
|
411
416
|
end
|
|
412
417
|
local packet = _packet
|
|
413
418
|
for callback in functions do
|
|
414
|
-
|
|
415
|
-
if _result ~= nil then
|
|
416
|
-
_result = _result.data
|
|
417
|
-
end
|
|
418
|
-
callback(_result)
|
|
419
|
+
callback(packet)
|
|
419
420
|
end
|
|
420
421
|
end
|
|
421
422
|
function MessageEmitter:executeEventCallbacks(message, serializedPacket, player)
|
|
@@ -434,18 +435,9 @@ do
|
|
|
434
435
|
local packet = _packet
|
|
435
436
|
for callback in callbacks do
|
|
436
437
|
if isServer then
|
|
437
|
-
|
|
438
|
-
local _result = packet
|
|
439
|
-
if _result ~= nil then
|
|
440
|
-
_result = _result.data
|
|
441
|
-
end
|
|
442
|
-
callback(_exp, _result)
|
|
438
|
+
callback(player, packet)
|
|
443
439
|
else
|
|
444
|
-
|
|
445
|
-
if _result ~= nil then
|
|
446
|
-
_result = _result.data
|
|
447
|
-
end
|
|
448
|
-
callback(_result)
|
|
440
|
+
callback(packet)
|
|
449
441
|
end
|
|
450
442
|
end
|
|
451
443
|
end
|
|
@@ -484,17 +476,22 @@ do
|
|
|
484
476
|
end
|
|
485
477
|
function MessageEmitter:getPacket(message, data)
|
|
486
478
|
local serializer = self:getSerializer(message)
|
|
479
|
+
local messageBuffer = buffer.create(1)
|
|
480
|
+
buffer.writeu8(messageBuffer, 0, message)
|
|
487
481
|
if serializer == nil then
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
}
|
|
482
|
+
return {
|
|
483
|
+
messageBuffer = messageBuffer,
|
|
484
|
+
buffer = buffer.create(0),
|
|
485
|
+
blobs = {},
|
|
486
|
+
}
|
|
487
|
+
end
|
|
488
|
+
local _object = {
|
|
489
|
+
messageBuffer = messageBuffer,
|
|
490
|
+
}
|
|
491
|
+
for _k, _v in serializer.serialize(data) do
|
|
492
|
+
_object[_k] = _v
|
|
493
493
|
end
|
|
494
|
-
return
|
|
495
|
-
message = message,
|
|
496
|
-
data = data,
|
|
497
|
-
})
|
|
494
|
+
return _object
|
|
498
495
|
end
|
|
499
496
|
function MessageEmitter:addSerializer(message, meta)
|
|
500
497
|
self.serializers[message] = self:createMessageSerializer(meta)
|
package/out/structs.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Modding } from "@flamework/core";
|
|
2
2
|
import type { Networking } from "@flamework/networking";
|
|
3
|
-
import type {
|
|
3
|
+
import type { SerializerMetadata } from "@rbxts/flamework-binary-serializer";
|
|
4
4
|
export type MessageCallback<T = unknown> = ServerMessageCallback<T> | ClientMessageCallback<T>;
|
|
5
5
|
export type ClientMessageCallback<T = unknown> = (data: T) => void;
|
|
6
6
|
export type ClientMessageFunctionCallback<T = unknown, R = unknown> = (data: T) => R;
|
|
@@ -8,13 +8,10 @@ export type ServerMessageCallback<T = unknown> = (player: Player, data: T) => vo
|
|
|
8
8
|
export type ServerMessageFunctionCallback<T = unknown, R = unknown> = (player: Player, data: T) => R;
|
|
9
9
|
export type BaseMessage = number;
|
|
10
10
|
export interface SerializedPacket {
|
|
11
|
+
readonly messageBuffer: buffer;
|
|
11
12
|
readonly buffer: buffer;
|
|
12
13
|
readonly blobs: defined[];
|
|
13
14
|
}
|
|
14
|
-
export interface TetherPacket<Data> {
|
|
15
|
-
readonly message: DataType.u8;
|
|
16
|
-
readonly data: Data;
|
|
17
|
-
}
|
|
18
15
|
export type MessageEvent = (packet: SerializedPacket) => void;
|
|
19
16
|
export type UnreliableMessageEvent = Networking.Unreliable<MessageEvent>;
|
|
20
17
|
export interface ServerEvents {
|
|
@@ -27,7 +24,7 @@ export interface ClientEvents {
|
|
|
27
24
|
}
|
|
28
25
|
export interface MessageMetadata<MessageData, Kind extends keyof MessageData> {
|
|
29
26
|
readonly guard: Modding.Generic<MessageData[Kind], "guard">;
|
|
30
|
-
readonly serializerMetadata: MessageData[Kind] extends undefined ? undefined : Modding.Many<SerializerMetadata<
|
|
27
|
+
readonly serializerMetadata: MessageData[Kind] extends undefined ? undefined : Modding.Many<SerializerMetadata<MessageData[Kind]>>;
|
|
31
28
|
}
|
|
32
29
|
export type Guard<T = unknown> = (value: unknown) => value is T;
|
|
33
30
|
export type MessageEmitterMetadata<MessageData> = {
|