@ovotech/genesys-web-messaging-tester
Version:
106 lines (105 loc) • 4.35 kB
JavaScript
;
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');