@logto/browser 2.0.0 → 2.1.0

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.
package/lib/cache.cjs ADDED
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ const keyPrefix = `logto_cache`;
4
+ class CacheStorage {
5
+ constructor(appId) {
6
+ this.appId = appId;
7
+ }
8
+ getKey(item) {
9
+ if (item === undefined) {
10
+ return `${keyPrefix}:${this.appId}`;
11
+ }
12
+ return `${keyPrefix}:${this.appId}:${item}`;
13
+ }
14
+ async getItem(key) {
15
+ return sessionStorage.getItem(this.getKey(key));
16
+ }
17
+ async setItem(key, value) {
18
+ sessionStorage.setItem(this.getKey(key), value);
19
+ }
20
+ async removeItem(key) {
21
+ sessionStorage.removeItem(`${this.getKey(key)}`);
22
+ }
23
+ }
24
+
25
+ exports.CacheStorage = CacheStorage;
package/lib/cache.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { Storage, CacheKey } from '@logto/client';
2
+ import type { Nullable } from '@silverhand/essentials';
3
+ export declare class CacheStorage implements Storage<CacheKey> {
4
+ readonly appId: string;
5
+ constructor(appId: string);
6
+ getKey(item?: string): string;
7
+ getItem(key: CacheKey): Promise<Nullable<string>>;
8
+ setItem(key: CacheKey, value: string): Promise<void>;
9
+ removeItem(key: CacheKey): Promise<void>;
10
+ }
package/lib/cache.js ADDED
@@ -0,0 +1,23 @@
1
+ const keyPrefix = `logto_cache`;
2
+ class CacheStorage {
3
+ constructor(appId) {
4
+ this.appId = appId;
5
+ }
6
+ getKey(item) {
7
+ if (item === undefined) {
8
+ return `${keyPrefix}:${this.appId}`;
9
+ }
10
+ return `${keyPrefix}:${this.appId}:${item}`;
11
+ }
12
+ async getItem(key) {
13
+ return sessionStorage.getItem(this.getKey(key));
14
+ }
15
+ async setItem(key, value) {
16
+ sessionStorage.setItem(this.getKey(key), value);
17
+ }
18
+ async removeItem(key) {
19
+ sessionStorage.removeItem(`${this.getKey(key)}`);
20
+ }
21
+ }
22
+
23
+ export { CacheStorage };
@@ -0,0 +1 @@
1
+ export {};
package/lib/index.cjs CHANGED
@@ -3,6 +3,8 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var BaseClient = require('@logto/client');
6
+ var essentials = require('@silverhand/essentials');
7
+ var cache = require('./cache.cjs');
6
8
  var storage = require('./storage.cjs');
7
9
  var generators = require('./utils/generators.cjs');
8
10
 
@@ -14,12 +16,18 @@ const navigate = (url) => {
14
16
  window.location.assign(url);
15
17
  };
16
18
  class LogtoClient extends BaseClient__default.default {
17
- constructor(config) {
19
+ /**
20
+ * @param config The configuration object for the client.
21
+ * @param [unstable_enableCache=false] Whether to enable cache for well-known data.
22
+ * Use sessionStorage by default.
23
+ */
24
+ constructor(config, unstable_enableCache = false) {
18
25
  const requester = BaseClient.createRequester(fetch);
19
26
  super(config, {
20
27
  requester,
21
28
  navigate,
22
29
  storage: new storage.BrowserStorage(config.appId),
30
+ unstable_cache: essentials.conditional(unstable_enableCache && new cache.CacheStorage(config.appId)),
23
31
  generateCodeChallenge: generators.generateCodeChallenge,
24
32
  generateCodeVerifier: generators.generateCodeVerifier,
25
33
  generateState: generators.generateState,
package/lib/index.d.ts CHANGED
@@ -3,5 +3,10 @@ import BaseClient from '@logto/client';
3
3
  export type { IdTokenClaims, LogtoErrorCode, LogtoConfig, LogtoClientErrorCode, UserInfoResponse, InteractionMode, } from '@logto/client';
4
4
  export { LogtoError, OidcError, Prompt, LogtoRequestError, LogtoClientError, ReservedScope, UserScope, } from '@logto/client';
5
5
  export default class LogtoClient extends BaseClient {
6
- constructor(config: LogtoConfig);
6
+ /**
7
+ * @param config The configuration object for the client.
8
+ * @param [unstable_enableCache=false] Whether to enable cache for well-known data.
9
+ * Use sessionStorage by default.
10
+ */
11
+ constructor(config: LogtoConfig, unstable_enableCache?: boolean);
7
12
  }
package/lib/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import BaseClient, { createRequester } from '@logto/client';
2
2
  export { LogtoClientError, LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope } from '@logto/client';
3
+ import { conditional } from '@silverhand/essentials';
4
+ import { CacheStorage } from './cache.js';
3
5
  import { BrowserStorage } from './storage.js';
4
6
  import { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators.js';
5
7
 
@@ -7,12 +9,18 @@ const navigate = (url) => {
7
9
  window.location.assign(url);
8
10
  };
9
11
  class LogtoClient extends BaseClient {
10
- constructor(config) {
12
+ /**
13
+ * @param config The configuration object for the client.
14
+ * @param [unstable_enableCache=false] Whether to enable cache for well-known data.
15
+ * Use sessionStorage by default.
16
+ */
17
+ constructor(config, unstable_enableCache = false) {
11
18
  const requester = createRequester(fetch);
12
19
  super(config, {
13
20
  requester,
14
21
  navigate,
15
22
  storage: new BrowserStorage(config.appId),
23
+ unstable_cache: conditional(unstable_enableCache && new CacheStorage(config.appId)),
16
24
  generateCodeChallenge,
17
25
  generateCodeVerifier,
18
26
  generateState,
package/lib/storage.cjs CHANGED
@@ -1,31 +1,37 @@
1
1
  'use strict';
2
2
 
3
- const logtoStorageItemKeyPrefix = `logto`;
3
+ const keyPrefix = `logto`;
4
4
  class BrowserStorage {
5
5
  constructor(appId) {
6
- this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;
6
+ this.appId = appId;
7
+ }
8
+ getKey(item) {
9
+ if (item === undefined) {
10
+ return `${keyPrefix}:${this.appId}`;
11
+ }
12
+ return `${keyPrefix}:${this.appId}:${item}`;
7
13
  }
8
14
  async getItem(key) {
9
15
  if (key === 'signInSession') {
10
- return sessionStorage.getItem(this.storageKey);
16
+ // The latter `getItem()` is for backward compatibility. Can be removed when major bump.
17
+ return sessionStorage.getItem(this.getKey(key)) ?? sessionStorage.getItem(this.getKey());
11
18
  }
12
- return localStorage.getItem(`${this.storageKey}:${key}`);
19
+ return localStorage.getItem(this.getKey(key));
13
20
  }
14
21
  async setItem(key, value) {
15
22
  if (key === 'signInSession') {
16
- sessionStorage.setItem(this.storageKey, value);
23
+ sessionStorage.setItem(this.getKey(key), value);
17
24
  return;
18
25
  }
19
- localStorage.setItem(`${this.storageKey}:${key}`, value);
26
+ localStorage.setItem(this.getKey(key), value);
20
27
  }
21
28
  async removeItem(key) {
22
29
  if (key === 'signInSession') {
23
- sessionStorage.removeItem(this.storageKey);
30
+ sessionStorage.removeItem(this.getKey(key));
24
31
  return;
25
32
  }
26
- localStorage.removeItem(`${this.storageKey}:${key}`);
33
+ localStorage.removeItem(this.getKey(key));
27
34
  }
28
35
  }
29
36
 
30
37
  exports.BrowserStorage = BrowserStorage;
31
- exports.logtoStorageItemKeyPrefix = logtoStorageItemKeyPrefix;
package/lib/storage.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import type { Storage, StorageKey } from '@logto/client';
2
2
  import type { Nullable } from '@silverhand/essentials';
3
- export declare const logtoStorageItemKeyPrefix = "logto";
4
- export declare class BrowserStorage implements Storage {
5
- private readonly storageKey;
3
+ export declare class BrowserStorage implements Storage<StorageKey> {
4
+ readonly appId: string;
6
5
  constructor(appId: string);
6
+ getKey(item?: string): string;
7
7
  getItem(key: StorageKey): Promise<Nullable<string>>;
8
8
  setItem(key: StorageKey, value: string): Promise<void>;
9
9
  removeItem(key: StorageKey): Promise<void>;
package/lib/storage.js CHANGED
@@ -1,28 +1,35 @@
1
- const logtoStorageItemKeyPrefix = `logto`;
1
+ const keyPrefix = `logto`;
2
2
  class BrowserStorage {
3
3
  constructor(appId) {
4
- this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;
4
+ this.appId = appId;
5
+ }
6
+ getKey(item) {
7
+ if (item === undefined) {
8
+ return `${keyPrefix}:${this.appId}`;
9
+ }
10
+ return `${keyPrefix}:${this.appId}:${item}`;
5
11
  }
6
12
  async getItem(key) {
7
13
  if (key === 'signInSession') {
8
- return sessionStorage.getItem(this.storageKey);
14
+ // The latter `getItem()` is for backward compatibility. Can be removed when major bump.
15
+ return sessionStorage.getItem(this.getKey(key)) ?? sessionStorage.getItem(this.getKey());
9
16
  }
10
- return localStorage.getItem(`${this.storageKey}:${key}`);
17
+ return localStorage.getItem(this.getKey(key));
11
18
  }
12
19
  async setItem(key, value) {
13
20
  if (key === 'signInSession') {
14
- sessionStorage.setItem(this.storageKey, value);
21
+ sessionStorage.setItem(this.getKey(key), value);
15
22
  return;
16
23
  }
17
- localStorage.setItem(`${this.storageKey}:${key}`, value);
24
+ localStorage.setItem(this.getKey(key), value);
18
25
  }
19
26
  async removeItem(key) {
20
27
  if (key === 'signInSession') {
21
- sessionStorage.removeItem(this.storageKey);
28
+ sessionStorage.removeItem(this.getKey(key));
22
29
  return;
23
30
  }
24
- localStorage.removeItem(`${this.storageKey}:${key}`);
31
+ localStorage.removeItem(this.getKey(key));
25
32
  }
26
33
  }
27
34
 
28
- export { BrowserStorage, logtoStorageItemKeyPrefix };
35
+ export { BrowserStorage };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logto/browser",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "main": "./lib/index.cjs",
6
6
  "module": "./lib/index.js",
@@ -21,7 +21,7 @@
21
21
  "directory": "packages/browser"
22
22
  },
23
23
  "dependencies": {
24
- "@logto/client": "^2.0.0",
24
+ "@logto/client": "^2.2.0",
25
25
  "@silverhand/essentials": "^2.6.2",
26
26
  "js-base64": "^3.7.4"
27
27
  },