@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/adapters/crypto.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACxC,MAAM,CAAC,SAAS,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAClF;AAED,eAAO,MAAM,gBAAgB,EAAE,aAO9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/adapters/crypto.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,gBAAgB,GAAkB;IAC7C,WAAW,CAAC,MAAM;QAChB,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,IAAI;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ProtocolHttpClient, ProtocolHttpResponse } from "@neuroncloud/ido-core";
|
|
2
|
+
export interface HttpRequest {
|
|
3
|
+
method: string;
|
|
4
|
+
url: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
body?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export type HttpResponse = ProtocolHttpResponse;
|
|
9
|
+
export interface HttpAdapter {
|
|
10
|
+
request(request: HttpRequest): Promise<HttpResponse>;
|
|
11
|
+
}
|
|
12
|
+
export interface ConfidentialAdapter {
|
|
13
|
+
applyClientAuth(body: Record<string, string>): Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export declare const noopConfidentialAdapter: ConfidentialAdapter;
|
|
16
|
+
export declare const fetchHttpAdapter: HttpAdapter;
|
|
17
|
+
export declare class HttpClient implements ProtocolHttpClient {
|
|
18
|
+
private readonly http;
|
|
19
|
+
private readonly confidential;
|
|
20
|
+
constructor(http: HttpAdapter, confidential: ConfidentialAdapter);
|
|
21
|
+
postForm(url: string, body: Record<string, string>, clientAuth?: boolean): Promise<HttpResponse>;
|
|
22
|
+
get(url: string, headers?: Record<string, string>): Promise<HttpResponse>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/adapters/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvE;AAED,eAAO,MAAM,uBAAuB,EAAE,mBAIrC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,WAwC9B,CAAC;AAEF,qBAAa,UAAW,YAAW,kBAAkB;IAEjD,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,mBAAmB;IAGpD,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ9F,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;CAG1E"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const noopConfidentialAdapter = {
|
|
2
|
+
applyClientAuth(body) {
|
|
3
|
+
return body;
|
|
4
|
+
},
|
|
5
|
+
};
|
|
6
|
+
export const fetchHttpAdapter = {
|
|
7
|
+
async request(request) {
|
|
8
|
+
const headers = {
|
|
9
|
+
Accept: "application/json",
|
|
10
|
+
...request.headers,
|
|
11
|
+
};
|
|
12
|
+
let body;
|
|
13
|
+
if (request.body) {
|
|
14
|
+
headers["Content-Type"] ??= "application/x-www-form-urlencoded";
|
|
15
|
+
body = new URLSearchParams(request.body).toString();
|
|
16
|
+
}
|
|
17
|
+
const response = await fetch(request.url, {
|
|
18
|
+
method: request.method,
|
|
19
|
+
headers,
|
|
20
|
+
body,
|
|
21
|
+
});
|
|
22
|
+
const text = await response.text();
|
|
23
|
+
let parsed = text || undefined;
|
|
24
|
+
if (text) {
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(text);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
parsed = text;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const responseHeaders = {};
|
|
33
|
+
response.headers.forEach((value, key) => {
|
|
34
|
+
responseHeaders[key] = value;
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
status: response.status,
|
|
38
|
+
headers: responseHeaders,
|
|
39
|
+
body: parsed,
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export class HttpClient {
|
|
44
|
+
http;
|
|
45
|
+
confidential;
|
|
46
|
+
constructor(http, confidential) {
|
|
47
|
+
this.http = http;
|
|
48
|
+
this.confidential = confidential;
|
|
49
|
+
}
|
|
50
|
+
postForm(url, body, clientAuth = false) {
|
|
51
|
+
return this.http.request({
|
|
52
|
+
method: "POST",
|
|
53
|
+
url,
|
|
54
|
+
body: clientAuth ? this.confidential.applyClientAuth(compact(body)) : compact(body),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
get(url, headers) {
|
|
58
|
+
return this.http.request({ method: "GET", url, headers });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function compact(body) {
|
|
62
|
+
return Object.fromEntries(Object.entries(body).filter(([, value]) => value !== ""));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/adapters/http.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,uBAAuB,GAAwB;IAC1D,eAAe,CAAC,IAAI;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC3C,KAAK,CAAC,OAAO,CAAC,OAAO;QACnB,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;YAC1B,GAAG,OAAO,CAAC,OAAO;SACnB,CAAC;QACF,IAAI,IAAwB,CAAC;QAE7B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,cAAc,CAAC,KAAK,mCAAmC,CAAC;YAChE,IAAI,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,GAAY,IAAI,IAAI,SAAS,CAAC;QAExC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAA2B,EAAE,CAAC;QACnD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,eAAe,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,MAAM,OAAO,UAAU;IAEF;IACA;IAFnB,YACmB,IAAiB,EACjB,YAAiC;QADjC,SAAI,GAAJ,IAAI,CAAa;QACjB,iBAAY,GAAZ,YAAY,CAAqB;IACjD,CAAC;IAEJ,QAAQ,CAAC,GAAW,EAAE,IAA4B,EAAE,UAAU,GAAG,KAAK;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,GAAG;YACH,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;SACpF,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,OAAgC;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,SAAS,OAAO,CAAC,IAA4B;IAC3C,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../src/adapters/location.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,IAAI,MAAM,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/adapters/location.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface StorageChange {
|
|
2
|
+
key: string | null;
|
|
3
|
+
value: string | null;
|
|
4
|
+
}
|
|
5
|
+
export type StorageChangeListener = (event: StorageChange) => void;
|
|
6
|
+
export interface StorageAdapter {
|
|
7
|
+
getItem(key: string): string | null;
|
|
8
|
+
setItem(key: string, value: string): void;
|
|
9
|
+
removeItem(key: string): void;
|
|
10
|
+
subscribe?(listener: StorageChangeListener): () => void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/adapters/storage.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAAC;CACzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/adapters/storage.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../src/adapters/webauthn.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../../src/adapters/webauthn.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StorageAdapter } from "../adapters/storage.js";
|
|
2
|
+
export interface Cache extends StorageAdapter {
|
|
3
|
+
}
|
|
4
|
+
export interface CacheSlots {
|
|
5
|
+
token: Cache;
|
|
6
|
+
transaction: Cache;
|
|
7
|
+
cache: Cache;
|
|
8
|
+
}
|
|
9
|
+
export type CacheSlot = keyof CacheSlots;
|
|
10
|
+
export declare class CacheManager {
|
|
11
|
+
private readonly slots;
|
|
12
|
+
constructor(slots: CacheSlots);
|
|
13
|
+
get(slot: CacheSlot): Cache;
|
|
14
|
+
}
|
|
15
|
+
export type StorageProvider = Cache;
|
|
16
|
+
export type StorageSlots = CacheSlots;
|
|
17
|
+
export { CacheManager as StorageManager };
|
|
18
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,KAAM,SAAQ,cAAc;CAAG;AAEhD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,KAAK,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC;AAEzC,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,UAAU;IAE9C,GAAG,CAAC,IAAI,EAAE,SAAS,GAAG,KAAK;CAG5B;AAGD,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC;AACpC,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache/cache.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;IAAG,CAAC;IAElD,GAAG,CAAC,IAAe;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAKD,OAAO,EAAE,YAAY,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Cache } from "./cache.js";
|
|
2
|
+
export declare class MemoryCache implements Cache {
|
|
3
|
+
private readonly values;
|
|
4
|
+
getItem(key: string): string | null;
|
|
5
|
+
setItem(key: string, value: string): void;
|
|
6
|
+
removeItem(key: string): void;
|
|
7
|
+
}
|
|
8
|
+
export { MemoryCache as MemoryStorage };
|
|
9
|
+
//# sourceMappingURL=memory-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache.d.ts","sourceRoot":"","sources":["../../src/cache/memory-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,WAAY,YAAW,KAAK;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IAEpD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAG9B;AAED,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class MemoryCache {
|
|
2
|
+
values = new Map();
|
|
3
|
+
getItem(key) {
|
|
4
|
+
return this.values.get(key) ?? null;
|
|
5
|
+
}
|
|
6
|
+
setItem(key, value) {
|
|
7
|
+
this.values.set(key, value);
|
|
8
|
+
}
|
|
9
|
+
removeItem(key) {
|
|
10
|
+
this.values.delete(key);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export { MemoryCache as MemoryStorage };
|
|
14
|
+
//# sourceMappingURL=memory-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache.js","sourceRoot":"","sources":["../../src/cache/memory-cache.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACL,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,KAAa;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF;AAED,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ProtocolEndpoints } from "@neuroncloud/ido-core";
|
|
2
|
+
import type { CacheSlots } from "./cache/cache.js";
|
|
3
|
+
export interface AuthEndpoints extends ProtocolEndpoints {
|
|
4
|
+
}
|
|
5
|
+
export type StorageSlots = CacheSlots;
|
|
6
|
+
export interface ClientOptions {
|
|
7
|
+
issuer: string;
|
|
8
|
+
clientId: string;
|
|
9
|
+
redirectUri?: string;
|
|
10
|
+
postLogoutRedirectUri?: string;
|
|
11
|
+
scopes?: string[];
|
|
12
|
+
prompt?: string;
|
|
13
|
+
idp?: string;
|
|
14
|
+
extraParams?: Record<string, string>;
|
|
15
|
+
endpoints?: Partial<AuthEndpoints>;
|
|
16
|
+
expireEarlySeconds?: number;
|
|
17
|
+
autoRenew?: boolean;
|
|
18
|
+
autoRemove?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedClientOptions {
|
|
21
|
+
issuer: string;
|
|
22
|
+
clientId: string;
|
|
23
|
+
redirectUri?: string;
|
|
24
|
+
postLogoutRedirectUri?: string;
|
|
25
|
+
scopes: string[];
|
|
26
|
+
prompt?: string;
|
|
27
|
+
idp?: string;
|
|
28
|
+
extraParams?: Record<string, string>;
|
|
29
|
+
endpoints: AuthEndpoints;
|
|
30
|
+
expireEarlySeconds: number;
|
|
31
|
+
autoRenew: boolean;
|
|
32
|
+
autoRemove: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function resolveClientOptions(options: ClientOptions): ResolvedClientOptions;
|
|
35
|
+
//# sourceMappingURL=client-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-options.d.ts","sourceRoot":"","sources":["../src/client-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,aAAc,SAAQ,iBAAiB;CAAG;AAC3D,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,SAAS,EAAE,aAAa,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,qBAAqB,CAqClF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { DefaultExpireEarlySeconds, DefaultScopes, RuntimeError } from "@neuroncloud/ido-core";
|
|
2
|
+
export function resolveClientOptions(options) {
|
|
3
|
+
if (!options.issuer?.trim()) {
|
|
4
|
+
throw new RuntimeError("issuer is required.", { code: "issuer_required" });
|
|
5
|
+
}
|
|
6
|
+
if (!options.clientId?.trim()) {
|
|
7
|
+
throw new RuntimeError("clientId is required.", { code: "client_id_required" });
|
|
8
|
+
}
|
|
9
|
+
const issuer = options.issuer.replace(/\/+$/, "");
|
|
10
|
+
return {
|
|
11
|
+
issuer,
|
|
12
|
+
clientId: options.clientId,
|
|
13
|
+
redirectUri: options.redirectUri,
|
|
14
|
+
postLogoutRedirectUri: options.postLogoutRedirectUri,
|
|
15
|
+
scopes: options.scopes?.length ? [...options.scopes] : [...DefaultScopes],
|
|
16
|
+
prompt: options.prompt,
|
|
17
|
+
idp: options.idp,
|
|
18
|
+
extraParams: options.extraParams ? { ...options.extraParams } : undefined,
|
|
19
|
+
expireEarlySeconds: options.expireEarlySeconds ?? DefaultExpireEarlySeconds,
|
|
20
|
+
autoRenew: options.autoRenew ?? true,
|
|
21
|
+
autoRemove: options.autoRemove ?? true,
|
|
22
|
+
endpoints: {
|
|
23
|
+
authorize: options.endpoints?.authorize ?? `${issuer}/connect/authorize`,
|
|
24
|
+
token: options.endpoints?.token ?? `${issuer}/connect/token`,
|
|
25
|
+
userinfo: options.endpoints?.userinfo ?? `${issuer}/connect/userinfo`,
|
|
26
|
+
revocation: options.endpoints?.revocation ?? `${issuer}/connect/revocation`,
|
|
27
|
+
introspection: options.endpoints?.introspection ?? `${issuer}/connect/introspection`,
|
|
28
|
+
jwks: options.endpoints?.jwks ?? `${issuer}/.well-known/jwks`,
|
|
29
|
+
logout: options.endpoints?.logout ?? `${issuer}/connect/logout`,
|
|
30
|
+
initiate: options.endpoints?.initiate ?? `${issuer}/oauth2/v2.0/initiate`,
|
|
31
|
+
challenge: options.endpoints?.challenge ?? `${issuer}/oauth2/v2.0/challenge`,
|
|
32
|
+
passkeyInitiate: options.endpoints?.passkeyInitiate ?? `${issuer}/oauth2/v2.0/passkey/initiate`,
|
|
33
|
+
passkeyComplete: options.endpoints?.passkeyComplete ?? `${issuer}/oauth2/v2.0/passkey/complete`,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=client-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-options.js","sourceRoot":"","sources":["../src/client-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,YAAY,EAA0B,MAAM,uBAAuB,CAAC;AAoCvH,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,YAAY,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;QACpD,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QACzE,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QACzE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,yBAAyB;QAC3E,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,SAAS,EAAE;YACT,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,GAAG,MAAM,oBAAoB;YACxE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,GAAG,MAAM,gBAAgB;YAC5D,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,GAAG,MAAM,mBAAmB;YACrE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,IAAI,GAAG,MAAM,qBAAqB;YAC3E,aAAa,EAAE,OAAO,CAAC,SAAS,EAAE,aAAa,IAAI,GAAG,MAAM,wBAAwB;YACpF,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,IAAI,GAAG,MAAM,mBAAmB;YAC7D,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,GAAG,MAAM,iBAAiB;YAC/D,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,IAAI,GAAG,MAAM,uBAAuB;YACzE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,GAAG,MAAM,wBAAwB;YAC5E,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,eAAe,IAAI,GAAG,MAAM,+BAA+B;YAC/F,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,eAAe,IAAI,GAAG,MAAM,+BAA+B;SAChG;KACF,CAAC;AACJ,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type AuthorizationRequestOptions, type AuthorizationRequestState, type Tokens, type UserClaims } from "@neuroncloud/ido-core";
|
|
2
|
+
import type { ConfidentialAdapter, HttpAdapter } from "./adapters/http.js";
|
|
3
|
+
import type { LocationAdapter } from "./adapters/location.js";
|
|
4
|
+
import type { WebAuthnAdapter } from "./adapters/webauthn.js";
|
|
5
|
+
import { type CacheSlots } from "./cache/cache.js";
|
|
6
|
+
import { type ClientOptions } from "./client-options.js";
|
|
7
|
+
import { type InteractionClient } from "./interaction/interaction-client.js";
|
|
8
|
+
import { ClientStateManager } from "./state-manager.js";
|
|
9
|
+
import { TokenManager, type TokenApi } from "./token/token-manager.js";
|
|
10
|
+
export interface ClientAdapters {
|
|
11
|
+
http?: HttpAdapter;
|
|
12
|
+
storage: CacheSlots;
|
|
13
|
+
confidential?: ConfidentialAdapter;
|
|
14
|
+
webauthn?: WebAuthnAdapter;
|
|
15
|
+
location?: LocationAdapter;
|
|
16
|
+
}
|
|
17
|
+
export interface SignOutOptions {
|
|
18
|
+
revoke?: boolean;
|
|
19
|
+
postLogoutRedirectUri?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SignInWithRedirectOptions extends AuthorizationRequestOptions {
|
|
22
|
+
}
|
|
23
|
+
export interface RedirectMeta extends AuthorizationRequestState {
|
|
24
|
+
}
|
|
25
|
+
export interface IdoClient {
|
|
26
|
+
interaction: InteractionClient;
|
|
27
|
+
token: TokenApi;
|
|
28
|
+
tokenManager: TokenManager;
|
|
29
|
+
clientStateManager: ClientStateManager;
|
|
30
|
+
start(): Promise<void>;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
signOut(options?: SignOutOptions): Promise<void>;
|
|
33
|
+
signInWithRedirect(options?: SignInWithRedirectOptions): Promise<void>;
|
|
34
|
+
isLoginRedirect(url?: string): boolean;
|
|
35
|
+
handleRedirect(input?: string | {
|
|
36
|
+
url?: string;
|
|
37
|
+
originalUri?: string;
|
|
38
|
+
}): Promise<Tokens>;
|
|
39
|
+
setOriginalUri(uri: string): void;
|
|
40
|
+
getOriginalUri(): string | undefined;
|
|
41
|
+
removeOriginalUri(): void;
|
|
42
|
+
isAuthenticated(): Promise<boolean>;
|
|
43
|
+
getAccessToken(): string | undefined;
|
|
44
|
+
getIdToken(): string | undefined;
|
|
45
|
+
getUser(): Promise<UserClaims>;
|
|
46
|
+
}
|
|
47
|
+
export declare function createMemoryStorageSlots(): CacheSlots;
|
|
48
|
+
export declare function createClient(options: ClientOptions, adapters: ClientAdapters): IdoClient;
|
|
49
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAaL,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,MAAM,EACX,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAEtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAkB,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,UAAU,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,yBAA0B,SAAQ,2BAA2B;CAAG;AACjF,MAAM,WAAW,YAAa,SAAQ,yBAAyB;CAAG;AAElE,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,kBAAkB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzF,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,iBAAiB,IAAI,IAAI,CAAC;IAC1B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,cAAc,IAAI,MAAM,GAAG,SAAS,CAAC;IACrC,UAAU,IAAI,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAChC;AAED,wBAAgB,wBAAwB,IAAI,UAAU,CAMrD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,CA2KxF"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { cleanAuthorizationResponseUrl, createAuthorizationRequest, exchangeToken, GrantTypes, isAuthorizationResponse, Parameters, readAuthorizationResponse, readUserClaims, revokeToken, RuntimeError, StorageKeys, verifyIdToken, } from "@neuroncloud/ido-core";
|
|
2
|
+
import { fetchHttpAdapter, HttpClient, noopConfidentialAdapter } from "./adapters/http.js";
|
|
3
|
+
import { CacheManager } from "./cache/cache.js";
|
|
4
|
+
import { MemoryCache } from "./cache/memory-cache.js";
|
|
5
|
+
import { resolveClientOptions } from "./client-options.js";
|
|
6
|
+
import { createInteractionClient } from "./interaction/interaction-client.js";
|
|
7
|
+
import { InteractionTransactionManager } from "./interaction/transaction.js";
|
|
8
|
+
import { ClientStateManager } from "./state-manager.js";
|
|
9
|
+
import { createTokenApi, TokenManager } from "./token/token-manager.js";
|
|
10
|
+
export function createMemoryStorageSlots() {
|
|
11
|
+
return {
|
|
12
|
+
token: new MemoryCache(),
|
|
13
|
+
transaction: new MemoryCache(),
|
|
14
|
+
cache: new MemoryCache(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function createClient(options, adapters) {
|
|
18
|
+
const resolved = resolveClientOptions(options);
|
|
19
|
+
const cache = new CacheManager(adapters.storage);
|
|
20
|
+
const http = new HttpClient(adapters.http ?? fetchHttpAdapter, adapters.confidential ?? noopConfidentialAdapter);
|
|
21
|
+
const tokenManager = new TokenManager(cache, resolved);
|
|
22
|
+
const clientStateManager = new ClientStateManager(tokenManager);
|
|
23
|
+
const transactions = new InteractionTransactionManager(cache);
|
|
24
|
+
const interaction = createInteractionClient({
|
|
25
|
+
options: resolved,
|
|
26
|
+
http,
|
|
27
|
+
cache,
|
|
28
|
+
transactions,
|
|
29
|
+
tokenManager,
|
|
30
|
+
clientState: clientStateManager,
|
|
31
|
+
webauthn: adapters.webauthn,
|
|
32
|
+
});
|
|
33
|
+
const token = createTokenApi(http, resolved, tokenManager, clientStateManager, cache);
|
|
34
|
+
tokenManager.bindRenew(() => token.refresh());
|
|
35
|
+
tokenManager.on("changed", () => clientStateManager.updateClientState());
|
|
36
|
+
return {
|
|
37
|
+
interaction,
|
|
38
|
+
token,
|
|
39
|
+
tokenManager,
|
|
40
|
+
clientStateManager,
|
|
41
|
+
async start() {
|
|
42
|
+
tokenManager.start();
|
|
43
|
+
clientStateManager.updateClientState();
|
|
44
|
+
},
|
|
45
|
+
async stop() {
|
|
46
|
+
tokenManager.stop();
|
|
47
|
+
clientStateManager.unsubscribe();
|
|
48
|
+
},
|
|
49
|
+
async signOut(signOutOptions) {
|
|
50
|
+
const stored = tokenManager.getTokens();
|
|
51
|
+
const refresh = stored.refreshToken?.token;
|
|
52
|
+
const access = stored.accessToken?.token;
|
|
53
|
+
const idToken = stored.idToken?.token;
|
|
54
|
+
const postLogoutRedirectUri = signOutOptions?.postLogoutRedirectUri ?? resolved.postLogoutRedirectUri;
|
|
55
|
+
if (signOutOptions?.revoke !== false) {
|
|
56
|
+
if (refresh) {
|
|
57
|
+
await revokeToken(http, resolved, refresh, "refresh_token").catch(() => undefined);
|
|
58
|
+
}
|
|
59
|
+
if (access) {
|
|
60
|
+
await revokeToken(http, resolved, access, "access_token").catch(() => undefined);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
transactions.clear();
|
|
64
|
+
tokenManager.clear();
|
|
65
|
+
clientStateManager.updateClientState();
|
|
66
|
+
if (adapters.location && postLogoutRedirectUri) {
|
|
67
|
+
const logout = new URL(resolved.endpoints.logout);
|
|
68
|
+
logout.searchParams.set(Parameters.PostLogoutRedirectUri, postLogoutRedirectUri);
|
|
69
|
+
if (idToken) {
|
|
70
|
+
logout.searchParams.set(Parameters.IdTokenHint, idToken);
|
|
71
|
+
}
|
|
72
|
+
adapters.location.assign(logout.toString());
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
async signInWithRedirect(request = {}) {
|
|
76
|
+
if (!adapters.location) {
|
|
77
|
+
throw new RuntimeError("signInWithRedirect requires a location adapter.", { code: "redirect_unavailable" });
|
|
78
|
+
}
|
|
79
|
+
const originalUri = request.originalUri ?? readOriginalUri(cache) ?? adapters.location.getHref();
|
|
80
|
+
const authorization = await createAuthorizationRequest(resolved, { ...request, originalUri });
|
|
81
|
+
cache.get("transaction").setItem(StorageKeys.Redirect, JSON.stringify(authorization.state));
|
|
82
|
+
if (request.originalUri) {
|
|
83
|
+
writeOriginalUri(cache, request.originalUri);
|
|
84
|
+
}
|
|
85
|
+
adapters.location.assign(authorization.url);
|
|
86
|
+
},
|
|
87
|
+
isLoginRedirect(url) {
|
|
88
|
+
return isAuthorizationResponse(url ?? adapters.location?.getHref() ?? "");
|
|
89
|
+
},
|
|
90
|
+
async handleRedirect(input) {
|
|
91
|
+
const request = typeof input === "string" ? (adapters.location ? { originalUri: input } : { url: input }) : (input ?? {});
|
|
92
|
+
const url = request.url ?? adapters.location?.getHref();
|
|
93
|
+
if (!url) {
|
|
94
|
+
throw new RuntimeError("handleRedirect requires the callback URL.", { code: "redirect_url_required" });
|
|
95
|
+
}
|
|
96
|
+
const response = readAuthorizationResponse(url);
|
|
97
|
+
const rawState = cache.get("transaction").getItem(StorageKeys.Redirect);
|
|
98
|
+
const state = rawState ? JSON.parse(rawState) : undefined;
|
|
99
|
+
if (!state || state.state !== response.state) {
|
|
100
|
+
throw new RuntimeError("The login redirect state is invalid.", { code: "invalid_state" });
|
|
101
|
+
}
|
|
102
|
+
const result = await exchangeToken(http, resolved, {
|
|
103
|
+
grantType: GrantTypes.AuthorizationCode,
|
|
104
|
+
scopes: state.scopes,
|
|
105
|
+
extra: {
|
|
106
|
+
[Parameters.Code]: response.code,
|
|
107
|
+
[Parameters.RedirectUri]: state.redirectUri,
|
|
108
|
+
[Parameters.CodeVerifier]: state.codeVerifier,
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
cache.get("transaction").removeItem(StorageKeys.Redirect);
|
|
112
|
+
if (!result.tokens) {
|
|
113
|
+
throw result.error ?? new RuntimeError("The authorization code could not be exchanged.");
|
|
114
|
+
}
|
|
115
|
+
const idToken = result.tokens.idToken?.token;
|
|
116
|
+
if (idToken) {
|
|
117
|
+
await verifyIdToken(idToken, {
|
|
118
|
+
issuer: resolved.issuer,
|
|
119
|
+
clientId: resolved.clientId,
|
|
120
|
+
nonce: state.nonce,
|
|
121
|
+
http,
|
|
122
|
+
jwksUri: resolved.endpoints.jwks,
|
|
123
|
+
cache: cache.get("cache"),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else if (state.scopes.split(/\s+/).includes("openid")) {
|
|
127
|
+
throw new RuntimeError("The token response did not include an ID token.", { code: "missing_id_token" });
|
|
128
|
+
}
|
|
129
|
+
tokenManager.setTokens(result.tokens);
|
|
130
|
+
clientStateManager.updateClientState();
|
|
131
|
+
const restore = request.originalUri ?? state.originalUri ?? readOriginalUri(cache);
|
|
132
|
+
removeOriginalUri(cache);
|
|
133
|
+
if (adapters.location) {
|
|
134
|
+
adapters.location.replace(restore ?? cleanAuthorizationResponseUrl(url));
|
|
135
|
+
}
|
|
136
|
+
return result.tokens;
|
|
137
|
+
},
|
|
138
|
+
async isAuthenticated() {
|
|
139
|
+
await tokenManager.get("accessToken");
|
|
140
|
+
return clientStateManager.updateClientState().isAuthenticated;
|
|
141
|
+
},
|
|
142
|
+
setOriginalUri(uri) {
|
|
143
|
+
writeOriginalUri(cache, uri);
|
|
144
|
+
},
|
|
145
|
+
getOriginalUri() {
|
|
146
|
+
return readOriginalUri(cache);
|
|
147
|
+
},
|
|
148
|
+
removeOriginalUri() {
|
|
149
|
+
removeOriginalUri(cache);
|
|
150
|
+
},
|
|
151
|
+
getAccessToken() {
|
|
152
|
+
return tokenManager.getSync("accessToken")?.token;
|
|
153
|
+
},
|
|
154
|
+
getIdToken() {
|
|
155
|
+
return tokenManager.getSync("idToken")?.token;
|
|
156
|
+
},
|
|
157
|
+
async getUser() {
|
|
158
|
+
const idToken = tokenManager.getSync("idToken")?.token;
|
|
159
|
+
if (!idToken) {
|
|
160
|
+
throw new RuntimeError("An ID token is not available.", { code: "no_id_token" });
|
|
161
|
+
}
|
|
162
|
+
return readUserClaims(idToken);
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function writeOriginalUri(cache, uri) {
|
|
167
|
+
cache.get("transaction").setItem(StorageKeys.OriginalUri, uri);
|
|
168
|
+
}
|
|
169
|
+
function readOriginalUri(cache) {
|
|
170
|
+
return cache.get("transaction").getItem(StorageKeys.OriginalUri) ?? undefined;
|
|
171
|
+
}
|
|
172
|
+
function removeOriginalUri(cache) {
|
|
173
|
+
cache.get("transaction").removeItem(StorageKeys.OriginalUri);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|