@neuroncloud/ido-client 0.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/dist/adapters/crypto.d.ts +6 -0
- package/dist/adapters/crypto.d.ts.map +1 -0
- package/dist/adapters/crypto.js +9 -0
- package/dist/adapters/crypto.js.map +1 -0
- package/dist/adapters/http.d.ts +24 -0
- package/dist/adapters/http.d.ts.map +1 -0
- package/dist/adapters/http.js +64 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/location.d.ts +6 -0
- package/dist/adapters/location.d.ts.map +1 -0
- package/dist/adapters/location.js +2 -0
- package/dist/adapters/location.js.map +1 -0
- package/dist/adapters/storage.d.ts +12 -0
- package/dist/adapters/storage.d.ts.map +1 -0
- package/dist/adapters/storage.js +2 -0
- package/dist/adapters/storage.js.map +1 -0
- package/dist/adapters/webauthn.d.ts +4 -0
- package/dist/adapters/webauthn.d.ts.map +1 -0
- package/dist/adapters/webauthn.js +2 -0
- package/dist/adapters/webauthn.js.map +1 -0
- package/dist/cache/cache.d.ts +18 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +11 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/memory-cache.d.ts +9 -0
- package/dist/cache/memory-cache.d.ts.map +1 -0
- package/dist/cache/memory-cache.js +14 -0
- package/dist/cache/memory-cache.js.map +1 -0
- package/dist/client-options.d.ts +35 -0
- package/dist/client-options.d.ts.map +1 -0
- package/dist/client-options.js +37 -0
- package/dist/client-options.js.map +1 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +175 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/interaction-client.d.ts +26 -0
- package/dist/interaction/interaction-client.d.ts.map +1 -0
- package/dist/interaction/interaction-client.js +284 -0
- package/dist/interaction/interaction-client.js.map +1 -0
- package/dist/interaction/transaction.d.ts +11 -0
- package/dist/interaction/transaction.d.ts.map +1 -0
- package/dist/interaction/transaction.js +39 -0
- package/dist/interaction/transaction.js.map +1 -0
- package/dist/state-manager.d.ts +20 -0
- package/dist/state-manager.d.ts.map +1 -0
- package/dist/state-manager.js +40 -0
- package/dist/state-manager.js.map +1 -0
- package/dist/token/token-manager.d.ts +51 -0
- package/dist/token/token-manager.d.ts.map +1 -0
- package/dist/token/token-manager.js +303 -0
- package/dist/token/token-manager.js.map +1 -0
- package/package.json +27 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from "@neuroncloud/ido-core";
|
|
2
|
+
export { resolveClientOptions } from "./client-options.js";
|
|
3
|
+
export type { AuthEndpoints, ClientOptions, ResolvedClientOptions, StorageSlots } from "./client-options.js";
|
|
4
|
+
export * from "./adapters/index.js";
|
|
5
|
+
export { CacheManager, CacheManager as StorageManager } from "./cache/cache.js";
|
|
6
|
+
export type { Cache, CacheSlot, CacheSlots, StorageProvider } from "./cache/cache.js";
|
|
7
|
+
export { MemoryCache, MemoryCache as MemoryStorage } from "./cache/memory-cache.js";
|
|
8
|
+
export { ClientStateManager } from "./state-manager.js";
|
|
9
|
+
export type { ClientState, ClientStateListener } from "./state-manager.js";
|
|
10
|
+
export { createClient, createMemoryStorageSlots } from "./client.js";
|
|
11
|
+
export type { ClientAdapters, IdoClient, RedirectMeta, SignInWithRedirectOptions, SignOutOptions, } from "./client.js";
|
|
12
|
+
export { createTokenApi, TokenManager, tokensFromResponse } from "./token/token-manager.js";
|
|
13
|
+
export type { TokenApi, TokenManagerEvent, TokenManagerListener, TokenRenewHandler, } from "./token/token-manager.js";
|
|
14
|
+
export { createInteractionClient } from "./interaction/interaction-client.js";
|
|
15
|
+
export type { InteractionClient } from "./interaction/interaction-client.js";
|
|
16
|
+
export { InteractionTransactionManager } from "./interaction/transaction.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7G,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,YAAY,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACrE,YAAY,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACZ,yBAAyB,EACzB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,YAAY,EACV,QAAQ,EACR,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "@neuroncloud/ido-core";
|
|
2
|
+
export { resolveClientOptions } from "./client-options.js";
|
|
3
|
+
export * from "./adapters/index.js";
|
|
4
|
+
export { CacheManager, CacheManager as StorageManager } from "./cache/cache.js";
|
|
5
|
+
export { MemoryCache, MemoryCache as MemoryStorage } from "./cache/memory-cache.js";
|
|
6
|
+
export { ClientStateManager } from "./state-manager.js";
|
|
7
|
+
export { createClient, createMemoryStorageSlots } from "./client.js";
|
|
8
|
+
export { createTokenApi, TokenManager, tokensFromResponse } from "./token/token-manager.js";
|
|
9
|
+
export { createInteractionClient } from "./interaction/interaction-client.js";
|
|
10
|
+
export { InteractionTransactionManager } from "./interaction/transaction.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,YAAY,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AASrE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQ5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type AuthenticateOptions, type InteractionResult, type ProceedOptions, type StartOptions } from "@neuroncloud/ido-core";
|
|
2
|
+
import type { HttpClient } from "../adapters/http.js";
|
|
3
|
+
import type { WebAuthnAdapter } from "../adapters/webauthn.js";
|
|
4
|
+
import type { CacheManager } from "../cache/cache.js";
|
|
5
|
+
import type { ResolvedClientOptions } from "../client-options.js";
|
|
6
|
+
import type { ClientStateManager } from "../state-manager.js";
|
|
7
|
+
import type { TokenManager } from "../token/token-manager.js";
|
|
8
|
+
import type { InteractionTransactionManager } from "./transaction.js";
|
|
9
|
+
export interface InteractionClient {
|
|
10
|
+
authenticate(options?: AuthenticateOptions): Promise<InteractionResult>;
|
|
11
|
+
start(options: StartOptions): Promise<InteractionResult>;
|
|
12
|
+
proceed(options?: ProceedOptions): Promise<InteractionResult>;
|
|
13
|
+
canProceed(): boolean;
|
|
14
|
+
cancel(): Promise<InteractionResult>;
|
|
15
|
+
}
|
|
16
|
+
export interface InteractionContext {
|
|
17
|
+
options: ResolvedClientOptions;
|
|
18
|
+
http: HttpClient;
|
|
19
|
+
cache: CacheManager;
|
|
20
|
+
transactions: InteractionTransactionManager;
|
|
21
|
+
tokenManager: TokenManager;
|
|
22
|
+
clientState: ClientStateManager;
|
|
23
|
+
webauthn?: WebAuthnAdapter;
|
|
24
|
+
}
|
|
25
|
+
export declare function createInteractionClient(context: InteractionContext): InteractionClient;
|
|
26
|
+
//# sourceMappingURL=interaction-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-client.d.ts","sourceRoot":"","sources":["../../src/interaction/interaction-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAuBL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EAGlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9D,UAAU,IAAI,OAAO,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,6BAA6B,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CAWtF"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { asRecord, canceled, challengeAuthenticatorStep, challengePasskeyStep, ChallengeTypes, exchangeToken, failure, GrantTypes, identifyStep, isMfaMethod, OAuthError, Parameters, parseMfaMethods, passwordStep, pending, readNumber, readString, readUnknown, RuntimeError, selectAuthenticatorStep, success, verifyIdToken, } from "@neuroncloud/ido-core";
|
|
2
|
+
export function createInteractionClient(context) {
|
|
3
|
+
return {
|
|
4
|
+
authenticate: (options) => authenticate(context, options ?? {}),
|
|
5
|
+
start: (options) => start(context, options),
|
|
6
|
+
proceed: (options) => proceed(context, options ?? {}),
|
|
7
|
+
canProceed: () => context.transactions.load() !== undefined,
|
|
8
|
+
cancel: async () => {
|
|
9
|
+
context.transactions.clear();
|
|
10
|
+
return canceled();
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async function authenticate(context, options) {
|
|
15
|
+
if (options.authenticators?.includes("passkey")) {
|
|
16
|
+
const transaction = await startPasskey(context, {
|
|
17
|
+
username: options.username,
|
|
18
|
+
challengeType: "passkey",
|
|
19
|
+
});
|
|
20
|
+
if (transaction.status !== "PENDING") {
|
|
21
|
+
return transaction;
|
|
22
|
+
}
|
|
23
|
+
return context.webauthn ? proceed(context, { step: "challenge-passkey" }) : transaction;
|
|
24
|
+
}
|
|
25
|
+
if (!options.username?.trim()) {
|
|
26
|
+
return pending(identifyStep());
|
|
27
|
+
}
|
|
28
|
+
const transaction = await identify(context, { username: options.username });
|
|
29
|
+
if (transaction.status !== "PENDING" || !options.password) {
|
|
30
|
+
return transaction;
|
|
31
|
+
}
|
|
32
|
+
return proceed(context, { step: "challenge-password", password: options.password });
|
|
33
|
+
}
|
|
34
|
+
async function start(context, options) {
|
|
35
|
+
return options.challengeType === "passkey"
|
|
36
|
+
? startPasskey(context, options)
|
|
37
|
+
: identify(context, { username: options.username });
|
|
38
|
+
}
|
|
39
|
+
async function proceed(context, options) {
|
|
40
|
+
if (options.continuationToken) {
|
|
41
|
+
const current = context.transactions.load();
|
|
42
|
+
context.transactions.save({
|
|
43
|
+
continuationToken: options.continuationToken,
|
|
44
|
+
username: options.username ?? current?.username,
|
|
45
|
+
challengeType: current?.challengeType,
|
|
46
|
+
nextStep: options.step ?? current?.nextStep ?? "identify",
|
|
47
|
+
selectedMethod: options.authenticator ?? current?.selectedMethod,
|
|
48
|
+
availableMethods: current?.availableMethods,
|
|
49
|
+
publicKey: options.publicKey ?? current?.publicKey,
|
|
50
|
+
expiresAt: current?.expiresAt,
|
|
51
|
+
scopes: current?.scopes ?? context.options.scopes.join(" "),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const step = options.step ?? context.transactions.load()?.nextStep;
|
|
55
|
+
if (!step) {
|
|
56
|
+
throw new RuntimeError("There is no in-progress authentication transaction.", { code: "no_transaction" });
|
|
57
|
+
}
|
|
58
|
+
return runRemediation(context, step, options);
|
|
59
|
+
}
|
|
60
|
+
function runRemediation(context, step, options) {
|
|
61
|
+
switch (step) {
|
|
62
|
+
case "identify":
|
|
63
|
+
return identify(context, options);
|
|
64
|
+
case "challenge-password":
|
|
65
|
+
return challengePassword(context, options);
|
|
66
|
+
case "select-authenticator":
|
|
67
|
+
return selectAuthenticator(context, options);
|
|
68
|
+
case "challenge-authenticator":
|
|
69
|
+
return challengeAuthenticator(context, options);
|
|
70
|
+
case "challenge-passkey":
|
|
71
|
+
return challengePasskey(context, options);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function identify(context, options) {
|
|
75
|
+
const username = options.username?.trim();
|
|
76
|
+
if (!username) {
|
|
77
|
+
return pending(identifyStep());
|
|
78
|
+
}
|
|
79
|
+
const response = await context.http.postForm(context.options.endpoints.initiate, {
|
|
80
|
+
[Parameters.ClientId]: context.options.clientId,
|
|
81
|
+
[Parameters.Username]: username,
|
|
82
|
+
[Parameters.ChallengeType]: ChallengeTypes.Password,
|
|
83
|
+
});
|
|
84
|
+
const body = asRecord(response.body);
|
|
85
|
+
const continuationToken = readString(body, "continuationToken", "continuation_token");
|
|
86
|
+
if (response.status >= 200 && response.status < 300 && continuationToken) {
|
|
87
|
+
const expiresIn = readNumber(body, "expiresIn", "expires_in");
|
|
88
|
+
context.transactions.save({
|
|
89
|
+
continuationToken,
|
|
90
|
+
username,
|
|
91
|
+
challengeType: ChallengeTypes.Password,
|
|
92
|
+
nextStep: "challenge-password",
|
|
93
|
+
scopes: context.options.scopes.join(" "),
|
|
94
|
+
expiresAt: expiresIn === undefined ? undefined : Date.now() + expiresIn * 1000,
|
|
95
|
+
});
|
|
96
|
+
return pending(passwordStep());
|
|
97
|
+
}
|
|
98
|
+
return failure(new OAuthError(readString(body, "error") ?? "invalid_request", {
|
|
99
|
+
errorDescription: readString(body, "error_description", "errorDescription") ?? "The initiate request failed.",
|
|
100
|
+
}), identifyStep());
|
|
101
|
+
}
|
|
102
|
+
async function challengePassword(context, options) {
|
|
103
|
+
const transaction = context.transactions.require();
|
|
104
|
+
if (!options.password) {
|
|
105
|
+
return pending(passwordStep());
|
|
106
|
+
}
|
|
107
|
+
if (!transaction.username) {
|
|
108
|
+
throw new RuntimeError("The password challenge is missing a username.", { code: "username_required" });
|
|
109
|
+
}
|
|
110
|
+
const result = await exchangeToken(context.http, context.options, {
|
|
111
|
+
grantType: GrantTypes.Password,
|
|
112
|
+
scopes: transaction.scopes,
|
|
113
|
+
extra: {
|
|
114
|
+
[Parameters.Username]: transaction.username,
|
|
115
|
+
[Parameters.Password]: options.password,
|
|
116
|
+
[Parameters.ContinuationToken]: transaction.continuationToken,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
if (result.tokens) {
|
|
120
|
+
return completeWithTokens(context, result.tokens);
|
|
121
|
+
}
|
|
122
|
+
if (result.mfa) {
|
|
123
|
+
const availableMethods = parseMfaMethods(result.mfa.availableMethods);
|
|
124
|
+
const selectedMethod = isMfaMethod(result.mfa.method) ? result.mfa.method : undefined;
|
|
125
|
+
const nextStep = selectedMethod ? "challenge-authenticator" : "select-authenticator";
|
|
126
|
+
context.transactions.save({
|
|
127
|
+
...transaction,
|
|
128
|
+
continuationToken: result.mfa.continuationToken,
|
|
129
|
+
selectedMethod,
|
|
130
|
+
availableMethods,
|
|
131
|
+
nextStep,
|
|
132
|
+
});
|
|
133
|
+
return pending(selectedMethod ? challengeAuthenticatorStep() : selectAuthenticatorStep(availableMethods));
|
|
134
|
+
}
|
|
135
|
+
return failure(result.error ?? new RuntimeError("The password challenge failed."));
|
|
136
|
+
}
|
|
137
|
+
async function selectAuthenticator(context, options) {
|
|
138
|
+
const transaction = context.transactions.require();
|
|
139
|
+
const method = options.authenticator;
|
|
140
|
+
if (method !== "authenticator" && method !== "recovery_code") {
|
|
141
|
+
return pending(selectAuthenticatorStep(transaction.availableMethods));
|
|
142
|
+
}
|
|
143
|
+
const response = await context.http.postForm(context.options.endpoints.challenge, {
|
|
144
|
+
[Parameters.ClientId]: context.options.clientId,
|
|
145
|
+
[Parameters.ContinuationToken]: options.continuationToken ?? transaction.continuationToken,
|
|
146
|
+
[Parameters.Method]: method,
|
|
147
|
+
});
|
|
148
|
+
if (response.status === 404) {
|
|
149
|
+
return failure(new RuntimeError("The MFA challenge endpoint is not available.", { code: "challenge_unavailable" }), selectAuthenticatorStep(transaction.availableMethods));
|
|
150
|
+
}
|
|
151
|
+
const body = asRecord(response.body);
|
|
152
|
+
const continuationToken = readString(body, "continuationToken", "continuation_token");
|
|
153
|
+
if (response.status >= 200 && response.status < 300 && continuationToken) {
|
|
154
|
+
const expiresIn = readNumber(body, "expiresIn", "expires_in");
|
|
155
|
+
context.transactions.save({
|
|
156
|
+
...transaction,
|
|
157
|
+
continuationToken,
|
|
158
|
+
selectedMethod: method,
|
|
159
|
+
nextStep: "challenge-authenticator",
|
|
160
|
+
expiresAt: expiresIn === undefined ? transaction.expiresAt : Date.now() + expiresIn * 1000,
|
|
161
|
+
});
|
|
162
|
+
return pending(challengeAuthenticatorStep());
|
|
163
|
+
}
|
|
164
|
+
return failure(new OAuthError(readString(body, "error") ?? "invalid_request", {
|
|
165
|
+
errorDescription: readString(body, "error_description", "errorDescription") ?? "The authenticator could not be selected.",
|
|
166
|
+
continuationToken,
|
|
167
|
+
}), selectAuthenticatorStep(transaction.availableMethods));
|
|
168
|
+
}
|
|
169
|
+
async function challengeAuthenticator(context, options) {
|
|
170
|
+
const transaction = context.transactions.require();
|
|
171
|
+
const method = options.authenticator ?? transaction.selectedMethod;
|
|
172
|
+
if (!options.verificationCode || (method !== "authenticator" && method !== "recovery_code")) {
|
|
173
|
+
return pending(challengeAuthenticatorStep());
|
|
174
|
+
}
|
|
175
|
+
const result = await exchangeToken(context.http, context.options, {
|
|
176
|
+
grantType: GrantTypes.TwoFactor,
|
|
177
|
+
scopes: transaction.scopes,
|
|
178
|
+
extra: {
|
|
179
|
+
[Parameters.ContinuationToken]: options.continuationToken ?? transaction.continuationToken,
|
|
180
|
+
[Parameters.Method]: method,
|
|
181
|
+
[Parameters.Code]: options.verificationCode,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
return result.tokens
|
|
185
|
+
? completeWithTokens(context, result.tokens)
|
|
186
|
+
: failure(result.error ?? new RuntimeError("The authenticator challenge failed."));
|
|
187
|
+
}
|
|
188
|
+
async function startPasskey(context, options) {
|
|
189
|
+
const response = await context.http.postForm(context.options.endpoints.passkeyInitiate, {
|
|
190
|
+
[Parameters.ClientId]: context.options.clientId,
|
|
191
|
+
[Parameters.LoginHint]: options.username?.trim() ?? "",
|
|
192
|
+
[Parameters.Scope]: options.scopes ?? context.options.scopes.join(" "),
|
|
193
|
+
});
|
|
194
|
+
const body = asRecord(response.body);
|
|
195
|
+
const continuationToken = readString(body, "continuationToken", "continuation_token");
|
|
196
|
+
const publicKey = readUnknown(body, "publicKey", "public_key");
|
|
197
|
+
if (response.status >= 200 && response.status < 300 && continuationToken) {
|
|
198
|
+
const expiresIn = readNumber(body, "expiresIn", "expires_in");
|
|
199
|
+
context.transactions.save({
|
|
200
|
+
continuationToken,
|
|
201
|
+
username: options.username?.trim(),
|
|
202
|
+
challengeType: ChallengeTypes.Passkey,
|
|
203
|
+
nextStep: "challenge-passkey",
|
|
204
|
+
publicKey,
|
|
205
|
+
scopes: options.scopes ?? context.options.scopes.join(" "),
|
|
206
|
+
expiresAt: expiresIn === undefined ? undefined : Date.now() + expiresIn * 1000,
|
|
207
|
+
});
|
|
208
|
+
return pending(challengePasskeyStep(publicKey));
|
|
209
|
+
}
|
|
210
|
+
return failure(new OAuthError(readString(body, "error") ?? "invalid_request", {
|
|
211
|
+
errorDescription: readString(body, "error_description", "errorDescription") ?? "The passkey initiate request failed.",
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
async function challengePasskey(context, options) {
|
|
215
|
+
const transaction = context.transactions.require();
|
|
216
|
+
const publicKey = options.publicKey ?? transaction.publicKey;
|
|
217
|
+
let credential = options.credential;
|
|
218
|
+
if (!credential) {
|
|
219
|
+
if (!publicKey) {
|
|
220
|
+
return failure(new RuntimeError("The passkey challenge is missing publicKey.", { code: "passkey_public_key_required" }));
|
|
221
|
+
}
|
|
222
|
+
if (!context.webauthn) {
|
|
223
|
+
return pending(challengePasskeyStep(publicKey));
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
credential = await context.webauthn.get(publicKey);
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
return failure(error instanceof RuntimeError
|
|
230
|
+
? error
|
|
231
|
+
: new RuntimeError("The passkey challenge was cancelled.", { code: "webauthn_cancelled", cause: error }), challengePasskeyStep(publicKey));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const complete = await context.http.postForm(context.options.endpoints.passkeyComplete, {
|
|
235
|
+
[Parameters.ClientId]: context.options.clientId,
|
|
236
|
+
[Parameters.ContinuationToken]: options.continuationToken ?? transaction.continuationToken,
|
|
237
|
+
[Parameters.Credential]: credential,
|
|
238
|
+
});
|
|
239
|
+
const completeBody = asRecord(complete.body);
|
|
240
|
+
const continuationToken = readString(completeBody, "continuationToken", "continuation_token");
|
|
241
|
+
if (complete.status < 200 || complete.status >= 300 || !continuationToken) {
|
|
242
|
+
return failure(new OAuthError(readString(completeBody, "error") ?? "invalid_grant", {
|
|
243
|
+
errorDescription: readString(completeBody, "error_description", "errorDescription") ??
|
|
244
|
+
"The passkey assertion could not be verified.",
|
|
245
|
+
}), challengePasskeyStep(publicKey));
|
|
246
|
+
}
|
|
247
|
+
const expiresIn = readNumber(completeBody, "expiresIn", "expires_in");
|
|
248
|
+
context.transactions.save({
|
|
249
|
+
...transaction,
|
|
250
|
+
continuationToken,
|
|
251
|
+
publicKey: undefined,
|
|
252
|
+
nextStep: "challenge-passkey",
|
|
253
|
+
expiresAt: expiresIn === undefined ? transaction.expiresAt : Date.now() + expiresIn * 1000,
|
|
254
|
+
});
|
|
255
|
+
const result = await exchangeToken(context.http, context.options, {
|
|
256
|
+
grantType: GrantTypes.Passkey,
|
|
257
|
+
scopes: transaction.scopes,
|
|
258
|
+
extra: { [Parameters.ContinuationToken]: continuationToken },
|
|
259
|
+
});
|
|
260
|
+
return result.tokens
|
|
261
|
+
? completeWithTokens(context, result.tokens)
|
|
262
|
+
: failure(result.error ?? new RuntimeError("The passkey token request failed."));
|
|
263
|
+
}
|
|
264
|
+
async function completeWithTokens(context, tokens) {
|
|
265
|
+
const scopes = context.transactions.load()?.scopes ?? context.options.scopes.join(" ");
|
|
266
|
+
const idToken = tokens.idToken?.token;
|
|
267
|
+
if (idToken) {
|
|
268
|
+
await verifyIdToken(idToken, {
|
|
269
|
+
issuer: context.options.issuer,
|
|
270
|
+
clientId: context.options.clientId,
|
|
271
|
+
http: context.http,
|
|
272
|
+
jwksUri: context.options.endpoints.jwks,
|
|
273
|
+
cache: context.cache.get("cache"),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
else if (scopes.split(/\s+/).includes("openid")) {
|
|
277
|
+
throw new RuntimeError("The token response did not include an ID token.", { code: "missing_id_token" });
|
|
278
|
+
}
|
|
279
|
+
context.transactions.clear();
|
|
280
|
+
context.tokenManager.setTokens(tokens);
|
|
281
|
+
context.clientState.updateClientState();
|
|
282
|
+
return success(tokens);
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=interaction-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-client.js","sourceRoot":"","sources":["../../src/interaction/interaction-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type TransactionMeta } from "@neuroncloud/ido-core";
|
|
2
|
+
import type { CacheManager } from "../cache/cache.js";
|
|
3
|
+
export declare class InteractionTransactionManager {
|
|
4
|
+
private readonly cache;
|
|
5
|
+
constructor(cache: CacheManager);
|
|
6
|
+
load(): TransactionMeta | undefined;
|
|
7
|
+
save(transaction: TransactionMeta): void;
|
|
8
|
+
clear(): void;
|
|
9
|
+
require(): TransactionMeta;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/interaction/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,qBAAa,6BAA6B;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAEhD,IAAI,IAAI,eAAe,GAAG,SAAS;IAsBnC,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI;IAIxC,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,eAAe;CAS3B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RuntimeError, StorageKeys } from "@neuroncloud/ido-core";
|
|
2
|
+
export class InteractionTransactionManager {
|
|
3
|
+
cache;
|
|
4
|
+
constructor(cache) {
|
|
5
|
+
this.cache = cache;
|
|
6
|
+
}
|
|
7
|
+
load() {
|
|
8
|
+
const raw = this.cache.get("transaction").getItem(StorageKeys.Transaction);
|
|
9
|
+
if (!raw) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const transaction = JSON.parse(raw);
|
|
14
|
+
if (transaction.expiresAt !== undefined && transaction.expiresAt <= Date.now()) {
|
|
15
|
+
this.clear();
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return transaction;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
this.clear();
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
save(transaction) {
|
|
26
|
+
this.cache.get("transaction").setItem(StorageKeys.Transaction, JSON.stringify(transaction));
|
|
27
|
+
}
|
|
28
|
+
clear() {
|
|
29
|
+
this.cache.get("transaction").removeItem(StorageKeys.Transaction);
|
|
30
|
+
}
|
|
31
|
+
require() {
|
|
32
|
+
const transaction = this.load();
|
|
33
|
+
if (!transaction) {
|
|
34
|
+
throw new RuntimeError("There is no in-progress authentication transaction.", { code: "no_transaction" });
|
|
35
|
+
}
|
|
36
|
+
return transaction;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/interaction/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAwB,MAAM,uBAAuB,CAAC;AAGxF,MAAM,OAAO,6BAA6B;IACX;IAA7B,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE3E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;YAEvD,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,IAAI,WAAW,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAA4B;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEhC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,YAAY,CAAC,qDAAqD,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Tokens } from "@neuroncloud/ido-core";
|
|
2
|
+
import type { TokenManager } from "./token/token-manager.js";
|
|
3
|
+
export interface ClientState {
|
|
4
|
+
isAuthenticated: boolean;
|
|
5
|
+
accessToken?: string;
|
|
6
|
+
idToken?: string;
|
|
7
|
+
tokens: Tokens;
|
|
8
|
+
}
|
|
9
|
+
export type ClientStateListener = (state: ClientState) => void;
|
|
10
|
+
export declare class ClientStateManager {
|
|
11
|
+
private readonly tokenManager;
|
|
12
|
+
private state;
|
|
13
|
+
private readonly listeners;
|
|
14
|
+
constructor(tokenManager: TokenManager);
|
|
15
|
+
getClientState(): ClientState;
|
|
16
|
+
subscribe(listener: ClientStateListener): () => void;
|
|
17
|
+
unsubscribe(listener?: ClientStateListener): void;
|
|
18
|
+
updateClientState(): ClientState;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../src/state-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE/D,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAHzC,OAAO,CAAC,KAAK,CAAuD;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;gBAE/B,YAAY,EAAE,YAAY;IAEvD,cAAc,IAAI,WAAW;IAI7B,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOpD,WAAW,CAAC,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI;IASjD,iBAAiB,IAAI,WAAW;CAkBjC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export class ClientStateManager {
|
|
2
|
+
tokenManager;
|
|
3
|
+
state = { isAuthenticated: false, tokens: {} };
|
|
4
|
+
listeners = new Set();
|
|
5
|
+
constructor(tokenManager) {
|
|
6
|
+
this.tokenManager = tokenManager;
|
|
7
|
+
}
|
|
8
|
+
getClientState() {
|
|
9
|
+
return this.state;
|
|
10
|
+
}
|
|
11
|
+
subscribe(listener) {
|
|
12
|
+
this.listeners.add(listener);
|
|
13
|
+
return () => {
|
|
14
|
+
this.listeners.delete(listener);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
unsubscribe(listener) {
|
|
18
|
+
if (listener) {
|
|
19
|
+
this.listeners.delete(listener);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
this.listeners.clear();
|
|
23
|
+
}
|
|
24
|
+
updateClientState() {
|
|
25
|
+
const tokens = this.tokenManager.getTokens();
|
|
26
|
+
const accessToken = this.tokenManager.getSync("accessToken")?.token;
|
|
27
|
+
const idToken = this.tokenManager.getSync("idToken")?.token;
|
|
28
|
+
this.state = {
|
|
29
|
+
isAuthenticated: Boolean(accessToken),
|
|
30
|
+
accessToken,
|
|
31
|
+
idToken,
|
|
32
|
+
tokens,
|
|
33
|
+
};
|
|
34
|
+
for (const listener of this.listeners) {
|
|
35
|
+
listener(this.state);
|
|
36
|
+
}
|
|
37
|
+
return this.state;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../src/state-manager.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,kBAAkB;IAIA;IAHrB,KAAK,GAAgB,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACnD,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE5D,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAE3D,cAAc;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,QAA6B;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,QAA8B;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QAE5D,IAAI,CAAC,KAAK,GAAG;YACX,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC;YACrC,WAAW;YACX,OAAO;YACP,MAAM;SACP,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type IntrospectionResult, type Token, type TokenKey, type Tokens } from "@neuroncloud/ido-core";
|
|
2
|
+
import type { CacheManager } from "../cache/cache.js";
|
|
3
|
+
import type { ResolvedClientOptions } from "../client-options.js";
|
|
4
|
+
import type { HttpClient } from "../adapters/http.js";
|
|
5
|
+
import type { ClientStateManager } from "../state-manager.js";
|
|
6
|
+
export type TokenManagerEvent = "added" | "expired" | "renewed" | "removed" | "error" | "changed";
|
|
7
|
+
export type TokenManagerListener = (event: TokenManagerEvent, ...args: unknown[]) => void;
|
|
8
|
+
export type TokenRenewHandler = () => Promise<Tokens>;
|
|
9
|
+
export declare class TokenManager {
|
|
10
|
+
private readonly storage;
|
|
11
|
+
private readonly options;
|
|
12
|
+
private tokens;
|
|
13
|
+
private renewHandler?;
|
|
14
|
+
private renewing?;
|
|
15
|
+
private unwatchStorage?;
|
|
16
|
+
private readonly timers;
|
|
17
|
+
private readonly listeners;
|
|
18
|
+
constructor(storage: CacheManager, options: ResolvedClientOptions);
|
|
19
|
+
bindRenew(handler: TokenRenewHandler): void;
|
|
20
|
+
start(): void;
|
|
21
|
+
stop(): void;
|
|
22
|
+
getTokens(): Tokens;
|
|
23
|
+
setTokens(tokens: Tokens): void;
|
|
24
|
+
getSync(key: TokenKey): Token | undefined;
|
|
25
|
+
get(key: TokenKey): Promise<Token | undefined>;
|
|
26
|
+
hasExpired(token: Token): boolean;
|
|
27
|
+
renew(key?: TokenKey): Promise<Token | undefined>;
|
|
28
|
+
remove(key: TokenKey): void;
|
|
29
|
+
clear(): void;
|
|
30
|
+
on(event: TokenManagerEvent, listener: TokenManagerListener): void;
|
|
31
|
+
off(event: TokenManagerEvent, listener?: TokenManagerListener): void;
|
|
32
|
+
private emit;
|
|
33
|
+
private pruneExpired;
|
|
34
|
+
private scheduleAll;
|
|
35
|
+
private schedule;
|
|
36
|
+
private onTimer;
|
|
37
|
+
private clearTimer;
|
|
38
|
+
private clearTimers;
|
|
39
|
+
private persist;
|
|
40
|
+
private loadFromStorage;
|
|
41
|
+
private watchStorage;
|
|
42
|
+
}
|
|
43
|
+
export declare function tokensFromResponse(body: unknown, issuedAt?: number): Tokens;
|
|
44
|
+
export interface TokenApi {
|
|
45
|
+
refresh(): Promise<Tokens>;
|
|
46
|
+
revoke(token?: string, hint?: "access_token" | "refresh_token"): Promise<void>;
|
|
47
|
+
introspect(token?: string, hint?: "access_token" | "refresh_token"): Promise<IntrospectionResult>;
|
|
48
|
+
getUserInfo(): Promise<Record<string, unknown>>;
|
|
49
|
+
}
|
|
50
|
+
export declare function createTokenApi(http: HttpClient, options: ResolvedClientOptions, tokenManager: TokenManager, clientState: ClientStateManager, cache: CacheManager): TokenApi;
|
|
51
|
+
//# sourceMappingURL=token-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/token/token-manager.ts"],"names":[],"mappings":"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"}
|