js/commands/worker_command.js
- // NPM IMPORTS
- // import assert from 'assert'
-
- // COMMON IMPORTS
- import T from '../../../node_modules/devapt-core-common/dist/js/utils/types'
-
- // BROWSER IMPORTS
- import Command from './command'
-
-
- const context = 'browser/commands/worker_command'
-
-
-
- /**
- * Web worker command class.
- *
- * @author Luc BORIES
- * @license Apache-2.0
- *
- * @example
- *
- * API:
- * ->do():Promise - do display.
- * ->undo():Promise - undo display and display history previous content.
- * ->start()
- * ->stop()
- */
- export default class WorkerCommand extends Command
- {
- /**
- * Creates a web worker command instance.
- *
- * Command configuration is a simple object with:
- * - url: local script url
- *
- * @param {object} arg_runtime - client runtime.
- * @param {object} arg_settings - command settings.
- * @param {string} arg_log_context - context of traces of this instance (optional).
- *
- * @returns {nothing}
- */
- constructor(arg_runtime, arg_settings, arg_log_context=context)
- {
- super(arg_runtime, arg_settings, arg_log_context)
-
- /**
- * Class type flag.
- * @type {boolean}
- */
- this.is_worker_command = true
-
- this._worker = undefined
- this._worker_promise = undefined
-
- this._script_url = T.isObject(this._settings) && T.isNotEmptyString(this._settings.script_url) ? this._settings.script_url : undefined
- this._script_operands = T.isObject(this._settings) && this._settings.script_operands ? this._settings.script_operands : undefined
-
- // this.enable_trace()
- // this.update_trace_enabled()
- }
-
-
-
- /**
- * Check if command settings is valid.
- *
- * @returns {boolean}
- */
- is_valid()
- {
- const has_url = T.isNotEmptyString(this._script_url) || this._script_operands == undefined
-
- return has_url
- }
-
-
-
- /**
- * Do command.
- *
- * @returns {Promise}
- */
- _do()
- {
- // WORKER NOT SUPPORTED
- if (typeof(Worker) === "undefined")
- {
- return Promise.reject(context + ':do:worker is not supported')
- }
-
- // WORKER ALREADY EXISTS
- if (typeof(this._worker) !== "undefined")
- {
- return this._worker_promise && this._worker_promise.then ? this._worker_promise : Promise.reject(context + ':' + this.get_name() + ':bad worker promise')
- }
-
- // CREATE WORKER
- const resolve_fn = (results)=>{
- return results
- }
-
- const reject_fn = (err)=>{
- return err
- }
-
- if ( ! this.is_valid() )
- {
- return Promise.reject(context + ':do:bad settings')
- }
-
- this._worker = new Worker(this._script_url)
- this._worker.onmessage = function(event){
- resolve_fn(event.data)
- }
-
- this._worker.onerror = function(error){
- reject_fn(error)
- }
-
- this._worker_promise = new Promise(resolve_fn, reject_fn)
- this._worker_promise.then(
- (results)=>{
- this.stop()
- return results
- }
- )
-
- // START
- this._worker.postMessage(this._script_operands)
-
- return this._worker_promise
- }
-
-
-
- /**
- * Undo command.
- *
- * @returns {Promise}
- */
- _undo()
- {
- if (typeof(Worker) === "undefined")
- {
- return Promise.reject(context + ':undo:worker is not supported')
- }
-
- return Promise.reject(context + ':undo:not yet implemented')
- }
-
-
-
- /**
- * Stop worker.
- */
- stop()
- {
- if (typeof(this._worker) !== "undefined")
- {
- this._worker.terminate()
- this._worker = undefined
- // this._worker_promise = undefined // DO NOT DELETE RESULTS PROMISE
- }
- }
- }