Source: common/storage/constants.js

/*globals define*/
/*eslint-env node, browser*/
/**
 * @author pmeijer / https://github.com/pmeijer
 * @module Storage
 */

/**
 * @typedef {string} CommitHash - Unique SHA-1 hash for commit object.
 * @example
 * '#5496cf226542fcceccf89056f0d27564abc88c99'
 */

/**
 * @typedef {object} CommitResult
 * @prop {module:Storage~CommitHash} hash - The commitHash for the commit.
 * @prop {string} status - 'SYNCED', 'FORKED', 'CANCELED', undefined
 *
 * @example
 * {
 *   status: 'SYNCED',
 *   hash: '#someHash'
 * }
 * @example
 * {
 *   hash: '<hash from makeCommit with no branch provided>'
 * }
 */

/**
 * @typedef {object} CommitObject
 * @prop {module:Storage~CommitHash} _id - Hash of the commit object, a.k.a commitHash.
 * @prop {module:Core~ObjectHash} root - Hash of the associated root object, a.k.a. rootHash.
 * @prop {module:Storage~CommitHash[]} parents - Commits from where this commit evolved.
 * @prop {number} time - When the commit object was created Date.now().
 * @prop {string} message - Commit message.
 * @prop {string[]} updater - Commit message.
 * @prop {string} type - 'commit'
 *
 * @example
 * {
 *   _id: '#5496cf226542fcceccf89056f0d27564abc88c99',
 *   root: '#04009ecd1e68117cd3e9d39c87aadd9ed1ee5cb3',
 *   parents: ['#87d9fd309ec6a5d84776d7731ce1f1ab2790aac2']
 *   updater: ['guest'],
 *   time: 1430169614741,
 *   message: "createChildren({\"/1008889918/1998840078\":\"/1182870936/737997118/1736829087/1966323860\"})",
 *   type: 'commit'
 * }
 */

/**
 * @typedef {object} PatchObject
 * @prop {module:Core~ObjectHash} _id - Hash of the expected result object.
 * @prop {module:Core~ObjectHash} base - Hash of the base object where the patch should be applied.
 * @prop {string} type - 'patch'.
 * @prop {object} patch - The patch instructions (based on [RFC6902]{@link http://tools.ietf.org/html/rfc6902}).
 *
 * @example
 * {
 *   _id: '#5496cf226542fcceccf89056f0d27564abc88c99',
 *   base: '#04009ecd1e68117cd3e9d39c87aadd9ed1ee5cb3',
 *   type: 'patch',
 *   patch: [{op: 'add', path: '/atr/new', value: 'value'}]
 * }
 */
(function (factory) {
    if (typeof define === 'function' && define.amd) {
        define([], factory);
    } else if (typeof module === 'object' && module.exports) {
        module.exports = factory();
    }
}(function () {
    'use strict';

    return {
        //Version
        VERSION: '1.2.0',
        // Database related
        MONGO_ID: '_id',
        COMMIT_TYPE: 'commit',
        OVERLAY_SHARD_TYPE: 'shard',
        PROJECT_INFO_KEYS: [
            'createdAt',
            'creator',
            'viewedAt',
            'viewer',
            'modifiedAt',
            'modifier',
            'kind',
            'description',
            'icon'
        ],
        EMPTY_PROJECT_DATA: 'empty',
        PROJECT_ID_SEP: '+',
        PROJECT_DISPLAYED_NAME_SEP: '/',

        // Socket IO
        DATABASE_ROOM: 'database',
        ROOM_DIVIDER: '%',

        NETWORK_STATUS_CHANGED: 'NETWORK_STATUS_CHANGED',

        CONNECTED: 'CONNECTED',
        DISCONNECTED: 'DISCONNECTED',
        RECONNECTED: 'RECONNECTED',
        INCOMPATIBLE_CONNECTION: 'INCOMPATIBLE_CONNECTION',
        CONNECTION_ERROR: 'CONNECTION_ERROR',

        JWT_ABOUT_TO_EXPIRE: 'JWT_ABOUT_TO_EXPIRE',
        JWT_EXPIRED: 'JWT_EXPIRED',

        RECONNECTING: 'RECONNECTING', // Internal storage state where the websocket connection has been established,
        // but work is still be done to join branch and document rooms correctly.

        // Branch commit status - this is the status returned after setting the hash of a branch
        SYNCED: 'SYNCED', // The commitData was inserted in the database and the branchHash updated.
        FORKED: 'FORKED', // The commitData was inserted in the database, but the branchHash NOT updated.
        CANCELED: 'CANCELED', // The commitData was never inserted to the database.
        MERGED: 'MERGED', // The commit was initially forked, but successfully merged.

        BRANCH_STATUS: {
            SYNC: 'SYNC',
            AHEAD_SYNC: 'AHEAD_SYNC',
            AHEAD_NOT_SYNC: 'AHEAD_NOT_SYNC',
            PULLING: 'PULLING',
            MERGING: 'MERGING',
            ERROR: 'ERROR'
        },

        // Events

        PROJECT_DELETED: 'PROJECT_DELETED',
        PROJECT_CREATED: 'PROJECT_CREATED',

        BRANCH_DELETED: 'BRANCH_DELETED',
        BRANCH_CREATED: 'BRANCH_CREATED',
        BRANCH_HASH_UPDATED: 'BRANCH_HASH_UPDATED',
        TAG_DELETED: 'TAG_DELETED',
        TAG_CREATED: 'TAG_CREATED',
        COMMIT: 'COMMIT',

        BRANCH_UPDATED: 'BRANCH_UPDATED',

        BRANCH_JOINED: 'BRANCH_JOINED',
        BRANCH_LEFT: 'BRANCH_LEFT',

        NOTIFICATION: 'NOTIFICATION',

        DOCUMENT_OPERATION: 'DOCUMENT_OPERATION',
        DOCUMENT_SELECTION: 'DOCUMENT_SELECTION',
        // Types of notifications
        BRANCH_ROOM_SOCKETS: 'BRANCH_ROOM_SOCKETS',
        PLUGIN_NOTIFICATION: 'PLUGIN_NOTIFICATION',
        ADD_ON_NOTIFICATION: 'ADD_ON_NOTIFICATION',
        CLIENT_STATE_NOTIFICATION: 'CLIENT_STATE_NOTIFICATION',
        // Additional sub types for plugin notification
        PLUGIN_NOTIFICATION_TYPE: {
            INITIATED: 'INITIATED',
            ABORT: 'ABORT',
            MESSAGE: 'MESSAGE'
        },
        WEBSOCKET_ROUTER_ROOM_ID_PREFIX: 'wsr-room-',
        WEBSOCKET_ROUTER_MESSAGE_TYPES: {
            CONNECT: 'wsm-connect',
            DISCONNECT: 'wsm-disconnect',
            MESSAGE: 'wsm-message'
        }
    };
}));