From 0a98edc4b7641b6bc99f88e6dc8e5ca08f30ed1d Mon Sep 17 00:00:00 2001 From: Austin Smith Date: Sat, 10 Aug 2024 07:47:00 -0400 Subject: [PATCH] v5.5.9 final --- build/hamsters.node.min.js | 2 +- build/hamsters.node.min.js.map | 2 +- build/hamsters.web.min.js | 2 +- build/hamsters.web.min.js.map | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/hamsters.node.min.js b/build/hamsters.node.min.js index 512f978b..db2c96de 100644 --- a/build/hamsters.node.min.js +++ b/build/hamsters.node.min.js @@ -111,7 +111,7 @@ module.exports = _classCallCheck(this, hamstersjs); - this.version = '5.5.10'; + this.version = '5.5.9'; this.run = this.hamstersRun.bind(this); this.promise = this.hamstersPromise.bind(this); this.init = this.inititializeLibrary.bind(this); diff --git a/build/hamsters.node.min.js.map b/build/hamsters.node.min.js.map index 5a1db9f3..55ef738f 100644 --- a/build/hamsters.node.min.js.map +++ b/build/hamsters.node.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap f8dca288b7aa8a8a99a1","webpack:///./hamsters.js","webpack:///./core/habitat.js","webpack:///./core/pool.js","webpack:///./core/data.js","webpack:///./core/wheel.js","webpack:///./core/task.js","webpack:///./feature/memoize.js","webpack:///./feature/stores/NodeStore.js","webpack:///./feature/stores/WebStore.js","webpack:///./feature/distribute.js"],"names":["hamstersjs","version","run","hamstersRun","bind","promise","hamstersPromise","init","inititializeLibrary","data","pool","wheel","habitat","memoize","startOptions","Data","Pool","Wheel","Habitat","Memoize","distribute","Distribute","processStartOptions","legacy","persistence","spawnHamsters","maxThreads","relay","console","info","establishConnection","Object","keys","key","includes","toLowerCase","forceLegacyMode","Worker","isIE","task","resolve","reject","input","memoizedFunction","scheduleTask","then","catch","params","functionToRun","Promise","Task","onSuccess","onError","hamsters","module","exports","debug","importScripts","browser","isBrowser","webWorker","isWebWorker","node","isNode","reactNative","isReactNative","shell","isShell","transferable","supportsTransferableObjects","atomics","supportsAtomicOperations","proxies","supportsProxies","isInternetExplorer","selectHamsterWheel","sharedWorker","locateSharedWorkerObject","locateBlobBuilder","findAvailableBlobBuilder","isLegacyEnvironment","locateWorkerObject","determineGlobalThreads","getHabitatKeys","max","navigator","hardwareConcurrency","isFirefox","os","cpus","length","userAgent","indexOf","SharedWorker","window","process","product","isLegacy","supportsSharedWorkers","supports","workerBlob","generateWorkerBlob","SharedHamster","e","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","textContent","Blob","BlobMaker","blob","append","type","getBlob","workerLogic","URL","createObjectURL","createDataBlob","String","Uint8Array","SharedArrayBuffer","Proxy","regular","threads","running","pending","fetchHamster","getAvailableThread","index","hamsterFood","scheduler","metrics","count","enqueued_at","Date","now","push","hamster","item","id","dequeued_at","runTask","threadId","spawnHamster","started_at","workers","parentPort","hamsterWheel","subTaskId","array","getSubArrayFromIndex","sharedBuffer","excludedKeys","Set","hasOwnProperty","has","incomingMessage","targetClient","handleResponse","returnDistributedOutput","messageId","isReply","keepTrackOfThread","trainHamster","feedHamster","prepareMeal","addWorkToPending","distributeTask","output","processDataType","dataType","aggregate","aggregateThreadOutputs","sort","sortOutput","completed_at","splice","message","response","messageData","JSON","parse","undefined","mixedOutput","addThreadOutputWithIndex","onThreadResponse","port","onmessage","onmessageerror","onerror","once","processReturn","removeFromRunning","returnOutputAndRemoveTask","terminate","queueHamster","processQueuedItem","shift","setOnMessage","i","indexes","getSubArrayUsingIndex","getSubArrayIndexes","calculateIndexes","sortTaskOutput","typedArrayFromBuffer","prepareFunction","prepareWorkerTask","messageWorkerThread","getBufferSize","createSharedBuffer","getDataType","setupSharedArrayBuffer","postMessage","stringify","getTransferableObjects","obj","typedArrayBuffers","transferableObjects","typedArrayTypes","otherTransferables","globalContext","global","prop","buffer","concat","types","Uint32Array","Uint16Array","Uint8ClampedArray","Int32Array","Int16Array","Int8Array","Float32Array","Float64Array","functionBody","functionString","substring","arr","order","Array","prototype","call","a","b","reverse","byteLength","sharedArray","constructor","set","reduce","len","bufferLength","offset","outputLength","start","n","end","segmentSize","Math","floor","startIndex","endIndex","inputArray","slice","worker","workerScaffold","regularScaffold","legacyScaffold","self","rtn","addEventListener","incomingConnection","ports","eval","hamstersJob","buffers","handleDataType","returnResponse","allTypes","add","from","setupLegacyTask","setupModernTask","setupDebugMetrics","created_at","setupThreadMetrics","threadMetrics","maxSize","store","NodeStore","WebStore","func","generateTaskKey","get","cachedResult","applyFunc","result","hashCode","str","hash","chr","charCodeAt","toString","args","apply","error","cache","Map","value","delete","size","oldestKey","next","clear","dbName","storeName","db","initDB","request","indexedDB","open","event","target","onupgradeneeded","objectStoreNames","contains","objectStore","createObjectStore","keyPath","createIndex","unique","onsuccess","transaction","updateTimestamp","checkSize","put","timestamp","countRequest","evictOldest","openCursor","cursor","localConnection","remoteConnections","sendChannels","receiveChannels","pcConstraint","dataConstraint","ws","clientId","pendingPromises","sendDataResponse","latencies","initWebSocket","WebSocket","onopen","registerMessage","logicalCores","send","handleClientReconnect","updateClientList","clients","handleOffer","handleAnswer","handleCandidate","handleTaskResponse","onclose","forEach","client","createConnection","newClientId","log","close","loadClientList","fetch","json","servers","iceServers","urls","RTCPeerConnection","sendChannel","createDataChannel","onicecandidate","candidate","onSendChannelStateChange","handlePing","startTime","handlePong","onReceiveMessageCallback","ondatachannel","receiveChannelCallback","createOffer","setLocalDescription","desc","offer","onCreateSessionDescriptionError","remoteConnection","setRemoteDescription","RTCSessionDescription","createAnswer","answer","connection","addIceCandidate","RTCIceCandidate","onAddIceCandidateError","performance","sendPing","readyState","latency","toFixed","sendChannelKeys","warn","minLatency","Infinity","channel","fetchDistributedClient","generateUniqueId","subTask","sendData","pendingPromise","receiveChannel","onReceiveChannelStateChange","runDistributedTask","measureLatency","random","substr"],"mappings":"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","file":"hamsters.node.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap f8dca288b7aa8a8a99a1","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nimport Habitat from './core/habitat';\nimport Pool from './core/pool';\nimport Data from './core/data';\nimport Wheel from './core/wheel';\nimport Task from './core/task';\n\n//Features\nimport Memoize from './feature/memoize';\nimport Distribute from './feature/distribute';\n\nclass hamstersjs {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor() {\n 'use strict';\n\n this.version = '5.5.10';\n this.run = this.hamstersRun.bind(this);\n this.promise = this.hamstersPromise.bind(this);\n this.init = this.inititializeLibrary.bind(this);\n this.data = {};\n this.pool = {};\n this.wheel = {};\n this.habitat = {};\n this.memoize = {};\n }\n\n /**\n * @function inititializeLibrary - Prepares & initializes Hamsters.js library\n * @param {object} startOptions - Provided library functionality options\n */\n inititializeLibrary(startOptions) {\n this.data = new Data(this);\n this.pool = new Pool(this);\n this.wheel = new Wheel(this);\n this.habitat = new Habitat(this);\n this.memoize = new Memoize(this, 100); //Set a maximum of 100 memoized function results, LRU cache\n this.distribute = new Distribute(this);\n\n this.processStartOptions(startOptions);\n \n if(!this.habitat.legacy && this.habitat.persistence === true) {\n this.pool.spawnHamsters(this.habitat.maxThreads);\n }\n this.maxThreads = this.habitat.maxThreads;\n\n if(this.habitat.relay) {\n console.info(`Hamsters.js ${this.version} establishing connection to relay`);\n this.distribute.establishConnection();\n }\n\n console.info(`Hamsters.js ${this.version} initialized using up to ${this.habitat.maxThreads} threads`);\n }\n\n /**\n * @function processStartOptions - Adjusts library functionality based on provided options\n * @param {object} startOptions - Provided library functionality options\n */\n processStartOptions(startOptions) {\n if (typeof startOptions !== 'undefined') {\n for (const key of Object.keys(startOptions)) {\n if (this.habitat.keys.includes(key.toLowerCase())) {\n this.habitat[key] = startOptions[key];\n } else {\n this[key] = startOptions[key];\n }\n }\n }\n // Ensure legacy mode is disabled when we pass a third party worker library\n let forceLegacyMode = (typeof startOptions !== 'undefined' && typeof startOptions.legacy !== 'undefined');\n if (forceLegacyMode) {\n forceLegacyMode = startOptions.legacy;\n }\n if (typeof this.habitat.Worker === 'function' && !forceLegacyMode) {\n this.habitat.legacy = this.habitat.isIE;\n }\n }\n\n /**\n * @async\n * @function scheduleTask - Schedules a new function to be processed by the library\n * @param {object} task - Provided library execution options\n * @param {function} resolve - Parent function promise resolve method\n * @param {function} reject - Parent function promise reject method\n * @return {Promise} Promise object on completion\n */\n scheduleTask(task, resolve, reject) {\n if (task.input.memoize) {\n // Pass the task object to the memoized function\n const memoizedFunction = this.memoize.memoize(() => this.pool.scheduleTask(task));\n return memoizedFunction(task).then(resolve).catch(reject);\n }\n return this.pool.scheduleTask(task)\n .then(resolve)\n .catch(reject);\n }\n\n /**\n * @async\n * @function hamstersPromise - Calls library functionality using async promises\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n * @return {Promise} Promise resolving with results from functionToRun\n */\n hamstersPromise(params, functionToRun) {\n return new Promise((resolve, reject) => {\n this.scheduleTask(new Task(this, params, functionToRun), resolve, reject);\n });\n }\n\n /**\n * @async\n * @function hamstersRun - Calls library functionality using async callbacks\n * @param {object} params - Provided library execution options\n * @param {function} onError - Function to call upon execution failure\n * @return {array} Results from functionToRun.\n */\n hamstersRun(params, functionToRun, onSuccess, onError) {\n this.scheduleTask(new Task(this, params, functionToRun), onSuccess, onError);\n }\n}\n\nconst hamsters = new hamstersjs();\n\nmodule.exports = hamsters;\n\n\n\n// WEBPACK FOOTER //\n// ./hamsters.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Habitat {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.debug = false;\n this.importScripts = null;\n this.relay = null;\n this.memoize = false;\n this.persistence = true;\n this.browser = this.isBrowser();\n this.webWorker = this.isWebWorker();\n this.node = this.isNode();\n this.reactNative = this.isReactNative();\n this.shell = this.isShell();\n this.transferable = this.supportsTransferableObjects();\n this.atomics = this.supportsAtomicOperations();\n this.proxies = this.supportsProxies();\n this.isIE = this.isInternetExplorer();\n this.selectHamsterWheel = this.selectHamsterWheel.bind(this);\n this.sharedWorker = this.locateSharedWorkerObject();\n this.locateBlobBuilder = this.findAvailableBlobBuilder();\n this.legacy = this.isLegacyEnvironment();\n this.Worker = this.locateWorkerObject();\n this.maxThreads = this.determineGlobalThreads();\n this.keys = this.getHabitatKeys();\n }\n\n /**\n * @function determineGlobalThreads - Determines max number of threads to use\n */\n determineGlobalThreads() {\n let max = 4;\n if(this.browser && typeof navigator.hardwareConcurrency !== \"undefined\") {\n max = navigator.hardwareConcurrency;\n if(this.isFirefox()) {\n max = (max > 20 ? 20 : max);\n }\n }\n if(this.node && typeof os !== 'undefined') {\n max = os.cpus().length;\n }\n return max;\n }\n\n /**\n * @function isFirefox - Detect firefox browser\n */\n isFirefox() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.toLowerCase().indexOf('firefox') !== -1);\n }\n return false;\n }\n\n /**\n * @function locateWorkerObject - Attempts to find a global Worker object\n */\n locateWorkerObject() {\n return (typeof Worker !== 'undefined' ? Worker : false);\n }\n\n /**\n * @function locateSharedWorkerObject - Attempts to find a global SharedWorker object\n */\n locateSharedWorkerObject() {\n return (typeof SharedWorker !== 'undefined' ? SharedWorker : false);\n }\n\n /**\n * @function isBrowser - Detects if execution environment is a browser\n */\n isBrowser() {\n return (typeof window === \"object\");\n }\n\n /**\n * @function isInternetExplorer - Detects if execution environment is internet explorer\n */\n isInternetExplorer() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.indexOf(\"MSIE \") !== -1 || navigator.userAgent.indexOf(\"Trident/\") !== -1);\n }\n return false;\n }\n\n /**\n * @function isNode - Detects if execution environment is node.js\n */\n isNode() {\n return (typeof process === \"object\" && typeof require === \"function\" && !this.isWebWorker() && !this.browser);\n }\n\n /**\n * @function isWebWorker - Detects if execution environment is a web worker\n */\n isWebWorker() {\n return (typeof importScripts === \"function\" && !this.isReactNative());\n }\n\n /**\n * @function isReactNative - Detects if execution environment is React Native\n */\n isReactNative() {\n return (typeof navigator !== \"undefined\" && typeof navigator.product !== \"undefined\" && navigator.product === \"ReactNative\");\n }\n\n /**\n * @function isShell - Detects if execution environment is a shell\n */\n isShell() {\n return ((typeof navigator === \"undefined\") && !this.isNode() && !this.isWebWorker() && !this.isReactNative());\n }\n\n /**\n * @function isLegacyEnvironment - Detects if execution environment is a legacy environment\n */\n isLegacyEnvironment() {\n let isLegacy = !!!this.Worker;\n // Detect sharedWorker support for use within webworkers\n if (this.isWebWorker() && typeof this.SharedWorker !== 'undefined') {\n isLegacy = !this.supportsSharedWorkers();\n }\n return isLegacy;\n }\n\n /**\n * @function supportsSharedWorkers - Detects if execution environment supports SharedWorkers\n */\n supportsSharedWorkers() {\n let supports = false;\n try {\n let workerBlob = this.generateWorkerBlob(this.selectHamsterWheel());\n let SharedHamster = new this.SharedWorker(workerBlob, 'SharedHamsterWheel');\n supports = true;\n } catch (e) {\n supports = false;\n }\n return supports;\n }\n\n /**\n * @function findAvailableBlobBuilder - Attempts to locate a data blob builder, with vendor prefixes\n */\n findAvailableBlobBuilder() {\n if(typeof BlobBuilder !== 'undefined') {\n return BlobBuilder;\n }\n if(typeof WebKitBlobBuilder !== 'undefined') {\n return WebKitBlobBuilder;\n }\n if(typeof MozBlobBuilder !== 'undefined') {\n return MozBlobBuilder;\n }\n if(typeof MSBlobBuilder !== 'undefined') {\n return MSBlobBuilder;\n }\n return 'Environment does not support data blobs!';\n }\n\n /**\n * @function createDataBlob - Creates a new data blob from textContent\n * @param {string} textContent - Provided text content for blob\n */\n createDataBlob(textContent) {\n if(typeof Blob === 'undefined') {\n let BlobMaker = this.locateBlobBuilder();\n let blob = new BlobMaker();\n blob.append([textContent], {\n type: 'application/javascript'\n });\n return blob.getBlob();\n }\n return new Blob([textContent], {\n type: 'application/javascript'\n });\n }\n\n /**\n * @function generateWorkerBlob - Creates a blob URI for flexible scaffold loading\n * @param {function} workerLogic - Scaffold to use within worker thread\n */\n generateWorkerBlob(workerLogic) {\n return URL.createObjectURL(this.createDataBlob('(' + String(workerLogic) + ')();'));\n }\n\n /**\n * @function supportsTransferableObjects - Detects if execution environment supports typed arrays\n */\n supportsTransferableObjects() {\n return (typeof Uint8Array !== 'undefined');\n }\n\n /**\n * @function supportsAtomicOperations - Detects if execution environment supports SharedArrayBuffers\n */\n supportsAtomicOperations() {\n return (typeof SharedArrayBuffer !== 'undefined');\n }\n\n /**\n * @function supportsProxies - Detects if execution environment supports Proxy objects\n */\n supportsProxies() {\n return (typeof Proxy !== 'undefined');\n }\n\n /**\n * @function selectHamsterWheel - Determines which scaffold to use for proper execution for various environments\n */\n selectHamsterWheel() {\n if(this.isIE) {\n return this.hamsters.wheel.legacy;\n }\n if(this.reactNative) {\n return 'reactNativeHamster.js';\n }\n if (this.node) {\n return './node_modules/hamsters.js/build/common/node.js';\n }\n return this.generateWorkerBlob(this.hamsters.wheel.regular);\n }\n\n /**\n * @function getHabitatKeys - Returns keys for this Habitat instance\n */\n getHabitatKeys() {\n return [\n 'worker','sharedworker',\n 'legacy','proxies',\n 'reactnative','atomics',\n 'transferable','browser',\n 'shell','node','debug',\n 'persistence','importscripts',\n 'maxthreads', 'parentport',\n 'webworker', 'relay'\n ];\n }\n}\n\nmodule.exports = Habitat;\n\n\n// WEBPACK FOOTER //\n// ./core/habitat.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Pool {\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.threads = [];\n this.running = [];\n this.pending = [];\n this.fetchHamster = this.getAvailableThread.bind(this);\n }\n\n /**\n * @function addWorkToPending - Adds task to queue waiting for available thread\n * @param {number} index - Index of the task\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n addWorkToPending(index, hamsterFood, task, resolve, reject) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[task.scheduler.count].enqueued_at = Date.now();\n }\n this.pending.push({\n index,\n hamsterFood, \n task,\n resolve,\n reject\n });\n }\n\n /**\n * @function processQueuedItem - Invokes processing of next item in queue\n * @param {object} hamster - The thread to run the task\n * @param {object} item - Task to process\n */\n processQueuedItem(hamster, item) {\n if (this.hamsters.habitat.debug) {\n item.task.scheduler.metrics.threads[item.index.id].dequeued_at = Date.now();\n }\n return this.runTask(hamster, item.index, item.hamsterFood, item.task, item.resolve, item.reject);\n }\n\n /**\n * @function getAvailableThread - Gets an available thread\n * @param {number} threadId - Id of the thread\n * @returns {object} - The available thread\n */\n getAvailableThread(threadId) {\n if (this.hamsters.habitat.persistence) {\n return this.threads[threadId];\n }\n return this.spawnHamster();\n }\n\n /**\n * @function keepTrackOfThread - Keeps track of threads running, scoped globally and to task\n * @param {object} task - Provided library functionality options for this task\n * @param {number} id - Id of thread to track\n */\n keepTrackOfThread(task, id) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[id].started_at = Date.now();\n }\n task.scheduler.workers.push(id);\n this.running.push(id);\n }\n\n /**\n * @function spawnHamsters - Spawns multiple new threads for execution\n * @param {number} maxThreads - Max number of threads for this client\n */\n spawnHamsters(maxThreads) {\n while (maxThreads--) {\n this.threads.push(this.spawnHamster());\n }\n }\n\n /**\n * @function spawnHamster - Spawns a new thread for execution\n * @return {object} - New WebWorker thread using selected scaffold\n */\n spawnHamster() {\n const { selectHamsterWheel, SharedWorker, Worker, node, parentPort } = this.hamsters.habitat;\n const hamsterWheel = selectHamsterWheel();\n if (this.hamsters.habitat.webWorker) {\n return new SharedWorker(hamsterWheel, 'SharedHamsterWheel');\n }\n if (node && typeof parentPort !== 'undefined') {\n return new Worker(hamsterWheel);\n }\n return new Worker(hamsterWheel);\n }\n \n /**\n * @function prepareMeal\n * @description Prepares message to send to a thread and invoke execution\n * @param {number} index - Index of the subarray to process\n * @param {number} subTaskId - Subtask ID\n * @param {object} task - Provided library functionality options for this task\n * @returns {object} - Prepared message to send to a thread\n */\n prepareMeal(index, subTaskId, task) {\n index.id = subTaskId;\n\n // Prepare the base hamsterFood object\n const hamsterFood = {\n array: task.input.array && task.input.array.length !== 0 ? \n this.hamsters.data.getSubArrayFromIndex(index, task.input.array) : [],\n index: index\n };\n\n // Add sharedBuffer if it exists\n if (typeof task.scheduler.sharedBuffer !== 'undefined') {\n hamsterFood.sharedBuffer = task.scheduler.sharedBuffer;\n }\n\n // List of excluded keys\n const excludedKeys = new Set(['array', 'threads', 'sharedArray']);\n\n // Iterate over task.input properties and add to hamsterFood\n for (const key in task.input) {\n if (task.input.hasOwnProperty(key) && !excludedKeys.has(key)) {\n hamsterFood[key] = task.input[key];\n }\n }\n\n return hamsterFood;\n }\n\n /**\n * @function runDistributedTask - Runs incoming distributed function using thread\n * @param {object} incomingMessage - The incoming subTask object\n */\n runDistributedTask(incomingMessage, targetClient) {\n const hamster = this.fetchHamster(this.running.length);\n let task = incomingMessage.task;\n let index = incomingMessage.hamsterFood.index;\n let handleResponse = this.hamsters.distribute.returnDistributedOutput;\n task.targetClient = targetClient;\n task.messageId = incomingMessage.messageId;\n task.isReply = true;\n\n this.runTask(hamster, index, incomingMessage.hamsterFood, incomingMessage.task, handleResponse, handleResponse);\n }\n\n\n\n /**\n * @function runTask - Runs function using thread\n * @param {object} hamster - The thread to run the task\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n runTask(hamster, index, hamsterFood, task, resolve, reject) {\n const threadId = this.running.length;\n this.hamsters.pool.keepTrackOfThread(task, threadId);\n if (this.hamsters.habitat.legacy) {\n this.hamsters.wheel.legacy(hamsterFood, resolve, reject);\n } else {\n this.hamsters.pool.trainHamster(index, task, threadId, hamster, resolve, reject);\n this.hamsters.data.feedHamster(hamster, hamsterFood);\n }\n task.scheduler.count += 1;\n }\n\n /**\n * @function hamsterWheel - Runs or queues function using threads\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n hamsterWheel(index, subTaskId, task, resolve, reject) {\n const hamsterFood = this.prepareMeal(index, subTaskId, task);\n if (this.hamsters.habitat.maxThreads <= this.running.length) {\n this.addWorkToPending(index, hamsterFood, task, resolve, reject);\n } else {\n if(task.input.distribute) {\n this.hamsters.distribute.distributeTask(task, hamsterFood, resolve, reject);\n } else {\n const hamster = this.fetchHamster(this.running.length);\n this.runTask(hamster, index, hamsterFood, task, resolve, reject);\n }\n }\n }\n\n processDistributedReturn(data) {\n debugger;\n }\n\n /**\n * @function returnOutputAndRemoveTask - Gathers thread outputs into final result\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n */\n returnOutputAndRemoveTask(task, resolve) {\n if(task.scheduler.sharedBuffer) {\n task.output = hamsters.data.processDataType(task.input.dataType, task.scheduler.sharedBuffer);\n }\n if(task.input.aggregate) {\n task.output = this.hamsters.data.aggregateThreadOutputs(task.output, task.input.dataType);\n }\n if(task.input.sort) {\n task.output = this.hamsters.data.sortOutput(task.output, task.input.sort)\n }\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.completed_at = Date.now();\n console.info(\"Hamsters.js Task Completed: \", task);\n }\n if(task.input.distribute) {\n resolve(task);\n } else {\n resolve(task.output);\n }\n }\n\n /**\n * @function removeFromRunning - Removes a thread from the running pool\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to remove\n */\n removeFromRunning(task, threadId) {\n this.running.splice(this.running.indexOf(threadId), 1);\n task.scheduler.workers.splice(task.scheduler.workers.indexOf(threadId), 1);\n }\n\n /**\n * @function processReturn - Processes the returned message from a thread\n * @param {number} index - Index of the subarray processed\n * @param {object} message - Message returned from the thread\n * @param {object} task - Provided library functionality options for this task\n */\n processReturn(index, message, task) {\n const isReactNative = this.hamsters.habitat.reactNative;\n const isNode = this.hamsters.habitat.node;\n const response = message.data;\n const messageData = isReactNative ? JSON.parse(message).data : (response.data !== undefined ? response.data : response);\n const threadId = isNode ? message.index.id : response.index.id;\n\n if (task.scheduler.threads !== 1) {\n if (isReactNative || task.input.mixedOutput) {\n task.output[threadId] = messageData;\n } else {\n this.hamsters.data.addThreadOutputWithIndex(task, index, messageData);\n }\n } else {\n task.output = messageData;\n }\n }\n\n /**\n * @function setOnMessage - Sets the message handlers for a thread\n * @param {object} hamster - The thread to set the handlers on\n * @param {function} onThreadResponse - Handler for thread response\n * @param {object} habitat - Habitat configuration\n * @param {function} reject - onError method\n */\n setOnMessage(hamster, onThreadResponse, reject) {\n if (this.hamsters.habitat.webWorker) {\n hamster.port.onmessage = onThreadResponse;\n hamster.port.onmessageerror = reject;\n hamster.port.onerror = reject;\n } else if (this.hamsters.habitat.node) {\n hamster.once('message', onThreadResponse);\n hamster.once('onmessageerror', reject);\n hamster.once('error', reject);\n } else {\n hamster.onmessage = onThreadResponse;\n hamster.onmessageerror = reject;\n hamster.onerror = reject;\n }\n }\n\n /**\n * @function trainHamster - Trains thread in how to behave\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to train\n * @param {object} hamster - The thread to train\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n trainHamster(index, task, threadId, hamster, resolve, reject) {\n const onThreadResponse = (message) => {\n this.hamsters.pool.processReturn(index, message, task);\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[threadId].completed_at = Date.now();\n }\n this.hamsters.pool.removeFromRunning(task, threadId);\n if (task.scheduler.workers.length === 0 && task.scheduler.count === task.scheduler.threads) {\n this.hamsters.pool.returnOutputAndRemoveTask(task, resolve);\n }\n if (!this.hamsters.habitat.persistence) {\n hamster.terminate();\n }\n if (this.hamsters.pool.pending.length !== 0) {\n const queueHamster = this.hamsters.pool.fetchHamster(this.hamsters.pool.running.length);\n this.hamsters.pool.processQueuedItem(queueHamster, this.hamsters.pool.pending.shift());\n }\n };\n this.hamsters.pool.setOnMessage(hamster, onThreadResponse, reject);\n }\n\n /**\n * @function scheduleTask - Adds new task to the system for execution\n * @param {object} task - Provided library functionality options for this task\n */\n scheduleTask(task) {\n let i = 0;\n \treturn new Promise((resolve, reject) => {\n if(this.hamsters.debug) {\n task.scheduler.metrics.started_at = Date.now();\n }\n while (i < task.scheduler.threads) {\n this.hamsterWheel(task.scheduler.indexes[i], i, task, resolve, reject);\n i += 1;\n }\n });\n }\n}\n\nmodule.exports = Pool;\n\n\n// WEBPACK FOOTER //\n// ./core/pool.js","class Data {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters; // Set the hamsters object as a property of Data class\n this.getSubArrayFromIndex = this.getSubArrayUsingIndex.bind(this); // Bind getSubArrayUsingIndex function\n this.getSubArrayIndexes = this.calculateIndexes.bind(this); // Bind calculateIndexes function\n this.sortOutput = this.sortTaskOutput.bind(this); // Bind sortTaskOutput function\n this.aggregateThreadOutputs = this.aggregateThreadOutputs.bind(this);\n this.processDataType = this.typedArrayFromBuffer;\n this.prepareFunction = this.prepareWorkerTask.bind(this); // Bind prepareWorkerTask function\n this.feedHamster = this.messageWorkerThread.bind(this); // Bind messageWorkerThread function\n this.getBufferSize = this.getBufferSize;\n this.createSharedBuffer = this.createSharedBuffer.bind(this);\n this.getDataType = this.getDataType;\n this.setupSharedArrayBuffer = this.setupSharedArrayBuffer.bind(this);\n }\n\n /**\n * @function messageWorkerThread - Prepares message to send to thread\n * @param {object} hamstersHabitat - Hamsters Habitat instance\n * @param {Worker} hamster - Thread to message\n * @param {object} hamsterFood - Message to send to thread\n */ \n messageWorkerThread(hamster, hamsterFood) {\n if(this.hamsters.habitat.reactNative) {\n return hamster.postMessage(JSON.stringify(hamsterFood));\n }\n if (this.hamsters.habitat.webWorker) {\n return hamster.port.postMessage(hamsterFood);\n }\n return hamster.postMessage(hamsterFood, this.hamsters.data.getTransferableObjects(hamsterFood));\n }\n\n getTransferableObjects(obj) {\n const typedArrayBuffers = [];\n const transferableObjects = [];\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n const globalContext = typeof window !== 'undefined' ? window : global;\n \n for (const prop in obj) {\n for (const type of typedArrayTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n typedArrayBuffers.push(obj[prop].buffer);\n break;\n }\n }\n \n for (const type of otherTransferables) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n transferableObjects.push(obj[prop]);\n break;\n }\n }\n }\n \n return typedArrayBuffers.concat(transferableObjects);\n }\n\n /**\n * @function typedArrayFromBuffer - Converts buffer into new typed array\n * @param {string} dataType - Typed array type for this task\n * @param {object} buffer - Buffer to convert\n */\n typedArrayFromBuffer(dataType, buffer) {\n const types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if(!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n /**\n * @function prepareWorkerTask - Prepares function for thread, strips whitespace\n * @param {function} functionBody - Message to send to thread\n */\n prepareWorkerTask(functionBody) {\n let functionString = String(functionBody);\n return functionString.substring((functionString.indexOf(\"{\") + 1), (functionString.length -1));\n }\n\n /**\n * @function sortTaskOutput - Sorts array by defined order\n * @param {object} arr - Array to sort\n * @param {string} order - Defined sort order\n */\n sortTaskOutput(arr, order) {\n switch(order) {\n case 'desc':\n case 'asc':\n return Array.prototype.sort.call(arr, function(a, b) {\n return (order === 'asc' ? (a - b) : (b - a)); \n });\n case 'ascAlpha':\n return arr.sort();\n case 'descAlpha':\n return arr.reverse();\n default:\n return arr;\n }\n }\n\n /**\n * @function getBufferSize - Gets the byte length of the input array\n * @param {TypedArray} array - The input typed array\n * @returns {number} - The byte length of the array\n */\n getBufferSize(array) {\n return array.byteLength;\n }\n\n /**\n * @function createSharedBuffer - Creates a SharedArrayBuffer based on the input array's byte length\n * @param {TypedArray} array - The input typed array\n * @returns {SharedArrayBuffer} - The created SharedArrayBuffer\n */\n createSharedBuffer(array) {\n const byteLength = this.getBufferSize(array);\n const sharedBuffer = new SharedArrayBuffer(byteLength);\n const sharedArray = new array.constructor(sharedBuffer);\n\n // Copy data from the input array to the shared array\n sharedArray.set(array);\n\n return sharedBuffer;\n }\n\n /**\n * @function setupSharedArrayBuffer - Sets up the shared buffer and corresponding typed array\n * @param {TypedArray} array - The input typed array\n * @returns {object} - SharedArrayBuffer;\n */\n setupSharedArrayBuffer(array) {\n return this.createSharedBuffer(array);\n }\n\n /**\n * @function aggregateThreadOutputs - Joins individual thread outputs into single result\n * @param {array} input - Array of arrays to aggregate\n * @param {string} dataType - Data type to use for typed array\n */\n aggregateThreadOutputs(input, dataType) {\n if(!dataType) {\n return input.reduce(function(a, b) {\n return a.concat(b);\n });\n }\n let i = 0;\n let len = input.length;\n let bufferLength = 0;\n for (i; i < len; i += 1) {\n bufferLength += input[i].length;\n }\n let output = this.processDataType(dataType, bufferLength);\n let offset = 0;\n for (i = 0; i < len; i += 1) {\n output.set(input[i], offset);\n offset += input[i].length;\n }\n return output;\n }\n\n /**\n * @function addThreadOutputWithIndex - Joins individual thread outputs into single result\n * @param {object} task - Hamsters task object\n * @param {object} index - Index information\n * @param {array} output - Output array\n */\n addThreadOutputWithIndex(task, index, output) {\n let i = 0;\n const outputLength = output.length;\n for (i; i < outputLength; i++) {\n task.output[(index.start + i)] = output[i];\n }\n }\n\n /**\n * @function calculateIndexes - Splits a single array into multiple equal sized subarrays\n * @param {array} array - Array to split\n * @param {number} n - Number of subarrays to create\n */\n calculateIndexes(array, n) {\n // If n is 1, return the whole array range\n if (n === 1) {\n return [{ start: 0, end: array.length - 1 }];\n }\n\n const indexes = [];\n const segmentSize = Math.floor(array.length / n);\n let startIndex = 0;\n\n for (let i = 0; i < n; i++) {\n const endIndex = startIndex + segmentSize - 1;\n indexes.push({ start: startIndex, end: endIndex });\n startIndex = endIndex + 1;\n }\n\n // Adjust the last segment to cover any remaining elements\n if (startIndex < array.length) {\n indexes[n - 1].end = array.length - 1;\n }\n\n return indexes;\n }\n \n\n /**\n * @function getSubArrayUsingIndex - Slices subarray based on provided index\n * @param {object} index - Index information\n * @param {object} inputArray - Hamsters task object\n */\n getSubArrayUsingIndex(index, inputArray) {\n return inputArray.slice(index.start, index.end + 1);\n }\n}\n\nmodule.exports = Data;\n\n\n// WEBPACK FOOTER //\n// ./core/data.js","class Wheel {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.worker = this.workerScaffold;\n this.regular = this.regularScaffold;\n this.legacy = this.legacyScaffold.bind(this);\n }\n\n /**\n * @function workerScaffold - Provides worker body for library functionality when used within a worker [threads inside threads]\n */\n workerScaffold() {\n self.params = {};\n self.rtn = {};\n\n addEventListener('connect', (incomingConnection) => {\n var port = incomingConnection.ports[0];\n port.start();\n port.addEventListener('message', (incomingMessage) => {\n this.params = incomingMessage.data;\n this.rtn = {\n data: [],\n dataType: this.params.dataType\n };\n eval(\"(\" + this.params.hamstersJob + \")\")();\n port.postMessage(this.rtn);\n }, false);\n }, false);\n }\n\n /**\n * @function regularScaffold - Provides worker body for library functionality\n */\n regularScaffold() {\n self.params = {};\n self.rtn = {};\n\n self.onmessage = function(message) {\n this.params = message.data;\n this.rtn = {\n data: [],\n dataType: (typeof this.params.dataType !== 'undefined' ? this.params.dataType : null),\n index: this.params.index\n };\n if (this.params.sharedBuffer) {\n this.params.sharedArray = typedArrayFromBuffer(this.params.dataType, this.params.sharedBuffer);\n }\n eval(this.params.hamstersJob);\n const buffers = handleDataType(this.rtn);\n returnResponse(this.rtn, buffers);\n }.bind(this);\n\n function handleDataType(rtn) {\n if (this.params.sharedArray) {\n // Do nothing here, we don't need to return a buffer rtn.data is useless here\n } else if(this.params.dataType) {\n rtn.data = typedArrayFromBuffer(rtn.dataType, rtn.data);\n }\n return getTransferableObjects(rtn); // Return transferable objects\n }\n\n function typedArrayFromBuffer(dataType, buffer) {\n var types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if (!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n function returnResponse(rtn, buffers) {\n if (buffers && buffers.length > 0) {\n // If there are buffers, postMessage with transferable objects\n postMessage(rtn, buffers);\n } else {\n // Otherwise, postMessage without transferable objects\n postMessage(rtn);\n }\n }\n\n function getTransferableObjects(obj) {\n const transferableObjects = new Set();\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n \n const globalContext = typeof self !== 'undefined' ? self : window;\n \n const allTypes = [...typedArrayTypes, ...otherTransferables];\n \n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n for (const type of allTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n if (typedArrayTypes.includes(type)) {\n transferableObjects.add(obj[prop].buffer);\n } else {\n transferableObjects.add(obj[prop]);\n }\n }\n }\n }\n }\n \n return Array.from(transferableObjects);\n }\n }\n\n\n /**\n * @function legacyScaffold - Provides library functionality for legacy devices\n */\n legacyScaffold(params, resolve, reject) {\n var rtn = {\n data: [],\n dataType: (typeof params.dataType !== \"undefined\" ? params.dataType : null)\n };\n if(this.hamsters.habitat.reactNative) {\n self.rtn = rtn;\n }\n if(this.hamsters.habitat.node || this.hamsters.habitat.isIE) {\n eval(params.hamstersJob);\n } else {\n params.hamstersJob();\n }\n resolve(rtn.data);\n }\n}\n\nmodule.exports = Wheel;\n\n\n\n// WEBPACK FOOTER //\n// ./core/wheel.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Task {\n /**\n * @constructor\n * @param {object} habitat - The environment settings\n * @param {object} data - Data utility methods\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n constructor(hamsters, params, functionToRun) {\n 'use strict';\n\n this.input = params;\n this.output = [];\n this.scheduler = {\n count: 0,\n threads: params.threads || 1,\n workers: []\n };\n \n if (hamsters.habitat.legacy) {\n this.setupLegacyTask(hamsters, functionToRun);\n } else {\n this.setupModernTask(hamsters, params, functionToRun);\n }\n \n if (hamsters.habitat.debug) {\n this.setupDebugMetrics();\n }\n }\n \n /**\n * @method setupLegacyTask\n * @description Sets up task for legacy environments\n * @param {function} functionToRun - Function to execute\n */\n setupLegacyTask(hamsters, functionToRun) {\n this.scheduler.threads = 1;\n if (!hamsters.habitat.node && !hamsters.habitat.isIE) {\n this.input.hamstersJob = functionToRun;\n }\n }\n \n /**\n * @method setupModernTask\n * @description Sets up task for modern environments\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n setupModernTask(hamsters, params, functionToRun) {\n this.input.hamstersJob = hamsters.habitat.legacy ? functionToRun : hamsters.data.prepareFunction(functionToRun);\n if (params.sharedArray && hamsters.habitat.atomics) {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.sharedArray, this.scheduler.threads);\n this.scheduler.sharedBuffer = hamsters.data.setupSharedArrayBuffer(params.sharedArray);\n this.input.sharedArray = []; //Reduce ram usage on main thread, do not preserve original array its no longer needed.\n } else {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.array, this.scheduler.threads);\n }\n }\n \n /**\n * @method setupDebugMetrics\n * @description Sets up debug metrics if debug mode is enabled\n */\n setupDebugMetrics() {\n this.scheduler.metrics = {\n created_at: Date.now(),\n started_at: null,\n completed_at: null,\n threads: this.setupThreadMetrics()\n };\n }\n\n setupThreadMetrics() {\n let i = 0;\n let threadMetrics = [];\n while(i < this.scheduler.threads) {\n threadMetrics.push({\n created_at: Date.now(),\n started_at: null,\n enqueued_at: null,\n dequeued_at: null,\n completed_at: null\n });\n i += 1;\n }\n return threadMetrics;\n }\n }\n \n module.exports = Task;\n \n\n\n// WEBPACK FOOTER //\n// ./core/task.js","import NodeStore from './stores/NodeStore';\nimport WebStore from './stores/WebStore';\n\nclass Memoize {\n constructor(hamsters, maxSize) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.store = this.hamsters.habitat.node ? new NodeStore(maxSize) : new WebStore('hamstersjs', 'cacheStore', maxSize);\n }\n\n memoize(func) {\n const self = this;\n return function(task) {\n const key = self.generateTaskKey(task);\n\n return new Promise(function(resolve, reject) {\n self.store.get(key).then(function(cachedResult) {\n if (cachedResult !== null) {\n resolve(cachedResult);\n } else {\n self.applyFunc(func, task).then(function(result) {\n self.store.set(key, result).then(function() {\n resolve(result);\n }).catch(reject);\n }).catch(reject);\n }\n }).catch(reject);\n });\n };\n }\n\n generateTaskKey(task) {\n const key = JSON.stringify({ input: task.input });\n return this.hashCode(key);\n }\n\n hashCode(str) {\n let hash = 0, i, chr;\n if (str.length === 0) return hash;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash.toString();\n }\n\n applyFunc(func, args) {\n return new Promise((resolve, reject) => {\n try {\n const result = func.apply(null, args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n\nmodule.exports = Memoize;\n\n\n// WEBPACK FOOTER //\n// ./feature/memoize.js","class NodeStore {\n constructor(maxSize) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key) {\n if (this.cache.has(key)) {\n const value = this.cache.get(key);\n // Refresh the key\n this.cache.delete(key);\n this.cache.set(key, value);\n return Promise.resolve(value);\n }\n return Promise.resolve(null);\n }\n\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n // Remove the oldest (least recently used) entry\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n clear() {\n this.cache.clear();\n return Promise.resolve();\n }\n}\n\nmodule.exports = NodeStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/NodeStore.js","class WebStore {\n constructor(dbName, storeName, maxSize) {\n this.dbName = dbName;\n this.storeName = storeName;\n this.maxSize = maxSize;\n this.db = null;\n this.initDB();\n }\n\n initDB() {\n const self = this;\n const request = indexedDB.open(this.dbName, 1);\n\n request.onerror = function(event) {\n console.error('Error opening database:', event.target.error);\n };\n\n request.onupgradeneeded = function(event) {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(self.storeName)) {\n const objectStore = db.createObjectStore(self.storeName, { keyPath: 'key' });\n objectStore.createIndex('by_key', 'key', { unique: true });\n objectStore.createIndex('by_timestamp', 'timestamp');\n }\n };\n\n request.onsuccess = function(event) {\n self.db = event.target.result;\n };\n }\n\n get(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve(null);\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const result = event.target.result;\n if (result) {\n self.updateTimestamp(key).then(() => resolve(result.value)).catch(reject);\n } else {\n resolve(null);\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n set(key, value) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n self.checkSize().then(() => {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.put({ key: key, value: value, timestamp: Date.now() });\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n }).catch(reject);\n });\n }\n\n clear() {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.clear();\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n checkSize() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const countRequest = objectStore.count();\n\n countRequest.onsuccess = function() {\n const count = countRequest.result;\n if (count >= self.maxSize) {\n self.evictOldest().then(resolve).catch(reject);\n } else {\n resolve();\n }\n };\n\n countRequest.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n evictOldest() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const index = objectStore.index('by_timestamp');\n const request = index.openCursor(null, 'next');\n\n request.onsuccess = function(event) {\n const cursor = event.target.result;\n if (cursor) {\n cursor.delete().onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n updateTimestamp(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const data = event.target.result;\n if (data) {\n data.timestamp = Date.now();\n objectStore.put(data).onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n}\n\nmodule.exports = WebStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/WebStore.js","class Distribute {\n\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.localConnection = null;\n this.remoteConnections = {};\n this.sendChannels = {};\n this.receiveChannels = {};\n this.pcConstraint = null;\n this.dataConstraint = null;\n this.ws = null;\n this.clientId = null;\n this.pendingPromises = {};\n this.returnDistributedOutput = this.sendDataResponse.bind(this);\n this.latencies = {};\n this.establishConnection = this.initWebSocket.bind(this);\n }\n\n initWebSocket() {\n this.ws = new WebSocket(`${this.hamsters.habitat.relay}`);\n\n this.ws.onopen = () => {\n console.info(`Hamsters.js ${this.hamsters.version} connection established`);\n const registerMessage = {\n type: 'register',\n logicalCores: this.hamsters.maxThreads\n };\n this.ws.send(JSON.stringify(registerMessage));\n };\n\n this.ws.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'register':\n this.handleClientReconnect(message);\n break;\n case 'update-client-list':\n this.updateClientList(message.clients);\n break;\n case 'offer':\n this.handleOffer(message);\n break;\n case 'answer':\n this.handleAnswer(message);\n break;\n case 'candidate':\n this.handleCandidate(message);\n break;\n case 'task-response':\n this.handleTaskResponse(message);\n break;\n default:\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} unknown message type: ${message.type}`);\n }\n }\n };\n\n this.ws.onerror = (error) => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} connection error: ${error}`);\n }\n };\n\n this.ws.onclose = () => {\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} connection closed.`);\n }\n };\n }\n\n updateClientList(clients) {\n clients.forEach(client => {\n if (client.id !== this.clientId && !this.remoteConnections[client.id]) {\n this.createConnection(client.id);\n }\n });\n }\n\n handleClientReconnect(message) {\n const newClientId = message.id;\n\n if (this.clientId === newClientId) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} connection error: `, error);\n }\n return;\n }\n\n if (this.remoteConnections[newClientId]) {\n this.remoteConnections[newClientId].close();\n delete this.remoteConnections[newClientId];\n }\n if (this.sendChannels[newClientId]) {\n this.sendChannels[newClientId].close();\n delete this.sendChannels[newClientId];\n }\n if (this.receiveChannels[newClientId]) {\n this.receiveChannels[newClientId].close();\n delete this.receiveChannels[newClientId];\n }\n delete this.latencies[newClientId];\n\n this.clientId = newClientId;\n this.loadClientList();\n }\n\n loadClientList() {\n fetch(`/clients?currentId=${this.clientId}`)\n .then(response => response.json())\n .then(data => {\n this.updateClientList(data);\n })\n .catch(error => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} Error fetching client list: ${error}`);\n }\n });\n }\n\n createConnections() {\n Object.keys(this.remoteConnections).forEach(targetClient => {\n this.createConnection(targetClient);\n });\n }\n\n createConnection(targetClient) {\n if (targetClient === this.clientId || this.remoteConnections[targetClient]) {\n return;\n }\n\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const localConnection = new RTCPeerConnection(servers, this.pcConstraint);\n const sendChannel = localConnection.createDataChannel('hamstersjs', this.dataConstraint);\n\n localConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n localConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n this.remoteConnections[targetClient] = localConnection;\n this.sendChannels[targetClient] = sendChannel;\n this.receiveChannels[targetClient] = null;\n\n localConnection.createOffer().then(desc => {\n localConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'offer', target: targetClient, offer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n }\n\n handleOffer(data) {\n const targetClient = data.from;\n\n if (!this.remoteConnections[targetClient]) {\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const remoteConnection = new RTCPeerConnection(servers, this.pcConstraint);\n\n remoteConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n remoteConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n const sendChannel = remoteConnection.createDataChannel('hamstersjs', this.dataConstraint);\n \n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n remoteConnection.setRemoteDescription(new RTCSessionDescription(data.offer)).then(() => {\n return remoteConnection.createAnswer();\n }).then(desc => {\n remoteConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'answer', target: targetClient, answer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n\n this.remoteConnections[targetClient] = remoteConnection;\n this.sendChannels[targetClient] = sendChannel;\n }\n }\n\n handleAnswer(data) {\n const connection = this.remoteConnections[data.from];\n connection.setRemoteDescription(new RTCSessionDescription(data.answer));\n }\n\n handleCandidate(data) {\n const connection = this.remoteConnections[data.from];\n connection.addIceCandidate(new RTCIceCandidate(data.candidate)).catch(this.onAddIceCandidateError);\n }\n\n measureLatency(targetClient) {\n const startTime = performance.now();\n this.sendPing(targetClient, startTime);\n }\n\n sendPing(targetClient, startTime) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'ping', startTime }));\n }\n }\n\n handlePing(targetClient, startTime) {\n console.log(\"Remote Connections \", this.remoteConnections);\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'pong', startTime }));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent ping to ${targetClient}`);\n }\n }\n }\n\n handlePong(targetClient, startTime) {\n const latency = performance.now() - startTime;\n this.latencies[targetClient] = latency;\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received pong from ${targetClient} with latency: ${latency.toFixed(2)}ms`);\n }\n }\n\n fetchDistributedClient() {\n const sendChannelKeys = Object.keys(this.sendChannels);\n if (sendChannelKeys.length === 0) {\n if (this.hamsters.habitat.debug) {\n console.warn(`Hamsters.js ${this.hamsters.version} no send channels available.`);\n }\n return null;\n }\n\n let minLatency = Infinity;\n let targetClient = null;\n\n sendChannelKeys.forEach(clientId => {\n let channel = this.sendChannels[clientId];\n if (channel.readyState === 'open' && this.latencies[clientId] < minLatency) {\n minLatency = this.latencies[clientId];\n targetClient = clientId;\n }\n });\n\n return targetClient;\n }\n\n distributeTask(task, hamsterFood, resolve, reject) {\n const targetClient = this.fetchDistributedClient();\n if (!targetClient) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} no target client found.`);\n }\n reject('No target client found.');\n return;\n }\n\n const messageId = this.generateUniqueId();\n\n const subTask = {\n hamsterFood,\n index: hamsterFood.index,\n task,\n messageId,\n };\n\n this.pendingPromises[messageId] = { resolve, reject };\n\n this.sendData({ targetClient, data: subTask });\n }\n\n handleTaskResponse(incomingMessage) {\n const { messageId, output, error } = incomingMessage;\n const pendingPromise = this.pendingPromises[messageId];\n\n if (pendingPromise) {\n if (error) {\n pendingPromise.reject(error);\n } else {\n pendingPromise.resolve(output);\n }\n\n delete this.pendingPromises[messageId];\n }\n }\n\n sendData({ targetClient, data }) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent data to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n sendDataResponse(data) {\n const targetClient = data.targetClient;\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent response to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n closeDataChannels() {\n for (const targetClient in this.sendChannels) {\n if (this.sendChannels[targetClient]) {\n this.sendChannels[targetClient].close();\n delete this.sendChannels[targetClient];\n }\n if (this.receiveChannels[targetClient]) {\n this.receiveChannels[targetClient].close();\n delete this.receiveChannels[targetClient];\n }\n if (this.remoteConnections[targetClient]) {\n this.remoteConnections[targetClient].close();\n delete this.remoteConnections[targetClient];\n }\n delete this.latencies[targetClient];\n }\n this.localConnection = null;\n }\n\n receiveChannelCallback(event, targetClient) {\n const receiveChannel = event.channel;\n\n receiveChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n receiveChannel.onopen = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n receiveChannel.onclose = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n this.receiveChannels[targetClient] = receiveChannel;\n }\n\n onReceiveMessageCallback(targetClient, data) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received message!`);\n }\n const incomingMessage = JSON.parse(data);\n\n if (incomingMessage.isReply) {\n this.handleTaskResponse(incomingMessage);\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} response received for task: `, incomingMessage);\n }\n } else {\n this.hamsters.pool.runDistributedTask(incomingMessage, targetClient);\n }\n }\n\n onSendChannelStateChange(targetClient) {\n const sendChannel = this.sendChannels[targetClient];\n this.measureLatency(targetClient);\n if (sendChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} send channel state changed for ${targetClient}: ${sendChannel.readyState}`);\n }\n }\n\n onReceiveChannelStateChange(targetClient) {\n const receiveChannel = this.receiveChannels[targetClient];\n if (receiveChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} receive channel state changed for ${targetClient}: ${receiveChannel.readyState}`);\n }\n }\n\n generateUniqueId() {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n }\n\n onCreateSessionDescriptionError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to create session description: ${error}`);\n }\n }\n\n onAddIceCandidateError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to add ICE candidate: ${error}`);\n }\n }\n}\n\nmodule.exports = Distribute;\n\n\n// WEBPACK FOOTER //\n// ./feature/distribute.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 568b7fe0e18218067194","webpack:///./hamsters.js","webpack:///./core/habitat.js","webpack:///./core/pool.js","webpack:///./core/data.js","webpack:///./core/wheel.js","webpack:///./core/task.js","webpack:///./feature/memoize.js","webpack:///./feature/stores/NodeStore.js","webpack:///./feature/stores/WebStore.js","webpack:///./feature/distribute.js"],"names":["hamstersjs","version","run","hamstersRun","bind","promise","hamstersPromise","init","inititializeLibrary","data","pool","wheel","habitat","memoize","startOptions","Data","Pool","Wheel","Habitat","Memoize","distribute","Distribute","processStartOptions","legacy","persistence","spawnHamsters","maxThreads","relay","console","info","establishConnection","Object","keys","key","includes","toLowerCase","forceLegacyMode","Worker","isIE","task","resolve","reject","input","memoizedFunction","scheduleTask","then","catch","params","functionToRun","Promise","Task","onSuccess","onError","hamsters","module","exports","debug","importScripts","browser","isBrowser","webWorker","isWebWorker","node","isNode","reactNative","isReactNative","shell","isShell","transferable","supportsTransferableObjects","atomics","supportsAtomicOperations","proxies","supportsProxies","isInternetExplorer","selectHamsterWheel","sharedWorker","locateSharedWorkerObject","locateBlobBuilder","findAvailableBlobBuilder","isLegacyEnvironment","locateWorkerObject","determineGlobalThreads","getHabitatKeys","max","navigator","hardwareConcurrency","isFirefox","os","cpus","length","userAgent","indexOf","SharedWorker","window","process","product","isLegacy","supportsSharedWorkers","supports","workerBlob","generateWorkerBlob","SharedHamster","e","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","textContent","Blob","BlobMaker","blob","append","type","getBlob","workerLogic","URL","createObjectURL","createDataBlob","String","Uint8Array","SharedArrayBuffer","Proxy","regular","threads","running","pending","fetchHamster","getAvailableThread","index","hamsterFood","scheduler","metrics","count","enqueued_at","Date","now","push","hamster","item","id","dequeued_at","runTask","threadId","spawnHamster","started_at","workers","parentPort","hamsterWheel","subTaskId","array","getSubArrayFromIndex","sharedBuffer","excludedKeys","Set","hasOwnProperty","has","incomingMessage","targetClient","handleResponse","returnDistributedOutput","messageId","isReply","keepTrackOfThread","trainHamster","feedHamster","prepareMeal","addWorkToPending","distributeTask","output","processDataType","dataType","aggregate","aggregateThreadOutputs","sort","sortOutput","completed_at","splice","message","response","messageData","JSON","parse","undefined","mixedOutput","addThreadOutputWithIndex","onThreadResponse","port","onmessage","onmessageerror","onerror","once","processReturn","removeFromRunning","returnOutputAndRemoveTask","terminate","queueHamster","processQueuedItem","shift","setOnMessage","i","indexes","getSubArrayUsingIndex","getSubArrayIndexes","calculateIndexes","sortTaskOutput","typedArrayFromBuffer","prepareFunction","prepareWorkerTask","messageWorkerThread","getBufferSize","createSharedBuffer","getDataType","setupSharedArrayBuffer","postMessage","stringify","getTransferableObjects","obj","typedArrayBuffers","transferableObjects","typedArrayTypes","otherTransferables","globalContext","global","prop","buffer","concat","types","Uint32Array","Uint16Array","Uint8ClampedArray","Int32Array","Int16Array","Int8Array","Float32Array","Float64Array","functionBody","functionString","substring","arr","order","Array","prototype","call","a","b","reverse","byteLength","sharedArray","constructor","set","reduce","len","bufferLength","offset","outputLength","start","n","end","segmentSize","Math","floor","startIndex","endIndex","inputArray","slice","worker","workerScaffold","regularScaffold","legacyScaffold","self","rtn","addEventListener","incomingConnection","ports","eval","hamstersJob","buffers","handleDataType","returnResponse","allTypes","add","from","setupLegacyTask","setupModernTask","setupDebugMetrics","created_at","setupThreadMetrics","threadMetrics","maxSize","store","NodeStore","WebStore","func","generateTaskKey","get","cachedResult","applyFunc","result","hashCode","str","hash","chr","charCodeAt","toString","args","apply","error","cache","Map","value","delete","size","oldestKey","next","clear","dbName","storeName","db","initDB","request","indexedDB","open","event","target","onupgradeneeded","objectStoreNames","contains","objectStore","createObjectStore","keyPath","createIndex","unique","onsuccess","transaction","updateTimestamp","checkSize","put","timestamp","countRequest","evictOldest","openCursor","cursor","localConnection","remoteConnections","sendChannels","receiveChannels","pcConstraint","dataConstraint","ws","clientId","pendingPromises","sendDataResponse","latencies","initWebSocket","WebSocket","onopen","registerMessage","logicalCores","send","handleClientReconnect","updateClientList","clients","handleOffer","handleAnswer","handleCandidate","handleTaskResponse","onclose","forEach","client","createConnection","newClientId","log","close","loadClientList","fetch","json","servers","iceServers","urls","RTCPeerConnection","sendChannel","createDataChannel","onicecandidate","candidate","onSendChannelStateChange","handlePing","startTime","handlePong","onReceiveMessageCallback","ondatachannel","receiveChannelCallback","createOffer","setLocalDescription","desc","offer","onCreateSessionDescriptionError","remoteConnection","setRemoteDescription","RTCSessionDescription","createAnswer","answer","connection","addIceCandidate","RTCIceCandidate","onAddIceCandidateError","performance","sendPing","readyState","latency","toFixed","sendChannelKeys","warn","minLatency","Infinity","channel","fetchDistributedClient","generateUniqueId","subTask","sendData","pendingPromise","receiveChannel","onReceiveChannelStateChange","runDistributedTask","measureLatency","random","substr"],"mappings":"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","file":"hamsters.node.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 568b7fe0e18218067194","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nimport Habitat from './core/habitat';\nimport Pool from './core/pool';\nimport Data from './core/data';\nimport Wheel from './core/wheel';\nimport Task from './core/task';\n\n//Features\nimport Memoize from './feature/memoize';\nimport Distribute from './feature/distribute';\n\nclass hamstersjs {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor() {\n 'use strict';\n\n this.version = '5.5.9';\n this.run = this.hamstersRun.bind(this);\n this.promise = this.hamstersPromise.bind(this);\n this.init = this.inititializeLibrary.bind(this);\n this.data = {};\n this.pool = {};\n this.wheel = {};\n this.habitat = {};\n this.memoize = {};\n }\n\n /**\n * @function inititializeLibrary - Prepares & initializes Hamsters.js library\n * @param {object} startOptions - Provided library functionality options\n */\n inititializeLibrary(startOptions) {\n this.data = new Data(this);\n this.pool = new Pool(this);\n this.wheel = new Wheel(this);\n this.habitat = new Habitat(this);\n this.memoize = new Memoize(this, 100); //Set a maximum of 100 memoized function results, LRU cache\n this.distribute = new Distribute(this);\n\n this.processStartOptions(startOptions);\n \n if(!this.habitat.legacy && this.habitat.persistence === true) {\n this.pool.spawnHamsters(this.habitat.maxThreads);\n }\n this.maxThreads = this.habitat.maxThreads;\n\n if(this.habitat.relay) {\n console.info(`Hamsters.js ${this.version} establishing connection to relay`);\n this.distribute.establishConnection();\n }\n\n console.info(`Hamsters.js ${this.version} initialized using up to ${this.habitat.maxThreads} threads`);\n }\n\n /**\n * @function processStartOptions - Adjusts library functionality based on provided options\n * @param {object} startOptions - Provided library functionality options\n */\n processStartOptions(startOptions) {\n if (typeof startOptions !== 'undefined') {\n for (const key of Object.keys(startOptions)) {\n if (this.habitat.keys.includes(key.toLowerCase())) {\n this.habitat[key] = startOptions[key];\n } else {\n this[key] = startOptions[key];\n }\n }\n }\n // Ensure legacy mode is disabled when we pass a third party worker library\n let forceLegacyMode = (typeof startOptions !== 'undefined' && typeof startOptions.legacy !== 'undefined');\n if (forceLegacyMode) {\n forceLegacyMode = startOptions.legacy;\n }\n if (typeof this.habitat.Worker === 'function' && !forceLegacyMode) {\n this.habitat.legacy = this.habitat.isIE;\n }\n }\n\n /**\n * @async\n * @function scheduleTask - Schedules a new function to be processed by the library\n * @param {object} task - Provided library execution options\n * @param {function} resolve - Parent function promise resolve method\n * @param {function} reject - Parent function promise reject method\n * @return {Promise} Promise object on completion\n */\n scheduleTask(task, resolve, reject) {\n if (task.input.memoize) {\n // Pass the task object to the memoized function\n const memoizedFunction = this.memoize.memoize(() => this.pool.scheduleTask(task));\n return memoizedFunction(task).then(resolve).catch(reject);\n }\n return this.pool.scheduleTask(task)\n .then(resolve)\n .catch(reject);\n }\n\n /**\n * @async\n * @function hamstersPromise - Calls library functionality using async promises\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n * @return {Promise} Promise resolving with results from functionToRun\n */\n hamstersPromise(params, functionToRun) {\n return new Promise((resolve, reject) => {\n this.scheduleTask(new Task(this, params, functionToRun), resolve, reject);\n });\n }\n\n /**\n * @async\n * @function hamstersRun - Calls library functionality using async callbacks\n * @param {object} params - Provided library execution options\n * @param {function} onError - Function to call upon execution failure\n * @return {array} Results from functionToRun.\n */\n hamstersRun(params, functionToRun, onSuccess, onError) {\n this.scheduleTask(new Task(this, params, functionToRun), onSuccess, onError);\n }\n}\n\nconst hamsters = new hamstersjs();\n\nmodule.exports = hamsters;\n\n\n\n// WEBPACK FOOTER //\n// ./hamsters.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Habitat {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.debug = false;\n this.importScripts = null;\n this.relay = null;\n this.memoize = false;\n this.persistence = true;\n this.browser = this.isBrowser();\n this.webWorker = this.isWebWorker();\n this.node = this.isNode();\n this.reactNative = this.isReactNative();\n this.shell = this.isShell();\n this.transferable = this.supportsTransferableObjects();\n this.atomics = this.supportsAtomicOperations();\n this.proxies = this.supportsProxies();\n this.isIE = this.isInternetExplorer();\n this.selectHamsterWheel = this.selectHamsterWheel.bind(this);\n this.sharedWorker = this.locateSharedWorkerObject();\n this.locateBlobBuilder = this.findAvailableBlobBuilder();\n this.legacy = this.isLegacyEnvironment();\n this.Worker = this.locateWorkerObject();\n this.maxThreads = this.determineGlobalThreads();\n this.keys = this.getHabitatKeys();\n }\n\n /**\n * @function determineGlobalThreads - Determines max number of threads to use\n */\n determineGlobalThreads() {\n let max = 4;\n if(this.browser && typeof navigator.hardwareConcurrency !== \"undefined\") {\n max = navigator.hardwareConcurrency;\n if(this.isFirefox()) {\n max = (max > 20 ? 20 : max);\n }\n }\n if(this.node && typeof os !== 'undefined') {\n max = os.cpus().length;\n }\n return max;\n }\n\n /**\n * @function isFirefox - Detect firefox browser\n */\n isFirefox() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.toLowerCase().indexOf('firefox') !== -1);\n }\n return false;\n }\n\n /**\n * @function locateWorkerObject - Attempts to find a global Worker object\n */\n locateWorkerObject() {\n return (typeof Worker !== 'undefined' ? Worker : false);\n }\n\n /**\n * @function locateSharedWorkerObject - Attempts to find a global SharedWorker object\n */\n locateSharedWorkerObject() {\n return (typeof SharedWorker !== 'undefined' ? SharedWorker : false);\n }\n\n /**\n * @function isBrowser - Detects if execution environment is a browser\n */\n isBrowser() {\n return (typeof window === \"object\");\n }\n\n /**\n * @function isInternetExplorer - Detects if execution environment is internet explorer\n */\n isInternetExplorer() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.indexOf(\"MSIE \") !== -1 || navigator.userAgent.indexOf(\"Trident/\") !== -1);\n }\n return false;\n }\n\n /**\n * @function isNode - Detects if execution environment is node.js\n */\n isNode() {\n return (typeof process === \"object\" && typeof require === \"function\" && !this.isWebWorker() && !this.browser);\n }\n\n /**\n * @function isWebWorker - Detects if execution environment is a web worker\n */\n isWebWorker() {\n return (typeof importScripts === \"function\" && !this.isReactNative());\n }\n\n /**\n * @function isReactNative - Detects if execution environment is React Native\n */\n isReactNative() {\n return (typeof navigator !== \"undefined\" && typeof navigator.product !== \"undefined\" && navigator.product === \"ReactNative\");\n }\n\n /**\n * @function isShell - Detects if execution environment is a shell\n */\n isShell() {\n return ((typeof navigator === \"undefined\") && !this.isNode() && !this.isWebWorker() && !this.isReactNative());\n }\n\n /**\n * @function isLegacyEnvironment - Detects if execution environment is a legacy environment\n */\n isLegacyEnvironment() {\n let isLegacy = !!!this.Worker;\n // Detect sharedWorker support for use within webworkers\n if (this.isWebWorker() && typeof this.SharedWorker !== 'undefined') {\n isLegacy = !this.supportsSharedWorkers();\n }\n return isLegacy;\n }\n\n /**\n * @function supportsSharedWorkers - Detects if execution environment supports SharedWorkers\n */\n supportsSharedWorkers() {\n let supports = false;\n try {\n let workerBlob = this.generateWorkerBlob(this.selectHamsterWheel());\n let SharedHamster = new this.SharedWorker(workerBlob, 'SharedHamsterWheel');\n supports = true;\n } catch (e) {\n supports = false;\n }\n return supports;\n }\n\n /**\n * @function findAvailableBlobBuilder - Attempts to locate a data blob builder, with vendor prefixes\n */\n findAvailableBlobBuilder() {\n if(typeof BlobBuilder !== 'undefined') {\n return BlobBuilder;\n }\n if(typeof WebKitBlobBuilder !== 'undefined') {\n return WebKitBlobBuilder;\n }\n if(typeof MozBlobBuilder !== 'undefined') {\n return MozBlobBuilder;\n }\n if(typeof MSBlobBuilder !== 'undefined') {\n return MSBlobBuilder;\n }\n return 'Environment does not support data blobs!';\n }\n\n /**\n * @function createDataBlob - Creates a new data blob from textContent\n * @param {string} textContent - Provided text content for blob\n */\n createDataBlob(textContent) {\n if(typeof Blob === 'undefined') {\n let BlobMaker = this.locateBlobBuilder();\n let blob = new BlobMaker();\n blob.append([textContent], {\n type: 'application/javascript'\n });\n return blob.getBlob();\n }\n return new Blob([textContent], {\n type: 'application/javascript'\n });\n }\n\n /**\n * @function generateWorkerBlob - Creates a blob URI for flexible scaffold loading\n * @param {function} workerLogic - Scaffold to use within worker thread\n */\n generateWorkerBlob(workerLogic) {\n return URL.createObjectURL(this.createDataBlob('(' + String(workerLogic) + ')();'));\n }\n\n /**\n * @function supportsTransferableObjects - Detects if execution environment supports typed arrays\n */\n supportsTransferableObjects() {\n return (typeof Uint8Array !== 'undefined');\n }\n\n /**\n * @function supportsAtomicOperations - Detects if execution environment supports SharedArrayBuffers\n */\n supportsAtomicOperations() {\n return (typeof SharedArrayBuffer !== 'undefined');\n }\n\n /**\n * @function supportsProxies - Detects if execution environment supports Proxy objects\n */\n supportsProxies() {\n return (typeof Proxy !== 'undefined');\n }\n\n /**\n * @function selectHamsterWheel - Determines which scaffold to use for proper execution for various environments\n */\n selectHamsterWheel() {\n if(this.isIE) {\n return this.hamsters.wheel.legacy;\n }\n if(this.reactNative) {\n return 'reactNativeHamster.js';\n }\n if (this.node) {\n return './node_modules/hamsters.js/build/common/node.js';\n }\n return this.generateWorkerBlob(this.hamsters.wheel.regular);\n }\n\n /**\n * @function getHabitatKeys - Returns keys for this Habitat instance\n */\n getHabitatKeys() {\n return [\n 'worker','sharedworker',\n 'legacy','proxies',\n 'reactnative','atomics',\n 'transferable','browser',\n 'shell','node','debug',\n 'persistence','importscripts',\n 'maxthreads', 'parentport',\n 'webworker', 'relay'\n ];\n }\n}\n\nmodule.exports = Habitat;\n\n\n// WEBPACK FOOTER //\n// ./core/habitat.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Pool {\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.threads = [];\n this.running = [];\n this.pending = [];\n this.fetchHamster = this.getAvailableThread.bind(this);\n }\n\n /**\n * @function addWorkToPending - Adds task to queue waiting for available thread\n * @param {number} index - Index of the task\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n addWorkToPending(index, hamsterFood, task, resolve, reject) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[task.scheduler.count].enqueued_at = Date.now();\n }\n this.pending.push({\n index,\n hamsterFood, \n task,\n resolve,\n reject\n });\n }\n\n /**\n * @function processQueuedItem - Invokes processing of next item in queue\n * @param {object} hamster - The thread to run the task\n * @param {object} item - Task to process\n */\n processQueuedItem(hamster, item) {\n if (this.hamsters.habitat.debug) {\n item.task.scheduler.metrics.threads[item.index.id].dequeued_at = Date.now();\n }\n return this.runTask(hamster, item.index, item.hamsterFood, item.task, item.resolve, item.reject);\n }\n\n /**\n * @function getAvailableThread - Gets an available thread\n * @param {number} threadId - Id of the thread\n * @returns {object} - The available thread\n */\n getAvailableThread(threadId) {\n if (this.hamsters.habitat.persistence) {\n return this.threads[threadId];\n }\n return this.spawnHamster();\n }\n\n /**\n * @function keepTrackOfThread - Keeps track of threads running, scoped globally and to task\n * @param {object} task - Provided library functionality options for this task\n * @param {number} id - Id of thread to track\n */\n keepTrackOfThread(task, id) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[id].started_at = Date.now();\n }\n task.scheduler.workers.push(id);\n this.running.push(id);\n }\n\n /**\n * @function spawnHamsters - Spawns multiple new threads for execution\n * @param {number} maxThreads - Max number of threads for this client\n */\n spawnHamsters(maxThreads) {\n while (maxThreads--) {\n this.threads.push(this.spawnHamster());\n }\n }\n\n /**\n * @function spawnHamster - Spawns a new thread for execution\n * @return {object} - New WebWorker thread using selected scaffold\n */\n spawnHamster() {\n const { selectHamsterWheel, SharedWorker, Worker, node, parentPort } = this.hamsters.habitat;\n const hamsterWheel = selectHamsterWheel();\n if (this.hamsters.habitat.webWorker) {\n return new SharedWorker(hamsterWheel, 'SharedHamsterWheel');\n }\n if (node && typeof parentPort !== 'undefined') {\n return new Worker(hamsterWheel);\n }\n return new Worker(hamsterWheel);\n }\n \n /**\n * @function prepareMeal\n * @description Prepares message to send to a thread and invoke execution\n * @param {number} index - Index of the subarray to process\n * @param {number} subTaskId - Subtask ID\n * @param {object} task - Provided library functionality options for this task\n * @returns {object} - Prepared message to send to a thread\n */\n prepareMeal(index, subTaskId, task) {\n index.id = subTaskId;\n\n // Prepare the base hamsterFood object\n const hamsterFood = {\n array: task.input.array && task.input.array.length !== 0 ? \n this.hamsters.data.getSubArrayFromIndex(index, task.input.array) : [],\n index: index\n };\n\n // Add sharedBuffer if it exists\n if (typeof task.scheduler.sharedBuffer !== 'undefined') {\n hamsterFood.sharedBuffer = task.scheduler.sharedBuffer;\n }\n\n // List of excluded keys\n const excludedKeys = new Set(['array', 'threads', 'sharedArray']);\n\n // Iterate over task.input properties and add to hamsterFood\n for (const key in task.input) {\n if (task.input.hasOwnProperty(key) && !excludedKeys.has(key)) {\n hamsterFood[key] = task.input[key];\n }\n }\n\n return hamsterFood;\n }\n\n /**\n * @function runDistributedTask - Runs incoming distributed function using thread\n * @param {object} incomingMessage - The incoming subTask object\n */\n runDistributedTask(incomingMessage, targetClient) {\n const hamster = this.fetchHamster(this.running.length);\n let task = incomingMessage.task;\n let index = incomingMessage.hamsterFood.index;\n let handleResponse = this.hamsters.distribute.returnDistributedOutput;\n task.targetClient = targetClient;\n task.messageId = incomingMessage.messageId;\n task.isReply = true;\n\n this.runTask(hamster, index, incomingMessage.hamsterFood, incomingMessage.task, handleResponse, handleResponse);\n }\n\n\n\n /**\n * @function runTask - Runs function using thread\n * @param {object} hamster - The thread to run the task\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n runTask(hamster, index, hamsterFood, task, resolve, reject) {\n const threadId = this.running.length;\n this.hamsters.pool.keepTrackOfThread(task, threadId);\n if (this.hamsters.habitat.legacy) {\n this.hamsters.wheel.legacy(hamsterFood, resolve, reject);\n } else {\n this.hamsters.pool.trainHamster(index, task, threadId, hamster, resolve, reject);\n this.hamsters.data.feedHamster(hamster, hamsterFood);\n }\n task.scheduler.count += 1;\n }\n\n /**\n * @function hamsterWheel - Runs or queues function using threads\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n hamsterWheel(index, subTaskId, task, resolve, reject) {\n const hamsterFood = this.prepareMeal(index, subTaskId, task);\n if (this.hamsters.habitat.maxThreads <= this.running.length) {\n this.addWorkToPending(index, hamsterFood, task, resolve, reject);\n } else {\n if(task.input.distribute) {\n this.hamsters.distribute.distributeTask(task, hamsterFood, resolve, reject);\n } else {\n const hamster = this.fetchHamster(this.running.length);\n this.runTask(hamster, index, hamsterFood, task, resolve, reject);\n }\n }\n }\n\n processDistributedReturn(data) {\n debugger;\n }\n\n /**\n * @function returnOutputAndRemoveTask - Gathers thread outputs into final result\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n */\n returnOutputAndRemoveTask(task, resolve) {\n if(task.scheduler.sharedBuffer) {\n task.output = hamsters.data.processDataType(task.input.dataType, task.scheduler.sharedBuffer);\n }\n if(task.input.aggregate) {\n task.output = this.hamsters.data.aggregateThreadOutputs(task.output, task.input.dataType);\n }\n if(task.input.sort) {\n task.output = this.hamsters.data.sortOutput(task.output, task.input.sort)\n }\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.completed_at = Date.now();\n console.info(\"Hamsters.js Task Completed: \", task);\n }\n if(task.input.distribute) {\n resolve(task);\n } else {\n resolve(task.output);\n }\n }\n\n /**\n * @function removeFromRunning - Removes a thread from the running pool\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to remove\n */\n removeFromRunning(task, threadId) {\n this.running.splice(this.running.indexOf(threadId), 1);\n task.scheduler.workers.splice(task.scheduler.workers.indexOf(threadId), 1);\n }\n\n /**\n * @function processReturn - Processes the returned message from a thread\n * @param {number} index - Index of the subarray processed\n * @param {object} message - Message returned from the thread\n * @param {object} task - Provided library functionality options for this task\n */\n processReturn(index, message, task) {\n const isReactNative = this.hamsters.habitat.reactNative;\n const isNode = this.hamsters.habitat.node;\n const response = message.data;\n const messageData = isReactNative ? JSON.parse(message).data : (response.data !== undefined ? response.data : response);\n const threadId = isNode ? message.index.id : response.index.id;\n\n if (task.scheduler.threads !== 1) {\n if (isReactNative || task.input.mixedOutput) {\n task.output[threadId] = messageData;\n } else {\n this.hamsters.data.addThreadOutputWithIndex(task, index, messageData);\n }\n } else {\n task.output = messageData;\n }\n }\n\n /**\n * @function setOnMessage - Sets the message handlers for a thread\n * @param {object} hamster - The thread to set the handlers on\n * @param {function} onThreadResponse - Handler for thread response\n * @param {object} habitat - Habitat configuration\n * @param {function} reject - onError method\n */\n setOnMessage(hamster, onThreadResponse, reject) {\n if (this.hamsters.habitat.webWorker) {\n hamster.port.onmessage = onThreadResponse;\n hamster.port.onmessageerror = reject;\n hamster.port.onerror = reject;\n } else if (this.hamsters.habitat.node) {\n hamster.once('message', onThreadResponse);\n hamster.once('onmessageerror', reject);\n hamster.once('error', reject);\n } else {\n hamster.onmessage = onThreadResponse;\n hamster.onmessageerror = reject;\n hamster.onerror = reject;\n }\n }\n\n /**\n * @function trainHamster - Trains thread in how to behave\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to train\n * @param {object} hamster - The thread to train\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n trainHamster(index, task, threadId, hamster, resolve, reject) {\n const onThreadResponse = (message) => {\n this.hamsters.pool.processReturn(index, message, task);\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[threadId].completed_at = Date.now();\n }\n this.hamsters.pool.removeFromRunning(task, threadId);\n if (task.scheduler.workers.length === 0 && task.scheduler.count === task.scheduler.threads) {\n this.hamsters.pool.returnOutputAndRemoveTask(task, resolve);\n }\n if (!this.hamsters.habitat.persistence) {\n hamster.terminate();\n }\n if (this.hamsters.pool.pending.length !== 0) {\n const queueHamster = this.hamsters.pool.fetchHamster(this.hamsters.pool.running.length);\n this.hamsters.pool.processQueuedItem(queueHamster, this.hamsters.pool.pending.shift());\n }\n };\n this.hamsters.pool.setOnMessage(hamster, onThreadResponse, reject);\n }\n\n /**\n * @function scheduleTask - Adds new task to the system for execution\n * @param {object} task - Provided library functionality options for this task\n */\n scheduleTask(task) {\n let i = 0;\n \treturn new Promise((resolve, reject) => {\n if(this.hamsters.debug) {\n task.scheduler.metrics.started_at = Date.now();\n }\n while (i < task.scheduler.threads) {\n this.hamsterWheel(task.scheduler.indexes[i], i, task, resolve, reject);\n i += 1;\n }\n });\n }\n}\n\nmodule.exports = Pool;\n\n\n// WEBPACK FOOTER //\n// ./core/pool.js","class Data {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters; // Set the hamsters object as a property of Data class\n this.getSubArrayFromIndex = this.getSubArrayUsingIndex.bind(this); // Bind getSubArrayUsingIndex function\n this.getSubArrayIndexes = this.calculateIndexes.bind(this); // Bind calculateIndexes function\n this.sortOutput = this.sortTaskOutput.bind(this); // Bind sortTaskOutput function\n this.aggregateThreadOutputs = this.aggregateThreadOutputs.bind(this);\n this.processDataType = this.typedArrayFromBuffer;\n this.prepareFunction = this.prepareWorkerTask.bind(this); // Bind prepareWorkerTask function\n this.feedHamster = this.messageWorkerThread.bind(this); // Bind messageWorkerThread function\n this.getBufferSize = this.getBufferSize;\n this.createSharedBuffer = this.createSharedBuffer.bind(this);\n this.getDataType = this.getDataType;\n this.setupSharedArrayBuffer = this.setupSharedArrayBuffer.bind(this);\n }\n\n /**\n * @function messageWorkerThread - Prepares message to send to thread\n * @param {object} hamstersHabitat - Hamsters Habitat instance\n * @param {Worker} hamster - Thread to message\n * @param {object} hamsterFood - Message to send to thread\n */ \n messageWorkerThread(hamster, hamsterFood) {\n if(this.hamsters.habitat.reactNative) {\n return hamster.postMessage(JSON.stringify(hamsterFood));\n }\n if (this.hamsters.habitat.webWorker) {\n return hamster.port.postMessage(hamsterFood);\n }\n return hamster.postMessage(hamsterFood, this.hamsters.data.getTransferableObjects(hamsterFood));\n }\n\n getTransferableObjects(obj) {\n const typedArrayBuffers = [];\n const transferableObjects = [];\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n const globalContext = typeof window !== 'undefined' ? window : global;\n \n for (const prop in obj) {\n for (const type of typedArrayTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n typedArrayBuffers.push(obj[prop].buffer);\n break;\n }\n }\n \n for (const type of otherTransferables) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n transferableObjects.push(obj[prop]);\n break;\n }\n }\n }\n \n return typedArrayBuffers.concat(transferableObjects);\n }\n\n /**\n * @function typedArrayFromBuffer - Converts buffer into new typed array\n * @param {string} dataType - Typed array type for this task\n * @param {object} buffer - Buffer to convert\n */\n typedArrayFromBuffer(dataType, buffer) {\n const types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if(!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n /**\n * @function prepareWorkerTask - Prepares function for thread, strips whitespace\n * @param {function} functionBody - Message to send to thread\n */\n prepareWorkerTask(functionBody) {\n let functionString = String(functionBody);\n return functionString.substring((functionString.indexOf(\"{\") + 1), (functionString.length -1));\n }\n\n /**\n * @function sortTaskOutput - Sorts array by defined order\n * @param {object} arr - Array to sort\n * @param {string} order - Defined sort order\n */\n sortTaskOutput(arr, order) {\n switch(order) {\n case 'desc':\n case 'asc':\n return Array.prototype.sort.call(arr, function(a, b) {\n return (order === 'asc' ? (a - b) : (b - a)); \n });\n case 'ascAlpha':\n return arr.sort();\n case 'descAlpha':\n return arr.reverse();\n default:\n return arr;\n }\n }\n\n /**\n * @function getBufferSize - Gets the byte length of the input array\n * @param {TypedArray} array - The input typed array\n * @returns {number} - The byte length of the array\n */\n getBufferSize(array) {\n return array.byteLength;\n }\n\n /**\n * @function createSharedBuffer - Creates a SharedArrayBuffer based on the input array's byte length\n * @param {TypedArray} array - The input typed array\n * @returns {SharedArrayBuffer} - The created SharedArrayBuffer\n */\n createSharedBuffer(array) {\n const byteLength = this.getBufferSize(array);\n const sharedBuffer = new SharedArrayBuffer(byteLength);\n const sharedArray = new array.constructor(sharedBuffer);\n\n // Copy data from the input array to the shared array\n sharedArray.set(array);\n\n return sharedBuffer;\n }\n\n /**\n * @function setupSharedArrayBuffer - Sets up the shared buffer and corresponding typed array\n * @param {TypedArray} array - The input typed array\n * @returns {object} - SharedArrayBuffer;\n */\n setupSharedArrayBuffer(array) {\n return this.createSharedBuffer(array);\n }\n\n /**\n * @function aggregateThreadOutputs - Joins individual thread outputs into single result\n * @param {array} input - Array of arrays to aggregate\n * @param {string} dataType - Data type to use for typed array\n */\n aggregateThreadOutputs(input, dataType) {\n if(!dataType) {\n return input.reduce(function(a, b) {\n return a.concat(b);\n });\n }\n let i = 0;\n let len = input.length;\n let bufferLength = 0;\n for (i; i < len; i += 1) {\n bufferLength += input[i].length;\n }\n let output = this.processDataType(dataType, bufferLength);\n let offset = 0;\n for (i = 0; i < len; i += 1) {\n output.set(input[i], offset);\n offset += input[i].length;\n }\n return output;\n }\n\n /**\n * @function addThreadOutputWithIndex - Joins individual thread outputs into single result\n * @param {object} task - Hamsters task object\n * @param {object} index - Index information\n * @param {array} output - Output array\n */\n addThreadOutputWithIndex(task, index, output) {\n let i = 0;\n const outputLength = output.length;\n for (i; i < outputLength; i++) {\n task.output[(index.start + i)] = output[i];\n }\n }\n\n /**\n * @function calculateIndexes - Splits a single array into multiple equal sized subarrays\n * @param {array} array - Array to split\n * @param {number} n - Number of subarrays to create\n */\n calculateIndexes(array, n) {\n // If n is 1, return the whole array range\n if (n === 1) {\n return [{ start: 0, end: array.length - 1 }];\n }\n\n const indexes = [];\n const segmentSize = Math.floor(array.length / n);\n let startIndex = 0;\n\n for (let i = 0; i < n; i++) {\n const endIndex = startIndex + segmentSize - 1;\n indexes.push({ start: startIndex, end: endIndex });\n startIndex = endIndex + 1;\n }\n\n // Adjust the last segment to cover any remaining elements\n if (startIndex < array.length) {\n indexes[n - 1].end = array.length - 1;\n }\n\n return indexes;\n }\n \n\n /**\n * @function getSubArrayUsingIndex - Slices subarray based on provided index\n * @param {object} index - Index information\n * @param {object} inputArray - Hamsters task object\n */\n getSubArrayUsingIndex(index, inputArray) {\n return inputArray.slice(index.start, index.end + 1);\n }\n}\n\nmodule.exports = Data;\n\n\n// WEBPACK FOOTER //\n// ./core/data.js","class Wheel {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.worker = this.workerScaffold;\n this.regular = this.regularScaffold;\n this.legacy = this.legacyScaffold.bind(this);\n }\n\n /**\n * @function workerScaffold - Provides worker body for library functionality when used within a worker [threads inside threads]\n */\n workerScaffold() {\n self.params = {};\n self.rtn = {};\n\n addEventListener('connect', (incomingConnection) => {\n var port = incomingConnection.ports[0];\n port.start();\n port.addEventListener('message', (incomingMessage) => {\n this.params = incomingMessage.data;\n this.rtn = {\n data: [],\n dataType: this.params.dataType\n };\n eval(\"(\" + this.params.hamstersJob + \")\")();\n port.postMessage(this.rtn);\n }, false);\n }, false);\n }\n\n /**\n * @function regularScaffold - Provides worker body for library functionality\n */\n regularScaffold() {\n self.params = {};\n self.rtn = {};\n\n self.onmessage = function(message) {\n this.params = message.data;\n this.rtn = {\n data: [],\n dataType: (typeof this.params.dataType !== 'undefined' ? this.params.dataType : null),\n index: this.params.index\n };\n if (this.params.sharedBuffer) {\n this.params.sharedArray = typedArrayFromBuffer(this.params.dataType, this.params.sharedBuffer);\n }\n eval(this.params.hamstersJob);\n const buffers = handleDataType(this.rtn);\n returnResponse(this.rtn, buffers);\n }.bind(this);\n\n function handleDataType(rtn) {\n if (this.params.sharedArray) {\n // Do nothing here, we don't need to return a buffer rtn.data is useless here\n } else if(this.params.dataType) {\n rtn.data = typedArrayFromBuffer(rtn.dataType, rtn.data);\n }\n return getTransferableObjects(rtn); // Return transferable objects\n }\n\n function typedArrayFromBuffer(dataType, buffer) {\n var types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if (!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n function returnResponse(rtn, buffers) {\n if (buffers && buffers.length > 0) {\n // If there are buffers, postMessage with transferable objects\n postMessage(rtn, buffers);\n } else {\n // Otherwise, postMessage without transferable objects\n postMessage(rtn);\n }\n }\n\n function getTransferableObjects(obj) {\n const transferableObjects = new Set();\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n \n const globalContext = typeof self !== 'undefined' ? self : window;\n \n const allTypes = [...typedArrayTypes, ...otherTransferables];\n \n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n for (const type of allTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n if (typedArrayTypes.includes(type)) {\n transferableObjects.add(obj[prop].buffer);\n } else {\n transferableObjects.add(obj[prop]);\n }\n }\n }\n }\n }\n \n return Array.from(transferableObjects);\n }\n }\n\n\n /**\n * @function legacyScaffold - Provides library functionality for legacy devices\n */\n legacyScaffold(params, resolve, reject) {\n var rtn = {\n data: [],\n dataType: (typeof params.dataType !== \"undefined\" ? params.dataType : null)\n };\n if(this.hamsters.habitat.reactNative) {\n self.rtn = rtn;\n }\n if(this.hamsters.habitat.node || this.hamsters.habitat.isIE) {\n eval(params.hamstersJob);\n } else {\n params.hamstersJob();\n }\n resolve(rtn.data);\n }\n}\n\nmodule.exports = Wheel;\n\n\n\n// WEBPACK FOOTER //\n// ./core/wheel.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Task {\n /**\n * @constructor\n * @param {object} habitat - The environment settings\n * @param {object} data - Data utility methods\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n constructor(hamsters, params, functionToRun) {\n 'use strict';\n\n this.input = params;\n this.output = [];\n this.scheduler = {\n count: 0,\n threads: params.threads || 1,\n workers: []\n };\n \n if (hamsters.habitat.legacy) {\n this.setupLegacyTask(hamsters, functionToRun);\n } else {\n this.setupModernTask(hamsters, params, functionToRun);\n }\n \n if (hamsters.habitat.debug) {\n this.setupDebugMetrics();\n }\n }\n \n /**\n * @method setupLegacyTask\n * @description Sets up task for legacy environments\n * @param {function} functionToRun - Function to execute\n */\n setupLegacyTask(hamsters, functionToRun) {\n this.scheduler.threads = 1;\n if (!hamsters.habitat.node && !hamsters.habitat.isIE) {\n this.input.hamstersJob = functionToRun;\n }\n }\n \n /**\n * @method setupModernTask\n * @description Sets up task for modern environments\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n setupModernTask(hamsters, params, functionToRun) {\n this.input.hamstersJob = hamsters.habitat.legacy ? functionToRun : hamsters.data.prepareFunction(functionToRun);\n if (params.sharedArray && hamsters.habitat.atomics) {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.sharedArray, this.scheduler.threads);\n this.scheduler.sharedBuffer = hamsters.data.setupSharedArrayBuffer(params.sharedArray);\n this.input.sharedArray = []; //Reduce ram usage on main thread, do not preserve original array its no longer needed.\n } else {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.array, this.scheduler.threads);\n }\n }\n \n /**\n * @method setupDebugMetrics\n * @description Sets up debug metrics if debug mode is enabled\n */\n setupDebugMetrics() {\n this.scheduler.metrics = {\n created_at: Date.now(),\n started_at: null,\n completed_at: null,\n threads: this.setupThreadMetrics()\n };\n }\n\n setupThreadMetrics() {\n let i = 0;\n let threadMetrics = [];\n while(i < this.scheduler.threads) {\n threadMetrics.push({\n created_at: Date.now(),\n started_at: null,\n enqueued_at: null,\n dequeued_at: null,\n completed_at: null\n });\n i += 1;\n }\n return threadMetrics;\n }\n }\n \n module.exports = Task;\n \n\n\n// WEBPACK FOOTER //\n// ./core/task.js","import NodeStore from './stores/NodeStore';\nimport WebStore from './stores/WebStore';\n\nclass Memoize {\n constructor(hamsters, maxSize) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.store = this.hamsters.habitat.node ? new NodeStore(maxSize) : new WebStore('hamstersjs', 'cacheStore', maxSize);\n }\n\n memoize(func) {\n const self = this;\n return function(task) {\n const key = self.generateTaskKey(task);\n\n return new Promise(function(resolve, reject) {\n self.store.get(key).then(function(cachedResult) {\n if (cachedResult !== null) {\n resolve(cachedResult);\n } else {\n self.applyFunc(func, task).then(function(result) {\n self.store.set(key, result).then(function() {\n resolve(result);\n }).catch(reject);\n }).catch(reject);\n }\n }).catch(reject);\n });\n };\n }\n\n generateTaskKey(task) {\n const key = JSON.stringify({ input: task.input });\n return this.hashCode(key);\n }\n\n hashCode(str) {\n let hash = 0, i, chr;\n if (str.length === 0) return hash;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash.toString();\n }\n\n applyFunc(func, args) {\n return new Promise((resolve, reject) => {\n try {\n const result = func.apply(null, args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n\nmodule.exports = Memoize;\n\n\n// WEBPACK FOOTER //\n// ./feature/memoize.js","class NodeStore {\n constructor(maxSize) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key) {\n if (this.cache.has(key)) {\n const value = this.cache.get(key);\n // Refresh the key\n this.cache.delete(key);\n this.cache.set(key, value);\n return Promise.resolve(value);\n }\n return Promise.resolve(null);\n }\n\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n // Remove the oldest (least recently used) entry\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n clear() {\n this.cache.clear();\n return Promise.resolve();\n }\n}\n\nmodule.exports = NodeStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/NodeStore.js","class WebStore {\n constructor(dbName, storeName, maxSize) {\n this.dbName = dbName;\n this.storeName = storeName;\n this.maxSize = maxSize;\n this.db = null;\n this.initDB();\n }\n\n initDB() {\n const self = this;\n const request = indexedDB.open(this.dbName, 1);\n\n request.onerror = function(event) {\n console.error('Error opening database:', event.target.error);\n };\n\n request.onupgradeneeded = function(event) {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(self.storeName)) {\n const objectStore = db.createObjectStore(self.storeName, { keyPath: 'key' });\n objectStore.createIndex('by_key', 'key', { unique: true });\n objectStore.createIndex('by_timestamp', 'timestamp');\n }\n };\n\n request.onsuccess = function(event) {\n self.db = event.target.result;\n };\n }\n\n get(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve(null);\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const result = event.target.result;\n if (result) {\n self.updateTimestamp(key).then(() => resolve(result.value)).catch(reject);\n } else {\n resolve(null);\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n set(key, value) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n self.checkSize().then(() => {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.put({ key: key, value: value, timestamp: Date.now() });\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n }).catch(reject);\n });\n }\n\n clear() {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.clear();\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n checkSize() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const countRequest = objectStore.count();\n\n countRequest.onsuccess = function() {\n const count = countRequest.result;\n if (count >= self.maxSize) {\n self.evictOldest().then(resolve).catch(reject);\n } else {\n resolve();\n }\n };\n\n countRequest.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n evictOldest() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const index = objectStore.index('by_timestamp');\n const request = index.openCursor(null, 'next');\n\n request.onsuccess = function(event) {\n const cursor = event.target.result;\n if (cursor) {\n cursor.delete().onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n updateTimestamp(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const data = event.target.result;\n if (data) {\n data.timestamp = Date.now();\n objectStore.put(data).onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n}\n\nmodule.exports = WebStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/WebStore.js","class Distribute {\n\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.localConnection = null;\n this.remoteConnections = {};\n this.sendChannels = {};\n this.receiveChannels = {};\n this.pcConstraint = null;\n this.dataConstraint = null;\n this.ws = null;\n this.clientId = null;\n this.pendingPromises = {};\n this.returnDistributedOutput = this.sendDataResponse.bind(this);\n this.latencies = {};\n this.establishConnection = this.initWebSocket.bind(this);\n }\n\n initWebSocket() {\n this.ws = new WebSocket(`${this.hamsters.habitat.relay}`);\n\n this.ws.onopen = () => {\n console.info(`Hamsters.js ${this.hamsters.version} connection established`);\n const registerMessage = {\n type: 'register',\n logicalCores: this.hamsters.maxThreads\n };\n this.ws.send(JSON.stringify(registerMessage));\n };\n\n this.ws.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'register':\n this.handleClientReconnect(message);\n break;\n case 'update-client-list':\n this.updateClientList(message.clients);\n break;\n case 'offer':\n this.handleOffer(message);\n break;\n case 'answer':\n this.handleAnswer(message);\n break;\n case 'candidate':\n this.handleCandidate(message);\n break;\n case 'task-response':\n this.handleTaskResponse(message);\n break;\n default:\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} unknown message type: ${message.type}`);\n }\n }\n };\n\n this.ws.onerror = (error) => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} connection error: ${error}`);\n }\n };\n\n this.ws.onclose = () => {\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} connection closed.`);\n }\n };\n }\n\n updateClientList(clients) {\n clients.forEach(client => {\n if (client.id !== this.clientId && !this.remoteConnections[client.id]) {\n this.createConnection(client.id);\n }\n });\n }\n\n handleClientReconnect(message) {\n const newClientId = message.id;\n\n if (this.clientId === newClientId) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} connection error: `, error);\n }\n return;\n }\n\n if (this.remoteConnections[newClientId]) {\n this.remoteConnections[newClientId].close();\n delete this.remoteConnections[newClientId];\n }\n if (this.sendChannels[newClientId]) {\n this.sendChannels[newClientId].close();\n delete this.sendChannels[newClientId];\n }\n if (this.receiveChannels[newClientId]) {\n this.receiveChannels[newClientId].close();\n delete this.receiveChannels[newClientId];\n }\n delete this.latencies[newClientId];\n\n this.clientId = newClientId;\n this.loadClientList();\n }\n\n loadClientList() {\n fetch(`/clients?currentId=${this.clientId}`)\n .then(response => response.json())\n .then(data => {\n this.updateClientList(data);\n })\n .catch(error => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} Error fetching client list: ${error}`);\n }\n });\n }\n\n createConnections() {\n Object.keys(this.remoteConnections).forEach(targetClient => {\n this.createConnection(targetClient);\n });\n }\n\n createConnection(targetClient) {\n if (targetClient === this.clientId || this.remoteConnections[targetClient]) {\n return;\n }\n\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const localConnection = new RTCPeerConnection(servers, this.pcConstraint);\n const sendChannel = localConnection.createDataChannel('hamstersjs', this.dataConstraint);\n\n localConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n localConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n this.remoteConnections[targetClient] = localConnection;\n this.sendChannels[targetClient] = sendChannel;\n this.receiveChannels[targetClient] = null;\n\n localConnection.createOffer().then(desc => {\n localConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'offer', target: targetClient, offer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n }\n\n handleOffer(data) {\n const targetClient = data.from;\n\n if (!this.remoteConnections[targetClient]) {\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const remoteConnection = new RTCPeerConnection(servers, this.pcConstraint);\n\n remoteConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n remoteConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n const sendChannel = remoteConnection.createDataChannel('hamstersjs', this.dataConstraint);\n \n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n remoteConnection.setRemoteDescription(new RTCSessionDescription(data.offer)).then(() => {\n return remoteConnection.createAnswer();\n }).then(desc => {\n remoteConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'answer', target: targetClient, answer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n\n this.remoteConnections[targetClient] = remoteConnection;\n this.sendChannels[targetClient] = sendChannel;\n }\n }\n\n handleAnswer(data) {\n const connection = this.remoteConnections[data.from];\n connection.setRemoteDescription(new RTCSessionDescription(data.answer));\n }\n\n handleCandidate(data) {\n const connection = this.remoteConnections[data.from];\n connection.addIceCandidate(new RTCIceCandidate(data.candidate)).catch(this.onAddIceCandidateError);\n }\n\n measureLatency(targetClient) {\n const startTime = performance.now();\n this.sendPing(targetClient, startTime);\n }\n\n sendPing(targetClient, startTime) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'ping', startTime }));\n }\n }\n\n handlePing(targetClient, startTime) {\n console.log(\"Remote Connections \", this.remoteConnections);\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'pong', startTime }));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent ping to ${targetClient}`);\n }\n }\n }\n\n handlePong(targetClient, startTime) {\n const latency = performance.now() - startTime;\n this.latencies[targetClient] = latency;\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received pong from ${targetClient} with latency: ${latency.toFixed(2)}ms`);\n }\n }\n\n fetchDistributedClient() {\n const sendChannelKeys = Object.keys(this.sendChannels);\n if (sendChannelKeys.length === 0) {\n if (this.hamsters.habitat.debug) {\n console.warn(`Hamsters.js ${this.hamsters.version} no send channels available.`);\n }\n return null;\n }\n\n let minLatency = Infinity;\n let targetClient = null;\n\n sendChannelKeys.forEach(clientId => {\n let channel = this.sendChannels[clientId];\n if (channel.readyState === 'open' && this.latencies[clientId] < minLatency) {\n minLatency = this.latencies[clientId];\n targetClient = clientId;\n }\n });\n\n return targetClient;\n }\n\n distributeTask(task, hamsterFood, resolve, reject) {\n const targetClient = this.fetchDistributedClient();\n if (!targetClient) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} no target client found.`);\n }\n reject('No target client found.');\n return;\n }\n\n const messageId = this.generateUniqueId();\n\n const subTask = {\n hamsterFood,\n index: hamsterFood.index,\n task,\n messageId,\n };\n\n this.pendingPromises[messageId] = { resolve, reject };\n\n this.sendData({ targetClient, data: subTask });\n }\n\n handleTaskResponse(incomingMessage) {\n const { messageId, output, error } = incomingMessage;\n const pendingPromise = this.pendingPromises[messageId];\n\n if (pendingPromise) {\n if (error) {\n pendingPromise.reject(error);\n } else {\n pendingPromise.resolve(output);\n }\n\n delete this.pendingPromises[messageId];\n }\n }\n\n sendData({ targetClient, data }) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent data to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n sendDataResponse(data) {\n const targetClient = data.targetClient;\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent response to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n closeDataChannels() {\n for (const targetClient in this.sendChannels) {\n if (this.sendChannels[targetClient]) {\n this.sendChannels[targetClient].close();\n delete this.sendChannels[targetClient];\n }\n if (this.receiveChannels[targetClient]) {\n this.receiveChannels[targetClient].close();\n delete this.receiveChannels[targetClient];\n }\n if (this.remoteConnections[targetClient]) {\n this.remoteConnections[targetClient].close();\n delete this.remoteConnections[targetClient];\n }\n delete this.latencies[targetClient];\n }\n this.localConnection = null;\n }\n\n receiveChannelCallback(event, targetClient) {\n const receiveChannel = event.channel;\n\n receiveChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n receiveChannel.onopen = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n receiveChannel.onclose = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n this.receiveChannels[targetClient] = receiveChannel;\n }\n\n onReceiveMessageCallback(targetClient, data) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received message!`);\n }\n const incomingMessage = JSON.parse(data);\n\n if (incomingMessage.isReply) {\n this.handleTaskResponse(incomingMessage);\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} response received for task: `, incomingMessage);\n }\n } else {\n this.hamsters.pool.runDistributedTask(incomingMessage, targetClient);\n }\n }\n\n onSendChannelStateChange(targetClient) {\n const sendChannel = this.sendChannels[targetClient];\n this.measureLatency(targetClient);\n if (sendChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} send channel state changed for ${targetClient}: ${sendChannel.readyState}`);\n }\n }\n\n onReceiveChannelStateChange(targetClient) {\n const receiveChannel = this.receiveChannels[targetClient];\n if (receiveChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} receive channel state changed for ${targetClient}: ${receiveChannel.readyState}`);\n }\n }\n\n generateUniqueId() {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n }\n\n onCreateSessionDescriptionError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to create session description: ${error}`);\n }\n }\n\n onAddIceCandidateError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to add ICE candidate: ${error}`);\n }\n }\n}\n\nmodule.exports = Distribute;\n\n\n// WEBPACK FOOTER //\n// ./feature/distribute.js"],"sourceRoot":""} \ No newline at end of file diff --git a/build/hamsters.web.min.js b/build/hamsters.web.min.js index 5ff1919e..b696ad88 100644 --- a/build/hamsters.web.min.js +++ b/build/hamsters.web.min.js @@ -111,7 +111,7 @@ var hamsters = _classCallCheck(this, hamstersjs); - this.version = '5.5.10'; + this.version = '5.5.9'; this.run = this.hamstersRun.bind(this); this.promise = this.hamstersPromise.bind(this); this.init = this.inititializeLibrary.bind(this); diff --git a/build/hamsters.web.min.js.map b/build/hamsters.web.min.js.map index 6c265ec5..1b81fc5c 100644 --- a/build/hamsters.web.min.js.map +++ b/build/hamsters.web.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap ab360deea418a9f4b6d4","webpack:///./hamsters.js","webpack:///./core/habitat.js","webpack:///../~/node-libs-browser/~/process/browser.js","webpack:///./core/pool.js","webpack:///./core/data.js","webpack:///./core/wheel.js","webpack:///./core/task.js","webpack:///./feature/memoize.js","webpack:///./feature/stores/NodeStore.js","webpack:///./feature/stores/WebStore.js","webpack:///./feature/distribute.js"],"names":["hamstersjs","version","run","hamstersRun","bind","promise","hamstersPromise","init","inititializeLibrary","data","pool","wheel","habitat","memoize","startOptions","Data","Pool","Wheel","Habitat","Memoize","distribute","Distribute","processStartOptions","legacy","persistence","spawnHamsters","maxThreads","relay","console","info","establishConnection","Object","keys","key","includes","toLowerCase","forceLegacyMode","Worker","isIE","task","resolve","reject","input","memoizedFunction","scheduleTask","then","catch","params","functionToRun","Promise","Task","onSuccess","onError","hamsters","module","exports","debug","importScripts","browser","isBrowser","webWorker","isWebWorker","node","isNode","reactNative","isReactNative","shell","isShell","transferable","supportsTransferableObjects","atomics","supportsAtomicOperations","proxies","supportsProxies","isInternetExplorer","selectHamsterWheel","sharedWorker","locateSharedWorkerObject","locateBlobBuilder","findAvailableBlobBuilder","isLegacyEnvironment","locateWorkerObject","determineGlobalThreads","getHabitatKeys","max","navigator","hardwareConcurrency","isFirefox","os","cpus","length","userAgent","indexOf","SharedWorker","window","process","product","isLegacy","supportsSharedWorkers","supports","workerBlob","generateWorkerBlob","SharedHamster","e","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","textContent","Blob","BlobMaker","blob","append","type","getBlob","workerLogic","URL","createObjectURL","createDataBlob","String","Uint8Array","SharedArrayBuffer","Proxy","regular","threads","running","pending","fetchHamster","getAvailableThread","index","hamsterFood","scheduler","metrics","count","enqueued_at","Date","now","push","hamster","item","id","dequeued_at","runTask","threadId","spawnHamster","started_at","workers","parentPort","hamsterWheel","subTaskId","array","getSubArrayFromIndex","sharedBuffer","excludedKeys","Set","hasOwnProperty","has","incomingMessage","targetClient","handleResponse","returnDistributedOutput","messageId","isReply","keepTrackOfThread","trainHamster","feedHamster","prepareMeal","addWorkToPending","distributeTask","output","processDataType","dataType","aggregate","aggregateThreadOutputs","sort","sortOutput","completed_at","splice","message","response","messageData","JSON","parse","undefined","mixedOutput","addThreadOutputWithIndex","onThreadResponse","port","onmessage","onmessageerror","onerror","once","processReturn","removeFromRunning","returnOutputAndRemoveTask","terminate","queueHamster","processQueuedItem","shift","setOnMessage","i","indexes","getSubArrayUsingIndex","getSubArrayIndexes","calculateIndexes","sortTaskOutput","typedArrayFromBuffer","prepareFunction","prepareWorkerTask","messageWorkerThread","getBufferSize","createSharedBuffer","getDataType","setupSharedArrayBuffer","postMessage","stringify","getTransferableObjects","obj","typedArrayBuffers","transferableObjects","typedArrayTypes","otherTransferables","globalContext","global","prop","buffer","concat","types","Uint32Array","Uint16Array","Uint8ClampedArray","Int32Array","Int16Array","Int8Array","Float32Array","Float64Array","functionBody","functionString","substring","arr","order","Array","prototype","call","a","b","reverse","byteLength","sharedArray","constructor","set","reduce","len","bufferLength","offset","outputLength","start","n","end","segmentSize","Math","floor","startIndex","endIndex","inputArray","slice","worker","workerScaffold","regularScaffold","legacyScaffold","self","rtn","addEventListener","incomingConnection","ports","eval","hamstersJob","buffers","handleDataType","returnResponse","allTypes","add","from","setupLegacyTask","setupModernTask","setupDebugMetrics","created_at","setupThreadMetrics","threadMetrics","maxSize","store","NodeStore","WebStore","func","generateTaskKey","get","cachedResult","applyFunc","result","hashCode","str","hash","chr","charCodeAt","toString","args","apply","error","cache","Map","value","delete","size","oldestKey","next","clear","dbName","storeName","db","initDB","request","indexedDB","open","event","target","onupgradeneeded","objectStoreNames","contains","objectStore","createObjectStore","keyPath","createIndex","unique","onsuccess","transaction","updateTimestamp","checkSize","put","timestamp","countRequest","evictOldest","openCursor","cursor","localConnection","remoteConnections","sendChannels","receiveChannels","pcConstraint","dataConstraint","ws","clientId","pendingPromises","sendDataResponse","latencies","initWebSocket","WebSocket","onopen","registerMessage","logicalCores","send","handleClientReconnect","updateClientList","clients","handleOffer","handleAnswer","handleCandidate","handleTaskResponse","onclose","forEach","client","createConnection","newClientId","log","close","loadClientList","fetch","json","servers","iceServers","urls","RTCPeerConnection","sendChannel","createDataChannel","onicecandidate","candidate","onSendChannelStateChange","handlePing","startTime","handlePong","onReceiveMessageCallback","ondatachannel","receiveChannelCallback","createOffer","setLocalDescription","desc","offer","onCreateSessionDescriptionError","remoteConnection","setRemoteDescription","RTCSessionDescription","createAnswer","answer","connection","addIceCandidate","RTCIceCandidate","onAddIceCandidateError","performance","sendPing","readyState","latency","toFixed","sendChannelKeys","warn","minLatency","Infinity","channel","fetchDistributedClient","generateUniqueId","subTask","sendData","pendingPromise","receiveChannel","onReceiveChannelStateChange","runDistributedTask","measureLatency","random","substr"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;sjBCtCA;;AAEA;;;;;;;;;AAeA;;;AANA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAGA;;;;AACA;;;;;;;;KAEMA,U;;AAEJ;;;;AAIA,yBAAc;AACZ;;AADY;;AAGZ,UAAKC,OAAL,GAAe,QAAf;AACA,UAAKC,GAAL,GAAW,KAAKC,WAAL,CAAiBC,IAAjB,CAAsB,IAAtB,CAAX;AACA,UAAKC,OAAL,GAAe,KAAKC,eAAL,CAAqBF,IAArB,CAA0B,IAA1B,CAAf;AACA,UAAKG,IAAL,GAAY,KAAKC,mBAAL,CAAyBJ,IAAzB,CAA8B,IAA9B,CAAZ;AACA,UAAKK,IAAL,GAAY,EAAZ;AACA,UAAKC,IAAL,GAAY,EAAZ;AACA,UAAKC,KAAL,GAAa,EAAb;AACA,UAAKC,OAAL,GAAe,EAAf;AACA,UAAKC,OAAL,GAAe,EAAf;AACD;;AAED;;;;;;;;yCAIoBC,Y,EAAc;AAChC,YAAKL,IAAL,GAAY,IAAIM,cAAJ,CAAS,IAAT,CAAZ;AACA,YAAKL,IAAL,GAAY,IAAIM,cAAJ,CAAS,IAAT,CAAZ;AACA,YAAKL,KAAL,GAAa,IAAIM,eAAJ,CAAU,IAAV,CAAb;AACA,YAAKL,OAAL,GAAe,IAAIM,iBAAJ,CAAY,IAAZ,CAAf;AACA,YAAKL,OAAL,GAAe,IAAIM,iBAAJ,CAAY,IAAZ,EAAkB,GAAlB,CAAf,CALgC,CAKO;AACvC,YAAKC,UAAL,GAAkB,IAAIC,oBAAJ,CAAe,IAAf,CAAlB;;AAEA,YAAKC,mBAAL,CAAyBR,YAAzB;;AAEA,WAAG,CAAC,KAAKF,OAAL,CAAaW,MAAd,IAAwB,KAAKX,OAAL,CAAaY,WAAb,KAA6B,IAAxD,EAA8D;AAC5D,cAAKd,IAAL,CAAUe,aAAV,CAAwB,KAAKb,OAAL,CAAac,UAArC;AACD;AACD,YAAKA,UAAL,GAAkB,KAAKd,OAAL,CAAac,UAA/B;;AAEA,WAAG,KAAKd,OAAL,CAAae,KAAhB,EAAuB;AACrBC,iBAAQC,IAAR,kBAA4B,KAAK5B,OAAjC;AACA,cAAKmB,UAAL,CAAgBU,mBAAhB;AACD;;AAEDF,eAAQC,IAAR,kBAA4B,KAAK5B,OAAjC,iCAAoE,KAAKW,OAAL,CAAac,UAAjF;AACD;;AAED;;;;;;;yCAIoBZ,Y,EAAc;AAChC,WAAI,OAAOA,YAAP,KAAwB,WAA5B,EAAyC;AAAA;AAAA;AAAA;;AAAA;AACvC,gCAAkBiB,OAAOC,IAAP,CAAYlB,YAAZ,CAAlB,8HAA6C;AAAA,iBAAlCmB,GAAkC;;AAC3C,iBAAI,KAAKrB,OAAL,CAAaoB,IAAb,CAAkBE,QAAlB,CAA2BD,IAAIE,WAAJ,EAA3B,CAAJ,EAAmD;AACjD,oBAAKvB,OAAL,CAAaqB,GAAb,IAAoBnB,aAAamB,GAAb,CAApB;AACD,cAFD,MAEO;AACL,oBAAKA,GAAL,IAAYnB,aAAamB,GAAb,CAAZ;AACD;AACF;AAPsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQxC;AACD;AACA,WAAIG,kBAAmB,OAAOtB,YAAP,KAAwB,WAAxB,IAAuC,OAAOA,aAAaS,MAApB,KAA+B,WAA7F;AACA,WAAIa,eAAJ,EAAqB;AACnBA,2BAAkBtB,aAAaS,MAA/B;AACD;AACD,WAAI,OAAO,KAAKX,OAAL,CAAayB,MAApB,KAA+B,UAA/B,IAA6C,CAACD,eAAlD,EAAmE;AACjE,cAAKxB,OAAL,CAAaW,MAAb,GAAsB,KAAKX,OAAL,CAAa0B,IAAnC;AACD;AACF;;AAED;;;;;;;;;;;kCAQaC,I,EAAMC,O,EAASC,M,EAAQ;AAAA;;AAClC,WAAIF,KAAKG,KAAL,CAAW7B,OAAf,EAAwB;AACtB;AACA,aAAM8B,mBAAmB,KAAK9B,OAAL,CAAaA,OAAb,CAAqB;AAAA,kBAAM,MAAKH,IAAL,CAAUkC,YAAV,CAAuBL,IAAvB,CAAN;AAAA,UAArB,CAAzB;AACA,gBAAOI,iBAAiBJ,IAAjB,EAAuBM,IAAvB,CAA4BL,OAA5B,EAAqCM,KAArC,CAA2CL,MAA3C,CAAP;AACD;AACD,cAAO,KAAK/B,IAAL,CAAUkC,YAAV,CAAuBL,IAAvB,EACFM,IADE,CACGL,OADH,EAEFM,KAFE,CAEIL,MAFJ,CAAP;AAGD;;AAED;;;;;;;;;;qCAOgBM,M,EAAQC,a,EAAe;AAAA;;AACrC,cAAO,IAAIC,OAAJ,CAAY,UAACT,OAAD,EAAUC,MAAV,EAAqB;AACtC,gBAAKG,YAAL,CAAkB,IAAIM,cAAJ,CAAS,MAAT,EAAeH,MAAf,EAAuBC,aAAvB,CAAlB,EAAyDR,OAAzD,EAAkEC,MAAlE;AACD,QAFM,CAAP;AAGD;;AAED;;;;;;;;;;iCAOYM,M,EAAQC,a,EAAeG,S,EAAWC,O,EAAS;AACrD,YAAKR,YAAL,CAAkB,IAAIM,cAAJ,CAAS,IAAT,EAAeH,MAAf,EAAuBC,aAAvB,CAAlB,EAAyDG,SAAzD,EAAoEC,OAApE;AACD;;;;;;AAGH,KAAMC,WAAW,IAAIrD,UAAJ,EAAjB;;AAEAsD,QAAOC,OAAP,GAAiBF,QAAjB,C;;;;;;;;;;;;;;AC1IA;;AAEA;;;;;;;;;KASMnC,O;;AAEJ;;;;AAIA,oBAAYmC,QAAZ,EAAsB;AACpB;;AADoB;;AAGpB,UAAKA,QAAL,GAAgBA,QAAhB;AACA,UAAKG,KAAL,GAAa,KAAb;AACA,UAAKC,aAAL,GAAqB,IAArB;AACA,UAAK9B,KAAL,GAAa,IAAb;AACA,UAAKd,OAAL,GAAe,KAAf;AACA,UAAKW,WAAL,GAAmB,IAAnB;AACA,UAAKkC,OAAL,GAAe,KAAKC,SAAL,EAAf;AACA,UAAKC,SAAL,GAAiB,KAAKC,WAAL,EAAjB;AACA,UAAKC,IAAL,GAAY,KAAKC,MAAL,EAAZ;AACA,UAAKC,WAAL,GAAmB,KAAKC,aAAL,EAAnB;AACA,UAAKC,KAAL,GAAa,KAAKC,OAAL,EAAb;AACA,UAAKC,YAAL,GAAoB,KAAKC,2BAAL,EAApB;AACA,UAAKC,OAAL,GAAe,KAAKC,wBAAL,EAAf;AACA,UAAKC,OAAL,GAAe,KAAKC,eAAL,EAAf;AACA,UAAKnC,IAAL,GAAY,KAAKoC,kBAAL,EAAZ;AACA,UAAKC,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBvE,IAAxB,CAA6B,IAA7B,CAA1B;AACA,UAAKwE,YAAL,GAAoB,KAAKC,wBAAL,EAApB;AACA,UAAKC,iBAAL,GAAyB,KAAKC,wBAAL,EAAzB;AACA,UAAKxD,MAAL,GAAc,KAAKyD,mBAAL,EAAd;AACA,UAAK3C,MAAL,GAAc,KAAK4C,kBAAL,EAAd;AACA,UAAKvD,UAAL,GAAkB,KAAKwD,sBAAL,EAAlB;AACA,UAAKlD,IAAL,GAAY,KAAKmD,cAAL,EAAZ;AACD;;AAED;;;;;;;8CAGyB;AACvB,WAAIC,MAAM,CAAV;AACA,WAAG,KAAK1B,OAAL,IAAgB,OAAO2B,UAAUC,mBAAjB,KAAyC,WAA5D,EAAyE;AACvEF,eAAMC,UAAUC,mBAAhB;AACA,aAAG,KAAKC,SAAL,EAAH,EAAqB;AACnBH,iBAAOA,MAAM,EAAN,GAAW,EAAX,GAAgBA,GAAvB;AACD;AACF;AACD,WAAG,KAAKtB,IAAL,IAAa,OAAO0B,EAAP,KAAc,WAA9B,EAA2C;AACzCJ,eAAMI,GAAGC,IAAH,GAAUC,MAAhB;AACD;AACD,cAAON,GAAP;AACD;;AAED;;;;;;iCAGY;AACV,WAAG,OAAOC,SAAP,KAAqB,WAArB,IAAoC,OAAOA,UAAUM,SAAjB,KAA+B,WAAtE,EAAmF;AACjF,gBAAQN,UAAUM,SAAV,CAAoBxD,WAApB,GAAkCyD,OAAlC,CAA0C,SAA1C,MAAyD,CAAC,CAAlE;AACD;AACD,cAAO,KAAP;AACD;;AAED;;;;;;0CAGqB;AACnB,cAAQ,OAAOvD,MAAP,KAAkB,WAAlB,GAAgCA,MAAhC,GAAyC,KAAjD;AACD;;AAED;;;;;;gDAG2B;AACzB,cAAQ,OAAOwD,YAAP,KAAwB,WAAxB,GAAsCA,YAAtC,GAAqD,KAA7D;AACD;;AAED;;;;;;iCAGY;AACV,cAAQ,QAAOC,MAAP,yCAAOA,MAAP,OAAkB,QAA1B;AACD;;AAED;;;;;;0CAGqB;AACnB,WAAG,OAAOT,SAAP,KAAqB,WAArB,IAAoC,OAAOA,UAAUM,SAAjB,KAA+B,WAAtE,EAAmF;AACjF,gBAAQN,UAAUM,SAAV,CAAoBC,OAApB,CAA4B,OAA5B,MAAyC,CAAC,CAA1C,IAA+CP,UAAUM,SAAV,CAAoBC,OAApB,CAA4B,UAA5B,MAA4C,CAAC,CAApG;AACD;AACD,cAAO,KAAP;AACD;;AAED;;;;;;8BAGS;AACP,cAAQ,QAAOG,OAAP,yCAAOA,OAAP,OAAmB,QAAnB,IAA+B,eAAmB,UAAlD,IAAgE,CAAC,KAAKlC,WAAL,EAAjE,IAAuF,CAAC,KAAKH,OAArG;AACD;;AAED;;;;;;mCAGc;AACZ,cAAQ,OAAOD,aAAP,KAAyB,UAAzB,IAAuC,CAAC,KAAKQ,aAAL,EAAhD;AACD;;AAED;;;;;;qCAGgB;AACd,cAAQ,OAAOoB,SAAP,KAAqB,WAArB,IAAoC,OAAOA,UAAUW,OAAjB,KAA6B,WAAjE,IAAgFX,UAAUW,OAAV,KAAsB,aAA9G;AACD;;AAED;;;;;;+BAGU;AACR,cAAS,OAAOX,SAAP,KAAqB,WAAtB,IAAsC,CAAC,KAAKtB,MAAL,EAAvC,IAAwD,CAAC,KAAKF,WAAL,EAAzD,IAA+E,CAAC,KAAKI,aAAL,EAAxF;AACD;;AAED;;;;;;2CAGsB;AACpB,WAAIgC,WAAW,CAAC,CAAC,CAAC,KAAK5D,MAAvB;AACA;AACA,WAAI,KAAKwB,WAAL,MAAsB,OAAO,KAAKgC,YAAZ,KAA6B,WAAvD,EAAoE;AAClEI,oBAAW,CAAC,KAAKC,qBAAL,EAAZ;AACD;AACD,cAAOD,QAAP;AACD;;AAED;;;;;;6CAGwB;AACtB,WAAIE,WAAW,KAAf;AACA,WAAI;AACF,aAAIC,aAAa,KAAKC,kBAAL,CAAwB,KAAK1B,kBAAL,EAAxB,CAAjB;AACA,aAAI2B,gBAAgB,IAAI,KAAKT,YAAT,CAAsBO,UAAtB,EAAkC,oBAAlC,CAApB;AACAD,oBAAW,IAAX;AACD,QAJD,CAIE,OAAOI,CAAP,EAAU;AACVJ,oBAAW,KAAX;AACD;AACD,cAAOA,QAAP;AACD;;AAED;;;;;;gDAG2B;AACzB,WAAG,OAAOK,WAAP,KAAuB,WAA1B,EAAuC;AACrC,gBAAOA,WAAP;AACD;AACD,WAAG,OAAOC,iBAAP,KAA6B,WAAhC,EAA6C;AAC3C,gBAAOA,iBAAP;AACD;AACD,WAAG,OAAOC,cAAP,KAA0B,WAA7B,EAA0C;AACxC,gBAAOA,cAAP;AACD;AACD,WAAG,OAAOC,aAAP,KAAyB,WAA5B,EAAyC;AACvC,gBAAOA,aAAP;AACD;AACD,cAAO,0CAAP;AACD;;AAED;;;;;;;oCAIeC,W,EAAa;AAC1B,WAAG,OAAOC,IAAP,KAAgB,WAAnB,EAAgC;AAC9B,aAAIC,YAAY,KAAKhC,iBAAL,EAAhB;AACA,aAAIiC,OAAO,IAAID,SAAJ,EAAX;AACAC,cAAKC,MAAL,CAAY,CAACJ,WAAD,CAAZ,EAA2B;AACzBK,iBAAM;AADmB,UAA3B;AAGA,gBAAOF,KAAKG,OAAL,EAAP;AACD;AACD,cAAO,IAAIL,IAAJ,CAAS,CAACD,WAAD,CAAT,EAAwB;AAC7BK,eAAM;AADuB,QAAxB,CAAP;AAGD;;AAED;;;;;;;wCAImBE,W,EAAa;AAC9B,cAAQC,IAAIC,eAAJ,CAAoB,KAAKC,cAAL,CAAoB,MAAMC,OAAOJ,WAAP,CAAN,GAA4B,MAAhD,CAApB,CAAR;AACD;;AAED;;;;;;mDAG8B;AAC5B,cAAQ,OAAOK,UAAP,KAAsB,WAA9B;AACD;;AAED;;;;;;gDAG2B;AACzB,cAAQ,OAAOC,iBAAP,KAA6B,WAArC;AACD;;AAED;;;;;;uCAGkB;AAChB,cAAQ,OAAOC,KAAP,KAAiB,WAAzB;AACD;;AAED;;;;;;0CAGqB;AACnB,WAAG,KAAKpF,IAAR,EAAc;AACZ,gBAAO,KAAKe,QAAL,CAAc1C,KAAd,CAAoBY,MAA3B;AACD;AACD,WAAG,KAAKyC,WAAR,EAAqB;AACnB,gBAAO,uBAAP;AACD;AACD,WAAI,KAAKF,IAAT,EAAe;AACb,gBAAO,iDAAP;AACD;AACD,cAAO,KAAKuC,kBAAL,CAAwB,KAAKhD,QAAL,CAAc1C,KAAd,CAAoBgH,OAA5C,CAAP;AACD;;AAED;;;;;;sCAGiB;AACf,cAAO,CACL,QADK,EACI,cADJ,EAEL,QAFK,EAEI,SAFJ,EAGL,aAHK,EAGS,SAHT,EAIL,cAJK,EAIU,SAJV,EAKL,OALK,EAKG,MALH,EAKU,OALV,EAML,aANK,EAMS,eANT,EAOL,YAPK,EAOS,YAPT,EAQL,WARK,EAQQ,OARR,CAAP;AAUD;;;;;;AAGHrE,QAAOC,OAAP,GAAiBrC,OAAjB,C;;;;;;;AChQA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;AACL;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAqC;;AAErC;AACA;AACA;;AAEA,4BAA2B;AAC3B;AACA;AACA;AACA,6BAA4B,UAAU;;;;;;;;;;;;;ACvLtC;;AAEA;;;;;;;;;KASMF,I;AACJ;;;;AAIA,iBAAYqC,QAAZ,EAAsB;AACpB;;AADoB;;AAGpB,UAAKA,QAAL,GAAgBA,QAAhB;AACA,UAAKuE,OAAL,GAAe,EAAf;AACA,UAAKC,OAAL,GAA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","file":"hamsters.web.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ab360deea418a9f4b6d4","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nimport Habitat from './core/habitat';\nimport Pool from './core/pool';\nimport Data from './core/data';\nimport Wheel from './core/wheel';\nimport Task from './core/task';\n\n//Features\nimport Memoize from './feature/memoize';\nimport Distribute from './feature/distribute';\n\nclass hamstersjs {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor() {\n 'use strict';\n\n this.version = '5.5.10';\n this.run = this.hamstersRun.bind(this);\n this.promise = this.hamstersPromise.bind(this);\n this.init = this.inititializeLibrary.bind(this);\n this.data = {};\n this.pool = {};\n this.wheel = {};\n this.habitat = {};\n this.memoize = {};\n }\n\n /**\n * @function inititializeLibrary - Prepares & initializes Hamsters.js library\n * @param {object} startOptions - Provided library functionality options\n */\n inititializeLibrary(startOptions) {\n this.data = new Data(this);\n this.pool = new Pool(this);\n this.wheel = new Wheel(this);\n this.habitat = new Habitat(this);\n this.memoize = new Memoize(this, 100); //Set a maximum of 100 memoized function results, LRU cache\n this.distribute = new Distribute(this);\n\n this.processStartOptions(startOptions);\n \n if(!this.habitat.legacy && this.habitat.persistence === true) {\n this.pool.spawnHamsters(this.habitat.maxThreads);\n }\n this.maxThreads = this.habitat.maxThreads;\n\n if(this.habitat.relay) {\n console.info(`Hamsters.js ${this.version} establishing connection to relay`);\n this.distribute.establishConnection();\n }\n\n console.info(`Hamsters.js ${this.version} initialized using up to ${this.habitat.maxThreads} threads`);\n }\n\n /**\n * @function processStartOptions - Adjusts library functionality based on provided options\n * @param {object} startOptions - Provided library functionality options\n */\n processStartOptions(startOptions) {\n if (typeof startOptions !== 'undefined') {\n for (const key of Object.keys(startOptions)) {\n if (this.habitat.keys.includes(key.toLowerCase())) {\n this.habitat[key] = startOptions[key];\n } else {\n this[key] = startOptions[key];\n }\n }\n }\n // Ensure legacy mode is disabled when we pass a third party worker library\n let forceLegacyMode = (typeof startOptions !== 'undefined' && typeof startOptions.legacy !== 'undefined');\n if (forceLegacyMode) {\n forceLegacyMode = startOptions.legacy;\n }\n if (typeof this.habitat.Worker === 'function' && !forceLegacyMode) {\n this.habitat.legacy = this.habitat.isIE;\n }\n }\n\n /**\n * @async\n * @function scheduleTask - Schedules a new function to be processed by the library\n * @param {object} task - Provided library execution options\n * @param {function} resolve - Parent function promise resolve method\n * @param {function} reject - Parent function promise reject method\n * @return {Promise} Promise object on completion\n */\n scheduleTask(task, resolve, reject) {\n if (task.input.memoize) {\n // Pass the task object to the memoized function\n const memoizedFunction = this.memoize.memoize(() => this.pool.scheduleTask(task));\n return memoizedFunction(task).then(resolve).catch(reject);\n }\n return this.pool.scheduleTask(task)\n .then(resolve)\n .catch(reject);\n }\n\n /**\n * @async\n * @function hamstersPromise - Calls library functionality using async promises\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n * @return {Promise} Promise resolving with results from functionToRun\n */\n hamstersPromise(params, functionToRun) {\n return new Promise((resolve, reject) => {\n this.scheduleTask(new Task(this, params, functionToRun), resolve, reject);\n });\n }\n\n /**\n * @async\n * @function hamstersRun - Calls library functionality using async callbacks\n * @param {object} params - Provided library execution options\n * @param {function} onError - Function to call upon execution failure\n * @return {array} Results from functionToRun.\n */\n hamstersRun(params, functionToRun, onSuccess, onError) {\n this.scheduleTask(new Task(this, params, functionToRun), onSuccess, onError);\n }\n}\n\nconst hamsters = new hamstersjs();\n\nmodule.exports = hamsters;\n\n\n\n// WEBPACK FOOTER //\n// ./hamsters.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Habitat {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.debug = false;\n this.importScripts = null;\n this.relay = null;\n this.memoize = false;\n this.persistence = true;\n this.browser = this.isBrowser();\n this.webWorker = this.isWebWorker();\n this.node = this.isNode();\n this.reactNative = this.isReactNative();\n this.shell = this.isShell();\n this.transferable = this.supportsTransferableObjects();\n this.atomics = this.supportsAtomicOperations();\n this.proxies = this.supportsProxies();\n this.isIE = this.isInternetExplorer();\n this.selectHamsterWheel = this.selectHamsterWheel.bind(this);\n this.sharedWorker = this.locateSharedWorkerObject();\n this.locateBlobBuilder = this.findAvailableBlobBuilder();\n this.legacy = this.isLegacyEnvironment();\n this.Worker = this.locateWorkerObject();\n this.maxThreads = this.determineGlobalThreads();\n this.keys = this.getHabitatKeys();\n }\n\n /**\n * @function determineGlobalThreads - Determines max number of threads to use\n */\n determineGlobalThreads() {\n let max = 4;\n if(this.browser && typeof navigator.hardwareConcurrency !== \"undefined\") {\n max = navigator.hardwareConcurrency;\n if(this.isFirefox()) {\n max = (max > 20 ? 20 : max);\n }\n }\n if(this.node && typeof os !== 'undefined') {\n max = os.cpus().length;\n }\n return max;\n }\n\n /**\n * @function isFirefox - Detect firefox browser\n */\n isFirefox() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.toLowerCase().indexOf('firefox') !== -1);\n }\n return false;\n }\n\n /**\n * @function locateWorkerObject - Attempts to find a global Worker object\n */\n locateWorkerObject() {\n return (typeof Worker !== 'undefined' ? Worker : false);\n }\n\n /**\n * @function locateSharedWorkerObject - Attempts to find a global SharedWorker object\n */\n locateSharedWorkerObject() {\n return (typeof SharedWorker !== 'undefined' ? SharedWorker : false);\n }\n\n /**\n * @function isBrowser - Detects if execution environment is a browser\n */\n isBrowser() {\n return (typeof window === \"object\");\n }\n\n /**\n * @function isInternetExplorer - Detects if execution environment is internet explorer\n */\n isInternetExplorer() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.indexOf(\"MSIE \") !== -1 || navigator.userAgent.indexOf(\"Trident/\") !== -1);\n }\n return false;\n }\n\n /**\n * @function isNode - Detects if execution environment is node.js\n */\n isNode() {\n return (typeof process === \"object\" && typeof require === \"function\" && !this.isWebWorker() && !this.browser);\n }\n\n /**\n * @function isWebWorker - Detects if execution environment is a web worker\n */\n isWebWorker() {\n return (typeof importScripts === \"function\" && !this.isReactNative());\n }\n\n /**\n * @function isReactNative - Detects if execution environment is React Native\n */\n isReactNative() {\n return (typeof navigator !== \"undefined\" && typeof navigator.product !== \"undefined\" && navigator.product === \"ReactNative\");\n }\n\n /**\n * @function isShell - Detects if execution environment is a shell\n */\n isShell() {\n return ((typeof navigator === \"undefined\") && !this.isNode() && !this.isWebWorker() && !this.isReactNative());\n }\n\n /**\n * @function isLegacyEnvironment - Detects if execution environment is a legacy environment\n */\n isLegacyEnvironment() {\n let isLegacy = !!!this.Worker;\n // Detect sharedWorker support for use within webworkers\n if (this.isWebWorker() && typeof this.SharedWorker !== 'undefined') {\n isLegacy = !this.supportsSharedWorkers();\n }\n return isLegacy;\n }\n\n /**\n * @function supportsSharedWorkers - Detects if execution environment supports SharedWorkers\n */\n supportsSharedWorkers() {\n let supports = false;\n try {\n let workerBlob = this.generateWorkerBlob(this.selectHamsterWheel());\n let SharedHamster = new this.SharedWorker(workerBlob, 'SharedHamsterWheel');\n supports = true;\n } catch (e) {\n supports = false;\n }\n return supports;\n }\n\n /**\n * @function findAvailableBlobBuilder - Attempts to locate a data blob builder, with vendor prefixes\n */\n findAvailableBlobBuilder() {\n if(typeof BlobBuilder !== 'undefined') {\n return BlobBuilder;\n }\n if(typeof WebKitBlobBuilder !== 'undefined') {\n return WebKitBlobBuilder;\n }\n if(typeof MozBlobBuilder !== 'undefined') {\n return MozBlobBuilder;\n }\n if(typeof MSBlobBuilder !== 'undefined') {\n return MSBlobBuilder;\n }\n return 'Environment does not support data blobs!';\n }\n\n /**\n * @function createDataBlob - Creates a new data blob from textContent\n * @param {string} textContent - Provided text content for blob\n */\n createDataBlob(textContent) {\n if(typeof Blob === 'undefined') {\n let BlobMaker = this.locateBlobBuilder();\n let blob = new BlobMaker();\n blob.append([textContent], {\n type: 'application/javascript'\n });\n return blob.getBlob();\n }\n return new Blob([textContent], {\n type: 'application/javascript'\n });\n }\n\n /**\n * @function generateWorkerBlob - Creates a blob URI for flexible scaffold loading\n * @param {function} workerLogic - Scaffold to use within worker thread\n */\n generateWorkerBlob(workerLogic) {\n return URL.createObjectURL(this.createDataBlob('(' + String(workerLogic) + ')();'));\n }\n\n /**\n * @function supportsTransferableObjects - Detects if execution environment supports typed arrays\n */\n supportsTransferableObjects() {\n return (typeof Uint8Array !== 'undefined');\n }\n\n /**\n * @function supportsAtomicOperations - Detects if execution environment supports SharedArrayBuffers\n */\n supportsAtomicOperations() {\n return (typeof SharedArrayBuffer !== 'undefined');\n }\n\n /**\n * @function supportsProxies - Detects if execution environment supports Proxy objects\n */\n supportsProxies() {\n return (typeof Proxy !== 'undefined');\n }\n\n /**\n * @function selectHamsterWheel - Determines which scaffold to use for proper execution for various environments\n */\n selectHamsterWheel() {\n if(this.isIE) {\n return this.hamsters.wheel.legacy;\n }\n if(this.reactNative) {\n return 'reactNativeHamster.js';\n }\n if (this.node) {\n return './node_modules/hamsters.js/build/common/node.js';\n }\n return this.generateWorkerBlob(this.hamsters.wheel.regular);\n }\n\n /**\n * @function getHabitatKeys - Returns keys for this Habitat instance\n */\n getHabitatKeys() {\n return [\n 'worker','sharedworker',\n 'legacy','proxies',\n 'reactnative','atomics',\n 'transferable','browser',\n 'shell','node','debug',\n 'persistence','importscripts',\n 'maxthreads', 'parentport',\n 'webworker', 'relay'\n ];\n }\n}\n\nmodule.exports = Habitat;\n\n\n// WEBPACK FOOTER //\n// ./core/habitat.js","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../~/node-libs-browser/~/process/browser.js\n// module id = 3\n// module chunks = 0","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Pool {\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.threads = [];\n this.running = [];\n this.pending = [];\n this.fetchHamster = this.getAvailableThread.bind(this);\n }\n\n /**\n * @function addWorkToPending - Adds task to queue waiting for available thread\n * @param {number} index - Index of the task\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n addWorkToPending(index, hamsterFood, task, resolve, reject) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[task.scheduler.count].enqueued_at = Date.now();\n }\n this.pending.push({\n index,\n hamsterFood, \n task,\n resolve,\n reject\n });\n }\n\n /**\n * @function processQueuedItem - Invokes processing of next item in queue\n * @param {object} hamster - The thread to run the task\n * @param {object} item - Task to process\n */\n processQueuedItem(hamster, item) {\n if (this.hamsters.habitat.debug) {\n item.task.scheduler.metrics.threads[item.index.id].dequeued_at = Date.now();\n }\n return this.runTask(hamster, item.index, item.hamsterFood, item.task, item.resolve, item.reject);\n }\n\n /**\n * @function getAvailableThread - Gets an available thread\n * @param {number} threadId - Id of the thread\n * @returns {object} - The available thread\n */\n getAvailableThread(threadId) {\n if (this.hamsters.habitat.persistence) {\n return this.threads[threadId];\n }\n return this.spawnHamster();\n }\n\n /**\n * @function keepTrackOfThread - Keeps track of threads running, scoped globally and to task\n * @param {object} task - Provided library functionality options for this task\n * @param {number} id - Id of thread to track\n */\n keepTrackOfThread(task, id) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[id].started_at = Date.now();\n }\n task.scheduler.workers.push(id);\n this.running.push(id);\n }\n\n /**\n * @function spawnHamsters - Spawns multiple new threads for execution\n * @param {number} maxThreads - Max number of threads for this client\n */\n spawnHamsters(maxThreads) {\n while (maxThreads--) {\n this.threads.push(this.spawnHamster());\n }\n }\n\n /**\n * @function spawnHamster - Spawns a new thread for execution\n * @return {object} - New WebWorker thread using selected scaffold\n */\n spawnHamster() {\n const { selectHamsterWheel, SharedWorker, Worker, node, parentPort } = this.hamsters.habitat;\n const hamsterWheel = selectHamsterWheel();\n if (this.hamsters.habitat.webWorker) {\n return new SharedWorker(hamsterWheel, 'SharedHamsterWheel');\n }\n if (node && typeof parentPort !== 'undefined') {\n return new Worker(hamsterWheel);\n }\n return new Worker(hamsterWheel);\n }\n \n /**\n * @function prepareMeal\n * @description Prepares message to send to a thread and invoke execution\n * @param {number} index - Index of the subarray to process\n * @param {number} subTaskId - Subtask ID\n * @param {object} task - Provided library functionality options for this task\n * @returns {object} - Prepared message to send to a thread\n */\n prepareMeal(index, subTaskId, task) {\n index.id = subTaskId;\n\n // Prepare the base hamsterFood object\n const hamsterFood = {\n array: task.input.array && task.input.array.length !== 0 ? \n this.hamsters.data.getSubArrayFromIndex(index, task.input.array) : [],\n index: index\n };\n\n // Add sharedBuffer if it exists\n if (typeof task.scheduler.sharedBuffer !== 'undefined') {\n hamsterFood.sharedBuffer = task.scheduler.sharedBuffer;\n }\n\n // List of excluded keys\n const excludedKeys = new Set(['array', 'threads', 'sharedArray']);\n\n // Iterate over task.input properties and add to hamsterFood\n for (const key in task.input) {\n if (task.input.hasOwnProperty(key) && !excludedKeys.has(key)) {\n hamsterFood[key] = task.input[key];\n }\n }\n\n return hamsterFood;\n }\n\n /**\n * @function runDistributedTask - Runs incoming distributed function using thread\n * @param {object} incomingMessage - The incoming subTask object\n */\n runDistributedTask(incomingMessage, targetClient) {\n const hamster = this.fetchHamster(this.running.length);\n let task = incomingMessage.task;\n let index = incomingMessage.hamsterFood.index;\n let handleResponse = this.hamsters.distribute.returnDistributedOutput;\n task.targetClient = targetClient;\n task.messageId = incomingMessage.messageId;\n task.isReply = true;\n\n this.runTask(hamster, index, incomingMessage.hamsterFood, incomingMessage.task, handleResponse, handleResponse);\n }\n\n\n\n /**\n * @function runTask - Runs function using thread\n * @param {object} hamster - The thread to run the task\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n runTask(hamster, index, hamsterFood, task, resolve, reject) {\n const threadId = this.running.length;\n this.hamsters.pool.keepTrackOfThread(task, threadId);\n if (this.hamsters.habitat.legacy) {\n this.hamsters.wheel.legacy(hamsterFood, resolve, reject);\n } else {\n this.hamsters.pool.trainHamster(index, task, threadId, hamster, resolve, reject);\n this.hamsters.data.feedHamster(hamster, hamsterFood);\n }\n task.scheduler.count += 1;\n }\n\n /**\n * @function hamsterWheel - Runs or queues function using threads\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n hamsterWheel(index, subTaskId, task, resolve, reject) {\n const hamsterFood = this.prepareMeal(index, subTaskId, task);\n if (this.hamsters.habitat.maxThreads <= this.running.length) {\n this.addWorkToPending(index, hamsterFood, task, resolve, reject);\n } else {\n if(task.input.distribute) {\n this.hamsters.distribute.distributeTask(task, hamsterFood, resolve, reject);\n } else {\n const hamster = this.fetchHamster(this.running.length);\n this.runTask(hamster, index, hamsterFood, task, resolve, reject);\n }\n }\n }\n\n processDistributedReturn(data) {\n debugger;\n }\n\n /**\n * @function returnOutputAndRemoveTask - Gathers thread outputs into final result\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n */\n returnOutputAndRemoveTask(task, resolve) {\n if(task.scheduler.sharedBuffer) {\n task.output = hamsters.data.processDataType(task.input.dataType, task.scheduler.sharedBuffer);\n }\n if(task.input.aggregate) {\n task.output = this.hamsters.data.aggregateThreadOutputs(task.output, task.input.dataType);\n }\n if(task.input.sort) {\n task.output = this.hamsters.data.sortOutput(task.output, task.input.sort)\n }\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.completed_at = Date.now();\n console.info(\"Hamsters.js Task Completed: \", task);\n }\n if(task.input.distribute) {\n resolve(task);\n } else {\n resolve(task.output);\n }\n }\n\n /**\n * @function removeFromRunning - Removes a thread from the running pool\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to remove\n */\n removeFromRunning(task, threadId) {\n this.running.splice(this.running.indexOf(threadId), 1);\n task.scheduler.workers.splice(task.scheduler.workers.indexOf(threadId), 1);\n }\n\n /**\n * @function processReturn - Processes the returned message from a thread\n * @param {number} index - Index of the subarray processed\n * @param {object} message - Message returned from the thread\n * @param {object} task - Provided library functionality options for this task\n */\n processReturn(index, message, task) {\n const isReactNative = this.hamsters.habitat.reactNative;\n const isNode = this.hamsters.habitat.node;\n const response = message.data;\n const messageData = isReactNative ? JSON.parse(message).data : (response.data !== undefined ? response.data : response);\n const threadId = isNode ? message.index.id : response.index.id;\n\n if (task.scheduler.threads !== 1) {\n if (isReactNative || task.input.mixedOutput) {\n task.output[threadId] = messageData;\n } else {\n this.hamsters.data.addThreadOutputWithIndex(task, index, messageData);\n }\n } else {\n task.output = messageData;\n }\n }\n\n /**\n * @function setOnMessage - Sets the message handlers for a thread\n * @param {object} hamster - The thread to set the handlers on\n * @param {function} onThreadResponse - Handler for thread response\n * @param {object} habitat - Habitat configuration\n * @param {function} reject - onError method\n */\n setOnMessage(hamster, onThreadResponse, reject) {\n if (this.hamsters.habitat.webWorker) {\n hamster.port.onmessage = onThreadResponse;\n hamster.port.onmessageerror = reject;\n hamster.port.onerror = reject;\n } else if (this.hamsters.habitat.node) {\n hamster.once('message', onThreadResponse);\n hamster.once('onmessageerror', reject);\n hamster.once('error', reject);\n } else {\n hamster.onmessage = onThreadResponse;\n hamster.onmessageerror = reject;\n hamster.onerror = reject;\n }\n }\n\n /**\n * @function trainHamster - Trains thread in how to behave\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to train\n * @param {object} hamster - The thread to train\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n trainHamster(index, task, threadId, hamster, resolve, reject) {\n const onThreadResponse = (message) => {\n this.hamsters.pool.processReturn(index, message, task);\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[threadId].completed_at = Date.now();\n }\n this.hamsters.pool.removeFromRunning(task, threadId);\n if (task.scheduler.workers.length === 0 && task.scheduler.count === task.scheduler.threads) {\n this.hamsters.pool.returnOutputAndRemoveTask(task, resolve);\n }\n if (!this.hamsters.habitat.persistence) {\n hamster.terminate();\n }\n if (this.hamsters.pool.pending.length !== 0) {\n const queueHamster = this.hamsters.pool.fetchHamster(this.hamsters.pool.running.length);\n this.hamsters.pool.processQueuedItem(queueHamster, this.hamsters.pool.pending.shift());\n }\n };\n this.hamsters.pool.setOnMessage(hamster, onThreadResponse, reject);\n }\n\n /**\n * @function scheduleTask - Adds new task to the system for execution\n * @param {object} task - Provided library functionality options for this task\n */\n scheduleTask(task) {\n let i = 0;\n \treturn new Promise((resolve, reject) => {\n if(this.hamsters.debug) {\n task.scheduler.metrics.started_at = Date.now();\n }\n while (i < task.scheduler.threads) {\n this.hamsterWheel(task.scheduler.indexes[i], i, task, resolve, reject);\n i += 1;\n }\n });\n }\n}\n\nmodule.exports = Pool;\n\n\n// WEBPACK FOOTER //\n// ./core/pool.js","class Data {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters; // Set the hamsters object as a property of Data class\n this.getSubArrayFromIndex = this.getSubArrayUsingIndex.bind(this); // Bind getSubArrayUsingIndex function\n this.getSubArrayIndexes = this.calculateIndexes.bind(this); // Bind calculateIndexes function\n this.sortOutput = this.sortTaskOutput.bind(this); // Bind sortTaskOutput function\n this.aggregateThreadOutputs = this.aggregateThreadOutputs.bind(this);\n this.processDataType = this.typedArrayFromBuffer;\n this.prepareFunction = this.prepareWorkerTask.bind(this); // Bind prepareWorkerTask function\n this.feedHamster = this.messageWorkerThread.bind(this); // Bind messageWorkerThread function\n this.getBufferSize = this.getBufferSize;\n this.createSharedBuffer = this.createSharedBuffer.bind(this);\n this.getDataType = this.getDataType;\n this.setupSharedArrayBuffer = this.setupSharedArrayBuffer.bind(this);\n }\n\n /**\n * @function messageWorkerThread - Prepares message to send to thread\n * @param {object} hamstersHabitat - Hamsters Habitat instance\n * @param {Worker} hamster - Thread to message\n * @param {object} hamsterFood - Message to send to thread\n */ \n messageWorkerThread(hamster, hamsterFood) {\n if(this.hamsters.habitat.reactNative) {\n return hamster.postMessage(JSON.stringify(hamsterFood));\n }\n if (this.hamsters.habitat.webWorker) {\n return hamster.port.postMessage(hamsterFood);\n }\n return hamster.postMessage(hamsterFood, this.hamsters.data.getTransferableObjects(hamsterFood));\n }\n\n getTransferableObjects(obj) {\n const typedArrayBuffers = [];\n const transferableObjects = [];\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n const globalContext = typeof window !== 'undefined' ? window : global;\n \n for (const prop in obj) {\n for (const type of typedArrayTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n typedArrayBuffers.push(obj[prop].buffer);\n break;\n }\n }\n \n for (const type of otherTransferables) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n transferableObjects.push(obj[prop]);\n break;\n }\n }\n }\n \n return typedArrayBuffers.concat(transferableObjects);\n }\n\n /**\n * @function typedArrayFromBuffer - Converts buffer into new typed array\n * @param {string} dataType - Typed array type for this task\n * @param {object} buffer - Buffer to convert\n */\n typedArrayFromBuffer(dataType, buffer) {\n const types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if(!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n /**\n * @function prepareWorkerTask - Prepares function for thread, strips whitespace\n * @param {function} functionBody - Message to send to thread\n */\n prepareWorkerTask(functionBody) {\n let functionString = String(functionBody);\n return functionString.substring((functionString.indexOf(\"{\") + 1), (functionString.length -1));\n }\n\n /**\n * @function sortTaskOutput - Sorts array by defined order\n * @param {object} arr - Array to sort\n * @param {string} order - Defined sort order\n */\n sortTaskOutput(arr, order) {\n switch(order) {\n case 'desc':\n case 'asc':\n return Array.prototype.sort.call(arr, function(a, b) {\n return (order === 'asc' ? (a - b) : (b - a)); \n });\n case 'ascAlpha':\n return arr.sort();\n case 'descAlpha':\n return arr.reverse();\n default:\n return arr;\n }\n }\n\n /**\n * @function getBufferSize - Gets the byte length of the input array\n * @param {TypedArray} array - The input typed array\n * @returns {number} - The byte length of the array\n */\n getBufferSize(array) {\n return array.byteLength;\n }\n\n /**\n * @function createSharedBuffer - Creates a SharedArrayBuffer based on the input array's byte length\n * @param {TypedArray} array - The input typed array\n * @returns {SharedArrayBuffer} - The created SharedArrayBuffer\n */\n createSharedBuffer(array) {\n const byteLength = this.getBufferSize(array);\n const sharedBuffer = new SharedArrayBuffer(byteLength);\n const sharedArray = new array.constructor(sharedBuffer);\n\n // Copy data from the input array to the shared array\n sharedArray.set(array);\n\n return sharedBuffer;\n }\n\n /**\n * @function setupSharedArrayBuffer - Sets up the shared buffer and corresponding typed array\n * @param {TypedArray} array - The input typed array\n * @returns {object} - SharedArrayBuffer;\n */\n setupSharedArrayBuffer(array) {\n return this.createSharedBuffer(array);\n }\n\n /**\n * @function aggregateThreadOutputs - Joins individual thread outputs into single result\n * @param {array} input - Array of arrays to aggregate\n * @param {string} dataType - Data type to use for typed array\n */\n aggregateThreadOutputs(input, dataType) {\n if(!dataType) {\n return input.reduce(function(a, b) {\n return a.concat(b);\n });\n }\n let i = 0;\n let len = input.length;\n let bufferLength = 0;\n for (i; i < len; i += 1) {\n bufferLength += input[i].length;\n }\n let output = this.processDataType(dataType, bufferLength);\n let offset = 0;\n for (i = 0; i < len; i += 1) {\n output.set(input[i], offset);\n offset += input[i].length;\n }\n return output;\n }\n\n /**\n * @function addThreadOutputWithIndex - Joins individual thread outputs into single result\n * @param {object} task - Hamsters task object\n * @param {object} index - Index information\n * @param {array} output - Output array\n */\n addThreadOutputWithIndex(task, index, output) {\n let i = 0;\n const outputLength = output.length;\n for (i; i < outputLength; i++) {\n task.output[(index.start + i)] = output[i];\n }\n }\n\n /**\n * @function calculateIndexes - Splits a single array into multiple equal sized subarrays\n * @param {array} array - Array to split\n * @param {number} n - Number of subarrays to create\n */\n calculateIndexes(array, n) {\n // If n is 1, return the whole array range\n if (n === 1) {\n return [{ start: 0, end: array.length - 1 }];\n }\n\n const indexes = [];\n const segmentSize = Math.floor(array.length / n);\n let startIndex = 0;\n\n for (let i = 0; i < n; i++) {\n const endIndex = startIndex + segmentSize - 1;\n indexes.push({ start: startIndex, end: endIndex });\n startIndex = endIndex + 1;\n }\n\n // Adjust the last segment to cover any remaining elements\n if (startIndex < array.length) {\n indexes[n - 1].end = array.length - 1;\n }\n\n return indexes;\n }\n \n\n /**\n * @function getSubArrayUsingIndex - Slices subarray based on provided index\n * @param {object} index - Index information\n * @param {object} inputArray - Hamsters task object\n */\n getSubArrayUsingIndex(index, inputArray) {\n return inputArray.slice(index.start, index.end + 1);\n }\n}\n\nmodule.exports = Data;\n\n\n// WEBPACK FOOTER //\n// ./core/data.js","class Wheel {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.worker = this.workerScaffold;\n this.regular = this.regularScaffold;\n this.legacy = this.legacyScaffold.bind(this);\n }\n\n /**\n * @function workerScaffold - Provides worker body for library functionality when used within a worker [threads inside threads]\n */\n workerScaffold() {\n self.params = {};\n self.rtn = {};\n\n addEventListener('connect', (incomingConnection) => {\n var port = incomingConnection.ports[0];\n port.start();\n port.addEventListener('message', (incomingMessage) => {\n this.params = incomingMessage.data;\n this.rtn = {\n data: [],\n dataType: this.params.dataType\n };\n eval(\"(\" + this.params.hamstersJob + \")\")();\n port.postMessage(this.rtn);\n }, false);\n }, false);\n }\n\n /**\n * @function regularScaffold - Provides worker body for library functionality\n */\n regularScaffold() {\n self.params = {};\n self.rtn = {};\n\n self.onmessage = function(message) {\n this.params = message.data;\n this.rtn = {\n data: [],\n dataType: (typeof this.params.dataType !== 'undefined' ? this.params.dataType : null),\n index: this.params.index\n };\n if (this.params.sharedBuffer) {\n this.params.sharedArray = typedArrayFromBuffer(this.params.dataType, this.params.sharedBuffer);\n }\n eval(this.params.hamstersJob);\n const buffers = handleDataType(this.rtn);\n returnResponse(this.rtn, buffers);\n }.bind(this);\n\n function handleDataType(rtn) {\n if (this.params.sharedArray) {\n // Do nothing here, we don't need to return a buffer rtn.data is useless here\n } else if(this.params.dataType) {\n rtn.data = typedArrayFromBuffer(rtn.dataType, rtn.data);\n }\n return getTransferableObjects(rtn); // Return transferable objects\n }\n\n function typedArrayFromBuffer(dataType, buffer) {\n var types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if (!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n function returnResponse(rtn, buffers) {\n if (buffers && buffers.length > 0) {\n // If there are buffers, postMessage with transferable objects\n postMessage(rtn, buffers);\n } else {\n // Otherwise, postMessage without transferable objects\n postMessage(rtn);\n }\n }\n\n function getTransferableObjects(obj) {\n const transferableObjects = new Set();\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n \n const globalContext = typeof self !== 'undefined' ? self : window;\n \n const allTypes = [...typedArrayTypes, ...otherTransferables];\n \n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n for (const type of allTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n if (typedArrayTypes.includes(type)) {\n transferableObjects.add(obj[prop].buffer);\n } else {\n transferableObjects.add(obj[prop]);\n }\n }\n }\n }\n }\n \n return Array.from(transferableObjects);\n }\n }\n\n\n /**\n * @function legacyScaffold - Provides library functionality for legacy devices\n */\n legacyScaffold(params, resolve, reject) {\n var rtn = {\n data: [],\n dataType: (typeof params.dataType !== \"undefined\" ? params.dataType : null)\n };\n if(this.hamsters.habitat.reactNative) {\n self.rtn = rtn;\n }\n if(this.hamsters.habitat.node || this.hamsters.habitat.isIE) {\n eval(params.hamstersJob);\n } else {\n params.hamstersJob();\n }\n resolve(rtn.data);\n }\n}\n\nmodule.exports = Wheel;\n\n\n\n// WEBPACK FOOTER //\n// ./core/wheel.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Task {\n /**\n * @constructor\n * @param {object} habitat - The environment settings\n * @param {object} data - Data utility methods\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n constructor(hamsters, params, functionToRun) {\n 'use strict';\n\n this.input = params;\n this.output = [];\n this.scheduler = {\n count: 0,\n threads: params.threads || 1,\n workers: []\n };\n \n if (hamsters.habitat.legacy) {\n this.setupLegacyTask(hamsters, functionToRun);\n } else {\n this.setupModernTask(hamsters, params, functionToRun);\n }\n \n if (hamsters.habitat.debug) {\n this.setupDebugMetrics();\n }\n }\n \n /**\n * @method setupLegacyTask\n * @description Sets up task for legacy environments\n * @param {function} functionToRun - Function to execute\n */\n setupLegacyTask(hamsters, functionToRun) {\n this.scheduler.threads = 1;\n if (!hamsters.habitat.node && !hamsters.habitat.isIE) {\n this.input.hamstersJob = functionToRun;\n }\n }\n \n /**\n * @method setupModernTask\n * @description Sets up task for modern environments\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n setupModernTask(hamsters, params, functionToRun) {\n this.input.hamstersJob = hamsters.habitat.legacy ? functionToRun : hamsters.data.prepareFunction(functionToRun);\n if (params.sharedArray && hamsters.habitat.atomics) {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.sharedArray, this.scheduler.threads);\n this.scheduler.sharedBuffer = hamsters.data.setupSharedArrayBuffer(params.sharedArray);\n this.input.sharedArray = []; //Reduce ram usage on main thread, do not preserve original array its no longer needed.\n } else {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.array, this.scheduler.threads);\n }\n }\n \n /**\n * @method setupDebugMetrics\n * @description Sets up debug metrics if debug mode is enabled\n */\n setupDebugMetrics() {\n this.scheduler.metrics = {\n created_at: Date.now(),\n started_at: null,\n completed_at: null,\n threads: this.setupThreadMetrics()\n };\n }\n\n setupThreadMetrics() {\n let i = 0;\n let threadMetrics = [];\n while(i < this.scheduler.threads) {\n threadMetrics.push({\n created_at: Date.now(),\n started_at: null,\n enqueued_at: null,\n dequeued_at: null,\n completed_at: null\n });\n i += 1;\n }\n return threadMetrics;\n }\n }\n \n module.exports = Task;\n \n\n\n// WEBPACK FOOTER //\n// ./core/task.js","import NodeStore from './stores/NodeStore';\nimport WebStore from './stores/WebStore';\n\nclass Memoize {\n constructor(hamsters, maxSize) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.store = this.hamsters.habitat.node ? new NodeStore(maxSize) : new WebStore('hamstersjs', 'cacheStore', maxSize);\n }\n\n memoize(func) {\n const self = this;\n return function(task) {\n const key = self.generateTaskKey(task);\n\n return new Promise(function(resolve, reject) {\n self.store.get(key).then(function(cachedResult) {\n if (cachedResult !== null) {\n resolve(cachedResult);\n } else {\n self.applyFunc(func, task).then(function(result) {\n self.store.set(key, result).then(function() {\n resolve(result);\n }).catch(reject);\n }).catch(reject);\n }\n }).catch(reject);\n });\n };\n }\n\n generateTaskKey(task) {\n const key = JSON.stringify({ input: task.input });\n return this.hashCode(key);\n }\n\n hashCode(str) {\n let hash = 0, i, chr;\n if (str.length === 0) return hash;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash.toString();\n }\n\n applyFunc(func, args) {\n return new Promise((resolve, reject) => {\n try {\n const result = func.apply(null, args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n\nmodule.exports = Memoize;\n\n\n// WEBPACK FOOTER //\n// ./feature/memoize.js","class NodeStore {\n constructor(maxSize) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key) {\n if (this.cache.has(key)) {\n const value = this.cache.get(key);\n // Refresh the key\n this.cache.delete(key);\n this.cache.set(key, value);\n return Promise.resolve(value);\n }\n return Promise.resolve(null);\n }\n\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n // Remove the oldest (least recently used) entry\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n clear() {\n this.cache.clear();\n return Promise.resolve();\n }\n}\n\nmodule.exports = NodeStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/NodeStore.js","class WebStore {\n constructor(dbName, storeName, maxSize) {\n this.dbName = dbName;\n this.storeName = storeName;\n this.maxSize = maxSize;\n this.db = null;\n this.initDB();\n }\n\n initDB() {\n const self = this;\n const request = indexedDB.open(this.dbName, 1);\n\n request.onerror = function(event) {\n console.error('Error opening database:', event.target.error);\n };\n\n request.onupgradeneeded = function(event) {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(self.storeName)) {\n const objectStore = db.createObjectStore(self.storeName, { keyPath: 'key' });\n objectStore.createIndex('by_key', 'key', { unique: true });\n objectStore.createIndex('by_timestamp', 'timestamp');\n }\n };\n\n request.onsuccess = function(event) {\n self.db = event.target.result;\n };\n }\n\n get(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve(null);\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const result = event.target.result;\n if (result) {\n self.updateTimestamp(key).then(() => resolve(result.value)).catch(reject);\n } else {\n resolve(null);\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n set(key, value) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n self.checkSize().then(() => {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.put({ key: key, value: value, timestamp: Date.now() });\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n }).catch(reject);\n });\n }\n\n clear() {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.clear();\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n checkSize() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const countRequest = objectStore.count();\n\n countRequest.onsuccess = function() {\n const count = countRequest.result;\n if (count >= self.maxSize) {\n self.evictOldest().then(resolve).catch(reject);\n } else {\n resolve();\n }\n };\n\n countRequest.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n evictOldest() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const index = objectStore.index('by_timestamp');\n const request = index.openCursor(null, 'next');\n\n request.onsuccess = function(event) {\n const cursor = event.target.result;\n if (cursor) {\n cursor.delete().onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n updateTimestamp(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const data = event.target.result;\n if (data) {\n data.timestamp = Date.now();\n objectStore.put(data).onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n}\n\nmodule.exports = WebStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/WebStore.js","class Distribute {\n\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.localConnection = null;\n this.remoteConnections = {};\n this.sendChannels = {};\n this.receiveChannels = {};\n this.pcConstraint = null;\n this.dataConstraint = null;\n this.ws = null;\n this.clientId = null;\n this.pendingPromises = {};\n this.returnDistributedOutput = this.sendDataResponse.bind(this);\n this.latencies = {};\n this.establishConnection = this.initWebSocket.bind(this);\n }\n\n initWebSocket() {\n this.ws = new WebSocket(`${this.hamsters.habitat.relay}`);\n\n this.ws.onopen = () => {\n console.info(`Hamsters.js ${this.hamsters.version} connection established`);\n const registerMessage = {\n type: 'register',\n logicalCores: this.hamsters.maxThreads\n };\n this.ws.send(JSON.stringify(registerMessage));\n };\n\n this.ws.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'register':\n this.handleClientReconnect(message);\n break;\n case 'update-client-list':\n this.updateClientList(message.clients);\n break;\n case 'offer':\n this.handleOffer(message);\n break;\n case 'answer':\n this.handleAnswer(message);\n break;\n case 'candidate':\n this.handleCandidate(message);\n break;\n case 'task-response':\n this.handleTaskResponse(message);\n break;\n default:\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} unknown message type: ${message.type}`);\n }\n }\n };\n\n this.ws.onerror = (error) => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} connection error: ${error}`);\n }\n };\n\n this.ws.onclose = () => {\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} connection closed.`);\n }\n };\n }\n\n updateClientList(clients) {\n clients.forEach(client => {\n if (client.id !== this.clientId && !this.remoteConnections[client.id]) {\n this.createConnection(client.id);\n }\n });\n }\n\n handleClientReconnect(message) {\n const newClientId = message.id;\n\n if (this.clientId === newClientId) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} connection error: `, error);\n }\n return;\n }\n\n if (this.remoteConnections[newClientId]) {\n this.remoteConnections[newClientId].close();\n delete this.remoteConnections[newClientId];\n }\n if (this.sendChannels[newClientId]) {\n this.sendChannels[newClientId].close();\n delete this.sendChannels[newClientId];\n }\n if (this.receiveChannels[newClientId]) {\n this.receiveChannels[newClientId].close();\n delete this.receiveChannels[newClientId];\n }\n delete this.latencies[newClientId];\n\n this.clientId = newClientId;\n this.loadClientList();\n }\n\n loadClientList() {\n fetch(`/clients?currentId=${this.clientId}`)\n .then(response => response.json())\n .then(data => {\n this.updateClientList(data);\n })\n .catch(error => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} Error fetching client list: ${error}`);\n }\n });\n }\n\n createConnections() {\n Object.keys(this.remoteConnections).forEach(targetClient => {\n this.createConnection(targetClient);\n });\n }\n\n createConnection(targetClient) {\n if (targetClient === this.clientId || this.remoteConnections[targetClient]) {\n return;\n }\n\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const localConnection = new RTCPeerConnection(servers, this.pcConstraint);\n const sendChannel = localConnection.createDataChannel('hamstersjs', this.dataConstraint);\n\n localConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n localConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n this.remoteConnections[targetClient] = localConnection;\n this.sendChannels[targetClient] = sendChannel;\n this.receiveChannels[targetClient] = null;\n\n localConnection.createOffer().then(desc => {\n localConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'offer', target: targetClient, offer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n }\n\n handleOffer(data) {\n const targetClient = data.from;\n\n if (!this.remoteConnections[targetClient]) {\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const remoteConnection = new RTCPeerConnection(servers, this.pcConstraint);\n\n remoteConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n remoteConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n const sendChannel = remoteConnection.createDataChannel('hamstersjs', this.dataConstraint);\n \n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n remoteConnection.setRemoteDescription(new RTCSessionDescription(data.offer)).then(() => {\n return remoteConnection.createAnswer();\n }).then(desc => {\n remoteConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'answer', target: targetClient, answer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n\n this.remoteConnections[targetClient] = remoteConnection;\n this.sendChannels[targetClient] = sendChannel;\n }\n }\n\n handleAnswer(data) {\n const connection = this.remoteConnections[data.from];\n connection.setRemoteDescription(new RTCSessionDescription(data.answer));\n }\n\n handleCandidate(data) {\n const connection = this.remoteConnections[data.from];\n connection.addIceCandidate(new RTCIceCandidate(data.candidate)).catch(this.onAddIceCandidateError);\n }\n\n measureLatency(targetClient) {\n const startTime = performance.now();\n this.sendPing(targetClient, startTime);\n }\n\n sendPing(targetClient, startTime) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'ping', startTime }));\n }\n }\n\n handlePing(targetClient, startTime) {\n console.log(\"Remote Connections \", this.remoteConnections);\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'pong', startTime }));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent ping to ${targetClient}`);\n }\n }\n }\n\n handlePong(targetClient, startTime) {\n const latency = performance.now() - startTime;\n this.latencies[targetClient] = latency;\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received pong from ${targetClient} with latency: ${latency.toFixed(2)}ms`);\n }\n }\n\n fetchDistributedClient() {\n const sendChannelKeys = Object.keys(this.sendChannels);\n if (sendChannelKeys.length === 0) {\n if (this.hamsters.habitat.debug) {\n console.warn(`Hamsters.js ${this.hamsters.version} no send channels available.`);\n }\n return null;\n }\n\n let minLatency = Infinity;\n let targetClient = null;\n\n sendChannelKeys.forEach(clientId => {\n let channel = this.sendChannels[clientId];\n if (channel.readyState === 'open' && this.latencies[clientId] < minLatency) {\n minLatency = this.latencies[clientId];\n targetClient = clientId;\n }\n });\n\n return targetClient;\n }\n\n distributeTask(task, hamsterFood, resolve, reject) {\n const targetClient = this.fetchDistributedClient();\n if (!targetClient) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} no target client found.`);\n }\n reject('No target client found.');\n return;\n }\n\n const messageId = this.generateUniqueId();\n\n const subTask = {\n hamsterFood,\n index: hamsterFood.index,\n task,\n messageId,\n };\n\n this.pendingPromises[messageId] = { resolve, reject };\n\n this.sendData({ targetClient, data: subTask });\n }\n\n handleTaskResponse(incomingMessage) {\n const { messageId, output, error } = incomingMessage;\n const pendingPromise = this.pendingPromises[messageId];\n\n if (pendingPromise) {\n if (error) {\n pendingPromise.reject(error);\n } else {\n pendingPromise.resolve(output);\n }\n\n delete this.pendingPromises[messageId];\n }\n }\n\n sendData({ targetClient, data }) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent data to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n sendDataResponse(data) {\n const targetClient = data.targetClient;\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent response to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n closeDataChannels() {\n for (const targetClient in this.sendChannels) {\n if (this.sendChannels[targetClient]) {\n this.sendChannels[targetClient].close();\n delete this.sendChannels[targetClient];\n }\n if (this.receiveChannels[targetClient]) {\n this.receiveChannels[targetClient].close();\n delete this.receiveChannels[targetClient];\n }\n if (this.remoteConnections[targetClient]) {\n this.remoteConnections[targetClient].close();\n delete this.remoteConnections[targetClient];\n }\n delete this.latencies[targetClient];\n }\n this.localConnection = null;\n }\n\n receiveChannelCallback(event, targetClient) {\n const receiveChannel = event.channel;\n\n receiveChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n receiveChannel.onopen = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n receiveChannel.onclose = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n this.receiveChannels[targetClient] = receiveChannel;\n }\n\n onReceiveMessageCallback(targetClient, data) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received message!`);\n }\n const incomingMessage = JSON.parse(data);\n\n if (incomingMessage.isReply) {\n this.handleTaskResponse(incomingMessage);\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} response received for task: `, incomingMessage);\n }\n } else {\n this.hamsters.pool.runDistributedTask(incomingMessage, targetClient);\n }\n }\n\n onSendChannelStateChange(targetClient) {\n const sendChannel = this.sendChannels[targetClient];\n this.measureLatency(targetClient);\n if (sendChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} send channel state changed for ${targetClient}: ${sendChannel.readyState}`);\n }\n }\n\n onReceiveChannelStateChange(targetClient) {\n const receiveChannel = this.receiveChannels[targetClient];\n if (receiveChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} receive channel state changed for ${targetClient}: ${receiveChannel.readyState}`);\n }\n }\n\n generateUniqueId() {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n }\n\n onCreateSessionDescriptionError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to create session description: ${error}`);\n }\n }\n\n onAddIceCandidateError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to add ICE candidate: ${error}`);\n }\n }\n}\n\nmodule.exports = Distribute;\n\n\n// WEBPACK FOOTER //\n// ./feature/distribute.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 2fd57c5c4dd03a4bb844","webpack:///./hamsters.js","webpack:///./core/habitat.js","webpack:///../~/node-libs-browser/~/process/browser.js","webpack:///./core/pool.js","webpack:///./core/data.js","webpack:///./core/wheel.js","webpack:///./core/task.js","webpack:///./feature/memoize.js","webpack:///./feature/stores/NodeStore.js","webpack:///./feature/stores/WebStore.js","webpack:///./feature/distribute.js"],"names":["hamstersjs","version","run","hamstersRun","bind","promise","hamstersPromise","init","inititializeLibrary","data","pool","wheel","habitat","memoize","startOptions","Data","Pool","Wheel","Habitat","Memoize","distribute","Distribute","processStartOptions","legacy","persistence","spawnHamsters","maxThreads","relay","console","info","establishConnection","Object","keys","key","includes","toLowerCase","forceLegacyMode","Worker","isIE","task","resolve","reject","input","memoizedFunction","scheduleTask","then","catch","params","functionToRun","Promise","Task","onSuccess","onError","hamsters","module","exports","debug","importScripts","browser","isBrowser","webWorker","isWebWorker","node","isNode","reactNative","isReactNative","shell","isShell","transferable","supportsTransferableObjects","atomics","supportsAtomicOperations","proxies","supportsProxies","isInternetExplorer","selectHamsterWheel","sharedWorker","locateSharedWorkerObject","locateBlobBuilder","findAvailableBlobBuilder","isLegacyEnvironment","locateWorkerObject","determineGlobalThreads","getHabitatKeys","max","navigator","hardwareConcurrency","isFirefox","os","cpus","length","userAgent","indexOf","SharedWorker","window","process","product","isLegacy","supportsSharedWorkers","supports","workerBlob","generateWorkerBlob","SharedHamster","e","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","textContent","Blob","BlobMaker","blob","append","type","getBlob","workerLogic","URL","createObjectURL","createDataBlob","String","Uint8Array","SharedArrayBuffer","Proxy","regular","threads","running","pending","fetchHamster","getAvailableThread","index","hamsterFood","scheduler","metrics","count","enqueued_at","Date","now","push","hamster","item","id","dequeued_at","runTask","threadId","spawnHamster","started_at","workers","parentPort","hamsterWheel","subTaskId","array","getSubArrayFromIndex","sharedBuffer","excludedKeys","Set","hasOwnProperty","has","incomingMessage","targetClient","handleResponse","returnDistributedOutput","messageId","isReply","keepTrackOfThread","trainHamster","feedHamster","prepareMeal","addWorkToPending","distributeTask","output","processDataType","dataType","aggregate","aggregateThreadOutputs","sort","sortOutput","completed_at","splice","message","response","messageData","JSON","parse","undefined","mixedOutput","addThreadOutputWithIndex","onThreadResponse","port","onmessage","onmessageerror","onerror","once","processReturn","removeFromRunning","returnOutputAndRemoveTask","terminate","queueHamster","processQueuedItem","shift","setOnMessage","i","indexes","getSubArrayUsingIndex","getSubArrayIndexes","calculateIndexes","sortTaskOutput","typedArrayFromBuffer","prepareFunction","prepareWorkerTask","messageWorkerThread","getBufferSize","createSharedBuffer","getDataType","setupSharedArrayBuffer","postMessage","stringify","getTransferableObjects","obj","typedArrayBuffers","transferableObjects","typedArrayTypes","otherTransferables","globalContext","global","prop","buffer","concat","types","Uint32Array","Uint16Array","Uint8ClampedArray","Int32Array","Int16Array","Int8Array","Float32Array","Float64Array","functionBody","functionString","substring","arr","order","Array","prototype","call","a","b","reverse","byteLength","sharedArray","constructor","set","reduce","len","bufferLength","offset","outputLength","start","n","end","segmentSize","Math","floor","startIndex","endIndex","inputArray","slice","worker","workerScaffold","regularScaffold","legacyScaffold","self","rtn","addEventListener","incomingConnection","ports","eval","hamstersJob","buffers","handleDataType","returnResponse","allTypes","add","from","setupLegacyTask","setupModernTask","setupDebugMetrics","created_at","setupThreadMetrics","threadMetrics","maxSize","store","NodeStore","WebStore","func","generateTaskKey","get","cachedResult","applyFunc","result","hashCode","str","hash","chr","charCodeAt","toString","args","apply","error","cache","Map","value","delete","size","oldestKey","next","clear","dbName","storeName","db","initDB","request","indexedDB","open","event","target","onupgradeneeded","objectStoreNames","contains","objectStore","createObjectStore","keyPath","createIndex","unique","onsuccess","transaction","updateTimestamp","checkSize","put","timestamp","countRequest","evictOldest","openCursor","cursor","localConnection","remoteConnections","sendChannels","receiveChannels","pcConstraint","dataConstraint","ws","clientId","pendingPromises","sendDataResponse","latencies","initWebSocket","WebSocket","onopen","registerMessage","logicalCores","send","handleClientReconnect","updateClientList","clients","handleOffer","handleAnswer","handleCandidate","handleTaskResponse","onclose","forEach","client","createConnection","newClientId","log","close","loadClientList","fetch","json","servers","iceServers","urls","RTCPeerConnection","sendChannel","createDataChannel","onicecandidate","candidate","onSendChannelStateChange","handlePing","startTime","handlePong","onReceiveMessageCallback","ondatachannel","receiveChannelCallback","createOffer","setLocalDescription","desc","offer","onCreateSessionDescriptionError","remoteConnection","setRemoteDescription","RTCSessionDescription","createAnswer","answer","connection","addIceCandidate","RTCIceCandidate","onAddIceCandidateError","performance","sendPing","readyState","latency","toFixed","sendChannelKeys","warn","minLatency","Infinity","channel","fetchDistributedClient","generateUniqueId","subTask","sendData","pendingPromise","receiveChannel","onReceiveChannelStateChange","runDistributedTask","measureLatency","random","substr"],"mappings":"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K,EAOS,YAPT,EAQL,WARK,EAQQ,OARR,CAAP;AAUD;;;;;;AAGHrE,QAAOC,OAAP,GAAiBrC,OAAjB,C;;;;;;;AChQA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,MAAK;AACL;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sCAAqC;;AAErC;AACA;AACA;;AAEA,4BAA2B;AAC3B;AACA;AACA;AACA,6BAA4B,UAAU;;;;;;;;;;;;;ACvLtC;;AAEA;;;;;;;;;KASMF,I;AACJ;;;;AAIA,iBAAYqC,QAAZ,EAAsB;AACpB;;AADoB;;AAGpB,UAAKA,QAAL,GAAgBA,QAAhB;AACA,UAAKuE,OAAL,GAAe,EAAf;AACA,UAAKC,OAAL,GAA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","file":"hamsters.web.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2fd57c5c4dd03a4bb844","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nimport Habitat from './core/habitat';\nimport Pool from './core/pool';\nimport Data from './core/data';\nimport Wheel from './core/wheel';\nimport Task from './core/task';\n\n//Features\nimport Memoize from './feature/memoize';\nimport Distribute from './feature/distribute';\n\nclass hamstersjs {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor() {\n 'use strict';\n\n this.version = '5.5.9';\n this.run = this.hamstersRun.bind(this);\n this.promise = this.hamstersPromise.bind(this);\n this.init = this.inititializeLibrary.bind(this);\n this.data = {};\n this.pool = {};\n this.wheel = {};\n this.habitat = {};\n this.memoize = {};\n }\n\n /**\n * @function inititializeLibrary - Prepares & initializes Hamsters.js library\n * @param {object} startOptions - Provided library functionality options\n */\n inititializeLibrary(startOptions) {\n this.data = new Data(this);\n this.pool = new Pool(this);\n this.wheel = new Wheel(this);\n this.habitat = new Habitat(this);\n this.memoize = new Memoize(this, 100); //Set a maximum of 100 memoized function results, LRU cache\n this.distribute = new Distribute(this);\n\n this.processStartOptions(startOptions);\n \n if(!this.habitat.legacy && this.habitat.persistence === true) {\n this.pool.spawnHamsters(this.habitat.maxThreads);\n }\n this.maxThreads = this.habitat.maxThreads;\n\n if(this.habitat.relay) {\n console.info(`Hamsters.js ${this.version} establishing connection to relay`);\n this.distribute.establishConnection();\n }\n\n console.info(`Hamsters.js ${this.version} initialized using up to ${this.habitat.maxThreads} threads`);\n }\n\n /**\n * @function processStartOptions - Adjusts library functionality based on provided options\n * @param {object} startOptions - Provided library functionality options\n */\n processStartOptions(startOptions) {\n if (typeof startOptions !== 'undefined') {\n for (const key of Object.keys(startOptions)) {\n if (this.habitat.keys.includes(key.toLowerCase())) {\n this.habitat[key] = startOptions[key];\n } else {\n this[key] = startOptions[key];\n }\n }\n }\n // Ensure legacy mode is disabled when we pass a third party worker library\n let forceLegacyMode = (typeof startOptions !== 'undefined' && typeof startOptions.legacy !== 'undefined');\n if (forceLegacyMode) {\n forceLegacyMode = startOptions.legacy;\n }\n if (typeof this.habitat.Worker === 'function' && !forceLegacyMode) {\n this.habitat.legacy = this.habitat.isIE;\n }\n }\n\n /**\n * @async\n * @function scheduleTask - Schedules a new function to be processed by the library\n * @param {object} task - Provided library execution options\n * @param {function} resolve - Parent function promise resolve method\n * @param {function} reject - Parent function promise reject method\n * @return {Promise} Promise object on completion\n */\n scheduleTask(task, resolve, reject) {\n if (task.input.memoize) {\n // Pass the task object to the memoized function\n const memoizedFunction = this.memoize.memoize(() => this.pool.scheduleTask(task));\n return memoizedFunction(task).then(resolve).catch(reject);\n }\n return this.pool.scheduleTask(task)\n .then(resolve)\n .catch(reject);\n }\n\n /**\n * @async\n * @function hamstersPromise - Calls library functionality using async promises\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n * @return {Promise} Promise resolving with results from functionToRun\n */\n hamstersPromise(params, functionToRun) {\n return new Promise((resolve, reject) => {\n this.scheduleTask(new Task(this, params, functionToRun), resolve, reject);\n });\n }\n\n /**\n * @async\n * @function hamstersRun - Calls library functionality using async callbacks\n * @param {object} params - Provided library execution options\n * @param {function} onError - Function to call upon execution failure\n * @return {array} Results from functionToRun.\n */\n hamstersRun(params, functionToRun, onSuccess, onError) {\n this.scheduleTask(new Task(this, params, functionToRun), onSuccess, onError);\n }\n}\n\nconst hamsters = new hamstersjs();\n\nmodule.exports = hamsters;\n\n\n\n// WEBPACK FOOTER //\n// ./hamsters.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Habitat {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.debug = false;\n this.importScripts = null;\n this.relay = null;\n this.memoize = false;\n this.persistence = true;\n this.browser = this.isBrowser();\n this.webWorker = this.isWebWorker();\n this.node = this.isNode();\n this.reactNative = this.isReactNative();\n this.shell = this.isShell();\n this.transferable = this.supportsTransferableObjects();\n this.atomics = this.supportsAtomicOperations();\n this.proxies = this.supportsProxies();\n this.isIE = this.isInternetExplorer();\n this.selectHamsterWheel = this.selectHamsterWheel.bind(this);\n this.sharedWorker = this.locateSharedWorkerObject();\n this.locateBlobBuilder = this.findAvailableBlobBuilder();\n this.legacy = this.isLegacyEnvironment();\n this.Worker = this.locateWorkerObject();\n this.maxThreads = this.determineGlobalThreads();\n this.keys = this.getHabitatKeys();\n }\n\n /**\n * @function determineGlobalThreads - Determines max number of threads to use\n */\n determineGlobalThreads() {\n let max = 4;\n if(this.browser && typeof navigator.hardwareConcurrency !== \"undefined\") {\n max = navigator.hardwareConcurrency;\n if(this.isFirefox()) {\n max = (max > 20 ? 20 : max);\n }\n }\n if(this.node && typeof os !== 'undefined') {\n max = os.cpus().length;\n }\n return max;\n }\n\n /**\n * @function isFirefox - Detect firefox browser\n */\n isFirefox() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.toLowerCase().indexOf('firefox') !== -1);\n }\n return false;\n }\n\n /**\n * @function locateWorkerObject - Attempts to find a global Worker object\n */\n locateWorkerObject() {\n return (typeof Worker !== 'undefined' ? Worker : false);\n }\n\n /**\n * @function locateSharedWorkerObject - Attempts to find a global SharedWorker object\n */\n locateSharedWorkerObject() {\n return (typeof SharedWorker !== 'undefined' ? SharedWorker : false);\n }\n\n /**\n * @function isBrowser - Detects if execution environment is a browser\n */\n isBrowser() {\n return (typeof window === \"object\");\n }\n\n /**\n * @function isInternetExplorer - Detects if execution environment is internet explorer\n */\n isInternetExplorer() {\n if(typeof navigator !== \"undefined\" && typeof navigator.userAgent !== \"undefined\") {\n return (navigator.userAgent.indexOf(\"MSIE \") !== -1 || navigator.userAgent.indexOf(\"Trident/\") !== -1);\n }\n return false;\n }\n\n /**\n * @function isNode - Detects if execution environment is node.js\n */\n isNode() {\n return (typeof process === \"object\" && typeof require === \"function\" && !this.isWebWorker() && !this.browser);\n }\n\n /**\n * @function isWebWorker - Detects if execution environment is a web worker\n */\n isWebWorker() {\n return (typeof importScripts === \"function\" && !this.isReactNative());\n }\n\n /**\n * @function isReactNative - Detects if execution environment is React Native\n */\n isReactNative() {\n return (typeof navigator !== \"undefined\" && typeof navigator.product !== \"undefined\" && navigator.product === \"ReactNative\");\n }\n\n /**\n * @function isShell - Detects if execution environment is a shell\n */\n isShell() {\n return ((typeof navigator === \"undefined\") && !this.isNode() && !this.isWebWorker() && !this.isReactNative());\n }\n\n /**\n * @function isLegacyEnvironment - Detects if execution environment is a legacy environment\n */\n isLegacyEnvironment() {\n let isLegacy = !!!this.Worker;\n // Detect sharedWorker support for use within webworkers\n if (this.isWebWorker() && typeof this.SharedWorker !== 'undefined') {\n isLegacy = !this.supportsSharedWorkers();\n }\n return isLegacy;\n }\n\n /**\n * @function supportsSharedWorkers - Detects if execution environment supports SharedWorkers\n */\n supportsSharedWorkers() {\n let supports = false;\n try {\n let workerBlob = this.generateWorkerBlob(this.selectHamsterWheel());\n let SharedHamster = new this.SharedWorker(workerBlob, 'SharedHamsterWheel');\n supports = true;\n } catch (e) {\n supports = false;\n }\n return supports;\n }\n\n /**\n * @function findAvailableBlobBuilder - Attempts to locate a data blob builder, with vendor prefixes\n */\n findAvailableBlobBuilder() {\n if(typeof BlobBuilder !== 'undefined') {\n return BlobBuilder;\n }\n if(typeof WebKitBlobBuilder !== 'undefined') {\n return WebKitBlobBuilder;\n }\n if(typeof MozBlobBuilder !== 'undefined') {\n return MozBlobBuilder;\n }\n if(typeof MSBlobBuilder !== 'undefined') {\n return MSBlobBuilder;\n }\n return 'Environment does not support data blobs!';\n }\n\n /**\n * @function createDataBlob - Creates a new data blob from textContent\n * @param {string} textContent - Provided text content for blob\n */\n createDataBlob(textContent) {\n if(typeof Blob === 'undefined') {\n let BlobMaker = this.locateBlobBuilder();\n let blob = new BlobMaker();\n blob.append([textContent], {\n type: 'application/javascript'\n });\n return blob.getBlob();\n }\n return new Blob([textContent], {\n type: 'application/javascript'\n });\n }\n\n /**\n * @function generateWorkerBlob - Creates a blob URI for flexible scaffold loading\n * @param {function} workerLogic - Scaffold to use within worker thread\n */\n generateWorkerBlob(workerLogic) {\n return URL.createObjectURL(this.createDataBlob('(' + String(workerLogic) + ')();'));\n }\n\n /**\n * @function supportsTransferableObjects - Detects if execution environment supports typed arrays\n */\n supportsTransferableObjects() {\n return (typeof Uint8Array !== 'undefined');\n }\n\n /**\n * @function supportsAtomicOperations - Detects if execution environment supports SharedArrayBuffers\n */\n supportsAtomicOperations() {\n return (typeof SharedArrayBuffer !== 'undefined');\n }\n\n /**\n * @function supportsProxies - Detects if execution environment supports Proxy objects\n */\n supportsProxies() {\n return (typeof Proxy !== 'undefined');\n }\n\n /**\n * @function selectHamsterWheel - Determines which scaffold to use for proper execution for various environments\n */\n selectHamsterWheel() {\n if(this.isIE) {\n return this.hamsters.wheel.legacy;\n }\n if(this.reactNative) {\n return 'reactNativeHamster.js';\n }\n if (this.node) {\n return './node_modules/hamsters.js/build/common/node.js';\n }\n return this.generateWorkerBlob(this.hamsters.wheel.regular);\n }\n\n /**\n * @function getHabitatKeys - Returns keys for this Habitat instance\n */\n getHabitatKeys() {\n return [\n 'worker','sharedworker',\n 'legacy','proxies',\n 'reactnative','atomics',\n 'transferable','browser',\n 'shell','node','debug',\n 'persistence','importscripts',\n 'maxthreads', 'parentport',\n 'webworker', 'relay'\n ];\n }\n}\n\nmodule.exports = Habitat;\n\n\n// WEBPACK FOOTER //\n// ./core/habitat.js","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../~/node-libs-browser/~/process/browser.js\n// module id = 3\n// module chunks = 0","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Pool {\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.threads = [];\n this.running = [];\n this.pending = [];\n this.fetchHamster = this.getAvailableThread.bind(this);\n }\n\n /**\n * @function addWorkToPending - Adds task to queue waiting for available thread\n * @param {number} index - Index of the task\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n addWorkToPending(index, hamsterFood, task, resolve, reject) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[task.scheduler.count].enqueued_at = Date.now();\n }\n this.pending.push({\n index,\n hamsterFood, \n task,\n resolve,\n reject\n });\n }\n\n /**\n * @function processQueuedItem - Invokes processing of next item in queue\n * @param {object} hamster - The thread to run the task\n * @param {object} item - Task to process\n */\n processQueuedItem(hamster, item) {\n if (this.hamsters.habitat.debug) {\n item.task.scheduler.metrics.threads[item.index.id].dequeued_at = Date.now();\n }\n return this.runTask(hamster, item.index, item.hamsterFood, item.task, item.resolve, item.reject);\n }\n\n /**\n * @function getAvailableThread - Gets an available thread\n * @param {number} threadId - Id of the thread\n * @returns {object} - The available thread\n */\n getAvailableThread(threadId) {\n if (this.hamsters.habitat.persistence) {\n return this.threads[threadId];\n }\n return this.spawnHamster();\n }\n\n /**\n * @function keepTrackOfThread - Keeps track of threads running, scoped globally and to task\n * @param {object} task - Provided library functionality options for this task\n * @param {number} id - Id of thread to track\n */\n keepTrackOfThread(task, id) {\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[id].started_at = Date.now();\n }\n task.scheduler.workers.push(id);\n this.running.push(id);\n }\n\n /**\n * @function spawnHamsters - Spawns multiple new threads for execution\n * @param {number} maxThreads - Max number of threads for this client\n */\n spawnHamsters(maxThreads) {\n while (maxThreads--) {\n this.threads.push(this.spawnHamster());\n }\n }\n\n /**\n * @function spawnHamster - Spawns a new thread for execution\n * @return {object} - New WebWorker thread using selected scaffold\n */\n spawnHamster() {\n const { selectHamsterWheel, SharedWorker, Worker, node, parentPort } = this.hamsters.habitat;\n const hamsterWheel = selectHamsterWheel();\n if (this.hamsters.habitat.webWorker) {\n return new SharedWorker(hamsterWheel, 'SharedHamsterWheel');\n }\n if (node && typeof parentPort !== 'undefined') {\n return new Worker(hamsterWheel);\n }\n return new Worker(hamsterWheel);\n }\n \n /**\n * @function prepareMeal\n * @description Prepares message to send to a thread and invoke execution\n * @param {number} index - Index of the subarray to process\n * @param {number} subTaskId - Subtask ID\n * @param {object} task - Provided library functionality options for this task\n * @returns {object} - Prepared message to send to a thread\n */\n prepareMeal(index, subTaskId, task) {\n index.id = subTaskId;\n\n // Prepare the base hamsterFood object\n const hamsterFood = {\n array: task.input.array && task.input.array.length !== 0 ? \n this.hamsters.data.getSubArrayFromIndex(index, task.input.array) : [],\n index: index\n };\n\n // Add sharedBuffer if it exists\n if (typeof task.scheduler.sharedBuffer !== 'undefined') {\n hamsterFood.sharedBuffer = task.scheduler.sharedBuffer;\n }\n\n // List of excluded keys\n const excludedKeys = new Set(['array', 'threads', 'sharedArray']);\n\n // Iterate over task.input properties and add to hamsterFood\n for (const key in task.input) {\n if (task.input.hasOwnProperty(key) && !excludedKeys.has(key)) {\n hamsterFood[key] = task.input[key];\n }\n }\n\n return hamsterFood;\n }\n\n /**\n * @function runDistributedTask - Runs incoming distributed function using thread\n * @param {object} incomingMessage - The incoming subTask object\n */\n runDistributedTask(incomingMessage, targetClient) {\n const hamster = this.fetchHamster(this.running.length);\n let task = incomingMessage.task;\n let index = incomingMessage.hamsterFood.index;\n let handleResponse = this.hamsters.distribute.returnDistributedOutput;\n task.targetClient = targetClient;\n task.messageId = incomingMessage.messageId;\n task.isReply = true;\n\n this.runTask(hamster, index, incomingMessage.hamsterFood, incomingMessage.task, handleResponse, handleResponse);\n }\n\n\n\n /**\n * @function runTask - Runs function using thread\n * @param {object} hamster - The thread to run the task\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n runTask(hamster, index, hamsterFood, task, resolve, reject) {\n const threadId = this.running.length;\n this.hamsters.pool.keepTrackOfThread(task, threadId);\n if (this.hamsters.habitat.legacy) {\n this.hamsters.wheel.legacy(hamsterFood, resolve, reject);\n } else {\n this.hamsters.pool.trainHamster(index, task, threadId, hamster, resolve, reject);\n this.hamsters.data.feedHamster(hamster, hamsterFood);\n }\n task.scheduler.count += 1;\n }\n\n /**\n * @function hamsterWheel - Runs or queues function using threads\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n hamsterWheel(index, subTaskId, task, resolve, reject) {\n const hamsterFood = this.prepareMeal(index, subTaskId, task);\n if (this.hamsters.habitat.maxThreads <= this.running.length) {\n this.addWorkToPending(index, hamsterFood, task, resolve, reject);\n } else {\n if(task.input.distribute) {\n this.hamsters.distribute.distributeTask(task, hamsterFood, resolve, reject);\n } else {\n const hamster = this.fetchHamster(this.running.length);\n this.runTask(hamster, index, hamsterFood, task, resolve, reject);\n }\n }\n }\n\n processDistributedReturn(data) {\n debugger;\n }\n\n /**\n * @function returnOutputAndRemoveTask - Gathers thread outputs into final result\n * @param {object} task - Provided library functionality options for this task\n * @param {function} resolve - onSuccess method\n */\n returnOutputAndRemoveTask(task, resolve) {\n if(task.scheduler.sharedBuffer) {\n task.output = hamsters.data.processDataType(task.input.dataType, task.scheduler.sharedBuffer);\n }\n if(task.input.aggregate) {\n task.output = this.hamsters.data.aggregateThreadOutputs(task.output, task.input.dataType);\n }\n if(task.input.sort) {\n task.output = this.hamsters.data.sortOutput(task.output, task.input.sort)\n }\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.completed_at = Date.now();\n console.info(\"Hamsters.js Task Completed: \", task);\n }\n if(task.input.distribute) {\n resolve(task);\n } else {\n resolve(task.output);\n }\n }\n\n /**\n * @function removeFromRunning - Removes a thread from the running pool\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to remove\n */\n removeFromRunning(task, threadId) {\n this.running.splice(this.running.indexOf(threadId), 1);\n task.scheduler.workers.splice(task.scheduler.workers.indexOf(threadId), 1);\n }\n\n /**\n * @function processReturn - Processes the returned message from a thread\n * @param {number} index - Index of the subarray processed\n * @param {object} message - Message returned from the thread\n * @param {object} task - Provided library functionality options for this task\n */\n processReturn(index, message, task) {\n const isReactNative = this.hamsters.habitat.reactNative;\n const isNode = this.hamsters.habitat.node;\n const response = message.data;\n const messageData = isReactNative ? JSON.parse(message).data : (response.data !== undefined ? response.data : response);\n const threadId = isNode ? message.index.id : response.index.id;\n\n if (task.scheduler.threads !== 1) {\n if (isReactNative || task.input.mixedOutput) {\n task.output[threadId] = messageData;\n } else {\n this.hamsters.data.addThreadOutputWithIndex(task, index, messageData);\n }\n } else {\n task.output = messageData;\n }\n }\n\n /**\n * @function setOnMessage - Sets the message handlers for a thread\n * @param {object} hamster - The thread to set the handlers on\n * @param {function} onThreadResponse - Handler for thread response\n * @param {object} habitat - Habitat configuration\n * @param {function} reject - onError method\n */\n setOnMessage(hamster, onThreadResponse, reject) {\n if (this.hamsters.habitat.webWorker) {\n hamster.port.onmessage = onThreadResponse;\n hamster.port.onmessageerror = reject;\n hamster.port.onerror = reject;\n } else if (this.hamsters.habitat.node) {\n hamster.once('message', onThreadResponse);\n hamster.once('onmessageerror', reject);\n hamster.once('error', reject);\n } else {\n hamster.onmessage = onThreadResponse;\n hamster.onmessageerror = reject;\n hamster.onerror = reject;\n }\n }\n\n /**\n * @function trainHamster - Trains thread in how to behave\n * @param {number} index - Index of the subarray to process\n * @param {object} task - Provided library functionality options for this task\n * @param {number} threadId - Id of the thread to train\n * @param {object} hamster - The thread to train\n * @param {function} resolve - onSuccess method\n * @param {function} reject - onError method\n */\n trainHamster(index, task, threadId, hamster, resolve, reject) {\n const onThreadResponse = (message) => {\n this.hamsters.pool.processReturn(index, message, task);\n if (this.hamsters.habitat.debug) {\n task.scheduler.metrics.threads[threadId].completed_at = Date.now();\n }\n this.hamsters.pool.removeFromRunning(task, threadId);\n if (task.scheduler.workers.length === 0 && task.scheduler.count === task.scheduler.threads) {\n this.hamsters.pool.returnOutputAndRemoveTask(task, resolve);\n }\n if (!this.hamsters.habitat.persistence) {\n hamster.terminate();\n }\n if (this.hamsters.pool.pending.length !== 0) {\n const queueHamster = this.hamsters.pool.fetchHamster(this.hamsters.pool.running.length);\n this.hamsters.pool.processQueuedItem(queueHamster, this.hamsters.pool.pending.shift());\n }\n };\n this.hamsters.pool.setOnMessage(hamster, onThreadResponse, reject);\n }\n\n /**\n * @function scheduleTask - Adds new task to the system for execution\n * @param {object} task - Provided library functionality options for this task\n */\n scheduleTask(task) {\n let i = 0;\n \treturn new Promise((resolve, reject) => {\n if(this.hamsters.debug) {\n task.scheduler.metrics.started_at = Date.now();\n }\n while (i < task.scheduler.threads) {\n this.hamsterWheel(task.scheduler.indexes[i], i, task, resolve, reject);\n i += 1;\n }\n });\n }\n}\n\nmodule.exports = Pool;\n\n\n// WEBPACK FOOTER //\n// ./core/pool.js","class Data {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters; // Set the hamsters object as a property of Data class\n this.getSubArrayFromIndex = this.getSubArrayUsingIndex.bind(this); // Bind getSubArrayUsingIndex function\n this.getSubArrayIndexes = this.calculateIndexes.bind(this); // Bind calculateIndexes function\n this.sortOutput = this.sortTaskOutput.bind(this); // Bind sortTaskOutput function\n this.aggregateThreadOutputs = this.aggregateThreadOutputs.bind(this);\n this.processDataType = this.typedArrayFromBuffer;\n this.prepareFunction = this.prepareWorkerTask.bind(this); // Bind prepareWorkerTask function\n this.feedHamster = this.messageWorkerThread.bind(this); // Bind messageWorkerThread function\n this.getBufferSize = this.getBufferSize;\n this.createSharedBuffer = this.createSharedBuffer.bind(this);\n this.getDataType = this.getDataType;\n this.setupSharedArrayBuffer = this.setupSharedArrayBuffer.bind(this);\n }\n\n /**\n * @function messageWorkerThread - Prepares message to send to thread\n * @param {object} hamstersHabitat - Hamsters Habitat instance\n * @param {Worker} hamster - Thread to message\n * @param {object} hamsterFood - Message to send to thread\n */ \n messageWorkerThread(hamster, hamsterFood) {\n if(this.hamsters.habitat.reactNative) {\n return hamster.postMessage(JSON.stringify(hamsterFood));\n }\n if (this.hamsters.habitat.webWorker) {\n return hamster.port.postMessage(hamsterFood);\n }\n return hamster.postMessage(hamsterFood, this.hamsters.data.getTransferableObjects(hamsterFood));\n }\n\n getTransferableObjects(obj) {\n const typedArrayBuffers = [];\n const transferableObjects = [];\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n const globalContext = typeof window !== 'undefined' ? window : global;\n \n for (const prop in obj) {\n for (const type of typedArrayTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n typedArrayBuffers.push(obj[prop].buffer);\n break;\n }\n }\n \n for (const type of otherTransferables) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n transferableObjects.push(obj[prop]);\n break;\n }\n }\n }\n \n return typedArrayBuffers.concat(transferableObjects);\n }\n\n /**\n * @function typedArrayFromBuffer - Converts buffer into new typed array\n * @param {string} dataType - Typed array type for this task\n * @param {object} buffer - Buffer to convert\n */\n typedArrayFromBuffer(dataType, buffer) {\n const types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if(!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n /**\n * @function prepareWorkerTask - Prepares function for thread, strips whitespace\n * @param {function} functionBody - Message to send to thread\n */\n prepareWorkerTask(functionBody) {\n let functionString = String(functionBody);\n return functionString.substring((functionString.indexOf(\"{\") + 1), (functionString.length -1));\n }\n\n /**\n * @function sortTaskOutput - Sorts array by defined order\n * @param {object} arr - Array to sort\n * @param {string} order - Defined sort order\n */\n sortTaskOutput(arr, order) {\n switch(order) {\n case 'desc':\n case 'asc':\n return Array.prototype.sort.call(arr, function(a, b) {\n return (order === 'asc' ? (a - b) : (b - a)); \n });\n case 'ascAlpha':\n return arr.sort();\n case 'descAlpha':\n return arr.reverse();\n default:\n return arr;\n }\n }\n\n /**\n * @function getBufferSize - Gets the byte length of the input array\n * @param {TypedArray} array - The input typed array\n * @returns {number} - The byte length of the array\n */\n getBufferSize(array) {\n return array.byteLength;\n }\n\n /**\n * @function createSharedBuffer - Creates a SharedArrayBuffer based on the input array's byte length\n * @param {TypedArray} array - The input typed array\n * @returns {SharedArrayBuffer} - The created SharedArrayBuffer\n */\n createSharedBuffer(array) {\n const byteLength = this.getBufferSize(array);\n const sharedBuffer = new SharedArrayBuffer(byteLength);\n const sharedArray = new array.constructor(sharedBuffer);\n\n // Copy data from the input array to the shared array\n sharedArray.set(array);\n\n return sharedBuffer;\n }\n\n /**\n * @function setupSharedArrayBuffer - Sets up the shared buffer and corresponding typed array\n * @param {TypedArray} array - The input typed array\n * @returns {object} - SharedArrayBuffer;\n */\n setupSharedArrayBuffer(array) {\n return this.createSharedBuffer(array);\n }\n\n /**\n * @function aggregateThreadOutputs - Joins individual thread outputs into single result\n * @param {array} input - Array of arrays to aggregate\n * @param {string} dataType - Data type to use for typed array\n */\n aggregateThreadOutputs(input, dataType) {\n if(!dataType) {\n return input.reduce(function(a, b) {\n return a.concat(b);\n });\n }\n let i = 0;\n let len = input.length;\n let bufferLength = 0;\n for (i; i < len; i += 1) {\n bufferLength += input[i].length;\n }\n let output = this.processDataType(dataType, bufferLength);\n let offset = 0;\n for (i = 0; i < len; i += 1) {\n output.set(input[i], offset);\n offset += input[i].length;\n }\n return output;\n }\n\n /**\n * @function addThreadOutputWithIndex - Joins individual thread outputs into single result\n * @param {object} task - Hamsters task object\n * @param {object} index - Index information\n * @param {array} output - Output array\n */\n addThreadOutputWithIndex(task, index, output) {\n let i = 0;\n const outputLength = output.length;\n for (i; i < outputLength; i++) {\n task.output[(index.start + i)] = output[i];\n }\n }\n\n /**\n * @function calculateIndexes - Splits a single array into multiple equal sized subarrays\n * @param {array} array - Array to split\n * @param {number} n - Number of subarrays to create\n */\n calculateIndexes(array, n) {\n // If n is 1, return the whole array range\n if (n === 1) {\n return [{ start: 0, end: array.length - 1 }];\n }\n\n const indexes = [];\n const segmentSize = Math.floor(array.length / n);\n let startIndex = 0;\n\n for (let i = 0; i < n; i++) {\n const endIndex = startIndex + segmentSize - 1;\n indexes.push({ start: startIndex, end: endIndex });\n startIndex = endIndex + 1;\n }\n\n // Adjust the last segment to cover any remaining elements\n if (startIndex < array.length) {\n indexes[n - 1].end = array.length - 1;\n }\n\n return indexes;\n }\n \n\n /**\n * @function getSubArrayUsingIndex - Slices subarray based on provided index\n * @param {object} index - Index information\n * @param {object} inputArray - Hamsters task object\n */\n getSubArrayUsingIndex(index, inputArray) {\n return inputArray.slice(index.start, index.end + 1);\n }\n}\n\nmodule.exports = Data;\n\n\n// WEBPACK FOOTER //\n// ./core/data.js","class Wheel {\n\n /**\n * @constructor\n * @function constructor - Sets properties for this class\n */\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.worker = this.workerScaffold;\n this.regular = this.regularScaffold;\n this.legacy = this.legacyScaffold.bind(this);\n }\n\n /**\n * @function workerScaffold - Provides worker body for library functionality when used within a worker [threads inside threads]\n */\n workerScaffold() {\n self.params = {};\n self.rtn = {};\n\n addEventListener('connect', (incomingConnection) => {\n var port = incomingConnection.ports[0];\n port.start();\n port.addEventListener('message', (incomingMessage) => {\n this.params = incomingMessage.data;\n this.rtn = {\n data: [],\n dataType: this.params.dataType\n };\n eval(\"(\" + this.params.hamstersJob + \")\")();\n port.postMessage(this.rtn);\n }, false);\n }, false);\n }\n\n /**\n * @function regularScaffold - Provides worker body for library functionality\n */\n regularScaffold() {\n self.params = {};\n self.rtn = {};\n\n self.onmessage = function(message) {\n this.params = message.data;\n this.rtn = {\n data: [],\n dataType: (typeof this.params.dataType !== 'undefined' ? this.params.dataType : null),\n index: this.params.index\n };\n if (this.params.sharedBuffer) {\n this.params.sharedArray = typedArrayFromBuffer(this.params.dataType, this.params.sharedBuffer);\n }\n eval(this.params.hamstersJob);\n const buffers = handleDataType(this.rtn);\n returnResponse(this.rtn, buffers);\n }.bind(this);\n\n function handleDataType(rtn) {\n if (this.params.sharedArray) {\n // Do nothing here, we don't need to return a buffer rtn.data is useless here\n } else if(this.params.dataType) {\n rtn.data = typedArrayFromBuffer(rtn.dataType, rtn.data);\n }\n return getTransferableObjects(rtn); // Return transferable objects\n }\n\n function typedArrayFromBuffer(dataType, buffer) {\n var types = {\n 'Uint32': Uint32Array,\n 'Uint16': Uint16Array,\n 'Uint8': Uint8Array,\n 'Uint8clamped': Uint8ClampedArray,\n 'Int32': Int32Array,\n 'Int16': Int16Array,\n 'Int8': Int8Array,\n 'Float32': Float32Array,\n 'Float64': Float64Array\n };\n if (!types[dataType]) {\n return buffer;\n }\n return new types[dataType](buffer);\n }\n\n function returnResponse(rtn, buffers) {\n if (buffers && buffers.length > 0) {\n // If there are buffers, postMessage with transferable objects\n postMessage(rtn, buffers);\n } else {\n // Otherwise, postMessage without transferable objects\n postMessage(rtn);\n }\n }\n\n function getTransferableObjects(obj) {\n const transferableObjects = new Set();\n const typedArrayTypes = [\n 'Int32Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', \n 'Uint16Array', 'Uint32Array', 'Float32Array', 'Float64Array'\n ];\n const otherTransferables = [\n 'ArrayBuffer', 'MessagePort', 'ImageBitmap', 'OffscreenCanvas'\n ];\n \n const globalContext = typeof self !== 'undefined' ? self : window;\n \n const allTypes = [...typedArrayTypes, ...otherTransferables];\n \n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n for (const type of allTypes) {\n if (typeof globalContext[type] !== 'undefined' && obj[prop] instanceof globalContext[type]) {\n if (typedArrayTypes.includes(type)) {\n transferableObjects.add(obj[prop].buffer);\n } else {\n transferableObjects.add(obj[prop]);\n }\n }\n }\n }\n }\n \n return Array.from(transferableObjects);\n }\n }\n\n\n /**\n * @function legacyScaffold - Provides library functionality for legacy devices\n */\n legacyScaffold(params, resolve, reject) {\n var rtn = {\n data: [],\n dataType: (typeof params.dataType !== \"undefined\" ? params.dataType : null)\n };\n if(this.hamsters.habitat.reactNative) {\n self.rtn = rtn;\n }\n if(this.hamsters.habitat.node || this.hamsters.habitat.isIE) {\n eval(params.hamstersJob);\n } else {\n params.hamstersJob();\n }\n resolve(rtn.data);\n }\n}\n\nmodule.exports = Wheel;\n\n\n\n// WEBPACK FOOTER //\n// ./core/wheel.js","/* jshint esversion: 6, curly: true, eqeqeq: true, forin: true */\n\n/***********************************************************************************\n* Title: Hamsters.js *\n* Description: 100% Vanilla Javascript Multithreading & Parallel Execution Library *\n* Author: Austin K. Smith *\n* Contact: austin@asmithdev.com * \n* Copyright: 2015 Austin K. Smith - austin@asmithdev.com * \n* License: Artistic License 2.0 *\n***********************************************************************************/\n\nclass Task {\n /**\n * @constructor\n * @param {object} habitat - The environment settings\n * @param {object} data - Data utility methods\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n constructor(hamsters, params, functionToRun) {\n 'use strict';\n\n this.input = params;\n this.output = [];\n this.scheduler = {\n count: 0,\n threads: params.threads || 1,\n workers: []\n };\n \n if (hamsters.habitat.legacy) {\n this.setupLegacyTask(hamsters, functionToRun);\n } else {\n this.setupModernTask(hamsters, params, functionToRun);\n }\n \n if (hamsters.habitat.debug) {\n this.setupDebugMetrics();\n }\n }\n \n /**\n * @method setupLegacyTask\n * @description Sets up task for legacy environments\n * @param {function} functionToRun - Function to execute\n */\n setupLegacyTask(hamsters, functionToRun) {\n this.scheduler.threads = 1;\n if (!hamsters.habitat.node && !hamsters.habitat.isIE) {\n this.input.hamstersJob = functionToRun;\n }\n }\n \n /**\n * @method setupModernTask\n * @description Sets up task for modern environments\n * @param {object} params - Provided library execution options\n * @param {function} functionToRun - Function to execute\n */\n setupModernTask(hamsters, params, functionToRun) {\n this.input.hamstersJob = hamsters.habitat.legacy ? functionToRun : hamsters.data.prepareFunction(functionToRun);\n if (params.sharedArray && hamsters.habitat.atomics) {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.sharedArray, this.scheduler.threads);\n this.scheduler.sharedBuffer = hamsters.data.setupSharedArrayBuffer(params.sharedArray);\n this.input.sharedArray = []; //Reduce ram usage on main thread, do not preserve original array its no longer needed.\n } else {\n this.scheduler.indexes = params.indexes || hamsters.data.getSubArrayIndexes(params.array, this.scheduler.threads);\n }\n }\n \n /**\n * @method setupDebugMetrics\n * @description Sets up debug metrics if debug mode is enabled\n */\n setupDebugMetrics() {\n this.scheduler.metrics = {\n created_at: Date.now(),\n started_at: null,\n completed_at: null,\n threads: this.setupThreadMetrics()\n };\n }\n\n setupThreadMetrics() {\n let i = 0;\n let threadMetrics = [];\n while(i < this.scheduler.threads) {\n threadMetrics.push({\n created_at: Date.now(),\n started_at: null,\n enqueued_at: null,\n dequeued_at: null,\n completed_at: null\n });\n i += 1;\n }\n return threadMetrics;\n }\n }\n \n module.exports = Task;\n \n\n\n// WEBPACK FOOTER //\n// ./core/task.js","import NodeStore from './stores/NodeStore';\nimport WebStore from './stores/WebStore';\n\nclass Memoize {\n constructor(hamsters, maxSize) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.store = this.hamsters.habitat.node ? new NodeStore(maxSize) : new WebStore('hamstersjs', 'cacheStore', maxSize);\n }\n\n memoize(func) {\n const self = this;\n return function(task) {\n const key = self.generateTaskKey(task);\n\n return new Promise(function(resolve, reject) {\n self.store.get(key).then(function(cachedResult) {\n if (cachedResult !== null) {\n resolve(cachedResult);\n } else {\n self.applyFunc(func, task).then(function(result) {\n self.store.set(key, result).then(function() {\n resolve(result);\n }).catch(reject);\n }).catch(reject);\n }\n }).catch(reject);\n });\n };\n }\n\n generateTaskKey(task) {\n const key = JSON.stringify({ input: task.input });\n return this.hashCode(key);\n }\n\n hashCode(str) {\n let hash = 0, i, chr;\n if (str.length === 0) return hash;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash.toString();\n }\n\n applyFunc(func, args) {\n return new Promise((resolve, reject) => {\n try {\n const result = func.apply(null, args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n }\n}\n\nmodule.exports = Memoize;\n\n\n// WEBPACK FOOTER //\n// ./feature/memoize.js","class NodeStore {\n constructor(maxSize) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key) {\n if (this.cache.has(key)) {\n const value = this.cache.get(key);\n // Refresh the key\n this.cache.delete(key);\n this.cache.set(key, value);\n return Promise.resolve(value);\n }\n return Promise.resolve(null);\n }\n\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n // Remove the oldest (least recently used) entry\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n return Promise.resolve();\n }\n\n clear() {\n this.cache.clear();\n return Promise.resolve();\n }\n}\n\nmodule.exports = NodeStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/NodeStore.js","class WebStore {\n constructor(dbName, storeName, maxSize) {\n this.dbName = dbName;\n this.storeName = storeName;\n this.maxSize = maxSize;\n this.db = null;\n this.initDB();\n }\n\n initDB() {\n const self = this;\n const request = indexedDB.open(this.dbName, 1);\n\n request.onerror = function(event) {\n console.error('Error opening database:', event.target.error);\n };\n\n request.onupgradeneeded = function(event) {\n const db = event.target.result;\n if (!db.objectStoreNames.contains(self.storeName)) {\n const objectStore = db.createObjectStore(self.storeName, { keyPath: 'key' });\n objectStore.createIndex('by_key', 'key', { unique: true });\n objectStore.createIndex('by_timestamp', 'timestamp');\n }\n };\n\n request.onsuccess = function(event) {\n self.db = event.target.result;\n };\n }\n\n get(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve(null);\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const result = event.target.result;\n if (result) {\n self.updateTimestamp(key).then(() => resolve(result.value)).catch(reject);\n } else {\n resolve(null);\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n set(key, value) {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n self.checkSize().then(() => {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.put({ key: key, value: value, timestamp: Date.now() });\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n }).catch(reject);\n });\n }\n\n clear() {\n const self = this;\n return new Promise(function(resolve, reject) {\n if (!self.db) {\n console.error('Database not initialized');\n resolve();\n return;\n }\n\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.clear();\n\n request.onsuccess = function() {\n resolve();\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n checkSize() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readonly');\n const objectStore = transaction.objectStore(self.storeName);\n const countRequest = objectStore.count();\n\n countRequest.onsuccess = function() {\n const count = countRequest.result;\n if (count >= self.maxSize) {\n self.evictOldest().then(resolve).catch(reject);\n } else {\n resolve();\n }\n };\n\n countRequest.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n evictOldest() {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const index = objectStore.index('by_timestamp');\n const request = index.openCursor(null, 'next');\n\n request.onsuccess = function(event) {\n const cursor = event.target.result;\n if (cursor) {\n cursor.delete().onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n\n updateTimestamp(key) {\n const self = this;\n return new Promise(function(resolve, reject) {\n const transaction = self.db.transaction([self.storeName], 'readwrite');\n const objectStore = transaction.objectStore(self.storeName);\n const request = objectStore.get(key);\n\n request.onsuccess = function(event) {\n const data = event.target.result;\n if (data) {\n data.timestamp = Date.now();\n objectStore.put(data).onsuccess = function() {\n resolve();\n };\n } else {\n resolve();\n }\n };\n\n request.onerror = function(event) {\n reject(event.target.error);\n };\n });\n }\n}\n\nmodule.exports = WebStore;\n\n\n\n// WEBPACK FOOTER //\n// ./feature/stores/WebStore.js","class Distribute {\n\n constructor(hamsters) {\n 'use strict';\n\n this.hamsters = hamsters;\n this.localConnection = null;\n this.remoteConnections = {};\n this.sendChannels = {};\n this.receiveChannels = {};\n this.pcConstraint = null;\n this.dataConstraint = null;\n this.ws = null;\n this.clientId = null;\n this.pendingPromises = {};\n this.returnDistributedOutput = this.sendDataResponse.bind(this);\n this.latencies = {};\n this.establishConnection = this.initWebSocket.bind(this);\n }\n\n initWebSocket() {\n this.ws = new WebSocket(`${this.hamsters.habitat.relay}`);\n\n this.ws.onopen = () => {\n console.info(`Hamsters.js ${this.hamsters.version} connection established`);\n const registerMessage = {\n type: 'register',\n logicalCores: this.hamsters.maxThreads\n };\n this.ws.send(JSON.stringify(registerMessage));\n };\n\n this.ws.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'register':\n this.handleClientReconnect(message);\n break;\n case 'update-client-list':\n this.updateClientList(message.clients);\n break;\n case 'offer':\n this.handleOffer(message);\n break;\n case 'answer':\n this.handleAnswer(message);\n break;\n case 'candidate':\n this.handleCandidate(message);\n break;\n case 'task-response':\n this.handleTaskResponse(message);\n break;\n default:\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} unknown message type: ${message.type}`);\n }\n }\n };\n\n this.ws.onerror = (error) => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} connection error: ${error}`);\n }\n };\n\n this.ws.onclose = () => {\n if (this.hamsters.habitat.debug) {\n console.info(`Hamsters.js ${this.hamsters.version} connection closed.`);\n }\n };\n }\n\n updateClientList(clients) {\n clients.forEach(client => {\n if (client.id !== this.clientId && !this.remoteConnections[client.id]) {\n this.createConnection(client.id);\n }\n });\n }\n\n handleClientReconnect(message) {\n const newClientId = message.id;\n\n if (this.clientId === newClientId) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} connection error: `, error);\n }\n return;\n }\n\n if (this.remoteConnections[newClientId]) {\n this.remoteConnections[newClientId].close();\n delete this.remoteConnections[newClientId];\n }\n if (this.sendChannels[newClientId]) {\n this.sendChannels[newClientId].close();\n delete this.sendChannels[newClientId];\n }\n if (this.receiveChannels[newClientId]) {\n this.receiveChannels[newClientId].close();\n delete this.receiveChannels[newClientId];\n }\n delete this.latencies[newClientId];\n\n this.clientId = newClientId;\n this.loadClientList();\n }\n\n loadClientList() {\n fetch(`/clients?currentId=${this.clientId}`)\n .then(response => response.json())\n .then(data => {\n this.updateClientList(data);\n })\n .catch(error => {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} Error fetching client list: ${error}`);\n }\n });\n }\n\n createConnections() {\n Object.keys(this.remoteConnections).forEach(targetClient => {\n this.createConnection(targetClient);\n });\n }\n\n createConnection(targetClient) {\n if (targetClient === this.clientId || this.remoteConnections[targetClient]) {\n return;\n }\n\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const localConnection = new RTCPeerConnection(servers, this.pcConstraint);\n const sendChannel = localConnection.createDataChannel('hamstersjs', this.dataConstraint);\n\n localConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n localConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n this.remoteConnections[targetClient] = localConnection;\n this.sendChannels[targetClient] = sendChannel;\n this.receiveChannels[targetClient] = null;\n\n localConnection.createOffer().then(desc => {\n localConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'offer', target: targetClient, offer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n }\n\n handleOffer(data) {\n const targetClient = data.from;\n\n if (!this.remoteConnections[targetClient]) {\n const servers = {\n iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n };\n\n const remoteConnection = new RTCPeerConnection(servers, this.pcConstraint);\n\n remoteConnection.onicecandidate = (e) => {\n if (e.candidate) {\n this.ws.send(JSON.stringify({ type: 'candidate', target: targetClient, candidate: e.candidate }));\n }\n };\n\n remoteConnection.ondatachannel = (event) => {\n this.receiveChannelCallback(event, targetClient);\n };\n\n const sendChannel = remoteConnection.createDataChannel('hamstersjs', this.dataConstraint);\n \n sendChannel.onopen = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onclose = () => {\n this.onSendChannelStateChange(targetClient);\n };\n\n sendChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n remoteConnection.setRemoteDescription(new RTCSessionDescription(data.offer)).then(() => {\n return remoteConnection.createAnswer();\n }).then(desc => {\n remoteConnection.setLocalDescription(desc);\n this.ws.send(JSON.stringify({ type: 'answer', target: targetClient, answer: desc }));\n }).catch(this.onCreateSessionDescriptionError);\n\n this.remoteConnections[targetClient] = remoteConnection;\n this.sendChannels[targetClient] = sendChannel;\n }\n }\n\n handleAnswer(data) {\n const connection = this.remoteConnections[data.from];\n connection.setRemoteDescription(new RTCSessionDescription(data.answer));\n }\n\n handleCandidate(data) {\n const connection = this.remoteConnections[data.from];\n connection.addIceCandidate(new RTCIceCandidate(data.candidate)).catch(this.onAddIceCandidateError);\n }\n\n measureLatency(targetClient) {\n const startTime = performance.now();\n this.sendPing(targetClient, startTime);\n }\n\n sendPing(targetClient, startTime) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'ping', startTime }));\n }\n }\n\n handlePing(targetClient, startTime) {\n console.log(\"Remote Connections \", this.remoteConnections);\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify({ type: 'pong', startTime }));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent ping to ${targetClient}`);\n }\n }\n }\n\n handlePong(targetClient, startTime) {\n const latency = performance.now() - startTime;\n this.latencies[targetClient] = latency;\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received pong from ${targetClient} with latency: ${latency.toFixed(2)}ms`);\n }\n }\n\n fetchDistributedClient() {\n const sendChannelKeys = Object.keys(this.sendChannels);\n if (sendChannelKeys.length === 0) {\n if (this.hamsters.habitat.debug) {\n console.warn(`Hamsters.js ${this.hamsters.version} no send channels available.`);\n }\n return null;\n }\n\n let minLatency = Infinity;\n let targetClient = null;\n\n sendChannelKeys.forEach(clientId => {\n let channel = this.sendChannels[clientId];\n if (channel.readyState === 'open' && this.latencies[clientId] < minLatency) {\n minLatency = this.latencies[clientId];\n targetClient = clientId;\n }\n });\n\n return targetClient;\n }\n\n distributeTask(task, hamsterFood, resolve, reject) {\n const targetClient = this.fetchDistributedClient();\n if (!targetClient) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} no target client found.`);\n }\n reject('No target client found.');\n return;\n }\n\n const messageId = this.generateUniqueId();\n\n const subTask = {\n hamsterFood,\n index: hamsterFood.index,\n task,\n messageId,\n };\n\n this.pendingPromises[messageId] = { resolve, reject };\n\n this.sendData({ targetClient, data: subTask });\n }\n\n handleTaskResponse(incomingMessage) {\n const { messageId, output, error } = incomingMessage;\n const pendingPromise = this.pendingPromises[messageId];\n\n if (pendingPromise) {\n if (error) {\n pendingPromise.reject(error);\n } else {\n pendingPromise.resolve(output);\n }\n\n delete this.pendingPromises[messageId];\n }\n }\n\n sendData({ targetClient, data }) {\n const sendChannel = this.sendChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent data to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n sendDataResponse(data) {\n const targetClient = data.targetClient;\n const sendChannel = this.receiveChannels[targetClient];\n if (sendChannel && sendChannel.readyState === 'open') {\n sendChannel.send(JSON.stringify(data));\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} sent response to: `, targetClient);\n }\n } else {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} send channel is not open for targetClient: `, targetClient);\n }\n }\n }\n\n closeDataChannels() {\n for (const targetClient in this.sendChannels) {\n if (this.sendChannels[targetClient]) {\n this.sendChannels[targetClient].close();\n delete this.sendChannels[targetClient];\n }\n if (this.receiveChannels[targetClient]) {\n this.receiveChannels[targetClient].close();\n delete this.receiveChannels[targetClient];\n }\n if (this.remoteConnections[targetClient]) {\n this.remoteConnections[targetClient].close();\n delete this.remoteConnections[targetClient];\n }\n delete this.latencies[targetClient];\n }\n this.localConnection = null;\n }\n\n receiveChannelCallback(event, targetClient) {\n const receiveChannel = event.channel;\n\n receiveChannel.onmessage = (event) => {\n const message = JSON.parse(event.data);\n switch (message.type) {\n case 'ping':\n this.handlePing(targetClient, message.startTime);\n break;\n case 'pong':\n this.handlePong(targetClient, message.startTime);\n break;\n default:\n this.onReceiveMessageCallback(targetClient, event.data);\n }\n };\n\n receiveChannel.onopen = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n receiveChannel.onclose = () => {\n this.onReceiveChannelStateChange(targetClient);\n };\n\n this.receiveChannels[targetClient] = receiveChannel;\n }\n\n onReceiveMessageCallback(targetClient, data) {\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} received message!`);\n }\n const incomingMessage = JSON.parse(data);\n\n if (incomingMessage.isReply) {\n this.handleTaskResponse(incomingMessage);\n if (this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} response received for task: `, incomingMessage);\n }\n } else {\n this.hamsters.pool.runDistributedTask(incomingMessage, targetClient);\n }\n }\n\n onSendChannelStateChange(targetClient) {\n const sendChannel = this.sendChannels[targetClient];\n this.measureLatency(targetClient);\n if (sendChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} send channel state changed for ${targetClient}: ${sendChannel.readyState}`);\n }\n }\n\n onReceiveChannelStateChange(targetClient) {\n const receiveChannel = this.receiveChannels[targetClient];\n if (receiveChannel && this.hamsters.habitat.debug) {\n console.log(`Hamsters.js ${this.hamsters.version} receive channel state changed for ${targetClient}: ${receiveChannel.readyState}`);\n }\n }\n\n generateUniqueId() {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n }\n\n onCreateSessionDescriptionError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to create session description: ${error}`);\n }\n }\n\n onAddIceCandidateError(error) {\n if (this.hamsters.habitat.debug) {\n console.error(`Hamsters.js ${this.hamsters.version} failed to add ICE candidate: ${error}`);\n }\n }\n}\n\nmodule.exports = Distribute;\n\n\n// WEBPACK FOOTER //\n// ./feature/distribute.js"],"sourceRoot":""} \ No newline at end of file