diffusion
Version:
Diffusion JavaScript client
65 lines (53 loc) • 2.02 kB
JavaScript
var BufferInputStream = require('io/buffer-input-stream');
var BEES = require('serialisers/byte-encoded-enum-serialiser');
var SessionId = require('session/session-id');
var SessionTokenDeserialiser = require('session/session-token-deserialiser');
var ResponseCode = require('protocol/response-code');
var consts = require('protocol/consts');
/*
* Deserialise connection responses according to the V5 protocol.
*/
function deserialise(buffer) {
var input = new BufferInputStream(buffer);
var protocol = input.read();
if (protocol !== consts.PROTOCOL_BYTE) {
throw new Error('Unrecognised protocol byte: ' + protocol);
}
var version = input.read();
if (version < consts.CURRENT_VERSION) {
throw new Error('Unrecognised protocol version: ' + version);
} else if (version > consts.CURRENT_VERSION) {
throw new Error('Unsupported protocol version: ' + version);
}
var responseCode = BEES.read(input, ResponseCode);
if (ResponseCode.isSuccess(responseCode)) {
// For some reason we serialise session ids as unsigned longs here
var sessionID = new SessionId(input.readUInt64(), input.readUInt64());
var sessionToken = SessionTokenDeserialiser(input);
var systemPingPeriod = input.readInt64();
var recoverySequence = 0;
if (responseCode === ResponseCode.RECONNECTED) {
recoverySequence = input.readInt32();
}
return {
response : responseCode,
identity : sessionID,
token : sessionToken,
systemPingPeriod : systemPingPeriod,
version : version,
success : true,
sequence : recoverySequence
};
} else {
return {
response : responseCode,
version : version,
identity : null,
token : null,
systemPingPeriod : null,
success : false,
sequence : 0
};
}
}
module.exports = deserialise;