@quintessential/health-hid
Advanced tools
Comparing version 0.0.2 to 0.0.3
@@ -9,3 +9,3 @@ declare module '@quintessential/health-hid/devices/MicrolifeBPM' { | ||
pulse: number; | ||
}[]>, clearData: (dev: Device, silent?: boolean) => Promise<void>, getUserSlotInfo: (dev: Device, silent?: boolean) => Promise<{ | ||
}[]>, clearData: (dev: Device, silent?: boolean) => Promise<void>, setDateTime: (dev: Device, date: Date, silent?: boolean) => Promise<unknown>, getUserSlotInfo: (dev: Device, silent?: boolean) => Promise<{ | ||
totalSlots: number; | ||
@@ -37,3 +37,3 @@ currentSlot: number; | ||
}>; | ||
export const getDeviceHumanName: (dev: MapValueType<typeof supportedDevices>) => SupportedDevice; | ||
export const getDeviceHumanName: (dev: MapValueType<typeof supportedDevices>) => "Microlife BPM"; | ||
export class Device { | ||
@@ -80,3 +80,3 @@ private readonly device; | ||
}; | ||
export type SupportedDevice = 'Microlife BPM' | 'Microlife GlucoTeq'; | ||
export type SupportedDevice = 'Microlife BPM'; | ||
@@ -83,0 +83,0 @@ } |
@@ -1,3 +0,3 @@ | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.HealthHid=t():e.HealthHid=t()}(self,function(){return function(){var e={140:function(e,t,r){"use strict";r.r(t),r.d(t,{MicrolifeBPM:function(){return n}});var n,o=r("717");!function(e){let t=e=>{if(e.length>7)throw Error("Maximum write byte length (7) exceeded!");return new Uint8Array([e.length,...e])},r=(e,t)=>{let r=t.slice(1,(15&t[0])+1);console.log(`Read (BPM Chunk): ${(0,o.arrDecToHex)(r)}`),e(r)},n=(e,t)=>{if(t.length<=3||6!=t[0])throw e.clearOngoingRequest(),Error("Unexpected response");let r=t.slice(1,t.length-2).reduce((e,t)=>e+t,0)%256,n=r.toString(16).padStart(2,"0").toUpperCase(),o=t.slice(-2).map(e=>String.fromCharCode(e)).join("");if(n!==o)throw Error(`Checksum mismatch: computed ${n}, expected ${o}.`);return t.slice(1,-2)},i={getUserId:async(e,n)=>{let o=t([18,22,24,36]);return new Promise(async(t,i)=>await e.sendReport(0,o,r,s.getUserId,t,i,n))},setUserId:async(e,n,o=!1,i)=>{if(n.length>11)throw Error("Max ID length (11) exceeded!");if(!/^[0-9a-zA-Z]+$/.test(n))throw Error("IDs can't contain non-alphanumeric chars!");let a=t([18,22,24,35]);return new Promise(async(t,c)=>await e.sendReport(0,a,r,(...e)=>s.setUserId(...e,{userId:n,clearMemory:o}),t,c,i))},getDeviceInfo:async(e,t)=>{},getData:async(e,n)=>{let o=t([18,22,24,34]);return new Promise(async(t,i)=>await e.sendReport(0,o,r,s.getData,t,i,n))},clearData:async(e,t)=>{let r=await i.getUserId(e,!0);await i.setUserId(e,r,!0,!0)},getDeviceTime:async(e,t)=>{},setDeviceTime:async(e,t,r)=>{},getDeviceSerial:async(e,t)=>{},getDeviceStatus:async(e,t)=>{},getUserSlotInfo:async(e,n)=>{let o=t([18,22,24,40]);return new Promise(async(t,i)=>await e.sendReport(0,o,r,s.getUserSlotInfo,t,i,n))}},s={getUserId:async(e,t,r)=>{t=n(e,t),console.log(`Read: ${(0,o.arrDecToHex)(t)}`),t=(t=t.slice(0,-8)).slice(0,22);let i=(e=>{let t="";for(let r=0;r<e.length;r+=2){let n="";if(51===e[r])n=String.fromCodePoint(e[r+1]);else if(52===e[r]){let t=parseInt(String.fromCharCode(e[r+1]),16)-1;n=String.fromCharCode(65+t)}else if(54===e[r]){let t=parseInt(String.fromCharCode(e[r+1]),16)-1;n=String.fromCharCode(97+t)}else break;!(n<" ")&&!(n>"~")&&/^[0-9a-zA-Z]+$/.test(n)&&(t+=n)}return t})(t);return e.strOut(i,r),i},setUserId:async(e,r,n,i)=>{if(1!==r.length||6!==r[0])throw e.clearOngoingRequest(),Error(`Invalid setUserId() response: ${r}`);let{userId:s,clearMemory:a}=i,c=(e=>{let t=Array(22).fill(0);for(let r=0;r<2*e.length;r+=2){let n=e[r/2];if(/^[0-9]+$/.test(n)){let e=parseInt(n,10);t[r]=51,t[r+1]=48+e}else if(/^[A-Z]+$/.test(n)){let e=n.codePointAt(0)-65;t[r]=52,t[r+1]=48+e+1}else if(/^[a-z]+$/.test(n)){let e=n.codePointAt(0)-97;t[r]=54,t[r+1]=48+e+1}}return t})(s),u=[...a?[48,48,48,48,255,255,255,255]:[255,255,255,255,255,255,255,255],...c];for(u=[...u,0,0,0,0],console.log(`Write: ${(0,o.arrDecToHex)(u)}`);u.length;){let r=u.slice(0,7);console.log(`Write (Chunk): ${(0,o.arrDecToHex)(r)}`),await e.raw.sendReport(0,t(r)),u=u.slice(r.length)}},getDeviceInfo:async(e,t,r)=>{},getData:async(e,t,r)=>{t=n(e,t);let o=(e=>{let t=e.slice(0,4),r=t.map(e=>String.fromCharCode(e)).join("");return parseInt(r,10)})(t),i=[];for(let e=32;e<32+32*o;e+=32){let r;let n=t.slice(e,e+32);try{let[e,t,o,i,s,a,c,u,l,g]=n.slice(0,10).map(e=>String.fromCodePoint(e));r=new Date(`20${e}${t}-${o}${i}-${s}${a}T${c}${u}:${l}${g}`)}catch{continue}let o=n.slice(17,24).map(e=>String.fromCharCode(e)),s=parseInt("0x"+o.slice(0,2).join(""),16),[a,c,u]=[parseInt(o[2],16),parseInt(o[3],16),parseInt(o[4],16)],l=64*a+4*c+u/4,g=parseInt("0x"+o.slice(5,7).join(""),16);i=i.concat({date:r.toISOString(),systolicPressure:g,diastolicPressure:l,pulse:s})}console.log("Pressure Data: ",i);let s=i.map(e=>`${e.date}: sys=${e.systolicPressure}, dia=${e.diastolicPressure}, pulse=${e.pulse}`).join("\n");return e.strOut(s,r),i},getDeviceTime:async(e,t,r)=>{},setDeviceTime:async(e,t,r)=>{},getDeviceSerial:async(e,t,r)=>{},getDeviceStatus:async(e,t,r)=>{},getUserSlotInfo:async(e,t,r)=>{t=n(e,t),console.log(`Read: ${(0,o.arrDecToHex)(t)}`);let i=parseInt(String.fromCharCode(t[4]),10),s=parseInt(String.fromCharCode(t[5]),10);return e.strOut(`Total User Slots: ${i} | ||
Current User Slot: ${s}`,r),{totalSlots:i,currentSlot:s}}};({getUserId:e.getUserId,setUserId:e.setUserId,getData:e.getData,clearData:e.clearData,getUserSlotInfo:e.getUserSlotInfo}=i)}(n||(n={}))},670:function(e,t,r){"use strict";r.r(t);var n=r("140");r.es(n,t)},936:function(e,t,r){"use strict";r.r(t),r.d(t,{Device:function(){return s}});var n=r("717");let o=new Map([["Microlife BPM",{vendorId:1204,productId:21760}],["Microlife GlucoTeq",{vendorId:1241,productId:46436}]]),i=e=>Array.from(o.entries()).find(t=>t[1].vendorId===e.vendorId&&t[1].productId===e.productId)[0];class s{device;ongoingRequest;_strOut;constructor(e){this.device=e,this.device.oninputreport=async e=>{if(!this.ongoingRequest)return;clearTimeout(this.ongoingRequest.onRetryTimeout),!this.ongoingRequest.readData&&(this.ongoingRequest.readData=[]);let t=new Uint8Array(e.data.buffer);try{console.log("Read (Chunk): ",(0,n.arrDecToHex)(t)),this.ongoingRequest.isReading=!0,clearTimeout(this.ongoingRequest.onEndTimeout),this.ongoingRequest.onEndTimeout=window.setTimeout(async()=>{if(!this.ongoingRequest)return;this.ongoingRequest.isReading=!1;let e=this.ongoingRequest.readData,t=this.ongoingRequest.resHandler,r=this.ongoingRequest.resolve,n=this.ongoingRequest.reject,o=this.ongoingRequest.silent;this.clearOngoingRequest();try{let n=await t(this,e,o);r(n)}catch(e){n(e)}},100),this.ongoingRequest.readDataChunk(e=>this.ongoingRequest.readData=[...this.ongoingRequest.readData,...e],t)}catch{await this.ongoingRequest.retry()}},this._strOut=e=>{console.log(e)},console.log(`Opened device: ${i(e)}`)}static requestDevice=async e=>{let t=[];e&&e.forEach(e=>{let r=o.get(e);if(!r)throw Error(`Invalid device filter. Unsupported device: ${e}`);t.push(r)});let r=await navigator.hid.requestDevice({filters:t});if(r.length<1)return;let n=r[0];return await n.close(),await n.open(),new s(n)};get raw(){return this.device}strOut=(e,t=!1)=>{!t&&this._strOut(e)};setStrOut=e=>{this._strOut=e};closeDevice=async()=>{await this.device.close()};sendFeatureReport=async(e,t)=>this.device.sendFeatureReport(e,t);receiveFeatureReport=async e=>{let t=await this.device.receiveFeatureReport(e),r=new Uint8Array(t.buffer);return r};sendReport=async(e,t,r,o,i,s,a=!1)=>{if(!this.device){window.alert("No device selected...");return}this.ongoingRequest&&this.clearOngoingRequest(),this.ongoingRequest={isReading:!1,retriesLeft:15,readDataChunk:r,readData:[],resHandler:o,retry:async()=>{},resolve:i,reject:s,silent:a},console.log(`Write: ${(0,n.arrDecToHex)(t)}`);let c=async()=>{this.ongoingRequest&&(this.ongoingRequest.retriesLeft-- >0?await this.device.sendReport(e,t).then(()=>{this.ongoingRequest&&(this.ongoingRequest.onRetryTimeout=window.setTimeout(()=>{c()},100))}).catch(e=>console.error(e)):this.clearOngoingRequest())};this.ongoingRequest.retry=c,await c()};clearOngoingRequest=()=>{this.ongoingRequest&&(this.ongoingRequest.onRetryTimeout&&clearTimeout(this.ongoingRequest.onRetryTimeout),this.ongoingRequest.onEndTimeout&&clearTimeout(this.ongoingRequest.onEndTimeout)),this.ongoingRequest=void 0}}},458:function(e,t,r){"use strict";r.r(t);var n=r("936");r.es(n,t)},823:function(e,t,r){"use strict";r.r(t),r.d(t,{Device:function(){return n.Device},MicrolifeBPM:function(){return o.MicrolifeBPM}});var n=r("458"),o=r("670")},717:function(e,t,r){"use strict";r.r(t);var n=r("150");r.es(n,t)},150:function(e,t,r){"use strict";r.r(t),r.d(t,{arrDecToHex:function(){return o}});let n=e=>`0x${e.toString(16).padStart(2,"0")}`,o=e=>{let t=[];return e.forEach(e=>t.push(n(e))),t}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}return r.es=function(e,t){return Object.keys(e).forEach(function(r){"default"!==r&&!Object.prototype.hasOwnProperty.call(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),e},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r("823")}()}); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.HealthHid=t():e.HealthHid=t()}(self,function(){return function(){var e={140:function(e,t,r){"use strict";r.r(t),r.d(t,{MicrolifeBPM:function(){return n}});var n,o=r("717");!function(e){let t=e=>{if(e.length>7)throw Error("Maximum write byte length (7) exceeded!");return new Uint8Array([e.length,...e])},r=(e,t)=>{let r=t.slice(1,(15&t[0])+1);console.log(`Read (BPM Chunk): ${(0,o.arrDecToHex)(r)}`),e(r)},n=(e,t)=>{if(t.length<=3||6!=t[0])throw e.clearOngoingRequest(),Error("Unexpected response");let r=t.slice(1,t.length-2).reduce((e,t)=>e+t,0)%256,n=r.toString(16).padStart(2,"0").toUpperCase(),o=t.slice(-2).map(e=>String.fromCharCode(e)).join("");if(n!==o)throw Error(`Checksum mismatch: computed ${n}, expected ${o}.`);return t.slice(1,-2)},i=e=>48+e,s=e=>Array.from(e).map(e=>i(parseInt(e,10))),a={getUserId:async(e,n)=>{let o=t([18,22,24,36]);return new Promise(async(t,i)=>await e.sendReport(0,o,r,c.getUserId,t,i,n))},setUserId:async(e,n,o=!1,i)=>{if(n.length>11)throw Error("Max ID length (11) exceeded!");if(!/^[0-9a-zA-Z]+$/.test(n))throw Error("IDs can't contain non-alphanumeric chars!");let s=t([18,22,24,35]);return new Promise(async(t,a)=>await e.sendReport(0,s,r,(...e)=>c.setUserId(...e,{userId:n,clearMemory:o}),t,a,i))},getDeviceInfo:async(e,t)=>{},getData:async(e,n)=>{let o=t([18,22,24,34]);return new Promise(async(t,i)=>await e.sendReport(0,o,r,c.getData,t,i,n))},clearData:async(e,t)=>{let r=await a.getUserId(e,!0);await a.setUserId(e,r,!0,!0)},getDateTime:async(e,t)=>{},setDateTime:async(e,n,o)=>{let i=t([18,22,24,39]);return new Promise(async(t,s)=>await e.sendReport(0,i,r,(...e)=>c.setDateTime(...e,{date:n}),t,s,o))},getDeviceSerial:async(e,t)=>{},getDeviceStatus:async(e,t)=>{},getUserSlotInfo:async(e,n)=>{let o=t([18,22,24,40]);return new Promise(async(t,i)=>await e.sendReport(0,o,r,c.getUserSlotInfo,t,i,n))}},c={getUserId:async(e,t,r)=>{t=n(e,t),console.log(`Read: ${(0,o.arrDecToHex)(t)}`),t=(t=t.slice(0,-8)).slice(0,22);let i=(e=>{let t="";for(let r=0;r<e.length;r+=2){let n="";if(51===e[r])n=String.fromCodePoint(e[r+1]);else if(52===e[r]){let t=parseInt(String.fromCharCode(e[r+1]),16)-1;n=String.fromCharCode(65+t)}else if(54===e[r]){let t=parseInt(String.fromCharCode(e[r+1]),16)-1;n=String.fromCharCode(97+t)}else break;!(n<" ")&&!(n>"~")&&/^[0-9a-zA-Z]+$/.test(n)&&(t+=n)}return t})(t);return e.strOut(i,r),i},setUserId:async(e,r,n,s)=>{if(1!==r.length||6!==r[0])throw e.clearOngoingRequest(),Error(`Invalid setUserId() response: ${r}`);let{userId:a,clearMemory:c}=s,l=(e=>{let t=Array(22).fill(0);for(let r=0;r<2*e.length;r+=2){let n=e[r/2];if(/^[0-9]+$/.test(n)){let e=parseInt(n,16);t[r]=51,t[r+1]=i(e)}else if(/^[A-Z]+$/.test(n)){let e=n.codePointAt(0)-65;t[r]=52,t[r+1]=i(e+1)}else if(/^[a-z]+$/.test(n)){let e=n.codePointAt(0)-97;t[r]=54,t[r+1]=i(e+1)}}return t})(a),u=[...c?[48,48,48,48,255,255,255,255]:[255,255,255,255,255,255,255,255],...l];for(u=[...u,0,0,0,0],console.log(`Write: ${(0,o.arrDecToHex)(u)}`);u.length;){let r=u.slice(0,7);console.log(`Write (Chunk): ${(0,o.arrDecToHex)(r)}`),await e.raw.sendReport(0,t(r)),u=u.slice(r.length)}},getDeviceInfo:async(e,t,r)=>{},getData:async(e,t,r)=>{t=n(e,t);let o=(e=>{let t=e.slice(0,4),r=t.map(e=>String.fromCharCode(e)).join("");return parseInt(r,16)})(t),i=[];for(let e=32;e<32+32*o;e+=32){let r;let n=t.slice(e,e+32);try{let[e,t,o,i,s,a,c,l,u,g]=n.slice(0,10).map(e=>String.fromCodePoint(e));if(r=new Date(`20${e}${t}-${o}${i}-${s}${a}T${c}${l}:${u}${g}`),isNaN(r.getTime()))continue}catch{continue}let o=n.slice(17,24).map(e=>String.fromCharCode(e)),s=parseInt("0x"+o.slice(0,2).join(""),16),[a,c,l]=[parseInt(o[2],16),parseInt(o[3],16),parseInt(o[4],16)],u=64*a+4*c+l/4,g=parseInt("0x"+o.slice(5,7).join(""),16);i=i.concat({date:r.toISOString(),systolicPressure:g,diastolicPressure:u,pulse:s})}console.log("Pressure Data: ",i);let s=i.map(e=>`${e.date}: sys=${e.systolicPressure}, dia=${e.diastolicPressure}, pulse=${e.pulse}`).join("\n");return e.strOut(s,r),i},getDateTime:async(e,t,r)=>{},setDateTime:async(e,r,n,i)=>{if(1!==r.length||6!==r[0])throw e.clearOngoingRequest(),Error(`Invalid setDateTime() response: ${r}`);let{date:a}=i,c=(e=>{let t=s((e.getMonth()+1).toString().padStart(2,"0")),r=s(e.getDate().toString().padStart(2,"0")),n=s((e.getFullYear()%100).toString().padStart(2,"0")),o=s(e.getHours().toString().padStart(2,"0")),i=s(e.getMinutes().toString().padStart(2,"0")),a=s(e.getSeconds().toString().padStart(2,"0"));return[...t,...r,...n,50,48,...o,...i,...a]})(a),l=[...c,0,0];for(console.log(`Write: ${(0,o.arrDecToHex)(l)}`);l.length;){let r=l.slice(0,7);console.log(`Write (Chunk): ${(0,o.arrDecToHex)(r)}`),await e.raw.sendReport(0,t(r)),l=l.slice(r.length)}},getDeviceSerial:async(e,t,r)=>{},getDeviceStatus:async(e,t,r)=>{},getUserSlotInfo:async(e,t,r)=>{t=n(e,t),console.log(`Read: ${(0,o.arrDecToHex)(t)}`);let i=parseInt(String.fromCharCode(t[4]),16),s=parseInt(String.fromCharCode(t[5]),16);return e.strOut(`Total User Slots: ${i} | ||
Current User Slot: ${s}`,r),{totalSlots:i,currentSlot:s}}};({getUserId:e.getUserId,setUserId:e.setUserId,getData:e.getData,clearData:e.clearData,setDateTime:e.setDateTime,getUserSlotInfo:e.getUserSlotInfo}=a)}(n||(n={}))},670:function(e,t,r){"use strict";r.r(t);var n=r("140");r.es(n,t)},936:function(e,t,r){"use strict";r.r(t),r.d(t,{Device:function(){return s}});var n=r("717");let o=new Map([["Microlife BPM",{vendorId:1204,productId:21760}]]),i=e=>Array.from(o.entries()).find(t=>t[1].vendorId===e.vendorId&&t[1].productId===e.productId)[0];class s{device;ongoingRequest;_strOut;constructor(e){this.device=e,this.device.oninputreport=async e=>{if(!this.ongoingRequest)return;clearTimeout(this.ongoingRequest.onRetryTimeout),!this.ongoingRequest.readData&&(this.ongoingRequest.readData=[]);let t=new Uint8Array(e.data.buffer);try{console.log("Read (Chunk): ",(0,n.arrDecToHex)(t)),this.ongoingRequest.isReading=!0,clearTimeout(this.ongoingRequest.onEndTimeout),this.ongoingRequest.onEndTimeout=window.setTimeout(async()=>{if(!this.ongoingRequest)return;this.ongoingRequest.isReading=!1;let e=this.ongoingRequest.readData,t=this.ongoingRequest.resHandler,r=this.ongoingRequest.resolve,n=this.ongoingRequest.reject,o=this.ongoingRequest.silent;this.clearOngoingRequest();try{let n=await t(this,e,o);r(n)}catch(e){n(e)}},100),this.ongoingRequest.readDataChunk(e=>this.ongoingRequest.readData=[...this.ongoingRequest.readData,...e],t)}catch{await this.ongoingRequest.retry()}},this._strOut=e=>{console.log(e)},console.log(`Opened device: ${i(e)}`)}static requestDevice=async e=>{let t=[];e&&e.forEach(e=>{let r=o.get(e);if(!r)throw Error(`Invalid device filter. Unsupported device: ${e}`);t.push(r)});let r=await navigator.hid.requestDevice({filters:t});if(r.length<1)return;let n=r[0];return await n.close(),await n.open(),new s(n)};get raw(){return this.device}strOut=(e,t=!1)=>{!t&&this._strOut(e)};setStrOut=e=>{this._strOut=e};closeDevice=async()=>{await this.device.close()};sendFeatureReport=async(e,t)=>this.device.sendFeatureReport(e,t);receiveFeatureReport=async e=>{let t=await this.device.receiveFeatureReport(e),r=new Uint8Array(t.buffer);return r};sendReport=async(e,t,r,o,i,s,a=!1)=>{if(!this.device){window.alert("No device selected...");return}this.ongoingRequest&&this.clearOngoingRequest(),this.ongoingRequest={isReading:!1,retriesLeft:15,readDataChunk:r,readData:[],resHandler:o,retry:async()=>{},resolve:i,reject:s,silent:a},console.log(`Write: ${(0,n.arrDecToHex)(t)}`);let c=async()=>{this.ongoingRequest&&(this.ongoingRequest.retriesLeft-- >0?await this.device.sendReport(e,t).then(()=>{this.ongoingRequest&&(this.ongoingRequest.onRetryTimeout=window.setTimeout(()=>{c()},100))}).catch(e=>console.error(e)):this.clearOngoingRequest())};this.ongoingRequest.retry=c,await c()};clearOngoingRequest=()=>{this.ongoingRequest&&(this.ongoingRequest.onRetryTimeout&&clearTimeout(this.ongoingRequest.onRetryTimeout),this.ongoingRequest.onEndTimeout&&clearTimeout(this.ongoingRequest.onEndTimeout)),this.ongoingRequest=void 0}}},458:function(e,t,r){"use strict";r.r(t);var n=r("936");r.es(n,t)},823:function(e,t,r){"use strict";r.r(t),r.d(t,{Device:function(){return n.Device},MicrolifeBPM:function(){return o.MicrolifeBPM}});var n=r("458"),o=r("670")},717:function(e,t,r){"use strict";r.r(t);var n=r("150");r.es(n,t)},150:function(e,t,r){"use strict";r.r(t),r.d(t,{arrDecToHex:function(){return o}});let n=e=>`0x${e.toString(16).padStart(2,"0")}`,o=e=>{let t=[];return e.forEach(e=>t.push(n(e))),t}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}return r.es=function(e,t){return Object.keys(e).forEach(function(r){"default"!==r&&!Object.prototype.hasOwnProperty.call(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),e},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r("823")}()}); | ||
//# sourceMappingURL=health-hid.js.map |
{ | ||
"name": "@quintessential/health-hid", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"description": "A library for interacting with medical devices over WebHID.", | ||
@@ -5,0 +5,0 @@ "author": "Quintessential SFT", |
@@ -26,3 +26,6 @@ <h1 align="center">HealthHID</h1> | ||
``` bash | ||
npm run serve | ||
git clone git@github.com:Quintessential-SFT/HealthHID.git | ||
cd HealthHID | ||
npm ci | ||
npm run dev | ||
@@ -29,0 +32,0 @@ # Navigate to http://localhost:8080 |
Sorry, the diff of this file is not supported yet
50254
132
42
6