diffusion
Version:
Diffusion JavaScript client
99 lines (75 loc) • 3 kB
JavaScript
var Codec = require('io/codec');
var BEES = require('serialisers/byte-encoded-enum-serialiser');
var TopicType = require('../../../topics/topics').TopicType;
var TopicPropertiesSerialiser = require('./topic-properties-serialiser');
var RecordTopicDetailsSerialiser = require('./record-topic-details-serialiser');
var RoutingTopicDetailsSerialiser = require('./routing-topic-details-serialiser');
var SlaveTopicDetailsSerialiser = require('./slave-topic-details-serialiser');
function getSubSerialiser(type) {
switch (type) {
case TopicType.RECORD :
return RecordTopicDetailsSerialiser;
case TopicType.ROUTING :
return RoutingTopicDetailsSerialiser;
case TopicType.SLAVE :
return SlaveTopicDetailsSerialiser;
}
return null;
}
/**
* Serialise topic details - in practical terms this accepts a metadata instance
* and writes necessary topic detail values around it.
*/
module.exports = {
read : function(input) {
var details = {};
if (Codec.readBoolean(input)) {
details.type = BEES.read(input, TopicType);
if (Codec.readBoolean(input) === false) {
return details;
}
details.schema = {};
if (Codec.readBoolean(input) === false) {
return details;
}
// auto subscribe (ignored)
Codec.readBoolean(input);
var tidyOnUnsubscribe = Codec.readBoolean(input);
var reference = Codec.readString(input);
var properties = TopicPropertiesSerialiser.read(input);
var serialiser = getSubSerialiser(details.type);
var attributes = {};
if (serialiser) {
attributes = serialiser.read(input);
}
attributes.tidyOnUnsubscribe = tidyOnUnsubscribe;
attributes.properties = properties;
attributes.reference = reference;
details.attributes = attributes;
}
return details;
},
write : function(output, details) {
if (details) {
Codec.writeBoolean(output, true);
BEES.write(output, details.type);
// Schema
Codec.writeBoolean(output, true);
// Have attributes, write flag
Codec.writeBoolean(output, true);
// Auto subscribe (redundant)
Codec.writeBoolean(output, true);
// General attributes
Codec.writeBoolean(output, details.attributes.tidyOnUnsubscribe);
Codec.writeString(output, details.attributes.reference);
TopicPropertiesSerialiser.write(output, details.attributes.properties);
var serialiser = getSubSerialiser(details.type);
if (serialiser) {
serialiser.write(output, details.attributes);
}
} else {
// No details
Codec.writeBoolean(output, false);
}
}
};