diff --git a/Warp.rbxm b/Warp.rbxm index d9a10c2..8acdfa8 100644 Binary files a/Warp.rbxm and b/Warp.rbxm differ diff --git a/default.project.json b/default.project.json index e585132..8ffe85b 100644 --- a/default.project.json +++ b/default.project.json @@ -1,6 +1,12 @@ { "name": "Warp", "tree": { - "$path": "src" + "$className": "DataModel", + "ReplicatedStorage": { + "$className": "ReplicatedStorage", + "Warp": { + "$path": "src" + } + } } } \ No newline at end of file diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index e99b142..96aaa7f 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -39,6 +39,7 @@ function side() { text: 'Utilities', items: [ { text: 'Signal', link: '/api/1.0/signal' }, + { text: 'Buffer', link: '/api/1.0/buffer' }, ] }, ] diff --git a/docs/api/1.0/buffer.md b/docs/api/1.0/buffer.md new file mode 100644 index 0000000..4b5f49a --- /dev/null +++ b/docs/api/1.0/buffer.md @@ -0,0 +1,3 @@ +# Buffer + +A Additional buffer. \ No newline at end of file diff --git a/docs/api/1.0/client.md b/docs/api/1.0/client.md index 4d1e83d..8ea0e9f 100644 --- a/docs/api/1.0/client.md +++ b/docs/api/1.0/client.md @@ -87,7 +87,7 @@ Disconnect the event connection. ```lua [Variable] ( key: string -) +): boolean ``` ```lua [Example] @@ -128,7 +128,7 @@ This function have rate limiting it self and configured from server. ## `:Invoke` -Semiliar to `:InvokeServer`, its for Invoke to a server. +Semiliar to `:InvokeServer`, but it have timeout system that not exists on `RemoteFunction.InvokeServer`. ::: code-group ```lua [Variable] @@ -139,7 +139,7 @@ Semiliar to `:InvokeServer`, its for Invoke to a server. ``` ```lua [Example] -local Request = Remote:Invoke(2, "Hello World!") +local Request = Remote:Invoke(2, "Hello World!") -- this yield until it response ``` ::: @@ -152,7 +152,7 @@ This function is yielded, once it timeout it will return nil. Wait the event being triggered. ```lua -Remote:Wait() +Remote:Wait() -- :Wait return number value ``` ::: warning @@ -161,7 +161,7 @@ This function is yielded, Invoke might also ping this one and also causing error ## `:Destroy` -Disconnect all connection of event and remove the event from Warp +Disconnect all connection of event and remove the event from Warp list ```lua Remote:Destroy() diff --git a/docs/api/1.0/server.md b/docs/api/1.0/server.md index 614d422..430ea1e 100644 --- a/docs/api/1.0/server.md +++ b/docs/api/1.0/server.md @@ -97,7 +97,7 @@ Disconnect the event connection. ```lua [Variable] ( key: string -) +): boolean ``` ```lua [Example] @@ -170,7 +170,7 @@ Remote:FireExcept(true, { Players.Eternity_Devs, Players.Player2 }, "Hello World ## `:Invoke` -Semiliar to `:InvokeClient`, its for Invoke to a client. +Semiliar to `:InvokeClient`, but it have timeout system that not exists on `RemoteFunction.InvokeClient`. ::: code-group ```lua [Variable] @@ -195,7 +195,7 @@ This function is yielded, once it timeout it will return nil. Wait the event being triggered. ```lua -Remote:Wait() +Remote:Wait() -- :Wait return number value ``` ::: warning diff --git a/src/Index/Client/Index.luau b/src/Index/Client/Index.luau index 0ee1b52..a5c3f7e 100644 --- a/src/Index/Client/Index.luau +++ b/src/Index/Client/Index.luau @@ -16,7 +16,7 @@ local Buffer = require(Util.Buffer) function Client.new(Identifier: string) local self = setmetatable({}, Client) self._buffer = Buffer.new() - self._buffer:writeu8(Serdes(Identifier)) + self._buffer:wu8(Serdes(Identifier)) self.id = Buffer.convert(self._buffer:build()) self.fn = {} self.IsConnected = false diff --git a/src/Index/Server/Index.luau b/src/Index/Server/Index.luau index 8945377..48785a0 100644 --- a/src/Index/Server/Index.luau +++ b/src/Index/Server/Index.luau @@ -17,7 +17,7 @@ local Buffer = require(Util.Buffer) function Server.new(Identifier: string, rateLimit: Type.rateLimitArg?) local self = setmetatable({}, Server) self._buffer = Buffer.new() - self._buffer:writeu8(Serdes(Identifier)) + self._buffer:wu8(Serdes(Identifier)) self.id = Buffer.convert(self._buffer:build()) self.fn = {} self.IsConnected = false diff --git a/src/Index/Util/Buffer/Dedicated.luau b/src/Index/Util/Buffer/Dedicated.luau index b81b4ec..377eb5a 100644 --- a/src/Index/Util/Buffer/Dedicated.luau +++ b/src/Index/Util/Buffer/Dedicated.luau @@ -6,12 +6,21 @@ DedicatedBuffer.__index = DedicatedBuffer local create = buffer.create local copy = buffer.copy +local writei8 = buffer.writei8 +local writei16 = buffer.writei16 +local writei32 = buffer.writei32 local writeu8 = buffer.writeu8 -local tostring = buffer.tostring +local writeu16 = buffer.writeu16 +local writeu32 = buffer.writeu32 +local writef32 = buffer.writef32 +local writef64 = buffer.writef64 +local writestring = buffer.writestring local default = { point = 0, - size = 256, + next = 0, + size = 128, + bufferSize = 128, } function DedicatedBuffer.alloc(self: any, byte: number) @@ -23,9 +32,13 @@ function DedicatedBuffer.alloc(self: any, byte: number) end local newBuffer: buffer = create(size) + DedicatedBuffer.copy(self, 0, newBuffer) copy(newBuffer, 0, b) b = newBuffer + + self.point = self.next + self.next += byte end function DedicatedBuffer.build(self: any): buffer @@ -36,23 +49,64 @@ function DedicatedBuffer.build(self: any): buffer return build end -function DedicatedBuffer.writeu8(self: any, val: number) +function DedicatedBuffer.wi8(self: any, val: number) + DedicatedBuffer.alloc(self, 1) + writei8(self.buffer, self.point, val) +end + +function DedicatedBuffer.wi16(self: any, val: number) + DedicatedBuffer.alloc(self, 2) + writei16(self.buffer, self.point, val) +end + +function DedicatedBuffer.wi32(self: any, val: number) + DedicatedBuffer.alloc(self, 4) + writei32(self.buffer, self.point, val) +end + +function DedicatedBuffer.wu8(self: any, val: number) DedicatedBuffer.alloc(self, 1) writeu8(self.buffer, self.point, val) - self.point += 1 +end + +function DedicatedBuffer.wu16(self: any, val: number) + DedicatedBuffer.alloc(self, 2) + writeu16(self.buffer, self.point, val) +end + +function DedicatedBuffer.wu32(self: any, val: number) + DedicatedBuffer.alloc(self, 4) + writeu32(self.buffer, self.point, val) +end + +function DedicatedBuffer.wf32(self: any, val: number) + DedicatedBuffer.alloc(self, 4) + writef32(self.buffer, self.point, val) +end + +function DedicatedBuffer.wf64(self: any, val: number) + DedicatedBuffer.alloc(self, 8) + writef64(self.buffer, self.point, val) +end + +function DedicatedBuffer.wstring(self: any, val: string) + DedicatedBuffer.alloc(self, #val) + writestring(self.buffer, self.point, val) end function DedicatedBuffer.flush(self: any) self.point = default.point + self.next = default.next self.size = default.size - self.buffer = create(256) + self.buffer = create(default.bufferSize) end function DedicatedBuffer.new() return setmetatable({ point = default.point, + next = default.next, size = default.size, - buffer = create(256) + buffer = create(default.bufferSize) }, DedicatedBuffer) end diff --git a/src/Index/init.luau b/src/Index/init.luau index c8319ed..35ced65 100644 --- a/src/Index/init.luau +++ b/src/Index/init.luau @@ -12,6 +12,7 @@ local Client = script.Client local Type = require(script.Type) local Assert = require(Util.Assert) local Signal = require(script.Signal) +local Buffer = require(Util.Buffer) if IsServer then require(Server.ServerProcess).start() @@ -64,7 +65,11 @@ function Index.fromSignalArray(arrays: { any }) for _, identifier: string in arrays do copy[identifier] = Index.Signal(identifier) end - return copy :: typeof(copy) + return table.freeze(copy) :: typeof(copy) +end + +function Index.buffer() + return Buffer.new() end return table.freeze(Index) :: typeof(Index) \ No newline at end of file diff --git a/src/init.luau b/src/init.luau index 231f605..fbaec6f 100644 --- a/src/init.luau +++ b/src/init.luau @@ -13,4 +13,6 @@ return { Signal = Index.Signal, fromSignalArray = Index.fromSignalArray, + + buffer = Index.buffer, } \ No newline at end of file