fc-nexmo-client1
Version:
Nexmo Client SDK for JavaScript
296 lines (295 loc) • 11 kB
JavaScript
'use strict';
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/*
* Nexmo Client SDK
* Conversation Events Handler
*
* Copyright (c) Nexmo Inc.
*/
const loglevel_1 = require("loglevel");
const nxmEvent_1 = __importDefault(require("../events/nxmEvent"));
const text_event_1 = __importDefault(require("../events/text_event"));
const image_event_1 = __importDefault(require("../events/image_event"));
const message_event_1 = __importDefault(require("../events/message_event"));
/**
* Handle Conversation Events
*
* @class ConversationEventsHandler
* @param {Application} application
* @param {Conversation} conversation
* @private
*/
class ConversationEventHandler {
constructor(application, conversation) {
this.log = loglevel_1.getLogger(this.constructor.name);
this.application = application;
this.conversation = conversation;
this.constructed_event = null;
this._handleEventMap = {
'event:delete': this._processDelete,
'image': this._processImage,
'image:delivered': this._processDelivered,
'image:seen': this._processSeen,
'member:invited': this._processMember,
'member:joined': this._processMember,
'member:left': this._processMember,
'audio:ringing:start': this._processMember,
'leg:status:update': this._processLegStatus,
'member:media': this._processMedia,
'text': this._processText,
'text:delivered': this._processDelivered,
'text:seen': this._processSeen,
'audio:mute:on': this._processMuteForMedia,
'audio:mute:off': this._processMuteForMedia,
'message': this._processMessage,
'message:delivered': this._processDelivered,
'message:seen': this._processSeen,
'message:submitted': this._processSubmitted,
'message:rejected': this._processRejected,
'message:undeliverable': this._processUndeliverable
};
}
/**
* Handle and event.
*
* Identify the type of the event,
* create the corresponding Class instance
* emit to the corresponding Objects
* @param {object} event
* @private
*/
handleEvent(event) {
if (this._handleEventMap.hasOwnProperty(event.type)) {
return this._handleEventMap[event.type].call(this, event) || new nxmEvent_1.default(this.conversation, event);
}
return new nxmEvent_1.default(this.conversation, event);
}
/**
* Mark the requested event as delivered
* use that event as constructed to update the local events' map
* @param {object} event
* @returns the NXMEvent that is marked as delivered
* @private
*/
_processDelivered(event) {
let event_to_mark = this.conversation.events.get(event.body.event_id);
if (event_to_mark) {
event_to_mark.state = event_to_mark.state || {};
event_to_mark.state.delivered_to = event_to_mark.state.delivered_to || {};
event_to_mark.state.delivered_to[event.from] = event.timestamp;
return event_to_mark;
}
else {
this.log.warn('NXMEvent not found');
return null;
}
}
/**
* Delete the requested event
* empty the payload of the event (text, image or message)
* use that event as constructed to update the local events map
* @param {object} event
* @returns the deleted events
* @private
*/
_processDelete(event) {
var _a;
let event_to_delete = this.conversation.events.get((_a = event === null || event === void 0 ? void 0 : event.body) === null || _a === void 0 ? void 0 : _a.event_id);
if (event_to_delete) {
if (event_to_delete.body.text)
event_to_delete.body.text = '';
if (event_to_delete.body.representations)
event_to_delete.body.representations = '';
event_to_delete.body.timestamp = {
deleted: event.timestamp
};
return event_to_delete;
}
else {
this.log.warn('NXMEvent not found');
return null;
}
}
/**
* Return an ImageEvent with the corresponding image data
* @param {object} event
* @returns {ImageEvent}
*/
_processImage(event) {
var _a;
const imageEvent = new image_event_1.default(this.conversation, event);
// Automatically send a delivery
// avoid sending delivered to our own events
if (((_a = this.conversation.me) === null || _a === void 0 ? void 0 : _a.id) !== imageEvent.from) {
imageEvent.delivered();
}
return imageEvent;
}
/**
* Handle events for member state changes (joined, invited, left)
* in conversation level.
* Other members are going through here too.
* For .me member initial event (join, invite) use the application listener
* @param {object} event
* @returns {NXMEvent}
* @private
*/
_processMember(event) {
// needs to first process the call state and then alter the member
if (this.application.calls.has(this.conversation.id)) {
let call = this.application.calls.get(this.conversation.id);
call._handleStatusChange(event);
}
if (this.conversation.members.has(event.from))
this.conversation.members.get(event.from)._handleEvent(event);
return new nxmEvent_1.default(this.conversation, event);
}
/**
* Handle events for leg status updates in conversation level.
* Other member's legs are going through here too.
* @param {object} event
* @returns {NXMEvent}
* @private
*/
_processLegStatus(event) {
if (this.conversation.members.has(event.from))
this.conversation.members.get(event.from)._handleEvent(event);
return new nxmEvent_1.default(this.conversation, event);
}
/**
* Handle member:media events
* use a call object if and the member object
* @param {object} event
* @private
*/
_processMedia(event) {
if (this.conversation.members.has(event.from))
this.conversation.members.get(event.from)._handleEvent(event);
return null;
}
/**
* Handle *:mute:* events
* @param {object} event
* @private
*/
_processMuteForMedia(event) {
if (this.conversation.media.rtcObjects[event.body.rtc_id]) {
event.streamIndex = this.conversation.media.rtcObjects[event.body.rtc_id].streamIndex;
}
else {
this.log.warn('No audio stream was found');
}
return null;
}
/**
* Mark the requested event as seen
* use that event as constructed to update the local Events map
* @param {object} event
* @private
*/
_processSeen(event) {
let event_to_mark = this.conversation.events.get(event.body.event_id);
if (event_to_mark) {
event_to_mark.state = event_to_mark.state || {};
event_to_mark.state.seen_by = event_to_mark.state.seen_by || {};
event_to_mark.state.seen_by[event.from] = event.timestamp;
return event_to_mark;
}
else {
this.log.warn('NXMEvent not found');
return null;
}
}
/**
* Create the TextEvent object and trigger .delivered()
* @param {object} event
* @private
*/
_processText(event) {
var _a, _b;
const textEvent = new text_event_1.default(this.conversation, event);
// Automatically send a delivery
// avoid sending delivered to our own events
if (((_b = (_a = this.conversation) === null || _a === void 0 ? void 0 : _a.me) === null || _b === void 0 ? void 0 : _b.id) !== textEvent.from) {
textEvent.delivered();
}
return textEvent;
}
/**
* Create the MessageEvent object and trigger .delivered()
* @param {object} event
* @private
*/
_processMessage(event) {
var _a, _b;
const messageEvent = new message_event_1.default(this.conversation, event);
// Automatically send a delivery
// avoid sending delivered to our own events
if (((_b = (_a = this.conversation) === null || _a === void 0 ? void 0 : _a.me) === null || _b === void 0 ? void 0 : _b.id) !== messageEvent.from) {
messageEvent.delivered();
}
return messageEvent;
}
/**
* Mark the requested event as submitted
* use that event as constructed to update the local Events map
* @param {object} event
* @private
*/
_processSubmitted(event) {
let event_to_mark = this.conversation.events.get(event.body.event_id);
if (event_to_mark) {
event_to_mark.state = event_to_mark.state || {};
event_to_mark.state.submitted_to = event_to_mark.state.submitted_to || {};
event_to_mark.state.submitted_to[event.from] = event.timestamp;
return event_to_mark;
}
else {
this.log.warn('NXMEvent not found');
return null;
}
}
/**
* Mark the requested event as rejected
* use that event as constructed to update the local Events map
* @param {object} event
* @private
*/
_processRejected(event) {
let event_to_mark = this.conversation.events.get(event.body.event_id);
if (event_to_mark) {
event_to_mark.state = event_to_mark.state || {};
event_to_mark.state.rejected_by = event_to_mark.state.rejected_by || {};
event_to_mark.state.rejected_by[event.from] = event.timestamp;
return event_to_mark;
}
else {
this.log.warn('NXMEvent not found');
return null;
}
}
/**
* Mark the requested event as undeliverable
* use that event as constructed to update the local Events map
* @param {object} event
* @private
*/
_processUndeliverable(event) {
let event_to_mark = this.conversation.events.get(event.body.event_id);
if (event_to_mark) {
event_to_mark.state = event_to_mark.state || {};
event_to_mark.state.undeliverable_to = event_to_mark.state.undeliverable_to || {};
event_to_mark.state.undeliverable_to[event.from] = event.timestamp;
return event_to_mark;
}
else {
this.log.warn('NXMEvent not found');
return null;
}
}
}
exports.default = ConversationEventHandler;
module.exports = ConversationEventHandler;