@hearth-auth/sdk 0.0.1 → 1.0.1
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/dist/admin.d.ts +43 -0
- package/dist/admin.js +126 -0
- package/dist/admin.js.map +1 -0
- package/dist/browser-auth.d.ts +32 -0
- package/dist/browser-auth.js +99 -0
- package/dist/browser-auth.js.map +1 -0
- package/dist/claims.d.ts +86 -0
- package/dist/claims.js +137 -0
- package/dist/claims.js.map +1 -0
- package/dist/client.d.ts +77 -0
- package/dist/client.js +190 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +114 -0
- package/{src/errors.ts → dist/errors.js} +83 -97
- package/dist/errors.js.map +1 -0
- package/dist/hearth-client.d.ts +133 -0
- package/dist/hearth-client.js +192 -0
- package/dist/hearth-client.js.map +1 -0
- package/dist/hearth.d.ts +105 -0
- package/dist/hearth.js +109 -0
- package/dist/hearth.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection-client.d.ts +59 -0
- package/dist/introspection-client.js +36 -0
- package/dist/introspection-client.js.map +1 -0
- package/dist/jwks-client.d.ts +28 -0
- package/dist/jwks-client.js +28 -0
- package/dist/jwks-client.js.map +1 -0
- package/dist/middleware.d.ts +38 -0
- package/dist/middleware.js +51 -0
- package/dist/middleware.js.map +1 -0
- package/dist/pkce.d.ts +64 -0
- package/dist/pkce.js +64 -0
- package/dist/pkce.js.map +1 -0
- package/dist/react.d.ts +32 -0
- package/dist/react.js +41 -0
- package/dist/react.js.map +1 -0
- package/dist/session-version-cache.d.ts +50 -0
- package/dist/session-version-cache.js +129 -0
- package/dist/session-version-cache.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +13 -4
- package/CHANGELOG.md +0 -12
- package/src/admin.ts +0 -157
- package/src/browser-auth.ts +0 -130
- package/src/claims.ts +0 -180
- package/src/client.ts +0 -251
- package/src/generated/google/api/annotations_pb.ts +0 -44
- package/src/generated/google/api/http_pb.ts +0 -467
- package/src/generated/hearth/authz/v1/authz_pb.ts +0 -593
- package/src/generated/hearth/cluster/v1/raft_pb.ts +0 -183
- package/src/generated/hearth/events/v1/audit_pb.ts +0 -886
- package/src/generated/hearth/identity/v1/identity_pb.ts +0 -1673
- package/src/generated/hearth/identity/v1/oauth_pb.ts +0 -1138
- package/src/generated/hearth/rbac/v1/rbac_pb.ts +0 -2000
- package/src/hearth-client.ts +0 -288
- package/src/hearth.ts +0 -224
- package/src/index.ts +0 -106
- package/src/introspection-client.ts +0 -83
- package/src/jwks-client.ts +0 -45
- package/src/middleware.ts +0 -82
- package/src/pkce.ts +0 -129
- package/src/react.tsx +0 -57
- package/src/session-version-cache.ts +0 -167
- package/src/types.ts +0 -188
- package/tests/admin-crud.test.ts +0 -97
- package/tests/auth-flow.test.ts +0 -75
- package/tests/authorize.test.ts +0 -386
- package/tests/claims.test.ts +0 -159
- package/tests/hasPermission.test.ts +0 -152
- package/tests/hearth-client.test.ts +0 -243
- package/tests/helpers.ts +0 -90
- package/tests/jwks.test.ts +0 -62
- package/tests/pkce.test.ts +0 -210
- package/tests/react-useHasPermission.test.tsx +0 -92
- package/tests/required-action.test.ts +0 -276
- package/tests/session-version.test.ts +0 -391
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -8
package/dist/client.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { decodeJwt } from "jose";
|
|
2
|
+
import { RequiredActionError } from "./errors.js";
|
|
3
|
+
/** Error thrown when the Hearth API returns an error. */
|
|
4
|
+
export class HearthError extends Error {
|
|
5
|
+
status;
|
|
6
|
+
body;
|
|
7
|
+
constructor(status, body) {
|
|
8
|
+
super(`Hearth API error ${status}: ${JSON.stringify(body)}`);
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.body = body;
|
|
11
|
+
this.name = "HearthError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Low-level Hearth HTTP API client for auth code flows, token management,
|
|
16
|
+
* JWKS retrieval, and live RBAC claim resolution.
|
|
17
|
+
*
|
|
18
|
+
* @deprecated Use {@link HearthClient} from `hearth-client.js` as the
|
|
19
|
+
* recommended entry point. This class is kept as a lower-level primitive.
|
|
20
|
+
*/
|
|
21
|
+
export class HearthApiClient {
|
|
22
|
+
baseUrl;
|
|
23
|
+
realmId;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
26
|
+
this.realmId = config.realmId;
|
|
27
|
+
}
|
|
28
|
+
/** POST /admin/bootstrap — create realm, admin user, tokens (dev mode only). */
|
|
29
|
+
static async bootstrap(baseUrl) {
|
|
30
|
+
const url = `${baseUrl.replace(/\/$/, "")}/admin/bootstrap`;
|
|
31
|
+
const resp = await fetch(url, { method: "POST" });
|
|
32
|
+
if (!resp.ok) {
|
|
33
|
+
throw new HearthError(resp.status, await resp.json());
|
|
34
|
+
}
|
|
35
|
+
return resp.json();
|
|
36
|
+
}
|
|
37
|
+
/** POST /clients — register an OAuth 2.0 client. */
|
|
38
|
+
async registerClient(params) {
|
|
39
|
+
return this.post("/clients", {
|
|
40
|
+
client_name: params.clientName,
|
|
41
|
+
redirect_uris: params.redirectUris,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** POST /authorize — initiate an authorization code flow. */
|
|
45
|
+
async authorize(params) {
|
|
46
|
+
return this.post("/authorize", {
|
|
47
|
+
client_id: params.clientId,
|
|
48
|
+
redirect_uri: params.redirectUri,
|
|
49
|
+
scope: params.scope,
|
|
50
|
+
state: params.state,
|
|
51
|
+
response_type: params.responseType ?? "code",
|
|
52
|
+
user_id: params.userId,
|
|
53
|
+
code_challenge: params.codeChallenge,
|
|
54
|
+
code_challenge_method: params.codeChallengeMethod,
|
|
55
|
+
nonce: params.nonce,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** POST /token — exchange an authorization code for tokens. */
|
|
59
|
+
async exchangeCode(params) {
|
|
60
|
+
return this.post("/token", {
|
|
61
|
+
client_id: params.clientId,
|
|
62
|
+
code: params.code,
|
|
63
|
+
redirect_uri: params.redirectUri,
|
|
64
|
+
code_verifier: params.codeVerifier,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handle a PKCE authorization-code callback (spec §7).
|
|
69
|
+
*
|
|
70
|
+
* Extracts the `code` from `callbackUrl`, exchanges it for tokens, then
|
|
71
|
+
* inspects the JWT's `token_type` claim before returning:
|
|
72
|
+
*
|
|
73
|
+
* - If `token_type === "required_action"`: throws {@link RequiredActionError}
|
|
74
|
+
* with `requiredActions` populated from the JWT's `required_actions` claim.
|
|
75
|
+
* - If the callback URL contains `required_action_redirect_uri`: throws
|
|
76
|
+
* {@link RequiredActionError} with `redirectUri` set to that value.
|
|
77
|
+
* - Otherwise: returns the token response normally.
|
|
78
|
+
*/
|
|
79
|
+
async handleCallback(params) {
|
|
80
|
+
const url = new URL(params.callbackUrl);
|
|
81
|
+
const code = url.searchParams.get("code");
|
|
82
|
+
const requiredActionRedirectUri = url.searchParams.get("required_action_redirect_uri");
|
|
83
|
+
if (!code) {
|
|
84
|
+
throw new Error("handleCallback: no authorization code found in callback URL");
|
|
85
|
+
}
|
|
86
|
+
const tokens = await this.exchangeCode({
|
|
87
|
+
clientId: params.clientId,
|
|
88
|
+
code,
|
|
89
|
+
redirectUri: params.redirectUri,
|
|
90
|
+
codeVerifier: params.codeVerifier,
|
|
91
|
+
});
|
|
92
|
+
// Decode the access token to read Hearth-specific claims.
|
|
93
|
+
let jwtPayload = {};
|
|
94
|
+
try {
|
|
95
|
+
jwtPayload = decodeJwt(tokens.access_token);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Non-JWT access tokens (opaque) skip required-action detection.
|
|
99
|
+
}
|
|
100
|
+
const tokenType = jwtPayload["token_type"];
|
|
101
|
+
const requiredActions = Array.isArray(jwtPayload["required_actions"])
|
|
102
|
+
? jwtPayload["required_actions"]
|
|
103
|
+
: [];
|
|
104
|
+
if (tokenType === "required_action") {
|
|
105
|
+
throw new RequiredActionError(requiredActions, requiredActionRedirectUri ?? undefined);
|
|
106
|
+
}
|
|
107
|
+
if (requiredActionRedirectUri !== null) {
|
|
108
|
+
throw new RequiredActionError([], requiredActionRedirectUri);
|
|
109
|
+
}
|
|
110
|
+
return tokens;
|
|
111
|
+
}
|
|
112
|
+
/** POST /token — refresh tokens using a refresh token. */
|
|
113
|
+
async refreshTokens(clientId, refreshToken) {
|
|
114
|
+
return this.post("/token", {
|
|
115
|
+
client_id: clientId,
|
|
116
|
+
grant_type: "refresh_token",
|
|
117
|
+
refresh_token: refreshToken,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* GET /v1/me/permissions — fetch the freshly-resolved RBAC claim set
|
|
122
|
+
* for the bearer-token user.
|
|
123
|
+
*
|
|
124
|
+
* Unlike `hasPermission()` on a `createHearth()` client (which reads
|
|
125
|
+
* the cached set from the JWT), this call queries the server and
|
|
126
|
+
* reflects any role/group assignments made since the token was issued.
|
|
127
|
+
*/
|
|
128
|
+
async permissions(accessToken) {
|
|
129
|
+
const resp = await fetch(`${this.baseUrl}/v1/me/permissions`, {
|
|
130
|
+
headers: {
|
|
131
|
+
"X-Realm-ID": this.realmId,
|
|
132
|
+
Authorization: `Bearer ${accessToken}`,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
if (!resp.ok) {
|
|
136
|
+
throw new HearthError(resp.status, await resp.json());
|
|
137
|
+
}
|
|
138
|
+
return resp.json();
|
|
139
|
+
}
|
|
140
|
+
/** GET /userinfo — retrieve user claims using an access token. */
|
|
141
|
+
async userinfo(accessToken) {
|
|
142
|
+
const resp = await fetch(`${this.baseUrl}/userinfo`, {
|
|
143
|
+
headers: {
|
|
144
|
+
"X-Realm-ID": this.realmId,
|
|
145
|
+
Authorization: `Bearer ${accessToken}`,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
if (!resp.ok) {
|
|
149
|
+
throw new HearthError(resp.status, await resp.json());
|
|
150
|
+
}
|
|
151
|
+
return resp.json();
|
|
152
|
+
}
|
|
153
|
+
/** GET /jwks — retrieve the JWKS document. */
|
|
154
|
+
async jwks() {
|
|
155
|
+
const resp = await fetch(`${this.baseUrl}/jwks`);
|
|
156
|
+
if (!resp.ok) {
|
|
157
|
+
throw new HearthError(resp.status, await resp.json());
|
|
158
|
+
}
|
|
159
|
+
return resp.json();
|
|
160
|
+
}
|
|
161
|
+
/** GET /.well-known/openid-configuration — OIDC discovery document. */
|
|
162
|
+
async discovery() {
|
|
163
|
+
const resp = await fetch(`${this.baseUrl}/.well-known/openid-configuration`);
|
|
164
|
+
if (!resp.ok) {
|
|
165
|
+
throw new HearthError(resp.status, await resp.json());
|
|
166
|
+
}
|
|
167
|
+
return resp.json();
|
|
168
|
+
}
|
|
169
|
+
/** Creates an AdminClient using the given access token. */
|
|
170
|
+
admin(accessToken) {
|
|
171
|
+
return new AdminClient(this.baseUrl, this.realmId, accessToken);
|
|
172
|
+
}
|
|
173
|
+
async post(path, body) {
|
|
174
|
+
const resp = await fetch(`${this.baseUrl}${path}`, {
|
|
175
|
+
method: "POST",
|
|
176
|
+
headers: {
|
|
177
|
+
"Content-Type": "application/json",
|
|
178
|
+
"X-Realm-ID": this.realmId,
|
|
179
|
+
},
|
|
180
|
+
body: JSON.stringify(body),
|
|
181
|
+
});
|
|
182
|
+
if (!resp.ok) {
|
|
183
|
+
throw new HearthError(resp.status, await resp.json());
|
|
184
|
+
}
|
|
185
|
+
return resp.json();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// AdminClient is imported here to avoid circular deps — it's re-exported from index.
|
|
189
|
+
import { AdminClient } from "./admin.js";
|
|
190
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec §5 — Hearth SDK error hierarchy.
|
|
3
|
+
*
|
|
4
|
+
* All SDK-specific errors extend HearthSdkError so callers can catch
|
|
5
|
+
* the entire category with a single `instanceof HearthSdkError` check.
|
|
6
|
+
*/
|
|
7
|
+
/** Base class for all Hearth SDK errors. */
|
|
8
|
+
export declare class HearthSdkError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
/** Thrown when the client is misconfigured (missing baseUrl, realmId, etc.). */
|
|
12
|
+
export declare class ConfigurationError extends HearthSdkError {
|
|
13
|
+
constructor(message: string);
|
|
14
|
+
}
|
|
15
|
+
/** Thrown when the OIDC discovery document cannot be fetched or parsed. */
|
|
16
|
+
export declare class DiscoveryError extends HearthSdkError {
|
|
17
|
+
readonly cause?: unknown | undefined;
|
|
18
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
19
|
+
}
|
|
20
|
+
/** Thrown when fetching or parsing the JWKS document fails. */
|
|
21
|
+
export declare class JWKSFetchError extends HearthSdkError {
|
|
22
|
+
readonly cause?: unknown | undefined;
|
|
23
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
24
|
+
}
|
|
25
|
+
/** Thrown when a token's `exp` claim is in the past. */
|
|
26
|
+
export declare class TokenExpiredError extends HearthSdkError {
|
|
27
|
+
readonly expiredAt: Date;
|
|
28
|
+
constructor(expiredAt: Date, message?: string);
|
|
29
|
+
}
|
|
30
|
+
/** Thrown when a token's `nbf` claim is in the future. */
|
|
31
|
+
export declare class TokenNotYetValidError extends HearthSdkError {
|
|
32
|
+
readonly notBefore: Date;
|
|
33
|
+
constructor(notBefore: Date, message?: string);
|
|
34
|
+
}
|
|
35
|
+
/** Thrown when a token fails signature or structural validation. */
|
|
36
|
+
export declare class TokenInvalidError extends HearthSdkError {
|
|
37
|
+
constructor(message: string);
|
|
38
|
+
}
|
|
39
|
+
/** Thrown when the token's `iss` claim does not match the expected issuer. */
|
|
40
|
+
export declare class TokenIssuerError extends HearthSdkError {
|
|
41
|
+
readonly expected: string;
|
|
42
|
+
readonly actual: string;
|
|
43
|
+
constructor(expected: string, actual: string, message?: string);
|
|
44
|
+
}
|
|
45
|
+
/** Thrown when the token's `aud` claim does not include the expected audience. */
|
|
46
|
+
export declare class TokenAudienceError extends HearthSdkError {
|
|
47
|
+
readonly expected: string;
|
|
48
|
+
readonly actual: string[];
|
|
49
|
+
constructor(expected: string, actual: string[], message?: string);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Thrown when a token has `token_type === "required_action"`, indicating the
|
|
53
|
+
* user must complete pending actions before the token can be used for general
|
|
54
|
+
* API access. Also thrown when the callback URL contains
|
|
55
|
+
* `required_action_redirect_uri` (spec §5, §7).
|
|
56
|
+
*/
|
|
57
|
+
export declare class RequiredActionError extends HearthSdkError {
|
|
58
|
+
/** Pending action names from the token's `required_actions` claim. */
|
|
59
|
+
readonly requiredActions: string[];
|
|
60
|
+
/** Optional URL to the Hearth interstitial page for completing the actions. */
|
|
61
|
+
readonly redirectUri?: string | undefined;
|
|
62
|
+
constructor(
|
|
63
|
+
/** Pending action names from the token's `required_actions` claim. */
|
|
64
|
+
requiredActions: string[],
|
|
65
|
+
/** Optional URL to the Hearth interstitial page for completing the actions. */
|
|
66
|
+
redirectUri?: string | undefined, message?: string);
|
|
67
|
+
}
|
|
68
|
+
/** Thrown when a token introspection request fails or returns inactive. */
|
|
69
|
+
export declare class IntrospectionError extends HearthSdkError {
|
|
70
|
+
readonly cause?: unknown | undefined;
|
|
71
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Thrown when the `mode` field echoed in an introspection response does not
|
|
75
|
+
* match the SDK's configured `expectedMode`.
|
|
76
|
+
*
|
|
77
|
+
* Per HEA-923 design constraint: mode must be validated explicitly; the SDK
|
|
78
|
+
* MUST NOT silently tolerate a server returning a different mode than the one
|
|
79
|
+
* configured for the resource server.
|
|
80
|
+
*/
|
|
81
|
+
export declare class AuthorizationModeMismatchError extends HearthSdkError {
|
|
82
|
+
readonly expected: string;
|
|
83
|
+
readonly actual: string;
|
|
84
|
+
constructor(expected: string, actual: string, message?: string);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Thrown when a token's `sv` claim is below the minimum accepted session
|
|
88
|
+
* version for the session (RFC HEA-930 § 8).
|
|
89
|
+
*
|
|
90
|
+
* Resource servers should translate this into an HTTP 401 response.
|
|
91
|
+
*/
|
|
92
|
+
export declare class SessionVersionRevokedError extends HearthSdkError {
|
|
93
|
+
readonly sessionId: string;
|
|
94
|
+
readonly tokenSv: bigint;
|
|
95
|
+
readonly minSv: bigint;
|
|
96
|
+
constructor(sessionId: string, tokenSv: bigint, minSv: bigint, message?: string);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Thrown when the session-version cache has not been refreshed within
|
|
100
|
+
* `staleThresholdMs` (RFC HEA-930 § 8.1).
|
|
101
|
+
*
|
|
102
|
+
* When `onStale` is `"reject"`, resource servers should translate this into
|
|
103
|
+
* an HTTP 401 response with `error=session_version_cache_stale`.
|
|
104
|
+
* When `onStale` is `"introspect"`, catch this error and fall back to the
|
|
105
|
+
* introspection endpoint.
|
|
106
|
+
*/
|
|
107
|
+
export declare class SessionVersionCacheStaleError extends HearthSdkError {
|
|
108
|
+
/** Cache age in milliseconds, or -1 if the cache has never been seeded. */
|
|
109
|
+
readonly ageMs: number;
|
|
110
|
+
readonly onStale: "reject" | "introspect";
|
|
111
|
+
constructor(
|
|
112
|
+
/** Cache age in milliseconds, or -1 if the cache has never been seeded. */
|
|
113
|
+
ageMs: number, onStale?: "reject" | "introspect", message?: string);
|
|
114
|
+
}
|
|
@@ -4,91 +4,77 @@
|
|
|
4
4
|
* All SDK-specific errors extend HearthSdkError so callers can catch
|
|
5
5
|
* the entire category with a single `instanceof HearthSdkError` check.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
/** Base class for all Hearth SDK errors. */
|
|
9
8
|
export class HearthSdkError extends Error {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = this.constructor.name;
|
|
12
|
+
}
|
|
14
13
|
}
|
|
15
|
-
|
|
16
14
|
/** Thrown when the client is misconfigured (missing baseUrl, realmId, etc.). */
|
|
17
15
|
export class ConfigurationError extends HearthSdkError {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super(message);
|
|
18
|
+
}
|
|
21
19
|
}
|
|
22
|
-
|
|
23
20
|
/** Thrown when the OIDC discovery document cannot be fetched or parsed. */
|
|
24
21
|
export class DiscoveryError extends HearthSdkError {
|
|
25
|
-
|
|
26
|
-
message
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
22
|
+
cause;
|
|
23
|
+
constructor(message, cause) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.cause = cause;
|
|
26
|
+
}
|
|
31
27
|
}
|
|
32
|
-
|
|
33
28
|
/** Thrown when fetching or parsing the JWKS document fails. */
|
|
34
29
|
export class JWKSFetchError extends HearthSdkError {
|
|
35
|
-
|
|
36
|
-
message
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
30
|
+
cause;
|
|
31
|
+
constructor(message, cause) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.cause = cause;
|
|
34
|
+
}
|
|
41
35
|
}
|
|
42
|
-
|
|
43
36
|
/** Thrown when a token's `exp` claim is in the past. */
|
|
44
37
|
export class TokenExpiredError extends HearthSdkError {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
38
|
+
expiredAt;
|
|
39
|
+
constructor(expiredAt, message = `Token expired at ${expiredAt.toISOString()}`) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.expiredAt = expiredAt;
|
|
42
|
+
}
|
|
51
43
|
}
|
|
52
|
-
|
|
53
44
|
/** Thrown when a token's `nbf` claim is in the future. */
|
|
54
45
|
export class TokenNotYetValidError extends HearthSdkError {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
46
|
+
notBefore;
|
|
47
|
+
constructor(notBefore, message = `Token not yet valid until ${notBefore.toISOString()}`) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.notBefore = notBefore;
|
|
50
|
+
}
|
|
61
51
|
}
|
|
62
|
-
|
|
63
52
|
/** Thrown when a token fails signature or structural validation. */
|
|
64
53
|
export class TokenInvalidError extends HearthSdkError {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
54
|
+
constructor(message) {
|
|
55
|
+
super(message);
|
|
56
|
+
}
|
|
68
57
|
}
|
|
69
|
-
|
|
70
58
|
/** Thrown when the token's `iss` claim does not match the expected issuer. */
|
|
71
59
|
export class TokenIssuerError extends HearthSdkError {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
60
|
+
expected;
|
|
61
|
+
actual;
|
|
62
|
+
constructor(expected, actual, message = `Token issuer mismatch: expected "${expected}", got "${actual}"`) {
|
|
63
|
+
super(message);
|
|
64
|
+
this.expected = expected;
|
|
65
|
+
this.actual = actual;
|
|
66
|
+
}
|
|
79
67
|
}
|
|
80
|
-
|
|
81
68
|
/** Thrown when the token's `aud` claim does not include the expected audience. */
|
|
82
69
|
export class TokenAudienceError extends HearthSdkError {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
70
|
+
expected;
|
|
71
|
+
actual;
|
|
72
|
+
constructor(expected, actual, message = `Token audience mismatch: expected "${expected}", got [${actual.join(", ")}]`) {
|
|
73
|
+
super(message);
|
|
74
|
+
this.expected = expected;
|
|
75
|
+
this.actual = actual;
|
|
76
|
+
}
|
|
90
77
|
}
|
|
91
|
-
|
|
92
78
|
/**
|
|
93
79
|
* Thrown when a token has `token_type === "required_action"`, indicating the
|
|
94
80
|
* user must complete pending actions before the token can be used for general
|
|
@@ -96,27 +82,26 @@ export class TokenAudienceError extends HearthSdkError {
|
|
|
96
82
|
* `required_action_redirect_uri` (spec §5, §7).
|
|
97
83
|
*/
|
|
98
84
|
export class RequiredActionError extends HearthSdkError {
|
|
99
|
-
|
|
85
|
+
requiredActions;
|
|
86
|
+
redirectUri;
|
|
87
|
+
constructor(
|
|
100
88
|
/** Pending action names from the token's `required_actions` claim. */
|
|
101
|
-
|
|
89
|
+
requiredActions,
|
|
102
90
|
/** Optional URL to the Hearth interstitial page for completing the actions. */
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
91
|
+
redirectUri, message = `Required actions pending: ${requiredActions.join(", ")}`) {
|
|
92
|
+
super(message);
|
|
93
|
+
this.requiredActions = requiredActions;
|
|
94
|
+
this.redirectUri = redirectUri;
|
|
95
|
+
}
|
|
108
96
|
}
|
|
109
|
-
|
|
110
97
|
/** Thrown when a token introspection request fails or returns inactive. */
|
|
111
98
|
export class IntrospectionError extends HearthSdkError {
|
|
112
|
-
|
|
113
|
-
message
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
99
|
+
cause;
|
|
100
|
+
constructor(message, cause) {
|
|
101
|
+
super(message);
|
|
102
|
+
this.cause = cause;
|
|
103
|
+
}
|
|
118
104
|
}
|
|
119
|
-
|
|
120
105
|
/**
|
|
121
106
|
* Thrown when the `mode` field echoed in an introspection response does not
|
|
122
107
|
* match the SDK's configured `expectedMode`.
|
|
@@ -126,15 +111,14 @@ export class IntrospectionError extends HearthSdkError {
|
|
|
126
111
|
* configured for the resource server.
|
|
127
112
|
*/
|
|
128
113
|
export class AuthorizationModeMismatchError extends HearthSdkError {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
114
|
+
expected;
|
|
115
|
+
actual;
|
|
116
|
+
constructor(expected, actual, message = `Authorization mode mismatch: expected "${expected}", got "${actual}"`) {
|
|
117
|
+
super(message);
|
|
118
|
+
this.expected = expected;
|
|
119
|
+
this.actual = actual;
|
|
120
|
+
}
|
|
136
121
|
}
|
|
137
|
-
|
|
138
122
|
/**
|
|
139
123
|
* Thrown when a token's `sv` claim is below the minimum accepted session
|
|
140
124
|
* version for the session (RFC HEA-930 § 8).
|
|
@@ -142,16 +126,16 @@ export class AuthorizationModeMismatchError extends HearthSdkError {
|
|
|
142
126
|
* Resource servers should translate this into an HTTP 401 response.
|
|
143
127
|
*/
|
|
144
128
|
export class SessionVersionRevokedError extends HearthSdkError {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
129
|
+
sessionId;
|
|
130
|
+
tokenSv;
|
|
131
|
+
minSv;
|
|
132
|
+
constructor(sessionId, tokenSv, minSv, message = `Session version revoked: sid=${sessionId}, sv=${tokenSv} < min=${minSv}`) {
|
|
133
|
+
super(message);
|
|
134
|
+
this.sessionId = sessionId;
|
|
135
|
+
this.tokenSv = tokenSv;
|
|
136
|
+
this.minSv = minSv;
|
|
137
|
+
}
|
|
153
138
|
}
|
|
154
|
-
|
|
155
139
|
/**
|
|
156
140
|
* Thrown when the session-version cache has not been refreshed within
|
|
157
141
|
* `staleThresholdMs` (RFC HEA-930 § 8.1).
|
|
@@ -162,12 +146,14 @@ export class SessionVersionRevokedError extends HearthSdkError {
|
|
|
162
146
|
* introspection endpoint.
|
|
163
147
|
*/
|
|
164
148
|
export class SessionVersionCacheStaleError extends HearthSdkError {
|
|
165
|
-
|
|
149
|
+
ageMs;
|
|
150
|
+
onStale;
|
|
151
|
+
constructor(
|
|
166
152
|
/** Cache age in milliseconds, or -1 if the cache has never been seeded. */
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
153
|
+
ageMs, onStale = "reject", message = `Session version cache stale: age=${ageMs < 0 ? "never seeded" : `${ageMs}ms`}`) {
|
|
154
|
+
super(message);
|
|
155
|
+
this.ageMs = ageMs;
|
|
156
|
+
this.onStale = onStale;
|
|
157
|
+
}
|
|
173
158
|
}
|
|
159
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|