wa-chat-server-mluvii
Version:
Mluvii adapter for the modules wa-chat-server
113 lines (112 loc) • 4.81 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MluviiPublicAPI = void 0;
const querystring_1 = __importDefault(require("querystring"));
class MluviiPublicAPI {
constructor(config, dependencies) {
this.config = config;
this.dependencies = dependencies;
this.axios = dependencies.axios;
this.log = dependencies.log;
}
getTokenRequest() {
return {
method: 'post',
url: this.config.getTokenUrl,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: querystring_1.default.stringify({
response_type: 'token',
grant_type: 'client_credentials',
client_id: this.config.username,
client_secret: this.config.secret,
}),
};
}
/**
* Removes some keys from the response for the purpose of logging
*/
pruneResponse(response) {
const { headers, data, status, statusText } = response;
return { headers, data, status, statusText };
}
getAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
const tm = new Date();
if (this.token && tm < this.tokenExpiration) {
return this.token;
}
const request = this.getTokenRequest();
try {
const response = yield this.axios(request);
this.log.info('MluviiPublicAPI: getAccessToken request', {
request,
response: this.pruneResponse(response),
});
this.token = response.data.access_token;
this.tokenExpiration = new Date(new Date().getTime() + 1000 * response.data.expires_in);
this.log.info('MluviiPublicAPI - setting access token' +
` (expiration on ${this.tokenExpiration.toISOString()}): ${this.token}`);
return this.token;
}
catch (error) {
this.log.error('MluviiPublicAPI: getAccessToken request failed', {
request,
error,
});
}
});
}
sendMessage(sessionId, watsonResponse, // AssistantV1.Response
session, date = new Date()) {
return __awaiter(this, void 0, void 0, function* () {
const converter = new this.dependencies.watsonToMluviiConverterClass(watsonResponse, this.dependencies, session);
const activities = converter.convert();
const token = yield this.getAccessToken();
const ms = date.getTime();
let index = 0;
let activity;
let request;
try {
for (activity of activities) {
const timestamp = new Date(ms + index).toISOString();
index++;
request = {
method: 'post',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`,
},
url: `${this.config.sendMessageUrl}/${this.config.chatbotId}/activity`,
data: Object.assign(Object.assign({ sessionId }, activity), { timestamp }),
};
const response = yield this.axios(request);
this.log.info('MluviiPublicAPI: sendMessage', {
request,
response: this.pruneResponse(response),
});
}
}
catch (error) {
this.log.error(`MluviiPublicAPI: sendMessage (call ${index}/${activities.length})`, {
request,
error,
});
}
});
}
}
exports.MluviiPublicAPI = MluviiPublicAPI;