@neurosity/sdk 6.5.0 → 6.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -161,7 +161,11 @@ class Neurosity {
161
161
  osHasBluetoothSupport: this._osHasBluetoothSupport()
162
162
  }).pipe((0, operators_1.switchMap)(({ selectedDevice, osHasBluetoothSupport }) => {
163
163
  if (!selectedDevice) {
164
- return rxjs_2.EMPTY;
164
+ return (0, rxjs_1.of)({
165
+ connected: false,
166
+ streamingMode,
167
+ activeMode: streaming_1.STREAMING_TYPE.WIFI
168
+ });
165
169
  }
166
170
  const isUnableToUseBluetooth = this.isMissingBluetoothTransport || !osHasBluetoothSupport;
167
171
  if (isUnableToUseBluetooth) {
@@ -10,10 +10,11 @@ const operators_2 = require("rxjs/operators");
10
10
  const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
11
11
  const status_1 = require("../types/status");
12
12
  const HEARTBEAT_UPDATE_INTERVAL = 30000; // 30 seconds - set by the OS
13
- const LOST_HEARTBEAT_AFTER = HEARTBEAT_UPDATE_INTERVAL * 2.5; // 75 seconds
13
+ const LOST_LOCAL_HEARTBEAT_AFTER = HEARTBEAT_UPDATE_INTERVAL * 2.5; // 75 seconds
14
+ const LOST_REMOTE_HEARTBEAT_AFTER = 8.64e7; // 24 hours
14
15
  function heartbeatAwareStatus(status$) {
15
16
  const lastLocalHeartbeat$ = status$.pipe((0, operators_1.map)(({ lastHeartbeat }) => lastHeartbeat), (0, operators_2.distinctUntilChanged)(), (0, operators_1.map)(() => Date.now()));
16
- const lostHeartbeat$ = lastLocalHeartbeat$.pipe((0, operators_1.switchMap)(() => (0, rxjs_1.timer)(LOST_HEARTBEAT_AFTER)), (0, operators_1.map)(() => null), (0, operators_1.startWith)(null));
17
+ const lostHeartbeat$ = lastLocalHeartbeat$.pipe((0, operators_1.switchMap)(() => (0, rxjs_1.timer)(LOST_LOCAL_HEARTBEAT_AFTER)), (0, operators_1.map)(() => null), (0, operators_1.startWith)(null));
17
18
  return (0, rxjs_1.combineLatest)({
18
19
  status: status$,
19
20
  lostHeartbeat: lostHeartbeat$ // @important - do not remove, adeed for state synchronization, value not used
@@ -35,7 +36,16 @@ function deviceHasLostHeartbeat(status, lastLocalHeartbeat) {
35
36
  // implementation that used the server timestamp had bug where SDK clients
36
37
  // running on hardware with drifted/out-of-sync clocks (cough cough Android)
37
38
  // would override the state to offline when the heartbeat was active.
38
- const lostHeartbeat = Date.now() - lastLocalHeartbeat > LOST_HEARTBEAT_AFTER;
39
- return lostHeartbeat;
39
+ const lostLocalHeartbeat = Date.now() - lastLocalHeartbeat > LOST_LOCAL_HEARTBEAT_AFTER;
40
+ if (lostLocalHeartbeat) {
41
+ return true;
42
+ }
43
+ // Addresses devices with wrongful "online" state. This rarely happens, the
44
+ // OS would have to crash without updating the state to "offline".
45
+ const lostRemoteHeartbeat = Date.now() - status.lastHeartbeat > LOST_REMOTE_HEARTBEAT_AFTER;
46
+ if (lostRemoteHeartbeat) {
47
+ return true;
48
+ }
49
+ return false;
40
50
  }
41
51
  exports.deviceHasLostHeartbeat = deviceHasLostHeartbeat;
@@ -21,7 +21,7 @@ process.env.HMR_PORT=0;process.env.HMR_HOSTNAME="localhost";parcelRequire=functi
21
21
  },{}],"Ttuy":[function(require,module,exports) {
22
22
  "use strict";var t,e;Object.defineProperty(exports,"__esModule",{value:!0}),exports.SLEEP_MODE_REASON=exports.STATUS=void 0,function(t){t.ONLINE="online",t.OFFLINE="offline",t.UPDATING="updating",t.BOOTING="booting",t.SHUTTING_OFF="shuttingOff"}(t=exports.STATUS||(exports.STATUS={})),function(t){t.UPDATING="updating",t.CHARGING="charging"}(e=exports.SLEEP_MODE_REASON||(exports.SLEEP_MODE_REASON={}));
23
23
  },{}],"ImaE":[function(require,module,exports) {
24
- "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.deviceHasLostHeartbeat=exports.heartbeatAwareStatus=void 0;const e=require("rxjs"),r=require("rxjs/operators"),a=require("rxjs/operators"),s=t(require("fast-deep-equal")),i=require("../types/status"),n=3e4,u=75e3;function o(t){const n=t.pipe((0,r.map)(({lastHeartbeat:t})=>t),(0,a.distinctUntilChanged)(),(0,r.map)(()=>Date.now())),o=n.pipe((0,r.switchMap)(()=>(0,e.timer)(u)),(0,r.map)(()=>null),(0,r.startWith)(null));return(0,e.combineLatest)({status:t,lostHeartbeat:o}).pipe((0,a.withLatestFrom)(n),(0,r.map)(([{status:t},e])=>{if(!e)return t;return p(t,e)?Object.assign(Object.assign({},t),{state:i.STATUS.OFFLINE}):t}),(0,a.distinctUntilChanged)((t,e)=>(0,s.default)(t,e)))}function p(t,e){if(!("lastHeartbeat"in t))return!1;return Date.now()-e>u}exports.heartbeatAwareStatus=o,exports.deviceHasLostHeartbeat=p;
24
+ "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.deviceHasLostHeartbeat=exports.heartbeatAwareStatus=void 0;const e=require("rxjs"),a=require("rxjs/operators"),r=require("rxjs/operators"),s=t(require("fast-deep-equal")),i=require("../types/status"),n=3e4,u=75e3,o=864e5;function p(t){const n=t.pipe((0,a.map)(({lastHeartbeat:t})=>t),(0,r.distinctUntilChanged)(),(0,a.map)(()=>Date.now())),o=n.pipe((0,a.switchMap)(()=>(0,e.timer)(u)),(0,a.map)(()=>null),(0,a.startWith)(null));return(0,e.combineLatest)({status:t,lostHeartbeat:o}).pipe((0,r.withLatestFrom)(n),(0,a.map)(([{status:t},e])=>{if(!e)return t;return l(t,e)?Object.assign(Object.assign({},t),{state:i.STATUS.OFFLINE}):t}),(0,r.distinctUntilChanged)((t,e)=>(0,s.default)(t,e)))}function l(t,e){if(!("lastHeartbeat"in t))return!1;return Date.now()-e>u||!!(Date.now()-t.lastHeartbeat>o)}exports.heartbeatAwareStatus=p,exports.deviceHasLostHeartbeat=l;
25
25
  },{"../types/status":"Ttuy"}],"qny3":[function(require,module,exports) {
26
26
  "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.filterInternalKeys=void 0;const e=require("rxjs"),r=require("rxjs/operators");function t(){return(0,e.pipe)((0,r.map)(e=>{if(!e)return e;return Object.entries(e).reduce((e,[r,t])=>(r.startsWith("__")||(e[r]=t),e),{})}))}exports.filterInternalKeys=t;
27
27
  },{}],"LXvB":[function(require,module,exports) {
@@ -81,7 +81,7 @@ process.env.HMR_PORT=0;process.env.HMR_HOSTNAME="localhost";parcelRequire=functi
81
81
  },{}],"TICO":[function(require,module,exports) {
82
82
  "use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&("get"in i?t.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,i)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var o in t)"default"===o||Object.prototype.hasOwnProperty.call(r,o)||e(r,t,o)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("./BluetoothClient"),exports),t(require("./web/WebBluetoothTransport"),exports),t(require("./react-native/ReactNativeTransport"),exports),t(require("./utils/osHasBluetoothSupport"),exports),t(require("./types/index"),exports);
83
83
  },{"./BluetoothClient":"fihV","./web/WebBluetoothTransport":"ouKb","./react-native/ReactNativeTransport":"FtS5","./utils/osHasBluetoothSupport":"rH2Y","./types/index":"iwtf"}],"BZP9":[function(require,module,exports) {
84
- "use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,i,o){void 0===o&&(o=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&("get"in s?t.__esModule:!s.writable&&!s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,o,s)}:function(e,t,i,o){void 0===o&&(o=i),e[o]=t[i]}),t=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(null!=i)for(var s in i)"default"!==s&&Object.prototype.hasOwnProperty.call(i,s)&&e(o,i,s);return t(o,i),o},o=this&&this.__awaiter||function(e,t,i,o){return new(i||(i=Promise))(function(s,r){function n(e){try{u(o.next(e))}catch(t){r(t)}}function c(e){try{u(o.throw(e))}catch(t){r(t)}}function u(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(n,c)}u((o=o.apply(e,t||[])).next())})},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Notion=exports.Neurosity=void 0;const r=require("rxjs"),n=require("rxjs"),c=require("rxjs/operators"),u=require("rxjs/operators"),l=s(require("fast-deep-equal")),a=require("./api/index"),d=require("./api/index"),h=require("./types/streaming"),m=require("./utils/subscription"),p=require("./types/status"),C=i(require("./utils/errors")),v=i(require("./utils/platform")),g=i(require("./utils/hapticEffects")),f=require("./utils/oauth"),S=require("./utils/oauth"),O=require("./api/https/createOAuthURL"),b=require("./api/https/getOAuthToken"),M=require("./utils/is-node"),_=require("./utils/metrics"),E=require("./api/bluetooth"),T=require("./api/bluetooth/types"),A={timesync:!1,autoSelectDevice:!0,streamingMode:h.STREAMING_MODE.WIFI_ONLY,emulator:!1,emulatorHost:"localhost",emulatorAuthPort:9099,emulatorDatabasePort:9e3,emulatorFunctionsPort:5001,emulatorFirestorePort:8080,emulatorOptions:{}};class D{constructor(e={}){this.streamingMode$=new n.ReplaySubject(1);const{streamingMode:t,bluetoothTransport:i}=e;this.options=Object.freeze(Object.assign(Object.assign({},A),e)),this.cloudClient=new a.CloudClient(this.options),i&&(this.bluetoothClient=new E.BluetoothClient({selectedDevice$:this.onDeviceChange(),osHasBluetoothSupport$:this._osHasBluetoothSupport(),createBluetoothToken:this.createBluetoothToken.bind(this),transport:i})),this._initStreamingMode(t,!!i)}_initStreamingMode(e,t){const i=[h.STREAMING_MODE.BLUETOOTH_WITH_WIFI_FALLBACK,h.STREAMING_MODE.WIFI_WITH_BLUETOOTH_FALLBACK].includes(e),o=!Object.values(h.STREAMING_MODE).includes(e),s=i&&!t;this.isMissingBluetoothTransport=s,!e||o||s?this.streamingMode$.next(h.STREAMING_MODE.WIFI_ONLY):this.streamingMode$.next(e)}_osHasBluetoothSupport(){return(0,r.combineLatest)({selectedDevice:this.onDeviceChange(),osVersion:this.osVersion().pipe((0,c.startWith)(null))}).pipe((0,c.map)(({selectedDevice:e,osVersion:t})=>(0,E.osHasBluetoothSupport)(e,t)))}streamingState(){const e=e=>[p.STATUS.ONLINE,p.STATUS.UPDATING].includes(e);return this.streamingMode$.pipe((0,c.switchMap)(t=>(0,r.combineLatest)({selectedDevice:this.onDeviceChange(),osHasBluetoothSupport:this._osHasBluetoothSupport()}).pipe((0,c.switchMap)(({selectedDevice:i,osHasBluetoothSupport:o})=>{if(!i)return n.EMPTY;return this.isMissingBluetoothTransport||!o?this.cloudClient.status().pipe((0,c.map)(({state:i})=>({connected:e(i),streamingMode:t,activeMode:h.STREAMING_TYPE.WIFI}))):(0,r.combineLatest)({wifiStatus:this.cloudClient.status(),bluetoothConnection:(null==this?void 0:this.bluetoothClient)?this.bluetoothClient.connection():(0,r.of)(T.BLUETOOTH_CONNECTION.DISCONNECTED)}).pipe((0,c.map)(({wifiStatus:i,bluetoothConnection:o})=>{const s=o===T.BLUETOOTH_CONNECTION.CONNECTED;switch(t){default:case h.STREAMING_MODE.WIFI_ONLY:return{connected:e(i.state),streamingMode:t,activeMode:h.STREAMING_TYPE.WIFI};case h.STREAMING_MODE.WIFI_WITH_BLUETOOTH_FALLBACK:return{connected:e(i.state)||!s?e(i.state):s,streamingMode:t,activeMode:e(i.state)||!s?h.STREAMING_TYPE.WIFI:h.STREAMING_TYPE.BLUETOOTH};case h.STREAMING_MODE.BLUETOOTH_WITH_WIFI_FALLBACK:return{connected:!!s||e(i.state),streamingMode:t,activeMode:s?h.STREAMING_TYPE.BLUETOOTH:h.STREAMING_TYPE.WIFI}}}),(0,u.distinctUntilChanged)((e,t)=>(0,l.default)(e,t)))}))))}_withStreamingModeObservable(e){const{wifi:t,bluetooth:i}=e;return this.streamingState().pipe((0,c.switchMap)(({activeMode:e})=>{switch(e){case h.STREAMING_TYPE.WIFI:return t();case h.STREAMING_TYPE.BLUETOOTH:return i();default:return t()}}))}_withStreamingModePromise(e){return o(this,void 0,void 0,function*(){const{wifi:t,bluetooth:i}=e,{activeMode:o}=yield(0,n.firstValueFrom)(this.streamingState());switch(o){case h.STREAMING_TYPE.WIFI:return yield t();case h.STREAMING_TYPE.BLUETOOTH:return yield i();default:return yield t()}})}get bluetooth(){return null==this?void 0:this.bluetoothClient}_getCloudMetricDependencies(){return{options:this.options,cloudClient:this.cloudClient,onDeviceChange:this.onDeviceChange.bind(this),status:this.status.bind(this)}}login(e){return o(this,void 0,void 0,function*(){return yield this.cloudClient.login(e)})}logout(){return o(this,void 0,void 0,function*(){return yield this.cloudClient.logout()})}__getApp(){return this.cloudClient.__getApp()}onAuthStateChanged(){return this.cloudClient.onAuthStateChanged()}addDevice(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"addDevice");return t?Promise.reject(i):this.cloudClient.addDevice(e)}removeDevice(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"removeDevice");return t?Promise.reject(i):this.cloudClient.removeDevice(e)}transferDevice(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"transferDevice");return t?Promise.reject(i):this.cloudClient.transferDevice(e)}onUserDevicesChange(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"onUserDevicesChange");return e?(0,r.throwError)(()=>t):this.cloudClient.onUserDevicesChange()}onUserClaimsChange(){return this.cloudClient.onUserClaimsChange()}getDevices(){return o(this,void 0,void 0,function*(){return yield this.cloudClient.getDevices()})}selectDevice(e){return o(this,void 0,void 0,function*(){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"selectDevice");return t?Promise.reject(i):yield this.cloudClient.selectDevice(e)})}getSelectedDevice(){return o(this,void 0,void 0,function*(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"getSelectedDevice");return e?Promise.reject(t):yield this.cloudClient.getSelectedDevice()})}getInfo(){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"getInfo");return e?Promise.reject(t):yield this._withStreamingModePromise({wifi:()=>this.cloudClient.getInfo(),bluetooth:()=>this.bluetoothClient.getInfo()})})}onDeviceChange(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"onDeviceChange");return e?(0,r.throwError)(()=>t):this.cloudClient.onDeviceChange()}disconnect(){return o(this,void 0,void 0,function*(){return yield this._withStreamingModePromise({wifi:()=>this.cloudClient.disconnect(),bluetooth:()=>this.bluetoothClient.disconnect()})})}dispatchAction(e){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const[t,i]=(0,S.validateOAuthScopeForAction)(this.cloudClient.userClaims,e);return t?Promise.reject(i):yield this._withStreamingModePromise({wifi:()=>this.cloudClient.dispatchAction(e),bluetooth:()=>this.bluetoothClient.dispatchAction(e)})})}addMarker(e){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;if(!e)throw new Error(`${C.prefix}A label is required for addMarker`);return yield this._withStreamingModePromise({wifi:()=>this.cloudClient.dispatchAction({command:"marker",action:"add",message:{label:e,timestamp:this.cloudClient.timestamp}}),bluetooth:()=>this.bluetoothClient.addMarker(e)})})}haptics(e){var t;return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const i=null===(t=yield this.getSelectedDevice())||void 0===t?void 0:t.modelVersion;if(!v.supportsHaptics(i))return Promise.reject(C.metricNotSupportedByModel("haptics",i));const o=v.getPlatformHapticMotors(i);for(const t in e){if(!Object.keys(o).includes(t))return Promise.reject(C.locationNotFound(t,i));const s=e[t],r=7;if(s.length>r)return Promise.reject(C.exceededMaxItems(r));o[t]=s}const s={command:"haptics",action:"queue",responseRequired:!0,responseTimeout:1e3,message:{effects:o}};return yield this._withStreamingModePromise({wifi:()=>this.cloudClient.dispatchAction(s),bluetooth:()=>this.bluetoothClient.dispatchAction(s)})})}getHapticEffects(){return g}accelerometer(){const e="accelerometer",[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,e);return t?(0,r.throwError)(()=>i):this.onDeviceChange().pipe((0,c.switchMap)(t=>{const i=(null==t?void 0:t.modelVersion)||v.MODEL_VERSION_1;return v.supportsAccel(i)?this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:e,labels:(0,m.getLabels)(e),atomic:!0}),bluetooth:()=>this.bluetoothClient.accelerometer()}):(0,r.throwError)(()=>C.metricNotSupportedByModel(e,i))}))}brainwaves(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"brainwaves");return t?(0,r.throwError)(()=>i):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"brainwaves",labels:e?[e]:[],atomic:!1}),bluetooth:()=>this.bluetoothClient.brainwaves(e)})}calm(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"calm");return e?(0,r.throwError)(()=>t):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"awareness",labels:["calm"],atomic:!1}),bluetooth:()=>this.bluetoothClient.calm()})}signalQuality(){const e="signalQuality",[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,e);return t?(0,r.throwError)(()=>i):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:e,labels:(0,m.getLabels)(e),atomic:!0}),bluetooth:()=>this.bluetoothClient.signalQuality()})}settings(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"settings");return e?(0,r.throwError)(()=>t):this.cloudClient.observeNamespace("settings")}osVersion(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"osVersion");return e?(0,r.throwError)(()=>t):this.cloudClient.osVersion()}focus(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"focus");return e?(0,r.throwError)(()=>t):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"awareness",labels:["focus"],atomic:!1}),bluetooth:()=>this.bluetoothClient.focus()})}kinesis(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"kinesis");return t?(0,r.throwError)(()=>i):(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"kinesis",labels:e?[e]:[],atomic:!1})}predictions(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"predictions");return t?(0,r.throwError)(()=>i):(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"predictions",labels:e?[e]:[],atomic:!1})}status(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"status");return e?(0,r.throwError)(()=>t):this._withStreamingModeObservable({wifi:()=>this.cloudClient.status(),bluetooth:()=>this.bluetoothClient.status()})}changeSettings(e){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"changeSettings");return t?Promise.reject(i):yield this.cloudClient.changeSettings(e)})}get training(){return{record:e=>o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;const t=this.cloudClient.user&&"uid"in this.cloudClient.user?this.cloudClient.user.uid:null,i=Object.assign(Object.assign({fit:!1,baseline:!1,timestamp:this.cloudClient.timestamp},e),{userId:t});yield this.cloudClient.actions.dispatch({command:"training",action:"record",message:i})}),stop:e=>o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;yield this.cloudClient.actions.dispatch({command:"training",action:"stop",message:Object.assign({},e)})}),stopAll:()=>o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;yield this.cloudClient.actions.dispatch({command:"training",action:"stopAll",message:{}})})}}goOffline(){this.cloudClient.goOffline()}goOnline(){this.cloudClient.goOnline()}createAccount(e){return this.cloudClient.createAccount(e)}deleteAccount(){return this.cloudClient.deleteAccount()}createBluetoothToken(){return this.cloudClient.createBluetoothToken()}createCustomToken(){return this.cloudClient.createCustomToken()}getTimesyncOffset(){return this.options.timesync||console.warn("getTimesyncOffset() requires options.timesync to be true."),this.options.timesync?this.cloudClient.getTimesyncOffset():0}createOAuthURL(e){return M.isNode?(0,O.createOAuthURL)(e,this.options):Promise.reject(new Error(`${C.prefix}the createOAuthURL method must be used on the server side (node.js) for security reasons.`))}getOAuthToken(e){return M.isNode?(0,b.getOAuthToken)(e,this.options):Promise.reject(new Error(`${C.prefix}the getOAuthToken method must be used on the server side (node.js) for security reasons.`))}removeOAuthAccess(){return this.cloudClient.removeOAuthAccess()}onUserExperiments(){return this.cloudClient.onUserExperiments()}deleteUserExperiment(e){return this.cloudClient.deleteUserExperiment(e)}}exports.Neurosity=D,D.credentialWithLink=d.credentialWithLink,D.createUser=a.createUser,D.SERVER_TIMESTAMP=d.SERVER_TIMESTAMP;class w extends D{constructor(e={}){super(e),console.log("The Notion class is deprecated and will be removed in the next version of the SDK. Please use the Neurosity class instead. e.g. new Notion() => new Neurosity()")}}exports.Notion=w;
84
+ "use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,i,o){void 0===o&&(o=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&("get"in s?t.__esModule:!s.writable&&!s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,o,s)}:function(e,t,i,o){void 0===o&&(o=i),e[o]=t[i]}),t=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(i){if(i&&i.__esModule)return i;var o={};if(null!=i)for(var s in i)"default"!==s&&Object.prototype.hasOwnProperty.call(i,s)&&e(o,i,s);return t(o,i),o},o=this&&this.__awaiter||function(e,t,i,o){return new(i||(i=Promise))(function(s,r){function n(e){try{u(o.next(e))}catch(t){r(t)}}function c(e){try{u(o.throw(e))}catch(t){r(t)}}function u(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(n,c)}u((o=o.apply(e,t||[])).next())})},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Notion=exports.Neurosity=void 0;const r=require("rxjs"),n=require("rxjs"),c=require("rxjs/operators"),u=require("rxjs/operators"),l=s(require("fast-deep-equal")),a=require("./api/index"),d=require("./api/index"),h=require("./types/streaming"),m=require("./utils/subscription"),p=require("./types/status"),C=i(require("./utils/errors")),v=i(require("./utils/platform")),g=i(require("./utils/hapticEffects")),f=require("./utils/oauth"),S=require("./utils/oauth"),O=require("./api/https/createOAuthURL"),M=require("./api/https/getOAuthToken"),b=require("./utils/is-node"),_=require("./utils/metrics"),E=require("./api/bluetooth"),T=require("./api/bluetooth/types"),A={timesync:!1,autoSelectDevice:!0,streamingMode:h.STREAMING_MODE.WIFI_ONLY,emulator:!1,emulatorHost:"localhost",emulatorAuthPort:9099,emulatorDatabasePort:9e3,emulatorFunctionsPort:5001,emulatorFirestorePort:8080,emulatorOptions:{}};class D{constructor(e={}){this.streamingMode$=new n.ReplaySubject(1);const{streamingMode:t,bluetoothTransport:i}=e;this.options=Object.freeze(Object.assign(Object.assign({},A),e)),this.cloudClient=new a.CloudClient(this.options),i&&(this.bluetoothClient=new E.BluetoothClient({selectedDevice$:this.onDeviceChange(),osHasBluetoothSupport$:this._osHasBluetoothSupport(),createBluetoothToken:this.createBluetoothToken.bind(this),transport:i})),this._initStreamingMode(t,!!i)}_initStreamingMode(e,t){const i=[h.STREAMING_MODE.BLUETOOTH_WITH_WIFI_FALLBACK,h.STREAMING_MODE.WIFI_WITH_BLUETOOTH_FALLBACK].includes(e),o=!Object.values(h.STREAMING_MODE).includes(e),s=i&&!t;this.isMissingBluetoothTransport=s,!e||o||s?this.streamingMode$.next(h.STREAMING_MODE.WIFI_ONLY):this.streamingMode$.next(e)}_osHasBluetoothSupport(){return(0,r.combineLatest)({selectedDevice:this.onDeviceChange(),osVersion:this.osVersion().pipe((0,c.startWith)(null))}).pipe((0,c.map)(({selectedDevice:e,osVersion:t})=>(0,E.osHasBluetoothSupport)(e,t)))}streamingState(){const e=e=>[p.STATUS.ONLINE,p.STATUS.UPDATING].includes(e);return this.streamingMode$.pipe((0,c.switchMap)(t=>(0,r.combineLatest)({selectedDevice:this.onDeviceChange(),osHasBluetoothSupport:this._osHasBluetoothSupport()}).pipe((0,c.switchMap)(({selectedDevice:i,osHasBluetoothSupport:o})=>{if(!i)return(0,r.of)({connected:!1,streamingMode:t,activeMode:h.STREAMING_TYPE.WIFI});return this.isMissingBluetoothTransport||!o?this.cloudClient.status().pipe((0,c.map)(({state:i})=>({connected:e(i),streamingMode:t,activeMode:h.STREAMING_TYPE.WIFI}))):(0,r.combineLatest)({wifiStatus:this.cloudClient.status(),bluetoothConnection:(null==this?void 0:this.bluetoothClient)?this.bluetoothClient.connection():(0,r.of)(T.BLUETOOTH_CONNECTION.DISCONNECTED)}).pipe((0,c.map)(({wifiStatus:i,bluetoothConnection:o})=>{const s=o===T.BLUETOOTH_CONNECTION.CONNECTED;switch(t){default:case h.STREAMING_MODE.WIFI_ONLY:return{connected:e(i.state),streamingMode:t,activeMode:h.STREAMING_TYPE.WIFI};case h.STREAMING_MODE.WIFI_WITH_BLUETOOTH_FALLBACK:return{connected:e(i.state)||!s?e(i.state):s,streamingMode:t,activeMode:e(i.state)||!s?h.STREAMING_TYPE.WIFI:h.STREAMING_TYPE.BLUETOOTH};case h.STREAMING_MODE.BLUETOOTH_WITH_WIFI_FALLBACK:return{connected:!!s||e(i.state),streamingMode:t,activeMode:s?h.STREAMING_TYPE.BLUETOOTH:h.STREAMING_TYPE.WIFI}}}),(0,u.distinctUntilChanged)((e,t)=>(0,l.default)(e,t)))}))))}_withStreamingModeObservable(e){const{wifi:t,bluetooth:i}=e;return this.streamingState().pipe((0,c.switchMap)(({activeMode:e})=>{switch(e){case h.STREAMING_TYPE.WIFI:return t();case h.STREAMING_TYPE.BLUETOOTH:return i();default:return t()}}))}_withStreamingModePromise(e){return o(this,void 0,void 0,function*(){const{wifi:t,bluetooth:i}=e,{activeMode:o}=yield(0,n.firstValueFrom)(this.streamingState());switch(o){case h.STREAMING_TYPE.WIFI:return yield t();case h.STREAMING_TYPE.BLUETOOTH:return yield i();default:return yield t()}})}get bluetooth(){return null==this?void 0:this.bluetoothClient}_getCloudMetricDependencies(){return{options:this.options,cloudClient:this.cloudClient,onDeviceChange:this.onDeviceChange.bind(this),status:this.status.bind(this)}}login(e){return o(this,void 0,void 0,function*(){return yield this.cloudClient.login(e)})}logout(){return o(this,void 0,void 0,function*(){return yield this.cloudClient.logout()})}__getApp(){return this.cloudClient.__getApp()}onAuthStateChanged(){return this.cloudClient.onAuthStateChanged()}addDevice(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"addDevice");return t?Promise.reject(i):this.cloudClient.addDevice(e)}removeDevice(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"removeDevice");return t?Promise.reject(i):this.cloudClient.removeDevice(e)}transferDevice(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"transferDevice");return t?Promise.reject(i):this.cloudClient.transferDevice(e)}onUserDevicesChange(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"onUserDevicesChange");return e?(0,r.throwError)(()=>t):this.cloudClient.onUserDevicesChange()}onUserClaimsChange(){return this.cloudClient.onUserClaimsChange()}getDevices(){return o(this,void 0,void 0,function*(){return yield this.cloudClient.getDevices()})}selectDevice(e){return o(this,void 0,void 0,function*(){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"selectDevice");return t?Promise.reject(i):yield this.cloudClient.selectDevice(e)})}getSelectedDevice(){return o(this,void 0,void 0,function*(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"getSelectedDevice");return e?Promise.reject(t):yield this.cloudClient.getSelectedDevice()})}getInfo(){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"getInfo");return e?Promise.reject(t):yield this._withStreamingModePromise({wifi:()=>this.cloudClient.getInfo(),bluetooth:()=>this.bluetoothClient.getInfo()})})}onDeviceChange(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"onDeviceChange");return e?(0,r.throwError)(()=>t):this.cloudClient.onDeviceChange()}disconnect(){return o(this,void 0,void 0,function*(){return yield this._withStreamingModePromise({wifi:()=>this.cloudClient.disconnect(),bluetooth:()=>this.bluetoothClient.disconnect()})})}dispatchAction(e){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const[t,i]=(0,S.validateOAuthScopeForAction)(this.cloudClient.userClaims,e);return t?Promise.reject(i):yield this._withStreamingModePromise({wifi:()=>this.cloudClient.dispatchAction(e),bluetooth:()=>this.bluetoothClient.dispatchAction(e)})})}addMarker(e){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;if(!e)throw new Error(`${C.prefix}A label is required for addMarker`);return yield this._withStreamingModePromise({wifi:()=>this.cloudClient.dispatchAction({command:"marker",action:"add",message:{label:e,timestamp:this.cloudClient.timestamp}}),bluetooth:()=>this.bluetoothClient.addMarker(e)})})}haptics(e){var t;return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const i=null===(t=yield this.getSelectedDevice())||void 0===t?void 0:t.modelVersion;if(!v.supportsHaptics(i))return Promise.reject(C.metricNotSupportedByModel("haptics",i));const o=v.getPlatformHapticMotors(i);for(const t in e){if(!Object.keys(o).includes(t))return Promise.reject(C.locationNotFound(t,i));const s=e[t],r=7;if(s.length>r)return Promise.reject(C.exceededMaxItems(r));o[t]=s}const s={command:"haptics",action:"queue",responseRequired:!0,responseTimeout:1e3,message:{effects:o}};return yield this._withStreamingModePromise({wifi:()=>this.cloudClient.dispatchAction(s),bluetooth:()=>this.bluetoothClient.dispatchAction(s)})})}getHapticEffects(){return g}accelerometer(){const e="accelerometer",[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,e);return t?(0,r.throwError)(()=>i):this.onDeviceChange().pipe((0,c.switchMap)(t=>{const i=(null==t?void 0:t.modelVersion)||v.MODEL_VERSION_1;return v.supportsAccel(i)?this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:e,labels:(0,m.getLabels)(e),atomic:!0}),bluetooth:()=>this.bluetoothClient.accelerometer()}):(0,r.throwError)(()=>C.metricNotSupportedByModel(e,i))}))}brainwaves(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"brainwaves");return t?(0,r.throwError)(()=>i):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"brainwaves",labels:e?[e]:[],atomic:!1}),bluetooth:()=>this.bluetoothClient.brainwaves(e)})}calm(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"calm");return e?(0,r.throwError)(()=>t):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"awareness",labels:["calm"],atomic:!1}),bluetooth:()=>this.bluetoothClient.calm()})}signalQuality(){const e="signalQuality",[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,e);return t?(0,r.throwError)(()=>i):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:e,labels:(0,m.getLabels)(e),atomic:!0}),bluetooth:()=>this.bluetoothClient.signalQuality()})}settings(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"settings");return e?(0,r.throwError)(()=>t):this.cloudClient.observeNamespace("settings")}osVersion(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"osVersion");return e?(0,r.throwError)(()=>t):this.cloudClient.osVersion()}focus(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"focus");return e?(0,r.throwError)(()=>t):this._withStreamingModeObservable({wifi:()=>(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"awareness",labels:["focus"],atomic:!1}),bluetooth:()=>this.bluetoothClient.focus()})}kinesis(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"kinesis");return t?(0,r.throwError)(()=>i):(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"kinesis",labels:e?[e]:[],atomic:!1})}predictions(e){const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"predictions");return t?(0,r.throwError)(()=>i):(0,_.getCloudMetric)(this._getCloudMetricDependencies(),{metric:"predictions",labels:e?[e]:[],atomic:!1})}status(){const[e,t]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"status");return e?(0,r.throwError)(()=>t):this._withStreamingModeObservable({wifi:()=>this.cloudClient.status(),bluetooth:()=>this.bluetoothClient.status()})}changeSettings(e){return o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))return Promise.reject(C.mustSelectDevice);const[t,i]=(0,f.validateOAuthScopeForFunctionName)(this.cloudClient.userClaims,"changeSettings");return t?Promise.reject(i):yield this.cloudClient.changeSettings(e)})}get training(){return{record:e=>o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;const t=this.cloudClient.user&&"uid"in this.cloudClient.user?this.cloudClient.user.uid:null,i=Object.assign(Object.assign({fit:!1,baseline:!1,timestamp:this.cloudClient.timestamp},e),{userId:t});yield this.cloudClient.actions.dispatch({command:"training",action:"record",message:i})}),stop:e=>o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;yield this.cloudClient.actions.dispatch({command:"training",action:"stop",message:Object.assign({},e)})}),stopAll:()=>o(this,void 0,void 0,function*(){if(!(yield this.cloudClient.didSelectDevice()))throw C.mustSelectDevice;yield this.cloudClient.actions.dispatch({command:"training",action:"stopAll",message:{}})})}}goOffline(){this.cloudClient.goOffline()}goOnline(){this.cloudClient.goOnline()}createAccount(e){return this.cloudClient.createAccount(e)}deleteAccount(){return this.cloudClient.deleteAccount()}createBluetoothToken(){return this.cloudClient.createBluetoothToken()}createCustomToken(){return this.cloudClient.createCustomToken()}getTimesyncOffset(){return this.options.timesync||console.warn("getTimesyncOffset() requires options.timesync to be true."),this.options.timesync?this.cloudClient.getTimesyncOffset():0}createOAuthURL(e){return b.isNode?(0,O.createOAuthURL)(e,this.options):Promise.reject(new Error(`${C.prefix}the createOAuthURL method must be used on the server side (node.js) for security reasons.`))}getOAuthToken(e){return b.isNode?(0,M.getOAuthToken)(e,this.options):Promise.reject(new Error(`${C.prefix}the getOAuthToken method must be used on the server side (node.js) for security reasons.`))}removeOAuthAccess(){return this.cloudClient.removeOAuthAccess()}onUserExperiments(){return this.cloudClient.onUserExperiments()}deleteUserExperiment(e){return this.cloudClient.deleteUserExperiment(e)}}exports.Neurosity=D,D.credentialWithLink=d.credentialWithLink,D.createUser=a.createUser,D.SERVER_TIMESTAMP=d.SERVER_TIMESTAMP;class w extends D{constructor(e={}){super(e),console.log("The Notion class is deprecated and will be removed in the next version of the SDK. Please use the Neurosity class instead. e.g. new Notion() => new Neurosity()")}}exports.Notion=w;
85
85
  },{"./api/index":"LXvB","./types/streaming":"rekm","./utils/subscription":"yLLB","./types/status":"Ttuy","./utils/errors":"WDyG","./utils/platform":"wAkn","./utils/hapticEffects":"lLai","./utils/oauth":"xIH5","./api/https/createOAuthURL":"MDrB","./api/https/getOAuthToken":"nfg4","./utils/is-node":"vsps","./utils/metrics":"DCuD","./api/bluetooth":"TICO","./api/bluetooth/types":"iwtf"}],"QCba":[function(require,module,exports) {
86
86
  "use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&("get"in o?t.__esModule:!o.writable&&!o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var i in t)"default"===i||Object.prototype.hasOwnProperty.call(r,i)||e(r,t,i)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("./Neurosity"),exports),t(require("./api/bluetooth"),exports);
87
87
  },{"./Neurosity":"BZP9","./api/bluetooth":"TICO"}]},{},["QCba"], null)