Files
airplane-mode/addons/godot_colyseus/lib/decoder.gd

69 lines
1.5 KiB
GDScript3
Raw Normal View History

extends RefCounted
const MsgPack = preload("res://addons/godot_colyseus/lib/msgpack.gd")
var reader: StreamPeerBuffer
func _init(reader: StreamPeerBuffer):
reader.big_endian = false
self.reader = reader
func read_utf8() -> String:
var prefix = reader.get_u8()
var length = -1
if prefix < 0xc0:
length = prefix & 0x1f
elif prefix == 0xd9:
length = reader.get_u8()
elif prefix == 0xda:
length = reader.get_u16()
elif prefix == 0xdb:
length = reader.get_u32()
return reader.get_utf8_string(length)
func number():
var prefix = reader.get_u8()
if prefix < 0x80:
return prefix
elif prefix == 0xca:
return reader.get_float()
elif prefix == 0xcb:
return reader.get_double()
elif prefix == 0xcc:
return reader.get_u8()
elif prefix == 0xcd:
return reader.get_u16()
elif prefix == 0xce:
return reader.get_u32()
elif prefix == 0xcf:
return reader.get_u64()
elif prefix == 0xd0:
return reader.get_8()
elif prefix == 0xd1:
return reader.get_16()
elif prefix == 0xd2:
return reader.get_32()
elif prefix == 0xd3:
return reader.get_64()
elif prefix > 0xdf:
return (0xff - prefix + 1) * -1
func has_more() -> bool:
return reader.get_position() < reader.get_size()
func current_bit() -> int:
return reader.data_array[reader.get_position()]
func is_number() -> bool:
var prefix = current_bit()
return prefix < 0x80 || (prefix >= 0xca && prefix <= 0xd3)
func unpack():
var result = MsgPack.decode(reader)
if result.error == OK:
return result.result
return null