@logto/browser 1.1.1 → 1.1.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.
- package/lib/index.d.ts +2 -3
- package/lib/index.js +46 -78
- package/lib/index.mjs +23 -0
- package/lib/index.test.d.ts +1 -0
- package/lib/storage.d.ts +10 -0
- package/lib/storage.js +31 -0
- package/lib/storage.mjs +28 -0
- package/lib/storage.test.d.ts +1 -0
- package/lib/utils/generators.d.ts +18 -0
- package/lib/utils/generators.js +44 -0
- package/lib/utils/generators.mjs +40 -0
- package/lib/utils/generators.test.d.ts +1 -0
- package/package.json +16 -19
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/module.d.mts +0 -8
- package/lib/module.mjs +0 -71
- package/lib/module.mjs.map +0 -1
package/lib/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { LogtoConfig } from '@logto/client';
|
|
2
|
+
import BaseClient from '@logto/client';
|
|
2
3
|
export type { IdTokenClaims, LogtoErrorCode, LogtoConfig, LogtoClientErrorCode, UserInfoResponse, InteractionMode, } from '@logto/client';
|
|
3
4
|
export { LogtoError, OidcError, Prompt, LogtoRequestError, LogtoClientError, ReservedScope, UserScope, } from '@logto/client';
|
|
4
5
|
export default class LogtoClient extends BaseClient {
|
|
5
6
|
constructor(config: LogtoConfig);
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.js
CHANGED
|
@@ -1,90 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
var $2FOI4$jsbase64 = require("js-base64");
|
|
1
|
+
'use strict';
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
return a && a.__esModule ? a.default : a;
|
|
6
|
-
}
|
|
7
|
-
function $parcel$defineInteropFlag(a) {
|
|
8
|
-
Object.defineProperty(a, '__esModule', {value: true, configurable: true});
|
|
9
|
-
}
|
|
10
|
-
function $parcel$export(e, n, v, s) {
|
|
11
|
-
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
|
|
12
|
-
}
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
13
4
|
|
|
14
|
-
|
|
5
|
+
var BaseClient = require('@logto/client');
|
|
6
|
+
var storage = require('./storage.js');
|
|
7
|
+
var generators = require('./utils/generators.js');
|
|
15
8
|
|
|
16
|
-
|
|
17
|
-
$parcel$export(module.exports, "LogtoError", () => $5a30d9203b683831$re_export$LogtoError);
|
|
18
|
-
$parcel$export(module.exports, "OidcError", () => $5a30d9203b683831$re_export$OidcError);
|
|
19
|
-
$parcel$export(module.exports, "Prompt", () => $5a30d9203b683831$re_export$Prompt);
|
|
20
|
-
$parcel$export(module.exports, "LogtoRequestError", () => $5a30d9203b683831$re_export$LogtoRequestError);
|
|
21
|
-
$parcel$export(module.exports, "LogtoClientError", () => $5a30d9203b683831$re_export$LogtoClientError);
|
|
22
|
-
$parcel$export(module.exports, "ReservedScope", () => $5a30d9203b683831$re_export$ReservedScope);
|
|
23
|
-
$parcel$export(module.exports, "UserScope", () => $5a30d9203b683831$re_export$UserScope);
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
24
10
|
|
|
25
|
-
|
|
26
|
-
class $5be5fc3fe8f0a1d3$export$2baa60fa09b100be {
|
|
27
|
-
constructor(appId){
|
|
28
|
-
this.storageKey = `${$5be5fc3fe8f0a1d3$export$9b5c2da5fe7b4b2b}:${appId}`;
|
|
29
|
-
}
|
|
30
|
-
async getItem(key) {
|
|
31
|
-
if (key === "signInSession") return sessionStorage.getItem(this.storageKey);
|
|
32
|
-
return localStorage.getItem(`${this.storageKey}:${key}`);
|
|
33
|
-
}
|
|
34
|
-
async setItem(key, value) {
|
|
35
|
-
if (key === "signInSession") {
|
|
36
|
-
sessionStorage.setItem(this.storageKey, value);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
localStorage.setItem(`${this.storageKey}:${key}`, value);
|
|
40
|
-
}
|
|
41
|
-
async removeItem(key) {
|
|
42
|
-
if (key === "signInSession") {
|
|
43
|
-
sessionStorage.removeItem(this.storageKey);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
localStorage.removeItem(`${this.storageKey}:${key}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
11
|
+
var BaseClient__default = /*#__PURE__*/_interopDefault(BaseClient);
|
|
49
12
|
|
|
50
|
-
|
|
51
|
-
/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* @param length The length of the raw random data.
|
|
55
|
-
*/ const $baeb4f3d786047ef$var$generateRandomString = (length = 64)=>(0, $2FOI4$jsbase64.fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true);
|
|
56
|
-
const $baeb4f3d786047ef$export$9ccd2716e53a229b = ()=>$baeb4f3d786047ef$var$generateRandomString();
|
|
57
|
-
const $baeb4f3d786047ef$export$cf1891f923f5943a = ()=>$baeb4f3d786047ef$var$generateRandomString();
|
|
58
|
-
const $baeb4f3d786047ef$export$414b01b1f867308a = async (codeVerifier)=>{
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
60
|
-
if (crypto.subtle === undefined) /**
|
|
61
|
-
* `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
|
|
62
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
|
|
63
|
-
* https://www.chromium.org/blink/webcrypto/#accessing-it
|
|
64
|
-
*/ throw new (0, $2FOI4$logtoclient.LogtoError)("crypto_subtle_unavailable");
|
|
65
|
-
const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
|
|
66
|
-
const codeChallenge = new Uint8Array(await crypto.subtle.digest("SHA-256", encodedCodeVerifier));
|
|
67
|
-
return (0, $2FOI4$jsbase64.fromUint8Array)(codeChallenge, true);
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const $5a30d9203b683831$var$navigate = (url)=>{
|
|
13
|
+
const navigate = (url) => {
|
|
73
14
|
window.location.assign(url);
|
|
74
15
|
};
|
|
75
|
-
class
|
|
76
|
-
constructor(config){
|
|
77
|
-
const requester =
|
|
16
|
+
class LogtoClient extends BaseClient__default.default {
|
|
17
|
+
constructor(config) {
|
|
18
|
+
const requester = BaseClient.createRequester(fetch);
|
|
78
19
|
super(config, {
|
|
79
|
-
requester
|
|
80
|
-
navigate
|
|
81
|
-
storage: new (
|
|
82
|
-
generateCodeChallenge:
|
|
83
|
-
generateCodeVerifier:
|
|
84
|
-
generateState:
|
|
20
|
+
requester,
|
|
21
|
+
navigate,
|
|
22
|
+
storage: new storage.BrowserStorage(config.appId),
|
|
23
|
+
generateCodeChallenge: generators.generateCodeChallenge,
|
|
24
|
+
generateCodeVerifier: generators.generateCodeVerifier,
|
|
25
|
+
generateState: generators.generateState,
|
|
85
26
|
});
|
|
86
27
|
}
|
|
87
28
|
}
|
|
88
29
|
|
|
89
|
-
|
|
90
|
-
|
|
30
|
+
Object.defineProperty(exports, 'LogtoClientError', {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () { return BaseClient.LogtoClientError; }
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(exports, 'LogtoError', {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: function () { return BaseClient.LogtoError; }
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(exports, 'LogtoRequestError', {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function () { return BaseClient.LogtoRequestError; }
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, 'OidcError', {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () { return BaseClient.OidcError; }
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(exports, 'Prompt', {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
get: function () { return BaseClient.Prompt; }
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(exports, 'ReservedScope', {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function () { return BaseClient.ReservedScope; }
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, 'UserScope', {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () { return BaseClient.UserScope; }
|
|
57
|
+
});
|
|
58
|
+
exports.default = LogtoClient;
|
package/lib/index.mjs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import BaseClient, { createRequester } from '@logto/client';
|
|
2
|
+
export { LogtoClientError, LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope } from '@logto/client';
|
|
3
|
+
import { BrowserStorage } from './storage.mjs';
|
|
4
|
+
import { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators.mjs';
|
|
5
|
+
|
|
6
|
+
const navigate = (url) => {
|
|
7
|
+
window.location.assign(url);
|
|
8
|
+
};
|
|
9
|
+
class LogtoClient extends BaseClient {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
const requester = createRequester(fetch);
|
|
12
|
+
super(config, {
|
|
13
|
+
requester,
|
|
14
|
+
navigate,
|
|
15
|
+
storage: new BrowserStorage(config.appId),
|
|
16
|
+
generateCodeChallenge,
|
|
17
|
+
generateCodeVerifier,
|
|
18
|
+
generateState,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { LogtoClient as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/storage.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Storage, StorageKey } from '@logto/client';
|
|
2
|
+
import type { Nullable } from '@silverhand/essentials';
|
|
3
|
+
export declare const logtoStorageItemKeyPrefix = "logto";
|
|
4
|
+
export declare class BrowserStorage implements Storage {
|
|
5
|
+
private readonly storageKey;
|
|
6
|
+
constructor(appId: string);
|
|
7
|
+
getItem(key: StorageKey): Promise<Nullable<string>>;
|
|
8
|
+
setItem(key: StorageKey, value: string): Promise<void>;
|
|
9
|
+
removeItem(key: StorageKey): Promise<void>;
|
|
10
|
+
}
|
package/lib/storage.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const logtoStorageItemKeyPrefix = `logto`;
|
|
4
|
+
class BrowserStorage {
|
|
5
|
+
constructor(appId) {
|
|
6
|
+
this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;
|
|
7
|
+
}
|
|
8
|
+
async getItem(key) {
|
|
9
|
+
if (key === 'signInSession') {
|
|
10
|
+
return sessionStorage.getItem(this.storageKey);
|
|
11
|
+
}
|
|
12
|
+
return localStorage.getItem(`${this.storageKey}:${key}`);
|
|
13
|
+
}
|
|
14
|
+
async setItem(key, value) {
|
|
15
|
+
if (key === 'signInSession') {
|
|
16
|
+
sessionStorage.setItem(this.storageKey, value);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
localStorage.setItem(`${this.storageKey}:${key}`, value);
|
|
20
|
+
}
|
|
21
|
+
async removeItem(key) {
|
|
22
|
+
if (key === 'signInSession') {
|
|
23
|
+
sessionStorage.removeItem(this.storageKey);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
localStorage.removeItem(`${this.storageKey}:${key}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
exports.BrowserStorage = BrowserStorage;
|
|
31
|
+
exports.logtoStorageItemKeyPrefix = logtoStorageItemKeyPrefix;
|
package/lib/storage.mjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const logtoStorageItemKeyPrefix = `logto`;
|
|
2
|
+
class BrowserStorage {
|
|
3
|
+
constructor(appId) {
|
|
4
|
+
this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;
|
|
5
|
+
}
|
|
6
|
+
async getItem(key) {
|
|
7
|
+
if (key === 'signInSession') {
|
|
8
|
+
return sessionStorage.getItem(this.storageKey);
|
|
9
|
+
}
|
|
10
|
+
return localStorage.getItem(`${this.storageKey}:${key}`);
|
|
11
|
+
}
|
|
12
|
+
async setItem(key, value) {
|
|
13
|
+
if (key === 'signInSession') {
|
|
14
|
+
sessionStorage.setItem(this.storageKey, value);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
localStorage.setItem(`${this.storageKey}:${key}`, value);
|
|
18
|
+
}
|
|
19
|
+
async removeItem(key) {
|
|
20
|
+
if (key === 'signInSession') {
|
|
21
|
+
sessionStorage.removeItem(this.storageKey);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
localStorage.removeItem(`${this.storageKey}:${key}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export { BrowserStorage, logtoStorageItemKeyPrefix };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
|
|
2
|
+
/**
|
|
3
|
+
* Generates random string for state and encodes them in url safe base64
|
|
4
|
+
*/
|
|
5
|
+
export declare const generateState: () => string;
|
|
6
|
+
/**
|
|
7
|
+
* Generates code verifier
|
|
8
|
+
*
|
|
9
|
+
* @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)
|
|
10
|
+
*/
|
|
11
|
+
export declare const generateCodeVerifier: () => string;
|
|
12
|
+
/**
|
|
13
|
+
* Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64
|
|
14
|
+
*
|
|
15
|
+
* @param {String} codeVerifier Code verifier to calculate the S256 code challenge for
|
|
16
|
+
* @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)
|
|
17
|
+
*/
|
|
18
|
+
export declare const generateCodeChallenge: (codeVerifier: string) => Promise<string>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var BaseClient = require('@logto/client');
|
|
4
|
+
var jsBase64 = require('js-base64');
|
|
5
|
+
|
|
6
|
+
/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
|
|
7
|
+
/**
|
|
8
|
+
* @param length The length of the raw random data.
|
|
9
|
+
*/
|
|
10
|
+
const generateRandomString = (length = 64) => jsBase64.fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);
|
|
11
|
+
/**
|
|
12
|
+
* Generates random string for state and encodes them in url safe base64
|
|
13
|
+
*/
|
|
14
|
+
const generateState = () => generateRandomString();
|
|
15
|
+
/**
|
|
16
|
+
* Generates code verifier
|
|
17
|
+
*
|
|
18
|
+
* @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)
|
|
19
|
+
*/
|
|
20
|
+
const generateCodeVerifier = () => generateRandomString();
|
|
21
|
+
/**
|
|
22
|
+
* Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64
|
|
23
|
+
*
|
|
24
|
+
* @param {String} codeVerifier Code verifier to calculate the S256 code challenge for
|
|
25
|
+
* @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)
|
|
26
|
+
*/
|
|
27
|
+
const generateCodeChallenge = async (codeVerifier) => {
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
29
|
+
if (crypto.subtle === undefined) {
|
|
30
|
+
/**
|
|
31
|
+
* `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
|
|
32
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
|
|
33
|
+
* https://www.chromium.org/blink/webcrypto/#accessing-it
|
|
34
|
+
*/
|
|
35
|
+
throw new BaseClient.LogtoError('crypto_subtle_unavailable');
|
|
36
|
+
}
|
|
37
|
+
const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
|
|
38
|
+
const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));
|
|
39
|
+
return jsBase64.fromUint8Array(codeChallenge, true);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
exports.generateCodeChallenge = generateCodeChallenge;
|
|
43
|
+
exports.generateCodeVerifier = generateCodeVerifier;
|
|
44
|
+
exports.generateState = generateState;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { LogtoError } from '@logto/client';
|
|
2
|
+
import { fromUint8Array } from 'js-base64';
|
|
3
|
+
|
|
4
|
+
/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
|
|
5
|
+
/**
|
|
6
|
+
* @param length The length of the raw random data.
|
|
7
|
+
*/
|
|
8
|
+
const generateRandomString = (length = 64) => fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);
|
|
9
|
+
/**
|
|
10
|
+
* Generates random string for state and encodes them in url safe base64
|
|
11
|
+
*/
|
|
12
|
+
const generateState = () => generateRandomString();
|
|
13
|
+
/**
|
|
14
|
+
* Generates code verifier
|
|
15
|
+
*
|
|
16
|
+
* @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)
|
|
17
|
+
*/
|
|
18
|
+
const generateCodeVerifier = () => generateRandomString();
|
|
19
|
+
/**
|
|
20
|
+
* Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64
|
|
21
|
+
*
|
|
22
|
+
* @param {String} codeVerifier Code verifier to calculate the S256 code challenge for
|
|
23
|
+
* @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)
|
|
24
|
+
*/
|
|
25
|
+
const generateCodeChallenge = async (codeVerifier) => {
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
27
|
+
if (crypto.subtle === undefined) {
|
|
28
|
+
/**
|
|
29
|
+
* `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
|
|
30
|
+
* https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
|
|
31
|
+
* https://www.chromium.org/blink/webcrypto/#accessing-it
|
|
32
|
+
*/
|
|
33
|
+
throw new LogtoError('crypto_subtle_unavailable');
|
|
34
|
+
}
|
|
35
|
+
const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
|
|
36
|
+
const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));
|
|
37
|
+
return fromUint8Array(codeChallenge, true);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { generateCodeChallenge, generateCodeVerifier, generateState };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logto/browser",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"source": "./src/index.ts",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"exports": {
|
|
7
7
|
"require": "./lib/index.js",
|
|
8
|
-
"import": "./lib/
|
|
8
|
+
"import": "./lib/index.mjs"
|
|
9
9
|
},
|
|
10
|
-
"module": "./lib/
|
|
10
|
+
"module": "./lib/index.mjs",
|
|
11
11
|
"types": "./lib/index.d.ts",
|
|
12
12
|
"files": [
|
|
13
13
|
"lib"
|
|
@@ -22,36 +22,33 @@
|
|
|
22
22
|
"dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput",
|
|
23
23
|
"precommit": "lint-staged",
|
|
24
24
|
"check": "tsc --noEmit",
|
|
25
|
-
"build": "rm -rf lib/ &&
|
|
25
|
+
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
|
|
26
26
|
"lint": "eslint --ext .ts src",
|
|
27
27
|
"test": "jest",
|
|
28
28
|
"test:coverage": "jest --silent --coverage",
|
|
29
29
|
"prepack": "pnpm test"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@logto/client": "^1.1.
|
|
33
|
-
"@silverhand/essentials": "^
|
|
32
|
+
"@logto/client": "^1.1.2",
|
|
33
|
+
"@silverhand/essentials": "^2.6.1",
|
|
34
34
|
"js-base64": "^3.7.4"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@jest/types": "^
|
|
38
|
-
"@parcel/core": "^2.8.3",
|
|
39
|
-
"@parcel/packager-ts": "^2.8.3",
|
|
40
|
-
"@parcel/transformer-typescript-types": "^2.8.3",
|
|
37
|
+
"@jest/types": "^29.5.0",
|
|
41
38
|
"@silverhand/eslint-config": "^2.0.0",
|
|
42
39
|
"@silverhand/ts-config": "^1.0.0",
|
|
43
|
-
"@
|
|
44
|
-
"
|
|
45
|
-
"jest": "^
|
|
40
|
+
"@swc/core": "^1.3.50",
|
|
41
|
+
"@swc/jest": "^0.2.24",
|
|
42
|
+
"@types/jest": "^29.5.0",
|
|
43
|
+
"eslint": "^8.38.0",
|
|
44
|
+
"jest": "^29.5.0",
|
|
45
|
+
"jest-environment-jsdom": "^29.5.0",
|
|
46
46
|
"jest-location-mock": "^1.0.9",
|
|
47
47
|
"jest-matcher-specific-error": "^1.0.0",
|
|
48
48
|
"lint-staged": "^13.0.0",
|
|
49
|
-
"
|
|
50
|
-
"parcel": "^2.8.3",
|
|
51
|
-
"prettier": "^2.7.1",
|
|
49
|
+
"prettier": "^2.8.7",
|
|
52
50
|
"text-encoder": "^0.0.4",
|
|
53
|
-
"
|
|
54
|
-
"typescript": "4.9.5"
|
|
51
|
+
"typescript": "^5.0.0"
|
|
55
52
|
},
|
|
56
53
|
"eslintConfig": {
|
|
57
54
|
"extends": "@silverhand"
|
|
@@ -60,5 +57,5 @@
|
|
|
60
57
|
"publishConfig": {
|
|
61
58
|
"access": "public"
|
|
62
59
|
},
|
|
63
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "9e9a8b0887ef67baa7c3c564590bb06e7801d03e"
|
|
64
61
|
}
|
package/lib/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":";AEMA,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,SAAS,GACV,MAAM,eAAe,CAAC;AAMvB,gCAAiC,SAAQ,UAAU;gBACrC,MAAM,EAAE,WAAW;CAWhC","sources":["packages/browser/src/src/storage.ts","packages/browser/src/src/utils/generators.ts","packages/browser/src/src/index.ts","packages/browser/src/index.ts"],"sourcesContent":[null,null,null,"import type { LogtoConfig } from '@logto/client';\nimport BaseClient, { createRequester } from '@logto/client';\n\nimport { BrowserStorage } from './storage';\nimport { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators';\n\nexport type {\n IdTokenClaims,\n LogtoErrorCode,\n LogtoConfig,\n LogtoClientErrorCode,\n UserInfoResponse,\n InteractionMode,\n} from '@logto/client';\n\nexport {\n LogtoError,\n OidcError,\n Prompt,\n LogtoRequestError,\n LogtoClientError,\n ReservedScope,\n UserScope,\n} from '@logto/client';\n\nconst navigate = (url: string) => {\n window.location.assign(url);\n};\n\nexport default class LogtoClient extends BaseClient {\n constructor(config: LogtoConfig) {\n const requester = createRequester(fetch);\n super(config, {\n requester,\n navigate,\n storage: new BrowserStorage(config.appId),\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n });\n }\n}\n"],"names":[],"version":3,"file":"index.d.ts.map"}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;ACGO,MAAM,4CAA4B,CAAC,KAAK,CAAC;AAEzC,MAAM;IAGX,YAAY,KAAa,CAAE;QACzB,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,0CAA0B,CAAC,EAAE,MAAM,CAAC;IAC3D;IAEA,MAAM,QAAQ,GAAe,EAA6B;QACxD,IAAI,QAAQ,iBACV,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU;QAG/C,OAAO,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACzD;IAEA,MAAM,QAAQ,GAAe,EAAE,KAAa,EAAiB;QAC3D,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAExC;QACF,CAAC;QACD,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;IACpD;IAEA,MAAM,WAAW,GAAe,EAAiB;QAC/C,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,UAAU,CAAC,IAAI,CAAC,UAAU;YAEzC;QACF,CAAC;QACD,aAAa,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACrD;AACF;;;ACrCA,+GAA+G,GAE/G;;AAGA;;CAEC,GACD,MAAM,6CAAuB,CAAC,SAAS,EAAE,GACvC,CAAA,GAAA,8BAAc,AAAD,EAAE,OAAO,eAAe,CAAC,IAAI,WAAW,UAAU,IAAI;AAK9D,MAAM,4CAAgB,IAAM;AAO5B,MAAM,4CAAuB,IAAM;AAQnC,MAAM,4CAAwB,OAAO,eAA0C;IACpF,uEAAuE;IACvE,IAAI,OAAO,MAAM,KAAK,WACpB;;;;KAIC,GACD,MAAM,IAAI,CAAA,GAAA,6BAAS,EAAE,6BAA6B;IAGpD,MAAM,sBAAsB,IAAI,cAAc,MAAM,CAAC;IACrD,MAAM,gBAAgB,IAAI,WAAW,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW;IAE3E,OAAO,CAAA,GAAA,8BAAc,AAAD,EAAE,eAAe,IAAI;AAC3C;;;;AFnBA,MAAM,iCAAW,CAAC,MAAgB;IAChC,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB;AAEe,uDAA0B,CAAA,GAAA,4CAAS;IAChD,YAAY,MAAmB,CAAE;QAC/B,MAAM,YAAY,CAAA,GAAA,kCAAc,EAAE;QAClC,KAAK,CAAC,QAAQ;uBACZ;sBACA;YACA,SAAS,IAAI,CAAA,GAAA,yCAAc,AAAD,EAAE,OAAO,KAAK;mCACxC;kCACA;2BACA;QACF;IACF;AACF","sources":["packages/browser/src/index.ts","packages/browser/src/storage.ts","packages/browser/src/utils/generators.ts"],"sourcesContent":["import type { LogtoConfig } from '@logto/client';\nimport BaseClient, { createRequester } from '@logto/client';\n\nimport { BrowserStorage } from './storage';\nimport { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators';\n\nexport type {\n IdTokenClaims,\n LogtoErrorCode,\n LogtoConfig,\n LogtoClientErrorCode,\n UserInfoResponse,\n InteractionMode,\n} from '@logto/client';\n\nexport {\n LogtoError,\n OidcError,\n Prompt,\n LogtoRequestError,\n LogtoClientError,\n ReservedScope,\n UserScope,\n} from '@logto/client';\n\nconst navigate = (url: string) => {\n window.location.assign(url);\n};\n\nexport default class LogtoClient extends BaseClient {\n constructor(config: LogtoConfig) {\n const requester = createRequester(fetch);\n super(config, {\n requester,\n navigate,\n storage: new BrowserStorage(config.appId),\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n });\n }\n}\n","import type { Storage, StorageKey } from '@logto/client';\nimport type { Nullable } from '@silverhand/essentials';\n\nexport const logtoStorageItemKeyPrefix = `logto`;\n\nexport class BrowserStorage implements Storage {\n private readonly storageKey: string;\n\n constructor(appId: string) {\n this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;\n }\n\n async getItem(key: StorageKey): Promise<Nullable<string>> {\n if (key === 'signInSession') {\n return sessionStorage.getItem(this.storageKey);\n }\n\n return localStorage.getItem(`${this.storageKey}:${key}`);\n }\n\n async setItem(key: StorageKey, value: string): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.setItem(this.storageKey, value);\n\n return;\n }\n localStorage.setItem(`${this.storageKey}:${key}`, value);\n }\n\n async removeItem(key: StorageKey): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.removeItem(this.storageKey);\n\n return;\n }\n localStorage.removeItem(`${this.storageKey}:${key}`);\n }\n}\n","/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */\n\nimport { LogtoError } from '@logto/client';\nimport { fromUint8Array } from 'js-base64';\n\n/**\n * @param length The length of the raw random data.\n */\nconst generateRandomString = (length = 64) =>\n fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);\n\n/**\n * Generates random string for state and encodes them in url safe base64\n */\nexport const generateState = () => generateRandomString();\n\n/**\n * Generates code verifier\n *\n * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)\n */\nexport const generateCodeVerifier = () => generateRandomString();\n\n/**\n * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64\n *\n * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for\n * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)\n */\nexport const generateCodeChallenge = async (codeVerifier: string): Promise<string> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (crypto.subtle === undefined) {\n /**\n * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,\n * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle\n * https://www.chromium.org/blink/webcrypto/#accessing-it\n */\n throw new LogtoError('crypto_subtle_unavailable');\n }\n\n const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);\n const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));\n\n return fromUint8Array(codeChallenge, true);\n};\n"],"names":[],"version":3,"file":"index.js.map"}
|
package/lib/module.d.mts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import BaseClient, { LogtoConfig } from "@logto/client";
|
|
2
|
-
export type { IdTokenClaims, LogtoErrorCode, LogtoConfig, LogtoClientErrorCode, UserInfoResponse, InteractionMode, } from '@logto/client';
|
|
3
|
-
export { LogtoError, OidcError, Prompt, LogtoRequestError, LogtoClientError, ReservedScope, UserScope, } from '@logto/client';
|
|
4
|
-
export default class LogtoClient extends BaseClient {
|
|
5
|
-
constructor(config: LogtoConfig);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=index.d.ts.map
|
package/lib/module.mjs
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import $ElS14$logtoclient, {createRequester as $ElS14$createRequester, LogtoError as $90df2ab0e44b5eba$re_export$LogtoError, OidcError as $90df2ab0e44b5eba$re_export$OidcError, Prompt as $90df2ab0e44b5eba$re_export$Prompt, LogtoRequestError as $90df2ab0e44b5eba$re_export$LogtoRequestError, LogtoClientError as $90df2ab0e44b5eba$re_export$LogtoClientError, ReservedScope as $90df2ab0e44b5eba$re_export$ReservedScope, UserScope as $90df2ab0e44b5eba$re_export$UserScope} from "@logto/client";
|
|
2
|
-
import {fromUint8Array as $ElS14$fromUint8Array} from "js-base64";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const $283691d41cf73b69$export$9b5c2da5fe7b4b2b = `logto`;
|
|
6
|
-
class $283691d41cf73b69$export$2baa60fa09b100be {
|
|
7
|
-
constructor(appId){
|
|
8
|
-
this.storageKey = `${$283691d41cf73b69$export$9b5c2da5fe7b4b2b}:${appId}`;
|
|
9
|
-
}
|
|
10
|
-
async getItem(key) {
|
|
11
|
-
if (key === "signInSession") return sessionStorage.getItem(this.storageKey);
|
|
12
|
-
return localStorage.getItem(`${this.storageKey}:${key}`);
|
|
13
|
-
}
|
|
14
|
-
async setItem(key, value) {
|
|
15
|
-
if (key === "signInSession") {
|
|
16
|
-
sessionStorage.setItem(this.storageKey, value);
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
localStorage.setItem(`${this.storageKey}:${key}`, value);
|
|
20
|
-
}
|
|
21
|
-
async removeItem(key) {
|
|
22
|
-
if (key === "signInSession") {
|
|
23
|
-
sessionStorage.removeItem(this.storageKey);
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
localStorage.removeItem(`${this.storageKey}:${key}`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @param length The length of the raw random data.
|
|
35
|
-
*/ const $7faa35338215c9c1$var$generateRandomString = (length = 64)=>(0, $ElS14$fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true);
|
|
36
|
-
const $7faa35338215c9c1$export$9ccd2716e53a229b = ()=>$7faa35338215c9c1$var$generateRandomString();
|
|
37
|
-
const $7faa35338215c9c1$export$cf1891f923f5943a = ()=>$7faa35338215c9c1$var$generateRandomString();
|
|
38
|
-
const $7faa35338215c9c1$export$414b01b1f867308a = async (codeVerifier)=>{
|
|
39
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
40
|
-
if (crypto.subtle === undefined) /**
|
|
41
|
-
* `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
|
|
42
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
|
|
43
|
-
* https://www.chromium.org/blink/webcrypto/#accessing-it
|
|
44
|
-
*/ throw new (0, $90df2ab0e44b5eba$re_export$LogtoError)("crypto_subtle_unavailable");
|
|
45
|
-
const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
|
|
46
|
-
const codeChallenge = new Uint8Array(await crypto.subtle.digest("SHA-256", encodedCodeVerifier));
|
|
47
|
-
return (0, $ElS14$fromUint8Array)(codeChallenge, true);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const $90df2ab0e44b5eba$var$navigate = (url)=>{
|
|
53
|
-
window.location.assign(url);
|
|
54
|
-
};
|
|
55
|
-
class $90df2ab0e44b5eba$export$2e2bcd8739ae039 extends (0, $ElS14$logtoclient) {
|
|
56
|
-
constructor(config){
|
|
57
|
-
const requester = (0, $ElS14$createRequester)(fetch);
|
|
58
|
-
super(config, {
|
|
59
|
-
requester: requester,
|
|
60
|
-
navigate: $90df2ab0e44b5eba$var$navigate,
|
|
61
|
-
storage: new (0, $283691d41cf73b69$export$2baa60fa09b100be)(config.appId),
|
|
62
|
-
generateCodeChallenge: $7faa35338215c9c1$export$414b01b1f867308a,
|
|
63
|
-
generateCodeVerifier: $7faa35338215c9c1$export$cf1891f923f5943a,
|
|
64
|
-
generateState: $7faa35338215c9c1$export$9ccd2716e53a229b
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
export {$90df2ab0e44b5eba$export$2e2bcd8739ae039 as default, $90df2ab0e44b5eba$re_export$LogtoError as LogtoError, $90df2ab0e44b5eba$re_export$OidcError as OidcError, $90df2ab0e44b5eba$re_export$Prompt as Prompt, $90df2ab0e44b5eba$re_export$LogtoRequestError as LogtoRequestError, $90df2ab0e44b5eba$re_export$LogtoClientError as LogtoClientError, $90df2ab0e44b5eba$re_export$ReservedScope as ReservedScope, $90df2ab0e44b5eba$re_export$UserScope as UserScope};
|
|
71
|
-
//# sourceMappingURL=module.mjs.map
|
package/lib/module.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":";;;AAAA;ACGO,MAAM,4CAA4B,CAAC,KAAK,CAAC;AAEzC,MAAM;IAGX,YAAY,KAAa,CAAE;QACzB,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,0CAA0B,CAAC,EAAE,MAAM,CAAC;IAC3D;IAEA,MAAM,QAAQ,GAAe,EAA6B;QACxD,IAAI,QAAQ,iBACV,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU;QAG/C,OAAO,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACzD;IAEA,MAAM,QAAQ,GAAe,EAAE,KAAa,EAAiB;QAC3D,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAExC;QACF,CAAC;QACD,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;IACpD;IAEA,MAAM,WAAW,GAAe,EAAiB;QAC/C,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,UAAU,CAAC,IAAI,CAAC,UAAU;YAEzC;QACF,CAAC;QACD,aAAa,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACrD;AACF;;;ACrCA,+GAA+G,GAE/G;;AAGA;;CAEC,GACD,MAAM,6CAAuB,CAAC,SAAS,EAAE,GACvC,CAAA,GAAA,qBAAc,AAAD,EAAE,OAAO,eAAe,CAAC,IAAI,WAAW,UAAU,IAAI;AAK9D,MAAM,4CAAgB,IAAM;AAO5B,MAAM,4CAAuB,IAAM;AAQnC,MAAM,4CAAwB,OAAO,eAA0C;IACpF,uEAAuE;IACvE,IAAI,OAAO,MAAM,KAAK,WACpB;;;;KAIC,GACD,MAAM,IAAI,CAAA,GAAA,sCAAS,EAAE,6BAA6B;IAGpD,MAAM,sBAAsB,IAAI,cAAc,MAAM,CAAC;IACrD,MAAM,gBAAgB,IAAI,WAAW,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW;IAE3E,OAAO,CAAA,GAAA,qBAAc,AAAD,EAAE,eAAe,IAAI;AAC3C;;;;AFnBA,MAAM,iCAAW,CAAC,MAAgB;IAChC,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB;AAEe,uDAA0B,CAAA,GAAA,kBAAS;IAChD,YAAY,MAAmB,CAAE;QAC/B,MAAM,YAAY,CAAA,GAAA,sBAAc,EAAE;QAClC,KAAK,CAAC,QAAQ;uBACZ;sBACA;YACA,SAAS,IAAI,CAAA,GAAA,yCAAc,AAAD,EAAE,OAAO,KAAK;mCACxC;kCACA;2BACA;QACF;IACF;AACF","sources":["packages/browser/src/index.ts","packages/browser/src/storage.ts","packages/browser/src/utils/generators.ts"],"sourcesContent":["import type { LogtoConfig } from '@logto/client';\nimport BaseClient, { createRequester } from '@logto/client';\n\nimport { BrowserStorage } from './storage';\nimport { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators';\n\nexport type {\n IdTokenClaims,\n LogtoErrorCode,\n LogtoConfig,\n LogtoClientErrorCode,\n UserInfoResponse,\n InteractionMode,\n} from '@logto/client';\n\nexport {\n LogtoError,\n OidcError,\n Prompt,\n LogtoRequestError,\n LogtoClientError,\n ReservedScope,\n UserScope,\n} from '@logto/client';\n\nconst navigate = (url: string) => {\n window.location.assign(url);\n};\n\nexport default class LogtoClient extends BaseClient {\n constructor(config: LogtoConfig) {\n const requester = createRequester(fetch);\n super(config, {\n requester,\n navigate,\n storage: new BrowserStorage(config.appId),\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n });\n }\n}\n","import type { Storage, StorageKey } from '@logto/client';\nimport type { Nullable } from '@silverhand/essentials';\n\nexport const logtoStorageItemKeyPrefix = `logto`;\n\nexport class BrowserStorage implements Storage {\n private readonly storageKey: string;\n\n constructor(appId: string) {\n this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;\n }\n\n async getItem(key: StorageKey): Promise<Nullable<string>> {\n if (key === 'signInSession') {\n return sessionStorage.getItem(this.storageKey);\n }\n\n return localStorage.getItem(`${this.storageKey}:${key}`);\n }\n\n async setItem(key: StorageKey, value: string): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.setItem(this.storageKey, value);\n\n return;\n }\n localStorage.setItem(`${this.storageKey}:${key}`, value);\n }\n\n async removeItem(key: StorageKey): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.removeItem(this.storageKey);\n\n return;\n }\n localStorage.removeItem(`${this.storageKey}:${key}`);\n }\n}\n","/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */\n\nimport { LogtoError } from '@logto/client';\nimport { fromUint8Array } from 'js-base64';\n\n/**\n * @param length The length of the raw random data.\n */\nconst generateRandomString = (length = 64) =>\n fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);\n\n/**\n * Generates random string for state and encodes them in url safe base64\n */\nexport const generateState = () => generateRandomString();\n\n/**\n * Generates code verifier\n *\n * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)\n */\nexport const generateCodeVerifier = () => generateRandomString();\n\n/**\n * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64\n *\n * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for\n * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)\n */\nexport const generateCodeChallenge = async (codeVerifier: string): Promise<string> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (crypto.subtle === undefined) {\n /**\n * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,\n * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle\n * https://www.chromium.org/blink/webcrypto/#accessing-it\n */\n throw new LogtoError('crypto_subtle_unavailable');\n }\n\n const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);\n const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));\n\n return fromUint8Array(codeChallenge, true);\n};\n"],"names":[],"version":3,"file":"module.mjs.map"}
|