@rbxts/tether 1.0.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/README.md +2 -0
- package/out/index.d.ts +26 -0
- package/out/init.luau +156 -0
- package/package.json +42 -0
package/README.md
ADDED
package/out/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Modding } from "@flamework/core";
|
|
2
|
+
import { type SerializerMetadata } from "@rbxts/flamework-binary-serializer";
|
|
3
|
+
type ClientMessageCallback<T = unknown> = (data: T) => void;
|
|
4
|
+
type ServerMessageCallback<T = unknown> = (player: Player, data: T) => void;
|
|
5
|
+
type BaseMessage = number | string;
|
|
6
|
+
export declare class MessageEmitter<Message extends BaseMessage, MessageData extends Record<Message, unknown>> {
|
|
7
|
+
private readonly clientCallbacks;
|
|
8
|
+
private readonly serverCallbacks;
|
|
9
|
+
private readonly serializers;
|
|
10
|
+
private readonly serverEvents;
|
|
11
|
+
private readonly clientEvents;
|
|
12
|
+
constructor();
|
|
13
|
+
/** @metadata macro */
|
|
14
|
+
addSerializer<Kind extends Message>(message: Kind, meta?: Modding.Many<SerializerMetadata<MessageData[Kind]>>): void;
|
|
15
|
+
initialize(): RBXScriptConnection;
|
|
16
|
+
onServerMessage<Kind extends Message>(message: Kind, callback: ServerMessageCallback<MessageData[Kind]>): () => void;
|
|
17
|
+
onClientMessage<Kind extends Message>(message: Kind, callback: ClientMessageCallback<MessageData[Kind]>): () => void;
|
|
18
|
+
emitServer<Kind extends Message>(message: Kind, data: MessageData[Kind], unreliable?: boolean): void;
|
|
19
|
+
emitClient<Kind extends Message>(player: Player, message: Kind, data: MessageData[Kind], unreliable?: boolean): void;
|
|
20
|
+
emitAllClients<Kind extends Message>(message: Kind, data: MessageData[Kind], unreliable?: boolean): void;
|
|
21
|
+
private getPacket;
|
|
22
|
+
/** @metadata macro */
|
|
23
|
+
private createMessageSerializer;
|
|
24
|
+
private getSerializer;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
package/out/init.luau
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
-- Compiled with roblox-ts v3.0.0
|
|
2
|
+
local TS = _G[script]
|
|
3
|
+
local Networking = TS.import(script, TS.getModule(script, "@flamework", "networking").out).Networking
|
|
4
|
+
local createBinarySerializer = TS.import(script, TS.getModule(script, "@rbxts", "flamework-binary-serializer").out).createBinarySerializer
|
|
5
|
+
local RunService = TS.import(script, TS.getModule(script, "@rbxts", "services")).RunService
|
|
6
|
+
local GlobalEvents = Networking.createEvent()
|
|
7
|
+
local MessageEmitter
|
|
8
|
+
do
|
|
9
|
+
MessageEmitter = setmetatable({}, {
|
|
10
|
+
__tostring = function()
|
|
11
|
+
return "MessageEmitter"
|
|
12
|
+
end,
|
|
13
|
+
})
|
|
14
|
+
MessageEmitter.__index = MessageEmitter
|
|
15
|
+
function MessageEmitter.new(...)
|
|
16
|
+
local self = setmetatable({}, MessageEmitter)
|
|
17
|
+
return self:constructor(...) or self
|
|
18
|
+
end
|
|
19
|
+
function MessageEmitter:constructor()
|
|
20
|
+
self.clientCallbacks = {}
|
|
21
|
+
self.serverCallbacks = {}
|
|
22
|
+
self.serializers = {}
|
|
23
|
+
if RunService:IsServer() then
|
|
24
|
+
self.serverEvents = GlobalEvents:createServer({})
|
|
25
|
+
else
|
|
26
|
+
self.clientEvents = GlobalEvents:createClient({})
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
function MessageEmitter:addSerializer(message, meta)
|
|
30
|
+
self.serializers[message] = self:createMessageSerializer(meta)
|
|
31
|
+
end
|
|
32
|
+
function MessageEmitter:initialize()
|
|
33
|
+
if RunService:IsClient() then
|
|
34
|
+
return self.clientEvents.sendClientMessage:connect(function(sentMessage, _param)
|
|
35
|
+
local buffer = _param.buffer
|
|
36
|
+
local blobs = _param.blobs
|
|
37
|
+
local _clientCallbacks = self.clientCallbacks
|
|
38
|
+
local _sentMessage = sentMessage
|
|
39
|
+
local _condition = _clientCallbacks[_sentMessage]
|
|
40
|
+
if _condition == nil then
|
|
41
|
+
_condition = {}
|
|
42
|
+
end
|
|
43
|
+
local messageCallbacks = _condition
|
|
44
|
+
if #messageCallbacks == 0 then
|
|
45
|
+
return nil
|
|
46
|
+
end
|
|
47
|
+
local serializer = self:getSerializer(sentMessage)
|
|
48
|
+
local data = serializer.deserialize(buffer, blobs)
|
|
49
|
+
for _, callback in messageCallbacks do
|
|
50
|
+
callback(data)
|
|
51
|
+
end
|
|
52
|
+
end)
|
|
53
|
+
else
|
|
54
|
+
return self.serverEvents.sendServerMessage:connect(function(player, sentMessage, _param)
|
|
55
|
+
local buffer = _param.buffer
|
|
56
|
+
local blobs = _param.blobs
|
|
57
|
+
local _serverCallbacks = self.serverCallbacks
|
|
58
|
+
local _sentMessage = sentMessage
|
|
59
|
+
local _condition = _serverCallbacks[_sentMessage]
|
|
60
|
+
if _condition == nil then
|
|
61
|
+
_condition = {}
|
|
62
|
+
end
|
|
63
|
+
local messageCallbacks = _condition
|
|
64
|
+
if #messageCallbacks == 0 then
|
|
65
|
+
return nil
|
|
66
|
+
end
|
|
67
|
+
local serializer = self:getSerializer(sentMessage)
|
|
68
|
+
local data = serializer.deserialize(buffer, blobs)
|
|
69
|
+
for _, callback in messageCallbacks do
|
|
70
|
+
callback(player, data)
|
|
71
|
+
end
|
|
72
|
+
end)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
function MessageEmitter:onServerMessage(message, callback)
|
|
76
|
+
local _serverCallbacks = self.serverCallbacks
|
|
77
|
+
local _message = message
|
|
78
|
+
if not (_serverCallbacks[_message] ~= nil) then
|
|
79
|
+
local _serverCallbacks_1 = self.serverCallbacks
|
|
80
|
+
local _message_1 = message
|
|
81
|
+
_serverCallbacks_1[_message_1] = {}
|
|
82
|
+
end
|
|
83
|
+
local _serverCallbacks_1 = self.serverCallbacks
|
|
84
|
+
local _message_1 = message
|
|
85
|
+
local callbacks = _serverCallbacks_1[_message_1]
|
|
86
|
+
local _callback = callback
|
|
87
|
+
table.insert(callbacks, _callback)
|
|
88
|
+
local _serverCallbacks_2 = self.serverCallbacks
|
|
89
|
+
local _message_2 = message
|
|
90
|
+
_serverCallbacks_2[_message_2] = callbacks
|
|
91
|
+
return function()
|
|
92
|
+
local _callback_1 = callback
|
|
93
|
+
local _arg0 = (table.find(callbacks, _callback_1) or 0) - 1
|
|
94
|
+
return table.remove(callbacks, _arg0 + 1)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
function MessageEmitter:onClientMessage(message, callback)
|
|
98
|
+
local _clientCallbacks = self.clientCallbacks
|
|
99
|
+
local _message = message
|
|
100
|
+
if not (_clientCallbacks[_message] ~= nil) then
|
|
101
|
+
local _clientCallbacks_1 = self.clientCallbacks
|
|
102
|
+
local _message_1 = message
|
|
103
|
+
_clientCallbacks_1[_message_1] = {}
|
|
104
|
+
end
|
|
105
|
+
local _clientCallbacks_1 = self.clientCallbacks
|
|
106
|
+
local _message_1 = message
|
|
107
|
+
local callbacks = _clientCallbacks_1[_message_1]
|
|
108
|
+
local _callback = callback
|
|
109
|
+
table.insert(callbacks, _callback)
|
|
110
|
+
local _clientCallbacks_2 = self.clientCallbacks
|
|
111
|
+
local _message_2 = message
|
|
112
|
+
_clientCallbacks_2[_message_2] = callbacks
|
|
113
|
+
return function()
|
|
114
|
+
local _callback_1 = callback
|
|
115
|
+
local _arg0 = (table.find(callbacks, _callback_1) or 0) - 1
|
|
116
|
+
return table.remove(callbacks, _arg0 + 1)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
function MessageEmitter:emitServer(message, data, unreliable)
|
|
120
|
+
if unreliable == nil then
|
|
121
|
+
unreliable = false
|
|
122
|
+
end
|
|
123
|
+
local send = if unreliable then self.clientEvents.sendUnreliableServerMessage else self.clientEvents.sendServerMessage
|
|
124
|
+
send(message, self:getPacket(message, data))
|
|
125
|
+
end
|
|
126
|
+
function MessageEmitter:emitClient(player, message, data, unreliable)
|
|
127
|
+
if unreliable == nil then
|
|
128
|
+
unreliable = false
|
|
129
|
+
end
|
|
130
|
+
local send = if unreliable then self.serverEvents.sendUnreliableClientMessage else self.serverEvents.sendClientMessage
|
|
131
|
+
send(player, message, self:getPacket(message, data))
|
|
132
|
+
end
|
|
133
|
+
function MessageEmitter:emitAllClients(message, data, unreliable)
|
|
134
|
+
if unreliable == nil then
|
|
135
|
+
unreliable = false
|
|
136
|
+
end
|
|
137
|
+
local send = if unreliable then self.serverEvents.sendUnreliableClientMessage else self.serverEvents.sendClientMessage
|
|
138
|
+
send:broadcast(message, self:getPacket(message, data))
|
|
139
|
+
end
|
|
140
|
+
function MessageEmitter:getPacket(message, data, unreliable)
|
|
141
|
+
if unreliable == nil then
|
|
142
|
+
unreliable = false
|
|
143
|
+
end
|
|
144
|
+
local serializer = self:getSerializer(message)
|
|
145
|
+
return serializer.serialize(data)
|
|
146
|
+
end
|
|
147
|
+
function MessageEmitter:createMessageSerializer(meta)
|
|
148
|
+
return createBinarySerializer(meta)
|
|
149
|
+
end
|
|
150
|
+
function MessageEmitter:getSerializer(message)
|
|
151
|
+
return self.serializers[message]
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
return {
|
|
155
|
+
MessageEmitter = MessageEmitter,
|
|
156
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rbxts/tether",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "out/init.lua",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "rbxtsc",
|
|
7
|
+
"watch": "rbxtsc -w",
|
|
8
|
+
"prepublishOnly": "npm run build"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"roblox",
|
|
12
|
+
"tether",
|
|
13
|
+
"networking",
|
|
14
|
+
"message"
|
|
15
|
+
],
|
|
16
|
+
"repository": {
|
|
17
|
+
"url": "https://github.com/R-unic/tether.git"
|
|
18
|
+
},
|
|
19
|
+
"author": "runicly",
|
|
20
|
+
"license": "ISC",
|
|
21
|
+
"description": "A message-based networking solution for Roblox with automatic binary serialization",
|
|
22
|
+
"types": "out/index.d.ts",
|
|
23
|
+
"files": [
|
|
24
|
+
"out",
|
|
25
|
+
"!**/*.tsbuildinfo"
|
|
26
|
+
],
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@rbxts/compiler-types": "^3.0.0-types.0",
|
|
32
|
+
"@rbxts/types": "^1.0.835",
|
|
33
|
+
"roblox-ts": "^3.0.0",
|
|
34
|
+
"typescript": "^5.7.3"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@flamework/core": "^1.2.3",
|
|
38
|
+
"@flamework/networking": "^1.2.3",
|
|
39
|
+
"@rbxts/flamework-binary-serializer": "^0.6.0",
|
|
40
|
+
"@rbxts/services": "^1.5.5"
|
|
41
|
+
}
|
|
42
|
+
}
|