Working on read support
This commit is contained in:
parent
b824f18df9
commit
cec28500b3
@ -88,21 +88,20 @@ function clientMt:sendString(text)
|
|||||||
if err then return nil, err end
|
if err then return nil, err end
|
||||||
end
|
end
|
||||||
|
|
||||||
function clientMt:handleError(result, err)
|
function clientMt:handleError(err, result)
|
||||||
if err then
|
if err then
|
||||||
print("Got error")
|
print("Got error")
|
||||||
if self.connection then
|
if self.connection then
|
||||||
self.connection:close()
|
self.connection:close()
|
||||||
end
|
end
|
||||||
self.connection = nil
|
self.connection = nil
|
||||||
else
|
|
||||||
assert(result, "Missing result")
|
|
||||||
end
|
end
|
||||||
return result, err
|
return result, err
|
||||||
end
|
end
|
||||||
|
|
||||||
function clientMt:sendPacket()
|
function clientMt:sendPacket()
|
||||||
return self:handleError(self:flush())
|
local result, err = self:flush()
|
||||||
|
return self:handleError(err, result)
|
||||||
end
|
end
|
||||||
|
|
||||||
function clientMt:connect()
|
function clientMt:connect()
|
||||||
@ -242,6 +241,16 @@ function clientMt:subscribe(args)
|
|||||||
return self:sendPacket()
|
return self:sendPacket()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function clientMt:fireEvent(event, ...)
|
||||||
|
if not self.eventHandlers then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if not self.eventHandlers[event] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
self.eventHandlers[event](...)
|
||||||
|
end
|
||||||
|
|
||||||
function clientMt:receiveBytes(count)
|
function clientMt:receiveBytes(count)
|
||||||
local result, err, partial = nil, nil, ""
|
local result, err, partial = nil, nil, ""
|
||||||
while true do
|
while true do
|
||||||
@ -260,14 +269,59 @@ function clientMt:receiveByte()
|
|||||||
return string.byte(self:receiveBytes(1)))
|
return string.byte(self:receiveBytes(1)))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function clientMt:receiveVarInt()
|
||||||
|
local multiplier = 1
|
||||||
|
local value = 0
|
||||||
|
local encodedByte
|
||||||
|
repeat
|
||||||
|
encodedByte, err = receiveByte()
|
||||||
|
if err then return nil, self:handleError(err) end
|
||||||
|
value = value + (encodedByte & 127) * multiplier
|
||||||
|
multiplier = multiplier * 128
|
||||||
|
if multiplier > 128*128*128 then
|
||||||
|
return nil, "malformed remaining length"
|
||||||
|
end
|
||||||
|
until (encodedByte & 128) ~= 0
|
||||||
|
return value
|
||||||
|
end
|
||||||
|
|
||||||
function clientMt:receivePacket()
|
function clientMt:receivePacket()
|
||||||
local firstByte, err = self:receiveByte()
|
local firstByte, err = self:receiveByte()
|
||||||
if err then return nil, self:handleError(err) end
|
if err then return self:handleError(err) end
|
||||||
|
|
||||||
|
local remainingLength, err = self:receiveVarInt()
|
||||||
|
if err then return self:handleError(err) end
|
||||||
|
|
||||||
|
local packetType = (firstByte >> 4) & 0xF
|
||||||
|
if packetType == 2 then
|
||||||
|
-- CONNACK
|
||||||
|
assert(remainingLength == 2, "Invalid CONNACK length")
|
||||||
|
local flags, err = self:receiveByte()
|
||||||
|
if err then return self:handleError(err) end
|
||||||
|
local returnCode, err = self:receiveByte()
|
||||||
|
if err then return self:handleError(err) end
|
||||||
|
|
||||||
|
print("Connected")
|
||||||
|
local sessionPresent = flags & 1
|
||||||
|
if not sessionPresent then
|
||||||
|
self:fireEvent("connect")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Unsupported or error
|
||||||
|
self:handleError("Invalid packet type " .. packetType)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function clientMt:threadReceive()
|
function clientMt:threadReceive()
|
||||||
while true do
|
while true do
|
||||||
self:receiveAndHandlePacket()
|
if self.connection then
|
||||||
|
local err = self:receiveAndHandlePacket()
|
||||||
|
if err then
|
||||||
|
self:handleError(err)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
coroutine.yield()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user