UNPKG

@novo-learning/novo-sdk

Version:

SDK for the Novolanguage Speech Analysis API

100 lines 3.68 kB
"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