UNPKG

hazelcast-client

Version:

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

302 lines 14.7 kB
"use strict"; /* * Copyright (c) 2008-2018, Hazelcast, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); 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 DefaultPredicates = require("./DefaultPredicates"); var PredicateFactory_1 = require("./PredicateFactory"); var RawTopicMessage_1 = require("../proxy/topic/RawTopicMessage"); var ClusterDataFactoryHelper_1 = require("../ClusterDataFactoryHelper"); var ClusterDataFactory_1 = require("../ClusterDataFactory"); var AggregatorFactory_1 = require("../aggregation/AggregatorFactory"); var SerializationServiceV1 = /** @class */ (function () { function SerializationServiceV1(serializationConfig) { this.serializationConfig = serializationConfig; this.registry = {}; this.serializerNameToId = {}; this.registerDefaultSerializers(); this.registerCustomSerializers(); this.registerGlobalSerializer(); } SerializationServiceV1.prototype.isData = function (object) { if (object instanceof HeapData_1.HeapData) { return true; } else { return false; } }; SerializationServiceV1.prototype.toData = function (object, partitioningStrategy) { if (partitioningStrategy === void 0) { partitioningStrategy = this.defaultPartitionStrategy; } if (this.isData(object)) { return object; } var dataOutput = new ObjectData_1.PositionalObjectDataOutput(1, this, this.serializationConfig.isBigEndian); var serializer = this.findSerializerFor(object); //Check if object is partition aware if (object != null && object.getPartitionKey) { var partitionKey = object.getPartitionKey(); var serializedPartitionKey = this.toData(partitionKey); dataOutput.writeIntBE(this.calculatePartitionHash(serializedPartitionKey, partitioningStrategy)); } else { 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) { if (data == null) { return data; } if (!data.getType) { return data; } var serializer = this.findSerializerById(data.getType()); var dataInput = new ObjectData_1.ObjectDataInput(data.toBuffer(), HeapData_1.DATA_OFFSET, this, this.serializationConfig.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; }; /** * Serialization precedence * 1. NULL * 2. DataSerializable * 3. Portable * 4. Default Types * * Byte, Boolean, Character, Short, Integer, Long, Float, Double, String * * Array of [Byte, Boolean, Character, Short, Integer, Long, Float, Double, String] * * Java types [Date, BigInteger, BigDecimal, Class, Enum] * 5. Custom serializers * 6. Global Serializer * 7. Fallback (JSON) * @param obj * @returns */ 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) { /* tslint:disable:no-string-literal */ if (obj == null || !obj['getPartitionHash']) { /* tslint:enable:no-string-literal */ 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('byte', new DefaultSerializer_1.ByteSerializer()); 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('char', new DefaultSerializer_1.CharSerializer()); this.registerSerializer('date', new DefaultSerializer_1.DateSerializer()); this.registerSerializer('byteArray', new DefaultSerializer_1.ByteArraySerializer()); this.registerSerializer('charArray', new DefaultSerializer_1.CharArraySerializer()); 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('javaClass', new DefaultSerializer_1.JavaClassSerializer()); this.registerSerializer('floatArray', new DefaultSerializer_1.FloatArraySerializer()); this.registerIdentifiedFactories(); this.registerSerializer('!json', new DefaultSerializer_1.JsonSerializer()); this.registerSerializer('!portable', new PortableSerializer_1.PortableSerializer(this, this.serializationConfig)); }; SerializationServiceV1.prototype.registerIdentifiedFactories = function () { var factories = {}; for (var id in this.serializationConfig.dataSerializableFactories) { factories[id] = this.serializationConfig.dataSerializableFactories[id]; } var factoryConfigs = this.serializationConfig.dataSerializableFactoryConfigs; for (var id_1 in factoryConfigs) { var path = factoryConfigs[id_1].path; var exportedName = factoryConfigs[id_1].exportedName; var factoryConstructor = Util.loadNameFromPath(path, exportedName); factories[id_1] = new factoryConstructor(); } factories[PredicateFactory_1.PREDICATE_FACTORY_ID] = new PredicateFactory_1.PredicateFactory(DefaultPredicates); factories[RawTopicMessage_1.RELIABLE_TOPIC_MESSAGE_FACTORY_ID] = new RawTopicMessage_1.ReliableTopicMessageFactory(); factories[ClusterDataFactoryHelper_1.ClusterDataFactoryHelper.FACTORY_ID] = new ClusterDataFactory_1.ClusterDataFactory(); factories[AggregatorFactory_1.AggregatorFactory.FACTORY_ID] = new AggregatorFactory_1.AggregatorFactory(); this.registerSerializer('identified', new DefaultSerializer_1.IdentifiedDataSerializableSerializer(factories)); }; SerializationServiceV1.prototype.registerCustomSerializers = function () { var customSerializersArray = this.serializationConfig.customSerializers; var self = this; customSerializersArray.forEach(function (candidate) { self.assertValidCustomSerializer(candidate); self.registerSerializer('!custom' + candidate.getId(), candidate); }); var customSerializerConfigs = this.serializationConfig.customSerializerConfigs; for (var typeId in customSerializerConfigs) { var serializerConfig = customSerializerConfigs[typeId]; var customSerializer = new (Util.loadNameFromPath(serializerConfig.path, serializerConfig.exportedName))(); this.registerSerializer('!custom' + typeId, customSerializer); } }; SerializationServiceV1.prototype.registerGlobalSerializer = function () { var candidate = null; if (this.serializationConfig.globalSerializerConfig != null) { var exportedName = this.serializationConfig.globalSerializerConfig.exportedName; var path = this.serializationConfig.globalSerializerConfig.path; var serializerFactory = Util.loadNameFromPath(path, exportedName); candidate = new serializerFactory(); } if (candidate == null) { candidate = this.serializationConfig.globalSerializer; } 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.serializationConfig.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