Source: events/nxmEvent.js

'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
/*
 * Nexmo Client SDK
 *  NXMEvent Object Model
 *
 * Copyright (c) Nexmo Inc.
*/
const WildEmitter = require('wildemitter');
const nexmoClientError_1 = require("../nexmoClientError");
/**
 * Conversation NXMEvent Object.
 * The super class that holds the base events that apply to
 * common event objects.
 * @class NXMEvent
 */
class NXMEvent {
    constructor(conversation, params) {
        var _a, _b, _c, _d;
        this.conversation = conversation;
        if (params) {
            for (const key in params) {
                switch (key) {
                    case 'type':
                        if (params.type.startsWith('custom:')) {
                            this.type = params.type.replace('custom:', '');
                        }
                        else {
                            this.type = params.type;
                        }
                        break;
                    case 'application_id':
                        this.application_id = params.application_id;
                        break;
                    case 'cid':
                        this.cid = params.cid;
                        break;
                    case 'from':
                        if (['member:invited', 'member:joined', 'member:left'].indexOf(params.type) > -1) {
                            if ((_b = (_a = params._embedded) === null || _a === void 0 ? void 0 : _a.from_member) === null || _b === void 0 ? void 0 : _b.id) {
                                this.from = (_d = (_c = params._embedded) === null || _c === void 0 ? void 0 : _c.from_member) === null || _d === void 0 ? void 0 : _d.id;
                            }
                        }
                        else {
                            this.from = params.from;
                        }
                        break;
                    case 'timestamp':
                        this.timestamp = params.timestamp;
                        break;
                    case 'id':
                        this.id = params.id;
                        break;
                    case 'state':
                        this.state = params.state;
                        break;
                    case 'index':
                        this.index = params.index;
                        break;
                    case 'streamIndex':
                        this.streamIndex = params.streamIndex;
                        break;
                    case 'body':
                        this.body = params.body;
                        if (this.body.user && this.body.user.user_id) {
                            this.body.user.id = this.body.user.user_id;
                            delete this.body.user.user_id;
                        }
                        if (this.body.digit) {
                            this.digit = this.body.digit;
                            delete this.body.digit;
                        }
                        if (this.body.digits) {
                            this.digit = this.body.digits;
                            delete this.body.digits;
                        }
                        break;
                }
            }
        }
        WildEmitter.mixin(NXMEvent);
    }
    /**
     * Delete the event
     * @param {number} [event_id=this.event_id] if the event id param is not present, "this" event will be default
     * @returns {Promise}
     * @private
    */
    async del(event_id = this.id) {
        try {
            await this.conversation.application.session.sendNetworkRequest({
                type: 'DELETE',
                path: `conversations/${this.conversation.id}/events/${event_id}?from=${this.conversation.me.id}`,
                version: 'beta2'
            });
            return;
        }
        catch (error) {
            throw new nexmoClientError_1.NexmoApiError(error);
        }
    }
    /**
     * Mark as Delivered the event
     * @param {number} [event_id=this.event_id] if the event id is not provided, the this event will be used
     * @returns {Promise}
     * @private
     */
    async delivered(event_id = this.id) {
        if (this.type !== 'text' && this.type !== 'image' && this.type !== 'message') {
            this.type = 'event';
        }
        if (this.conversation.me.id === this.from) {
            throw new nexmoClientError_1.NexmoClientError('error:delivered:own-message');
        }
        else if (this.state && this.state.delivered_to && this.state.delivered_to[this.conversation.me.id]) {
            throw new nexmoClientError_1.NexmoClientError('error:already-delivered');
        }
        else {
            try {
                await this.conversation.application.session.sendNetworkRequest({
                    type: 'POST',
                    path: `conversations/${this.conversation.id}/events`,
                    data: {
                        type: `${this.type}:delivered`,
                        from: this.conversation.me.id,
                        body: {
                            event_id
                        }
                    }
                });
                return;
            }
            catch (error) {
                throw new nexmoClientError_1.NexmoApiError(error);
            }
        }
    }
    /**
     * Mark as Seen the event
     * @param {number} [event_id=this.event_id] if the event id is not provided, the this event will be used
     * @returns {Promise}
     * @private
    */
    async seen(event_id = this.id) {
        if (this.type !== 'text' && this.type !== 'image' && this.type !== 'message') {
            this.type = 'event';
        }
        if (this.conversation.me.id === this.from) {
            throw new nexmoClientError_1.NexmoClientError('error:seen:own-message');
        }
        else if (this.state && this.state.seen_by && this.state.seen_by[this.conversation.me.id]) {
            throw new nexmoClientError_1.NexmoClientError('error:already-seen');
        }
        else {
            try {
                await this.conversation.application.session.sendNetworkRequest({
                    type: 'POST',
                    path: `conversations/${this.conversation.id}/events`,
                    data: {
                        type: `${this.type}:seen`,
                        from: this.conversation.me.id,
                        body: {
                            event_id
                        }
                    }
                });
                return;
            }
            catch (error) {
                throw new nexmoClientError_1.NexmoApiError(error);
            }
        }
    }
}
exports.default = NXMEvent;
module.exports = NXMEvent;