@neurosity/sdk 6.5.4-next.0 → 6.5.4

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.
@@ -1,8 +1,8 @@
1
- import firebase from "firebase/compat/app";
2
- import "firebase/compat/database";
3
- import "firebase/compat/auth";
4
- import "firebase/compat/functions";
5
- import "firebase/compat/firestore";
1
+ import firebase from "firebase/app";
2
+ import "firebase/database";
3
+ import "firebase/auth";
4
+ import "firebase/functions";
5
+ import "firebase/firestore";
6
6
  import { SDKOptions } from "../../types/options";
7
7
  export declare const SERVER_TIMESTAMP: Object;
8
8
  /**
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.FirebaseApp = exports.SERVER_TIMESTAMP = void 0;
7
- const app_1 = __importDefault(require("firebase/compat/app"));
8
- require("firebase/compat/database");
9
- require("firebase/compat/auth");
10
- require("firebase/compat/functions");
11
- require("firebase/compat/firestore");
7
+ const app_1 = __importDefault(require("firebase/app"));
8
+ require("firebase/database");
9
+ require("firebase/auth");
10
+ require("firebase/functions");
11
+ require("firebase/firestore");
12
12
  const config_1 = require("./config");
13
13
  exports.SERVER_TIMESTAMP = app_1.default.database.ServerValue.TIMESTAMP;
14
14
  /**
@@ -1,4 +1,4 @@
1
- import firebase from "firebase/compat/app";
1
+ import firebase from "firebase/app";
2
2
  import { FirebaseApp } from "./FirebaseApp";
3
3
  import { SDKDependencies } from "../../types/options";
4
4
  declare type FirebaseDeviceOptions = {
@@ -13,7 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.FirebaseDevice = void 0;
16
- const app_1 = __importDefault(require("firebase/compat/app"));
16
+ const app_1 = __importDefault(require("firebase/app"));
17
17
  const deviceStore_1 = require("./deviceStore");
18
18
  const SERVER_TIMESTAMP = app_1.default.database.ServerValue.TIMESTAMP;
19
19
  /**
@@ -1,5 +1,5 @@
1
1
  import { Observable } from "rxjs";
2
- import firebase from "firebase/compat/app";
2
+ import firebase from "firebase/app";
3
3
  import { User } from "@firebase/auth-types";
4
4
  import { FirebaseApp } from "./FirebaseApp";
5
5
  import { Credentials, EmailAndPassword, CustomToken } from "../../types/credentials";
@@ -8,6 +8,12 @@ import { DeviceInfo } from "../../types/deviceInfo";
8
8
  import { OAuthRemoveResponse } from "../../types/oauth";
9
9
  import { Experiment } from "../../types/experiment";
10
10
  import { TransferDeviceOptions } from "../../utils/transferDevice";
11
+ /**
12
+ * @hidden
13
+ */
14
+ export declare type UserWithMetadata = User & {
15
+ selectedDevice: DeviceInfo | null;
16
+ };
11
17
  /**
12
18
  * @hidden
13
19
  */
@@ -15,7 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.FirebaseUser = exports.createUser = exports.credentialWithLink = void 0;
16
16
  const rxjs_1 = require("rxjs");
17
17
  const operators_1 = require("rxjs/operators");
18
- const app_1 = __importDefault(require("firebase/compat/app"));
18
+ const app_1 = __importDefault(require("firebase/app"));
19
19
  const SERVER_TIMESTAMP = app_1.default.database.ServerValue.TIMESTAMP;
20
20
  /**
21
21
  * @hidden
@@ -94,7 +94,9 @@ class FirebaseUser {
94
94
  }
95
95
  onLogin() {
96
96
  return new rxjs_1.Observable((subscriber) => {
97
- const unsubscribe = this.app.auth().onAuthStateChanged((user) => {
97
+ const unsubscribe = this.app
98
+ .auth()
99
+ .onAuthStateChanged((user) => {
98
100
  if (!!user) {
99
101
  subscriber.next(user);
100
102
  subscriber.complete();
@@ -115,7 +117,9 @@ class FirebaseUser {
115
117
  }
116
118
  if ("email" in credentials && "password" in credentials) {
117
119
  const { email, password } = credentials;
118
- return this.app.auth().signInWithEmailAndPassword(email, password);
120
+ return this.app
121
+ .auth()
122
+ .signInWithEmailAndPassword(email, password);
119
123
  }
120
124
  throw new Error(`Either {email,password}, {customToken}, or {idToken,providerId} is required`);
121
125
  }
@@ -243,7 +247,8 @@ class FirebaseUser {
243
247
  if (!userId) {
244
248
  return Promise.reject(new Error(`transferDevice: auth is required.`));
245
249
  }
246
- if (!("recipientsEmail" in options) && !("recipientsUserId" in options)) {
250
+ if (!("recipientsEmail" in options) &&
251
+ !("recipientsUserId" in options)) {
247
252
  return Promise.reject(new Error(`transferDevice: either 'recipientsEmail' or 'recipientsUserId' key is required.`));
248
253
  }
249
254
  if (!(options === null || options === void 0 ? void 0 : options.deviceId)) {
@@ -263,7 +268,9 @@ class FirebaseUser {
263
268
  return __awaiter(this, void 0, void 0, function* () {
264
269
  // hex string of 32 characters
265
270
  const hexRegEx = /[0-9A-Fa-f]{32}/g;
266
- if (!deviceId || deviceId.length !== 32 || !hexRegEx.test(deviceId)) {
271
+ if (!deviceId ||
272
+ deviceId.length !== 32 ||
273
+ !hexRegEx.test(deviceId)) {
267
274
  return Promise.reject("The device id is incorrectly formatted.");
268
275
  }
269
276
  const claimedByPath = this.getDeviceClaimedByPath(deviceId);
@@ -295,7 +302,9 @@ class FirebaseUser {
295
302
  return rxjs_1.EMPTY;
296
303
  }
297
304
  const claimsUpdatedOnPath = this.getUserClaimsUpdatedOnPath();
298
- const claimsUpdatedOnRef = this.app.database().ref(claimsUpdatedOnPath);
305
+ const claimsUpdatedOnRef = this.app
306
+ .database()
307
+ .ref(claimsUpdatedOnPath);
299
308
  return (0, rxjs_1.fromEventPattern)((handler) => claimsUpdatedOnRef.on("value", handler), (handler) => claimsUpdatedOnRef.off("value", handler)).pipe((0, operators_1.map)(([snapshot]) => snapshot.val()), (0, operators_1.switchMap)(() => {
300
309
  // Force refresh of auth id token
301
310
  return (0, rxjs_1.from)(this.getIdToken(true)).pipe((0, operators_1.switchMap)(() => (0, rxjs_1.from)(this.getClaims())));
@@ -330,11 +339,15 @@ class FirebaseUser {
330
339
  }
331
340
  userDevicesToDeviceInfoList(userDevices) {
332
341
  return __awaiter(this, void 0, void 0, function* () {
333
- const devicesInfoSnapshots = Object.keys(userDevices !== null && userDevices !== void 0 ? userDevices : {}).map((deviceId) => this.app.database().ref(this.getDeviceInfoPath(deviceId)).once("value"));
342
+ const devicesInfoSnapshots = Object.keys(userDevices !== null && userDevices !== void 0 ? userDevices : {}).map((deviceId) => this.app
343
+ .database()
344
+ .ref(this.getDeviceInfoPath(deviceId))
345
+ .once("value"));
334
346
  const devicesList = yield Promise.all(devicesInfoSnapshots).then((snapshots) => snapshots.map((snapshot) => snapshot.val()));
335
347
  const validDevices = devicesList.filter((device) => !!device);
336
348
  validDevices.sort((a, b) => {
337
- return (userDevices[a.deviceId].claimedOn - userDevices[b.deviceId].claimedOn);
349
+ return (userDevices[a.deviceId].claimedOn -
350
+ userDevices[b.deviceId].claimedOn);
338
351
  });
339
352
  return validDevices;
340
353
  });
@@ -13,7 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.createDeviceStore = void 0;
16
- const app_1 = __importDefault(require("firebase/compat/app"));
16
+ const app_1 = __importDefault(require("firebase/app"));
17
17
  const SERVER_TIMESTAMP = app_1.default.database.ServerValue.TIMESTAMP;
18
18
  /**
19
19
  * @hidden
@@ -33,7 +33,9 @@ const createDeviceStore = (app, deviceId, subscriptionManager) => {
33
33
  return deviceRef.child(namespace).update(payload);
34
34
  };
35
35
  const on = (eventType = "value", namespace, callback) => {
36
- const listener = deviceRef.child(namespace).on(eventType, (snapshot) => {
36
+ const listener = deviceRef
37
+ .child(namespace)
38
+ .on(eventType, (snapshot) => {
37
39
  callback(snapshot.val(), snapshot);
38
40
  });
39
41
  listenersToRemove.push(() => {
@@ -99,7 +101,10 @@ const createDeviceStore = (app, deviceId, subscriptionManager) => {
99
101
  });
100
102
  });
101
103
  listenersToRemove.push(() => {
102
- app.database().ref(".info/connected").off("value", connectedListener);
104
+ app
105
+ .database()
106
+ .ref(".info/connected")
107
+ .off("value", connectedListener);
103
108
  });
104
109
  return {
105
110
  set,
@@ -1,5 +1,6 @@
1
1
  import { Observable } from "rxjs";
2
2
  import { FirebaseApp, FirebaseUser, FirebaseDevice } from "./firebase";
3
+ import { UserWithMetadata } from "./firebase";
3
4
  import { Timesync } from "../timesync";
4
5
  import { SubscriptionManager } from "../subscriptions/SubscriptionManager";
5
6
  import { Client } from "../types/client";
@@ -41,47 +42,7 @@ export declare class CloudClient implements Client {
41
42
  getInfo(): Promise<any>;
42
43
  login(credentials: Credentials): Promise<any>;
43
44
  logout(): Promise<any>;
44
- onAuthStateChanged(): Observable<{
45
- selectedDevice: DeviceInfo;
46
- delete(): Promise<void>;
47
- emailVerified: boolean;
48
- getIdTokenResult(forceRefresh?: boolean): Promise<import("@firebase/auth-types").IdTokenResult>;
49
- getIdToken(forceRefresh?: boolean): Promise<string>;
50
- isAnonymous: boolean;
51
- linkAndRetrieveDataWithCredential(credential: import("@firebase/auth-types").AuthCredential): Promise<import("@firebase/auth-types").UserCredential>;
52
- linkWithCredential(credential: import("@firebase/auth-types").AuthCredential): Promise<import("@firebase/auth-types").UserCredential>;
53
- linkWithPhoneNumber(phoneNumber: string, applicationVerifier: import("@firebase/auth-types").ApplicationVerifier): Promise<import("@firebase/auth-types").ConfirmationResult>;
54
- linkWithPopup(provider: import("@firebase/auth-types").AuthProvider): Promise<import("@firebase/auth-types").UserCredential>;
55
- linkWithRedirect(provider: import("@firebase/auth-types").AuthProvider): Promise<void>;
56
- metadata: import("@firebase/auth-types").UserMetadata;
57
- multiFactor: import("@firebase/auth-types").MultiFactorUser;
58
- phoneNumber: string;
59
- providerData: import("@firebase/auth-types").UserInfo[];
60
- reauthenticateAndRetrieveDataWithCredential(credential: import("@firebase/auth-types").AuthCredential): Promise<import("@firebase/auth-types").UserCredential>;
61
- reauthenticateWithCredential(credential: import("@firebase/auth-types").AuthCredential): Promise<import("@firebase/auth-types").UserCredential>;
62
- reauthenticateWithPhoneNumber(phoneNumber: string, applicationVerifier: import("@firebase/auth-types").ApplicationVerifier): Promise<import("@firebase/auth-types").ConfirmationResult>;
63
- reauthenticateWithPopup(provider: import("@firebase/auth-types").AuthProvider): Promise<import("@firebase/auth-types").UserCredential>;
64
- reauthenticateWithRedirect(provider: import("@firebase/auth-types").AuthProvider): Promise<void>;
65
- refreshToken: string;
66
- reload(): Promise<void>;
67
- sendEmailVerification(actionCodeSettings?: import("@firebase/auth-types").ActionCodeSettings): Promise<void>;
68
- tenantId: string;
69
- toJSON(): Object;
70
- unlink(providerId: string): Promise<import("@firebase/auth-types").User>;
71
- updateEmail(newEmail: string): Promise<void>;
72
- updatePassword(newPassword: string): Promise<void>;
73
- updatePhoneNumber(phoneCredential: import("@firebase/auth-types").AuthCredential): Promise<void>;
74
- updateProfile(profile: {
75
- displayName?: string;
76
- photoURL?: string;
77
- }): Promise<void>;
78
- verifyBeforeUpdateEmail(newEmail: string, actionCodeSettings?: import("@firebase/auth-types").ActionCodeSettings): Promise<void>;
79
- displayName: string;
80
- email: string;
81
- photoURL: string;
82
- providerId: string;
83
- uid: string;
84
- }>;
45
+ onAuthStateChanged(): Observable<UserWithMetadata>;
85
46
  getDevices(): Promise<DeviceInfo[]>;
86
47
  addDevice(deviceId: string): Promise<void>;
87
48
  removeDevice(deviceId: string): Promise<void>;
@@ -141,7 +141,10 @@ class CloudClient {
141
141
  const selectedDevice = this.didSelectDevice()
142
142
  ? yield this.getSelectedDevice()
143
143
  : yield this.setAutoSelectedDevice();
144
- return Object.assign(Object.assign({}, user), { selectedDevice });
144
+ const userWithMetadata = Object.assign(user, {
145
+ selectedDevice
146
+ });
147
+ return userWithMetadata;
145
148
  })));
146
149
  }
147
150
  getDevices() {
@@ -1,13 +1,13 @@
1
1
  process.env.HMR_PORT=0;process.env.HMR_HOSTNAME="localhost";parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"TX5A":[function(require,module,exports) {
2
2
  "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.config=void 0,exports.config={apiKey:"AIzaSyB0TkZ83Fj0CIzn8AAmE-Osc92s3ER8hy8",authDomain:"neurosity-device.firebaseapp.com",databaseURL:"https://neurosity-device.firebaseio.com",projectId:"neurosity-device",storageBucket:"neurosity-device.appspot.com",messagingSenderId:"212595049674"};
3
3
  },{}],"OERo":[function(require,module,exports) {
4
- "use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FirebaseApp=exports.SERVER_TIMESTAMP=void 0;const t=e(require("firebase/compat/app"));require("firebase/compat/database"),require("firebase/compat/auth"),require("firebase/compat/functions"),require("firebase/compat/firestore");const a=require("./config");exports.SERVER_TIMESTAMP=t.default.database.ServerValue.TIMESTAMP;class i{constructor(e){this.app=this.getApp(e.deviceId),this.standalone=this.app.name===e.deviceId,e.emulator&&this.connectEmulators(e)}getApp(e){const i=t.default.apps,s="undefined"!=typeof window&&"firebase"in window&&"apps"in window.firebase?window.firebase.apps:[],r=[...i,...s].find(e=>"[DEFAULT]"===e.name&&e.options.databaseURL===a.config.databaseURL);if(r)return r;if(e){const s=e,r=i.find(e=>e.name===s);return r||t.default.initializeApp(a.config,s)}return t.default.initializeApp(a.config)}connectEmulators(e){const{emulatorHost:t,emulatorAuthPort:a,emulatorDatabasePort:i,emulatorFunctionsPort:s,emulatorFirestorePort:r,emulatorOptions:o}=e;this.app.auth().useEmulator(`http://${t}:${a}`),this.app.database().useEmulator(t,i,o),this.app.functions().useEmulator(t,s),this.app.firestore().useEmulator(t,r,o)}goOnline(){this.app.database().goOnline()}goOffline(){this.app.database().goOffline()}disconnect(){return this.standalone?this.app.delete():Promise.resolve()}}exports.FirebaseApp=i;
4
+ "use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FirebaseApp=exports.SERVER_TIMESTAMP=void 0;const t=e(require("firebase/app"));require("firebase/database"),require("firebase/auth"),require("firebase/functions"),require("firebase/firestore");const a=require("./config");exports.SERVER_TIMESTAMP=t.default.database.ServerValue.TIMESTAMP;class i{constructor(e){this.app=this.getApp(e.deviceId),this.standalone=this.app.name===e.deviceId,e.emulator&&this.connectEmulators(e)}getApp(e){const i=t.default.apps,s="undefined"!=typeof window&&"firebase"in window&&"apps"in window.firebase?window.firebase.apps:[],r=[...i,...s].find(e=>"[DEFAULT]"===e.name&&e.options.databaseURL===a.config.databaseURL);if(r)return r;if(e){const s=e,r=i.find(e=>e.name===s);return r||t.default.initializeApp(a.config,s)}return t.default.initializeApp(a.config)}connectEmulators(e){const{emulatorHost:t,emulatorAuthPort:a,emulatorDatabasePort:i,emulatorFunctionsPort:s,emulatorFirestorePort:r,emulatorOptions:o}=e;this.app.auth().useEmulator(`http://${t}:${a}`),this.app.database().useEmulator(t,i,o),this.app.functions().useEmulator(t,s),this.app.firestore().useEmulator(t,r,o)}goOnline(){this.app.database().goOnline()}goOffline(){this.app.database().goOffline()}disconnect(){return this.standalone?this.app.delete():Promise.resolve()}}exports.FirebaseApp=i;
5
5
  },{"./config":"TX5A"}],"Cc51":[function(require,module,exports) {
6
- "use strict";var e=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))(function(n,s){function a(e){try{c(r.next(e))}catch(t){s(t)}}function o(e){try{c(r.throw(e))}catch(t){s(t)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(a,o)}c((r=r.apply(e,t||[])).next())})},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FirebaseUser=exports.createUser=exports.credentialWithLink=void 0;const i=require("rxjs"),r=require("rxjs/operators"),n=t(require("firebase/compat/app")),s=n.default.database.ServerValue.TIMESTAMP;function a(...e){return new n.default.User(...e)}exports.credentialWithLink=n.default.auth.EmailAuthProvider.credentialWithLink,exports.createUser=a;class o{constructor(e){this.app=e.app,this.app.auth().onAuthStateChanged(e=>{this.user=e})}auth(){return this.app.auth()}createAccount(t){return e(this,void 0,void 0,function*(){const{email:e,password:i}=t,[r,n]=yield this.app.auth().createUserWithEmailAndPassword(e,i).then(e=>[null,e]).catch(e=>[e,null]);return r?Promise.reject(r):n})}deleteAccount(){return e(this,void 0,void 0,function*(){const e=this.app.auth().currentUser;if(!e)return Promise.reject(new Error("You are trying to delete an account that is not authenticated. To delete an account, the account must have signed in recently."));const[t,i]=yield this.getDevices().then(e=>[null,e]).catch(e=>[e,null]);if(t)return Promise.reject(t);if(i.length){const e=yield Promise.all(i.map(e=>this.removeDevice(e.deviceId))).then(()=>null).catch(e=>e);if(e)return Promise.reject(e)}return e.delete()})}onAuthStateChanged(){return new i.Observable(e=>{try{this.app.auth().onAuthStateChanged(t=>{e.next(t)},t=>{e.error(t)})}catch(t){e.error(t)}})}onLogin(){return new i.Observable(e=>{const t=this.app.auth().onAuthStateChanged(t=>{t&&(e.next(t),e.complete())});return()=>t()})}login(e){if("customToken"in e){const{customToken:t}=e;return this.app.auth().signInWithCustomToken(t)}if("idToken"in e&&"providerId"in e){const t=new n.default.auth.OAuthProvider(e.providerId).credential(e.idToken);return this.app.auth().signInWithCredential(t)}if("email"in e&&"password"in e){const{email:t,password:i}=e;return this.app.auth().signInWithEmailAndPassword(t,i)}throw new Error("Either {email,password}, {customToken}, or {idToken,providerId} is required")}logout(){return this.app.auth().signOut()}createCustomToken(){return e(this,void 0,void 0,function*(){const[e,t]=yield this.app.functions().httpsCallable("createCustomToken")().then(({data:e})=>[null,e]).catch(e=>[e,null]);return e?Promise.reject(e):t})}removeOAuthAccess(){var t;return e(this,void 0,void 0,function*(){if(!(null===(t=this.user)||void 0===t?void 0:t.uid))return Promise.reject("OAuth access can only be removed while logged in via OAuth.");const[e,i]=yield this.app.functions().httpsCallable("removeAccessOAuthApp")().then(({data:e})=>[null,e]).catch(e=>[e,null]);if(e)return Promise.reject(e);const r=yield this.logout().then(()=>!1).catch(e=>e);return r?Promise.reject(r):i})}getDevices(){var t;return e(this,void 0,void 0,function*(){if(!(null===(t=this.user)||void 0===t?void 0:t.uid))return Promise.reject("Please login.");const e=(yield this.app.database().ref(this.getUserDevicesPath()).once("value")).val();return this.userDevicesToDeviceInfoList(e)})}addDevice(t){var i;return e(this,void 0,void 0,function*(){const e=null===(i=this.user)||void 0===i?void 0:i.uid;if(!e)return Promise.reject("Please login.");const r=yield this.getDevices().catch(e=>{console.log(e)});if(r&&r.length&&r.map(({deviceId:e})=>e).includes(t))return Promise.reject("The device is already added to this account.");const[n,a]=yield this.isDeviceIdValid(t).then(e=>[e]).catch(e=>[!1,e]);if(!n)return Promise.reject(a);const o=this.getDeviceClaimedByPath(t),c=this.getUserClaimedDevicePath(t),[u,d]=yield this.app.database().ref().update({[o]:e,[c]:{claimedOn:s}}).then(()=>[!1]).catch(e=>[!0,e]);return u?Promise.reject(d):void 0})}removeDevice(t){var i;return e(this,void 0,void 0,function*(){if(!(null===(i=this.user)||void 0===i?void 0:i.uid))return Promise.reject("Please login.");const e=this.getDeviceClaimedByPath(t),r=this.getUserClaimedDevicePath(t),n=this.app.database().ref(e),s=this.app.database().ref(r),[a,o]=yield Promise.all([n.remove(),s.remove()]).then(()=>[!1]).catch(e=>[!0,e]);return a?Promise.reject(o):void 0})}transferDevice(t){var i;return e(this,void 0,void 0,function*(){if(!(null===(i=this.user)||void 0===i?void 0:i.uid))return Promise.reject(new Error("transferDevice: auth is required."));if(!("recipientsEmail"in t||"recipientsUserId"in t))return Promise.reject(new Error("transferDevice: either 'recipientsEmail' or 'recipientsUserId' key is required."));if(!(null==t?void 0:t.deviceId))return Promise.reject(new Error("transferDevice: a deviceId is required."));const[e,r]=yield this.app.functions().httpsCallable("transferDeviceOwnership")(t).then(({data:e})=>[null,e]).catch(e=>[e,null]);return e?Promise.reject(e):void 0})}isDeviceIdValid(t){return e(this,void 0,void 0,function*(){if(!t||32!==t.length||!/[0-9A-Fa-f]{32}/g.test(t))return Promise.reject("The device id is incorrectly formatted.");const e=this.getDeviceClaimedByPath(t),i=this.app.database().ref(e),r=yield i.once("value").catch(()=>null);return!(!r||r.exists())||Promise.reject("The device has already been claimed.")})}onUserDevicesChange(){return this.onAuthStateChanged().pipe((0,r.switchMap)(e=>{if(!e)return i.EMPTY;const t=this.getUserDevicesPath(),n=this.app.database().ref(t);return(0,i.fromEventPattern)(e=>n.on("value",e),e=>n.off("value",e)).pipe((0,r.map)(([e])=>e.val()),(0,r.switchMap)(e=>(0,i.from)(this.userDevicesToDeviceInfoList(e))))}))}onUserClaimsChange(){return this.onAuthStateChanged().pipe((0,r.switchMap)(e=>{if(!e)return i.EMPTY;const t=this.getUserClaimsUpdatedOnPath(),n=this.app.database().ref(t);return(0,i.fromEventPattern)(e=>n.on("value",e),e=>n.off("value",e)).pipe((0,r.map)(([e])=>e.val()),(0,r.switchMap)(()=>(0,i.from)(this.getIdToken(!0)).pipe((0,r.switchMap)(()=>(0,i.from)(this.getClaims())))))}))}getIdToken(t=!1){var i;return e(this,void 0,void 0,function*(){const e=null===(i=this.app.auth())||void 0===i?void 0:i.currentUser;if(!e)return Promise.reject("getUserIdToken: unable to get currentUser");yield e.getIdToken(t).catch(e=>{console.error(e)})})}getClaims(){var e;const t=null===(e=this.app.auth())||void 0===e?void 0:e.currentUser;return t?t.getIdTokenResult().then(e=>e.claims).catch(e=>(console.error(e),null)):Promise.reject("getUserClaims: unable to get currentUser")}userDevicesToDeviceInfoList(t){return e(this,void 0,void 0,function*(){const e=Object.keys(null!=t?t:{}).map(e=>this.app.database().ref(this.getDeviceInfoPath(e)).once("value")),i=(yield Promise.all(e).then(e=>e.map(e=>e.val()))).filter(e=>!!e);return i.sort((e,i)=>t[e.deviceId].claimedOn-t[i.deviceId].claimedOn),i})}hasDevicePermission(t){return e(this,void 0,void 0,function*(){const e=this.getDeviceInfoPath(t);return yield this.app.database().ref(e).once("value").then(()=>!0).catch(()=>!1)})}getDeviceClaimedByPath(e){return`devices/${e}/status/claimedBy`}getUserClaimedDevicePath(e){return`users/${this.user.uid}/devices/${e}`}getUserDevicesPath(){return`users/${this.user.uid}/devices`}getUserClaimsUpdatedOnPath(){return`users/${this.user.uid}/claimsUpdatedOn`}getDeviceInfoPath(e){return`devices/${e}/info`}onUserExperiments(){return this.onAuthStateChanged().pipe((0,r.switchMap)(e=>{if(!e)return i.EMPTY;const t=this.user.uid,n=this.app.database().ref("experiments").orderByChild("userId").equalTo(t).limitToFirst(100);return(0,i.fromEventPattern)(e=>n.on("value",e),e=>n.off("value",e)).pipe((0,r.map)(([e])=>e.val()),(0,r.map)(e=>Object.entries(null!=e?e:{}).map(([e,t])=>{var i;return Object.assign({id:null!==(i=null==t?void 0:t.id)&&void 0!==i?i:e},t)}).sort((e,t)=>new Date(null==t?void 0:t.timestamp).getTime()-new Date(null==e?void 0:e.timestamp).getTime())))}))}deleteUserExperiment(t){return e(this,void 0,void 0,function*(){if(!t)return Promise.reject("deleteUserExperiment: please provide an experiment id");yield Promise.all([(e=>this.app.database().ref("experiments").child(e).remove())(t),(e=>this.app.functions().httpsCallable("removeRelations")({experimentId:e}))(t)]).catch(()=>{})})}}exports.FirebaseUser=o;
6
+ "use strict";var e=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))(function(n,s){function a(e){try{c(r.next(e))}catch(t){s(t)}}function o(e){try{c(r.throw(e))}catch(t){s(t)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(a,o)}c((r=r.apply(e,t||[])).next())})},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FirebaseUser=exports.createUser=exports.credentialWithLink=void 0;const i=require("rxjs"),r=require("rxjs/operators"),n=t(require("firebase/app")),s=n.default.database.ServerValue.TIMESTAMP;function a(...e){return new n.default.User(...e)}exports.credentialWithLink=n.default.auth.EmailAuthProvider.credentialWithLink,exports.createUser=a;class o{constructor(e){this.app=e.app,this.app.auth().onAuthStateChanged(e=>{this.user=e})}auth(){return this.app.auth()}createAccount(t){return e(this,void 0,void 0,function*(){const{email:e,password:i}=t,[r,n]=yield this.app.auth().createUserWithEmailAndPassword(e,i).then(e=>[null,e]).catch(e=>[e,null]);return r?Promise.reject(r):n})}deleteAccount(){return e(this,void 0,void 0,function*(){const e=this.app.auth().currentUser;if(!e)return Promise.reject(new Error("You are trying to delete an account that is not authenticated. To delete an account, the account must have signed in recently."));const[t,i]=yield this.getDevices().then(e=>[null,e]).catch(e=>[e,null]);if(t)return Promise.reject(t);if(i.length){const e=yield Promise.all(i.map(e=>this.removeDevice(e.deviceId))).then(()=>null).catch(e=>e);if(e)return Promise.reject(e)}return e.delete()})}onAuthStateChanged(){return new i.Observable(e=>{try{this.app.auth().onAuthStateChanged(t=>{e.next(t)},t=>{e.error(t)})}catch(t){e.error(t)}})}onLogin(){return new i.Observable(e=>{const t=this.app.auth().onAuthStateChanged(t=>{t&&(e.next(t),e.complete())});return()=>t()})}login(e){if("customToken"in e){const{customToken:t}=e;return this.app.auth().signInWithCustomToken(t)}if("idToken"in e&&"providerId"in e){const t=new n.default.auth.OAuthProvider(e.providerId).credential(e.idToken);return this.app.auth().signInWithCredential(t)}if("email"in e&&"password"in e){const{email:t,password:i}=e;return this.app.auth().signInWithEmailAndPassword(t,i)}throw new Error("Either {email,password}, {customToken}, or {idToken,providerId} is required")}logout(){return this.app.auth().signOut()}createCustomToken(){return e(this,void 0,void 0,function*(){const[e,t]=yield this.app.functions().httpsCallable("createCustomToken")().then(({data:e})=>[null,e]).catch(e=>[e,null]);return e?Promise.reject(e):t})}removeOAuthAccess(){var t;return e(this,void 0,void 0,function*(){if(!(null===(t=this.user)||void 0===t?void 0:t.uid))return Promise.reject("OAuth access can only be removed while logged in via OAuth.");const[e,i]=yield this.app.functions().httpsCallable("removeAccessOAuthApp")().then(({data:e})=>[null,e]).catch(e=>[e,null]);if(e)return Promise.reject(e);const r=yield this.logout().then(()=>!1).catch(e=>e);return r?Promise.reject(r):i})}getDevices(){var t;return e(this,void 0,void 0,function*(){if(!(null===(t=this.user)||void 0===t?void 0:t.uid))return Promise.reject("Please login.");const e=(yield this.app.database().ref(this.getUserDevicesPath()).once("value")).val();return this.userDevicesToDeviceInfoList(e)})}addDevice(t){var i;return e(this,void 0,void 0,function*(){const e=null===(i=this.user)||void 0===i?void 0:i.uid;if(!e)return Promise.reject("Please login.");const r=yield this.getDevices().catch(e=>{console.log(e)});if(r&&r.length&&r.map(({deviceId:e})=>e).includes(t))return Promise.reject("The device is already added to this account.");const[n,a]=yield this.isDeviceIdValid(t).then(e=>[e]).catch(e=>[!1,e]);if(!n)return Promise.reject(a);const o=this.getDeviceClaimedByPath(t),c=this.getUserClaimedDevicePath(t),[u,d]=yield this.app.database().ref().update({[o]:e,[c]:{claimedOn:s}}).then(()=>[!1]).catch(e=>[!0,e]);return u?Promise.reject(d):void 0})}removeDevice(t){var i;return e(this,void 0,void 0,function*(){if(!(null===(i=this.user)||void 0===i?void 0:i.uid))return Promise.reject("Please login.");const e=this.getDeviceClaimedByPath(t),r=this.getUserClaimedDevicePath(t),n=this.app.database().ref(e),s=this.app.database().ref(r),[a,o]=yield Promise.all([n.remove(),s.remove()]).then(()=>[!1]).catch(e=>[!0,e]);return a?Promise.reject(o):void 0})}transferDevice(t){var i;return e(this,void 0,void 0,function*(){if(!(null===(i=this.user)||void 0===i?void 0:i.uid))return Promise.reject(new Error("transferDevice: auth is required."));if(!("recipientsEmail"in t||"recipientsUserId"in t))return Promise.reject(new Error("transferDevice: either 'recipientsEmail' or 'recipientsUserId' key is required."));if(!(null==t?void 0:t.deviceId))return Promise.reject(new Error("transferDevice: a deviceId is required."));const[e,r]=yield this.app.functions().httpsCallable("transferDeviceOwnership")(t).then(({data:e})=>[null,e]).catch(e=>[e,null]);return e?Promise.reject(e):void 0})}isDeviceIdValid(t){return e(this,void 0,void 0,function*(){if(!t||32!==t.length||!/[0-9A-Fa-f]{32}/g.test(t))return Promise.reject("The device id is incorrectly formatted.");const e=this.getDeviceClaimedByPath(t),i=this.app.database().ref(e),r=yield i.once("value").catch(()=>null);return!(!r||r.exists())||Promise.reject("The device has already been claimed.")})}onUserDevicesChange(){return this.onAuthStateChanged().pipe((0,r.switchMap)(e=>{if(!e)return i.EMPTY;const t=this.getUserDevicesPath(),n=this.app.database().ref(t);return(0,i.fromEventPattern)(e=>n.on("value",e),e=>n.off("value",e)).pipe((0,r.map)(([e])=>e.val()),(0,r.switchMap)(e=>(0,i.from)(this.userDevicesToDeviceInfoList(e))))}))}onUserClaimsChange(){return this.onAuthStateChanged().pipe((0,r.switchMap)(e=>{if(!e)return i.EMPTY;const t=this.getUserClaimsUpdatedOnPath(),n=this.app.database().ref(t);return(0,i.fromEventPattern)(e=>n.on("value",e),e=>n.off("value",e)).pipe((0,r.map)(([e])=>e.val()),(0,r.switchMap)(()=>(0,i.from)(this.getIdToken(!0)).pipe((0,r.switchMap)(()=>(0,i.from)(this.getClaims())))))}))}getIdToken(t=!1){var i;return e(this,void 0,void 0,function*(){const e=null===(i=this.app.auth())||void 0===i?void 0:i.currentUser;if(!e)return Promise.reject("getUserIdToken: unable to get currentUser");yield e.getIdToken(t).catch(e=>{console.error(e)})})}getClaims(){var e;const t=null===(e=this.app.auth())||void 0===e?void 0:e.currentUser;return t?t.getIdTokenResult().then(e=>e.claims).catch(e=>(console.error(e),null)):Promise.reject("getUserClaims: unable to get currentUser")}userDevicesToDeviceInfoList(t){return e(this,void 0,void 0,function*(){const e=Object.keys(null!=t?t:{}).map(e=>this.app.database().ref(this.getDeviceInfoPath(e)).once("value")),i=(yield Promise.all(e).then(e=>e.map(e=>e.val()))).filter(e=>!!e);return i.sort((e,i)=>t[e.deviceId].claimedOn-t[i.deviceId].claimedOn),i})}hasDevicePermission(t){return e(this,void 0,void 0,function*(){const e=this.getDeviceInfoPath(t);return yield this.app.database().ref(e).once("value").then(()=>!0).catch(()=>!1)})}getDeviceClaimedByPath(e){return`devices/${e}/status/claimedBy`}getUserClaimedDevicePath(e){return`users/${this.user.uid}/devices/${e}`}getUserDevicesPath(){return`users/${this.user.uid}/devices`}getUserClaimsUpdatedOnPath(){return`users/${this.user.uid}/claimsUpdatedOn`}getDeviceInfoPath(e){return`devices/${e}/info`}onUserExperiments(){return this.onAuthStateChanged().pipe((0,r.switchMap)(e=>{if(!e)return i.EMPTY;const t=this.user.uid,n=this.app.database().ref("experiments").orderByChild("userId").equalTo(t).limitToFirst(100);return(0,i.fromEventPattern)(e=>n.on("value",e),e=>n.off("value",e)).pipe((0,r.map)(([e])=>e.val()),(0,r.map)(e=>Object.entries(null!=e?e:{}).map(([e,t])=>{var i;return Object.assign({id:null!==(i=null==t?void 0:t.id)&&void 0!==i?i:e},t)}).sort((e,t)=>new Date(null==t?void 0:t.timestamp).getTime()-new Date(null==e?void 0:e.timestamp).getTime())))}))}deleteUserExperiment(t){return e(this,void 0,void 0,function*(){if(!t)return Promise.reject("deleteUserExperiment: please provide an experiment id");yield Promise.all([(e=>this.app.database().ref("experiments").child(e).remove())(t),(e=>this.app.functions().httpsCallable("removeRelations")({experimentId:e}))(t)]).catch(()=>{})})}}exports.FirebaseUser=o;
7
7
  },{}],"mSvX":[function(require,module,exports) {
8
- "use strict";var e=this&&this.__awaiter||function(e,t,i,o){return new(i||(i=Promise))(function(n,c){function s(e){try{a(o.next(e))}catch(t){c(t)}}function r(e){try{a(o.throw(e))}catch(t){c(t)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,r)}a((o=o.apply(e,t||[])).next())})},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createDeviceStore=void 0;const i=t(require("firebase/compat/app")),o=i.default.database.ServerValue.TIMESTAMP,n=(t,i,n)=>{const c=t.database().ref(`devices/${i}`),s=c.child("subscriptions").push().key,r=c.child(`clients/${s}`);let a=[];const u=(e,t)=>c.child(e).set(t),l=(e,t)=>c.child(e).update(t),d=(e="value",t,i)=>{const o=c.child(t).on(e,e=>{i(e.val(),e)});return a.push(()=>{c.child(t).off(e,o)}),o},v=(e,t,i)=>{i?c.child(e).off(t,i):c.child(e).off(t)},f=t.database().ref(".info/connected").on("value",e=>{e.val()&&r.onDisconnect().remove().then(()=>{r.set(o),l("subscriptions",n.get()).then(()=>{n.toList().forEach(e=>{const t=`subscriptions/${e.id}`;c.child(t).onDisconnect().remove()})})})});return a.push(()=>{t.database().ref(".info/connected").off("value",f)}),{set:u,once:(t,i="value")=>e(void 0,void 0,void 0,function*(){return(yield c.child(t).once(i)).val()}),update:l,lastOfChildValue:(t,i,o)=>e(void 0,void 0,void 0,function*(){const e=(yield c.child(t).orderByChild(i).equalTo(o).limitToLast(1).once("value")).val(),[n]=Object.values(e||{});return n||null}),onNamespace:(e,t)=>d("value",e,e=>{t(e)}),offNamespace:(e,t)=>{v(e,"value",t)},dispatchAction:t=>e(void 0,void 0,void 0,function*(){const e=yield((e,t)=>c.child(e).push(t))("actions",t),i=e.key,o=`actions/${i}`;if(e.onDisconnect().remove(),t.responseRequired){const i=t.responseTimeout||6e5,n=new Promise((t,o)=>{const n=setTimeout(()=>{clearTimeout(n),e.remove(),o(`Action response timed out in ${i}ms.`)},i)}),c=new Promise(e=>{((e,t,i,o)=>{d(e,t,n=>{null!==n&&(v(t,e),i(o||n))})})("value",`${o}/response`,e)});return Promise.race([c,n])}return i}),nextMetric:(t,i)=>e(void 0,void 0,void 0,function*(){u(`metrics/${t}`,i)}),onMetric:(e,t)=>{const{atomic:i,metric:o,labels:n}=e,c=i?`metrics/${o}`:`metrics/${o}/${n[0]}`;return d("value",c,e=>{null!==e&&t(e)})},subscribeToMetric:e=>{const t=c.child("subscriptions").push().key,i=`subscriptions/${t}`,o=Object.assign({id:t,clientId:s},e);return u(i,o),c.child(i).onDisconnect().remove(),o},unsubscribeFromMetric:e=>{(e=>{c.child(e).remove()})(`subscriptions/${e.id}`)},removeMetricListener(e,t){const{atomic:i,metric:o,labels:n}=e,c=i?`metrics/${o}`:`metrics/${o}/${n[0]}`;v(c,"value",t)},disconnect(){r.remove(),a.forEach(e=>{e()}),n.toList().filter(e=>e.clientId===s).forEach(e=>{const t=`subscriptions/${e.id}`;c.child(t).remove()})}}};exports.createDeviceStore=n;
8
+ "use strict";var e=this&&this.__awaiter||function(e,t,i,o){return new(i||(i=Promise))(function(n,c){function s(e){try{u(o.next(e))}catch(t){c(t)}}function r(e){try{u(o.throw(e))}catch(t){c(t)}}function u(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,r)}u((o=o.apply(e,t||[])).next())})},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createDeviceStore=void 0;const i=t(require("firebase/app")),o=i.default.database.ServerValue.TIMESTAMP,n=(t,i,n)=>{const c=t.database().ref(`devices/${i}`),s=c.child("subscriptions").push().key,r=c.child(`clients/${s}`);let u=[];const a=(e,t)=>c.child(e).set(t),l=(e,t)=>c.child(e).update(t),d=(e="value",t,i)=>{const o=c.child(t).on(e,e=>{i(e.val(),e)});return u.push(()=>{c.child(t).off(e,o)}),o},v=(e,t,i)=>{i?c.child(e).off(t,i):c.child(e).off(t)},f=t.database().ref(".info/connected").on("value",e=>{e.val()&&r.onDisconnect().remove().then(()=>{r.set(o),l("subscriptions",n.get()).then(()=>{n.toList().forEach(e=>{const t=`subscriptions/${e.id}`;c.child(t).onDisconnect().remove()})})})});return u.push(()=>{t.database().ref(".info/connected").off("value",f)}),{set:a,once:(t,i="value")=>e(void 0,void 0,void 0,function*(){return(yield c.child(t).once(i)).val()}),update:l,lastOfChildValue:(t,i,o)=>e(void 0,void 0,void 0,function*(){const e=(yield c.child(t).orderByChild(i).equalTo(o).limitToLast(1).once("value")).val(),[n]=Object.values(e||{});return n||null}),onNamespace:(e,t)=>d("value",e,e=>{t(e)}),offNamespace:(e,t)=>{v(e,"value",t)},dispatchAction:t=>e(void 0,void 0,void 0,function*(){const e=yield((e,t)=>c.child(e).push(t))("actions",t),i=e.key,o=`actions/${i}`;if(e.onDisconnect().remove(),t.responseRequired){const i=t.responseTimeout||6e5,n=new Promise((t,o)=>{const n=setTimeout(()=>{clearTimeout(n),e.remove(),o(`Action response timed out in ${i}ms.`)},i)}),c=new Promise(e=>{((e,t,i,o)=>{d(e,t,n=>{null!==n&&(v(t,e),i(o||n))})})("value",`${o}/response`,e)});return Promise.race([c,n])}return i}),nextMetric:(t,i)=>e(void 0,void 0,void 0,function*(){a(`metrics/${t}`,i)}),onMetric:(e,t)=>{const{atomic:i,metric:o,labels:n}=e,c=i?`metrics/${o}`:`metrics/${o}/${n[0]}`;return d("value",c,e=>{null!==e&&t(e)})},subscribeToMetric:e=>{const t=c.child("subscriptions").push().key,i=`subscriptions/${t}`,o=Object.assign({id:t,clientId:s},e);return a(i,o),c.child(i).onDisconnect().remove(),o},unsubscribeFromMetric:e=>{(e=>{c.child(e).remove()})(`subscriptions/${e.id}`)},removeMetricListener(e,t){const{atomic:i,metric:o,labels:n}=e,c=i?`metrics/${o}`:`metrics/${o}/${n[0]}`;v(c,"value",t)},disconnect(){r.remove(),u.forEach(e=>{e()}),n.toList().filter(e=>e.clientId===s).forEach(e=>{const t=`subscriptions/${e.id}`;c.child(t).remove()})}}};exports.createDeviceStore=n;
9
9
  },{}],"KzOJ":[function(require,module,exports) {
10
- "use strict";var e=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{d(r.next(e))}catch(t){o(t)}}function c(e){try{d(r.throw(e))}catch(t){o(t)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,c)}d((r=r.apply(e,t||[])).next())})},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FirebaseDevice=void 0;const i=t(require("firebase/compat/app")),r=require("./deviceStore"),n=i.default.database.ServerValue.TIMESTAMP;class o{constructor({deviceId:e,firebaseApp:t,dependencies:i}){if(!e)throw new Error("No Device ID provided.");this.deviceId=e,this.app=t.app,this.deviceStore=(0,r.createDeviceStore)(this.app,e,i.subscriptionManager)}get timestamp(){return n}dispatchAction(e){return this.deviceStore.dispatchAction(e)}getInfo(){return e(this,void 0,void 0,function*(){return yield this.deviceStore.once("info")})}onNamespace(e,t){return this.deviceStore.onNamespace(e,t)}onceNamespace(t){return e(this,void 0,void 0,function*(){return yield this.deviceStore.once(t)})}offNamespace(e,t){this.deviceStore.offNamespace(e,t)}getTimesync(){return e(this,void 0,void 0,function*(){return(yield this.dispatchAction({command:"timesync",action:"get",responseRequired:!0,responseTimeout:250})).timestamp})}nextMetric(e,t){this.deviceStore.nextMetric(e,t)}onMetric(e,t){return this.deviceStore.onMetric(e,t)}subscribeToMetric(e){return this.deviceStore.subscribeToMetric(Object.assign(Object.assign({},e),{serverType:o.serverType}))}unsubscribeFromMetric(e){this.deviceStore.unsubscribeFromMetric(e)}removeMetricListener(e,t){this.deviceStore.removeMetricListener(e,t)}changeSettings(t){return e(this,void 0,void 0,function*(){return this.deviceStore.update("settings",t)})}getSkill(t){return e(this,void 0,void 0,function*(){return yield this.deviceStore.lastOfChildValue("skills","bundleId",t)})}createBluetoothToken(){var t;return e(this,void 0,void 0,function*(){const[e,i]=yield this.app.functions().httpsCallable("createBluetoothToken")({deviceId:this.deviceId}).then(({data:e})=>[null,null==e?void 0:e.token]).catch(e=>[e,null]);return e?Promise.reject(null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e):i||Promise.reject("Failed to create Bluetooth token.")})}disconnect(){this.deviceStore.disconnect()}}exports.FirebaseDevice=o,o.serverType="firebase";
10
+ "use strict";var e=this&&this.__awaiter||function(e,t,i,r){return new(i||(i=Promise))(function(n,o){function s(e){try{d(r.next(e))}catch(t){o(t)}}function c(e){try{d(r.throw(e))}catch(t){o(t)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(s,c)}d((r=r.apply(e,t||[])).next())})},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FirebaseDevice=void 0;const i=t(require("firebase/app")),r=require("./deviceStore"),n=i.default.database.ServerValue.TIMESTAMP;class o{constructor({deviceId:e,firebaseApp:t,dependencies:i}){if(!e)throw new Error("No Device ID provided.");this.deviceId=e,this.app=t.app,this.deviceStore=(0,r.createDeviceStore)(this.app,e,i.subscriptionManager)}get timestamp(){return n}dispatchAction(e){return this.deviceStore.dispatchAction(e)}getInfo(){return e(this,void 0,void 0,function*(){return yield this.deviceStore.once("info")})}onNamespace(e,t){return this.deviceStore.onNamespace(e,t)}onceNamespace(t){return e(this,void 0,void 0,function*(){return yield this.deviceStore.once(t)})}offNamespace(e,t){this.deviceStore.offNamespace(e,t)}getTimesync(){return e(this,void 0,void 0,function*(){return(yield this.dispatchAction({command:"timesync",action:"get",responseRequired:!0,responseTimeout:250})).timestamp})}nextMetric(e,t){this.deviceStore.nextMetric(e,t)}onMetric(e,t){return this.deviceStore.onMetric(e,t)}subscribeToMetric(e){return this.deviceStore.subscribeToMetric(Object.assign(Object.assign({},e),{serverType:o.serverType}))}unsubscribeFromMetric(e){this.deviceStore.unsubscribeFromMetric(e)}removeMetricListener(e,t){this.deviceStore.removeMetricListener(e,t)}changeSettings(t){return e(this,void 0,void 0,function*(){return this.deviceStore.update("settings",t)})}getSkill(t){return e(this,void 0,void 0,function*(){return yield this.deviceStore.lastOfChildValue("skills","bundleId",t)})}createBluetoothToken(){var t;return e(this,void 0,void 0,function*(){const[e,i]=yield this.app.functions().httpsCallable("createBluetoothToken")({deviceId:this.deviceId}).then(({data:e})=>[null,null==e?void 0:e.token]).catch(e=>[e,null]);return e?Promise.reject(null!==(t=null==e?void 0:e.message)&&void 0!==t?t:e):i||Promise.reject("Failed to create Bluetooth token.")})}disconnect(){this.deviceStore.disconnect()}}exports.FirebaseDevice=o,o.serverType="firebase";
11
11
  },{"./deviceStore":"mSvX"}],"kM30":[function(require,module,exports) {
12
12
  "use strict";var e=this&&this.__createBinding||(Object.create?function(e,r,t,i){void 0===i&&(i=t);var o=Object.getOwnPropertyDescriptor(r,t);o&&("get"in o?r.__esModule:!o.writable&&!o.configurable)||(o={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,i,o)}:function(e,r,t,i){void 0===i&&(i=t),e[i]=r[t]}),r=this&&this.__exportStar||function(r,t){for(var i in r)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||e(t,r,i)};Object.defineProperty(exports,"__esModule",{value:!0}),r(require("./FirebaseApp"),exports),r(require("./FirebaseUser"),exports),r(require("./FirebaseDevice"),exports);
13
13
  },{"./FirebaseApp":"OERo","./FirebaseUser":"Cc51","./FirebaseDevice":"KzOJ"}],"s7Vt":[function(require,module,exports) {
@@ -25,7 +25,7 @@ process.env.HMR_PORT=0;process.env.HMR_HOSTNAME="localhost";parcelRequire=functi
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) {
28
- "use strict";var e=this&&this.__awaiter||function(e,i,t,s){return new(t||(t=Promise))(function(r,n){function c(e){try{a(s.next(e))}catch(i){n(i)}}function o(e){try{a(s.throw(e))}catch(i){n(i)}}function a(e){var i;e.done?r(e.value):(i=e.value,i instanceof t?i:new t(function(e){e(i)})).then(c,o)}a((s=s.apply(e,i||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CloudClient=exports.SERVER_TIMESTAMP=exports.createUser=exports.credentialWithLink=void 0;const i=require("rxjs"),t=require("rxjs"),s=require("rxjs/operators"),r=require("./firebase"),n=require("../timesync"),c=require("../subscriptions/SubscriptionManager"),o=require("../utils/heartbeat"),a=require("../utils/filterInternalKeys");var u=require("./firebase");Object.defineProperty(exports,"credentialWithLink",{enumerable:!0,get:function(){return u.credentialWithLink}}),Object.defineProperty(exports,"createUser",{enumerable:!0,get:function(){return u.createUser}}),Object.defineProperty(exports,"SERVER_TIMESTAMP",{enumerable:!0,get:function(){return u.SERVER_TIMESTAMP}});class h{constructor(e){this._selectedDevice=new i.ReplaySubject(1),this.options=e,this.subscriptionManager=new c.SubscriptionManager,this.firebaseApp=new r.FirebaseApp(e),this.firebaseUser=new r.FirebaseUser(this.firebaseApp),this._selectedDevice.next(void 0),this.status$=(0,o.heartbeatAwareStatus)(this.observeNamespace("status").pipe((0,s.share)())).pipe((0,a.filterInternalKeys)(),(0,s.shareReplay)(1)),this.osVersion$=this.observeNamespace("info/osVersion").pipe((0,s.shareReplay)(1)),this.firebaseUser.onAuthStateChanged().subscribe(e=>{this.user=e}),this.firebaseUser.onUserClaimsChange().subscribe(e=>{this.userClaims=e}),this.onDeviceChange().subscribe(e=>{this.firebaseDevice&&this.firebaseDevice.disconnect(),e&&(this.firebaseDevice=new r.FirebaseDevice({deviceId:e.deviceId,firebaseApp:this.firebaseApp,dependencies:{subscriptionManager:this.subscriptionManager}}),this.options.timesync&&(this.timesync=new n.Timesync({status$:this.status(),getTimesync:this.firebaseDevice.getTimesync.bind(this.firebaseDevice)})))})}onDeviceChange(){return this._selectedDevice.asObservable().pipe((0,s.filter)(e=>void 0!==e))}osVersion(){return this.osVersion$}setAutoSelectedDevice(){return e(this,void 0,void 0,function*(){return this.options.deviceId?yield this.selectDevice(e=>e.find(e=>e.deviceId===this.options.deviceId)):!this.options.deviceId&&this.options.autoSelectDevice?yield this.selectDevice(e=>e[0]):null})}get actions(){return{dispatch:e=>this.firebaseDevice.dispatchAction(e)}}dispatchAction(i){return e(this,void 0,void 0,function*(){return yield this.firebaseDevice.dispatchAction(i)})}disconnect(){return e(this,void 0,void 0,function*(){return this.firebaseApp.disconnect()})}getInfo(){return e(this,void 0,void 0,function*(){return yield this.firebaseDevice.getInfo()})}login(i){return e(this,void 0,void 0,function*(){if(this.user)return Promise.reject("Already logged in.");const e=yield this.firebaseUser.login(i),t=yield this.setAutoSelectedDevice();return Object.assign(Object.assign({},e),{selectedDevice:t})})}logout(){return e(this,void 0,void 0,function*(){return this.firebaseDevice&&this.firebaseDevice.disconnect(),yield this.firebaseUser.logout()})}onAuthStateChanged(){return this.firebaseUser.onAuthStateChanged().pipe((0,s.switchMap)(i=>e(this,void 0,void 0,function*(){if(!i)return null;const e=this.didSelectDevice()?yield this.getSelectedDevice():yield this.setAutoSelectedDevice();return Object.assign(Object.assign({},i),{selectedDevice:e})})))}getDevices(){return this.firebaseUser.getDevices()}addDevice(e){return this.firebaseUser.addDevice(e)}removeDevice(i){return e(this,void 0,void 0,function*(){const[e,t]=yield this.firebaseUser.removeDevice(i).then(()=>[!1]).catch(e=>[!0,e]);if(e)return Promise.reject(t);const s=yield this.getSelectedDevice();(null==s?void 0:s.deviceId)===i&&this._selectedDevice.next(null)})}transferDevice(i){return e(this,void 0,void 0,function*(){const[e,t]=yield this.firebaseUser.transferDevice(i).then(()=>[!1]).catch(e=>[!0,e]);if(e)return Promise.reject(t);const s=yield this.getSelectedDevice();(null==s?void 0:s.deviceId)===i.deviceId&&this._selectedDevice.next(null)})}onUserDevicesChange(){return this.firebaseUser.onUserDevicesChange()}onUserClaimsChange(){return this.firebaseUser.onUserClaimsChange()}didSelectDevice(){return e(this,void 0,void 0,function*(){return!!(yield this.getSelectedDevice())})}selectDevice(i){return e(this,void 0,void 0,function*(){const e=yield this.getDevices();if(!e)return Promise.reject("Did not find any devices for this user. Make sure your device is claimed by your Neurosity account.");const t="function"==typeof i?i(e):(e=>e.find(e=>{if(!Array.isArray(i))return!1;const[t,s]=i;return JSON.stringify(null==e?void 0:e[t])===JSON.stringify(s)}))(e);return t?(yield this.firebaseUser.hasDevicePermission(t.deviceId))?(this._selectedDevice.next(t),t):Promise.reject("Rejected device access due to permissions."):Promise.reject("A device was not provided. Try returning a device from the devicesList provided in the callback.")})}getSelectedDevice(){return e(this,void 0,void 0,function*(){return yield(0,t.firstValueFrom)(this._selectedDevice)})}status(){return this.status$}observeNamespace(e){const r=()=>(0,t.fromEventPattern)(i=>this.firebaseDevice.onNamespace(e,i),i=>this.firebaseDevice.offNamespace(e,i));return this.onDeviceChange().pipe((0,s.switchMap)(e=>e?r():i.EMPTY))}onceNamespace(i){return e(this,void 0,void 0,function*(){return yield this.firebaseDevice.onceNamespace(i)})}get metrics(){return{next:(e,i)=>{this.firebaseDevice.nextMetric(e,i)},on:(e,i)=>this.firebaseDevice.onMetric(e,i),subscribe:e=>{const i=this.firebaseDevice.subscribeToMetric(e);return this.subscriptionManager.add(i),i},unsubscribe:(e,i)=>{this.subscriptionManager.remove(e),this.firebaseDevice.unsubscribeFromMetric(e),this.firebaseDevice.removeMetricListener(e,i)}}}createAccount(e){return this.firebaseUser.createAccount(e)}deleteAccount(){return this.firebaseUser.deleteAccount()}createBluetoothToken(){return this.firebaseDevice.createBluetoothToken()}createCustomToken(){return this.firebaseUser.createCustomToken()}removeOAuthAccess(){return this.firebaseUser.removeOAuthAccess()}onUserExperiments(){return this.firebaseUser.onUserExperiments()}deleteUserExperiment(e){return this.firebaseUser.deleteUserExperiment(e)}get skills(){return{get:i=>e(this,void 0,void 0,function*(){return this.firebaseDevice.getSkill(i)})}}get timestamp(){return this.options.timesync?this.timesync.timestamp:Date.now()}getTimesyncOffset(){return this.timesync.offset}changeSettings(e){return this.firebaseDevice.changeSettings(e)}goOffline(){this.firebaseApp.goOffline()}goOnline(){this.firebaseApp.goOnline()}__getApp(){return this.firebaseApp.app}}exports.CloudClient=h;
28
+ "use strict";var e=this&&this.__awaiter||function(e,i,t,s){return new(t||(t=Promise))(function(r,n){function c(e){try{a(s.next(e))}catch(i){n(i)}}function o(e){try{a(s.throw(e))}catch(i){n(i)}}function a(e){var i;e.done?r(e.value):(i=e.value,i instanceof t?i:new t(function(e){e(i)})).then(c,o)}a((s=s.apply(e,i||[])).next())})};Object.defineProperty(exports,"__esModule",{value:!0}),exports.CloudClient=exports.SERVER_TIMESTAMP=exports.createUser=exports.credentialWithLink=void 0;const i=require("rxjs"),t=require("rxjs"),s=require("rxjs/operators"),r=require("./firebase"),n=require("../timesync"),c=require("../subscriptions/SubscriptionManager"),o=require("../utils/heartbeat"),a=require("../utils/filterInternalKeys");var u=require("./firebase");Object.defineProperty(exports,"credentialWithLink",{enumerable:!0,get:function(){return u.credentialWithLink}}),Object.defineProperty(exports,"createUser",{enumerable:!0,get:function(){return u.createUser}}),Object.defineProperty(exports,"SERVER_TIMESTAMP",{enumerable:!0,get:function(){return u.SERVER_TIMESTAMP}});class h{constructor(e){this._selectedDevice=new i.ReplaySubject(1),this.options=e,this.subscriptionManager=new c.SubscriptionManager,this.firebaseApp=new r.FirebaseApp(e),this.firebaseUser=new r.FirebaseUser(this.firebaseApp),this._selectedDevice.next(void 0),this.status$=(0,o.heartbeatAwareStatus)(this.observeNamespace("status").pipe((0,s.share)())).pipe((0,a.filterInternalKeys)(),(0,s.shareReplay)(1)),this.osVersion$=this.observeNamespace("info/osVersion").pipe((0,s.shareReplay)(1)),this.firebaseUser.onAuthStateChanged().subscribe(e=>{this.user=e}),this.firebaseUser.onUserClaimsChange().subscribe(e=>{this.userClaims=e}),this.onDeviceChange().subscribe(e=>{this.firebaseDevice&&this.firebaseDevice.disconnect(),e&&(this.firebaseDevice=new r.FirebaseDevice({deviceId:e.deviceId,firebaseApp:this.firebaseApp,dependencies:{subscriptionManager:this.subscriptionManager}}),this.options.timesync&&(this.timesync=new n.Timesync({status$:this.status(),getTimesync:this.firebaseDevice.getTimesync.bind(this.firebaseDevice)})))})}onDeviceChange(){return this._selectedDevice.asObservable().pipe((0,s.filter)(e=>void 0!==e))}osVersion(){return this.osVersion$}setAutoSelectedDevice(){return e(this,void 0,void 0,function*(){return this.options.deviceId?yield this.selectDevice(e=>e.find(e=>e.deviceId===this.options.deviceId)):!this.options.deviceId&&this.options.autoSelectDevice?yield this.selectDevice(e=>e[0]):null})}get actions(){return{dispatch:e=>this.firebaseDevice.dispatchAction(e)}}dispatchAction(i){return e(this,void 0,void 0,function*(){return yield this.firebaseDevice.dispatchAction(i)})}disconnect(){return e(this,void 0,void 0,function*(){return this.firebaseApp.disconnect()})}getInfo(){return e(this,void 0,void 0,function*(){return yield this.firebaseDevice.getInfo()})}login(i){return e(this,void 0,void 0,function*(){if(this.user)return Promise.reject("Already logged in.");const e=yield this.firebaseUser.login(i),t=yield this.setAutoSelectedDevice();return Object.assign(Object.assign({},e),{selectedDevice:t})})}logout(){return e(this,void 0,void 0,function*(){return this.firebaseDevice&&this.firebaseDevice.disconnect(),yield this.firebaseUser.logout()})}onAuthStateChanged(){return this.firebaseUser.onAuthStateChanged().pipe((0,s.switchMap)(i=>e(this,void 0,void 0,function*(){if(!i)return null;const e=this.didSelectDevice()?yield this.getSelectedDevice():yield this.setAutoSelectedDevice();return Object.assign(i,{selectedDevice:e})})))}getDevices(){return this.firebaseUser.getDevices()}addDevice(e){return this.firebaseUser.addDevice(e)}removeDevice(i){return e(this,void 0,void 0,function*(){const[e,t]=yield this.firebaseUser.removeDevice(i).then(()=>[!1]).catch(e=>[!0,e]);if(e)return Promise.reject(t);const s=yield this.getSelectedDevice();(null==s?void 0:s.deviceId)===i&&this._selectedDevice.next(null)})}transferDevice(i){return e(this,void 0,void 0,function*(){const[e,t]=yield this.firebaseUser.transferDevice(i).then(()=>[!1]).catch(e=>[!0,e]);if(e)return Promise.reject(t);const s=yield this.getSelectedDevice();(null==s?void 0:s.deviceId)===i.deviceId&&this._selectedDevice.next(null)})}onUserDevicesChange(){return this.firebaseUser.onUserDevicesChange()}onUserClaimsChange(){return this.firebaseUser.onUserClaimsChange()}didSelectDevice(){return e(this,void 0,void 0,function*(){return!!(yield this.getSelectedDevice())})}selectDevice(i){return e(this,void 0,void 0,function*(){const e=yield this.getDevices();if(!e)return Promise.reject("Did not find any devices for this user. Make sure your device is claimed by your Neurosity account.");const t="function"==typeof i?i(e):(e=>e.find(e=>{if(!Array.isArray(i))return!1;const[t,s]=i;return JSON.stringify(null==e?void 0:e[t])===JSON.stringify(s)}))(e);return t?(yield this.firebaseUser.hasDevicePermission(t.deviceId))?(this._selectedDevice.next(t),t):Promise.reject("Rejected device access due to permissions."):Promise.reject("A device was not provided. Try returning a device from the devicesList provided in the callback.")})}getSelectedDevice(){return e(this,void 0,void 0,function*(){return yield(0,t.firstValueFrom)(this._selectedDevice)})}status(){return this.status$}observeNamespace(e){const r=()=>(0,t.fromEventPattern)(i=>this.firebaseDevice.onNamespace(e,i),i=>this.firebaseDevice.offNamespace(e,i));return this.onDeviceChange().pipe((0,s.switchMap)(e=>e?r():i.EMPTY))}onceNamespace(i){return e(this,void 0,void 0,function*(){return yield this.firebaseDevice.onceNamespace(i)})}get metrics(){return{next:(e,i)=>{this.firebaseDevice.nextMetric(e,i)},on:(e,i)=>this.firebaseDevice.onMetric(e,i),subscribe:e=>{const i=this.firebaseDevice.subscribeToMetric(e);return this.subscriptionManager.add(i),i},unsubscribe:(e,i)=>{this.subscriptionManager.remove(e),this.firebaseDevice.unsubscribeFromMetric(e),this.firebaseDevice.removeMetricListener(e,i)}}}createAccount(e){return this.firebaseUser.createAccount(e)}deleteAccount(){return this.firebaseUser.deleteAccount()}createBluetoothToken(){return this.firebaseDevice.createBluetoothToken()}createCustomToken(){return this.firebaseUser.createCustomToken()}removeOAuthAccess(){return this.firebaseUser.removeOAuthAccess()}onUserExperiments(){return this.firebaseUser.onUserExperiments()}deleteUserExperiment(e){return this.firebaseUser.deleteUserExperiment(e)}get skills(){return{get:i=>e(this,void 0,void 0,function*(){return this.firebaseDevice.getSkill(i)})}}get timestamp(){return this.options.timesync?this.timesync.timestamp:Date.now()}getTimesyncOffset(){return this.timesync.offset}changeSettings(e){return this.firebaseDevice.changeSettings(e)}goOffline(){this.firebaseApp.goOffline()}goOnline(){this.firebaseApp.goOnline()}__getApp(){return this.firebaseApp.app}}exports.CloudClient=h;
29
29
  },{"./firebase":"kM30","../timesync":"CXqr","../subscriptions/SubscriptionManager":"BX8M","../utils/heartbeat":"ImaE","../utils/filterInternalKeys":"qny3"}],"rekm":[function(require,module,exports) {
30
30
  "use strict";var t,o;Object.defineProperty(exports,"__esModule",{value:!0}),exports.STREAMING_MODE=exports.STREAMING_TYPE=void 0,function(t){t.WIFI="wifi",t.BLUETOOTH="bluetooth"}(t=exports.STREAMING_TYPE||(exports.STREAMING_TYPE={})),function(t){t.WIFI_ONLY="wifi-only",t.WIFI_WITH_BLUETOOTH_FALLBACK="wifi-with-bluetooth-fallback",t.BLUETOOTH_WITH_WIFI_FALLBACK="bluetooth-with-wifi-fallback"}(o=exports.STREAMING_MODE||(exports.STREAMING_MODE={}));
31
31
  },{}],"WDyG":[function(require,module,exports) {