From e4e6b663b3acf27dcf52476907908bdc87f7b36b Mon Sep 17 00:00:00 2001 From: NikolaBorislavovHristov Date: Tue, 24 Sep 2019 19:31:35 +0300 Subject: [PATCH] StremioCore service implemented --- src/services/StremioCore/StremioCore.js | 98 +++++++++++++++++++++++++ src/services/StremioCore/index.js | 4 +- src/services/index.js | 4 +- 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 src/services/StremioCore/StremioCore.js diff --git a/src/services/StremioCore/StremioCore.js b/src/services/StremioCore/StremioCore.js new file mode 100644 index 000000000..4067002c7 --- /dev/null +++ b/src/services/StremioCore/StremioCore.js @@ -0,0 +1,98 @@ +const EventEmitter = require('events'); +const { default: init, ContainerService } = require('stremio-core-web'); + +function StremioCore() { + let active = false; + let error = null; + let starting = false; + let containerService = null; + let events = new EventEmitter(); + + function onStateChanged() { + events.emit('stateChanged'); + } + function start() { + if (active || error !== null || starting) { + return; + } + + starting = true; + events.on('error', () => { }); + init() + .then(() => { + if (starting) { + containerService = new ContainerService(({ name, args } = {}) => { + if (active) { + events.emit(name, args); + } + }); + active = true; + onStateChanged(); + } + }) + .catch((e) => { + error = new Error('Unable to init stremio-core-web'); + error.error = e; + onStateChanged(); + }) + .then(() => { + starting = false; + }); + } + function stop() { + active = false; + error = null; + containerService = null; + onStateChanged(); + } + function on(name, listener) { + events.on(name, listener); + } + function off(name, listener) { + events.off(name, listener); + } + function dispatch({ action, args } = {}) { + if (!active) { + return; + } + + containerService.dispatch({ action, args }); + } + function getState() { + if (!active) { + return {}; + } + + return containerService.get_state(); + } + + Object.defineProperties(this, { + active: { + configurable: false, + enumerable: true, + get: function() { + return active; + } + }, + error: { + configurable: false, + enumerable: true, + get: function() { + return error; + } + } + }); + + this.start = start; + this.stop = stop; + this.on = on; + this.off = off; + this.dispatch = dispatch; + this.getState = getState; + + Object.freeze(this); +}; + +Object.freeze(StremioCore); + +module.exports = StremioCore; diff --git a/src/services/StremioCore/index.js b/src/services/StremioCore/index.js index ea641885d..f5b888673 100644 --- a/src/services/StremioCore/index.js +++ b/src/services/StremioCore/index.js @@ -1 +1,3 @@ -//TODO \ No newline at end of file +const StremioCore = require('./StremioCore'); + +module.exports = StremioCore; diff --git a/src/services/index.js b/src/services/index.js index bbe0adb73..026be7190 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,8 +1,10 @@ const KeyboardNavigation = require('./KeyboardNavigation'); const { ServicesProvider, useServices } = require('./ServicesContext'); +const StremioCore = require('./StremioCore'); module.exports = { KeyboardNavigation, ServicesProvider, - useServices + useServices, + StremioCore };