@sinequa/atomic-angular 2.0.0 → 2.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/README.md +249 -249
- package/document-workspaces/i18n/de.json +11 -1
- package/document-workspaces/i18n/en.json +11 -1
- package/document-workspaces/i18n/fr.json +11 -1
- package/document-workspaces/i18n/ja.json +11 -1
- package/fesm2022/sinequa-atomic-angular-document-workspaces.mjs +1218 -76
- package/fesm2022/sinequa-atomic-angular-document-workspaces.mjs.map +1 -1
- package/fesm2022/sinequa-atomic-angular-workspace-elements.mjs +4 -1
- package/fesm2022/sinequa-atomic-angular-workspace-elements.mjs.map +1 -1
- package/fesm2022/sinequa-atomic-angular.mjs +170 -1
- package/fesm2022/sinequa-atomic-angular.mjs.map +1 -1
- package/package.json +6 -2
- package/providers/session-expiry/i18n/de.json +7 -0
- package/providers/session-expiry/i18n/en.json +7 -0
- package/providers/session-expiry/i18n/fr.json +7 -0
- package/types/sinequa-atomic-angular-document-workspaces.d.ts +498 -24
- package/types/sinequa-atomic-angular.d.ts +90 -36
|
@@ -77,7 +77,10 @@ function defineLexiqWorkspaceMentionList(injector, tagName = "lexiq-workspace-me
|
|
|
77
77
|
define(tagName, WorkspaceMentionList, injector, (Base) => class extends Base {
|
|
78
78
|
constructor() {
|
|
79
79
|
super();
|
|
80
|
-
bridgeEvents(this, {
|
|
80
|
+
bridgeEvents(this, {
|
|
81
|
+
selectionChanged: EVENT("selection-changed"),
|
|
82
|
+
workspaceCreated: EVENT("workspace-created")
|
|
83
|
+
});
|
|
81
84
|
}
|
|
82
85
|
get items() {
|
|
83
86
|
return instanceOf(this).items();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sinequa-atomic-angular-workspace-elements.mjs","names":[],"sources":["../../../projects/atomic-angular/workspace-elements/register.ts","../../../projects/atomic-angular/workspace-elements/providers.ts"],"sourcesContent":["import { ApplicationConfig, ApplicationRef, Injector, provideZonelessChangeDetection, Type } from \"@angular/core\";\nimport { createCustomElement } from \"@angular/elements\";\nimport { createApplication } from \"@angular/platform-browser\";\nimport { WorkspaceMentionList, WorkspacePickerLauncher, WorkspacesShell } from \"@sinequa/atomic-angular/document-workspaces\";\n\n// Registration is an explicit act, never a side effect of importing this entry:\n// - defineX(injector) → one element (tree-shakable)\n// - registerLexiqWorkspacesElements(injector) → the three\n// - provideLexiqWorkspacesElements() → Angular providers (see providers.ts)\n// - bootstrapLexiqWorkspacesElements() → a page with no Angular of its own\n//\n// Each define is idempotent (customElements.get guard) and SSR-safe (a no-op where\n// `customElements` does not exist).\n\n/** What `createCustomElement` gives: an element that is its component's inputs and outputs, and nothing else. */\ntype NgElementClass = new () => HTMLElement;\n\n/** What an element does beyond that: methods, and the names its events go by. */\ntype Extension = (base: NgElementClass) => CustomElementConstructor;\n\n/**\n * The component of an element, for what `@angular/elements` does not expose: its methods.\n * `NgElement` keeps the component behind its strategy; this is the one place that reaches for it.\n */\nexport function instanceOf<T>(element: HTMLElement): T {\n const strategy = (element as unknown as { ngElementStrategy: { componentRef?: { instance: T } } }).ngElementStrategy;\n if (!strategy.componentRef) throw new Error(\"The element is not connected yet: its component does not exist.\");\n return strategy.componentRef.instance;\n}\n\n/**\n * Re-dispatches an output of the component under the name the page knows it by — the\n * events of this package have always been `lexiq-workspaces:…` or plain names — and so\n * that it crosses a shadow boundary: `@angular/elements` dispatches with neither `bubbles`\n * nor `composed`.\n */\nexport function bridgeEvents(element: HTMLElement, events: Record<string, { name: string; detail?: (payload: unknown) => unknown }>): void {\n // What this sends itself must not be sent again: an output that keeps its name would feed on its own events.\n const sent = new WeakSet<Event>();\n for (const [output, { name, detail }] of Object.entries(events)) {\n element.addEventListener(output, event => {\n if (sent.has(event)) return;\n // Same name: the page hears the bubbling copy, not the original as well.\n if (name === output) event.stopImmediatePropagation();\n const bridged = new CustomEvent(name, {\n detail: detail ? detail((event as CustomEvent).detail) : (event as CustomEvent).detail,\n bubbles: true,\n composed: true\n });\n sent.add(bridged);\n element.dispatchEvent(bridged);\n });\n }\n}\n\nfunction define(tagName: string, component: Type<unknown>, injector: Injector, extend: Extension): void {\n if (typeof customElements === \"undefined\" || customElements.get(tagName)) return;\n customElements.define(tagName, extend(createCustomElement(component, { injector }) as unknown as NgElementClass));\n}\n\nconst EVENT = (name: string) => ({ name });\n\nexport function defineLexiqWorkspaces(injector: Injector, tagName = \"lexiq-workspaces\"): void {\n define(\n tagName,\n WorkspacesShell,\n injector,\n Base =>\n class extends Base {\n constructor() {\n super();\n bridgeEvents(this, {\n workspaceCreated: { name: \"lexiq-workspaces:workspace-created\", detail: workspace => ({ workspace }) },\n workspaceUpdated: { name: \"lexiq-workspaces:workspace-updated\", detail: workspace => ({ workspace }) },\n askFollowUp: { name: \"lexiq-workspaces:ask-followup\" }\n });\n }\n\n /** Shows the list of workspaces. */\n showList(): void {\n (this as unknown as { workspaceId: string | null }).workspaceId = null;\n }\n\n /** Shows a workspace and its documents. */\n showDetail(id: string): void {\n (this as unknown as { workspaceId: string | null }).workspaceId = id;\n }\n\n /** Opens the \"Add workspace\" dialog, then the workspace it makes. */\n addWorkspace(): void {\n void instanceOf<WorkspacesShell>(this).addWorkspace();\n }\n }\n );\n}\n\nexport function defineLexiqWorkspacePicker(injector: Injector, tagName = \"lexiq-workspace-picker\"): void {\n define(\n tagName,\n WorkspacePickerLauncher,\n injector,\n Base =>\n class extends Base {\n constructor() {\n super();\n bridgeEvents(this, { saved: { name: \"save\", detail: name => ({ name }) }, moved: EVENT(\"moved\") });\n }\n\n openSaveCard(anchor: HTMLElement, options: Parameters<WorkspacePickerLauncher[\"openSaveCard\"]>[1] = {}): void {\n void instanceOf<WorkspacePickerLauncher>(this).openSaveCard(anchor, options);\n }\n\n openMoveMenu(anchor: HTMLElement, documentIds: readonly string[], options: { fromWorkspaceId: string }): void {\n void instanceOf<WorkspacePickerLauncher>(this).openMoveMenu(anchor, documentIds, options);\n }\n }\n );\n}\n\nexport function defineLexiqWorkspaceMentionList(injector: Injector, tagName = \"lexiq-workspace-mention-list\"): void {\n define(\n tagName,\n WorkspaceMentionList,\n injector,\n Base =>\n class extends Base {\n constructor() {\n super();\n bridgeEvents(this, { selectionChanged: EVENT(\"selection-changed\") });\n }\n\n /** The rows, for a host that draws its own menu. */\n get items() {\n return instanceOf<WorkspaceMentionList>(this).items();\n }\n\n /** Ticks a workspace from outside. */\n selectById(id: string): void {\n instanceOf<WorkspaceMentionList>(this).select(id);\n }\n }\n );\n}\n\nexport function registerLexiqWorkspacesElements(injector: Injector): void {\n defineLexiqWorkspaces(injector);\n defineLexiqWorkspacePicker(injector);\n defineLexiqWorkspaceMentionList(injector);\n}\n\n/**\n * For a page that is not an Angular application: starts one — zoneless, with the\n * providers the page gives it (Transloco and the `@sinequa/atomic` configuration are the page's\n * to provide) — and registers the three elements on it.\n *\n * ```ts\n * await bootstrapLexiqWorkspacesElements({ providers: [provideTransloco({ … })] });\n * ```\n */\nexport async function bootstrapLexiqWorkspacesElements(config: Partial<ApplicationConfig> = {}): Promise<ApplicationRef> {\n const app = await createApplication({ providers: [provideZonelessChangeDetection(), ...(config.providers ?? [])] });\n registerLexiqWorkspacesElements(app.injector);\n return app;\n}\n","import { EnvironmentProviders, inject, Injector, makeEnvironmentProviders, provideEnvironmentInitializer } from \"@angular/core\";\nimport { registerLexiqWorkspacesElements } from \"./register\";\n\n/**\n * Registers the `lexiq-workspaces`, `lexiq-workspace-picker` and\n * `lexiq-workspace-mention-list` custom elements when the application starts. Add it to\n * the `providers` of the app (or of a route):\n *\n * ```ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideTransloco({ … }), provideLexiqWorkspacesElements()]\n * };\n * ```\n *\n * The elements render through this application's injector, so they share its Transloco\n * configuration, its `@sinequa/atomic` setup and its `WorkspacesStore` with the rest of the app.\n * A component that uses the tags in a template needs `schemas: [CUSTOM_ELEMENTS_SCHEMA]` — or,\n * in Angular, the components themselves (`WorkspacesShell`…).\n */\nexport function provideLexiqWorkspacesElements(): EnvironmentProviders {\n return makeEnvironmentProviders([provideEnvironmentInitializer(() => registerLexiqWorkspacesElements(inject(Injector)))]);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sinequa-atomic-angular-workspace-elements.mjs","names":[],"sources":["../../../projects/atomic-angular/workspace-elements/register.ts","../../../projects/atomic-angular/workspace-elements/providers.ts"],"sourcesContent":["import { ApplicationConfig, ApplicationRef, Injector, provideZonelessChangeDetection, Type } from \"@angular/core\";\nimport { createCustomElement } from \"@angular/elements\";\nimport { createApplication } from \"@angular/platform-browser\";\nimport { WorkspaceMentionList, WorkspacePickerLauncher, WorkspacesShell } from \"@sinequa/atomic-angular/document-workspaces\";\n\n// Registration is an explicit act, never a side effect of importing this entry:\n// - defineX(injector) → one element (tree-shakable)\n// - registerLexiqWorkspacesElements(injector) → the three\n// - provideLexiqWorkspacesElements() → Angular providers (see providers.ts)\n// - bootstrapLexiqWorkspacesElements() → a page with no Angular of its own\n//\n// Each define is idempotent (customElements.get guard) and SSR-safe (a no-op where\n// `customElements` does not exist).\n\n/** What `createCustomElement` gives: an element that is its component's inputs and outputs, and nothing else. */\ntype NgElementClass = new () => HTMLElement;\n\n/** What an element does beyond that: methods, and the names its events go by. */\ntype Extension = (base: NgElementClass) => CustomElementConstructor;\n\n/**\n * The component of an element, for what `@angular/elements` does not expose: its methods.\n * `NgElement` keeps the component behind its strategy; this is the one place that reaches for it.\n */\nexport function instanceOf<T>(element: HTMLElement): T {\n const strategy = (element as unknown as { ngElementStrategy: { componentRef?: { instance: T } } }).ngElementStrategy;\n if (!strategy.componentRef) throw new Error(\"The element is not connected yet: its component does not exist.\");\n return strategy.componentRef.instance;\n}\n\n/**\n * Re-dispatches an output of the component under the name the page knows it by — the\n * events of this package have always been `lexiq-workspaces:…` or plain names — and so\n * that it crosses a shadow boundary: `@angular/elements` dispatches with neither `bubbles`\n * nor `composed`.\n */\nexport function bridgeEvents(element: HTMLElement, events: Record<string, { name: string; detail?: (payload: unknown) => unknown }>): void {\n // What this sends itself must not be sent again: an output that keeps its name would feed on its own events.\n const sent = new WeakSet<Event>();\n for (const [output, { name, detail }] of Object.entries(events)) {\n element.addEventListener(output, event => {\n if (sent.has(event)) return;\n // Same name: the page hears the bubbling copy, not the original as well.\n if (name === output) event.stopImmediatePropagation();\n const bridged = new CustomEvent(name, {\n detail: detail ? detail((event as CustomEvent).detail) : (event as CustomEvent).detail,\n bubbles: true,\n composed: true\n });\n sent.add(bridged);\n element.dispatchEvent(bridged);\n });\n }\n}\n\nfunction define(tagName: string, component: Type<unknown>, injector: Injector, extend: Extension): void {\n if (typeof customElements === \"undefined\" || customElements.get(tagName)) return;\n customElements.define(tagName, extend(createCustomElement(component, { injector }) as unknown as NgElementClass));\n}\n\nconst EVENT = (name: string) => ({ name });\n\nexport function defineLexiqWorkspaces(injector: Injector, tagName = \"lexiq-workspaces\"): void {\n define(\n tagName,\n WorkspacesShell,\n injector,\n Base =>\n class extends Base {\n constructor() {\n super();\n bridgeEvents(this, {\n workspaceCreated: { name: \"lexiq-workspaces:workspace-created\", detail: workspace => ({ workspace }) },\n workspaceUpdated: { name: \"lexiq-workspaces:workspace-updated\", detail: workspace => ({ workspace }) },\n askFollowUp: { name: \"lexiq-workspaces:ask-followup\" }\n });\n }\n\n /** Shows the list of workspaces. */\n showList(): void {\n (this as unknown as { workspaceId: string | null }).workspaceId = null;\n }\n\n /** Shows a workspace and its documents. */\n showDetail(id: string): void {\n (this as unknown as { workspaceId: string | null }).workspaceId = id;\n }\n\n /** Opens the \"Add workspace\" dialog, then the workspace it makes. */\n addWorkspace(): void {\n void instanceOf<WorkspacesShell>(this).addWorkspace();\n }\n }\n );\n}\n\nexport function defineLexiqWorkspacePicker(injector: Injector, tagName = \"lexiq-workspace-picker\"): void {\n define(\n tagName,\n WorkspacePickerLauncher,\n injector,\n Base =>\n class extends Base {\n constructor() {\n super();\n bridgeEvents(this, { saved: { name: \"save\", detail: name => ({ name }) }, moved: EVENT(\"moved\") });\n }\n\n openSaveCard(anchor: HTMLElement, options: Parameters<WorkspacePickerLauncher[\"openSaveCard\"]>[1] = {}): void {\n void instanceOf<WorkspacePickerLauncher>(this).openSaveCard(anchor, options);\n }\n\n openMoveMenu(anchor: HTMLElement, documentIds: readonly string[], options: { fromWorkspaceId: string }): void {\n void instanceOf<WorkspacePickerLauncher>(this).openMoveMenu(anchor, documentIds, options);\n }\n }\n );\n}\n\nexport function defineLexiqWorkspaceMentionList(injector: Injector, tagName = \"lexiq-workspace-mention-list\"): void {\n define(\n tagName,\n WorkspaceMentionList,\n injector,\n Base =>\n class extends Base {\n constructor() {\n super();\n bridgeEvents(this, { selectionChanged: EVENT(\"selection-changed\"), workspaceCreated: EVENT(\"workspace-created\") });\n }\n\n /** The rows, for a host that draws its own menu. */\n get items() {\n return instanceOf<WorkspaceMentionList>(this).items();\n }\n\n /** Ticks a workspace from outside. */\n selectById(id: string): void {\n instanceOf<WorkspaceMentionList>(this).select(id);\n }\n }\n );\n}\n\nexport function registerLexiqWorkspacesElements(injector: Injector): void {\n defineLexiqWorkspaces(injector);\n defineLexiqWorkspacePicker(injector);\n defineLexiqWorkspaceMentionList(injector);\n}\n\n/**\n * For a page that is not an Angular application: starts one — zoneless, with the\n * providers the page gives it (Transloco and the `@sinequa/atomic` configuration are the page's\n * to provide) — and registers the three elements on it.\n *\n * ```ts\n * await bootstrapLexiqWorkspacesElements({ providers: [provideTransloco({ … })] });\n * ```\n */\nexport async function bootstrapLexiqWorkspacesElements(config: Partial<ApplicationConfig> = {}): Promise<ApplicationRef> {\n const app = await createApplication({ providers: [provideZonelessChangeDetection(), ...(config.providers ?? [])] });\n registerLexiqWorkspacesElements(app.injector);\n return app;\n}\n","import { EnvironmentProviders, inject, Injector, makeEnvironmentProviders, provideEnvironmentInitializer } from \"@angular/core\";\nimport { registerLexiqWorkspacesElements } from \"./register\";\n\n/**\n * Registers the `lexiq-workspaces`, `lexiq-workspace-picker` and\n * `lexiq-workspace-mention-list` custom elements when the application starts. Add it to\n * the `providers` of the app (or of a route):\n *\n * ```ts\n * export const appConfig: ApplicationConfig = {\n * providers: [provideTransloco({ … }), provideLexiqWorkspacesElements()]\n * };\n * ```\n *\n * The elements render through this application's injector, so they share its Transloco\n * configuration, its `@sinequa/atomic` setup and its `WorkspacesStore` with the rest of the app.\n * A component that uses the tags in a template needs `schemas: [CUSTOM_ELEMENTS_SCHEMA]` — or,\n * in Angular, the components themselves (`WorkspacesShell`…).\n */\nexport function provideLexiqWorkspacesElements(): EnvironmentProviders {\n return makeEnvironmentProviders([provideEnvironmentInitializer(() => registerLexiqWorkspacesElements(inject(Injector)))]);\n}\n"],"mappings":"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"}
|
|
@@ -31754,14 +31754,51 @@ const bodyInterceptorFn = (request, next) => {
|
|
|
31754
31754
|
}
|
|
31755
31755
|
return next(request);
|
|
31756
31756
|
};
|
|
31757
|
+
var HttpSessionLost = class HttpSessionLost {
|
|
31758
|
+
listeners = /* @__PURE__ */ new Set();
|
|
31759
|
+
report(endpoint) {
|
|
31760
|
+
this.listeners.forEach((listener) => listener({ endpoint }));
|
|
31761
|
+
}
|
|
31762
|
+
on(listener) {
|
|
31763
|
+
this.listeners.add(listener);
|
|
31764
|
+
return () => this.listeners.delete(listener);
|
|
31765
|
+
}
|
|
31766
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
31767
|
+
minVersion: "12.0.0",
|
|
31768
|
+
version: "22.2.1",
|
|
31769
|
+
ngImport: i0,
|
|
31770
|
+
type: HttpSessionLost,
|
|
31771
|
+
deps: [],
|
|
31772
|
+
target: i0.ɵɵFactoryTarget.Injectable
|
|
31773
|
+
});
|
|
31774
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
31775
|
+
minVersion: "12.0.0",
|
|
31776
|
+
version: "22.2.1",
|
|
31777
|
+
ngImport: i0,
|
|
31778
|
+
type: HttpSessionLost,
|
|
31779
|
+
providedIn: "root"
|
|
31780
|
+
});
|
|
31781
|
+
};
|
|
31782
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
31783
|
+
minVersion: "12.0.0",
|
|
31784
|
+
version: "22.2.1",
|
|
31785
|
+
ngImport: i0,
|
|
31786
|
+
type: HttpSessionLost,
|
|
31787
|
+
decorators: [{
|
|
31788
|
+
type: Injectable,
|
|
31789
|
+
args: [{ providedIn: "root" }]
|
|
31790
|
+
}]
|
|
31791
|
+
});
|
|
31757
31792
|
const AUTH_RETRIED = new HttpContextToken(() => false);
|
|
31758
31793
|
const errorInterceptorFn = (request, next) => {
|
|
31759
31794
|
const injector = inject(Injector);
|
|
31795
|
+
const sessionLost = inject(HttpSessionLost);
|
|
31760
31796
|
if (request.url.includes("api/v1/audit.notify")) return next(request);
|
|
31761
31797
|
return next(request).pipe(catchError$1((err) => {
|
|
31762
31798
|
if (err.status === 401) {
|
|
31763
31799
|
if (request.context.get(AUTH_RETRIED)) {
|
|
31764
31800
|
error("ErrorInterceptor: 401 again after re-auth retry, giving up");
|
|
31801
|
+
sessionLost.report(request.url);
|
|
31765
31802
|
return throwError(() => err);
|
|
31766
31803
|
}
|
|
31767
31804
|
error("ErrorInterceptor: 401 detected, attempting to refresh auth");
|
|
@@ -31778,6 +31815,7 @@ const errorInterceptorFn = (request, next) => {
|
|
|
31778
31815
|
}));
|
|
31779
31816
|
}), catchError$1((signInErr) => {
|
|
31780
31817
|
error("Failed to refresh auth, redirecting to login", signInErr);
|
|
31818
|
+
if (signInErr?.status === 401) sessionLost.report(request.url);
|
|
31781
31819
|
return throwError(() => signInErr);
|
|
31782
31820
|
})));
|
|
31783
31821
|
}
|
|
@@ -31978,9 +32016,140 @@ function provideDocumentLang() {
|
|
|
31978
32016
|
function provideKeyboardShortcuts() {
|
|
31979
32017
|
return makeEnvironmentProviders([provideEnvironmentInitializer(() => void inject(KeyboardShortcutsService))]);
|
|
31980
32018
|
}
|
|
32019
|
+
const EPOCH_SECONDS = /^\d{9,11}$/;
|
|
32020
|
+
function parseSessionExpiry(token, now = Date.now()) {
|
|
32021
|
+
const separator = token?.lastIndexOf("|") ?? -1;
|
|
32022
|
+
if (!token || separator < 0) return null;
|
|
32023
|
+
const suffix = token.slice(separator + 1);
|
|
32024
|
+
if (!EPOCH_SECONDS.test(suffix)) return null;
|
|
32025
|
+
const expiresAt = Number(suffix) * 1e3;
|
|
32026
|
+
return expiresAt > now ? expiresAt : null;
|
|
32027
|
+
}
|
|
32028
|
+
const DEFAULT_WARN_BEFORE_MS = 3e5;
|
|
32029
|
+
const DEFAULT_STARTUP_GRACE_MS = 5e3;
|
|
32030
|
+
const MAX_TIMEOUT_MS = 2147483647;
|
|
32031
|
+
const SCOPE = "session-expiry";
|
|
32032
|
+
const SCOPE_ALIAS = "sessionExpiry";
|
|
32033
|
+
const FALLBACK = {
|
|
32034
|
+
expiringTitle: "Your session is about to expire",
|
|
32035
|
+
expiringDescription: "It expires in about {{minutes}} min. Save your work or sign in again.",
|
|
32036
|
+
expiredTitle: "Your session has expired",
|
|
32037
|
+
expiredDescription: "Sign in again to continue.",
|
|
32038
|
+
reload: "Sign in again"
|
|
32039
|
+
};
|
|
32040
|
+
function provideSessionExpiry(options = {}) {
|
|
32041
|
+
const warnBeforeMs = options.warnBeforeMs ?? DEFAULT_WARN_BEFORE_MS;
|
|
32042
|
+
const startupGraceMs = options.startupGraceMs ?? DEFAULT_STARTUP_GRACE_MS;
|
|
32043
|
+
const expiredDuration = options.expiredDuration ?? 0;
|
|
32044
|
+
const onReconnect = options.onReconnect ?? (() => location.reload());
|
|
32045
|
+
return makeEnvironmentProviders([provideEnvironmentInitializer(() => {
|
|
32046
|
+
const client = inject(ATOMIC_CLIENT);
|
|
32047
|
+
const httpSessionLost = inject(HttpSessionLost);
|
|
32048
|
+
const transloco = inject(TranslocoService, { optional: true });
|
|
32049
|
+
const destroyRef = inject(DestroyRef);
|
|
32050
|
+
let expiresAt = null;
|
|
32051
|
+
let warned = false;
|
|
32052
|
+
let timer;
|
|
32053
|
+
let hadSession = client.auth.isAuthenticated();
|
|
32054
|
+
let expiredNotified = false;
|
|
32055
|
+
const settled = new Promise((resolve) => setTimeout(resolve, startupGraceMs));
|
|
32056
|
+
const translate = async (key, params) => {
|
|
32057
|
+
await settled;
|
|
32058
|
+
const fallback = params ? FALLBACK[key].replace("{{minutes}}", String(params.minutes)) : FALLBACK[key];
|
|
32059
|
+
if (!transloco) return fallback;
|
|
32060
|
+
try {
|
|
32061
|
+
const text = await firstValueFrom(transloco.selectTranslate(key, params, { scope: SCOPE }));
|
|
32062
|
+
return text === key || text === `${SCOPE_ALIAS}.${key}` ? fallback : text;
|
|
32063
|
+
} catch {
|
|
32064
|
+
return fallback;
|
|
32065
|
+
}
|
|
32066
|
+
};
|
|
32067
|
+
const stillDue = () => {
|
|
32068
|
+
if (expiresAt === null) return false;
|
|
32069
|
+
const remaining = expiresAt - Date.now();
|
|
32070
|
+
return remaining > 0 && remaining <= warnBeforeMs;
|
|
32071
|
+
};
|
|
32072
|
+
const warnExpiring = async () => {
|
|
32073
|
+
await settled;
|
|
32074
|
+
if (!stillDue()) return;
|
|
32075
|
+
const minutes = Math.max(1, Math.ceil((expiresAt - Date.now()) / 6e4));
|
|
32076
|
+
const [title, description] = await Promise.all([translate("expiringTitle"), translate("expiringDescription", { minutes })]);
|
|
32077
|
+
if (!stillDue()) return;
|
|
32078
|
+
notify.warning(title, {
|
|
32079
|
+
description,
|
|
32080
|
+
closeButton: true,
|
|
32081
|
+
important: true
|
|
32082
|
+
});
|
|
32083
|
+
};
|
|
32084
|
+
const check = () => {
|
|
32085
|
+
if (expiresAt === null || warned) return;
|
|
32086
|
+
const delay = expiresAt - warnBeforeMs - Date.now();
|
|
32087
|
+
if (delay > 0) {
|
|
32088
|
+
timer = setTimeout(check, Math.min(delay, MAX_TIMEOUT_MS));
|
|
32089
|
+
return;
|
|
32090
|
+
}
|
|
32091
|
+
warned = true;
|
|
32092
|
+
warnExpiring();
|
|
32093
|
+
};
|
|
32094
|
+
const track = (token) => {
|
|
32095
|
+
clearTimeout(timer);
|
|
32096
|
+
expiresAt = parseSessionExpiry(token);
|
|
32097
|
+
if (expiresAt !== null && expiresAt - Date.now() > warnBeforeMs) warned = false;
|
|
32098
|
+
check();
|
|
32099
|
+
};
|
|
32100
|
+
const clear = () => {
|
|
32101
|
+
clearTimeout(timer);
|
|
32102
|
+
expiresAt = null;
|
|
32103
|
+
hadSession = false;
|
|
32104
|
+
};
|
|
32105
|
+
const notifyExpired = async () => {
|
|
32106
|
+
if (client.config.userOverrideActive) return;
|
|
32107
|
+
if (!hadSession || expiredNotified) return;
|
|
32108
|
+
expiredNotified = true;
|
|
32109
|
+
clearTimeout(timer);
|
|
32110
|
+
expiresAt = null;
|
|
32111
|
+
const [title, description, reload] = await Promise.all([
|
|
32112
|
+
translate("expiredTitle"),
|
|
32113
|
+
translate("expiredDescription"),
|
|
32114
|
+
translate("reload")
|
|
32115
|
+
]);
|
|
32116
|
+
notify.error(title, {
|
|
32117
|
+
description,
|
|
32118
|
+
closeButton: true,
|
|
32119
|
+
important: true,
|
|
32120
|
+
duration: expiredDuration,
|
|
32121
|
+
action: {
|
|
32122
|
+
label: reload,
|
|
32123
|
+
onClick: onReconnect
|
|
32124
|
+
}
|
|
32125
|
+
});
|
|
32126
|
+
};
|
|
32127
|
+
track(client.auth.getToken());
|
|
32128
|
+
const unsubscribe = [
|
|
32129
|
+
client.auth.on("tokenRefreshed", ({ token }) => {
|
|
32130
|
+
hadSession = true;
|
|
32131
|
+
expiredNotified = false;
|
|
32132
|
+
track(token);
|
|
32133
|
+
}),
|
|
32134
|
+
client.auth.on("authenticated", ({ authenticated }) => {
|
|
32135
|
+
if (!authenticated) return clear();
|
|
32136
|
+
hadSession = true;
|
|
32137
|
+
expiredNotified = false;
|
|
32138
|
+
track(client.auth.getToken());
|
|
32139
|
+
}),
|
|
32140
|
+
client.auth.on("loggedOut", clear),
|
|
32141
|
+
client.auth.on("sessionLost", () => void notifyExpired()),
|
|
32142
|
+
httpSessionLost.on(() => void notifyExpired())
|
|
32143
|
+
];
|
|
32144
|
+
destroyRef.onDestroy(() => {
|
|
32145
|
+
clearTimeout(timer);
|
|
32146
|
+
unsubscribe.forEach((off) => off());
|
|
32147
|
+
});
|
|
32148
|
+
})]);
|
|
32149
|
+
}
|
|
31981
32150
|
const queryNameResolver = () => {
|
|
31982
32151
|
return inject(AppStore).getDefaultQuery()?.name || "";
|
|
31983
32152
|
};
|
|
31984
|
-
export { AGGREGATIONS_NAMES, AGGREGATIONS_NAMES_PRESET_DEFAULT, APP_FEATURES, ATOMIC_CLIENT, ATOMIC_SCOPED_PROVIDERS, AddToCollection, AdvancedFiltersBodyComponent, AdvancedFiltersComponent, AdvancedSearch, AdvancedSearchTabs, AggregationComponent, AggregationDateComponent, AggregationDateRange, AggregationItemDirective, AggregationListComponent, AggregationPanelComponent, AggregationTreeComponent, AggregationsService, AggregationsStore, Alert, AlertDialog, AlertForm, AlertsComponent, AppService, AppStore, ApplicationService, ApplicationStore, AppliedFiltersComponent, ArticleEntities, ArticleEntitiesTabPanel, ArticleExtracts, ArticleExtractsTabPanel, ArticleHighlights, ArticleLabels, ArticleLabelsTabPanel, ArticleMatchLocations, ArticleMatchLocationsTabPanel, ArticleSimilarDocuments, ArticleSimilarDocumentsTabPanel, AsideFiltersComponent, AuditFeedbackType, AuditService, AuthGuard, AuthPageComponent, AutocompleteService, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, BackdropComponent, BackdropService, BookmarkButtonComponent, BookmarksComponent, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, ChangePasswordComponent, ChildMarkerDirective, CollectionsComponent, CollectionsDialog, ConverterSelectComponent, DeleteCollection, DeleteCollectionDialog, DidYouMeanComponent, DocumentLocatorComponent, EditLabels, ErrorComponent, Export, ExportDialog, ExportService, FILTERS_BREAKPOINT, FILTER_DATE_ALLOW_CUSTOM_RANGE, FORM_ALERT_CLASS, FORM_BARE_CLASS, FORM_ERROR_CLASS, FORM_FIELD_CLASS, FORM_FOOTER_CLASS, FORM_LABEL_CLASS, FORM_SURFACE_CLASS, FaIconComponent, FeatureFlags, FeatureFlagsDialogComponent, Feedback, FeedbackDialogComponent, FileSizePipe, FilterButtonComponent, FiltersBarComponent, FloatingToolbarComponent, ForgotPasswordComponent, HIGHLIGHTS, HeatmapComponent, HighlightWordPipe, InfinityScrollDirective, InlineWorker, JsonMethodPluginService, KeyboardShortcutsDialog, KeyboardShortcutsDialogComponent, KeyboardShortcutsService, LabelService, LabelsEditDialog, ListPanelItemDirective, LoadingComponent, MarkdownPipe, MarkdownRendererService, MetadataComponent, MissingTermsComponent, MoreButtonComponent, MoreComponent, MultiSelectLabelsComponent, MultiSelectionToolbarComponent, NON_SEARCHABLE_COLUMNS, NON_SEARCHABLE_DEFAULTS, NavbarTabsComponent, NavigationService, NoResultComponent, OpenArticleOnCtrlEnterDirective, OperatorPipe, OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective, OverrideUser, OverrideUserDialogComponent, PREVIEW_ASSISTANT_COMPONENT, PREVIEW_CONFIG, PagerComponent, PreviewActionsComponent, PreviewContentComponent, PreviewHeaderComponent, PreviewNavigator, PreviewService, PrincipalService, PrincipalStore, QueryParamsStore, QueryService, RECENT_SEARCHES_CONFIG, RECENT_SEARCHES_OPTIONS, ROUTE_COMPONENTS, RecentSearchesComponent, ResetUserSettings, ResetUserSettingsDialogComponent, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, SavedSearch, SavedSearchDialog, SavedSearchPopover, SavedSearchesComponent, SavedSearchesService, SearchFeedbackComponent, SearchInputFooter, SearchService, SelectArticleDirective, SelectionService, SelectionStore, ShortcutDirective, ShowBookmarkDirective, SignInComponent, SignedOutComponent, SortSelectorComponent, SourceComponent, SourceIconPipe, SponsoredResultsComponent, SyslangPipe, THEMES, TagCloudComponent, TextChunkService, ThemeProviderDirective, ThemeSelectorComponent, ThemeStore, ThemeToggleComponent, TranslocoDateImpurePipe, UserOverrideService, UserProfile, UserProfileDialog, UserProfileFormComponent, UserProfileService, UserSettingsPersistence, UserSettingsStore, WEIGHT_STEPS, WordCloudComponent, ZoomControlsComponent, __resetSignInMutexForTests, activateShortcutTarget, applyThemeToNativeElement, atomicClientProvider, auditInterceptorFn, authInterceptorFn, bodyInterceptorFn, bootstrapApp, buildHeatmap, buildQuery, buildTagCloud, candidatesFor, canonicalize, debouncedSignal, errorInterceptorFn, fieldErrorKey, fieldShowsError, filterKey, filterLeaves, filterValues, findAggregation, flagsFromWeekdays, focusWhenReady, galactikPrimitive, galactikSemantic, getCurrentPath, getCurrentQueryName, getQueryNameFromRoute, injectAdvancedFilters, injectAtomicClient, injectRouteNavigation, injectUserSettingsPatch, isAuthRoute, isSignInInFlight, itemLabel, layoutWordCloud, legacyFilterToFilter, makeWeightScale, multiSelectionToolbarVariants, paletteColor, processCssVars, provideAtomicClient, provideAtomicNotifications, provideAtomicScope, provideDocumentLang, provideKeyboardShortcuts, quantileScale, queryNameResolver, rebuildWithout, seriesPalette, signIn, themeColorNameToCssVariable, themeColorsToCssVariables, timelinePalette, toAriaKeyshortcuts, toDisplayParts, toPercentages, toSeries, toastInterceptorFn, weekdaysFromFlags, withAggregationsFeatures, withAlertsFeatures, withAlpha, withAppFeatures, withApplicationFeatures, withAssistantFeatures, withBasketsFeatures, withBookmarkFeatures, withBootstrapApp, withExtractsFeatures, withFetch, withMultiSelectionFeatures, withQueryParamsFeatures, withRecentSearchesFeatures, withSavedSearchesFeatures, withSelectionFeatures, withThemeBodyHook, withThemes, withThemesFeatures, withUserSettingsFeatures };
|
|
32153
|
+
export { AGGREGATIONS_NAMES, AGGREGATIONS_NAMES_PRESET_DEFAULT, APP_FEATURES, ATOMIC_CLIENT, ATOMIC_SCOPED_PROVIDERS, AddToCollection, AdvancedFiltersBodyComponent, AdvancedFiltersComponent, AdvancedSearch, AdvancedSearchTabs, AggregationComponent, AggregationDateComponent, AggregationDateRange, AggregationItemDirective, AggregationListComponent, AggregationPanelComponent, AggregationTreeComponent, AggregationsService, AggregationsStore, Alert, AlertDialog, AlertForm, AlertsComponent, AppService, AppStore, ApplicationService, ApplicationStore, AppliedFiltersComponent, ArticleEntities, ArticleEntitiesTabPanel, ArticleExtracts, ArticleExtractsTabPanel, ArticleHighlights, ArticleLabels, ArticleLabelsTabPanel, ArticleMatchLocations, ArticleMatchLocationsTabPanel, ArticleSimilarDocuments, ArticleSimilarDocumentsTabPanel, AsideFiltersComponent, AuditFeedbackType, AuditService, AuthGuard, AuthPageComponent, AutocompleteService, BOOKMARKS_CONFIG, BOOKMARKS_OPTIONS, BackdropComponent, BackdropService, BookmarkButtonComponent, BookmarksComponent, COLLECTIONS_CONFIG, COLLECTIONS_OPTIONS, COMPONENTS_FOR_DOCUMENT_TYPE, ChangePasswordComponent, ChildMarkerDirective, CollectionsComponent, CollectionsDialog, ConverterSelectComponent, DeleteCollection, DeleteCollectionDialog, DidYouMeanComponent, DocumentLocatorComponent, EditLabels, ErrorComponent, Export, ExportDialog, ExportService, FILTERS_BREAKPOINT, FILTER_DATE_ALLOW_CUSTOM_RANGE, FORM_ALERT_CLASS, FORM_BARE_CLASS, FORM_ERROR_CLASS, FORM_FIELD_CLASS, FORM_FOOTER_CLASS, FORM_LABEL_CLASS, FORM_SURFACE_CLASS, FaIconComponent, FeatureFlags, FeatureFlagsDialogComponent, Feedback, FeedbackDialogComponent, FileSizePipe, FilterButtonComponent, FiltersBarComponent, FloatingToolbarComponent, ForgotPasswordComponent, HIGHLIGHTS, HeatmapComponent, HighlightWordPipe, InfinityScrollDirective, InlineWorker, JsonMethodPluginService, KeyboardShortcutsDialog, KeyboardShortcutsDialogComponent, KeyboardShortcutsService, LabelService, LabelsEditDialog, ListPanelItemDirective, LoadingComponent, MarkdownPipe, MarkdownRendererService, MetadataComponent, MissingTermsComponent, MoreButtonComponent, MoreComponent, MultiSelectLabelsComponent, MultiSelectionToolbarComponent, NON_SEARCHABLE_COLUMNS, NON_SEARCHABLE_DEFAULTS, NavbarTabsComponent, NavigationService, NoResultComponent, OpenArticleOnCtrlEnterDirective, OperatorPipe, OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective, OverrideUser, OverrideUserDialogComponent, PREVIEW_ASSISTANT_COMPONENT, PREVIEW_CONFIG, PagerComponent, PreviewActionsComponent, PreviewContentComponent, PreviewHeaderComponent, PreviewNavigator, PreviewService, PrincipalService, PrincipalStore, QueryParamsStore, QueryService, RECENT_SEARCHES_CONFIG, RECENT_SEARCHES_OPTIONS, ROUTE_COMPONENTS, RecentSearchesComponent, ResetUserSettings, ResetUserSettingsDialogComponent, SAVED_SEARCHES_CONFIG, SAVED_SEARCHES_OPTIONS, SavedSearch, SavedSearchDialog, SavedSearchPopover, SavedSearchesComponent, SavedSearchesService, SearchFeedbackComponent, SearchInputFooter, SearchService, SelectArticleDirective, SelectionService, SelectionStore, ShortcutDirective, ShowBookmarkDirective, SignInComponent, SignedOutComponent, SortSelectorComponent, SourceComponent, SourceIconPipe, SponsoredResultsComponent, SyslangPipe, THEMES, TagCloudComponent, TextChunkService, ThemeProviderDirective, ThemeSelectorComponent, ThemeStore, ThemeToggleComponent, TranslocoDateImpurePipe, UserOverrideService, UserProfile, UserProfileDialog, UserProfileFormComponent, UserProfileService, UserSettingsPersistence, UserSettingsStore, WEIGHT_STEPS, WordCloudComponent, ZoomControlsComponent, __resetSignInMutexForTests, activateShortcutTarget, applyThemeToNativeElement, atomicClientProvider, auditInterceptorFn, authInterceptorFn, bodyInterceptorFn, bootstrapApp, buildHeatmap, buildQuery, buildTagCloud, candidatesFor, canonicalize, debouncedSignal, errorInterceptorFn, fieldErrorKey, fieldShowsError, filterKey, filterLeaves, filterValues, findAggregation, flagsFromWeekdays, focusWhenReady, galactikPrimitive, galactikSemantic, getCurrentPath, getCurrentQueryName, getQueryNameFromRoute, injectAdvancedFilters, injectAtomicClient, injectRouteNavigation, injectUserSettingsPatch, isAuthRoute, isSignInInFlight, itemLabel, layoutWordCloud, legacyFilterToFilter, makeWeightScale, multiSelectionToolbarVariants, paletteColor, processCssVars, provideAtomicClient, provideAtomicNotifications, provideAtomicScope, provideDocumentLang, provideKeyboardShortcuts, provideSessionExpiry, quantileScale, queryNameResolver, rebuildWithout, seriesPalette, signIn, themeColorNameToCssVariable, themeColorsToCssVariables, timelinePalette, toAriaKeyshortcuts, toDisplayParts, toPercentages, toSeries, toastInterceptorFn, weekdaysFromFlags, withAggregationsFeatures, withAlertsFeatures, withAlpha, withAppFeatures, withApplicationFeatures, withAssistantFeatures, withBasketsFeatures, withBookmarkFeatures, withBootstrapApp, withExtractsFeatures, withFetch, withMultiSelectionFeatures, withQueryParamsFeatures, withRecentSearchesFeatures, withSavedSearchesFeatures, withSelectionFeatures, withThemeBodyHook, withThemes, withThemesFeatures, withUserSettingsFeatures };
|
|
31985
32154
|
|
|
31986
32155
|
//# sourceMappingURL=sinequa-atomic-angular.mjs.map
|