@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.
Files changed (61) hide show
  1. package/dist/adapters/crypto.d.ts +6 -0
  2. package/dist/adapters/crypto.d.ts.map +1 -0
  3. package/dist/adapters/crypto.js +9 -0
  4. package/dist/adapters/crypto.js.map +1 -0
  5. package/dist/adapters/http.d.ts +24 -0
  6. package/dist/adapters/http.d.ts.map +1 -0
  7. package/dist/adapters/http.js +64 -0
  8. package/dist/adapters/http.js.map +1 -0
  9. package/dist/adapters/index.d.ts +6 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +6 -0
  12. package/dist/adapters/index.js.map +1 -0
  13. package/dist/adapters/location.d.ts +6 -0
  14. package/dist/adapters/location.d.ts.map +1 -0
  15. package/dist/adapters/location.js +2 -0
  16. package/dist/adapters/location.js.map +1 -0
  17. package/dist/adapters/storage.d.ts +12 -0
  18. package/dist/adapters/storage.d.ts.map +1 -0
  19. package/dist/adapters/storage.js +2 -0
  20. package/dist/adapters/storage.js.map +1 -0
  21. package/dist/adapters/webauthn.d.ts +4 -0
  22. package/dist/adapters/webauthn.d.ts.map +1 -0
  23. package/dist/adapters/webauthn.js +2 -0
  24. package/dist/adapters/webauthn.js.map +1 -0
  25. package/dist/cache/cache.d.ts +18 -0
  26. package/dist/cache/cache.d.ts.map +1 -0
  27. package/dist/cache/cache.js +11 -0
  28. package/dist/cache/cache.js.map +1 -0
  29. package/dist/cache/memory-cache.d.ts +9 -0
  30. package/dist/cache/memory-cache.d.ts.map +1 -0
  31. package/dist/cache/memory-cache.js +14 -0
  32. package/dist/cache/memory-cache.js.map +1 -0
  33. package/dist/client-options.d.ts +35 -0
  34. package/dist/client-options.d.ts.map +1 -0
  35. package/dist/client-options.js +37 -0
  36. package/dist/client-options.js.map +1 -0
  37. package/dist/client.d.ts +49 -0
  38. package/dist/client.d.ts.map +1 -0
  39. package/dist/client.js +175 -0
  40. package/dist/client.js.map +1 -0
  41. package/dist/index.d.ts +17 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +11 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/interaction/interaction-client.d.ts +26 -0
  46. package/dist/interaction/interaction-client.d.ts.map +1 -0
  47. package/dist/interaction/interaction-client.js +284 -0
  48. package/dist/interaction/interaction-client.js.map +1 -0
  49. package/dist/interaction/transaction.d.ts +11 -0
  50. package/dist/interaction/transaction.d.ts.map +1 -0
  51. package/dist/interaction/transaction.js +39 -0
  52. package/dist/interaction/transaction.js.map +1 -0
  53. package/dist/state-manager.d.ts +20 -0
  54. package/dist/state-manager.d.ts.map +1 -0
  55. package/dist/state-manager.js +40 -0
  56. package/dist/state-manager.js.map +1 -0
  57. package/dist/token/token-manager.d.ts +51 -0
  58. package/dist/token/token-manager.d.ts.map +1 -0
  59. package/dist/token/token-manager.js +303 -0
  60. package/dist/token/token-manager.js.map +1 -0
  61. package/package.json +27 -0
@@ -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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"}