@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 ADDED
@@ -0,0 +1,2 @@
1
+ # Tether
2
+ A message-based networking solution for Roblox with automatic binary serialization
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
+ }