imqueue/pg-pubsub

View on GitHub
src/helpers.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
/*!
 * Copyright (c) 2018, imqueue.com <support@imqueue.com>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */
import { AnyJson, AnyLogger } from './types';
import { murmurHash64 } from 'murmurhash-native';

/**
 * Performs JSON.stringify on a given input taking into account
 * pretty flag.
 *
 * @access private
 * @param {AnyJson} input - serializable value
 * @param {boolean} [pretty] - serialized format output prettify flag
 * @return {string}
 */
function stringify(input: AnyJson, pretty?: boolean): string {
    return pretty
        ? JSON.stringify(input, null, 2)
        : JSON.stringify(input);
}

/**
 * Serializes given input object to JSON string. On error will return
 * serialized null value
 *
 * @param {AnyJson} input - serializable value
 * @param {AnyLogger} [logger] - logger to handle errors logging with
 * @param {boolean} [pretty] - serialized format output prettify flag
 * @return {string}
 */
export function pack(
    input: AnyJson,
    logger?: AnyLogger,
    pretty = false,
): string {
    if (typeof input === 'undefined') {
        return 'null';
    }

    try {
        return stringify(input, pretty);
    } catch (err) {
        if (logger && logger.warn) {
            logger.warn('pack() error:', err);
        }

        return 'null';
    }
}

/**
 * Deserializes given input JSON string to corresponding JSON value object.
 * On error will return empty object
 *
 * @param {string} input - string to deserialize
 * @param {AnyLogger} [logger] - logger to handle errors logging with
 * @return {AnyJson}
 */
export function unpack(input?: string, logger?: AnyLogger): AnyJson {
    if (typeof input !== 'string') {
        return null;
    }

    try {
        return JSON.parse(input);
    } catch (err) {
        if (logger && logger.warn) {
            logger.warn('unpack() error:', err);
        }

        return {};
    }
}

/**
 * Constructs and returns hash string for a given set of processId, channel
 * and payload.
 *
 * @param {string} processId
 * @param {string} channel
 * @param {any} payload
 * @returns {string}
 */
export function signature(
    processId: number,
    channel: string,
    payload: any,
): string {
    return murmurHash64(JSON.stringify([processId, channel, payload]));
}