UNPKG

biswebnode

Version:

A node.js implementation of BioImage Suite Web command line tools in Javascript and WebAssembly

143 lines (132 loc) 2.26 MB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("atob"), require("btoa"), require("colors/safe"), require("commander"), require("crypto-js"), require("http-proxy"), require("iobuffer"), require("jsonlint"), require("node-fetch"), require("numeric"), require("otplib"), require("pako"), require("request"), require("rimraf"), require("tmp"), require("websocket-stream"), require("ws")); else if(typeof define === 'function' && define.amd) define(["atob", "btoa", "colors/safe", "commander", "crypto-js", "http-proxy", "iobuffer", "jsonlint", "node-fetch", "numeric", "otplib", "pako", "request", "rimraf", "tmp", "websocket-stream", "ws"], factory); else if(typeof exports === 'object') exports["bioimagesuiteweblib"] = factory(require("atob"), require("btoa"), require("colors/safe"), require("commander"), require("crypto-js"), require("http-proxy"), require("iobuffer"), require("jsonlint"), require("node-fetch"), require("numeric"), require("otplib"), require("pako"), require("request"), require("rimraf"), require("tmp"), require("websocket-stream"), require("ws")); else root["bioimagesuiteweblib"] = factory(root["atob"], root["btoa"], root["colors/safe"], root["commander"], root["crypto-js"], root["http-proxy"], root["iobuffer"], root["jsonlint"], root["node-fetch"], root["numeric"], root["otplib"], root["pako"], root["request"], root["rimraf"], root["tmp"], root["websocket-stream"], root["ws"]); })(global, function(__WEBPACK_EXTERNAL_MODULE_atob__, __WEBPACK_EXTERNAL_MODULE_btoa__, __WEBPACK_EXTERNAL_MODULE_colors_safe__, __WEBPACK_EXTERNAL_MODULE_commander__, __WEBPACK_EXTERNAL_MODULE_crypto_js__, __WEBPACK_EXTERNAL_MODULE_http_proxy__, __WEBPACK_EXTERNAL_MODULE_iobuffer__, __WEBPACK_EXTERNAL_MODULE_jsonlint__, __WEBPACK_EXTERNAL_MODULE_node_fetch__, __WEBPACK_EXTERNAL_MODULE_numeric__, __WEBPACK_EXTERNAL_MODULE_otplib__, __WEBPACK_EXTERNAL_MODULE_pako__, __WEBPACK_EXTERNAL_MODULE_request__, __WEBPACK_EXTERNAL_MODULE_rimraf__, __WEBPACK_EXTERNAL_MODULE_tmp__, __WEBPACK_EXTERNAL_MODULE_websocket_stream__, __WEBPACK_EXTERNAL_MODULE_ws__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "../../js/bin/bioimagesuiteweblib.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "../../config/bisweb_pathconfig.js": /*!************************************************************!*\ !*** /Users/xenios/bisweb/src/config/bisweb_pathconfig.js ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; eval("/* WEBPACK VAR INJECTION */(function(module) {/* LICENSE\n \n _This file is Copyright 2018 by the Image Processing and Analysis Group (BioImage Suite Team). Dept. of Radiology & Biomedical Imaging, Yale School of Medicine._\n \n BioImage Suite Web is licensed under the Apache License, Version 2.0 (the \"License\");\n \n - you may not use this software except in compliance with the License.\n - You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)\n \n __Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.__\n \n ENDLICENSE */\n\n\n\nconst os = __webpack_require__(/*! os */ \"os\");\n\nlet path=__webpack_require__(/*! path */ \"path\");\nlet v=process.versions.node;\nlet s=v.split(\".\");\nlet major=parseInt(s[0]);\nlet minor=parseInt(s[1]);\n\nlet ok=false;\n\nif (major === 10 && minor >= 11) {\n ok=true;\n} else if (major >= 12) {\n ok=true;\n} else {\n console.log(`----\\n---- You are using an incompatible version of node (either 10.11 or newer) (actual version=${v})\\n`);\n process.exit(1);\n}\n\nif (!global.bioimagesuiteweblib) {\n console.log(`....\\n.... Using node.js version ${v} (OK=${ok})`);\n console.log('.... This program is part of the commandline suite of tools from BioImage Suite Web.\\n.... See https://github.com/bioimagesuiteweb/bisweb for more information.\\n....');\n}\n\nlet d=path.dirname(__dirname);\n\n// webgui below should go but needed for ancient parcellation class which should be split into compute and gui sometime\n\n['build/wasm',\n 'config/',\n 'lib/js',\n 'js/',\n 'js/node',\n 'js/utilities',\n 'js/core',\n 'js/export',\n 'js/dataobjects',\n 'js/modules' ].forEach((p) => {\n module.paths.push(path.normalize(path.join(d,p)));\n});\n\n\n\nlet a=[];\nmodule.paths.forEach((p) => {\n a.push(p);\n});\n\n// See https://stackoverflow.com/questions/21358994/node-js-programmatically-setting-node-path\n// Windows fix is mine!\nif (os.platform()!=='win32')\n process.env.NODE_PATH=a.join(\":\");\nelse\n process.env.NODE_PATH=a.join(\";\");\n\n__webpack_require__(/*! module */ \"module\").Module._initPaths();\n\n\nmodule.exports=v;\n\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/module.js */ \"../../node_modules/webpack/buildin/module.js\")(module)))\n\n//# sourceURL=webpack://bioimagesuiteweblib//Users/xenios/bisweb/src/config/bisweb_pathconfig.js?"); /***/ }), /***/ "../../js/bin/bioimagesuiteweblib.js": /*!**************************************************************!*\ !*** /Users/xenios/bisweb/src/js/bin/bioimagesuiteweblib.js ***! \**************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; eval("\n\nif (global.bioimagesuiteweblib !== false) {\n global.bioimagesuiteweblib = true;\n} else {\n global.bioimagesuiteweblib = false;\n}\n\n__webpack_require__(/*! ../../config/bisweb_pathconfig.js */ \"../../config/bisweb_pathconfig.js\");\nconst expobj=__webpack_require__(/*! bisweb_exportobject */ \"../../js/export/bisweb_exportobject.js\");\n\nexpobj.commander=__webpack_require__(/*! commander */ \"commander\");\nexpobj.tmp=__webpack_require__(/*! tmp */ \"tmp\");\nexpobj.rimraf=__webpack_require__(/*! rimraf */ \"rimraf\");\n\nexpobj.commandline = __webpack_require__(/*! commandline */ \"../../js/node/commandline.js\");\nexpobj.userPreferences = __webpack_require__(/*! bisweb_userpreferences.js */ \"../../js/core/bisweb_userpreferences.js\");\nexpobj.bisnodecmd=__webpack_require__(/*! bis_commandlineutils */ \"../../js/core/bis_commandlineutils.js\"),\nexpobj.wsutil=__webpack_require__(/*! bis_wsutil */ \"../../js/utilities/bis_wsutil.js\");\nexpobj.loadParse=expobj.commandline.loadParse;\nexpobj.createXML=expobj.commandline.createXML;\nexpobj.loadUserPreferences=expobj.userPreferences.initialize;\nexpobj.BisWSWebSocketFileServer=__webpack_require__(/*! bis_wswebsocketfileserver */ \"../../js/node/bis_wswebsocketfileserver.js\");\nexpobj.nodemodules=__webpack_require__(/*! nodemoduleindex */ \"../../js/node/nodemoduleindex.js\"),\n\nmodule.exports=expobj;\n\n\n//# sourceURL=webpack://bioimagesuiteweblib//Users/xenios/bisweb/src/js/bin/bioimagesuiteweblib.js?"); /***/ }), /***/ "../../js/core/bis_commandlineutils.js": /*!****************************************************************!*\ !*** /Users/xenios/bisweb/src/js/core/bis_commandlineutils.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; eval("/* LICENSE\n \n _This file is Copyright 2018 by the Image Processing and Analysis Group (BioImage Suite Team). Dept. of Radiology & Biomedical Imaging, Yale School of Medicine._\n \n BioImage Suite Web is licensed under the Apache License, Version 2.0 (the \"License\");\n \n - you may not use this software except in compliance with the License.\n - You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)\n \n __Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.__\n \n ENDLICENSE */\n\n\n\nconst genericio=__webpack_require__(/*! bis_genericio */ \"../../js/core/bis_genericio.js\");\nconst colors=genericio.getcolorsmodule(),\n child_process = genericio.getchildprocessmodule();\n\nlet inelectron=false;\nif (genericio.getmode() === 'electron' )\n inelectron=true;\n\nlet getTime=function() {\n // http://stackoverflow.com/questions/7357734/how-do-i-get-the-time-of-day-in-javascript-node-js\n\n let date = new Date();\n\n let hour = date.getHours();\n hour = (hour < 10 ? \"0\" : \"\") + hour;\n\n let min = date.getMinutes();\n min = (min < 10 ? \"0\" : \"\") + min;\n\n let sec = date.getSeconds();\n sec = (sec < 10 ? \"0\" : \"\") + sec;\n\n return \"[\" + hour + \":\" + min + \":\" + sec +\"]\";\n};\n\nlet executeCommand=function(command,dir,done=0,printfn=null) {\n if (inelectron)\n printfn = printfn || console.log;\n else\n dir = dir || __dirname;\n console.log(getTime()+\" \"+colors.green(dir+\">\")+colors.red(command+'\\n'));\n\n \n // if (printfn) {\n // printfn('Initializing output from '+command,0);\n // }\n \n if (done===0) {\n let out=\"\";\n try {\n out=child_process.execSync(command, { cwd : dir });\n } catch(e) {\n out='error '+e;\n }\n return out;\n }\n \n try { \n let proc=child_process.exec(command, { cwd : dir });\n proc.stdout.on('data', function(data) {\n if (printfn) {\n let ok=printfn(data.trim(),0);\n if (!ok)\n printfn=false;\n }\n if (!inelectron) \n process.stdout.write(colors.yellow(data.trim()+'\\n')); \n });\n proc.stderr.on('data', function(data) {\n if (printfn) {\n printfn(data,1);\n }\n if (!inelectron)\n process.stdout.write(colors.red(data+'\\n'));\n \n });\n proc.on('exit', function(code) { done(true,code);});\n } catch(e) {\n console.log(' error '+e);\n done(false,1);\n }\n};\n\n\nlet executeCommandAndLog=function(command,dir,printfn=0) {\n\n if (inelectron)\n printfn = printfn || console.log;\n else\n dir = dir || __dirname;\n \n if (!inelectron)\n console.log(getTime()+\" \"+colors.green(dir+\">\")+colors.red(command+'\\n'));\n else\n console.log(getTime()+\" \"+dir+\">\"+command+'\\n');\n let log='';\n \n return new Promise( (resolve,reject) => {\n\n try {\n let proc=child_process.exec(command, { cwd : dir });\n proc.stdout.on('data', function(data) {\n if (printfn)\n printfn(data);\n if (!inelectron)\n process.stdout.write(colors.yellow(data));\n log+=data;\n\n });\n\n proc.stderr.on('data', function(data) {\n if (printfn)\n printfn(data);\n if (!inelectron)\n process.stdout.write(colors.red(data));\n log+=data;\n });\n \n proc.on('exit', function(code) {\n resolve(log+'\\n exit code ='+code);\n });\n } catch (e) {\n reject(e);\n }\n });\n};\n\nmodule.exports = {\n getTime : getTime,\n executeCommand: executeCommand,\n executeCommandAndLog : executeCommandAndLog,\n};\n\n\n//# sourceURL=webpack://bioimagesuiteweblib//Users/xenios/bisweb/src/js/core/bis_commandlineutils.js?"); /***/ }), /***/ "../../js/core/bis_coregenericio.js": /*!*************************************************************!*\ !*** /Users/xenios/bisweb/src/js/core/bis_coregenericio.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; eval("/* LICENSE\n \n _This file is Copyright 2018 by the Image Processing and Analysis Group (BioImage Suite Team). Dept. of Radiology & Biomedical Imaging, Yale School of Medicine._\n \n BioImage Suite Web is licensed under the Apache License, Version 2.0 (the \"License\");\n \n - you may not use this software except in compliance with the License.\n - You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)\n \n __Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.__\n \n ENDLICENSE */\n\n\n\n/** \n * @file Browser/Node Js module. Contains {@link BisCoreGenericIO}.\n * @author Xenios Papademetris\n * @version 1.0\n */\n\n\nlet filesaver, fs = null, zlib, nodewin = {}, path = null, os=null,glob=null,rimraf=null,noderequest=null,colors=null,child_process=null;\nlet environment = '';\nlet inelectron = false;\nlet webWorkerScope;\n\nif (typeof (window) !== \"undefined\") {\n if (typeof (window.BISELECTRON) !== \"undefined\") {\n inelectron = true;\n }\n}\n\nlet pako = __webpack_require__(/*! pako */ \"pako\");\nlet webpack = process.browser || false;\nconst bisexternals=__webpack_require__(/*! bis_externals */ \"../../js/node/bis_externals.js\");\n\nif (!webpack) {\n\n fs = bisexternals['fs'];\n zlib = bisexternals['zlib'];\n path = bisexternals['path'];\n os = bisexternals['os'];\n noderequest = bisexternals['request'];\n glob = bisexternals['glob'];\n rimraf= bisexternals['rimraf'];\n nodewin.atob = bisexternals['atob'];\n nodewin.btoa = bisexternals['btoa'];\n child_process= bisexternals['child_process'];\n colors= bisexternals['colors'];\n environment = 'node';\n} else {\n try {\n filesaver = bisexternals['FileSaver'];\n console.log(\"++++ BisWeb I/O Mode=Browser\");\n }\n catch(e) {\n/* if (typeof ( WorkerGlobalScope ) !== \"undefined\") {\n console.log(\"++++ In WebWorker\");\n }*/\n }\n environment = 'browser';\n}\n\n\nvar createBuffer = function (cdata) {\n if (cdata === null)\n return null;\n /* jshint ignore:start */\n if (Buffer.from && Buffer.from !== Uint8Array.from) {\n return Buffer.from(cdata);\n } \n\n return new Buffer(cdata);\n\n /* jshint ignore:end */\n};\n\n\nif (inelectron) {\n fs = window.BISELECTRON.fs;\n rimraf = window.BISELECTRON.rimraf;\n zlib = window.BISELECTRON.zlib;\n path = window.BISELECTRON.path;\n os = window.BISELECTRON.os;\n glob = window.BISELECTRON.glob;\n child_process= window.BISELECTRON['child_process'];\n colors= window.BISELECTRON['colors'];\n environment = 'electron';\n createBuffer = function (cdata) {\n return new window.BISELECTRON.Buffer(cdata);\n };\n}\n\n\n/**\n * Set the scope of the web worker\n*/\nconst setWebWorkerScope=function(w) {\n webWorkerScope=w;\n};\n\n\n/**\n * converts dataURL to a blob for saving\n * URL often created using canvas.toDataURL(\"image/png\");\n * @alias BisCoreGenericIO#dataURLToBlob\n * @param{URL} - dataURL \n * @returns{Blob}\n */\nconst dataURLToBlob = function(dataURL) {\n var BASE64_MARKER = ';base64,';\n var parts,contentType,raw;\n if (dataURL.indexOf(BASE64_MARKER) == -1) {\n parts = dataURL.split(',');\n contentType = parts[0].split(':')[1];\n raw = decodeURIComponent(parts[1]);\n return new Blob([raw], {type: contentType});\n }\n \n parts = dataURL.split(BASE64_MARKER);\n contentType = parts[0].split(':')[1];\n raw = window.atob(parts[1]);\n var rawLength = raw.length;\n \n var uInt8Array = new Uint8Array(rawLength);\n \n for (var i = 0; i < rawLength; ++i) {\n uInt8Array[i] = raw.charCodeAt(i);\n }\n return new Blob([uInt8Array], {type: contentType});\n};\n\n\n//console.log('//+++++ I/O='+environment);\n\n/**\n * A set of I/O helper functions to read and write text and binary data from/to various sources\n * This aims to abstract all I/O operations in BioImage Suite to a single location behind \n * a set of four functions readtext, readbinary, writetext and writebinary\n * @namespace BisCoreGenericIO\n */\n\n\n/** This is a type of function that is used as a callback from binary data loading\n * @function \n * @name BisCoreGenericIO.BinaryDataRead\n * @param {Uint8Array} data - the data that was read\n * @param {string} url - the filename/url that was read\n */\n\n/** This is a type of function that is used as a callback from text data loading\n * @function \n * @name BisCoreGenericIO.TextDataRead\n * @param {string} data - the data that was read\n * @param {string} url - the filename/url that was read\n */\n\n/** This is a type of function that is used as a callback from i/o operations either for error or success\n * @function \n * @name BisCoreGenericIO.MessageCallback\n * @param {string} message - a message about the operation\n */\n\n\n// -------------------------------------------- Utilities ---------------------------------------------------------------------\n\n/** inIOS. Checks if we are running in IOS\n * @alias BisCoreGenericIO#inIOS\n * @returns {boolean} \n */\nvar inIOS = function () {\n\n if (navigator.platform==='MacIntel') {\n // Test for Ipad that shows up as Mac\n let isTouchDevice = 'ontouchstart' in document.documentElement;\n if (isTouchDevice)\n return true;\n }\n \n \n try {\n if (/iP(hone|od|ad)/.test(navigator.platform)) {\n return true;\n }\n } catch(e) {\n return false;\n }\n return false;\n};\n\n\n/** is compressed. Checks if filename ends in .gz\n * @alias BisCoreGenericIO#iscompressed\n * @param {string} url - the filename or url\n * @returns {boolean} \n */\nvar iscompressed = function (fname) {\n\n fname = fname || '';\n try {\n let ext = fname.name ? fname.name.split('.').pop() : fname.split('.').pop();\n if (ext === \"gz\")\n return true;\n return false;\n } catch(e) {\n return true;\n }\n};\n\n\n\n/** Convert Uint8array to zbase64\n * @alias BisCoreGenericIO#tozbase64\n * @param {Uint8Array} input -- input string\n * @param {boolean} dogzip -- if true (default) compress\n * @returns {string} -- zbase64 (or base64) encoded string\n */\nvar tozbase64 = function (arr,dogzip=true) {\n\n let z_arr=arr;\n if (dogzip)\n z_arr = pako.gzip(arr);\n\n let binary = '';\n let bytes = z_arr;\n let len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n\n if (typeof ( WorkerGlobalScope ) !== \"undefined\") {\n return webWorkerScope.btoa(binary);\n }\n \n if (environment === 'node') {\n return nodewin.btoa(binary);\n }\n\n return window.btoa(binary);\n};\n\n/** convert zbase64 encoded string to Uint8Array\n * @alias BisCoreGenericIO#frombase64\n * @param {string} str -- zbase64 or base64 encoded string\n * @param {boolean} dogzip -- if true (default) uncompress else string is simply base64 encoded\n * @returns {Uint8Array} -- binary data\n */\nvar fromzbase64 = function (str,dogzip=true) {\n let arr=null;\n\n if (typeof ( WorkerGlobalScope ) !== \"undefined\") \n arr= webWorkerScope.atob(str);\n else if (environment === 'node')\n arr = nodewin.atob(str);\n else\n arr = window.atob(str);\n if (dogzip)\n return pako.ungzip(arr);\n return arr;\n};\n\n/** convert string to binary\n * @alias BisCoreGenericIO#string2binary\n * @param {string} str -- string\n * @param {boolean} donifti -- if true (default=false) make output a multple of 16 and add header\n * @returns {Uint8Array} data\n */\nlet string2binary=function(str,donifti=false) {\n\n str=str+\" \";\n let l=str.length+1;\n if (donifti) {\n let l2=Math.floor(l/16);\n let diff=16-(l-l2*16);\n if (diff>0) {\n let s2=\"\";\n for (let i=0;i<diff;i++)\n s2+=\" \";\n str=str+s2;\n }\n }\n\n let offset=0;\n let extra=0;\n if (donifti) {\n offset=8;\n extra=8;\n }\n\n let arr = new Uint8Array(str.length+offset+extra+1); \n for (let i=0;i < str.length; i++) {\n arr[i+offset] = str.charCodeAt(i);\n }\n arr[str.length+offset]=0;\n \n if (donifti) {\n let arr2=new Uint32Array(arr.buffer);\n arr2[0]=arr.length;\n arr2[1]=4;\n }\n \n return arr;\n\n\n};\n\n/** convert string to binary\n * @alias BisCoreGenericIO#binary2string\n * @param {Uint8Array} arr -- Uint8Array\n * @param {boolean} donifti -- if true (default=false) skip 8 byte offset\n * @returns {String} data\n */\nlet binary2string=function(arr,donifti) {\n\n let str=\"\";\n let len = arr.length-1;\n\n let offset=0;\n if (donifti)\n offset=8;\n \n for (let i = offset; i < len; i++) {\n if (arr[i]>0)\n str += String.fromCharCode(arr[i]);\n }\n return str;\n};\n\n\n// -------------------------------------------- Read Node ---------------------------------------------------------------------\n\nvar removeSpacesFromFilenameWin32Electron=function(s) {\n\n if (environment !== 'electron') {\n return s;\n }\n \n const os=getosmodule();\n if (os.platform()!=='win32')\n return s;\n\n let q=s.trim().replace(/%20/g,' ');\n return q;\n\n};\n\n/** handles payload from electron dialog */\nvar getElectronDialogFilename = function(obj) {\n\n if (obj.canceled)\n return null;\n\n if (obj.filePath)\n return obj.filePath+'';\n\n let filepaths=obj.filePaths;\n if (filepaths.length===1) \n return filepaths[0] + '';\n\n return filepaths;\n};\n\n\n\n/** read text data in node.js\n * @alias BisCoreGenericIO~readtextdatanode\n * @param {string} filename - the filename\n * @param {BisCoreGenericIO.TextDataRead} callback - callback function (arguments = data,filename)\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readtextdatanode = function (filename, loadedcallback, errorcallback) {\n\n filename=removeSpacesFromFilenameWin32Electron(filename);\n \n try {\n fs.readFile(filename, 'utf-8', (err, d1) => {\n if (err) {\n errorcallback(err);\n } else { \n loadedcallback(d1, filename);\n }\n });\n } catch (e) {\n errorcallback('failed to load from ' + filename);\n }\n};\n\n\n\n\n/** read binary data in node.js\n * if filename ends in .gz also decompress.\n * @alias BisCoreGenericIO~readbinarydatanode\n * @param {string} filename - the filename\n * @param {BisCoreGenericIO.BinaryDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readbinarydatanode = function (filename, loadedcallback, errorcallback) {\n\n filename=removeSpacesFromFilenameWin32Electron(filename);\n \n try {\n fs.readFile(filename, (err, d1) => {\n if (err) {\n console.log(' failed to read binary data error=' + err);\n errorcallback(' failed to read binary data error=' + err);\n }\n \n let comp = iscompressed(filename);\n if (comp) {\n zlib.gunzip(d1, function (err, data) {\n if (err) {\n try {\n let dt = pako.ungzip(new Uint8Array(d1));\n loadedcallback(dt, filename);\n dt = null;\n } catch(e) {\n console.log(' failed to read binary data error=' + err+' '+err.toString);\n errorcallback(' failed to read binary data error=' + err.toString);\n }\n } else {\n var dt = new Uint8Array(data);\n loadedcallback(dt, filename);\n dt = null;\n }\n });\n } else {\n let dt = new Uint8Array(d1);//.buffer;\n loadedcallback(dt, filename);\n dt = null;\n }\n });\n } catch(e) {\n errorcallback(e);\n }\n};\n\n// -------------------------------------------- Read Browser ---------------------------------------------------------------------\n\n// -------------------------------------------------------------------------------------\n/** read text data in browser.\n * @alias BisCoreGenericIO~readtextdatabrowser\n * @param {Blob} file - the file object\n * @param {BisCoreGenericIO.TextDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readtextdatabrowser = function (file, loadedcallback, errorcallback) {\n\n var reader = new FileReader();\n var url = file.name;\n\n reader.onerror = function (e) {\n errorcallback('failed to read ' + file.name + ' e=' + e);\n };\n\n reader.onload = function (e) {\n loadedcallback(e.target.result, url);\n };\n\n reader.readAsText(file);\n return false;\n};\n\n/** read binary data in browser.\n * if filename ends in .gz also decompress.\n * @alias BisCoreGenericIO~readbinarydatabrowser\n * @param {string} file - the file object\n * @param {BisCoreGenericIO.BinaryDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readbinarydatabrowser = function (file, loadedcallback, errorcallback) {\n\n var reader = new FileReader();\n var url = file.name;\n var comp = iscompressed(url);\n\n reader.onerror = function (e) {\n errorcallback('failed to read ' + file.name + ' e=' + e);\n };\n\n reader.onload = function (e) {\n\n var dat = new Uint8Array(e.target.result);\n if (!comp) {\n loadedcallback(dat, url);\n dat = null;\n return;\n }\n\n var a = pako.ungzip(dat);\n loadedcallback(a, url);\n a = null;\n dat = null;\n };\n\n reader.readAsArrayBuffer(file);\n return false;\n};\n\n// -------------------------------------------- Read URL ---------------------------------------------------------------------\n/** read data from url in node.js\n * @alias BisCoreGenericIO~readtextdataurl_node\n * @param {string} url - the url\n * @param {Boolean} binary - if true binary\n * @param {BisCoreGenericIO.TextDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readdatafromurl_node = function (url, binary,loadedcallback, errorcallback) {\n\n let settings= {\n url : url,\n method : 'GET',\n };\n\n if (binary) {\n settings.encoding=null;\n }\n \n noderequest(settings, function (error, response, body) {\n\n if (error!==null)\n errorcallback(error);\n\n if (!binary) {\n loadedcallback(body,url);\n return;\n }\n\n let dt=new Uint8Array(body);\n \n let comp = iscompressed(url);\n if (comp) \n dt = pako.ungzip(dt);\n \n loadedcallback(dt,url);\n });\n\n};\n\n/** read text data from url.\n * @alias BisCoreGenericIO~readtextdataurl\n * @param {string} url - the url\n * @param {BisCoreGenericIO.TextDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readtextdatafromurl = function (url, loadedcallback, errorcallback, requestheader = null, realname = null) {\n\n if (environment === 'node') \n return readdatafromurl_node(url,false,loadedcallback,errorcallback);\n\n \n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.responseType = 'text';\n\n if (requestheader !== null)\n xhr.setRequestHeader('Authorization', 'Bearer ' + requestheader);\n\n let actualname = realname || url;\n\n xhr.onload = function () {\n if (this.status == 200) {\n loadedcallback(xhr.response, actualname);\n } else {\n errorcallback('failed to read ' + url);\n }\n return false;\n };\n\n xhr.onerror = function () {\n errorcallback('Failed to get url=' + url);\n };\n\n xhr.send();\n return false;\n};\n\n/** read binary data from url.\n * if filename ends in .gz also decompress.\n * @alias BisCoreGenericIO~readbinarydataurl\n * @param {string} url - the url\n * @param {BisCoreGenericIO.BinaryDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readbinarydatafromurl = function (url, loadedcallback, errorcallback, requestheader = null, realname = null) {\n\n\n if (environment === 'node') \n return readdatafromurl_node(url,true,loadedcallback,errorcallback);\n\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n\n if (requestheader !== null)\n xhr.setRequestHeader('Authorization', 'Bearer ' + requestheader);\n\n let actualname = realname || url;\n let comp = iscompressed(actualname);\n\n xhr.onload = function () {\n if (this.status == 200) {\n var arr = new Uint8Array(xhr.response);\n if (!comp) {\n loadedcallback(arr, actualname);\n } else {\n var a = pako.ungzip(arr);\n loadedcallback(a, actualname);\n a = null;\n }\n arr = null;\n } else {\n errorcallback(url);\n }\n return false;\n };\n\n xhr.onerror = function () {\n errorcallback('Failed to get url=' + url);\n };\n\n xhr.send();\n return false;\n};\n\n// -------------------------------------------- Write Node ---------------------------------------------------------------------\n\n// -------------------------------------------------------------------------------------------------\n/** write text data in node.js\n * if filename ends in .gz also compress.\n * @alias BisCoreGenericIO~writetextdatanode\n * @param {string} filename - the filename\n * @param {string} data - the data to write\n * @param {BisCoreGenericIO.MessageCallback} donecallback - callback function if done\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar writetextdatanode = function (filename, data, donecallback, errorcallback) {\n // console.log('//----- write textdata node, type of data =',typeof(data));\n donecallback = donecallback || null;\n errorcallback = errorcallback || console.log;\n try {\n fs.writeFile(filename, data, (err) => {\n if (err) {\n errorcallback('Failed to save in ' + filename+' '+err);\n }\n if (donecallback !== null)\n donecallback(filename);\n });\n } catch (e) {\n errorcallback('Failed to save in ' + filename);\n }\n};\n\n/** write binary data in node.js\n * if filename ends in .gz also compress.\n * @alias BisCoreGenericIO~writebinarydatanode\n * @param {string} filename - the filename\n * @param {Uint8Array} data - the data to write (or optionally array)\n * @param {BisCoreGenericIO.MessageCallback} donecallback - callback function if done\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n * @param {Boolean} donotcompress - if true then no compression is done even if filename ends in .gz\n */\nvar writebinarydatanode = function (filename, data, donecallback, errorcallback,nocompress=false) {\n\n \n let donecompressing = function (cdata, mode) {\n try {\n let fd = fs.openSync(filename, 'w');\n let buf = createBuffer(cdata);\n fs.write(fd, buf, 0, buf.length, (err) => {\n if (err) {\n errorcallback('failed to save : ' + err);\n } else {\n fs.close(fd, (err) => {\n if (err) {\n errorcallback('failed to save : ' + err);\n } else {\n donecallback('saved in ' + filename + ' (file size=' + fs.statSync(filename)['size'] + ' '+mode+')');\n }\n });\n }\n });\n } catch (e) {\n errorcallback('failed to save : ' + e);\n }\n };\n\n if(iscompressed(filename) && nocompress===false) {\n let buf = createBuffer(data);\n zlib.gzip(buf, function (err, data) {\n if (err) {\n console.log(\"---- Compression failed\");\n errorcallback(' failed to save in ' + filename + ' err=' + err);\n buf = null;\n return;\n }\n donecompressing(data, true);\n });\n buf = null;\n } else {\n donecompressing(data, false);\n }\n\n};\n\n\n// -------------------------------------------- Write Browser ---------------------------------------------------------------------\n\n/** write text data in browser.\n * if filename ends in .gz also compress.\n * @alias BisCoreGenericIO~writetextdatabrowser\n * @param {string} filename - the filename\n * @param {string} data - the data to write\n * @param {BisCoreGenericIO.MessageCallback} donecallback - callback function if done\n */\nvar writetextdatabrowser = function (filename, data, donecallback) {\n\n donecallback = donecallback || console.log;\n\n var blob = new Blob([data], { type: \"application/octet-stream\" });\n\n filesaver(blob, filename);\n donecallback('');\n};\n\n/** write binary data in browser.\n * if filename ends in .gz also compress.\n * @alias BisCoreGenericIO~writebinarydatabrowser\n * @param {string} filename - the filename\n * @param {Uint8Array} data - the data to write (or optionally array)\n * @param {BisCoreGenericIO.MessageCallback} donecallback - callback function if done\n */\nvar writebinarydatabrowser = function (filename, data, donecallback) {\n donecallback = donecallback || console.log;\n\n\n var blob = null;\n var iscomp = iscompressed(filename);\n if (iscomp) {\n var compressed = pako.gzip(data);\n blob = new Blob([compressed],{ type: \"application/octet-stream\" });\n } else {\n blob = new Blob([data],{ type: \"application/octet-stream\" });\n }\n\n filesaver(blob, filename);\n donecallback('');\n};\n\n\n// -------------------------------------------------------------------------------------------------\n// Upload Methods\n// -------------------------------------------------------------------------------------------------\n/**\n * Attempts to upload the file to the cloud provider specified in file. Invokes the 'uploadFile' method of module to perform the action.\n * @param {Object} file \n * @param {Object} module\n */\n/*let uploadFile = function (file, module) {\n module.uploadFile(file);\n };*/\n\n// -------------------------------------------------------------------------------------------------\n// Combo Methods\n// -------------------------------------------------------------------------------------------------\n\n/** Generic read text data. Depending on environment and url calls one of \n * {@link BisCoreGenericIO~readtextdatanode}, {@link BisCoreGenericIO~readtextdatabrowser}, {@link BisCoreGenericIO~readtextdataurl}\n * @alias BisCoreGenericIO#readtextdata\n * @param {object} url - the url or filename or file object\n * @param {BisCoreGenericIO.TextDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readtextdata = function (url, loadedcallback, errorcallback) {\n\n url = url || null;\n if (url === null) {\n errorcallback('no filename/url specified');\n return;\n }\n\n if (typeof url === 'string') {\n if (url.indexOf('http')===0) {\n return readtextdatafromurl(url, loadedcallback, errorcallback);\n }\n }\n\n\n if (environment === 'node') {\n return readtextdatanode(url, loadedcallback, errorcallback);\n }\n\n\n if (environment === 'electron') {\n return readdataelectron(url, false, loadedcallback, errorcallback);\n }\n\n if (url.name !== undefined) {\n return readtextdatabrowser(url, loadedcallback, errorcallback);\n }\n\n return readtextdatafromurl(url, loadedcallback, errorcallback);\n};\n\n/** Generic read binary data. Depending on environment and url calls one of \n * {@link BisCoreGenericIO~readbinarydatanode}, {@link BisCoreGenericIO~readbinarydatabrowser}, {@link BisCoreGenericIO~readbinarydataurl}\n * @alias BisCoreGenericIO#readbinarydata\n * @param {object} url - the url or filename or file object\n * @param {BisCoreGenericIO.BinaryDataRead} callback - callback function\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar readbinarydata = function (url, loadedcallback, errorcallback) {\n\n url = url || null;\n if (url === null) {\n errorcallback('no filename/url specified');\n return;\n }\n\n if (typeof url === 'string') {\n if (url.indexOf('http')===0) {\n return readbinarydatafromurl(url, loadedcallback, errorcallback);\n }\n }\n\n\n if (environment === 'node') {\n return readbinarydatanode(url, loadedcallback, errorcallback);\n }\n\n\n if (environment === 'electron') {\n return readdataelectron(url, true, loadedcallback, errorcallback);\n }\n\n if (url.name !== undefined) {\n // We are in browser and have received a Files[] array\n // console.log('Now reading binary data in browser',url);\n return readbinarydatabrowser(url, loadedcallback, errorcallback);\n }\n\n\n\n return readbinarydatafromurl(url, loadedcallback, errorcallback);\n};\n\n/*\n\n\n// -------------------------------------------------------------------------------------------------\n\n/** Write data for electron Depending on environment\n * @alias BisCoreGenericIO#writedataelectron\n * @param {string} url - the url or filename or object of form\n * { title: 'dialog tile', filter : filters, ', filename : initial filename }\n * @param {boolean} isbinary - if true write binary data\n * @param {string} data - the data to write (or optionally array)\n * @param {BisCoreGenericIO.MessageCallback} callback - callback function if done\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar writedataelectron = function (url, data, isbinary, donecallback, errorcallback) {\n\n // console.log('//+++++ in writedataelectron binary='+isbinary);\n var writecommand = writetextdatanode;\n if (isbinary)\n writecommand = writebinarydatanode; //window.BISELECTRON.writebinarydata;\n\n if (url.filename !== undefined) {\n window.BISELECTRON.dialog.showSaveDialog(null, {\n title: url.title,\n defaultPath: url.filename,\n filters: url.filters\n }).then( (obj) => {\n\n let filename=getElectronDialogFilename(obj);\n if (filename) {\n return writecommand(filename + '', data, donecallback, errorcallback);\n }\n });\n } else {\n return writecommand(url, data, donecallback, errorcallback);\n }\n return;\n};\n\n/** Write data for electron Depending on environment\n * @alias BisCoreGenericIO#writedataelectron\n * @param {string} filename - the url or filename or object of form\n * { title: 'dialog tile', filter : filters, ', filename : initial filename }\n * @param {boolean} isbinary - if true read binary data\n * @param {BisCoreGenericIO.MessageCallback} donecallback - callback function if done\n * @param {BisCoreGenericIO.MessageCallback} errrorcallback - error callback function\n */\nvar readdataelectron = function (url, isbinary, donecallback, errorcallback) {\n\n var readcommand = readtextdatanode;\n if (isbinary)\n readcommand = readbinarydatanode;\n\n\n if (url.path !== undefined) {\n // console.log('//+++++ using url.path='+url.path);\n return readcommand(url.path, donecallback, errorcallback);\n }\n\n if (url.filename !== undefined) {\n window.BISELECTRON.dialog.showOpenDialog(null, {\n title: url.title,\n defaultPath: url.filename,\n filters: url.filters,\n }).then( (obj) => { \n let filename=getElectronDialogFilename(obj);\n if (filename) {\n return readcommand(filename + '', donecallback, errorcallback);\n }\n });\n } else {\n var path = window.BISELECTRON.path;\n var newurl = url + '';\n if (path.resolve(url) !== path.normalize(url))\n newurl = path.resolve(window.BISELECTRON.bispath, url);\n // console.log('//+++++ normalized as url='+newurl+' from '+url);\n return readcommand(newurl, donecallback, errorcallback);\n }\n return;\n};\n\n/** Generic write text data. Depending on environment\n * {@link BisCoreGenericIO~writetextdatanode} or {@link BisCoreGenericIO~writetextdatabrowser}\n * @alias BisCoreGenericIO#writetextdata\n * @param {string} filename - the url or filename or file object\n * @param {string} data - the data to write (or optionally array)\n * @param {BisCoreGenericIO.MessageCallback} callback - callback function if done\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\n\nvar writetextdata = function (url, data, donecallback, errorcallback) {\n\n url = url || null;\n if (url === null) {\n errorcallback('no filename/url specified');\n return;\n }\n\n if (environment === 'node') {\n return writetextdatanode(url, data, donecallback, errorcallback);\n }\n\n if (environment === 'electron') {\n return writedataelectron(url, data, false, donecallback, errorcallback);\n }\n\n var filename = url;\n if (url.filename !== undefined)\n filename = url.filename;\n\n return writetextdatabrowser(filename, data, donecallback, errorcallback);\n};\n\n/** Generic write binary data. Depending on environment\n * {@link BisCoreGenericIO~writebinarydatanode} or {@link BisCoreGenericIO~writebinarydatabrowser}\n * @alias BisCoreGenericIO#writebinarydata\n * @param {string} filename - the url or filename or file object or an electron object with members \n * { title: 'dialog tile', filter : filters, ', filename : initial filename }\n * @param {Uint8Array} data - the data to write (or optionally array)\n * @param {BisCoreGenericIO.MessageCallback} callback - callback function if done\n * @param {BisCoreGenericIO.MessageCallback} errror - error callback function\n */\nvar writebinarydata = function (url, data, donecallback, errorcallback) {\n\n url = url || null;\n if (url === null) {\n errorcallback('no filename/url specified');\n return;\n }\n\n if (environment === 'node') {\n return writebinarydatanode(url, data, donecallback, errorcallback);\n }\n\n if (environment === 'electron') {\n return writedataelectron(url, data, true, donecallback, errorcallback);\n }\n\n var filename = url;\n if (url.filename !== undefined)\n filename = url.filename;\n\n return writebinarydatabrowser(filename, data, donecallback, errorcallback);\n};\n\n/** Return the fs package to use\n * @alias BisCoreGenericIO#getfsmodule\n * @returns{Module} \n */\nvar getfsmodule = function () {\n return fs;\n};\n\n\n/** Return the zlib package to use\n * @alias BisCoreGenericIO#getzlibmodule\n * @returns{Module} \n */\nvar getzlibmodule = function () {\n return zlib;\n};\n\n\n\n/** Return the path package to use\n * @alias BisCoreGenericIO#getpathmodule\n * @returns{Module} \n */\nvar getpathmodule = function () {\n return path;\n};\n\n/** Return the path package to use\n * @alias BisCoreGenericIO#getosmodule\n * @returns{Module} \n */\nvar getosmodule = function () {\n return os;\n};\n\n/** Return the path package to use\n * @alias BisCoreGenericIO#getglobmodule\n * @returns{Module} \n */\nvar getglobmodule = function () {\n return glob;\n};\n\n/** Return the path package to use\n * @alias BisCoreGenericIO#getrimrafmodule\n * @returns{Module} \n */\nvar getrimrafmodule = function () {\n return rimraf;\n};\n\n\n/* Return the colors package to use\n * @alias BisCoreGenericIO#getcolorsmodule\n * @returns{Module} \n */\nvar getcolorsmodule = function () {\n return colors;\n};\n\n\n/* Return the child process package to use\n * @alias BisCoreGenericIO#getchildprocessmodule\n * @returns{Module} \n */\nvar getchildprocessmodule = function () {\n return child_process;\n};\n\n// --------------------------------------------------------------------\n/** returns the image path for bisweb */\nlet getimagepath=function() {\n\n let imagepath=\"\";\n if (typeof window !== \"undefined\" && !inelectron) {\n let scope=window.document.URL.split(\"?\")[0];\n let index=scope.lastIndexOf(\"/\");\n if (scope.indexOf(\"external\")>0) {\n scope=scope.substr(0,index)+\"/../src/web/images\";\n console.log('external=',scope);\n } else {\n scope=scope.substr(0,index)+\"/images\";\n }\n