UNPKG

@ovotech/genesys-web-messaging-tester

Version:
106 lines (105 loc) 4.35 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebMessengerGuestSession = exports.isStructuredMessage = void 0; const ws_1 = require("ws"); const uuid_1 = require("uuid"); const events_1 = require("events"); const debug_1 = __importDefault(require("debug")); const ReorderedMessageDelayer_1 = require("./message-delayer/ReorderedMessageDelayer"); function isSessionResponse(message) { return message.type === 'response' && message.class === 'SessionResponse'; } function isStructuredMessage(message) { return message.type === 'message' && message.class === 'StructuredMessage'; } exports.isStructuredMessage = isStructuredMessage; /** * @see https://developer.genesys.cloud/api/digital/webmessaging/websocketapi#configure-a-guest-session */ class WebMessengerGuestSession extends events_1.EventEmitter { constructor(config, participantData = {}, messageDelayer = new ReorderedMessageDelayer_1.ReorderedMessageDelayer(), wsFactory = (url, options) => new ws_1.WebSocket(url, options)) { super(); this.config = config; this.participantData = participantData; this.messageDelayer = messageDelayer; this.wsFactory = wsFactory; this.sessionToken = (0, uuid_1.v4)(); const url = `wss://webmessaging.${this.config.region}/v1?deploymentId=${this.config.deploymentId}`; WebMessengerGuestSession.debugger('Connecting to: %s', url); this.ws = wsFactory(url, { origin: this.config.origin }); this.ws.on('open', () => this.connected()); this.ws.on('message', (data) => this.messageReceived(data)); messageDelayer.on('message', (message) => this.processMessage(message)); } get messageDelayInMs() { return this.messageDelayer.delay; } connected() { // https://developer.genesys.cloud/api/digital/webmessaging/websocketapi#configure-a-guest-session const payload = { action: 'configureSession', deploymentId: this.config.deploymentId, token: this.sessionToken, }; WebMessengerGuestSession.debugger('Sending: %O', payload); this.ws.send(JSON.stringify(payload)); } processMessage(message) { if (isSessionResponse(message)) { this.emit('sessionStarted', message); return; } if (isStructuredMessage(message)) { this.emit('structuredMessage', message); return; } console.log('Unknown message', message); } messageReceived(data) { if (!Buffer.isBuffer(data)) { throw new Error('Expected data as Buffer type'); } const textPayload = data.toString('utf-8'); WebMessengerGuestSession.debugger('Received: %O', textPayload); const payload = JSON.parse(textPayload); if (typeof payload.type !== 'string') { // eslint-disable-next-line @typescript-eslint/restrict-template-expressions throw new Error(`Unexpected payload: ${payload}`); } const message = payload; if (message.code !== 200) { throw Error(`Session Response was ${message.code} instead of 200 due to '${message.body}'`); } this.messageDelayer.add(message, new Date()); } sendText(message) { var _a; const payload = { action: 'onMessage', token: this.sessionToken, message: { type: 'Text', text: message, }, ...(Object.keys(this.participantData).length === 0 ? {} : { channel: { metadata: { customAttributes: (_a = this.participantData) !== null && _a !== void 0 ? _a : {}, }, }, }), }; WebMessengerGuestSession.debugger('Sending: %O', payload); this.ws.send(JSON.stringify(payload)); } close() { this.ws.close(); } } exports.WebMessengerGuestSession = WebMessengerGuestSession; WebMessengerGuestSession.debugger = (0, debug_1.default)('WebMessengerGuestSession');