UNPKG

@novo-learning/novo-sdk

Version:

SDK for the Novolanguage Speech Analysis API

122 lines 4.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SpeechApiConnection = void 0; const event_bus_1 = require("../event-bus"); const connection_state_change_event_1 = require("../events/connection-state-change.event"); const deferred_promise_1 = require("../utils/deferred.promise"); const message_queue_1 = require("./message-queue"); const monitor_1 = require("./monitor"); class SpeechApiConnection { constructor(url) { this.url = url; this.eventBus = new event_bus_1.EventBus(); if (window) { window.addEventListener('offline', () => { console.log('Browser went offline'); this.disconnect(); }); window.addEventListener('online', () => { console.log('Browser went online'); if (this.lastUsedToken) { this.connect(this.lastUsedToken); } }); } } connect(token) { if (this.connectionMonitor !== undefined) { console.warn(`Already connected`); return Promise.resolve(); } this.lastUsedToken = token; this.websocket = new WebSocket(`${this.url}?access_token=${token}`); this.websocket.binaryType = 'arraybuffer'; this.messageQueue = new message_queue_1.MessageQueue(this.eventBus, this.websocket); this.connectionMonitor = new monitor_1.ConnectionMonitor(this.eventBus, this.messageQueue, this.websocket); const connecting = new deferred_promise_1.Deferred(); const waitForConnection = (event) => { if (event.state === 'initial' || event.state === 'connecting') { return; } if (event.state === 'open') { connecting.resolve(); } else if (event.state === 'closed') { connecting.reject(); } this.eventBus.removeEventListener(connection_state_change_event_1.ConnectionStateChangedEvent.type, waitForConnection); }; this.eventBus.addEventListener(connection_state_change_event_1.ConnectionStateChangedEvent.type, waitForConnection); return connecting.promise; } disconnect() { if (this.connectionMonitor) { this.connectionMonitor.close(); this.connectionMonitor = undefined; } if (this.messageQueue) { this.messageQueue.clearMessageQueue(); this.messageQueue = undefined; } } async sendAudio(data) { if (this.connectionMonitor?.state === 'open') { this.websocket?.send(data); } } async getResult() { if (this.messageQueue) { return this.messageQueue.request('get_result'); } return undefined; } async setExercise(exercise) { if (this.messageQueue) { const result = await this.messageQueue.request('set_exercise', exercise); if (result !== undefined) { return result; } } return { result: { success: false, error: 'No connection' } }; } async setPrompt(prompt, confusion, metadata) { if (this.messageQueue) { const result = await this.messageQueue.request('set_prompt', { prompt, confusion, metadata }); if (result !== undefined) { return result; } } return { result: { success: false, error: 'No connection' } }; } async setChoice(correctOptions, incorrectOptions, metadata, multiple) { if (this.messageQueue) { const result = await this.messageQueue.request('set_choice', { correctOptions, incorrectOptions, metadata, multiple }); if (result !== undefined) { return result; } } return { result: { success: false, error: 'No connection' } }; } async setExerciseId(config) { if (this.messageQueue) { const result = await this.messageQueue.request('set_exercise_id', config); if (result !== undefined) { return result; } } return { result: { success: false, error: 'No connection' } }; } async updateAccessToken(accessToken) { this.lastUsedToken = accessToken; if (this.messageQueue) { return this.messageQueue.request('set_access_token', { accessToken }); } } async setConfig(config) { if (this.messageQueue) { return this.messageQueue.request('set_config', config); } } } exports.SpeechApiConnection = SpeechApiConnection; //# sourceMappingURL=speech-api-connection.js.map