UNPKG

diffusion

Version:

Diffusion JavaScript client

99 lines (75 loc) 3 kB
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); } } };