@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.
- package/out/message-emitter.d.ts +3 -3
- package/out/message-emitter.luau +263 -42
- package/out/structs.d.ts +10 -6
- package/package.json +1 -1
package/out/message-emitter.d.ts
CHANGED
|
@@ -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 */
|
package/out/message-emitter.luau
CHANGED
|
@@ -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({},
|
|
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
|
-
|
|
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 >=
|
|
342
|
-
elapsed -=
|
|
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
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
local
|
|
369
|
-
|
|
370
|
-
local
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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(
|
|
471
|
-
|
|
472
|
-
|
|
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 = (
|
|
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
|
};
|