@novo-learning/novo-sdk
Version:
SDK for the Novolanguage Speech Analysis API
100 lines • 3.68 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessageQueue = void 0;
const asr_message_type_1 = require("../entities/asr-message-type");
const events_1 = require("../events");
const asr_message_received_event_1 = require("../events/asr-message-received.event");
const recognition_progress_event_1 = require("../events/recognition-progress.event");
const deferred_promise_1 = require("../utils/deferred.promise");
class Message {
constructor(request) {
this.request = request;
this.timestamp = new Date();
this.defer = new deferred_promise_1.Deferred();
}
}
class MessageQueue {
constructor(eventBus, websocket) {
this.eventBus = eventBus;
this.websocket = websocket;
this.messageId = 0;
this.requests = {};
this.websocket.onmessage = (event) => {
try {
const result = JSON.parse(event.data);
if (result.error) {
if (result.error.indexOf('Unauthorized') >= 0) {
this.eventBus.dispatch(events_1.PermissionDeniedEvent.type);
return;
}
console.error(result.error);
return;
}
if (!result?.data) {
return;
}
if (this.isIntermediateResult(result)) {
this.parseIntermediateResult(result.data);
}
else {
this.parseResult(result.data);
}
}
catch (err) {
if (typeof event.data === 'string') {
if (event.data.indexOf('Unauthorized') >= 0) {
this.eventBus.dispatch(events_1.PermissionDeniedEvent.type);
return;
}
}
console.error(err);
}
};
}
async request(method, params) {
if (this.websocket?.readyState === WebSocket.OPEN) {
const id = this.getID();
const request = {
event: method,
data: { id, params },
};
this.requests[id] = new Message(request);
this.websocket.send(JSON.stringify(request));
return this.requests[id].defer.promise;
}
return undefined;
}
parseIntermediateResult(result) {
this.eventBus.dispatch(recognition_progress_event_1.RecognitionProgressEvent.type, result);
}
parseResult(result) {
if (result.result !== asr_message_type_1.AsrMessageType.PONG) {
this.eventBus.dispatch(asr_message_received_event_1.AsrMessageReceivedEvent.type, { message: result });
}
if (!(result.id in this.requests)) {
console.error('Could not interpret result', result);
return;
}
const request = this.requests[result.id];
if (request != null) {
delete this.requests[result.id];
}
if (result.result) {
request.defer.resolve(result.result);
}
else {
request.defer.reject(result.error);
}
}
isIntermediateResult(result) {
return result.event === asr_message_type_1.AsrMessageType.INTERMEDIATE_RESULT;
}
clearMessageQueue() {
Object.keys(this.requests).forEach((requestId) => this.requests[Number(requestId)].defer.reject('Connection to speech recognizer was lost'));
}
getID() {
return ++this.messageId;
}
}
exports.MessageQueue = MessageQueue;
//# sourceMappingURL=message-queue.js.map