UNPKG

hazelcast-client

Version:

Hazelcast - open source In-Memory Data Grid - client for NodeJS

197 lines 9.65 kB
"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