UNPKG

@barchart/common-node-js

Version:

Common classes, utilities, and functions for building Node.js servers

225 lines (183 loc) 8.76 kB
const assert = require('@barchart/common-js/lang/assert'); const Attribute = require('./../../schema/definitions/Attribute'), Component = require('./../../schema/definitions/Component'), ComponentType = require('./../../schema/definitions/ComponentType'), DataType = require('./../../schema/definitions/DataType'); const AttributeSerializer = require('./attributes/AttributeSerializer'), BinarySerializer = require('./attributes/BinarySerializer'), BooleanSerializer = require('./attributes/BooleanSerializer'), DaySerializer = require('./attributes/DaySerializer'), DecimalSerializer = require('./attributes/DecimalSerializer'), EnumSerializer = require('./attributes/EnumSerializer'), JsonSerializer = require('./attributes/JsonSerializer'), MapSerializer = require('./attributes/NestedSerializers').MapSerializer, ListSerializer = require('./attributes/NestedSerializers').ListSerializer, NumberSerializer = require('./attributes/NumberSerializer'), StringSerializer = require('./attributes/StringSerializer'), StringSetSerializer = require('./attributes/StringSetSerializer'), TimestampSerializer = require('./attributes/TimestampSerializer'); const CompressedAdHocSerializer = require('./attributes/CompressedAdHocSerializer'), CompressedBinarySerializer = require('./attributes/CompressedBinarySerializer'), CompressedJsonSerializer = require('./attributes/CompressedJsonSerializer'), CompressedStringSerializer = require('./attributes/CompressedStringSerializer'); const EncryptedAdHocSerializer = require('./attributes/EncryptedAdHocSerializer'), EncryptedJsonSerializer = require('./attributes/EncryptedJsonSerializer'), EncryptedStringSerializer = require('./attributes/EncryptedStringSerializer'); const ComponentSerializer = require('./components/ComponentSerializer'), MoneySerializer = require('./components/MoneySerializer'); module.exports = (() => { 'use strict'; /** * Utility for looking up {@link AttributeSerializer} and {@link ComponentSerializer} * instances. (no instance-level functionality exists -- static functions only). * * @public */ class Serializers { constructor() { } /** * Binds a {@link DataType} to an {@link AttributeSerializer}, allowing the underlying framework * to automatically handle the a custom attribute type. * * @public * @static * @param {DataType} dataType * @param {AttributeSerializer} serializer */ static registerAttributeSerializer(dataType, serializer) { assert.argumentIsRequired(dataType, 'dataType', DataType, 'DataType'); assert.argumentIsRequired(serializer, 'serializer', AttributeSerializer, 'AttributeSerializer'); if (attributeSerializers.has(dataType)) { throw new Error('An attribute serializer has already been registered for the data type (' + dataType.toString() + ')'); } attributeSerializers.set(dataType, serializer); } /** * Binds a {@link DataType} to an {@link AttributeSerializer} generated by a custom factory. * * @public * @static * @param {DataType} dataType * @param {Function} serializerFactory - A function which returns an {@link AttributeSerializer} */ static registerAttributeSerializerFactory(dataType, serializerFactory) { assert.argumentIsRequired(dataType, 'dataType', DataType, 'DataType'); assert.argumentIsRequired(serializerFactory, 'serializerFactory', Function); if (attributeSerializerFactories.has(dataType)) { throw new Error('An attribute serializer factory has already been registered for the data type (' + dataType.toString() + ')'); } attributeSerializerFactories.set(dataType, serializerFactory); } /** * Returns the appropriate {@link AttributeSerializer} given an {@link Attribute}. * * @public * @static * @param {Attribute} attribute * @returns {AttributeSerializer|null} */ static forAttribute(attribute) { assert.argumentIsRequired(attribute, 'attribute', Attribute, 'Attribute'); const dataType = attribute.dataType; let serializer = Serializers.forDataType(dataType); if (serializer === null && attributeSerializerFactories.has(dataType)) { const factory = attributeSerializerFactories.get(dataType); serializer = factory(attribute); } return serializer || null; } /** * Returns the appropriate {@link AttributeSerializer} given a {@link DataType}. * * @public * @static * @param {DataType} dataType * @returns {AttributeSerializer|null} */ static forDataType(dataType) { assert.argumentIsRequired(dataType, 'dataType', DataType, 'DataType'); const enumerationType = dataType.enumerationType; let returnRef; if (enumerationType) { if (!enumSerializers.has(enumerationType)) { enumSerializers.set(enumerationType, new EnumSerializer(enumerationType)); } returnRef = enumSerializers.get(enumerationType); } else if (attributeSerializers.has(dataType)) { returnRef = attributeSerializers.get(dataType); } else { returnRef = null; } return returnRef || null; } /** * Binds a {@link DataType} to a {@link ComponentSerializer}, allowing the underlying framework * to automatically handle the a custom attribute type. * * @public * @static * @param {ComponentType} componentType * @param {ComponentSerializer} serializer */ static registerComponentSerializer(componentType, serializer) { assert.argumentIsRequired(componentType, 'componentType', ComponentType, 'ComponentType'); assert.argumentIsRequired(serializer, 'serializer', ComponentSerializer, 'ComponentSerializer'); if (componentSerializers.has(componentType)) { throw new Error('A component serializer has already been registered for the component type (' + componentType.toString() + ')'); } componentSerializers.set(componentType, serializer); } /** * Returns the appropriate {@link ComponentSerializer} given a {@link Component}. * * @public * @static * @param {Component} component * @returns {ComponentSerializer|null} */ static forComponent(component) { assert.argumentIsRequired(component, 'component', Component, 'Component'); return Serializers.forComponentType(component.componentType); } /** * Returns the appropriate {@link ComponentSerializer} given a {@link ComponentType}. * * @public * @static * @param {ComponentType} componentType * @returns {ComponentSerializer|null} */ static forComponentType(componentType) { assert.argumentIsRequired(componentType, 'componentType', ComponentType, 'ComponentType'); return componentSerializers.get(componentType) || null; } toString() { return '[Serializers]'; } } const enumSerializers = new Map(); const attributeSerializers = new Map(); const componentSerializers = new Map(); Serializers.registerAttributeSerializer(DataType.BINARY, BinarySerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.BOOLEAN, BooleanSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.NUMBER, NumberSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.STRING, StringSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.LIST, ListSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.MAP, MapSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.STRING_SET, StringSetSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.JSON, JsonSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.DAY, DaySerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.DECIMAL, DecimalSerializer.INSTANCE); Serializers.registerAttributeSerializer(DataType.TIMESTAMP, TimestampSerializer.INSTANCE); Serializers.registerComponentSerializer(ComponentType.MONEY, MoneySerializer.INSTANCE); const attributeSerializerFactories = new Map(); Serializers.registerAttributeSerializerFactory(DataType.AD_HOC_COMPRESSED, (a) => new CompressedAdHocSerializer(a)); Serializers.registerAttributeSerializerFactory(DataType.BINARY_COMPRESSED, (a) => new CompressedBinarySerializer(a)); Serializers.registerAttributeSerializerFactory(DataType.STRING_COMPRESSED, (a) => new CompressedStringSerializer(a)); Serializers.registerAttributeSerializerFactory(DataType.JSON_COMPRESSED, (a) => new CompressedJsonSerializer(a)); Serializers.registerAttributeSerializerFactory(DataType.AD_HOC_ENCRYPTED, (a) => new EncryptedAdHocSerializer(a)); Serializers.registerAttributeSerializerFactory(DataType.STRING_ENCRYPTED, (a) => new EncryptedStringSerializer(a)); Serializers.registerAttributeSerializerFactory(DataType.JSON_ENCRYPTED, (a) => new EncryptedJsonSerializer(a)); return Serializers; })();