@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<TetherPacket<T>>>): SharedMiddleware<T>;
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[2], {
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: ", if data == nil then "undefined" else data, "\n", " - Raw data:\n", " - Buffer: ", bufferToString(rawData.buffer), "\n", " - Blobs: ", repr(rawData.blobs, {
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
- -- ▼ ReadonlyArray.join
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
@@ -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
- local _binding = messageSerializer.deserialize(serializedPacket.buffer, serializedPacket.blobs)
395
- local message = _binding.message
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
- local _result = packet
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
- local _exp = player
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
- local _result = packet
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
- warn(`[@rbxts/tether]: Failed to get packet for message '{message}', no serializer was found`)
489
- return messageSerializer.serialize({
490
- message = message,
491
- data = nil,
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 serializer.serialize({
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 { DataType, SerializerMetadata } from "@rbxts/flamework-binary-serializer";
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<TetherPacket<MessageData[Kind]>>>;
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> = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rbxts/tether",
3
- "version": "1.2.5",
3
+ "version": "1.2.7",
4
4
  "main": "out/init.lua",
5
5
  "scripts": {
6
6
  "build": "rbxtsc",