Skip to content

Commit c3b0a45

Browse files
committed
step one of polishing
1 parent 0e54734 commit c3b0a45

30 files changed

+376
-216
lines changed

.gitattributes

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.luau linguist-language=Lua

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# ByteNet
2+
---
3+
*This project uses [semantic versioning](https://semver.org/spec/v2.0.0.html).*
4+
---
5+
6+
## version 0.1.0 (Release)

LICENSE

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Copyright 2023 ffrostfall
2+
3+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4+
5+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6+
7+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

README.md

+5-16
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
1-
# ByteNet
2-
Generated by [Rojo](https://github.com/rojo-rbx/rojo) 7.3.0.
1+
# ByteNet v0.1.0
2+
---
3+
## net library
4+
---
35

4-
## Getting Started
5-
To build the place from scratch, use:
6-
7-
```bash
8-
rojo build -o "ByteNet.rbxlx"
9-
```
10-
11-
Next, open `ByteNet.rbxlx` in Roblox Studio and start the Rojo server:
12-
13-
```bash
14-
rojo serve
15-
```
16-
17-
For more help, check out [the Rojo documentation](https://rojo.space/docs).
6+
description

aftman.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
21
[tools]
3-
rojo = "rojo-rbx/[email protected]"
2+
rojo = "rojo-rbx/[email protected]"
3+
wally = "UpliftGames/[email protected]"

dev.project.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@
1212
}
1313
},
1414
"shared": {
15-
"$path": "tests/shared"
15+
"$path": "dev/shared"
1616
}
1717
},
1818

1919
"ServerScriptService": {
2020
"server": {
21-
"$path": "tests/server"
21+
"$path": "dev/server"
2222
}
2323
},
2424

2525
"StarterPlayer": {
2626
"StarterPlayerScripts": {
27-
"$path": "tests/client"
27+
"$path": "dev/client"
2828
}
2929
}
3030
}

dev/client/clientTests.client.luau

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
local ReplicatedStorage = game:GetService("ReplicatedStorage")
2+
local RunService = game:GetService("RunService")
3+
4+
local testPackets = require(ReplicatedStorage.shared.testPackets)
5+
6+
testPackets.a:listen(function(data)
7+
print(data)
8+
end)
9+
10+
RunService.Heartbeat:Connect(function()
11+
for _ = 1, 200 do
12+
-- Roblox
13+
--[[ReplicatedStorage:WaitForChild("RemoteEvent"):FireServer({
14+
1,
15+
"test",
16+
} :: { any })]]
17+
18+
-- ByteNet
19+
testPackets.a:send({ first = "test", second = 1 })
20+
end
21+
end)

dev/server/serverTests.server.luau

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
local Players = game:GetService("Players")
2+
local ReplicatedStorage = game:GetService("ReplicatedStorage")
3+
4+
local testPackets = require(ReplicatedStorage.shared.testPackets)
5+
6+
local t = Instance.new("RemoteEvent")
7+
8+
t.Parent = ReplicatedStorage
9+
10+
t.OnServerEvent:Connect(function() end)
11+
12+
Players.PlayerAdded:Connect(function()
13+
--[[task.wait(1)
14+
testPackets.a:send({ first = "testB", second = math.random(1, 8) }, player)]]
15+
end)
16+
17+
testPackets.a:listen(function()
18+
--print(data)
19+
end)

dev/shared/testPackets.luau

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
local ReplicatedStorage = game:GetService("ReplicatedStorage")
2+
3+
local ByteNet = require(ReplicatedStorage.Packages.ByteNet)
4+
5+
return {
6+
a = ByteNet.createPacket("reliable", { first = ByteNet.dataTypes.string, second = ByteNet.dataTypes.uint8 }),
7+
}

docs/Installation.md

Whitespace-only changes.

docs/intro.md

Whitespace-only changes.

moonwave.toml

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
title = "ByteNet"
2+
gitRepoUrl = "https://github.com/ffrostflame/bridgenet2/"
3+
4+
changelog = true
5+
6+
[docusaurus]
7+
projectName = "ByteNet"
8+
tagline = "description"
9+
favicon = "favicon.png"
10+
11+
[navbar.logo]
12+
alt = "ByteNet"
13+
src = "logo.png"
14+
15+
[footer]
16+
style = "dark"
17+
18+
[home]
19+
enabled = true
20+
includeReadme = false
21+
22+
[[home.features]]
23+
title = "Cuts out Roblox overhead"
24+
description = ""
25+
26+
[[home.features]]
27+
title = "Low-level"
28+
description = ""
29+
30+
[[home.features]]
31+
title = "Enables you to maximize performance"
32+
description = ""
33+
34+
[[home.features]]
35+
title = "Strictly typed"
36+
description = ""
37+
38+
[[home.features]]
39+
title = "Typed API"
40+
description = ""
41+
42+
[[home.features]]
43+
title = "Simple"
44+
description = ""

sourcemap.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"name":"bytenet-dev","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"LuauSignal","className":"ModuleScript","filePaths":["Packages\\LuauSignal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"[email protected]","className":"Folder","children":[{"name":"luausignal","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\luausignal\\src\\init.luau","Packages\\_Index\\[email protected]\\luausignal\\default.project.json"],"children":[{"name":"typings","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\luausignal\\src\\typings.luau"]}]}]},{"name":"[email protected]","className":"Folder","children":[{"name":"wally-instance-manager","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\wally-instance-manager\\src\\init.luau","Packages\\_Index\\[email protected]\\wally-instance-manager\\default.project.json"]}]}]},{"name":"wallyInstanceManager","className":"ModuleScript","filePaths":["Packages\\wallyInstanceManager.lua"]},{"name":"ByteNet","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"packets","className":"Folder","children":[{"name":"getUnique","className":"ModuleScript","filePaths":["src\\packets\\getUnique.luau"]},{"name":"identifiers","className":"Folder","children":[{"name":"clientPacketIDs","className":"ModuleScript","filePaths":["src\\packets\\identifiers\\clientPacketIDs.luau"]},{"name":"serverPacketIDs","className":"ModuleScript","filePaths":["src\\packets\\identifiers\\serverPacketIDs.luau"]}]},{"name":"packet","className":"ModuleScript","filePaths":["src\\packets\\packet.luau"]}]},{"name":"process","className":"Folder","children":[{"name":"byteNetInstance","className":"ModuleScript","filePaths":["src\\process\\byteNetInstance.luau"]},{"name":"channel","className":"ModuleScript","filePaths":["src\\process\\channel.luau"]},{"name":"client","className":"Folder","children":[{"name":"clientProcess","className":"ModuleScript","filePaths":["src\\process\\client\\clientProcess.luau"]}]},{"name":"mergeBufferArray","className":"ModuleScript","filePaths":["src\\process\\mergeBufferArray.luau"]},{"name":"parsing","className":"Folder","children":[{"name":"receive","className":"ModuleScript","filePaths":["src\\process\\parsing\\receive.luau"]}]},{"name":"retrievePacketFromID","className":"ModuleScript","filePaths":["src\\process\\retrievePacketFromID.luau"]},{"name":"server","className":"Folder","children":[{"name":"serverProcess","className":"ModuleScript","filePaths":["src\\process\\server\\serverProcess.luau"]}]}]},{"name":"storage","className":"Folder","children":[{"name":"dataTypes","className":"Folder","children":[{"name":"dataTypeList","className":"ModuleScript","filePaths":["src\\storage\\dataTypes\\dataTypeList.luau"]}]},{"name":"reliabilityTypes","className":"Folder","children":[{"name":"reliabilityTypeList","className":"ModuleScript","filePaths":["src\\storage\\reliabilityTypes\\reliabilityTypeList.luau"]}]}]}]}]},{"name":"shared","className":"Folder","children":[{"name":"testPackets","className":"ModuleScript","filePaths":["tests/shared\\testPackets.luau"]}]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"server","className":"Folder","children":[{"name":"serverTests","className":"Script","filePaths":["tests/server\\serverTests.server.luau"]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"clientTests","className":"LocalScript","filePaths":["tests/client\\clientTests.client.luau"]}]}]}]}
1+
{"name":"bytenet-dev","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"BoatTEST","className":"ModuleScript","filePaths":["Packages\\BoatTEST.lua"]},{"name":"LuauSignal","className":"ModuleScript","filePaths":["Packages\\LuauSignal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"[email protected]","className":"Folder","children":[{"name":"boattest","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\boattest\\src\\init.lua","Packages\\_Index\\[email protected]\\boattest\\default.project.json"],"children":[{"name":"output","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\boattest\\src\\output.lua"]},{"name":"run","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\boattest\\src\\run.lua"]},{"name":"this","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\boattest\\src\\this.lua"]}]}]},{"name":"[email protected]","className":"Folder","children":[{"name":"luausignal","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\luausignal\\src\\init.luau","Packages\\_Index\\[email protected]\\luausignal\\default.project.json"],"children":[{"name":"typings","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\luausignal\\src\\typings.luau"]}]}]},{"name":"[email protected]","className":"Folder","children":[{"name":"wally-instance-manager","className":"ModuleScript","filePaths":["Packages\\_Index\\[email protected]\\wally-instance-manager\\src\\init.luau","Packages\\_Index\\[email protected]\\wally-instance-manager\\default.project.json"]}]}]},{"name":"wallyInstanceManager","className":"ModuleScript","filePaths":["Packages\\wallyInstanceManager.lua"]},{"name":"ByteNet","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"packets","className":"Folder","children":[{"name":"getUnique","className":"ModuleScript","filePaths":["src\\packets\\getUnique.luau"]},{"name":"identifiers","className":"Folder","children":[{"name":"clientPacketIDs","className":"ModuleScript","filePaths":["src\\packets\\identifiers\\clientPacketIDs.luau"]},{"name":"serverPacketIDs","className":"ModuleScript","filePaths":["src\\packets\\identifiers\\serverPacketIDs.luau"]}]},{"name":"packet","className":"ModuleScript","filePaths":["src\\packets\\packet.luau"]}]},{"name":"process","className":"Folder","children":[{"name":"byteNetInstance","className":"ModuleScript","filePaths":["src\\process\\byteNetInstance.luau"]},{"name":"channel","className":"ModuleScript","filePaths":["src\\process\\channel.luau"]},{"name":"client","className":"Folder","children":[{"name":"clientProcess","className":"ModuleScript","filePaths":["src\\process\\client\\clientProcess.luau"]}]},{"name":"mergeBufferArray","className":"ModuleScript","filePaths":["src\\process\\mergeBufferArray.luau"]},{"name":"parsing","className":"Folder","children":[{"name":"receive","className":"ModuleScript","filePaths":["src\\process\\parsing\\receive.luau"]},{"name":"send","className":"ModuleScript","filePaths":["src\\process\\parsing\\send.luau"]}]},{"name":"retrievePacketFromID","className":"ModuleScript","filePaths":["src\\process\\retrievePacketFromID.luau"]},{"name":"server","className":"Folder","children":[{"name":"serverProcess","className":"ModuleScript","filePaths":["src\\process\\server\\serverProcess.luau"]}]}]},{"name":"storage","className":"Folder","children":[{"name":"dataTypeList","className":"ModuleScript","filePaths":["src\\storage\\dataTypeList.luau"]},{"name":"reliabilityTypeList","className":"ModuleScript","filePaths":["src\\storage\\reliabilityTypeList.luau"]}]},{"name":"types","className":"ModuleScript","filePaths":["src\\types.luau"]}]}]},{"name":"shared","className":"Folder","children":[{"name":"testPackets","className":"ModuleScript","filePaths":["dev/shared\\testPackets.luau"]}]}]},{"name":"ServerScriptService","className":"ServerScriptService","children":[{"name":"server","className":"Folder","children":[{"name":"serverTests","className":"Script","filePaths":["dev/server\\serverTests.server.luau"]}]}]},{"name":"StarterPlayer","className":"StarterPlayer","children":[{"name":"StarterPlayerScripts","className":"StarterPlayerScripts","children":[{"name":"clientTests","className":"LocalScript","filePaths":["dev/client\\clientTests.client.luau"]}]}]}]}

src/init.luau

+10-5
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ local RunService = game:GetService("RunService")
22

33
local clientPacketIDs = require(script.packets.identifiers.clientPacketIDs)
44
local serverPacketIDs = require(script.packets.identifiers.serverPacketIDs)
5-
local mergeBufferArray = require(script.process.mergeBufferArray)
65
local clientProcess = require(script.process.client.clientProcess)
76
local serverProcess = require(script.process.server.serverProcess)
7+
local types = require(script.types)
88

99
if RunService:IsServer() then
1010
serverProcess.start()
@@ -14,8 +14,13 @@ else
1414
clientPacketIDs.start()
1515
end
1616

17-
return {
18-
createPacket = require(script.packets.packet),
17+
return (
18+
table.freeze({
19+
createPacket = require(script.packets.packet),
1920

20-
mergeBufferArray = mergeBufferArray,
21-
}
21+
dataTypes = {
22+
string = "string",
23+
uint8 = "uint8",
24+
},
25+
}) :: any
26+
) :: types.ByteNet

src/packets/packet.luau

+11-16
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@ local RunService = game:GetService("RunService")
33
local clientPacketIDs = require(script.Parent.Parent.packets.identifiers.clientPacketIDs)
44
local serverPacketIDs = require(script.Parent.Parent.packets.identifiers.serverPacketIDs)
55
local clientProcess = require(script.Parent.Parent.process.client.clientProcess)
6+
local send = require(script.Parent.Parent.process.parsing.send)
67
local serverProcess = require(script.Parent.Parent.process.server.serverProcess)
7-
local reliabilityTypeList = require(script.Parent.Parent.storage.reliabilityTypes.reliabilityTypeList)
8+
local reliabilityTypeList = require(script.Parent.Parent.storage.reliabilityTypeList)
89
local getUnique = require(script.Parent.getUnique)
910

1011
local packetPrototype = {}
1112
local packetMetatable = { __index = packetPrototype }
1213
export type packetType = typeof(setmetatable(
1314
{} :: {
1415
_id: number,
15-
--_unique: string,
16+
_order: { [number]: { string } },
1617
_reliabilityType: reliabilityTypeList.reliabilityType,
1718

18-
--_size: number,
19+
_listeners: { [number]: (data: {}, player: Player) -> () },
1920
},
2021
packetMetatable
2122
))
2223

23-
function packetPrototype.sendToAll(self: packetType, _)
24-
local packetBuffer = buffer.create(1) -- convertToBytes(self._sortedStructure, data, self._id, self._size)
24+
function packetPrototype.sendToAll(self: packetType, data)
25+
local packetBuffer = send(self._id, data, self._order)
2526

2627
serverProcess.sendEveryone(self._reliabilityType, packetBuffer)
2728
end
2829

29-
function packetPrototype.send(self: packetType, _, target: Player?)
30-
local packetBuffer = buffer.create(1) -- convertToBytes(self._sortedStructure, data, self._id, self._size)
30+
function packetPrototype.send(self: packetType, data: { [string]: any }, target: Player?)
31+
local packetBuffer = send(self._id, data, self._order)
3132

3233
if RunService:IsServer() then
3334
if target then
@@ -41,11 +42,7 @@ function packetPrototype.send(self: packetType, _, target: Player?)
4142
end
4243

4344
function packetPrototype.listen(self: packetType, callback: (data: {}, player: Player?) -> ())
44-
if RunService:IsServer() then
45-
serverProcess.listen(self._id, callback)
46-
else
47-
clientProcess.listen(self._id, callback)
48-
end
45+
table.insert(self._listeners, callback)
4946
end
5047

5148
return function(reliabilityType: reliabilityTypeList.reliabilityType, packetStructure: { [string]: any }): packetType
@@ -64,10 +61,6 @@ return function(reliabilityType: reliabilityTypeList.reliabilityType, packetStru
6461
-- structure stuff
6562
self._order = {}
6663
for key, value in packetStructure do
67-
local num = 0
68-
for i = 1, string.len(key) do
69-
num += string.byte(key, i, i)
70-
end
7164
table.insert(self._order, {
7265
key,
7366
value,
@@ -78,5 +71,7 @@ return function(reliabilityType: reliabilityTypeList.reliabilityType, packetStru
7871
return a[1] < b[1]
7972
end)
8073

74+
self._listeners = {}
75+
8176
return self
8277
end

src/process/client/clientProcess.luau

+7-37
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,17 @@
11
local ReplicatedStorage = game:GetService("ReplicatedStorage")
22
local RunService = game:GetService("RunService")
33

4-
local retrievePacketFromID = require(ReplicatedStorage.Packages.ByteNet.process.retrievePacketFromID)
54
local byteNetInstance = require(script.Parent.Parent.Parent.process.byteNetInstance)
65
local channel = require(script.Parent.Parent.Parent.process.channel)
7-
local reliabilityTypeList = require(script.Parent.Parent.Parent.storage.reliabilityTypes.reliabilityTypeList)
6+
local reliabilityTypeList = require(script.Parent.Parent.Parent.storage.reliabilityTypeList)
7+
local receive = require(script.Parent.Parent.parsing.receive)
88
local wallyInstanceManager = require(ReplicatedStorage.Packages.wallyInstanceManager)
99

1010
local reliableChannel = channel()
1111
local unreliableChannel = channel()
12-
local listeners = {}
1312

14-
local function processIncomingBuffer(receivedBuffer)
15-
local cursor = 0
16-
while cursor < buffer.len(receivedBuffer) do
17-
local packetID = buffer.readu8(receivedBuffer, cursor)
18-
19-
local packet = retrievePacketFromID(packetID)
20-
21-
local packetBuffer = buffer.create(packet._size)
22-
buffer.copy(packetBuffer, 0, receivedBuffer, cursor + 1, packet._size)
23-
24-
local structure = {} -- convertToStructure(packetBuffer, packet._sortedStructure)
25-
for _, callback in listeners[packetID] do
26-
callback(structure)
27-
end
28-
29-
cursor += packet._size + 1
30-
end
13+
local function onClientEvent(receivedBuffer)
14+
receive(receivedBuffer)
3115
end
3216

3317
local clientProcess = {}
@@ -40,21 +24,15 @@ function clientProcess.start()
4024
[reliabilityTypeList.unreliable] = wallyInstanceManager.waitForInstance(byteNetInstance, "unreliable", 3) :: UnreliableRemoteEvent,
4125
}
4226

43-
if not remoteInstances[reliabilityTypeList.reliable] then
44-
warn("ByteNet: Could not find reliable remote event")
45-
return
46-
end
47-
48-
if not remoteInstances[reliabilityTypeList.unreliable] then
49-
warn("ByteNet: Could not find unreliable remote event")
27+
if not remoteInstances[reliabilityTypeList.reliable] or not remoteInstances[reliabilityTypeList.unreliable] then
5028
return
5129
end
5230

5331
local reliable: RemoteEvent = remoteInstances[reliabilityTypeList.reliable] :: RemoteEvent
5432
local unreliable: UnreliableRemoteEvent = remoteInstances[reliabilityTypeList.unreliable] :: UnreliableRemoteEvent
5533

56-
reliable.OnClientEvent:Connect(processIncomingBuffer)
57-
unreliable.OnClientEvent:Connect(processIncomingBuffer)
34+
reliable.OnClientEvent:Connect(onClientEvent)
35+
unreliable.OnClientEvent:Connect(onClientEvent)
5836

5937
RunService.Heartbeat:Connect(function()
6038
local reliableQueue = reliableChannel:flush()
@@ -70,14 +48,6 @@ function clientProcess.start()
7048
end)
7149
end
7250

73-
function clientProcess.listen(packetID: number, callback: (data: {}) -> ())
74-
if not listeners[packetID] then
75-
listeners[packetID] = {}
76-
end
77-
78-
table.insert(listeners[packetID], callback)
79-
end
80-
8151
function clientProcess.send(reliabilityType: reliabilityTypeList.reliabilityType, packetBuffer: buffer)
8252
if reliabilityType == reliabilityTypeList.reliable then
8353
reliableChannel:add(packetBuffer)

0 commit comments

Comments
 (0)