--!strict --!optimize 2 --!native local Writer = {} Writer.__index = Writer local Types = require("../Types") function Writer.new(): Types.Writer local self = setmetatable({ _cursor = 0, _size = 0, _refcursor = 1, _references = {}, _data = buffer.create(0) }, Writer) return self end function Writer.Allocate(self: Types.Writer, bytes: number) local newsize = self._cursor+bytes if newsize < self._size then error("resizing buffer size is smaller than previous size") end local newdata = buffer.create(newsize) buffer.copy(newdata, 0, self._data) self._size = newsize self._data = newdata end function Writer.SetPacketID(self : Types.Writer, id: number) buffer.writeu8(self._data, self._cursor, id) self._cursor += 1 end function Writer.Dump(self: Types.Writer) return self._data, next(self._references) and self._references end function Writer.Append(self: Types.Writer, packet: Types.Event, props) local solver, packetid = packet._solver, packet._packetid self:Allocate(solver.length(props)+1) self:SetPacketID(packetid) solver.write(self, props) end function Writer.WriteRequest(self: Types.Writer, packet: Types.Function, props) local solver = packet._request self:Allocate(solver.length(props)+1) self:SetPacketID(packet._packetid) solver.write(self, props) local value, references = self:Dump() self:Clear() return value, references end function Writer.WriteResponse(self: Types.Writer, packet: Types.Function, props) local solver = packet._response self:Allocate(solver.length(props)+1) self:SetPacketID(packet._packetid) solver.write(self, props) local value, references = self:Dump() self:Clear() return value, references end function Writer.Clear(self: Types.Writer) self._cursor = 0 self._size = 0 self._refcursor = 1 self._references = {} self._data = buffer.create(0) end return Writer