@rbxts/tether 1.2.8 → 1.3.0

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.
@@ -13,11 +13,11 @@ export declare class MessageEmitter<MessageData> extends Destroyable {
13
13
  private readonly clientFunctions;
14
14
  private readonly serverCallbacks;
15
15
  private readonly serverFunctions;
16
- private readonly clientQueue;
17
- private readonly clientBroadcastQueue;
18
- private readonly serverQueue;
19
16
  private readonly guards;
20
17
  private readonly serializers;
18
+ private serverQueue;
19
+ private clientBroadcastQueue;
20
+ private clientQueue;
21
21
  private serverEvents;
22
22
  private clientEvents;
23
23
  /** @metadata macro */
@@ -48,11 +48,11 @@ do
48
48
  self.clientFunctions = {}
49
49
  self.serverCallbacks = {}
50
50
  self.serverFunctions = {}
51
- self.clientQueue = {}
52
- self.clientBroadcastQueue = {}
53
- self.serverQueue = {}
54
51
  self.guards = {}
55
52
  self.serializers = {}
53
+ self.serverQueue = {}
54
+ self.clientBroadcastQueue = {}
55
+ self.clientQueue = {}
56
56
  self.server = {
57
57
  on = function(message, callback)
58
58
  if RunService:IsClient() then
@@ -83,6 +83,9 @@ do
83
83
  local _serverQueue = self.serverQueue
84
84
  local _arg0 = { message, newData, unreliable }
85
85
  table.insert(_serverQueue, _arg0)
86
+ if not self.options.batchRemotes then
87
+ self:update()
88
+ end
86
89
  end)
87
90
  end,
88
91
  invoke = TS.async(function(message, returnMessage, data, unreliable)
@@ -153,6 +156,9 @@ do
153
156
  local _clientQueue = self.clientQueue
154
157
  local _arg0 = { player, message, newData, unreliable }
155
158
  table.insert(_clientQueue, _arg0)
159
+ if not self.options.batchRemotes then
160
+ self:update()
161
+ end
156
162
  end)
157
163
  end,
158
164
  emitExcept = function(player, message, data, unreliable)
@@ -202,6 +208,9 @@ do
202
208
  local _clientBroadcastQueue = self.clientBroadcastQueue
203
209
  local _arg0 = { message, newData, unreliable }
204
210
  table.insert(_clientBroadcastQueue, _arg0)
211
+ if not self.options.batchRemotes then
212
+ self:update()
213
+ end
205
214
  end)
206
215
  end,
207
216
  invoke = TS.async(function(message, returnMessage, player, data, unreliable)
@@ -253,16 +262,16 @@ do
253
262
  self.serverEvents = remotes:createServer({}, {
254
263
  incomingIds = { "sendServerMessage", "sendUnreliableServerMessage" },
255
264
  incoming = {
256
- sendServerMessage = { { t.interface({
265
+ sendServerMessage = { { t.array(t.interface({
257
266
  messageBuffer = t.typeof("buffer"),
258
267
  buffer = t.typeof("buffer"),
259
268
  blobs = t.array(t.any),
260
- }) }, nil },
261
- sendUnreliableServerMessage = { { t.interface({
269
+ })) }, nil },
270
+ sendUnreliableServerMessage = { { t.array(t.interface({
262
271
  messageBuffer = t.typeof("buffer"),
263
272
  buffer = t.typeof("buffer"),
264
273
  blobs = t.array(t.any),
265
- }) }, nil },
274
+ })) }, nil },
266
275
  },
267
276
  incomingUnreliable = {
268
277
  sendUnreliableServerMessage = true,
@@ -278,16 +287,16 @@ do
278
287
  self.clientEvents = remotes:createClient({}, {
279
288
  incomingIds = { "sendClientMessage", "sendUnreliableClientMessage" },
280
289
  incoming = {
281
- sendClientMessage = { { t.interface({
290
+ sendClientMessage = { { t.array(t.interface({
282
291
  messageBuffer = t.typeof("buffer"),
283
292
  buffer = t.typeof("buffer"),
284
293
  blobs = t.array(t.any),
285
- }) }, nil },
286
- sendUnreliableClientMessage = { { t.interface({
294
+ })) }, nil },
295
+ sendUnreliableClientMessage = { { t.array(t.interface({
287
296
  messageBuffer = t.typeof("buffer"),
288
297
  buffer = t.typeof("buffer"),
289
298
  blobs = t.array(t.any),
290
- }) }, nil },
299
+ })) }, nil },
291
300
  },
292
301
  incomingUnreliable = {
293
302
  sendUnreliableClientMessage = true,
@@ -302,7 +311,7 @@ do
302
311
  end
303
312
  end
304
313
  function MessageEmitter:create(options, meta)
305
- local emitter = MessageEmitter.new(Object.assign({}, options, defaultMesssageEmitterOptions))
314
+ local emitter = MessageEmitter.new(Object.assign({}, defaultMesssageEmitterOptions, options))
306
315
  if meta == nil then
307
316
  warn(metaGenerationFailed)
308
317
  return emitter:initialize()
@@ -336,41 +345,251 @@ do
336
345
  end))
337
346
  end
338
347
  local elapsed = 0
339
- RunService.Heartbeat:Connect(function(dt)
348
+ local _binding = self.options
349
+ local batchRemotes = _binding.batchRemotes
350
+ local batchRate = _binding.batchRate
351
+ if not batchRemotes then
352
+ return self
353
+ end
354
+ self.janitor:Add(RunService.Heartbeat:Connect(function(dt)
340
355
  elapsed += dt
341
- if elapsed >= self.options.batchRate then
342
- elapsed -= self.options.batchRate
356
+ if elapsed >= batchRate then
357
+ elapsed -= batchRate
343
358
  self:update()
344
359
  end
345
- end)
360
+ end))
346
361
  return self
347
362
  end
348
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
349
451
  for _, _binding in self.clientQueue do
350
452
  local player = _binding[1]
351
453
  local message = _binding[2]
352
454
  local data = _binding[3]
353
455
  local unreliable = _binding[4]
354
- local remote = if unreliable then self.serverEvents.sendUnreliableClientMessage else self.serverEvents.sendClientMessage
355
- remote(player, self:getPacket(message, data))
356
- end
357
- table.clear(self.clientQueue)
358
- for _, _binding in self.clientBroadcastQueue do
359
- local message = _binding[1]
360
- local data = _binding[2]
361
- local unreliable = _binding[3]
362
- local remote = if unreliable then self.serverEvents.sendUnreliableClientMessage else self.serverEvents.sendClientMessage
363
- remote:broadcast(self:getPacket(message, data))
364
- end
365
- table.clear(self.clientBroadcastQueue)
366
- for _, _binding in self.serverQueue do
367
- local message = _binding[1]
368
- local data = _binding[2]
369
- local unreliable = _binding[3]
370
- local remote = if unreliable then self.clientEvents.sendUnreliableServerMessage else self.clientEvents.sendServerMessage
371
- remote(self:getPacket(message, data))
372
- end
373
- table.clear(self.serverQueue)
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
468
+ end
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 = {}
535
+ end
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 = {}
592
+ end
374
593
  end
375
594
  function MessageEmitter:runClientMiddlewares(message, data, player)
376
595
  if not self:validateData(message, data) then
@@ -467,13 +686,15 @@ do
467
686
  end
468
687
  return guardPassed
469
688
  end
470
- function MessageEmitter:onRemoteFire(serializedPacket, player)
471
- if buffer.len(serializedPacket.messageBuffer) > 1 then
472
- return warn("[@rbxts/tether]: Rejected message because message buffer was larger than one byte")
689
+ function MessageEmitter:onRemoteFire(serializedPackets, player)
690
+ for _, packet in serializedPackets do
691
+ if buffer.len(packet.messageBuffer) > 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.messageBuffer, 0)
695
+ self:executeEventCallbacks(message, packet, player)
696
+ self:executeFunctions(message, packet)
473
697
  end
474
- local message = buffer.readu8(serializedPacket.messageBuffer, 0)
475
- self:executeEventCallbacks(message, serializedPacket, player)
476
- self:executeFunctions(message, serializedPacket)
477
698
  end
478
699
  function MessageEmitter:executeFunctions(message, serializedPacket)
479
700
  local isServer = RunService:IsServer()
package/out/structs.d.ts CHANGED
@@ -7,20 +7,24 @@ export type ClientMessageFunctionCallback<T = unknown, R = unknown> = (data: T)
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 PacketInfo {
11
+ readonly packet: SerializedPacket;
12
+ readonly unreliable: boolean;
13
+ }
10
14
  export interface SerializedPacket {
11
15
  readonly messageBuffer: buffer;
12
16
  readonly buffer: buffer;
13
17
  readonly blobs: defined[];
14
18
  }
15
- export type MessageEvent = (packet: SerializedPacket) => void;
19
+ export type MessageEvent = (packets: SerializedPacket[]) => void;
16
20
  export type UnreliableMessageEvent = Networking.Unreliable<MessageEvent>;
17
21
  export interface ServerEvents {
18
- sendServerMessage: MessageEvent;
19
- sendUnreliableServerMessage: UnreliableMessageEvent;
22
+ readonly sendServerMessage: MessageEvent;
23
+ readonly sendUnreliableServerMessage: UnreliableMessageEvent;
20
24
  }
21
25
  export interface ClientEvents {
22
- sendClientMessage: MessageEvent;
23
- sendUnreliableClientMessage: UnreliableMessageEvent;
26
+ readonly sendClientMessage: MessageEvent;
27
+ readonly sendUnreliableClientMessage: UnreliableMessageEvent;
24
28
  }
25
29
  export interface MessageMetadata<MessageData, Kind extends keyof MessageData> {
26
30
  readonly guard: Modding.Generic<MessageData[Kind], "guard">;
@@ -28,5 +32,5 @@ export interface MessageMetadata<MessageData, Kind extends keyof MessageData> {
28
32
  }
29
33
  export type Guard<T = unknown> = (value: unknown) => value is T;
30
34
  export type MessageEmitterMetadata<MessageData> = {
31
- [Kind in keyof MessageData]: MessageMetadata<MessageData, Kind>;
35
+ readonly [Kind in keyof MessageData]: MessageMetadata<MessageData, Kind>;
32
36
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rbxts/tether",
3
- "version": "1.2.8",
3
+ "version": "1.3.0",
4
4
  "main": "out/init.lua",
5
5
  "scripts": {
6
6
  "build": "rbxtsc",