stremio-web/src/services/Core/Core.js
2020-12-16 15:13:15 +02:00

129 lines
3.2 KiB
JavaScript

// Copyright (C) 2017-2020 Smart code 203358507
const EventEmitter = require('eventemitter3');
const { default: initialize_api, initialize_runtime } = require('@stremio/stremio-core-web');
const CoreTransport = require('./CoreTransport');
let transport = null;
let apiInitialized = null;
const apiEvents = new EventEmitter();
apiEvents.on('error', (error) => {
console.error(error);
});
initialize_api()
.then(() => {
const transportEvents = new EventEmitter();
transportEvents.on('error', (error) => {
console.error(error);
});
return initialize_runtime(({ name, args }) => {
try {
transportEvents.emit(name, args);
} catch (error) {
console.error(error);
}
}).then(() => {
transport = new CoreTransport(transportEvents);
});
})
.then(() => {
apiInitialized = true;
apiEvents.emit('initialized');
})
.catch((error) => {
console.error(error);
apiInitialized = false;
apiEvents.emit('initialized');
});
function Core() {
let active = false;
let error = null;
let starting = false;
let _transport = null;
const events = new EventEmitter();
events.on('error', (error) => {
console.error(error);
});
function onAPIInitialized() {
if (apiInitialized) {
active = true;
error = null;
starting = false;
_transport = transport;
} else {
active = false;
error = new Error('Stremio Core API initialization failed');
starting = false;
_transport = null;
}
onStateChanged();
}
function onStateChanged() {
events.emit('stateChanged');
}
Object.defineProperties(this, {
active: {
configurable: false,
enumerable: true,
get: function() {
return active;
}
},
error: {
configurable: false,
enumerable: true,
get: function() {
return error;
}
},
starting: {
configurable: false,
enumerable: true,
get: function() {
return starting;
}
},
transport: {
configurable: false,
enumerable: true,
get: function() {
return _transport;
}
}
});
this.start = function() {
if (active || error instanceof Error || starting) {
return;
}
starting = true;
if (apiInitialized !== null) {
onAPIInitialized();
} else {
apiEvents.on('initialized', onAPIInitialized);
onStateChanged();
}
};
this.stop = function() {
apiEvents.off('initialized', onAPIInitialized);
active = false;
error = null;
starting = false;
onStateChanged();
_transport = null;
};
this.on = function(name, listener) {
events.on(name, listener);
};
this.off = function(name, listener) {
events.off(name, listener);
};
}
module.exports = Core;