dexie-cloud-addon 4.0.1-beta.54 → 4.0.1-beta.56

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.
@@ -11,6 +11,13 @@ import { Invite } from './Invite';
11
11
  import { BehaviorSubject, Observable } from 'rxjs';
12
12
  /** The API of db.cloud, where `db` is an instance of Dexie with dexie-cloud-addon active.
13
13
  */
14
+ export interface LoginHints {
15
+ email?: string;
16
+ userId?: string;
17
+ grant_type?: 'demo' | 'otp';
18
+ otpId?: string;
19
+ otp?: string;
20
+ }
14
21
  export interface DexieCloudAPI {
15
22
  version: string;
16
23
  options: DexieCloudOptions | null;
@@ -36,11 +43,7 @@ export interface DexieCloudAPI {
36
43
  * @param userId Optional userId to authenticate
37
44
  * @param grant_type requested grant type
38
45
  */
39
- login(hint?: {
40
- email?: string;
41
- userId?: string;
42
- grant_type?: 'demo' | 'otp';
43
- }): Promise<void>;
46
+ login(hint?: LoginHints): Promise<void>;
44
47
  logout(options?: {
45
48
  force?: boolean;
46
49
  }): Promise<void>;
@@ -3,18 +3,11 @@ import { BehaviorSubject } from 'rxjs';
3
3
  import { DexieCloudDB } from '../db/DexieCloudDB';
4
4
  import { UserLogin } from '../db/entities/UserLogin';
5
5
  import { DXCUserInteraction } from '../types/DXCUserInteraction';
6
+ import { LoginHints } from '../DexieCloudAPI';
6
7
  export type FetchTokenCallback = (tokenParams: {
7
8
  public_key: string;
8
- hints?: {
9
- userId?: string;
10
- email?: string;
11
- grant_type?: string;
12
- };
9
+ hints?: LoginHints;
13
10
  }) => Promise<TokenFinalResponse | TokenErrorResponse>;
14
11
  export declare function loadAccessToken(db: DexieCloudDB): Promise<UserLogin | null>;
15
- export declare function authenticate(url: string, context: UserLogin, fetchToken: FetchTokenCallback, userInteraction: BehaviorSubject<DXCUserInteraction | undefined>, hints?: {
16
- userId?: string;
17
- email?: string;
18
- grant_type?: string;
19
- }): Promise<UserLogin>;
12
+ export declare function authenticate(url: string, context: UserLogin, fetchToken: FetchTokenCallback, userInteraction: BehaviorSubject<DXCUserInteraction | undefined>, hints?: LoginHints): Promise<UserLogin>;
20
13
  export declare function refreshAccessToken(url: string, login: UserLogin): Promise<UserLogin>;
@@ -1,6 +1,3 @@
1
1
  import { DexieCloudDB } from '../db/DexieCloudDB';
2
- export declare function login(db: DexieCloudDB, hints?: {
3
- email?: string;
4
- userId?: string;
5
- grant_type?: string;
6
- }): Promise<boolean>;
2
+ import { LoginHints } from '../DexieCloudAPI';
3
+ export declare function login(db: DexieCloudDB, hints?: LoginHints): Promise<boolean>;
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * ==========================================================================
10
10
  *
11
- * Version 4.0.1-beta.54, Mon Dec 18 2023
11
+ * Version 4.0.1-beta.56, Wed Jan 31 2024
12
12
  *
13
13
  * https://dexie.org
14
14
  *
@@ -2016,7 +2016,28 @@ function alertUser(userInteraction, title, ...alerts) {
2016
2016
  function promptForEmail(userInteraction, title, emailHint) {
2017
2017
  return __awaiter(this, void 0, void 0, function* () {
2018
2018
  let email = emailHint || '';
2019
- while (!email || !/^[\w-+.]+@([\w-]+\.)+[\w-]{2,10}$/.test(email)) {
2019
+ // Regular expression for email validation
2020
+ // ^[\w-+.]+@([\w-]+\.)+[\w-]{2,10}(\sas\s[\w-+.]+@([\w-]+\.)+[\w-]{2,10})?$
2021
+ //
2022
+ // ^[\w-+.]+ : Matches the start of the string. Allows one or more word characters
2023
+ // (a-z, A-Z, 0-9, and underscore), hyphen, plus, or dot.
2024
+ //
2025
+ // @ : Matches the @ symbol.
2026
+ // ([\w-]+\.)+ : Matches one or more word characters or hyphens followed by a dot.
2027
+ // The plus sign outside the parentheses means this pattern can repeat one or more times,
2028
+ // allowing for subdomains.
2029
+ // [\w-]{2,10} : Matches between 2 and 10 word characters or hyphens. This is typically for
2030
+ // the domain extension like .com, .net, etc.
2031
+ // (\sas\s[\w-+.]+@([\w-]+\.)+[\w-]{2,10})?$ : This part is optional (due to the ? at the end).
2032
+ // If present, it matches " as " followed by another valid email address. This allows for the
2033
+ // input to be either a single email address or two email addresses separated by " as ".
2034
+ //
2035
+ // The use case for "<email1> as <email2>"" is for when a database owner with full access to the
2036
+ // database needs to impersonate another user in the database in order to troubleshoot. This
2037
+ // format will only be possible to use when email1 is the owner of an API client with GLOBAL_READ
2038
+ // and GLOBAL_WRITE permissions on the database. The email will be checked on the server before
2039
+ // allowing it and giving out a token for email2, using the OTP sent to email1.
2040
+ while (!email || !/^[\w-+.]+@([\w-]+\.)+[\w-]{2,10}(\sas\s[\w-+.]+@([\w-]+\.)+[\w-]{2,10})?$/.test(email)) {
2020
2041
  email = (yield interactWithUser(userInteraction, {
2021
2042
  type: 'email',
2022
2043
  title,
@@ -2428,6 +2449,19 @@ function otpFetchTokenCallback(db) {
2428
2449
  demo_user,
2429
2450
  grant_type: 'demo',
2430
2451
  scopes: ['ACCESS_DB'],
2452
+ public_key
2453
+ };
2454
+ }
2455
+ else if ((hints === null || hints === void 0 ? void 0 : hints.otpId) && hints.otp) {
2456
+ // User provided OTP ID and OTP code. This means that the OTP email
2457
+ // has already gone out and the user may have clicked a magic link
2458
+ // in the email with otp and otpId in query and the app has picked
2459
+ // up those values and passed them to db.cloud.login().
2460
+ tokenRequest = {
2461
+ grant_type: 'otp',
2462
+ otp_id: hints.otpId,
2463
+ otp: hints.otp,
2464
+ scopes: ['ACCESS_DB'],
2431
2465
  public_key,
2432
2466
  };
2433
2467
  }
@@ -2437,7 +2471,6 @@ function otpFetchTokenCallback(db) {
2437
2471
  email,
2438
2472
  grant_type: 'otp',
2439
2473
  scopes: ['ACCESS_DB'],
2440
- public_key,
2441
2474
  };
2442
2475
  }
2443
2476
  const res1 = yield fetch(`${url}/token`, {
@@ -2461,28 +2494,27 @@ function otpFetchTokenCallback(db) {
2461
2494
  // Error can also be returned right away.
2462
2495
  return response;
2463
2496
  }
2464
- else if (tokenRequest.grant_type === 'otp') {
2497
+ else if (tokenRequest.grant_type === 'otp' && 'email' in tokenRequest) {
2465
2498
  if (response.type !== 'otp-sent')
2466
2499
  throw new Error(`Unexpected response from ${url}/token`);
2467
2500
  const otp = yield promptForOTP(userInteraction, tokenRequest.email);
2468
- tokenRequest.otp = otp || '';
2469
- tokenRequest.otp_id = response.otp_id;
2501
+ const tokenRequest2 = Object.assign(Object.assign({}, tokenRequest), { otp: otp || '', otp_id: response.otp_id });
2470
2502
  let res2 = yield fetch(`${url}/token`, {
2471
- body: JSON.stringify(tokenRequest),
2503
+ body: JSON.stringify(tokenRequest2),
2472
2504
  method: 'post',
2473
2505
  headers: { 'Content-Type': 'application/json' },
2474
2506
  mode: 'cors',
2475
2507
  });
2476
2508
  while (res2.status === 401) {
2477
2509
  const errorText = yield res2.text();
2478
- tokenRequest.otp = yield promptForOTP(userInteraction, tokenRequest.email, {
2510
+ tokenRequest2.otp = yield promptForOTP(userInteraction, tokenRequest.email, {
2479
2511
  type: 'error',
2480
2512
  messageCode: 'INVALID_OTP',
2481
2513
  message: errorText,
2482
2514
  messageParams: {}
2483
2515
  });
2484
2516
  res2 = yield fetch(`${url}/token`, {
2485
- body: JSON.stringify(tokenRequest),
2517
+ body: JSON.stringify(tokenRequest2),
2486
2518
  method: 'post',
2487
2519
  headers: { 'Content-Type': 'application/json' },
2488
2520
  mode: 'cors',
@@ -6232,7 +6264,7 @@ function dexieCloud(dexie) {
6232
6264
  const syncComplete = new Subject();
6233
6265
  dexie.cloud = {
6234
6266
  // @ts-ignore
6235
- version: "4.0.1-beta.54",
6267
+ version: "4.0.1-beta.56",
6236
6268
  options: Object.assign({}, DEFAULT_OPTIONS),
6237
6269
  schema: null,
6238
6270
  get currentUserId() {
@@ -6509,7 +6541,7 @@ function dexieCloud(dexie) {
6509
6541
  }
6510
6542
  }
6511
6543
  // @ts-ignore
6512
- dexieCloud.version = "4.0.1-beta.54";
6544
+ dexieCloud.version = "4.0.1-beta.56";
6513
6545
  Dexie.Cloud = dexieCloud;
6514
6546
 
6515
6547
  export { dexieCloud as default, dexieCloud, getTiedObjectId, getTiedRealmId, resolveText };