@novo-learning/novo-sdk
Version:
SDK for the Novolanguage Speech Analysis API
122 lines • 4.73 kB
JavaScript
"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