dexie-cloud-addon 4.0.1-beta.55 → 4.0.1-beta.57

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.55, Tue Jan 02 2024
11
+ * Version 4.0.1-beta.57, Wed Feb 14 2024
12
12
  *
13
13
  * https://dexie.org
14
14
  *
@@ -2452,6 +2452,19 @@
2452
2452
  demo_user,
2453
2453
  grant_type: 'demo',
2454
2454
  scopes: ['ACCESS_DB'],
2455
+ public_key
2456
+ };
2457
+ }
2458
+ else if ((hints === null || hints === void 0 ? void 0 : hints.otpId) && hints.otp) {
2459
+ // User provided OTP ID and OTP code. This means that the OTP email
2460
+ // has already gone out and the user may have clicked a magic link
2461
+ // in the email with otp and otpId in query and the app has picked
2462
+ // up those values and passed them to db.cloud.login().
2463
+ tokenRequest = {
2464
+ grant_type: 'otp',
2465
+ otp_id: hints.otpId,
2466
+ otp: hints.otp,
2467
+ scopes: ['ACCESS_DB'],
2455
2468
  public_key,
2456
2469
  };
2457
2470
  }
@@ -2461,7 +2474,6 @@
2461
2474
  email,
2462
2475
  grant_type: 'otp',
2463
2476
  scopes: ['ACCESS_DB'],
2464
- public_key,
2465
2477
  };
2466
2478
  }
2467
2479
  const res1 = yield fetch(`${url}/token`, {
@@ -2485,28 +2497,27 @@
2485
2497
  // Error can also be returned right away.
2486
2498
  return response;
2487
2499
  }
2488
- else if (tokenRequest.grant_type === 'otp') {
2500
+ else if (tokenRequest.grant_type === 'otp' && 'email' in tokenRequest) {
2489
2501
  if (response.type !== 'otp-sent')
2490
2502
  throw new Error(`Unexpected response from ${url}/token`);
2491
2503
  const otp = yield promptForOTP(userInteraction, tokenRequest.email);
2492
- tokenRequest.otp = otp || '';
2493
- tokenRequest.otp_id = response.otp_id;
2504
+ const tokenRequest2 = Object.assign(Object.assign({}, tokenRequest), { otp: otp || '', otp_id: response.otp_id, public_key });
2494
2505
  let res2 = yield fetch(`${url}/token`, {
2495
- body: JSON.stringify(tokenRequest),
2506
+ body: JSON.stringify(tokenRequest2),
2496
2507
  method: 'post',
2497
2508
  headers: { 'Content-Type': 'application/json' },
2498
2509
  mode: 'cors',
2499
2510
  });
2500
2511
  while (res2.status === 401) {
2501
2512
  const errorText = yield res2.text();
2502
- tokenRequest.otp = yield promptForOTP(userInteraction, tokenRequest.email, {
2513
+ tokenRequest2.otp = yield promptForOTP(userInteraction, tokenRequest.email, {
2503
2514
  type: 'error',
2504
2515
  messageCode: 'INVALID_OTP',
2505
2516
  message: errorText,
2506
2517
  messageParams: {}
2507
2518
  });
2508
2519
  res2 = yield fetch(`${url}/token`, {
2509
- body: JSON.stringify(tokenRequest),
2520
+ body: JSON.stringify(tokenRequest2),
2510
2521
  method: 'post',
2511
2522
  headers: { 'Content-Type': 'application/json' },
2512
2523
  mode: 'cors',
@@ -3611,7 +3622,7 @@
3611
3622
  const res = yield fetch(`${databaseUrl}/sync`, {
3612
3623
  method: 'post',
3613
3624
  headers,
3614
- credentials: 'include',
3625
+ credentials: 'include', // For Arr Affinity cookie only, for better Rate-Limit counting only.
3615
3626
  body: TSON.stringify(syncRequest),
3616
3627
  });
3617
3628
  //const contentLength = Number(res.headers.get('content-length'));
@@ -5575,7 +5586,7 @@
5575
5586
  retryPurpose = null;
5576
5587
  syncIfPossible(db, cloudOptions, cloudSchema, {
5577
5588
  cancelToken,
5578
- retryImmediatelyOnFetchError: true,
5589
+ retryImmediatelyOnFetchError: true, // workaround for "net::ERR_NETWORK_CHANGED" in chrome.
5579
5590
  purpose: combPurpose,
5580
5591
  }).catch((e) => {
5581
5592
  console.error('error in syncIfPossible()', e);
@@ -6256,7 +6267,7 @@
6256
6267
  const syncComplete = new rxjs.Subject();
6257
6268
  dexie.cloud = {
6258
6269
  // @ts-ignore
6259
- version: "4.0.1-beta.55",
6270
+ version: "4.0.1-beta.57",
6260
6271
  options: Object.assign({}, DEFAULT_OPTIONS),
6261
6272
  schema: null,
6262
6273
  get currentUserId() {
@@ -6533,7 +6544,7 @@
6533
6544
  }
6534
6545
  }
6535
6546
  // @ts-ignore
6536
- dexieCloud.version = "4.0.1-beta.55";
6547
+ dexieCloud.version = "4.0.1-beta.57";
6537
6548
  Dexie.Cloud = dexieCloud;
6538
6549
 
6539
6550
  exports.default = dexieCloud;