lance
lance copied to clipboard
Bug in ClientEngine - handleInboundMessage/Serializer.deserialize
trafficstars
There is a bug in method handleInboundMessage in ClientEngine.
/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/serialize/Serializer.js:98 Uncaught TypeError: First argument to DataView constructor must be an ArrayBuffer
at new DataView (<anonymous>)
at Serializer.deserialize (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/serialize/Serializer.js:98)
at NetworkTransmitter.deserializePayload (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/network/NetworkTransmitter.js:111)
at Client.handleInboundMessage (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/ClientEngine.js:448)
at Client.handleInboundMessage (Client.js:170)
at Client.step (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/ClientEngine.js:339)
at Renderer.runClientStep (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/render/Renderer.js:144)
at Renderer.draw (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/render/Renderer.js:99)
at Renderer.draw (Renderer.js:27)
at renderLoop (/media/maxli/Data/dev/OpenArcanum/node_modules/lance-gg/es5/ClientEngine.js:220)
The DataView expects a ArrayBuffer, but plain Buffer is passed in constructor. The workaround is to override handleInboundMessage in ClientEngine and convert the buffer to ArrayBuffer :
handleInboundMessage(syncData) {
let buffer = Uint8Array.from(syncData.dataBuffer)
syncData.dataBuffer = buffer.buffer
super.handleInboundMessage(syncData)
}
This works. However is quite inefficient IMHO. Any chance to fix this any soon? Running in Electron 3.X.
From the code, it seems that the server sends an ArrayBuffer. See https://github.com/lance-gg/lance/blob/f38918d332eb5ddad691e4b30b20728f25e967d9/src/serialize/Serializable.js#L54
Maybe socket.io changed the data type, or this is an electron issue?