@saolabs/client 1.5.0 → 1.6.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/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/src/core/app/Application.d.ts +2 -0
- package/dist/src/core/app/Application.d.ts.map +1 -1
- package/dist/src/core/app/Application.js +3 -0
- package/dist/src/core/app/Application.js.map +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts.map +1 -1
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.js +9 -0
- package/dist/src/core/bootstrap/providers/CoreServiceProvider.js.map +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.js +1 -1
- package/dist/src/core/bootstrap/providers/default-providers.js.map +1 -1
- package/dist/src/core/contracts/ApplicationInterface.d.ts +2 -0
- package/dist/src/core/contracts/ApplicationInterface.d.ts.map +1 -1
- package/dist/src/core/contracts/HelperInterface.d.ts +3 -0
- package/dist/src/core/contracts/HelperInterface.d.ts.map +1 -1
- package/dist/src/core/elements/Html.d.ts +1 -0
- package/dist/src/core/elements/Html.d.ts.map +1 -1
- package/dist/src/core/elements/Html.js +11 -0
- package/dist/src/core/elements/Html.js.map +1 -1
- package/dist/src/core/helpers/ApiClient.d.ts +1 -1
- package/dist/src/core/helpers/ApiClient.d.ts.map +1 -1
- package/dist/src/core/helpers/ApiClient.js +1 -11
- package/dist/src/core/helpers/ApiClient.js.map +1 -1
- package/dist/src/core/helpers/auth.d.ts +4 -0
- package/dist/src/core/helpers/auth.d.ts.map +1 -0
- package/dist/src/core/helpers/auth.js +10 -0
- package/dist/src/core/helpers/auth.js.map +1 -0
- package/dist/src/core/services/AuthClient.d.ts +54 -0
- package/dist/src/core/services/AuthClient.d.ts.map +1 -0
- package/dist/src/core/services/AuthClient.js +155 -0
- package/dist/src/core/services/AuthClient.js.map +1 -0
- package/dist/src/core/services/AuthService.d.ts +70 -0
- package/dist/src/core/services/AuthService.d.ts.map +1 -0
- package/dist/src/core/services/AuthService.js +157 -0
- package/dist/src/core/services/AuthService.js.map +1 -0
- package/dist/src/core/services/HelperService.d.ts +6 -0
- package/dist/src/core/services/HelperService.d.ts.map +1 -1
- package/dist/src/core/services/HelperService.js +22 -1
- package/dist/src/core/services/HelperService.js.map +1 -1
- package/dist/src/core/services/HttpService.d.ts.map +1 -1
- package/dist/src/core/services/HttpService.js +20 -0
- package/dist/src/core/services/HttpService.js.map +1 -1
- package/dist/src/core/services/ReactiveDependency.d.ts +15 -0
- package/dist/src/core/services/ReactiveDependency.d.ts.map +1 -0
- package/dist/src/core/services/ReactiveDependency.js +46 -0
- package/dist/src/core/services/ReactiveDependency.js.map +1 -0
- package/dist/src/core/services/TranslationService.d.ts +2 -0
- package/dist/src/core/services/TranslationService.d.ts.map +1 -1
- package/dist/src/core/services/TranslationService.js +5 -0
- package/dist/src/core/services/TranslationService.js.map +1 -1
- package/dist/src/core/services/index.d.ts +2 -0
- package/dist/src/core/services/index.d.ts.map +1 -1
- package/dist/src/core/services/index.js +2 -0
- package/dist/src/core/services/index.js.map +1 -1
- package/dist/src/core/view/ViewState.d.ts +1 -0
- package/dist/src/core/view/ViewState.d.ts.map +1 -1
- package/dist/src/core/view/ViewState.js +37 -2
- package/dist/src/core/view/ViewState.js.map +1 -1
- package/index.ts +7 -0
- package/package.json +1 -1
- package/src/core/app/Application.ts +6 -1
- package/src/core/bootstrap/providers/CoreServiceProvider.ts +7 -0
- package/src/core/bootstrap/providers/default-providers.ts +1 -1
- package/src/core/contracts/ApplicationInterface.ts +2 -0
- package/src/core/contracts/HelperInterface.ts +3 -0
- package/src/core/elements/Html.ts +11 -0
- package/src/core/helpers/ApiClient.ts +1 -11
- package/src/core/helpers/auth.ts +10 -0
- package/src/core/services/AuthClient.ts +163 -0
- package/src/core/services/AuthService.ts +177 -0
- package/src/core/services/HelperService.ts +23 -1
- package/src/core/services/HttpService.ts +21 -0
- package/src/core/services/ReactiveDependency.ts +46 -0
- package/src/core/services/TranslationService.ts +6 -0
- package/src/core/services/index.ts +2 -0
- package/src/core/view/ViewState.ts +34 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/ApiClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,qBAAa,SAAU,YAAW,kBAAkB;IAChD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,SAAS,CAAe;;IAQhC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/ApiClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,qBAAa,SAAU,YAAW,kBAAkB;IAChD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,SAAS,CAAe;;IAQhC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAQ3B,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAWvC;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU5C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAerC;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC;IAenC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IAShC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO7C;;OAEG;IACH,cAAc,IAAI,WAAW;CAGhC"}
|
|
@@ -10,7 +10,7 @@ export class ApiClient {
|
|
|
10
10
|
this.endpoints = this.loadEndpoints();
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Setup default headers
|
|
13
|
+
* Setup default headers. HttpService reads the current CSRF token per request.
|
|
14
14
|
* @private
|
|
15
15
|
*/
|
|
16
16
|
setupDefaultHeaders() {
|
|
@@ -18,16 +18,6 @@ export class ApiClient {
|
|
|
18
18
|
this.http.setHeader('Accept', 'application/json');
|
|
19
19
|
this.http.setHeader('X-Requested-With', 'XMLHttpRequest');
|
|
20
20
|
this.http.setHeader('X-DATA-TYPE', 'json');
|
|
21
|
-
// Get CSRF token from meta tag (SSR support)
|
|
22
|
-
if (typeof document !== 'undefined') {
|
|
23
|
-
const csrfToken = document.querySelector('meta[name="csrf-token"]');
|
|
24
|
-
if (csrfToken) {
|
|
25
|
-
const token = csrfToken.getAttribute('content');
|
|
26
|
-
if (token) {
|
|
27
|
-
this.http.setHeader('X-CSRF-TOKEN', token);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
21
|
}
|
|
32
22
|
init(config) {
|
|
33
23
|
if (typeof config.baseUrl === 'string')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiClient.js","sourceRoot":"","sources":["../../../../src/core/helpers/ApiClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAUzD,MAAM,OAAO,SAAS;IAIlB;QACI,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACK,mBAAmB;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiClient.js","sourceRoot":"","sources":["../../../../src/core/helpers/ApiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,+DAA+D;AAC/D,wBAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAIvD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { app } from './app.js';
|
|
2
|
+
import { AuthService } from '../services/AuthService.js';
|
|
3
|
+
/** Same instance exposed by App.Auth and App.Helper.auth(). */
|
|
4
|
+
export function auth(guard) {
|
|
5
|
+
const application = app();
|
|
6
|
+
if (!application.has('Auth'))
|
|
7
|
+
application.instance('Auth', AuthService.fromSnapshot(application.shared('auth')));
|
|
8
|
+
return application.get('Auth').guard(guard);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/core/helpers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,+DAA+D;AAC/D,MAAM,UAAU,IAAI,CAAC,KAAqB;IACtC,MAAM,WAAW,GAAG,GAAG,EAAwB,CAAC;IAChD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjH,OAAO,WAAW,CAAC,GAAG,CAAc,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AuthService, type AuthSnapshot } from './AuthService.js';
|
|
2
|
+
export interface AuthProviderInfo {
|
|
3
|
+
name: string;
|
|
4
|
+
label: string;
|
|
5
|
+
url: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AuthClientConfig {
|
|
8
|
+
version: 1;
|
|
9
|
+
guard: string;
|
|
10
|
+
csrfToken: string | null;
|
|
11
|
+
usernameField: string;
|
|
12
|
+
endpoints: {
|
|
13
|
+
session: string;
|
|
14
|
+
login: string | null;
|
|
15
|
+
logout: string;
|
|
16
|
+
};
|
|
17
|
+
providers: AuthProviderInfo[];
|
|
18
|
+
}
|
|
19
|
+
export interface AuthClientOptions {
|
|
20
|
+
fetch?: typeof fetch;
|
|
21
|
+
navigate?: (url: string) => void;
|
|
22
|
+
}
|
|
23
|
+
/** Same-origin session transport; no dependency on Router, View or a context API. */
|
|
24
|
+
export declare class AuthClient {
|
|
25
|
+
private readonly auth;
|
|
26
|
+
private readonly options;
|
|
27
|
+
private config;
|
|
28
|
+
private queue;
|
|
29
|
+
private requests;
|
|
30
|
+
private disposed;
|
|
31
|
+
private generation;
|
|
32
|
+
constructor(auth: AuthService, options?: AuthClientOptions);
|
|
33
|
+
configure(config: AuthClientConfig | null): this;
|
|
34
|
+
get available(): boolean;
|
|
35
|
+
get csrfToken(): string | null;
|
|
36
|
+
get usernameField(): string | null;
|
|
37
|
+
get providers(): AuthProviderInfo[];
|
|
38
|
+
login(credentials: Record<string, string | boolean>): Promise<AuthSnapshot>;
|
|
39
|
+
logout(): Promise<AuthSnapshot>;
|
|
40
|
+
refresh(): Promise<AuthSnapshot>;
|
|
41
|
+
loginUrl(provider: string, options?: {
|
|
42
|
+
next?: string;
|
|
43
|
+
}): string;
|
|
44
|
+
/** OAuth redirects through the server; callback restores auth via a fresh SSR bootstrap. */
|
|
45
|
+
loginWith(provider: string, options?: {
|
|
46
|
+
next?: string;
|
|
47
|
+
}): void;
|
|
48
|
+
private enqueue;
|
|
49
|
+
private request;
|
|
50
|
+
private localUrl;
|
|
51
|
+
private assertAvailable;
|
|
52
|
+
destroy(): void;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=AuthClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthClient.d.ts","sourceRoot":"","sources":["../../../../src/core/services/AuthClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAC9E,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,SAAS,EAAE,gBAAgB,EAAE,CAAC;CACjC;AACD,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,qFAAqF;AACrF,qBAAa,UAAU;IAOP,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAe,OAAO,CAAC,QAAQ,CAAC,OAAO;IANxE,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;gBAEM,IAAI,EAAE,WAAW,EAAmB,OAAO,GAAE,iBAAsB;IAEhG,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI;IAqBhD,IAAI,SAAS,IAAI,OAAO,CAAmD;IAC3E,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAA2C;IACzE,IAAI,aAAa,IAAI,MAAM,GAAG,IAAI,CAA+C;IACjF,IAAI,SAAS,IAAI,gBAAgB,EAAE,CAA0D;IAE7F,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAI3E,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAC/B,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAEhC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,MAAM;IAUnE,4FAA4F;IAC5F,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI;IAKlE,OAAO,CAAC,OAAO;YAgBD,OAAO;IAiDrB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,eAAe;IAIvB,OAAO,IAAI,IAAI;CAOlB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { AuthService } from './AuthService.js';
|
|
2
|
+
/** Same-origin session transport; no dependency on Router, View or a context API. */
|
|
3
|
+
export class AuthClient {
|
|
4
|
+
constructor(auth, options = {}) {
|
|
5
|
+
this.auth = auth;
|
|
6
|
+
this.options = options;
|
|
7
|
+
this.config = null;
|
|
8
|
+
this.queue = Promise.resolve();
|
|
9
|
+
this.requests = new Set();
|
|
10
|
+
this.disposed = false;
|
|
11
|
+
this.generation = 0;
|
|
12
|
+
}
|
|
13
|
+
configure(config) {
|
|
14
|
+
if (config !== null) {
|
|
15
|
+
if (config.version !== 1 || typeof config.guard !== 'string' || !config.guard
|
|
16
|
+
|| typeof config.usernameField !== 'string' || !config.usernameField
|
|
17
|
+
|| (config.csrfToken !== null && typeof config.csrfToken !== 'string')
|
|
18
|
+
|| !Array.isArray(config.providers))
|
|
19
|
+
throw new TypeError('Invalid Auth API configuration.');
|
|
20
|
+
this.localUrl(config.endpoints?.session);
|
|
21
|
+
this.localUrl(config.endpoints?.logout);
|
|
22
|
+
if (config.endpoints.login !== null)
|
|
23
|
+
this.localUrl(config.endpoints.login);
|
|
24
|
+
for (const provider of config.providers) {
|
|
25
|
+
if (typeof provider.name !== 'string' || !provider.name || typeof provider.label !== 'string') {
|
|
26
|
+
throw new TypeError('Invalid auth provider.');
|
|
27
|
+
}
|
|
28
|
+
this.localUrl(provider.url);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
this.config = config === null ? null : structuredClone(config);
|
|
32
|
+
this.generation++;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
get available() { return this.config !== null && !this.disposed; }
|
|
36
|
+
get csrfToken() { return this.config?.csrfToken ?? null; }
|
|
37
|
+
get usernameField() { return this.config?.usernameField ?? null; }
|
|
38
|
+
get providers() { return structuredClone(this.config?.providers ?? []); }
|
|
39
|
+
login(credentials) {
|
|
40
|
+
// Do not retain the caller's mutable object while waiting for another operation.
|
|
41
|
+
return this.enqueue('login', { ...credentials });
|
|
42
|
+
}
|
|
43
|
+
logout() { return this.enqueue('logout'); }
|
|
44
|
+
refresh() { return this.enqueue('session'); }
|
|
45
|
+
loginUrl(provider, options = {}) {
|
|
46
|
+
this.assertAvailable();
|
|
47
|
+
const item = this.config.providers.find(item => item.name === provider);
|
|
48
|
+
if (!item)
|
|
49
|
+
throw new Error(`Auth provider "${provider}" is not enabled.`);
|
|
50
|
+
const url = this.localUrl(item.url);
|
|
51
|
+
const next = this.localUrl(options.next ?? (window.location.pathname + window.location.search + window.location.hash));
|
|
52
|
+
url.searchParams.set('next', next.pathname + next.search + next.hash);
|
|
53
|
+
return url.href;
|
|
54
|
+
}
|
|
55
|
+
/** OAuth redirects through the server; callback restores auth via a fresh SSR bootstrap. */
|
|
56
|
+
loginWith(provider, options = {}) {
|
|
57
|
+
const url = this.loginUrl(provider, options);
|
|
58
|
+
(this.options.navigate ?? (url => window.location.assign(url)))(url);
|
|
59
|
+
}
|
|
60
|
+
enqueue(action, body) {
|
|
61
|
+
const work = this.queue.then(async () => {
|
|
62
|
+
this.assertAvailable();
|
|
63
|
+
if (!this.config.endpoints[action])
|
|
64
|
+
throw new Error('Password login is not enabled.');
|
|
65
|
+
const finish = action === 'session' ? () => { } : this.auth.beginClientTransition();
|
|
66
|
+
try {
|
|
67
|
+
// A refresh obtains the cookie/CSRF token when boot ran without a session.
|
|
68
|
+
if (action !== 'session' && !this.config.csrfToken)
|
|
69
|
+
await this.request('session');
|
|
70
|
+
return await this.request(action, body);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
finish();
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// A failed login must not poison later logout/refresh operations.
|
|
77
|
+
this.queue = work.catch(() => { });
|
|
78
|
+
return work;
|
|
79
|
+
}
|
|
80
|
+
async request(action, body) {
|
|
81
|
+
this.assertAvailable();
|
|
82
|
+
const config = this.config;
|
|
83
|
+
const url = this.localUrl(config.endpoints[action]);
|
|
84
|
+
const revision = this.auth.revision;
|
|
85
|
+
const generation = this.generation;
|
|
86
|
+
const controller = new AbortController();
|
|
87
|
+
this.requests.add(controller);
|
|
88
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
89
|
+
try {
|
|
90
|
+
const headers = { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' };
|
|
91
|
+
if (action !== 'session') {
|
|
92
|
+
if (!config.csrfToken)
|
|
93
|
+
throw new Error('Auth API did not provide a CSRF token.');
|
|
94
|
+
headers['X-CSRF-TOKEN'] = config.csrfToken;
|
|
95
|
+
headers['Content-Type'] = 'application/json';
|
|
96
|
+
}
|
|
97
|
+
const response = await (this.options.fetch ?? fetch)(url.href, {
|
|
98
|
+
method: action === 'session' ? 'GET' : 'POST', headers,
|
|
99
|
+
credentials: 'same-origin', mode: 'same-origin', redirect: 'error', cache: 'no-store',
|
|
100
|
+
signal: controller.signal,
|
|
101
|
+
...(action === 'session' ? {} : { body: JSON.stringify(body ?? {}) }),
|
|
102
|
+
});
|
|
103
|
+
if (response.url)
|
|
104
|
+
this.localUrl(response.url);
|
|
105
|
+
const payload = await response.json();
|
|
106
|
+
controller.signal.throwIfAborted();
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
throw Object.assign(new Error(typeof payload?.message === 'string' ? payload.message : `Authentication request failed (${response.status}).`), { status: response.status, errors: payload?.errors });
|
|
109
|
+
}
|
|
110
|
+
if (this.disposed || generation !== this.generation || revision !== this.auth.revision) {
|
|
111
|
+
throw Object.assign(new Error('Authentication changed while the request was pending.'), { name: 'AbortError' });
|
|
112
|
+
}
|
|
113
|
+
// Validate the next configuration before committing either state or CSRF.
|
|
114
|
+
const next = new AuthClient(this.auth);
|
|
115
|
+
next.configure(payload.authClient);
|
|
116
|
+
if (!payload.authClient)
|
|
117
|
+
throw new TypeError('Missing Auth API configuration.');
|
|
118
|
+
new AuthService().initialize(payload.auth); // deep validation without emitting or changing current auth
|
|
119
|
+
// Subscribers may immediately send a request. Publish the new CSRF first.
|
|
120
|
+
this.configure(payload.authClient);
|
|
121
|
+
const meta = typeof document === 'undefined' ? null : document.querySelector('meta[name="csrf-token"]');
|
|
122
|
+
if (meta && this.config?.csrfToken)
|
|
123
|
+
meta.content = this.config.csrfToken;
|
|
124
|
+
this.auth.sync(payload.auth, action === 'session' ? 'sync' : action);
|
|
125
|
+
return payload.auth;
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
clearTimeout(timeout);
|
|
129
|
+
this.requests.delete(controller);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
localUrl(value) {
|
|
133
|
+
if (typeof window === 'undefined' || typeof value !== 'string' || !value.trim()) {
|
|
134
|
+
throw new TypeError('Auth API requires a browser and a same-origin URL.');
|
|
135
|
+
}
|
|
136
|
+
const url = new URL(value, window.location.origin);
|
|
137
|
+
if (url.origin !== window.location.origin || !['http:', 'https:'].includes(url.protocol) || url.username || url.password) {
|
|
138
|
+
throw new TypeError('Auth API URLs must use the current origin.');
|
|
139
|
+
}
|
|
140
|
+
return url;
|
|
141
|
+
}
|
|
142
|
+
assertAvailable() {
|
|
143
|
+
if (!this.available)
|
|
144
|
+
throw new Error('Auth API is not configured or has been destroyed.');
|
|
145
|
+
}
|
|
146
|
+
destroy() {
|
|
147
|
+
this.disposed = true;
|
|
148
|
+
this.generation++;
|
|
149
|
+
for (const controller of this.requests)
|
|
150
|
+
controller.abort();
|
|
151
|
+
this.requests.clear();
|
|
152
|
+
this.config = null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=AuthClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthClient.js","sourceRoot":"","sources":["../../../../src/core/services/AuthClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAgBlE,qFAAqF;AACrF,MAAM,OAAO,UAAU;IAOnB,YAA6B,IAAiB,EAAmB,UAA6B,EAAE;QAAnE,SAAI,GAAJ,IAAI,CAAa;QAAmB,YAAO,GAAP,OAAO,CAAwB;QANxF,WAAM,GAA4B,IAAI,CAAC;QACvC,UAAK,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,aAAQ,GAAG,KAAK,CAAC;QACjB,eAAU,GAAG,CAAC,CAAC;IAE4E,CAAC;IAEpG,SAAS,CAAC,MAA+B;QACrC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK;mBACtE,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa;mBACjE,CAAC,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC;mBACnE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAChG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3E,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5F,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;gBAClD,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,SAAS,KAAc,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,IAAI,SAAS,KAAoB,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;IACzE,IAAI,aAAa,KAAoB,OAAO,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC;IACjF,IAAI,SAAS,KAAyB,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7F,KAAK,CAAC,WAA6C;QAC/C,iFAAiF;QACjF,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,KAA4B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,KAA4B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEpE,QAAQ,CAAC,QAAgB,EAAE,UAA6B,EAAE;QACtD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,mBAAmB,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACvH,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,GAAG,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,4FAA4F;IAC5F,SAAS,CAAC,QAAgB,EAAE,UAA6B,EAAE;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IAEO,OAAO,CAAC,MAAsC,EAAE,IAAa;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACvF,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnF,IAAI,CAAC;gBACD,2EAA2E;gBAC3E,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,SAAS;oBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;oBAAS,CAAC;gBAAC,MAAM,EAAE,CAAC;YAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,kEAAkE;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAsC,EAAE,IAAa;QACvE,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAE,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC;YACD,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;YAC7G,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACjF,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC3C,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;YACjD,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC3D,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO;gBACtD,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU;gBACrF,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAC,CAAC;aACtE,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,CAAC,EACzI,EAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrF,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,EAAE,EAAC,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;YAClH,CAAC;YACD,0EAA0E;YAC1E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,UAAU;gBAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAChF,IAAI,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,4DAA4D;YACxG,0EAA0E;YAC1E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAkB,yBAAyB,CAAC,CAAC;YACzH,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS;gBAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACzE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACrE,OAAO,OAAO,CAAC,IAAI,CAAC;QACxB,CAAC;gBAAS,CAAC;YACP,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC1B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9E,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvH,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ;YAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;CACJ"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { AuthClient } from './AuthClient.js';
|
|
2
|
+
export type AuthUser = Readonly<{
|
|
3
|
+
id: string | number;
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}>;
|
|
6
|
+
export interface AuthSnapshot {
|
|
7
|
+
version: 1;
|
|
8
|
+
defaultGuard: string;
|
|
9
|
+
guards: Record<string, {
|
|
10
|
+
user: AuthUser | null;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export interface AuthChange {
|
|
14
|
+
guard: string;
|
|
15
|
+
user: AuthUser | null;
|
|
16
|
+
previousUser: AuthUser | null;
|
|
17
|
+
source: 'login' | 'logout' | 'sync';
|
|
18
|
+
}
|
|
19
|
+
export type AuthEvent = 'login' | 'logout' | 'change';
|
|
20
|
+
type Listener = (change: AuthChange) => void;
|
|
21
|
+
type Context = {
|
|
22
|
+
defaultGuard: string;
|
|
23
|
+
users: Map<string, AuthUser | null>;
|
|
24
|
+
instances: Map<string, AuthService>;
|
|
25
|
+
listeners: Set<{
|
|
26
|
+
guard: string | null;
|
|
27
|
+
event: AuthEvent;
|
|
28
|
+
callback: Listener;
|
|
29
|
+
}>;
|
|
30
|
+
revision: number;
|
|
31
|
+
client?: AuthClient;
|
|
32
|
+
transitions: number;
|
|
33
|
+
};
|
|
34
|
+
/** Client view of server authentication. login/logout record successful server actions; they make no HTTP requests. */
|
|
35
|
+
export declare class AuthService {
|
|
36
|
+
private readonly context;
|
|
37
|
+
private readonly guardName;
|
|
38
|
+
constructor(user?: AuthUser | null, defaultGuard?: string, context?: Context, guardName?: string | null);
|
|
39
|
+
static fromSnapshot(snapshot?: unknown): AuthService;
|
|
40
|
+
get revision(): number;
|
|
41
|
+
get client(): AuthClient;
|
|
42
|
+
get isTransitioning(): boolean;
|
|
43
|
+
/** Internal transport barrier: page responses cannot overwrite an in-flight login/logout. */
|
|
44
|
+
beginClientTransition(): () => void;
|
|
45
|
+
private get name();
|
|
46
|
+
guard(name?: string | null): AuthService;
|
|
47
|
+
check(): boolean;
|
|
48
|
+
guest(): boolean;
|
|
49
|
+
id(): string | number | null;
|
|
50
|
+
user<T extends AuthUser = AuthUser>(): T | null;
|
|
51
|
+
/** Call only after the server accepted login (including registration/OAuth). */
|
|
52
|
+
login(user: AuthUser): this;
|
|
53
|
+
/** Call only after the server confirmed logout or session expiry. */
|
|
54
|
+
logout(): this;
|
|
55
|
+
setUser(user: AuthUser | null, source?: AuthChange['source']): this;
|
|
56
|
+
/** Authoritative page-data response. A snapshot replaces guards omitted by the server too. */
|
|
57
|
+
sync(snapshot: unknown, source?: AuthChange['source']): this;
|
|
58
|
+
/** Bootstrap only: restore the server session without reporting a new login. */
|
|
59
|
+
initialize(snapshot: unknown): this;
|
|
60
|
+
on(event: AuthEvent, callback: Listener): () => void;
|
|
61
|
+
subscribe(callback: Listener): () => void;
|
|
62
|
+
destroy(): void;
|
|
63
|
+
private applySnapshot;
|
|
64
|
+
private emit;
|
|
65
|
+
static isSnapshot(value: any): value is AuthSnapshot;
|
|
66
|
+
private static copyUser;
|
|
67
|
+
private static sameUser;
|
|
68
|
+
}
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=AuthService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthService.d.ts","sourceRoot":"","sources":["../../../../src/core/services/AuthService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { trackDependency } from './ReactiveDependency.js';
|
|
2
|
+
import { AuthClient } from './AuthClient.js';
|
|
3
|
+
/** Client view of server authentication. login/logout record successful server actions; they make no HTTP requests. */
|
|
4
|
+
export class AuthService {
|
|
5
|
+
constructor(user = null, defaultGuard = 'web', context, guardName = null) {
|
|
6
|
+
this.context = context ?? {
|
|
7
|
+
defaultGuard, users: new Map([[defaultGuard, AuthService.copyUser(user)]]),
|
|
8
|
+
instances: new Map(), listeners: new Set(), revision: 0, transitions: 0,
|
|
9
|
+
};
|
|
10
|
+
this.guardName = guardName;
|
|
11
|
+
}
|
|
12
|
+
static fromSnapshot(snapshot) {
|
|
13
|
+
const service = new AuthService();
|
|
14
|
+
if (snapshot !== undefined)
|
|
15
|
+
service.applySnapshot(snapshot, true);
|
|
16
|
+
return service;
|
|
17
|
+
}
|
|
18
|
+
get revision() { return this.context.revision; }
|
|
19
|
+
get client() { var _a; return (_a = this.context).client ?? (_a.client = new AuthClient(this)); }
|
|
20
|
+
get isTransitioning() { return this.context.transitions > 0; }
|
|
21
|
+
/** Internal transport barrier: page responses cannot overwrite an in-flight login/logout. */
|
|
22
|
+
beginClientTransition() {
|
|
23
|
+
this.context.revision++;
|
|
24
|
+
this.context.transitions++;
|
|
25
|
+
let finished = false;
|
|
26
|
+
return () => {
|
|
27
|
+
if (finished)
|
|
28
|
+
return;
|
|
29
|
+
finished = true;
|
|
30
|
+
this.context.transitions--;
|
|
31
|
+
this.context.revision++;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
get name() { return this.guardName ?? this.context.defaultGuard; }
|
|
35
|
+
guard(name) {
|
|
36
|
+
if (name == null)
|
|
37
|
+
return this;
|
|
38
|
+
if (!name.trim())
|
|
39
|
+
throw new TypeError('An auth guard must have a name.');
|
|
40
|
+
let guard = this.context.instances.get(name);
|
|
41
|
+
if (!guard) {
|
|
42
|
+
guard = new AuthService(null, this.context.defaultGuard, this.context, name);
|
|
43
|
+
this.context.instances.set(name, guard);
|
|
44
|
+
}
|
|
45
|
+
return guard;
|
|
46
|
+
}
|
|
47
|
+
check() { return this.user() !== null; }
|
|
48
|
+
guest() { return !this.check(); }
|
|
49
|
+
id() { return this.user()?.id ?? null; }
|
|
50
|
+
user() {
|
|
51
|
+
trackDependency(this);
|
|
52
|
+
return (this.context.users.get(this.name) ?? null);
|
|
53
|
+
}
|
|
54
|
+
/** Call only after the server accepted login (including registration/OAuth). */
|
|
55
|
+
login(user) { return this.setUser(user, 'login'); }
|
|
56
|
+
/** Call only after the server confirmed logout or session expiry. */
|
|
57
|
+
logout() { return this.setUser(null, 'logout'); }
|
|
58
|
+
setUser(user, source = 'sync') {
|
|
59
|
+
const next = AuthService.copyUser(user);
|
|
60
|
+
const previous = this.user();
|
|
61
|
+
// Even a repeated explicit login/logout invalidates older in-flight responses.
|
|
62
|
+
if (source !== 'sync' || !AuthService.sameUser(previous, next))
|
|
63
|
+
this.context.revision++;
|
|
64
|
+
this.context.users.set(this.name, next);
|
|
65
|
+
this.emit(this.name, previous, next, source);
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
/** Authoritative page-data response. A snapshot replaces guards omitted by the server too. */
|
|
69
|
+
sync(snapshot, source = 'sync') { return this.applySnapshot(snapshot, false, source); }
|
|
70
|
+
/** Bootstrap only: restore the server session without reporting a new login. */
|
|
71
|
+
initialize(snapshot) { return this.applySnapshot(snapshot, true); }
|
|
72
|
+
on(event, callback) {
|
|
73
|
+
const listener = { guard: this.guardName, event, callback };
|
|
74
|
+
this.context.listeners.add(listener);
|
|
75
|
+
return () => { this.context.listeners.delete(listener); };
|
|
76
|
+
}
|
|
77
|
+
subscribe(callback) { return this.on('change', callback); }
|
|
78
|
+
destroy() { this.context.client?.destroy(); this.context.revision++; this.context.listeners.clear(); this.context.instances.clear(); this.context.users.clear(); }
|
|
79
|
+
applySnapshot(snapshot, silent, source = 'sync') {
|
|
80
|
+
if (!AuthService.isSnapshot(snapshot))
|
|
81
|
+
throw new TypeError('Invalid auth snapshot.');
|
|
82
|
+
// Validate everything before replacing any current state.
|
|
83
|
+
const users = new Map(Object.entries(snapshot.guards).map(([name, guard]) => [name, AuthService.copyUser(guard.user)]));
|
|
84
|
+
const previous = this.context.users;
|
|
85
|
+
const previousDefault = this.context.defaultGuard;
|
|
86
|
+
this.context.users = users;
|
|
87
|
+
this.context.defaultGuard = snapshot.defaultGuard;
|
|
88
|
+
if (source !== 'sync' || previousDefault !== snapshot.defaultGuard || [...new Set([...previous.keys(), ...users.keys()])]
|
|
89
|
+
.some(name => !AuthService.sameUser(previous.get(name) ?? null, users.get(name) ?? null)))
|
|
90
|
+
this.context.revision++;
|
|
91
|
+
if (!silent) {
|
|
92
|
+
for (const name of new Set([...previous.keys(), ...users.keys()])) {
|
|
93
|
+
this.emit(name, previous.get(name) ?? null, users.get(name) ?? null, source);
|
|
94
|
+
}
|
|
95
|
+
if (previousDefault !== snapshot.defaultGuard && AuthService.sameUser(previous.get(snapshot.defaultGuard) ?? null, users.get(snapshot.defaultGuard) ?? null)) {
|
|
96
|
+
this.emit(snapshot.defaultGuard, previous.get(previousDefault) ?? null, users.get(snapshot.defaultGuard) ?? null, source);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
emit(guard, previousUser, user, source) {
|
|
102
|
+
if (AuthService.sameUser(previousUser, user))
|
|
103
|
+
return;
|
|
104
|
+
const change = { guard, previousUser, user, source };
|
|
105
|
+
const identityChanged = previousUser?.id !== user?.id;
|
|
106
|
+
const events = [];
|
|
107
|
+
if (identityChanged && previousUser)
|
|
108
|
+
events.push('logout');
|
|
109
|
+
if (identityChanged && user)
|
|
110
|
+
events.push('login');
|
|
111
|
+
events.push('change');
|
|
112
|
+
for (const event of events) {
|
|
113
|
+
for (const listener of [...this.context.listeners]) {
|
|
114
|
+
if (!this.context.listeners.has(listener) || listener.event !== event
|
|
115
|
+
|| (listener.guard !== null && listener.guard !== guard))
|
|
116
|
+
continue;
|
|
117
|
+
try {
|
|
118
|
+
listener.callback(change);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('[AuthService] Listener error:', error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
static isSnapshot(value) {
|
|
127
|
+
return value?.version === 1 && typeof value.defaultGuard === 'string' && value.defaultGuard.length > 0
|
|
128
|
+
&& value.guards !== null && typeof value.guards === 'object' && !Array.isArray(value.guards)
|
|
129
|
+
&& Object.prototype.hasOwnProperty.call(value.guards, value.defaultGuard)
|
|
130
|
+
&& Object.values(value.guards).every((guard) => guard && Object.prototype.hasOwnProperty.call(guard, 'user')
|
|
131
|
+
&& (guard.user === null || (typeof guard.user === 'object' && !Array.isArray(guard.user)
|
|
132
|
+
&& (typeof guard.user.id === 'string' || typeof guard.user.id === 'number'))));
|
|
133
|
+
}
|
|
134
|
+
static copyUser(user) {
|
|
135
|
+
if (user === null)
|
|
136
|
+
return null;
|
|
137
|
+
if (!user || Array.isArray(user) || (typeof user.id !== 'string' && typeof user.id !== 'number')
|
|
138
|
+
|| (typeof user.id === 'number' && !Number.isFinite(user.id))) {
|
|
139
|
+
throw new TypeError('An authenticated user must have an id.');
|
|
140
|
+
}
|
|
141
|
+
const copy = structuredClone(user);
|
|
142
|
+
JSON.stringify(copy); // Reject non-JSON user data before changing any state.
|
|
143
|
+
const seen = new WeakSet();
|
|
144
|
+
const freeze = (value) => {
|
|
145
|
+
if (!value || typeof value !== 'object' || seen.has(value))
|
|
146
|
+
return;
|
|
147
|
+
seen.add(value);
|
|
148
|
+
for (const item of Object.values(value))
|
|
149
|
+
freeze(item);
|
|
150
|
+
Object.freeze(value);
|
|
151
|
+
};
|
|
152
|
+
freeze(copy);
|
|
153
|
+
return copy;
|
|
154
|
+
}
|
|
155
|
+
static sameUser(a, b) { return JSON.stringify(a) === JSON.stringify(b); }
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=AuthService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../../../src/core/services/AuthService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type TranslationConfig } from './TranslationService.js';
|
|
2
2
|
import { CollectionProxyInterface, HelperInterface } from "../contracts/HelperInterface.js";
|
|
3
3
|
import { ApplicationInterface } from "../contracts/ApplicationInterface.js";
|
|
4
|
+
import { AuthService } from './AuthService.js';
|
|
4
5
|
/**
|
|
5
6
|
* HelperService — PHP-compatible helper functions for SaoView runtime.
|
|
6
7
|
*
|
|
@@ -40,6 +41,9 @@ export declare class HelperService implements HelperInterface {
|
|
|
40
41
|
private languageChangeSequence;
|
|
41
42
|
private config;
|
|
42
43
|
constructor(App?: any);
|
|
44
|
+
auth(guard?: string | null): AuthService;
|
|
45
|
+
/** Compatibility for previously compiled @auth/@guest views. */
|
|
46
|
+
isAuth(guard?: string | null): boolean;
|
|
43
47
|
app<T = any>(key?: any, value?: any): T | ApplicationInterface;
|
|
44
48
|
make<T>(name: string, defaultValue?: T): T | undefined;
|
|
45
49
|
setApp(App: any): void;
|
|
@@ -59,6 +63,8 @@ export declare class HelperService implements HelperInterface {
|
|
|
59
63
|
trans_choice(key: string, count: number, replace?: Record<string, any>, locale?: string): string;
|
|
60
64
|
setLocale(locale: string): void;
|
|
61
65
|
private syncLocale;
|
|
66
|
+
/** Tells the server which dictionaries this app already holds, so page data does not carry them again. */
|
|
67
|
+
private syncHeld;
|
|
62
68
|
/** Execute a function safely, return result or empty string on error */
|
|
63
69
|
execute<T>(fn: () => T): T;
|
|
64
70
|
/** Alias for execute with arguments */
|