hazelcast-client
Version:
Hazelcast - open source In-Memory Data Grid - client for NodeJS
197 lines • 9.65 kB
JavaScript
"use strict";
var HeapData_1 = require('./HeapData');
var ObjectData_1 = require('./ObjectData');
var DefaultSerializer_1 = require('./DefaultSerializer');
var Util = require('../Util');
var PortableSerializer_1 = require('./portable/PortableSerializer');
var SerializationServiceV1 = (function () {
function SerializationServiceV1(serializationConfig) {
this.serialiationConfig = serializationConfig;
this.registry = {};
this.serializerNameToId = {};
this.registerDefaultSerializers();
this.registerCustomSerializers(serializationConfig.customSerializers);
this.registerGlobalSerializer(serializationConfig.globalSerializer);
}
SerializationServiceV1.prototype.toData = function (object, partitioningStrategy) {
if (partitioningStrategy === void 0) { partitioningStrategy = this.defaultPartitionStrategy; }
var dataOutput = new ObjectData_1.PositionalObjectDataOutput(1, this, this.serialiationConfig.isBigEndian);
var serializer = this.findSerializerFor(object);
dataOutput.writeIntBE(this.calculatePartitionHash(object, partitioningStrategy));
dataOutput.writeIntBE(serializer.getId());
serializer.write(dataOutput, object);
return new HeapData_1.HeapData(dataOutput.toBuffer());
};
SerializationServiceV1.prototype.toObject = function (data) {
var serializer = this.findSerializerById(data.getType());
var dataInput = new ObjectData_1.ObjectDataInput(data.toBuffer(), HeapData_1.DATA_OFFSET, this, this.serialiationConfig.isBigEndian);
return serializer.read(dataInput);
};
SerializationServiceV1.prototype.writeObject = function (out, object) {
var serializer = this.findSerializerFor(object);
out.writeInt(serializer.getId());
serializer.write(out, object);
};
SerializationServiceV1.prototype.readObject = function (inp) {
var serializerId = inp.readInt();
var serializer = this.findSerializerById(serializerId);
return serializer.read(inp);
};
SerializationServiceV1.prototype.registerSerializer = function (name, serializer) {
if (this.serializerNameToId[name]) {
throw new RangeError('Given serializer name is already in the registry.');
}
if (this.registry[serializer.getId()]) {
throw new RangeError('Given serializer id is already in the registry.');
}
this.serializerNameToId[name] = serializer.getId();
this.registry[serializer.getId()] = serializer;
};
SerializationServiceV1.prototype.findSerializerFor = function (obj) {
if (obj === undefined) {
throw new RangeError('undefined cannot be serialized.');
}
var serializer = null;
if (obj === null) {
serializer = this.findSerializerByName('null', false);
}
if (serializer === null) {
serializer = this.lookupDefaultSerializer(obj);
}
if (serializer === null) {
serializer = this.lookupCustomSerializer(obj);
}
if (serializer === null) {
serializer = this.lookupGlobalSerializer();
}
if (serializer === null) {
serializer = this.findSerializerByName('!json', false);
}
if (serializer === null) {
throw new RangeError('There is no suitable serializer for ' + obj + '.');
}
return serializer;
};
SerializationServiceV1.prototype.defaultPartitionStrategy = function (obj) {
if (obj == null || !obj['getPartitionHash']) {
return 0;
}
else {
return obj.getPartitionHash();
}
};
SerializationServiceV1.prototype.lookupDefaultSerializer = function (obj) {
var serializer = null;
if (this.isIdentifiedDataSerializable(obj)) {
return this.findSerializerByName('identified', false);
}
if (this.isPortableSerializable(obj)) {
return this.findSerializerByName('!portable', false);
}
var objectType = Util.getType(obj);
if (objectType === 'array') {
if (obj.length === 0) {
serializer = this.findSerializerByName('number', true);
}
else {
serializer = this.findSerializerByName(Util.getType(obj[0]), true);
}
}
else {
serializer = this.findSerializerByName(objectType, false);
}
return serializer;
};
SerializationServiceV1.prototype.lookupCustomSerializer = function (obj) {
if (this.isCustomSerializable(obj)) {
return this.findSerializerById(obj.hzGetCustomId());
}
return null;
};
SerializationServiceV1.prototype.lookupGlobalSerializer = function () {
return this.findSerializerByName('!global', false);
};
SerializationServiceV1.prototype.isIdentifiedDataSerializable = function (obj) {
return (obj.readData && obj.writeData && obj.getClassId && obj.getFactoryId);
};
SerializationServiceV1.prototype.isPortableSerializable = function (obj) {
return (obj.readPortable && obj.writePortable && obj.getFactoryId && obj.getClassId);
};
SerializationServiceV1.prototype.registerDefaultSerializers = function () {
this.registerSerializer('string', new DefaultSerializer_1.StringSerializer());
this.registerSerializer('double', new DefaultSerializer_1.DoubleSerializer());
this.registerSerializer('boolean', new DefaultSerializer_1.BooleanSerializer());
this.registerSerializer('null', new DefaultSerializer_1.NullSerializer());
this.registerSerializer('short', new DefaultSerializer_1.ShortSerializer());
this.registerSerializer('integer', new DefaultSerializer_1.IntegerSerializer());
this.registerSerializer('long', new DefaultSerializer_1.LongSerializer());
this.registerSerializer('float', new DefaultSerializer_1.FloatSerializer());
this.registerSerializer('booleanArray', new DefaultSerializer_1.BooleanArraySerializer());
this.registerSerializer('shortArray', new DefaultSerializer_1.ShortArraySerializer());
this.registerSerializer('integerArray', new DefaultSerializer_1.IntegerArraySerializer());
this.registerSerializer('longArray', new DefaultSerializer_1.LongArraySerializer());
this.registerSerializer('doubleArray', new DefaultSerializer_1.DoubleArraySerializer());
this.registerSerializer('stringArray', new DefaultSerializer_1.StringArraySerializer());
this.registerSerializer('floatArray', new DefaultSerializer_1.FloatArraySerializer());
this.registerSerializer('identified', new DefaultSerializer_1.IdentifiedDataSerializableSerializer(this.serialiationConfig.dataSerializableFactories));
this.registerSerializer('!json', new DefaultSerializer_1.JsonSerializer());
this.registerSerializer('!portable', new PortableSerializer_1.PortableSerializer(this, this.serialiationConfig.portableFactories, this.serialiationConfig.portableVersion));
};
SerializationServiceV1.prototype.registerCustomSerializers = function (cutomSerializersArray) {
var self = this;
cutomSerializersArray.forEach(function (candidate) {
self.assertValidCustomSerializer(candidate);
self.registerSerializer('!custom' + candidate.getId(), candidate);
});
};
SerializationServiceV1.prototype.registerGlobalSerializer = function (candidate) {
if (candidate == null) {
return;
}
this.assertValidCustomSerializer(candidate);
this.registerSerializer('!global', candidate);
};
SerializationServiceV1.prototype.assertValidCustomSerializer = function (candidate) {
var fGetId = 'getId';
var fRead = 'read';
var fWrite = 'write';
if (typeof candidate[fGetId] !== 'function' ||
typeof candidate[fRead] !== 'function' ||
typeof candidate[fWrite] !== 'function') {
throw new TypeError('Custom serializer should have ' + fGetId + ', ' + fRead + ' and ' + fWrite + ' methods.');
}
var typeId = candidate[fGetId]();
if (!Number.isInteger(typeId) || typeId < 1) {
throw new TypeError('Custom serializer should have its typeId greater than or equal to 1.');
}
};
SerializationServiceV1.prototype.isCustomSerializable = function (object) {
var prop = 'hzGetCustomId';
return (object[prop] && typeof object[prop] === 'function' && object[prop]() >= 1);
};
SerializationServiceV1.prototype.findSerializerByName = function (name, isArray) {
var convertedName;
if (name === 'number') {
convertedName = this.serialiationConfig.defaultNumberType;
}
else {
convertedName = name;
}
var serializerName = convertedName + (isArray ? 'Array' : '');
var serializerId = this.serializerNameToId[serializerName];
if (serializerId == null) {
return null;
}
return this.findSerializerById(serializerId);
};
SerializationServiceV1.prototype.findSerializerById = function (id) {
var serializer = this.registry[id];
return serializer;
};
SerializationServiceV1.prototype.calculatePartitionHash = function (object, strategy) {
return strategy(object);
};
return SerializationServiceV1;
}());
exports.SerializationServiceV1 = SerializationServiceV1;
//# sourceMappingURL=SerializationService.js.map