@rbxts/tether 1.2.9 → 1.3.1
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/out/builtin-middlewares.d.ts +1 -1
- package/out/builtin-middlewares.luau +12 -6
- package/out/message-emitter.luau +258 -52
- package/out/structs.d.ts +21 -12
- package/out/utility.d.ts +1 -1
- package/out/utility.luau +19 -18
- package/package.json +5 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Modding } from "@flamework/core";
|
|
2
|
-
import type { SerializerMetadata } from "@rbxts/
|
|
2
|
+
import type { SerializerMetadata } from "@rbxts/serio";
|
|
3
3
|
import type { Any } from "ts-toolbelt";
|
|
4
4
|
import { type SharedMiddleware } from "./middleware";
|
|
5
5
|
export declare namespace BuiltinMiddlewares {
|
|
@@ -37,8 +37,12 @@ do
|
|
|
37
37
|
throwError = true
|
|
38
38
|
end
|
|
39
39
|
return function(ctx)
|
|
40
|
-
local
|
|
41
|
-
local
|
|
40
|
+
local _binding = ctx.getRawData()
|
|
41
|
+
local buf = _binding.buf
|
|
42
|
+
local blobs = _binding.blobs
|
|
43
|
+
local bufferSize = if buf == nil then 0 else buffer.len(buf)
|
|
44
|
+
local blobsSize = if blobs == nil then 0 else #blobs * BLOB_SIZE
|
|
45
|
+
local totalSize = bufferSize + blobsSize
|
|
42
46
|
if totalSize > maxBytes then
|
|
43
47
|
return if throwError then error(`[@rbxts/tether]: Message '{ctx.message}' exceeded maximum packet size of {maxBytes} bytes`) else DropRequest
|
|
44
48
|
end
|
|
@@ -84,15 +88,17 @@ do
|
|
|
84
88
|
local message = _param.message
|
|
85
89
|
local data = _param.data
|
|
86
90
|
local getRawData = _param.getRawData
|
|
87
|
-
local
|
|
88
|
-
local
|
|
89
|
-
local
|
|
91
|
+
local _binding = getRawData()
|
|
92
|
+
local buf = _binding.buf
|
|
93
|
+
local blobs = _binding.blobs
|
|
94
|
+
local bufferSize = if buf == nil then 0 else buffer.len(buf)
|
|
95
|
+
local blobsSize = if blobs == nil then 0 else #blobs * BLOB_SIZE
|
|
90
96
|
local schemaString = if schema ~= nil then " " .. table.concat(string.split(repr(schema[1], {
|
|
91
97
|
pretty = true,
|
|
92
98
|
}), "\n"), "\n ") else "unknown"
|
|
93
99
|
local text = { "\n", horizontalLine, "\n", "Packet sent to ", (if RunService:IsServer() then "client" else "server"), "!\n", " - Message: ", message, "\n", " - Data: ", repr(data, {
|
|
94
100
|
pretty = true,
|
|
95
|
-
}), "\n", " - Raw data:\n", " - Buffer: ", bufferToString(
|
|
101
|
+
}), "\n", " - Raw data:\n", " - Buffer: ", bufferToString(buf), "\n", " - Blobs: ", repr(blobs, {
|
|
96
102
|
pretty = false,
|
|
97
103
|
robloxClassName = true,
|
|
98
104
|
}), "\n", " - Packet size: ", bufferSize + blobsSize, " bytes\n", " - Buffer: ", bufferSize, " bytes\n", " - Blobs: ", blobsSize, " bytes\n", " - Schema: ", schemaString, "\n", horizontalLine, "\n" }
|
package/out/message-emitter.luau
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
local TS = _G[script]
|
|
3
3
|
local t = TS.import(script, TS.getModule(script, "@rbxts", "t").lib.ts).t
|
|
4
4
|
local Networking = TS.import(script, TS.getModule(script, "@flamework", "networking").out).Networking
|
|
5
|
-
local createBinarySerializer = TS.import(script, TS.getModule(script, "@rbxts", "flamework-binary-serializer").out).createBinarySerializer
|
|
6
5
|
local _services = TS.import(script, TS.getModule(script, "@rbxts", "services"))
|
|
7
6
|
local Players = _services.Players
|
|
8
7
|
local RunService = _services.RunService
|
|
9
8
|
local Destroyable = TS.import(script, TS.getModule(script, "@rbxts", "destroyable").out).default
|
|
9
|
+
local Object = TS.import(script, TS.getModule(script, "@rbxts", "object-utils"))
|
|
10
|
+
local createSerializer = TS.import(script, TS.getModule(script, "@rbxts", "serio").out).default
|
|
10
11
|
local repr = TS.import(script, TS.getModule(script, "@rbxts", "repr").out)
|
|
11
12
|
local _middleware = TS.import(script, script.Parent, "middleware")
|
|
12
13
|
local DropRequest = _middleware.DropRequest
|
|
13
14
|
local MiddlewareProvider = _middleware.MiddlewareProvider
|
|
14
|
-
local Object = TS.import(script, TS.getModule(script, "@rbxts", "object-utils"))
|
|
15
15
|
local remotes = Networking.createEvent("@rbxts/tether:message-emitter@remotes")
|
|
16
16
|
local noServerListen = "[@rbxts/tether]: Cannot listen to server message from client"
|
|
17
17
|
local noClientListen = "[@rbxts/tether]: Cannot listen to client message from server"
|
|
@@ -262,16 +262,16 @@ do
|
|
|
262
262
|
self.serverEvents = remotes:createServer({}, {
|
|
263
263
|
incomingIds = { "sendServerMessage", "sendUnreliableServerMessage" },
|
|
264
264
|
incoming = {
|
|
265
|
-
sendServerMessage = { { t.interface({
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
blobs = t.array(t.any),
|
|
269
|
-
}) }, nil },
|
|
270
|
-
sendUnreliableServerMessage = { { t.interface({
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
blobs = t.array(t.any),
|
|
274
|
-
}) }, nil },
|
|
265
|
+
sendServerMessage = { { t.array(t.interface({
|
|
266
|
+
messageBuf = t.typeof("buffer"),
|
|
267
|
+
buf = t.optional(t.typeof("buffer")),
|
|
268
|
+
blobs = t.optional(t.array(t.any)),
|
|
269
|
+
})) }, nil },
|
|
270
|
+
sendUnreliableServerMessage = { { t.array(t.interface({
|
|
271
|
+
messageBuf = t.typeof("buffer"),
|
|
272
|
+
buf = t.optional(t.typeof("buffer")),
|
|
273
|
+
blobs = t.optional(t.array(t.any)),
|
|
274
|
+
})) }, nil },
|
|
275
275
|
},
|
|
276
276
|
incomingUnreliable = {
|
|
277
277
|
sendUnreliableServerMessage = true,
|
|
@@ -287,16 +287,16 @@ do
|
|
|
287
287
|
self.clientEvents = remotes:createClient({}, {
|
|
288
288
|
incomingIds = { "sendClientMessage", "sendUnreliableClientMessage" },
|
|
289
289
|
incoming = {
|
|
290
|
-
sendClientMessage = { { t.interface({
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
blobs = t.array(t.any),
|
|
294
|
-
}) }, nil },
|
|
295
|
-
sendUnreliableClientMessage = { { t.interface({
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
blobs = t.array(t.any),
|
|
299
|
-
}) }, nil },
|
|
290
|
+
sendClientMessage = { { t.array(t.interface({
|
|
291
|
+
messageBuf = t.typeof("buffer"),
|
|
292
|
+
buf = t.optional(t.typeof("buffer")),
|
|
293
|
+
blobs = t.optional(t.array(t.any)),
|
|
294
|
+
})) }, nil },
|
|
295
|
+
sendUnreliableClientMessage = { { t.array(t.interface({
|
|
296
|
+
messageBuf = t.typeof("buffer"),
|
|
297
|
+
buf = t.optional(t.typeof("buffer")),
|
|
298
|
+
blobs = t.optional(t.array(t.any)),
|
|
299
|
+
})) }, nil },
|
|
300
300
|
},
|
|
301
301
|
incomingUnreliable = {
|
|
302
302
|
sendUnreliableClientMessage = true,
|
|
@@ -361,31 +361,235 @@ do
|
|
|
361
361
|
return self
|
|
362
362
|
end
|
|
363
363
|
function MessageEmitter:update()
|
|
364
|
+
local getPacket = function(info)
|
|
365
|
+
return info.packet
|
|
366
|
+
end
|
|
367
|
+
if RunService:IsClient() then
|
|
368
|
+
if #self.serverQueue == 0 then
|
|
369
|
+
return nil
|
|
370
|
+
end
|
|
371
|
+
local _exp = self.serverQueue
|
|
372
|
+
-- ▼ ReadonlyArray.map ▼
|
|
373
|
+
local _newValue = table.create(#_exp)
|
|
374
|
+
local _callback = function(_param)
|
|
375
|
+
local message = _param[1]
|
|
376
|
+
local data = _param[2]
|
|
377
|
+
local unreliable = _param[3]
|
|
378
|
+
local packet = self:getPacket(message, data)
|
|
379
|
+
return {
|
|
380
|
+
packet = packet,
|
|
381
|
+
unreliable = unreliable,
|
|
382
|
+
}
|
|
383
|
+
end
|
|
384
|
+
for _k, _v in _exp do
|
|
385
|
+
_newValue[_k] = _callback(_v, _k - 1, _exp)
|
|
386
|
+
end
|
|
387
|
+
-- ▲ ReadonlyArray.map ▲
|
|
388
|
+
local serverPacketInfos = _newValue
|
|
389
|
+
-- ▼ ReadonlyArray.filter ▼
|
|
390
|
+
local _newValue_1 = {}
|
|
391
|
+
local _callback_1 = function(info)
|
|
392
|
+
return info.unreliable
|
|
393
|
+
end
|
|
394
|
+
local _length = 0
|
|
395
|
+
for _k, _v in serverPacketInfos do
|
|
396
|
+
if _callback_1(_v, _k - 1, serverPacketInfos) == true then
|
|
397
|
+
_length += 1
|
|
398
|
+
_newValue_1[_length] = _v
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
-- ▲ ReadonlyArray.filter ▲
|
|
402
|
+
-- ▼ ReadonlyArray.map ▼
|
|
403
|
+
local _newValue_2 = table.create(#_newValue_1)
|
|
404
|
+
for _k, _v in _newValue_1 do
|
|
405
|
+
_newValue_2[_k] = getPacket(_v, _k - 1, _newValue_1)
|
|
406
|
+
end
|
|
407
|
+
-- ▲ ReadonlyArray.map ▲
|
|
408
|
+
local unreliableServerPackets = _newValue_2
|
|
409
|
+
-- ▼ ReadonlyArray.filter ▼
|
|
410
|
+
local _newValue_3 = {}
|
|
411
|
+
local _callback_2 = function(info)
|
|
412
|
+
return not info.unreliable
|
|
413
|
+
end
|
|
414
|
+
local _length_1 = 0
|
|
415
|
+
for _k, _v in serverPacketInfos do
|
|
416
|
+
if _callback_2(_v, _k - 1, serverPacketInfos) == true then
|
|
417
|
+
_length_1 += 1
|
|
418
|
+
_newValue_3[_length_1] = _v
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
-- ▲ ReadonlyArray.filter ▲
|
|
422
|
+
-- ▼ ReadonlyArray.map ▼
|
|
423
|
+
local _newValue_4 = table.create(#_newValue_3)
|
|
424
|
+
for _k, _v in _newValue_3 do
|
|
425
|
+
_newValue_4[_k] = getPacket(_v, _k - 1, _newValue_3)
|
|
426
|
+
end
|
|
427
|
+
-- ▲ ReadonlyArray.map ▲
|
|
428
|
+
local serverPackets = _newValue_4
|
|
429
|
+
if not (#unreliableServerPackets == 0) then
|
|
430
|
+
self.clientEvents.sendUnreliableServerMessage(unreliableServerPackets)
|
|
431
|
+
end
|
|
432
|
+
if not (#serverPackets == 0) then
|
|
433
|
+
self.clientEvents.sendServerMessage(serverPackets)
|
|
434
|
+
end
|
|
435
|
+
self.serverQueue = {}
|
|
436
|
+
return nil
|
|
437
|
+
end
|
|
438
|
+
local clientPackets = {}
|
|
439
|
+
local addClientPacket = function(player, packetInfo)
|
|
440
|
+
local _player = player
|
|
441
|
+
local _condition = clientPackets[_player]
|
|
442
|
+
if _condition == nil then
|
|
443
|
+
_condition = {}
|
|
444
|
+
end
|
|
445
|
+
local packetList = _condition
|
|
446
|
+
local _packetInfo = packetInfo
|
|
447
|
+
table.insert(packetList, _packetInfo)
|
|
448
|
+
local _player_1 = player
|
|
449
|
+
clientPackets[_player_1] = packetList
|
|
450
|
+
end
|
|
364
451
|
for _, _binding in self.clientQueue do
|
|
365
452
|
local player = _binding[1]
|
|
366
453
|
local message = _binding[2]
|
|
367
454
|
local data = _binding[3]
|
|
368
455
|
local unreliable = _binding[4]
|
|
369
|
-
local
|
|
370
|
-
|
|
456
|
+
local packet = self:getPacket(message, data)
|
|
457
|
+
local info = {
|
|
458
|
+
packet = packet,
|
|
459
|
+
unreliable = unreliable,
|
|
460
|
+
}
|
|
461
|
+
if typeof(player) == "Instance" then
|
|
462
|
+
addClientPacket(player, info)
|
|
463
|
+
else
|
|
464
|
+
for _1, p in player do
|
|
465
|
+
addClientPacket(p, info)
|
|
466
|
+
end
|
|
467
|
+
end
|
|
371
468
|
end
|
|
372
|
-
self.
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
local
|
|
376
|
-
local
|
|
377
|
-
|
|
378
|
-
|
|
469
|
+
if not (#self.clientBroadcastQueue == 0) then
|
|
470
|
+
local _exp = self.clientBroadcastQueue
|
|
471
|
+
-- ▼ ReadonlyArray.map ▼
|
|
472
|
+
local _newValue = table.create(#_exp)
|
|
473
|
+
local _callback = function(_param)
|
|
474
|
+
local message = _param[1]
|
|
475
|
+
local data = _param[2]
|
|
476
|
+
local unreliable = _param[3]
|
|
477
|
+
local packet = self:getPacket(message, data)
|
|
478
|
+
return {
|
|
479
|
+
packet = packet,
|
|
480
|
+
unreliable = unreliable,
|
|
481
|
+
}
|
|
482
|
+
end
|
|
483
|
+
for _k, _v in _exp do
|
|
484
|
+
_newValue[_k] = _callback(_v, _k - 1, _exp)
|
|
485
|
+
end
|
|
486
|
+
-- ▲ ReadonlyArray.map ▲
|
|
487
|
+
local clientBroadcastPackets = _newValue
|
|
488
|
+
-- ▼ ReadonlyArray.filter ▼
|
|
489
|
+
local _newValue_1 = {}
|
|
490
|
+
local _callback_1 = function(info)
|
|
491
|
+
return info.unreliable
|
|
492
|
+
end
|
|
493
|
+
local _length = 0
|
|
494
|
+
for _k, _v in clientBroadcastPackets do
|
|
495
|
+
if _callback_1(_v, _k - 1, clientBroadcastPackets) == true then
|
|
496
|
+
_length += 1
|
|
497
|
+
_newValue_1[_length] = _v
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
-- ▲ ReadonlyArray.filter ▲
|
|
501
|
+
-- ▼ ReadonlyArray.map ▼
|
|
502
|
+
local _newValue_2 = table.create(#_newValue_1)
|
|
503
|
+
for _k, _v in _newValue_1 do
|
|
504
|
+
_newValue_2[_k] = getPacket(_v, _k - 1, _newValue_1)
|
|
505
|
+
end
|
|
506
|
+
-- ▲ ReadonlyArray.map ▲
|
|
507
|
+
local unreliableBroadcastPackets = _newValue_2
|
|
508
|
+
-- ▼ ReadonlyArray.filter ▼
|
|
509
|
+
local _newValue_3 = {}
|
|
510
|
+
local _callback_2 = function(info)
|
|
511
|
+
return not info.unreliable
|
|
512
|
+
end
|
|
513
|
+
local _length_1 = 0
|
|
514
|
+
for _k, _v in clientBroadcastPackets do
|
|
515
|
+
if _callback_2(_v, _k - 1, clientBroadcastPackets) == true then
|
|
516
|
+
_length_1 += 1
|
|
517
|
+
_newValue_3[_length_1] = _v
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
-- ▲ ReadonlyArray.filter ▲
|
|
521
|
+
-- ▼ ReadonlyArray.map ▼
|
|
522
|
+
local _newValue_4 = table.create(#_newValue_3)
|
|
523
|
+
for _k, _v in _newValue_3 do
|
|
524
|
+
_newValue_4[_k] = getPacket(_v, _k - 1, _newValue_3)
|
|
525
|
+
end
|
|
526
|
+
-- ▲ ReadonlyArray.map ▲
|
|
527
|
+
local broadcastPackets = _newValue_4
|
|
528
|
+
if not (#unreliableBroadcastPackets == 0) then
|
|
529
|
+
self.serverEvents.sendUnreliableClientMessage:broadcast(unreliableBroadcastPackets)
|
|
530
|
+
end
|
|
531
|
+
if not (#broadcastPackets == 0) then
|
|
532
|
+
self.serverEvents.sendClientMessage:broadcast(broadcastPackets)
|
|
533
|
+
end
|
|
534
|
+
self.clientBroadcastQueue = {}
|
|
379
535
|
end
|
|
380
|
-
self.
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
536
|
+
if not (#self.clientQueue == 0) then
|
|
537
|
+
for player, packetInfo in clientPackets do
|
|
538
|
+
if #packetInfo == 0 then
|
|
539
|
+
continue
|
|
540
|
+
end
|
|
541
|
+
if #packetInfo == 0 then
|
|
542
|
+
continue
|
|
543
|
+
end
|
|
544
|
+
-- ▼ ReadonlyArray.filter ▼
|
|
545
|
+
local _newValue = {}
|
|
546
|
+
local _callback = function(info)
|
|
547
|
+
return info.unreliable
|
|
548
|
+
end
|
|
549
|
+
local _length = 0
|
|
550
|
+
for _k, _v in packetInfo do
|
|
551
|
+
if _callback(_v, _k - 1, packetInfo) == true then
|
|
552
|
+
_length += 1
|
|
553
|
+
_newValue[_length] = _v
|
|
554
|
+
end
|
|
555
|
+
end
|
|
556
|
+
-- ▲ ReadonlyArray.filter ▲
|
|
557
|
+
-- ▼ ReadonlyArray.map ▼
|
|
558
|
+
local _newValue_1 = table.create(#_newValue)
|
|
559
|
+
for _k, _v in _newValue do
|
|
560
|
+
_newValue_1[_k] = getPacket(_v, _k - 1, _newValue)
|
|
561
|
+
end
|
|
562
|
+
-- ▲ ReadonlyArray.map ▲
|
|
563
|
+
local unreliablePackets = _newValue_1
|
|
564
|
+
-- ▼ ReadonlyArray.filter ▼
|
|
565
|
+
local _newValue_2 = {}
|
|
566
|
+
local _callback_1 = function(info)
|
|
567
|
+
return not info.unreliable
|
|
568
|
+
end
|
|
569
|
+
local _length_1 = 0
|
|
570
|
+
for _k, _v in packetInfo do
|
|
571
|
+
if _callback_1(_v, _k - 1, packetInfo) == true then
|
|
572
|
+
_length_1 += 1
|
|
573
|
+
_newValue_2[_length_1] = _v
|
|
574
|
+
end
|
|
575
|
+
end
|
|
576
|
+
-- ▲ ReadonlyArray.filter ▲
|
|
577
|
+
-- ▼ ReadonlyArray.map ▼
|
|
578
|
+
local _newValue_3 = table.create(#_newValue_2)
|
|
579
|
+
for _k, _v in _newValue_2 do
|
|
580
|
+
_newValue_3[_k] = getPacket(_v, _k - 1, _newValue_2)
|
|
581
|
+
end
|
|
582
|
+
-- ▲ ReadonlyArray.map ▲
|
|
583
|
+
local packets = _newValue_3
|
|
584
|
+
if not (#unreliablePackets == 0) then
|
|
585
|
+
self.serverEvents.sendUnreliableClientMessage(player, unreliablePackets)
|
|
586
|
+
end
|
|
587
|
+
if not (#packets == 0) then
|
|
588
|
+
self.serverEvents.sendClientMessage(player, packets)
|
|
589
|
+
end
|
|
590
|
+
end
|
|
591
|
+
self.clientQueue = {}
|
|
387
592
|
end
|
|
388
|
-
self.serverQueue = {}
|
|
389
593
|
end
|
|
390
594
|
function MessageEmitter:runClientMiddlewares(message, data, player)
|
|
391
595
|
if not self:validateData(message, data) then
|
|
@@ -482,13 +686,15 @@ do
|
|
|
482
686
|
end
|
|
483
687
|
return guardPassed
|
|
484
688
|
end
|
|
485
|
-
function MessageEmitter:onRemoteFire(
|
|
486
|
-
|
|
487
|
-
|
|
689
|
+
function MessageEmitter:onRemoteFire(serializedPackets, player)
|
|
690
|
+
for _, packet in serializedPackets do
|
|
691
|
+
if buffer.len(packet.messageBuf) > 1 then
|
|
692
|
+
return warn("[@rbxts/tether]: Rejected packet because message buffer was larger than one byte")
|
|
693
|
+
end
|
|
694
|
+
local message = buffer.readu8(packet.messageBuf, 0)
|
|
695
|
+
self:executeEventCallbacks(message, packet, player)
|
|
696
|
+
self:executeFunctions(message, packet)
|
|
488
697
|
end
|
|
489
|
-
local message = buffer.readu8(serializedPacket.messageBuffer, 0)
|
|
490
|
-
self:executeEventCallbacks(message, serializedPacket, player)
|
|
491
|
-
self:executeFunctions(message, serializedPacket)
|
|
492
698
|
end
|
|
493
699
|
function MessageEmitter:executeFunctions(message, serializedPacket)
|
|
494
700
|
local isServer = RunService:IsServer()
|
|
@@ -524,7 +730,7 @@ do
|
|
|
524
730
|
local serializer = self:getSerializer(message)
|
|
525
731
|
local _packet = serializer
|
|
526
732
|
if _packet ~= nil then
|
|
527
|
-
_packet = _packet.deserialize(serializedPacket
|
|
733
|
+
_packet = _packet.deserialize(serializedPacket)
|
|
528
734
|
end
|
|
529
735
|
local packet = _packet
|
|
530
736
|
self:validateData(message, packet)
|
|
@@ -565,17 +771,17 @@ do
|
|
|
565
771
|
end
|
|
566
772
|
function MessageEmitter:getPacket(message, data)
|
|
567
773
|
local serializer = self:getSerializer(message)
|
|
568
|
-
local
|
|
569
|
-
buffer.writeu8(
|
|
774
|
+
local messageBuf = buffer.create(1)
|
|
775
|
+
buffer.writeu8(messageBuf, 0, message)
|
|
570
776
|
if serializer == nil then
|
|
571
777
|
return {
|
|
572
|
-
|
|
573
|
-
|
|
778
|
+
messageBuf = messageBuf,
|
|
779
|
+
buf = buffer.create(0),
|
|
574
780
|
blobs = {},
|
|
575
781
|
}
|
|
576
782
|
end
|
|
577
783
|
local _object = {
|
|
578
|
-
|
|
784
|
+
messageBuf = messageBuf,
|
|
579
785
|
}
|
|
580
786
|
for _k, _v in serializer.serialize(data) do
|
|
581
787
|
_object[_k] = _v
|
|
@@ -586,7 +792,7 @@ do
|
|
|
586
792
|
self.serializers[message] = self:createMessageSerializer(meta)
|
|
587
793
|
end
|
|
588
794
|
function MessageEmitter:createMessageSerializer(meta)
|
|
589
|
-
return
|
|
795
|
+
return createSerializer(meta)
|
|
590
796
|
end
|
|
591
797
|
function MessageEmitter:getSerializer(message)
|
|
592
798
|
return self.serializers[message]
|
package/out/structs.d.ts
CHANGED
|
@@ -1,32 +1,41 @@
|
|
|
1
1
|
import { Modding } from "@flamework/core";
|
|
2
2
|
import type { Networking } from "@flamework/networking";
|
|
3
|
-
import type { SerializerMetadata } from "@rbxts/
|
|
3
|
+
import type { SerializerMetadata, SerializedData, Transform, Vector, String, u8, u16, u32, i8, i16, i32, f16, f24, f32, f64 } from "@rbxts/serio";
|
|
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;
|
|
7
7
|
export type ServerMessageCallback<T = unknown> = (player: Player, data: T) => void;
|
|
8
8
|
export type ServerMessageFunctionCallback<T = unknown, R = unknown> = (player: Player, data: T) => R;
|
|
9
9
|
export type BaseMessage = number;
|
|
10
|
-
export interface
|
|
11
|
-
readonly
|
|
12
|
-
readonly
|
|
13
|
-
readonly blobs: defined[];
|
|
10
|
+
export interface PacketInfo {
|
|
11
|
+
readonly packet: SerializedPacket;
|
|
12
|
+
readonly unreliable: boolean;
|
|
14
13
|
}
|
|
15
|
-
export
|
|
14
|
+
export interface SerializedPacket extends SerializedData {
|
|
15
|
+
readonly messageBuf: buffer;
|
|
16
|
+
}
|
|
17
|
+
export type MessageEvent = (packets: SerializedPacket[]) => void;
|
|
16
18
|
export type UnreliableMessageEvent = Networking.Unreliable<MessageEvent>;
|
|
17
19
|
export interface ServerEvents {
|
|
18
|
-
sendServerMessage: MessageEvent;
|
|
19
|
-
sendUnreliableServerMessage: UnreliableMessageEvent;
|
|
20
|
+
readonly sendServerMessage: MessageEvent;
|
|
21
|
+
readonly sendUnreliableServerMessage: UnreliableMessageEvent;
|
|
20
22
|
}
|
|
21
23
|
export interface ClientEvents {
|
|
22
|
-
sendClientMessage: MessageEvent;
|
|
23
|
-
sendUnreliableClientMessage: UnreliableMessageEvent;
|
|
24
|
+
readonly sendClientMessage: MessageEvent;
|
|
25
|
+
readonly sendUnreliableClientMessage: UnreliableMessageEvent;
|
|
24
26
|
}
|
|
27
|
+
type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
28
|
+
type ReplaceByMapWithDepth<T, Depth extends number = 11> = [
|
|
29
|
+
Depth
|
|
30
|
+
] extends [never] ? T : T extends Vector ? Vector3 : T extends Transform ? CFrame : T extends String ? string : T extends u8 | u16 | u32 | i8 | i16 | i32 | f16 | f24 | f32 | f64 ? number : T extends any[] ? ReplaceByMapWithDepth<T[number], Prev[Depth]>[] : T extends object ? {
|
|
31
|
+
[K in keyof T]: ReplaceByMapWithDepth<T[K], Prev[Depth]>;
|
|
32
|
+
} : T;
|
|
25
33
|
export interface MessageMetadata<MessageData, Kind extends keyof MessageData> {
|
|
26
|
-
readonly guard: Modding.Generic<MessageData[Kind]
|
|
34
|
+
readonly guard: Modding.Generic<ReplaceByMapWithDepth<MessageData[Kind]>, "guard">;
|
|
27
35
|
readonly serializerMetadata: MessageData[Kind] extends undefined ? undefined : Modding.Many<SerializerMetadata<MessageData[Kind]>>;
|
|
28
36
|
}
|
|
29
37
|
export type Guard<T = unknown> = (value: unknown) => value is T;
|
|
30
38
|
export type MessageEmitterMetadata<MessageData> = {
|
|
31
|
-
[Kind in keyof MessageData]: MessageMetadata<MessageData, Kind>;
|
|
39
|
+
readonly [Kind in keyof MessageData]: MessageMetadata<MessageData, Kind>;
|
|
32
40
|
};
|
|
41
|
+
export {};
|
package/out/utility.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function bufferToString(buf
|
|
1
|
+
export declare function bufferToString(buf?: buffer): string;
|
package/out/utility.luau
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
-- Compiled with roblox-ts v3.0.0
|
|
2
2
|
local function bufferToString(buf)
|
|
3
3
|
local s = { "{ " }
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
4
|
+
if buf ~= nil then
|
|
5
|
+
do
|
|
6
|
+
local i = 0
|
|
7
|
+
local _shouldIncrement = false
|
|
8
|
+
while true do
|
|
9
|
+
if _shouldIncrement then
|
|
10
|
+
i += 1
|
|
11
|
+
else
|
|
12
|
+
_shouldIncrement = true
|
|
13
|
+
end
|
|
14
|
+
if not (i < buffer.len(buf)) then
|
|
15
|
+
break
|
|
16
|
+
end
|
|
17
|
+
local byte = buffer.readu8(buf, i)
|
|
18
|
+
local _arg0 = tostring(byte)
|
|
19
|
+
table.insert(s, _arg0)
|
|
20
|
+
local _arg0_1 = if i < buffer.len(buf) - 1 then ", " else ""
|
|
21
|
+
table.insert(s, _arg0_1)
|
|
21
22
|
end
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
|
-
table.insert(s, "
|
|
25
|
+
table.insert(s, "}")
|
|
25
26
|
return table.concat(s, "")
|
|
26
27
|
end
|
|
27
28
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rbxts/tether",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"main": "out/init.lua",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "rbxtsc",
|
|
@@ -32,15 +32,15 @@
|
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@rbxts/compiler-types": "^3.0.0-types.0",
|
|
34
34
|
"@rbxts/types": "^1.0.835",
|
|
35
|
-
"rbxts-transformer-flamework": "^1.
|
|
35
|
+
"rbxts-transformer-flamework": "^1.3.1",
|
|
36
36
|
"roblox-ts": "^3.0.0",
|
|
37
37
|
"typescript": "^5.5.3"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@flamework/core": "^1.
|
|
41
|
-
"@flamework/networking": "^1.
|
|
40
|
+
"@flamework/core": "^1.3.1",
|
|
41
|
+
"@flamework/networking": "^1.3.1",
|
|
42
42
|
"@rbxts/destroyable": "^1.0.1",
|
|
43
|
-
"@rbxts/
|
|
43
|
+
"@rbxts/serio": "^1.0.5",
|
|
44
44
|
"@rbxts/flamework-meta-utils": "^1.0.4",
|
|
45
45
|
"@rbxts/object-utils": "^1.0.4",
|
|
46
46
|
"@rbxts/repr": "^1.0.1",
|