UNPKG

@theopenweb/js-sensor

Version:

JavaScript sensor library for native input sensors.

950 lines 72.7 kB
[ { "__docId__": 1, "kind": "external", "name": "Infinity", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Infinity", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 2, "kind": "external", "name": "NaN", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~NaN", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 3, "kind": "external", "name": "undefined", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~undefined", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 4, "kind": "external", "name": "null", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~null", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 5, "kind": "external", "name": "Object", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Object", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 6, "kind": "external", "name": "object", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~object", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 7, "kind": "external", "name": "Function", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Function", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 8, "kind": "external", "name": "function", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~function", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 9, "kind": "external", "name": "Boolean", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Boolean", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 10, "kind": "external", "name": "boolean", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~boolean", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 11, "kind": "external", "name": "Symbol", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Symbol", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 12, "kind": "external", "name": "Error", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Error", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 13, "kind": "external", "name": "EvalError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~EvalError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 14, "kind": "external", "name": "InternalError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~InternalError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 15, "kind": "external", "name": "RangeError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~RangeError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 16, "kind": "external", "name": "ReferenceError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~ReferenceError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 17, "kind": "external", "name": "SyntaxError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~SyntaxError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 18, "kind": "external", "name": "TypeError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~TypeError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 19, "kind": "external", "name": "URIError", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~URIError", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 20, "kind": "external", "name": "Number", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Number", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 21, "kind": "external", "name": "number", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~number", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 22, "kind": "external", "name": "Date", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Date", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 23, "kind": "external", "name": "String", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~String", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 24, "kind": "external", "name": "string", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~string", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 25, "kind": "external", "name": "RegExp", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~RegExp", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 26, "kind": "external", "name": "Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 27, "kind": "external", "name": "Int8Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Int8Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 28, "kind": "external", "name": "Uint8Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Uint8Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 29, "kind": "external", "name": "Uint8ClampedArray", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Uint8ClampedArray", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 30, "kind": "external", "name": "Int16Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Int16Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 31, "kind": "external", "name": "Uint16Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Uint16Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 32, "kind": "external", "name": "Int32Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Int32Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 33, "kind": "external", "name": "Uint32Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Uint32Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 34, "kind": "external", "name": "Float32Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Float32Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 35, "kind": "external", "name": "Float64Array", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Float64Array", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 36, "kind": "external", "name": "Map", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Map", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 37, "kind": "external", "name": "Set", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Set", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 38, "kind": "external", "name": "WeakMap", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~WeakMap", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 39, "kind": "external", "name": "WeakSet", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~WeakSet", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 40, "kind": "external", "name": "ArrayBuffer", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~ArrayBuffer", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 41, "kind": "external", "name": "DataView", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~DataView", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 42, "kind": "external", "name": "JSON", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~JSON", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 43, "kind": "external", "name": "Promise", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Promise", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 44, "kind": "external", "name": "Generator", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Generator", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 45, "kind": "external", "name": "GeneratorFunction", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/GeneratorFunction", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~GeneratorFunction", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 46, "kind": "external", "name": "Reflect", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Reflect", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 47, "kind": "external", "name": "Proxy", "externalLink": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy", "memberof": "class/.external-ecmascript.js", "static": true, "longname": "class/.external-ecmascript.js~Proxy", "access": "public", "description": "", "builtinExternal": true }, { "__docId__": 48, "kind": "file", "name": "class/browser-sensor-watcher.js", "content": "/**\r\n * Collection of browser based sensor events.\r\n * Sensors should be continuous events.\r\n * Therefor each should be setup in similar way using an event listener.\r\n * Objects of events, arguments and implementations may differ.\r\n */\r\nclass BrowserSensorWatcher {\r\n\r\n constructor(){\r\n /**\r\n * All sensor handles must return promise and take no arguments.\r\n * start: required. args: (optional options object) should resolve an array with arguments to be passed to stop.\r\n * stop: required. args: (returnedData from start)\r\n * check: optional.\r\n */\r\n this.sensorHandles = {\r\n \r\n /**\r\n * Watch GPS position\r\n * data: https://developer.mozilla.org/en-US/docs/Web/API/Position\r\n * \r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition\r\n * @return {SensorListener}\r\n */\r\n watchPosition: {\r\n start: (options)=>{\r\n let eventListener = options.events.data;\r\n return new Promise((resolve, reject)=>{\r\n let id = navigator.geolocation.watchPosition(\r\n eventListener,\r\n (err)=>{\r\n return reject(console.error('Failed watchPosition', err));\r\n }\r\n );\r\n resolve([id]);\r\n });\r\n },\r\n stop: (id)=>{navigator.geolocation.clearWatch(id); return Promise.resolve();}\r\n },\r\n\r\n /**\r\n * Gets camera and audio and records\r\n * data: image dataURL\r\n * \r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\r\n * @return {SensorListener}\r\n */\r\n getUserMedia: {\r\n start: (options)=>{\r\n let eventListener = options.events.data;\r\n return navigator.mediaDevices.getUserMedia({audio: true, video: true})\r\n .then((stream)=>{\r\n /*\r\n //MediaRecorder API. Preferred but ondataavailable seems unreliable.\r\n let recorder = new MediaRecorder(stream);\r\n let onDataAvailable = function(ev){console.log(\"WORKED\");\r\n eventListener(ev.data);\r\n };\r\n //recorder.addEventListener('dataavailable', onDataAvailable);\r\n recorder.ondataavailable = onDataAvailable;\r\n recorder.start();\r\n */\r\n\r\n //Basic interval\r\n let url = window.URL.createObjectURL(stream);\r\n let video = document.createElement('video');\r\n video.autoplay = true;\r\n video.src = url;\r\n\r\n let recorder = {};\r\n recorder.interval = null;\r\n recorder.ondataavailable = function(ev){\r\n eventListener(ev.data);\r\n };\r\n recorder.start = function(){\r\n recorder.interval = window.setInterval(recorder.handleData, 500);\r\n };\r\n recorder.handleData = function(){\r\n let canvas = document.createElement('canvas');\r\n canvas.width = video.videoWidth;\r\n canvas.height = video.videoHeight;\r\n let ctx = canvas.getContext('2d');\r\n ctx.drawImage(video, 0, 0);\r\n\r\n recorder.ondataavailable({\r\n data: canvas.toDataURL()\r\n });\r\n };\r\n recorder.stop = function(){\r\n window.URL.revokeObjectURL(url);\r\n window.clearTimeout(recorder.interval);\r\n recorder.interval = null;\r\n };\r\n recorder.start();\r\n\r\n return Promise.resolve([stream, recorder]);\r\n });\r\n },\r\n stop: (stream, recorder)=>{recorder.stop(); let tracks = stream.getTracks(); tracks.map((track)=>{track.stop();}); return Promise.resolve();}\r\n },\r\n\r\n /**\r\n * Device orientation(3d coordinates)\r\n * @see https://developer.mozilla.org/en-US/docs/Web/Events/deviceorientation\r\n * @return {SensorListener}\r\n */\r\n deviceOrientation: this._getWindowEventListenerObject('deviceorientation'),\r\n \r\n /**\r\n * Device light(lux)\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DeviceLightEvent\r\n * @return {SensorListener}\r\n */\r\n deviceLight: this._getWindowEventListenerObject('devicelight'),\r\n \r\n /**\r\n * Device proximity(cm)\r\n * @see https://developer.mozilla.org/en-US/docs/Web/Events/deviceproximity\r\n * @return {SensorListener}\r\n */\r\n deviceProximity: this._getWindowEventListenerObject('deviceproximity'),\r\n \r\n /**\r\n * Device motion(acceleration + rotation. Can use for measuring path taken.)\r\n * @see https://developer.mozilla.org/en-US/docs/Web/Events/devicemotion\r\n * @return {SensorListener}\r\n */\r\n deviceMotion: this._getWindowEventListenerObject('devicemotion'),\r\n \r\n /**\r\n * Test use only.\r\n * For testing when sensors might not be available.\r\n * Not implemented in watchAll.\r\n * @return {SensorListener}\r\n */\r\n test: this._getTestEventListenerObject()//Useful for both automated testing and learning on personal computer.\r\n };\r\n }\r\n\r\n /**\r\n * Common object for handling sensors\r\n * start: Starts watching sensor\r\n * stop: Stops watching sensor\r\n * check: Checks for support\r\n */\r\n SensorListener(){\r\n return {\r\n start: ()=>{},\r\n stop: ()=>{},\r\n check: ()=>{return true;}\r\n };\r\n }\r\n\r\n /**\r\n * Common SensorListener for window events such as devicemotion.\r\n * \r\n * @param {String} eventName \r\n * @return {SensorListener}\r\n */\r\n _getWindowEventListenerObject(eventName){\r\n return {\r\n start: function(options){\r\n let eventListener = options.events.data;\r\n return new Promise((resolve, reject)=>{\r\n window.addEventListener(eventName, eventListener);\r\n resolve([eventName, eventListener]);\r\n }); \r\n },\r\n stop: function(eventName, eventListener){\r\n return new Promise((resolve, reject)=>{\r\n window.removeEventListener(eventName, eventListener);\r\n resolve();\r\n });\r\n },\r\n check: ()=>{return true;}\r\n };\r\n }\r\n\r\n /**\r\n * Gets test SensorListener that can be used without access to sensors.\r\n * Used for testing on displaying when sensors not available.\r\n * \r\n * @return {SensorListener}\r\n */\r\n _getTestEventListenerObject(){\r\n return {\r\n start: function(options){\r\n let eventListener = options.events.data;\r\n return new Promise((resolve, reject)=>{\r\n let id = window.setInterval(()=>{\r\n eventListener('test data');\r\n }, 500);\r\n\r\n resolve([id]);\r\n });\r\n },\r\n stop: function(id){\r\n return new Promise((resolve, reject)=>{\r\n window.clearTimeout(id);\r\n resolve();\r\n });\r\n },\r\n check: function(){\r\n return true;\r\n }\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = BrowserSensorWatcher;", "static": true, "longname": "C:/d/projects/public/js-sensor/class/browser-sensor-watcher.js", "access": "public", "description": null, "lineNumber": 1 }, { "__docId__": 49, "kind": "class", "name": "BrowserSensorWatcher", "memberof": "class/browser-sensor-watcher.js", "static": true, "longname": "class/browser-sensor-watcher.js~BrowserSensorWatcher", "access": "public", "export": false, "importPath": "js-sensor/class/browser-sensor-watcher.js", "importStyle": null, "description": "Collection of browser based sensor events.\nSensors should be continuous events.\nTherefor each should be setup in similar way using an event listener.\nObjects of events, arguments and implementations may differ.", "lineNumber": 7, "interface": false }, { "__docId__": 50, "kind": "constructor", "name": "constructor", "memberof": "class/browser-sensor-watcher.js~BrowserSensorWatcher", "generator": false, "async": false, "static": false, "longname": "class/browser-sensor-watcher.js~BrowserSensorWatcher#constructor", "access": "public", "description": null, "lineNumber": 9, "undocument": true }, { "__docId__": 51, "kind": "member", "name": "sensorHandles", "memberof": "class/browser-sensor-watcher.js~BrowserSensorWatcher", "static": false, "longname": "class/browser-sensor-watcher.js~BrowserSensorWatcher#sensorHandles", "access": "public", "description": "All sensor handles must return promise and take no arguments.\nstart: required. args: (optional options object) should resolve an array with arguments to be passed to stop.\nstop: required. args: (returnedData from start)\ncheck: optional.", "lineNumber": 16, "type": { "types": [ "{\"watchPosition\": *, \"getUserMedia\": *, \"deviceOrientation\": *, \"deviceLight\": *, \"deviceProximity\": *, \"deviceMotion\": *, \"test\": *}" ] } }, { "__docId__": 52, "kind": "method", "name": "SensorListener", "memberof": "class/browser-sensor-watcher.js~BrowserSensorWatcher", "generator": false, "async": false, "static": false, "longname": "class/browser-sensor-watcher.js~BrowserSensorWatcher#SensorListener", "access": "public", "description": "Common object for handling sensors\nstart: Starts watching sensor\nstop: Stops watching sensor\ncheck: Checks for support", "lineNumber": 146, "params": [], "return": { "types": [ "{\"start\": *, \"stop\": *, \"check\": *}" ] } }, { "__docId__": 53, "kind": "method", "name": "_getWindowEventListenerObject", "memberof": "class/browser-sensor-watcher.js~BrowserSensorWatcher", "generator": false, "async": false, "static": false, "longname": "class/browser-sensor-watcher.js~BrowserSensorWatcher#_getWindowEventListenerObject", "access": "private", "description": "Common SensorListener for window events such as devicemotion.", "lineNumber": 160, "params": [ { "nullable": null, "types": [ "String" ], "spread": false, "optional": false, "name": "eventName", "description": "" } ], "return": { "nullable": null, "types": [ "SensorListener" ], "spread": false, "description": "" } }, { "__docId__": 54, "kind": "method", "name": "_getTestEventListenerObject", "memberof": "class/browser-sensor-watcher.js~BrowserSensorWatcher", "generator": false, "async": false, "static": false, "longname": "class/browser-sensor-watcher.js~BrowserSensorWatcher#_getTestEventListenerObject", "access": "private", "description": "Gets test SensorListener that can be used without access to sensors.\nUsed for testing on displaying when sensors not available.", "lineNumber": 185, "return": { "nullable": null, "types": [ "SensorListener" ], "spread": false, "description": "" }, "params": [] }, { "__docId__": 55, "kind": "file", "name": "class/js-sensor.js", "content": "const SensorHandler = require('./sensor-handler');\r\n\r\n/**\r\n * Wrapper for main class\r\n * Add additional methods here not to do with sensors if required.\r\n */\r\nclass JsSensor extends SensorHandler{\r\n constructor(){\r\n super();\r\n }\r\n}\r\n\r\nif(typeof window !== 'undefined'){\r\n window.JsSensor = JsSensor;\r\n}\r\nif(typeof module !== 'undefined'){\r\n module.exports = JsSensor;\r\n}", "static": true, "longname": "C:/d/projects/public/js-sensor/class/js-sensor.js", "access": "public", "description": null, "lineNumber": 1 }, { "__docId__": 56, "kind": "variable", "name": "SensorHandler", "memberof": "class/js-sensor.js", "static": true, "longname": "class/js-sensor.js~SensorHandler", "access": "public", "export": false, "importPath": "js-sensor", "importStyle": null, "description": null, "lineNumber": 1, "undocument": true, "type": { "types": [ "*" ] } }, { "__docId__": 57, "kind": "class", "name": "JsSensor", "memberof": "class/js-sensor.js", "static": true, "longname": "class/js-sensor.js~JsSensor", "access": "public", "export": false, "importPath": "js-sensor", "importStyle": null, "description": "Wrapper for main class\nAdd additional methods here not to do with sensors if required.", "lineNumber": 7, "interface": false, "extends": [ "SensorHandler" ] }, { "__docId__": 58, "kind": "constructor", "name": "constructor", "memberof": "class/js-sensor.js~JsSensor", "generator": false, "async": false, "static": false, "longname": "class/js-sensor.js~JsSensor#constructor", "access": "public", "description": null, "lineNumber": 8, "undocument": true }, { "__docId__": 59, "kind": "file", "name": "class/sensor-handler.js", "content": "const BrowserSensorWatcher = require('./browser-sensor-watcher');\r\nlet rawSensorWatcher;\r\n\r\n/**\r\n * Main class for handling sensors.\r\n * This class allows get, watch, etc. of sensors.\r\n */\r\nclass SensorHandler {\r\n\r\n constructor(env='browser'){\r\n\r\n //Override with updateSensorListeners\r\n if(env === 'browser'){\r\n rawSensorWatcher = this.rawSensorWatcher = new BrowserSensorWatcher();\r\n }\r\n\r\n //SensorState mapped by sensor name\r\n this.sensors = {\r\n //\r\n };\r\n\r\n //Sensor counts stored accross start and stop watching to make sure async starting and stopping doesn't cause bugs.\r\n this.sensorCreationCounts = {\r\n // \r\n };\r\n }\r\n\r\n /**\r\n * Get sensor once. Should stop watching sensor if newly made.\r\n * \r\n * @param {string} sensorName \r\n */\r\n get(sensorName){\r\n let self = this;\r\n return new Promise((resolve, reject)=>{\r\n let sensorCreationCount = self._getSensorCreationCount() + 1;\r\n let handle = (sensorState)=>{\r\n //resolve(sensorState);\r\n\r\n //Only stop if no new watches happened.\r\n if(!(self._getSensorCreationCount() > sensorCreationCount)){\r\n self.stop(sensorName)\r\n .then(()=>{\r\n resolve(sensorState);\r\n });\r\n }else{\r\n resolve(sensorState);\r\n }\r\n };\r\n self.watch(sensorName, {\r\n events: {\r\n data: handle\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Watch sensor from RawSensorWatcher. Ignores duplicates.\r\n * options: {\r\n * events: {\r\n * data: function(data){}\r\n * }\r\n * }\r\n * \r\n * @param {string} sensorName\r\n * @param {object} options optional options\r\n * @return {promise} promise resolving SensorState\r\n */\r\n watch(sensorName, options={}){\r\n const self = this;\r\n \r\n //data required(use console log if nothing)\r\n if(!options.events){options.events = {};}\r\n if(!options.events.data){options.events.data = this._getDefaultDataEvent(sensorName);}\r\n\r\n return new Promise((resolve, reject)=>{\r\n\r\n const onResolve = (sensorState)=>{\r\n self._incSensorCreationCount(sensorName);\r\n resolve(sensorState);\r\n };\r\n\r\n if(self.sensors[sensorName]){\r\n return onResolve(self.sensors[sensorName]);\r\n }\r\n\r\n if(rawSensorWatcher.sensorHandles[sensorName]){\r\n rawSensorWatcher.sensorHandles[sensorName].start(options)\r\n .then(function(startReturnData){\r\n let sensorState = self._setSensorState(sensorName, {\r\n options: options,\r\n startReturnData: startReturnData,\r\n stop: rawSensorWatcher.sensorHandles[sensorName].stop//Set to state because may implement multiple watching later.\r\n });\r\n return onResolve(sensorState);\r\n })\r\n .catch(reject);\r\n }else{\r\n return reject(new Error('No raw sensor: ' + sensorName));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Watches all available sensors.\r\n * \r\n * @return {promise} Resolves array of SensorStates. However allows for failing returning null.\r\n */\r\n watchAll(){\r\n let possibleSensors = rawSensorWatcher.sensorHandles;\r\n let promises = [];\r\n for(let key in possibleSensors){\r\n if(key === 'test'){continue;}\r\n let p = new Promise((resolve, reject)=>{\r\n this.watch(key)\r\n .then(resolve)\r\n .catch(()=>{\r\n resolve(null);\r\n });\r\n });\r\n promises.push(p);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n /**\r\n * Stops watching sensor.\r\n * \r\n * @param {string} sensorName\r\n * @return {promise}\r\n */\r\n stop(sensorName){\r\n let self = this;\r\n return new Promise((resolve, reject)=>{\r\n let sensor = self.sensors[sensorName];\r\n if(!sensor){\r\n reject(new Error('No sensor: ' + sensorName));\r\n }\r\n\r\n if(sensor.stop){\r\n sensor.stop(...sensor.startReturnData)\r\n .then(()=>{\r\n delete self.sensors[sensorName];\r\n console.log('sensor stop success: ' + sensorName);\r\n\r\n resolve(sensor);\r\n })\r\n .catch(reject);\r\n }else{\r\n reject(new Error('No sensor stop handle: ' + sensorName));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Stops watching all.\r\n * \r\n * @return {promise}\r\n */\r\n stopAll(){\r\n let promises = [];\r\n for(let key in this.sensors){\r\n promises.push(this.stop(key));\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n /**\r\n * Adds sensor event. Multiple at same time ok.\r\n * \r\n * @param {string} sensorName \r\n * @param {string} eventName \r\n * @param {function} handle\r\n * @return {boolean} success/failure \r\n */\r\n addSensorEvent(sensorName, eventName, handle){\r\n\r\n //Require started\r\n let sensor = this.sensors[sensorName];\r\n if(!sensor){\r\n return false;\r\n }\r\n \r\n let events = sensor.events;\r\n if(!events[eventName]){\r\n events[eventName] = [];\r\n }\r\n\r\n events[eventName].push(handle);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes sensor event. Only removes handle specified.\r\n * \r\n * @param {string} sensorName \r\n * @param {string} eventName \r\n * @param {function} handle\r\n * @return {boolean} success/failure \r\n */\r\n removeSensorEvent(sensorName, eventName, handle){\r\n\r\n //No sensor or event\r\n let sensor = this.sensors[sensorName];\r\n if(!sensor || !sensor.events[eventName]){\r\n return false;\r\n }\r\n\r\n let event = sensor.events[eventName];\r\n let index = event.indexOf(handle);\r\n\r\n if(index >= 0){\r\n event.splice(index, 1);\r\n\r\n return true;\r\n }else{\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Update registered sensor listeners.\r\n * Pass handle with one argument.\r\n * MUST return.\r\n * Dynamic updating during watching may result in bugs.\r\n * \r\n * @param {Function} handle handle taking object map of registered SensorListeners \r\n */\r\n updateSensorListeners(callback){\r\n this.rawSensorWatcher = callback(this.rawSensorWatcher);\r\n }\r\n\r\n /**\r\n * Gets usable sensor names\r\n * \r\n * @return {array} sensor names\r\n */\r\n getMappedSensorNames(){\r\n return Object.keys(this.rawSensorWatcher.sensorHandles);\r\n }\r\n\r\n /**\r\n * Current state of sensor\r\n * @return {SensorState}\r\n */\r\n _SensorState(){\r\n return {\r\n isSensorState: true,\r\n name: '',\r\n stop: null,//Copied over from RawSensorWatcher object for better management.\r\n startReturnData: null,\r\n options: {},\r\n events: {\r\n data: null\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Sets sensor state. Requires settings.events.\r\n * \r\n * @param {string} sensorName \r\n * @param {object} settings \r\n */\r\n _setSensorState(sensorName, settings={}){\r\n console.log('_setSensorState: ', sensorName, settings);\r\n\r\n let sensorState;\r\n if(this.sensors[sensorName]){\r\n sensorState = this.sensors[sensorName];\r\n }else{\r\n sensorState = this._SensorState();\r\n sensorState.name = sensorName;\r\n\r\n this.sensors[sensorName] = sensorState;\r\n\r\n let key;\r\n for(key in settings){\r\n sensorState[key] = settings[key];\r\n }\r\n\r\n //Events\r\n let options = settings.options;\r\n if(options.events){\r\n for(key in options.events){\r\n this.addSensorEvent(sensorName, key, options.events[key]);\r\n }\r\n }\r\n\r\n console.log('added sensor state: ', sensorState);\r\n }\r\n\r\n return sensorState;\r\n }\r\n\r\n /**\r\n * Gets number of times sensor created\r\n * \r\n * @param {String} sensorName \r\n * @return {Number} sensor creation count\r\n */\r\n _getSensorCreationCount(sensorName){\r\n return (!!this.sensorCreationCounts[sensorName]) ? this.sensorCreationCounts[sensorName] : 0;\r\n }\r\n\r\n /**\r\n * Increment sensor creation count\r\n * \r\n * @param {String} sensorName \r\n * @return {Number} sensor creation count\r\n */\r\n _incSensorCreationCount(sensorName){\r\n if(!Number.isInteger(this.sensorCreationCounts[sensorName])){\r\n this.sensorCreationCounts[sensorName] = 0;\r\n }\r\n\r\n return ++this.sensorCreationCounts[sensorName];\r\n }\r\n\r\n /**\r\n * Data event used when no event to handle sensor data is provided.\r\n * Stringifies data and logs.\r\n * \r\n * @param {String} sensorName \r\n * @return {Function}\r\n */\r\n _getDefaultDataEvent(sensorName){\r\n return (data)=>{\r\n if(data && typeof data === 'object'){\r\n let oldData = data;\r\n let cache = [];\r\n data = JSON.stringify(data, function(key, val){\r\n if(val && typeof val === 'object'){\r\n\r\n //Ignore duplicates\r\n if(cache.indexOf(val) >= 0){\r\n return;\r\n }\r\n\r\n cache.push(val);\r\n }\r\n\r\n return val;\r\n });\r\n cache = null;\r\n }\r\n console.log('sensor: ' + sensorName, String(new Date()), data);\r\n }\r\n }\r\n}\r\n\r\nmodule.exports = SensorHandler;", "static": true, "longname": "C:/d/projects/public/js-sensor/class/sensor-handler.js", "access": "public", "description": null, "lineNumber": 1 }, { "__docId__": 60, "kind": "variable", "name": "BrowserSensorWatcher", "memberof": "class/sensor-handler.js", "static": true, "longname": "class/sensor-handler.js~BrowserSensorWatcher", "access": "public", "export": false, "importPath": "js-sensor/class/sensor-handler.js", "importStyle": null, "description": null, "lineNumber": 1, "undocument": true, "type": { "types": [ "*" ] } }, { "__docId__": 61, "kind": "class", "name": "SensorHandler", "memberof": "class/sensor-handler.js", "static": true, "longname": "class/sensor-handler.js~SensorHandler", "access": "public", "export": false, "importPath": "js-sensor/class/sensor-handler.js", "importStyle": null, "description": "Main class for handling sensors.\nThis class allows get, watch, etc. of sensors.", "lineNumber": 8, "interface": false }, { "__docId__": 62, "kind": "constructor", "name": "constructor", "memberof": "class/sensor-handler.js~SensorHandler", "generator": false, "async": false, "static": false, "longname": "class/sensor-handler.js~SensorHandler#constructor", "access": "public", "description": null, "lineNumber": 10, "undocument": true }, { "__docId__": 63, "kind": "member", "name": "sensors", "memberof": "class/sensor-handler.js~SensorHandler", "static": false, "longname": "class/sensor-handler.js~SensorHandler#sensors", "access": "public", "description": null, "lineNumber": 18, "undocument": true, "type": { "types": [ "{}" ] } }, { "__docId__": 64, "kind": "member", "name": "sensorCreationCounts", "memberof": "class/sensor-handler.js~SensorHandler", "static": false, "longname": "class/sensor-handler.js~SensorHandler#sensorCreationCounts", "access": "public", "description": null, "lineNumber": 23, "undocument": true, "type": { "types": [ "{}" ] } }, { "__docId__": 65, "kind": "method", "name": "get", "memberof": "class/sensor-handler.js~SensorHandler", "generator": false, "async": false, "static": false, "longname": "class/sensor-handler.js~SensorHandler#get", "access": "public", "description": "Get sensor once. Should stop watching sensor if newly made.", "lineNumber": 33, "params": [ { "nullable": null, "types": [ "string" ], "spread": false, "optional": false, "name": "sensorName", "description": "" } ], "return": { "types": [ "*" ] } }, { "__docId__": 66, "kind": "method", "name": "watch", "memberof": "class/sensor-handler.js~SensorHandler", "generator": false, "async": false, "static": false, "longname": "class/sensor-handler.js~SensorHandler#watch", "access": "public", "description": "Watch sensor from RawSensorWatcher. Ignores duplicates.\noptions: {\n events: {\n data: function(data){}\n }\n}", "lineNumber": 70, "params": [ { "nullable": null, "types": [ "string" ], "spread": false, "optional": false, "name": "sensorName", "description": "" }, { "nullable": null, "types": [ "object" ], "spread": false, "optional": false, "name": "options", "description": "optional options" } ], "return": { "nullable": null, "types": [ "promise" ], "spread": false, "description": "promise resolving SensorState" } }, { "__docId__": 67, "kind": "method", "name": "watchAll", "memberof": "class/sensor-handler.js~SensorHandler", "generator": false, "async": false, "static": false, "longname": "class/sensor-handler.js~SensorHandler#watchAll", "access": "public", "description": "Watches all available sensors.", "lineNumber": 110, "return": { "nullable": null, "types": [ "promise" ], "spread": false, "description": "Resolves array of SensorStates. However allows for failing returning null." }, "params": [] }, { "__docId__": 68, "