@theopenweb/js-sensor
Version:
JavaScript sensor library for native input sensors.
950 lines • 72.7 kB
JSON
[
{
"__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,
"