diffusion
Version:
Diffusion JavaScript client
50 lines (39 loc) • 1.37 kB
JavaScript
var AbstractDataType = require('data/abstract-datatype');
var BytesImpl = require('data/bytes-impl');
var JSONImpl = require('data/json/json-impl');
var Encoder = require('cbor/encoder');
var Decoder = require('cbor/decoder');
var encoder = new Encoder();
var NULL_CBOR = new BytesImpl(new Buffer([0xf6]));
module.exports = function(name, valueClass, serialise, withBinaryDelta, cborTypePredicate) {
function vToC(value) {
serialise(value, encoder);
return new BytesImpl(encoder.flush());
}
function cToV(bytes) {
if (NULL_CBOR.equals(bytes)) {
return null;
}
var decoder = new Decoder(bytes.$buffer, bytes.$offset, bytes.$length);
return decoder.nextValueExpecting(cborTypePredicate);
}
AbstractDataType.call(this, name, valueClass, BytesImpl, vToC, cToV, [JSONImpl], withBinaryDelta);
this.writeValue = function(value) {
if (value === null || value === undefined) {
return NULL_CBOR.asBuffer();
} else {
serialise(value, encoder);
return encoder.flush();
}
};
this.validate = function() {
// No-op. This data type validates on read.
};
this.from = function(value) {
if (value.$buffer) {
return value;
} else {
return vToC(value);
}
};
};