@fudanda/admin-antd 2.20261107.1-beta.1 → 2.20261109.1-beta.2
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/chunks/ApiTokensPage-w3JGRNQC.js +2 -0
- package/dist/chunks/ApiTokensPage-w3JGRNQC.js.map +1 -0
- package/dist/chunks/{App-BF96TQ_D.js → App-nh6_qOo8.js} +5 -5
- package/dist/chunks/{App-BF96TQ_D.js.map → App-nh6_qOo8.js.map} +1 -1
- package/dist/chunks/{AppModal-CLkMJ-96.js → AppModal-CEouaU03.js} +2 -2
- package/dist/chunks/{AppModal-CLkMJ-96.js.map → AppModal-CEouaU03.js.map} +1 -1
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js → ArcBaseAdmin-CX7fQz4x.js} +2 -2
- package/dist/chunks/{ArcBaseAdmin--xQxd4tg.js.map → ArcBaseAdmin-CX7fQz4x.js.map} +1 -1
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js → DepartmentsPage-BdD9VfDI.js} +2 -2
- package/dist/chunks/{DepartmentsPage-D6YVegPU.js.map → DepartmentsPage-BdD9VfDI.js.map} +1 -1
- package/dist/chunks/{DictsPage-uV3Uukwc.js → DictsPage-fxBdV1-3.js} +2 -2
- package/dist/chunks/{DictsPage-uV3Uukwc.js.map → DictsPage-fxBdV1-3.js.map} +1 -1
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js → EntityContextRuntime-CMhoj6qe.js} +2 -2
- package/dist/chunks/{EntityContextRuntime-DbjyzCtY.js.map → EntityContextRuntime-CMhoj6qe.js.map} +1 -1
- package/dist/chunks/EntityContextRuntime-Dc89ZSnM.js +1 -0
- package/dist/chunks/{ExportButton-e2ybxuHb.js → ExportButton-DGxB2tcu.js} +2 -2
- package/dist/chunks/{ExportButton-e2ybxuHb.js.map → ExportButton-DGxB2tcu.js.map} +1 -1
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js → FileViewerPreviewPanel-BMZ7FdKV.js} +3 -3
- package/dist/chunks/{FileViewerPreviewPanel-BhI3pTi8.js.map → FileViewerPreviewPanel-BMZ7FdKV.js.map} +1 -1
- package/dist/chunks/{FilesPage-BI35mStl.js → FilesPage-DrgWELKy.js} +3 -3
- package/dist/chunks/{FilesPage-BI35mStl.js.map → FilesPage-DrgWELKy.js.map} +1 -1
- package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js +9 -0
- package/dist/chunks/IdentitySecurityPage-BjTKvr-O.js.map +1 -0
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js → LogStatsScaffold-DaB0JeAN.js} +2 -2
- package/dist/chunks/{LogStatsScaffold-m0vVUXPh.js.map → LogStatsScaffold-DaB0JeAN.js.map} +1 -1
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js → LoginLogsPage-VmYC7i6q.js} +2 -2
- package/dist/chunks/{LoginLogsPage-BzBUR4Oo.js.map → LoginLogsPage-VmYC7i6q.js.map} +1 -1
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js → LoginLogsTable-CULcc_e8.js} +2 -2
- package/dist/chunks/{LoginLogsTable-BweUEjQX.js.map → LoginLogsTable-CULcc_e8.js.map} +1 -1
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js → MarkdownPreviewPanel-CBcPc7Wv.js} +2 -2
- package/dist/chunks/{MarkdownPreviewPanel-C1OKSLmh.js.map → MarkdownPreviewPanel-CBcPc7Wv.js.map} +1 -1
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js → MasterDetailLayout-ByIBpmkZ.js} +2 -2
- package/dist/chunks/{MasterDetailLayout-KVizcSNO.js.map → MasterDetailLayout-ByIBpmkZ.js.map} +1 -1
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js → McpSettingsPage-C5V_rj2V.js} +2 -2
- package/dist/chunks/{McpSettingsPage-Dhf0CbDN.js.map → McpSettingsPage-C5V_rj2V.js.map} +1 -1
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js → MemberAssignmentSheet-DL0fg1Yf.js} +2 -2
- package/dist/chunks/{MemberAssignmentSheet-TYpnyA0z.js.map → MemberAssignmentSheet-DL0fg1Yf.js.map} +1 -1
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js → MenuCommandPalette-C2PvK3Gh.js} +2 -2
- package/dist/chunks/{MenuCommandPalette-BcvpUfK7.js.map → MenuCommandPalette-C2PvK3Gh.js.map} +1 -1
- package/dist/chunks/{MenusPage-Dd7OLQYT.js → MenusPage-Bytd1HlW.js} +2 -2
- package/dist/chunks/{MenusPage-Dd7OLQYT.js.map → MenusPage-Bytd1HlW.js.map} +1 -1
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js → MonacoPreviewPanel-BZrNIcFZ.js} +2 -2
- package/dist/chunks/{MonacoPreviewPanel-BW1j3ZTF.js.map → MonacoPreviewPanel-BZrNIcFZ.js.map} +1 -1
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js → NavListPanel-zwUDIYSP.js} +2 -2
- package/dist/chunks/{NavListPanel-Iz1RCkVw.js.map → NavListPanel-zwUDIYSP.js.map} +1 -1
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js → OperationLogsPage-D2BQdGNp.js} +2 -2
- package/dist/chunks/{OperationLogsPage-Dt22tU4I.js.map → OperationLogsPage-D2BQdGNp.js.map} +1 -1
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js → OperationLogsTable-DaaON4QR.js} +3 -3
- package/dist/chunks/{OperationLogsTable-B23Ry-2v.js.map → OperationLogsTable-DaaON4QR.js.map} +1 -1
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js → PDFPreviewPanel-CMmnWBKW.js} +3 -3
- package/dist/chunks/{PDFPreviewPanel-kBPz5dQr.js.map → PDFPreviewPanel-CMmnWBKW.js.map} +1 -1
- package/dist/chunks/{PositionsPage-BIKYQDB5.js → PositionsPage-CBZITssT.js} +2 -2
- package/dist/chunks/{PositionsPage-BIKYQDB5.js.map → PositionsPage-CBZITssT.js.map} +1 -1
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js → PreferencesSheetBody-B0poTPEA.js} +2 -2
- package/dist/chunks/{PreferencesSheetBody-D276rrp4.js.map → PreferencesSheetBody-B0poTPEA.js.map} +1 -1
- package/dist/chunks/{ProfilePage-DLftC6KZ.js → ProfilePage-DLhacdWt.js} +2 -2
- package/dist/chunks/{ProfilePage-DLftC6KZ.js.map → ProfilePage-DLhacdWt.js.map} +1 -1
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js → ProjectInfoPage-CJpGxpu5.js} +2 -2
- package/dist/chunks/{ProjectInfoPage-DkuBLC8t.js.map → ProjectInfoPage-CJpGxpu5.js.map} +1 -1
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js → RelationPanel-BsbfEDo2.js} +2 -2
- package/dist/chunks/{RelationPanel-B4BeO0Bz.js.map → RelationPanel-BsbfEDo2.js.map} +1 -1
- package/dist/chunks/{RolesPage-BhltU2Qm.js → RolesPage-46dzdiah.js} +2 -2
- package/dist/chunks/{RolesPage-BhltU2Qm.js.map → RolesPage-46dzdiah.js.map} +1 -1
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js → SessionConflictModal-Bm38eExL.js} +2 -2
- package/dist/chunks/{SessionConflictModal-3R8jdYkI.js.map → SessionConflictModal-Bm38eExL.js.map} +1 -1
- package/dist/chunks/SettingModuleDetail-BjxUJeH5.js +17 -0
- package/dist/chunks/SettingModuleDetail-BjxUJeH5.js.map +1 -0
- package/dist/chunks/{SettingsPage-DMzeDrnc.js → SettingsPage-C32Vuizm.js} +2 -2
- package/dist/chunks/{SettingsPage-DMzeDrnc.js.map → SettingsPage-C32Vuizm.js.map} +1 -1
- package/dist/chunks/{StatCard-C0xSZyiS.js → StatCard-CRPfkSBY.js} +2 -2
- package/dist/chunks/{StatCard-C0xSZyiS.js.map → StatCard-CRPfkSBY.js.map} +1 -1
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js → UserGroupsPage-08G5MdGm.js} +2 -2
- package/dist/chunks/{UserGroupsPage-DTJdszHl.js.map → UserGroupsPage-08G5MdGm.js.map} +1 -1
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js → UserLogsPanels-nbIrMym9.js} +2 -2
- package/dist/chunks/{UserLogsPanels-z4UhQtgu.js.map → UserLogsPanels-nbIrMym9.js.map} +1 -1
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js → UserTransferSelect-C8betaWG.js} +2 -2
- package/dist/chunks/{UserTransferSelect-BJNUXMhl.js.map → UserTransferSelect-C8betaWG.js.map} +1 -1
- package/dist/chunks/{UsersPage--p68X2Yr.js → UsersPage-BjTiNEqF.js} +2 -2
- package/dist/chunks/{UsersPage--p68X2Yr.js.map → UsersPage-BjTiNEqF.js.map} +1 -1
- package/dist/chunks/{browser-BKLM0ThC-3Xar5rZw.js → browser-BKLM0ThC-Cp7Gi4-F.js} +1 -1
- package/dist/chunks/{code-P0HJS_q1.js → code-LswxAr98.js} +1 -1
- package/dist/chunks/{direct-engine-BYEscsGg.js → direct-engine-Dv_6v4sx.js} +1 -1
- package/dist/chunks/{html-B__1Vr_C.js → html-BokjxlLb.js} +1 -1
- package/dist/chunks/{line-DzLRZVEq.js → line-Bqh6atHH.js} +1 -1
- package/dist/chunks/{lrc-kf-TilFB.js → lrc-T5e1svZG.js} +1 -1
- package/dist/chunks/{markdown-xIo-vnKK.js → markdown-BpWokN1s.js} +1 -1
- package/dist/chunks/{patch-BEaX-xYV.js → patch-BYVX5C9G.js} +1 -1
- package/dist/chunks/{worker-engine-FCdIQLzN.js → worker-engine-CtUAeI4G.js} +1 -1
- package/dist/core/hooks/queries/settings.d.ts +6 -0
- package/dist/core/hooks/queries/settings.d.ts.map +1 -1
- package/dist/core/hooks/queries/settings.js +34 -25
- package/dist/core/hooks/queries/settings.js.map +1 -1
- package/dist/core/hooks/useAuth.d.ts +2 -0
- package/dist/core/hooks/useAuth.d.ts.map +1 -1
- package/dist/core/hooks/useAuth.js.map +1 -1
- package/dist/core/index.js +7 -7
- package/dist/core/lib/go-auth-api.d.ts +1 -1
- package/dist/core/lib/go-auth-api.d.ts.map +1 -1
- package/dist/core/lib/go-auth-api.js +12 -8
- package/dist/core/lib/go-auth-api.js.map +1 -1
- package/dist/core/lib/native-operations.d.ts +85 -4
- package/dist/core/lib/native-operations.d.ts.map +1 -1
- package/dist/core/lib/native-operations.js +1 -0
- package/dist/core/lib/native-operations.js.map +1 -1
- package/dist/core/providers/GoAuthProvider.d.ts.map +1 -1
- package/dist/core/providers/GoAuthProvider.js +191 -142
- package/dist/core/providers/GoAuthProvider.js.map +1 -1
- package/dist/core/session-renewal.d.ts +15 -0
- package/dist/core/session-renewal.d.ts.map +1 -0
- package/dist/core/session-renewal.js +95 -0
- package/dist/core/session-renewal.js.map +1 -0
- package/dist/core/session-transition.d.ts +2 -0
- package/dist/core/session-transition.d.ts.map +1 -1
- package/dist/core/session-transition.js +20 -7
- package/dist/core/session-transition.js.map +1 -1
- package/dist/core/session.d.ts +4 -0
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +88 -61
- package/dist/core/session.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{src-C8_bzBi4.js → src-D6UlLiVN.js} +2 -2
- package/dist/{src-C8_bzBi4.js.map → src-D6UlLiVN.js.map} +1 -1
- package/package.json +9 -9
- package/dist/chunks/ApiTokensPage-DiRMgViD.js +0 -2
- package/dist/chunks/ApiTokensPage-DiRMgViD.js.map +0 -1
- package/dist/chunks/EntityContextRuntime-BOJySc1D.js +0 -1
- package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js +0 -9
- package/dist/chunks/IdentitySecurityPage-DW5ybVL4.js.map +0 -1
- package/dist/chunks/SettingModuleDetail-Dppk9An1.js +0 -17
- package/dist/chunks/SettingModuleDetail-Dppk9An1.js.map +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GoSession } from './session';
|
|
2
|
+
export declare const SESSION_RENEWAL_CHANNEL = "arcbase-go-session-renewal";
|
|
3
|
+
interface RenewalOwner {
|
|
4
|
+
renew(signal: AbortSignal): Promise<void>;
|
|
5
|
+
refresh(signal: AbortSignal): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/** Scheduling only: the existing session owner admits responses and owns identity. */
|
|
8
|
+
export declare function createSessionRenewal(owner: RenewalOwner): {
|
|
9
|
+
update(next: GoSession | null): void;
|
|
10
|
+
pause: () => void;
|
|
11
|
+
resume: () => void;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=session-renewal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-renewal.d.ts","sourceRoot":"","sources":["../src/session-renewal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AAIpE,UAAU,YAAY;IACpB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY;iBA+EvC,SAAS,GAAG,IAAI;;;;EAehC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { GoaError as e } from "@fudanda/client";
|
|
2
|
+
// src/session-renewal.ts
|
|
3
|
+
var t = "arcbase-go-session-renewal", n = [
|
|
4
|
+
1e3,
|
|
5
|
+
5e3,
|
|
6
|
+
15e3
|
|
7
|
+
], r = 2147483647;
|
|
8
|
+
function i(t) {
|
|
9
|
+
let i = null, a, o = null, s = 0, c = !1, l = 0, u = !1, d = "", f = () => typeof navigator > "u" || navigator.onLine !== !1, p = () => JSON.stringify([
|
|
10
|
+
i?.expiresAt,
|
|
11
|
+
i?.absoluteExpiresAt,
|
|
12
|
+
i?.renewAfter,
|
|
13
|
+
i?.autoRenew
|
|
14
|
+
]), m = () => {
|
|
15
|
+
let e = Date.parse(i?.expiresAt ?? ""), t = Date.parse(i?.absoluteExpiresAt ?? "");
|
|
16
|
+
return Number.isFinite(e) && Number.isFinite(t) ? Math.min(e, t) : null;
|
|
17
|
+
}, h = () => {
|
|
18
|
+
a !== void 0 && clearTimeout(a), a = void 0;
|
|
19
|
+
}, g = () => {
|
|
20
|
+
h(), s++, o?.abort(), o = null;
|
|
21
|
+
}, _ = (e, t) => {
|
|
22
|
+
h(), a = setTimeout(() => {
|
|
23
|
+
a = void 0, t();
|
|
24
|
+
}, Math.max(0, Math.min(e, r)));
|
|
25
|
+
}, v = () => {
|
|
26
|
+
let e = m();
|
|
27
|
+
if (l >= n.length) {
|
|
28
|
+
u = !0, b();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let t = n[l++];
|
|
32
|
+
e !== null && Date.now() + t < e ? _(t, () => {
|
|
33
|
+
y("renew");
|
|
34
|
+
}) : (u = !0, b());
|
|
35
|
+
};
|
|
36
|
+
async function y(n) {
|
|
37
|
+
if (c || o || !i || !f() || n === "renew" && (i.autoRenew !== !0 || u)) return;
|
|
38
|
+
let r = m();
|
|
39
|
+
if (n === "renew" && (r === null || Date.now() >= r)) {
|
|
40
|
+
b();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
let a = s, l = p(), d = new AbortController();
|
|
44
|
+
o = d;
|
|
45
|
+
let h = !1;
|
|
46
|
+
try {
|
|
47
|
+
if (await t[n](d.signal), a !== s || c) return;
|
|
48
|
+
h = n === "renew" && l === p();
|
|
49
|
+
} catch (t) {
|
|
50
|
+
if (a !== s || c || d.signal.aborted) return;
|
|
51
|
+
if (t instanceof e && t.status === 401) {
|
|
52
|
+
g();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
h = n === "renew";
|
|
56
|
+
} finally {
|
|
57
|
+
o === d && (o = null), a === s && !c && (h ? v() : b());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function b() {
|
|
61
|
+
if (h(), c || o || !i || !f()) return;
|
|
62
|
+
let e = m();
|
|
63
|
+
if (e === null) return;
|
|
64
|
+
if (Date.now() >= e) {
|
|
65
|
+
let e = p();
|
|
66
|
+
d !== e && (d = e, _(0, () => {
|
|
67
|
+
y("refresh");
|
|
68
|
+
}));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
let t = Date.parse(i.renewAfter ?? "");
|
|
72
|
+
i.autoRenew === !0 && Number.isFinite(t) && t < e && !u ? _(t - Date.now(), () => {
|
|
73
|
+
y("renew");
|
|
74
|
+
}) : _(e - Date.now(), b);
|
|
75
|
+
}
|
|
76
|
+
let x = () => {
|
|
77
|
+
i && !c && !o && f() && (l = 0, u = !1, d = "", h(), y("refresh"));
|
|
78
|
+
}, S = () => {
|
|
79
|
+
typeof document < "u" && document.visibilityState === "visible" && x();
|
|
80
|
+
}, C = () => g();
|
|
81
|
+
return globalThis.addEventListener?.("online", x), globalThis.addEventListener?.("offline", C), globalThis.addEventListener?.("focus", x), globalThis.document?.addEventListener("visibilitychange", S), {
|
|
82
|
+
update(e) {
|
|
83
|
+
let t = p();
|
|
84
|
+
i = e, t !== p() && (l = 0, u = !1, d = ""), e ? b() : g();
|
|
85
|
+
},
|
|
86
|
+
pause: g,
|
|
87
|
+
resume: x,
|
|
88
|
+
dispose() {
|
|
89
|
+
c = !0, g(), globalThis.removeEventListener?.("online", x), globalThis.removeEventListener?.("offline", C), globalThis.removeEventListener?.("focus", x), globalThis.document?.removeEventListener("visibilitychange", S);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export { t as SESSION_RENEWAL_CHANNEL, i as createSessionRenewal };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=session-renewal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-renewal.js","names":["SESSION_RENEWAL_CHANNEL","RETRY_DELAYS","MAX_TIMER_DELAY","createSessionRenewal","session","timer","pending","revision","disposed","attempts","exhausted","checkedDeadline","online","fingerprint","deadline","expires","absolute","clearTimer","pause","later","action","delay","retry","end","schedule","request","kind","current","before","controller","failed","owner","error","GoaError","key","renewAt","resume","visibility","offline","next"],"sources":["../src/session-renewal.ts"],"sourcesContent":["import { GoaError } from '@fudanda/client';\nimport type { GoSession } from './session';\n\n// Older SDKs treat every message on the identity channel as a user change.\nexport const SESSION_RENEWAL_CHANNEL = 'arcbase-go-session-renewal';\n\nconst RETRY_DELAYS = [1_000, 5_000, 15_000] as const;\nconst MAX_TIMER_DELAY = 2_147_483_647;\ninterface RenewalOwner {\n renew(signal: AbortSignal): Promise<void>;\n refresh(signal: AbortSignal): Promise<void>;\n}\n\n/** Scheduling only: the existing session owner admits responses and owns identity. */\nexport function createSessionRenewal(owner: RenewalOwner) {\n let session: GoSession | null = null;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pending: AbortController | null = null;\n let revision = 0;\n let disposed = false;\n let attempts = 0;\n let exhausted = false;\n let checkedDeadline = '';\n const online = () => typeof navigator === 'undefined' || navigator.onLine !== false;\n const fingerprint = () => JSON.stringify([session?.expiresAt, session?.absoluteExpiresAt, session?.renewAfter, session?.autoRenew]);\n const deadline = () => {\n const expires = Date.parse(session?.expiresAt ?? '');\n const absolute = Date.parse(session?.absoluteExpiresAt ?? '');\n return Number.isFinite(expires) && Number.isFinite(absolute) ? Math.min(expires, absolute) : null;\n };\n const clearTimer = () => { if (timer !== undefined) clearTimeout(timer); timer = undefined; };\n const pause = () => { clearTimer(); revision++; pending?.abort(); pending = null; };\n const later = (delay: number, action: () => void) => {\n clearTimer();\n timer = setTimeout(() => { timer = undefined; action(); }, Math.max(0, Math.min(delay, MAX_TIMER_DELAY)));\n };\n const retry = () => {\n const end = deadline();\n if (attempts >= RETRY_DELAYS.length) { exhausted = true; schedule(); return; }\n const delay = RETRY_DELAYS[attempts++];\n if (end !== null && Date.now() + delay < end) later(delay, () => { void request('renew'); });\n else { exhausted = true; schedule(); }\n };\n async function request(kind: 'renew' | 'refresh') {\n if (disposed || pending || !session || !online()) return;\n if (kind === 'renew' && (session.autoRenew !== true || exhausted)) return;\n const end = deadline();\n if (kind === 'renew' && (end === null || Date.now() >= end)) { schedule(); return; }\n const current = revision;\n const before = fingerprint();\n const controller = new AbortController(); pending = controller;\n let failed = false;\n try {\n await owner[kind](controller.signal);\n if (current !== revision || disposed) return;\n // An unchanged due hint must not create a tight loop if the server did not extend it.\n failed = kind === 'renew' && before === fingerprint();\n } catch (error) {\n if (current !== revision || disposed || controller.signal.aborted) return;\n if (error instanceof GoaError && error.status === 401) { pause(); return; }\n failed = kind === 'renew';\n } finally {\n if (pending === controller) pending = null;\n if (current === revision && !disposed) { if (failed) retry(); else schedule(); }\n }\n }\n function schedule() {\n clearTimer();\n if (disposed || pending || !session || !online()) return;\n const end = deadline();\n if (end === null) return; // Old hosts without expiry hints keep their existing lifecycle.\n if (Date.now() >= end) {\n const key = fingerprint();\n if (checkedDeadline !== key) { checkedDeadline = key; later(0, () => { void request('refresh'); }); }\n return;\n }\n const renewAt = Date.parse(session.renewAfter ?? '');\n if (session.autoRenew === true && Number.isFinite(renewAt) && renewAt < end && !exhausted)\n later(renewAt - Date.now(), () => { void request('renew'); });\n else later(end - Date.now(), schedule);\n }\n const resume = () => {\n if (!session || disposed || pending || !online()) return;\n attempts = 0; exhausted = false; checkedDeadline = '';\n clearTimer(); void request('refresh');\n };\n const visibility = () => { if (typeof document !== 'undefined' && document.visibilityState === 'visible') resume(); };\n const offline = () => pause();\n globalThis.addEventListener?.('online', resume);\n globalThis.addEventListener?.('offline', offline);\n globalThis.addEventListener?.('focus', resume);\n globalThis.document?.addEventListener('visibilitychange', visibility);\n return {\n update(next: GoSession | null) {\n const before = fingerprint(); session = next;\n if (before !== fingerprint()) { attempts = 0; exhausted = false; checkedDeadline = ''; }\n if (!next) pause(); else schedule();\n },\n pause,\n resume,\n dispose() {\n disposed = true; pause();\n globalThis.removeEventListener?.('online', resume);\n globalThis.removeEventListener?.('offline', offline);\n globalThis.removeEventListener?.('focus', resume);\n globalThis.document?.removeEventListener('visibilitychange', visibility);\n },\n };\n}\n"],"mappings":";;AAIA,IAAaA,IAA0B,8BAEjCC,IAAe;CAAC;CAAO;CAAO;AAAM,GACpCC,IAAkB;AAOxB,SAAgBC,EAAqB,GAAqB;CACxD,IAAIC,IAA4B,MAC5BC,GACAC,IAAkC,MAClCC,IAAW,GACXC,IAAW,IACXC,IAAW,GACXC,IAAY,IACZC,IAAkB,IAChBC,UAAe,OAAO,YAAc,OAAe,UAAU,WAAW,IACxEC,UAAoB,KAAK,UAAU;EAACT,GAAS;EAAWA,GAAS;EAAmBA,GAAS;EAAYA,GAAS;CAAS,CAAC,GAC5HU,UAAiB;EACrB,IAAMC,IAAU,KAAK,MAAMX,GAAS,aAAa,EAAE,GAC7CY,IAAW,KAAK,MAAMZ,GAAS,qBAAqB,EAAE;EAC5D,OAAO,OAAO,SAASW,CAAO,KAAK,OAAO,SAASC,CAAQ,IAAI,KAAK,IAAID,GAASC,CAAQ,IAAI;CAC/F,GACMC,UAAmB;EAAgD,AAA1CZ,MAAU,KAAA,KAAW,aAAaA,CAAK,GAAG,IAAQ,KAAA;CAAW,GACtFa,UAAc;EAA8C,AAA5CD,EAAW,GAAG,KAAYX,GAAS,MAAM,GAAG,IAAU;CAAM,GAC5Ea,KAAS,GAAe,MAAuB;EAEnD,AADAF,EAAW,GACX,IAAQ,iBAAiB;GAAqB,AAAnB,IAAQ,KAAA,GAAWG,EAAO;EAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAIC,GAAOnB,CAAe,CAAC,CAAC;CAC1G,GACMoB,UAAc;EAClB,IAAMC,IAAMT,EAAS;EACrB,IAAIL,KAAYR,EAAa,QAAQ;GAAoB,AAAlB,IAAY,IAAMuB,EAAS;GAAG;EAAQ;EAC7E,IAAMH,IAAQpB,EAAa;EAC3B,AAAIsB,MAAQ,QAAQ,KAAK,IAAI,IAAIF,IAAQE,IAAKJ,EAAME,SAAa;GAAE,EAAa,OAAO;EAAG,CAAC,KACpF,IAAY,IAAMG,EAAS;CACpC;CACA,eAAeC,EAAQ,GAA2B;EAEhD,IADIjB,KAAYF,KAAW,CAACF,KAAW,CAACQ,EAAO,KAC3Cc,MAAS,YAAYtB,EAAQ,cAAc,MAAQM,IAAY;EACnE,IAAMa,IAAMT,EAAS;EACrB,IAAIY,MAAS,YAAYH,MAAQ,QAAQ,KAAK,IAAI,KAAKA,IAAM;GAAE,EAAS;GAAG;EAAQ;EACnF,IAAMI,IAAUpB,GACVqB,IAASf,EAAY,GACrBgB,IAAa,IAAI,gBAAgB;EAAG,IAAUA;EACpD,IAAIC,IAAS;EACb,IAAI;GAEF,IADA,MAAMC,EAAML,EAAK,CAACG,EAAW,MAAM,GAC/BF,MAAYpB,KAAYC,GAAU;GAEtC,IAASkB,MAAS,WAAWE,MAAWf,EAAY;EACtD,SAASmB,GAAO;GACd,IAAIL,MAAYpB,KAAYC,KAAYqB,EAAW,OAAO,SAAS;GACnE,IAAIG,aAAiBC,KAAYD,EAAM,WAAW,KAAK;IAAE,EAAM;IAAG;GAAQ;GAC1E,IAASN,MAAS;EACpB,UAAU;GAER,AADIpB,MAAYuB,MAAY,IAAU,OAClCF,MAAYpB,KAAY,CAACC,MAAgBsB,IAAQR,EAAM,IAAQE,EAAS;EAC9E;CACF;CACA,SAASA,IAAW;EAElB,IADAP,EAAW,GACPT,KAAYF,KAAW,CAACF,KAAW,CAACQ,EAAO,GAAG;EAClD,IAAMW,IAAMT,EAAS;EACrB,IAAIS,MAAQ,MAAM;EAClB,IAAI,KAAK,IAAI,KAAKA,GAAK;GACrB,IAAMW,IAAMrB,EAAY;GACxB,AAAIF,MAAoBuB,MAAO,IAAkBA,GAAKf,EAAM,SAAS;IAAE,EAAa,SAAS;GAAG,CAAC;GACjG;EACF;EACA,IAAMgB,IAAU,KAAK,MAAM/B,EAAQ,cAAc,EAAE;EACnD,AAAIA,EAAQ,cAAc,MAAQ,OAAO,SAAS+B,CAAO,KAAKA,IAAUZ,KAAO,CAACb,IAC9ES,EAAMgB,IAAU,KAAK,IAAI,SAAS;GAAE,EAAa,OAAO;EAAG,CAAC,IACzDhB,EAAMI,IAAM,KAAK,IAAI,GAAGC,CAAQ;CACvC;CACA,IAAMY,UAAe;EACnB,AAAKhC,KAAW,MAAY,MAAYQ,EAAO,MAC/C,IAAW,GAAG,IAAY,IAAO,IAAkB,IACnDK,EAAW,GAAGQ,EAAa,SAAS;CACtC,GACMY,UAAmB;EAAE,AAAI,OAAO,WAAa,OAAe,SAAS,oBAAoB,aAAWD,EAAO;CAAG,GAC9GE,UAAgBpB,EAAM;CAK5B,OAJA,WAAW,mBAAmB,UAAUkB,CAAM,GAC9C,WAAW,mBAAmB,WAAWE,CAAO,GAChD,WAAW,mBAAmB,SAASF,CAAM,GAC7C,WAAW,UAAU,iBAAiB,oBAAoBC,CAAU,GAC7D;EACL,OAAO,GAAwB;GAC7B,IAAMT,IAASf,EAAY;GAE3B,AAF8B,IAAU0B,GACpCX,MAAWf,EAAY,MAAK,IAAW,GAAG,IAAY,IAAO,IAAkB,KAC9E0B,IAAoBf,EAAS,IAAvBN,EAAM;EACnB;EACA;EACA;EACA,UAAU;GAKR,AAJA,IAAW,IAAMA,EAAM,GACvB,WAAW,sBAAsB,UAAUkB,CAAM,GACjD,WAAW,sBAAsB,WAAWE,CAAO,GACnD,WAAW,sBAAsB,SAASF,CAAM,GAChD,WAAW,UAAU,oBAAoB,oBAAoBC,CAAU;EACzE;CACF;AACF"}
|
|
@@ -2,4 +2,6 @@ import type { GoaClient } from '@fudanda/client';
|
|
|
2
2
|
export declare function isSessionTransitionPending(client: GoaClient): boolean;
|
|
3
3
|
/** Login and conflict resolution can replace the Cookie. Admit one request per shared client. */
|
|
4
4
|
export declare function admitSessionTransition<T>(client: GoaClient, action: () => Promise<T>): Promise<T>;
|
|
5
|
+
/** A timer never competes with another Cookie writer on the same client. */
|
|
6
|
+
export declare function admitSessionRenewal(client: GoaClient, action: () => Promise<void>): Promise<void>;
|
|
5
7
|
//# sourceMappingURL=session-transition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-transition.d.ts","sourceRoot":"","sources":["../src/session-transition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-transition.d.ts","sourceRoot":"","sources":["../src/session-transition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAmC;AAOzG,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOvG;AAED,4EAA4E;AAC5E,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvG"}
|
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
// src/session-transition.ts
|
|
2
|
-
var e = /* @__PURE__ */ new
|
|
2
|
+
var e = /* @__PURE__ */ new WeakMap();
|
|
3
3
|
function t(t) {
|
|
4
4
|
return e.has(t);
|
|
5
5
|
}
|
|
6
|
-
async function n(t, n) {
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
async function n(t, n, r) {
|
|
7
|
+
let i = () => {}, a = {
|
|
8
|
+
kind: n,
|
|
9
|
+
settled: new Promise((e) => {
|
|
10
|
+
i = e;
|
|
11
|
+
})
|
|
12
|
+
};
|
|
13
|
+
e.set(t, a);
|
|
9
14
|
try {
|
|
10
|
-
return await
|
|
15
|
+
return await r();
|
|
11
16
|
} finally {
|
|
12
|
-
e.delete(t);
|
|
17
|
+
e.get(t) === a && e.delete(t), i();
|
|
13
18
|
}
|
|
14
19
|
}
|
|
15
|
-
|
|
20
|
+
async function r(t, r) {
|
|
21
|
+
let i = e.get(t);
|
|
22
|
+
if (i?.kind === "renewal" && await i.settled, e.has(t)) throw new DOMException("A login request is already in progress", "AbortError");
|
|
23
|
+
return n(t, "transition", r);
|
|
24
|
+
}
|
|
25
|
+
async function i(t, r) {
|
|
26
|
+
if (!e.has(t)) return n(t, "renewal", r);
|
|
27
|
+
}
|
|
28
|
+
export { i as admitSessionRenewal, r as admitSessionTransition, t as isSessionTransitionPending };
|
|
16
29
|
|
|
17
30
|
//# sourceMappingURL=session-transition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-transition.js","names":["admissions","isSessionTransitionPending","client","
|
|
1
|
+
{"version":3,"file":"session-transition.js","names":["admissions","isSessionTransitionPending","client","admitted","settle","admission","resolve","action","admitSessionTransition","previous","admitSessionRenewal"],"sources":["../src/session-transition.ts"],"sourcesContent":["import type { GoaClient } from '@fudanda/client';\n\ninterface Admission { kind: 'transition' | 'renewal'; settled: Promise<void> }\nconst admissions = new WeakMap<GoaClient, Admission>();\nexport function isSessionTransitionPending(client: GoaClient): boolean { return admissions.has(client); }\nasync function admitted<T>(client: GoaClient, kind: Admission['kind'], action: () => Promise<T>): Promise<T> {\n let settle = () => {};\n const admission: Admission = { kind, settled: new Promise<void>(resolve => { settle = resolve; }) };\n admissions.set(client, admission);\n try { return await action(); } finally { if (admissions.get(client) === admission) admissions.delete(client); settle(); }\n}\n/** Login and conflict resolution can replace the Cookie. Admit one request per shared client. */\nexport async function admitSessionTransition<T>(client: GoaClient, action: () => Promise<T>): Promise<T> {\n // Owners cancel their renewal before entering. Wait for that Cookie writer to\n // settle before a login/logout can issue another Set-Cookie response.\n const previous = admissions.get(client);\n if (previous?.kind === 'renewal') await previous.settled;\n if (admissions.has(client)) throw new DOMException('A login request is already in progress', 'AbortError');\n return admitted(client, 'transition', action);\n}\n\n/** A timer never competes with another Cookie writer on the same client. */\nexport async function admitSessionRenewal(client: GoaClient, action: () => Promise<void>): Promise<void> {\n if (admissions.has(client)) return;\n return admitted(client, 'renewal', action);\n}\n"],"mappings":";AAGA,IAAMA,oBAAa,IAAI,QAA8B;AACrD,SAAgBC,EAA2B,GAA4B;CAAE,OAAOD,EAAW,IAAIE,CAAM;AAAG;AACxG,eAAeC,EAAY,GAAmB,GAAyB,GAAsC;CAC3G,IAAIC,UAAe,CAAC,GACdC,IAAuB;EAAE;EAAM,SAAS,IAAI,SAAc,MAAW;GAAE,IAASC;EAAS,CAAC;CAAE;CAClG,EAAW,IAAIJ,GAAQG,CAAS;CAChC,IAAI;EAAE,OAAO,MAAME,EAAO;CAAG,UAAU;EAAuE,AAAjEP,EAAW,IAAIE,CAAM,MAAMG,KAAWL,EAAW,OAAOE,CAAM,GAAGE,EAAO;CAAG;AAC1H;AAEA,eAAsBI,EAA0B,GAAmB,GAAsC;CAGvG,IAAMC,IAAWT,EAAW,IAAIE,CAAM;CAEtC,IADIO,GAAU,SAAS,aAAW,MAAMA,EAAS,SAC7CT,EAAW,IAAIE,CAAM,GAAG,MAAM,IAAI,aAAa,0CAA0C,YAAY;CACzG,OAAOC,EAASD,GAAQ,cAAcK,CAAM;AAC9C;AAGA,eAAsBG,EAAoB,GAAmB,GAA4C;CACvG,IAAI,GAAW,IAAIR,CAAM,GACzB,OAAOC,EAASD,GAAQ,WAAWK,CAAM;AAC3C"}
|
package/dist/core/session.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ export type GoSession = ApiIdentitySession;
|
|
|
5
5
|
export type User = ApiIdentitySession['user'];
|
|
6
6
|
export type LoginInput = GoaBodyOf<typeof authLogin>;
|
|
7
7
|
export type LoginResult = ApiLoginResult;
|
|
8
|
+
/** Opt in per operation so older strict SDKs keep receiving their original DTOs. */
|
|
9
|
+
export declare const sessionMetadataHeaders: {
|
|
10
|
+
readonly 'X-ArcBase-Session-Metadata': true;
|
|
11
|
+
};
|
|
8
12
|
export declare function requireSessionOutcome(result: LoginResult): GoSession;
|
|
9
13
|
export type SessionStatus = 'checking' | 'authenticated' | 'anonymous' | 'unavailable';
|
|
10
14
|
export interface SessionSnapshot {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAA6D,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAClK,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,kBAAkB,CAAC;AAC3C,MAAM,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,SAAS,CAAC,CAAC;AACrD,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC;AACzC,oFAAoF;AACpF,eAAO,MAAM,sBAAsB;aAAK,4BAA4B;CAAiB,CAAC;AACtF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAgM;AACrQ,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,aAAa,CAAC;AACvF,MAAM,WAAW,eAAe;IAAG,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE;AAC/H,MAAM,WAAW,cAAc;IAAG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE;AAC/N,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAAG,WAAW,IAAI,eAAe,CAAC;IAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAAE;AAC7I,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,cAAc,CAAC;AACnE,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,qBAAqB,GAAG;IAAE,OAAO,IAAI,IAAI,CAAA;CAAE,CA2ClG"}
|
package/dist/core/session.js
CHANGED
|
@@ -1,62 +1,81 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { admitSessionRenewal as e, admitSessionTransition as t, isSessionTransitionPending as n } from "./session-transition.js";
|
|
2
|
+
import { SESSION_RENEWAL_CHANNEL as r, createSessionRenewal as i } from "./session-renewal.js";
|
|
3
|
+
import { authLogin as a, authLogout as o, authMe as s, authRenew as c, authResolveSessionConflict as l } from "@fudanda/client/api/identity";
|
|
4
|
+
import { GoaError as u } from "@fudanda/client";
|
|
4
5
|
// src/session.ts
|
|
5
|
-
|
|
6
|
+
var d = { "X-ArcBase-Session-Metadata": !0 };
|
|
7
|
+
function f(e) {
|
|
6
8
|
if (e.outcome.type === "session") return e.outcome.value;
|
|
7
|
-
let t = new
|
|
9
|
+
let t = new u(409, "captcha_required", e.outcome.value.message);
|
|
8
10
|
throw t.details = e, t;
|
|
9
11
|
}
|
|
10
|
-
function
|
|
11
|
-
let
|
|
12
|
+
function p(p) {
|
|
13
|
+
let m = {
|
|
12
14
|
status: "checking",
|
|
13
15
|
session: null,
|
|
14
16
|
error: null,
|
|
15
17
|
refreshing: !1
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
for (let e of
|
|
19
|
-
},
|
|
20
|
-
|
|
18
|
+
}, h = /* @__PURE__ */ new Set(), g = /* @__PURE__ */ new Set(), _ = 0, v = !1, y = (e) => {
|
|
19
|
+
m = e;
|
|
20
|
+
for (let e of h) e();
|
|
21
|
+
}, b = (e) => {
|
|
22
|
+
p.setCSRFToken(e?.csrfToken ?? ""), y({
|
|
21
23
|
status: e ? "authenticated" : "anonymous",
|
|
22
24
|
session: e,
|
|
23
25
|
error: null,
|
|
24
26
|
refreshing: !1
|
|
25
|
-
});
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
}),
|
|
29
|
-
if (
|
|
30
|
-
let
|
|
31
|
-
|
|
27
|
+
}), C.update(e);
|
|
28
|
+
}, x = p.subscribeUnauthorized(() => {
|
|
29
|
+
_++, b(null);
|
|
30
|
+
}), S = async (e, t) => {
|
|
31
|
+
if (v) throw new DOMException("Session disposed", "AbortError");
|
|
32
|
+
let n = new AbortController();
|
|
33
|
+
g.add(n);
|
|
32
34
|
try {
|
|
33
|
-
return await e(t.signal);
|
|
35
|
+
return await e(t ? AbortSignal.any([n.signal, t]) : n.signal);
|
|
34
36
|
} finally {
|
|
35
|
-
|
|
37
|
+
g.delete(n);
|
|
36
38
|
}
|
|
39
|
+
}, C = i({
|
|
40
|
+
renew: (t) => e(p, async () => {
|
|
41
|
+
let e = ++_, n = await S((e) => p.call(c, void 0, { signal: e }), t);
|
|
42
|
+
e === _ && !t.aborted && !v && (b(n), w?.postMessage("renewed"));
|
|
43
|
+
}),
|
|
44
|
+
refresh: async (e) => {
|
|
45
|
+
if (n(p)) return;
|
|
46
|
+
let t = _, r = await S((e) => p.call(s, { headers: d }, { signal: e }), e);
|
|
47
|
+
t === _ && !e?.aborted && !v && b(r);
|
|
48
|
+
}
|
|
49
|
+
}), w = typeof BroadcastChannel < "u" ? new BroadcastChannel(r) : null;
|
|
50
|
+
w && (w.onmessage = (e) => {
|
|
51
|
+
e.data !== "renewed" || v || !m.session || typeof navigator < "u" && navigator.onLine === !1 || C.resume();
|
|
52
|
+
});
|
|
53
|
+
let T = () => {
|
|
54
|
+
n(p) || C.update(m.session);
|
|
37
55
|
};
|
|
38
56
|
return {
|
|
39
|
-
getSnapshot: () =>
|
|
40
|
-
subscribe: (e) => (
|
|
41
|
-
|
|
57
|
+
getSnapshot: () => m,
|
|
58
|
+
subscribe: (e) => (h.add(e), () => {
|
|
59
|
+
h.delete(e);
|
|
42
60
|
}),
|
|
43
61
|
async refresh() {
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
62
|
+
if (n(p)) return;
|
|
63
|
+
C.pause();
|
|
64
|
+
let e = ++_;
|
|
65
|
+
y({
|
|
66
|
+
...m,
|
|
48
67
|
refreshing: !0
|
|
49
68
|
});
|
|
50
69
|
try {
|
|
51
|
-
let t = await
|
|
52
|
-
e ===
|
|
70
|
+
let t = await S((e) => p.call(s, { headers: d }, { signal: e }));
|
|
71
|
+
e === _ && b(t);
|
|
53
72
|
} catch (t) {
|
|
54
|
-
if (e !==
|
|
55
|
-
if (t instanceof
|
|
56
|
-
|
|
73
|
+
if (e !== _) return;
|
|
74
|
+
if (t instanceof u && t.status === 401) {
|
|
75
|
+
b(null);
|
|
57
76
|
return;
|
|
58
77
|
}
|
|
59
|
-
|
|
78
|
+
p.clearSession(), y({
|
|
60
79
|
status: "unavailable",
|
|
61
80
|
session: null,
|
|
62
81
|
refreshing: !1,
|
|
@@ -64,46 +83,54 @@ function c(c) {
|
|
|
64
83
|
});
|
|
65
84
|
}
|
|
66
85
|
},
|
|
67
|
-
async login(
|
|
68
|
-
return
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
86
|
+
async login(e) {
|
|
87
|
+
return C.pause(), t(p, async () => {
|
|
88
|
+
let t = ++_, n = await S((t) => p.call(a, {
|
|
89
|
+
headers: d,
|
|
90
|
+
body: e
|
|
91
|
+
}, { signal: t }));
|
|
92
|
+
if (t !== _) throw new DOMException("Session changed", "AbortError");
|
|
93
|
+
return n.outcome.type === "session" && b(n.outcome.value), n;
|
|
94
|
+
}).finally(T);
|
|
73
95
|
},
|
|
74
|
-
async resolveSessionConflict(
|
|
75
|
-
return
|
|
76
|
-
let
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
96
|
+
async resolveSessionConflict(e) {
|
|
97
|
+
return C.pause(), t(p, async () => {
|
|
98
|
+
let t = ++_, n = await S((t) => p.call(l, {
|
|
99
|
+
headers: d,
|
|
100
|
+
body: { ticket: e }
|
|
101
|
+
}, { signal: t }));
|
|
102
|
+
if (t !== _) throw new DOMException("Session changed", "AbortError");
|
|
103
|
+
let r = f(n);
|
|
104
|
+
return b(r), r;
|
|
105
|
+
}).finally(T);
|
|
81
106
|
},
|
|
82
107
|
async logout() {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
108
|
+
return C.pause(), t(p, async () => {
|
|
109
|
+
let e = ++_;
|
|
110
|
+
try {
|
|
111
|
+
await S((e) => p.call(o, void 0, { signal: e }));
|
|
112
|
+
} catch (e) {
|
|
113
|
+
if (!(e instanceof u) || e.status !== 401) throw e;
|
|
114
|
+
}
|
|
115
|
+
e === _ && b(null);
|
|
116
|
+
}).finally(T);
|
|
90
117
|
},
|
|
91
118
|
updateUser(e) {
|
|
92
|
-
|
|
93
|
-
...
|
|
119
|
+
m.session && y({
|
|
120
|
+
...m,
|
|
94
121
|
session: {
|
|
95
|
-
...
|
|
122
|
+
...m.session,
|
|
96
123
|
user: e
|
|
97
124
|
}
|
|
98
125
|
});
|
|
99
126
|
},
|
|
100
127
|
dispose() {
|
|
101
|
-
|
|
102
|
-
for (let e of
|
|
103
|
-
|
|
128
|
+
v = !0, _++, C.dispose(), w?.close();
|
|
129
|
+
for (let e of g) e.abort();
|
|
130
|
+
g.clear(), x(), h.clear();
|
|
104
131
|
}
|
|
105
132
|
};
|
|
106
133
|
}
|
|
107
|
-
export {
|
|
134
|
+
export { p as createCookieSession, f as requireSessionOutcome, d as sessionMetadataHeaders };
|
|
108
135
|
|
|
109
136
|
//# sourceMappingURL=session.js.map
|
package/dist/core/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","mappings":"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","names":["requireSessionOutcome","result","error","GoaError","createCookieSession","snapshot","listeners","requests","revision","disposed","publish","next","listener","accept","client","session","invalidated","run","controller","fn","isSessionTransitionPending","current","value","authMe","admitSessionTransition","authLogin","input","authResolveSessionConflict","authLogout"],"ignoreList":[],"sources":["../src/session.ts"],"sourcesContent":["import { admitSessionTransition, isSessionTransitionPending } from './session-transition';\nimport { GoaError, type GoaClient } from '@fudanda/client';\nimport { authLogin, authMe, authLogout, authResolveSessionConflict, type ApiIdentitySession, type ApiLoginResult } from '@fudanda/shared/api/identity';\nimport type { GoaBodyOf } from '@fudanda/shared/core';\nexport type GoSession = ApiIdentitySession;\nexport type User = ApiIdentitySession['user'];\nexport type LoginInput = GoaBodyOf<typeof authLogin>;\nexport type LoginResult = ApiLoginResult;\nexport function requireSessionOutcome(result: LoginResult): GoSession { if (result.outcome.type === 'session') return result.outcome.value; const error = new GoaError(409, 'captcha_required', result.outcome.value.message); error.details = result; throw error; }\nexport type SessionStatus = 'checking' | 'authenticated' | 'anonymous' | 'unavailable';\nexport interface SessionSnapshot { status: SessionStatus; session: GoSession | null; error: Error | null; refreshing: boolean }\nexport interface SessionActions { login(input: LoginInput): Promise<LoginResult>; resolveSessionConflict(ticket: string): Promise<GoSession>; logout(): Promise<void>; refresh(): Promise<void>; updateUser(user: User): void }\nexport interface ArcBaseSessionAdapter extends SessionActions { getSnapshot(): SessionSnapshot; subscribe(listener: () => void): () => void }\nexport type ArcBaseSessionValue = SessionSnapshot & SessionActions;\n/** Cookie session with revision fencing; host-owned sessions are never revoked on unmount. */\nexport function createCookieSession(client: GoaClient): ArcBaseSessionAdapter & { dispose(): void } {\n let snapshot: SessionSnapshot = { status: 'checking', session: null, error: null, refreshing: false };\n const listeners = new Set<() => void>(); const requests = new Set<AbortController>(); let revision = 0; let disposed = false;\n const publish = (next: SessionSnapshot) => { snapshot = next; for (const listener of listeners) listener(); };\n const accept = (session: GoSession | null) => { client.setCSRFToken(session?.csrfToken ?? ''); publish({ status: session ? 'authenticated' : 'anonymous', session, error: null, refreshing: false }); };\n const invalidated = client.subscribeUnauthorized(() => { revision++; accept(null); });\n const run = async <T,>(fn: (signal: AbortSignal) => Promise<T>): Promise<T> => { if (disposed) throw new DOMException('Session disposed', 'AbortError'); const controller = new AbortController(); requests.add(controller); try { return await fn(controller.signal); } finally { requests.delete(controller); } };\n return {\n getSnapshot: () => snapshot,\n subscribe: listener => { listeners.add(listener); return () => { listeners.delete(listener); }; },\n async refresh() {\n if (isSessionTransitionPending(client)) return;\n const current = ++revision; publish({ ...snapshot, refreshing: true });\n try { const value = await run(signal => client.call(authMe, undefined, { signal })); if (current === revision) accept(value); }\n catch (error) { if (current !== revision) return; if (error instanceof GoaError && error.status === 401) { accept(null); return; } client.clearSession(); publish({ status: 'unavailable', session: null, refreshing: false, error: error instanceof Error ? error : new Error(String(error)) }); }\n },\n async login(input) { return admitSessionTransition(client, async () => { const current = ++revision; const result = await run(signal => client.call(authLogin, { body: input }, { signal })); if (current !== revision) throw new DOMException('Session changed', 'AbortError'); if (result.outcome.type === 'session') accept(result.outcome.value); return result; }); },\n async resolveSessionConflict(ticket) { return admitSessionTransition(client, async () => { const current = ++revision; const result = await run(signal => client.call(authResolveSessionConflict, { body: { ticket } }, { signal })); if (current !== revision) throw new DOMException('Session changed', 'AbortError'); const session = requireSessionOutcome(result); accept(session); return session; }); },\n async logout() { const current = ++revision; try { await run(signal => client.call(authLogout, undefined, { signal })); } catch (error) { if (!(error instanceof GoaError) || error.status !== 401) throw error; } if (current === revision) accept(null); },\n updateUser(user) { if (snapshot.session) publish({ ...snapshot, session: { ...snapshot.session, user } }); },\n dispose() { disposed = true; revision++; for (const controller of requests) controller.abort(); requests.clear(); invalidated(); listeners.clear(); },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session.js","mappings":";;;;;AAUA,IAAaA,IAAyB,EAAE,8BAA8B,GAAK;AAC3E,SAAgBC,EAAsB,GAAgC;CAAE,IAAIC,EAAO,QAAQ,SAAS,WAAW,OAAOA,EAAO,QAAQ;CAAO,IAAMC,IAAQ,IAAIC,EAAS,KAAK,oBAAoBF,EAAO,QAAQ,MAAM,OAAO;CAA2B,MAAxB,EAAM,UAAUA,GAAcC;AAAO;AAOpQ,SAAgBE,EAAoB,GAAgE;CAClG,IAAIC,IAA4B;EAAE,QAAQ;EAAY,SAAS;EAAM,OAAO;EAAM,YAAY;CAAM,GAC9FC,oBAAY,IAAI,IAAgB,GAASC,oBAAW,IAAI,IAAqB,GAAOC,IAAW,GAAOC,IAAW,IACjHC,KAAW,MAA0B;EAAE,IAAWC;EAAM,KAAK,IAAMC,KAAYN,GAAW,EAAS;CAAG,GACtGO,KAAU,MAA8B;EAAwJ,CAAtJC,CAAO,aAAaC,GAAS,aAAa,EAAE,GAAGL,EAAQ;GAAE,QAAQK,IAAU,kBAAkB;GAAa;GAAS,OAAO;GAAM,YAAY;EAAM,CAAC,GAAGC,EAAQ,OAAOD,CAAO;CAAG,GACzNE,IAAcH,EAAO,4BAA4B;EAAc,CAAZ,IAAYD,EAAO,IAAI;CAAG,CAAC,GAC9EK,IAAM,OAAW,GAAyC,MAAqC;EAAE,IAAIT,GAAU,MAAM,IAAI,aAAa,oBAAoB,YAAY;EAAG,IAAMU,IAAa,IAAI,gBAAgB;EAAG,EAAS,IAAIA,CAAU;EAAG,IAAI;GAAE,OAAO,MAAMC,EAAGC,IAAS,YAAY,IAAI,CAACF,EAAW,QAAQE,CAAM,CAAC,IAAIF,EAAW,MAAM;EAAG,UAAU;GAAE,EAAS,OAAOA,CAAU;EAAG;CAAE,GAO1XH,IAAUM,EAAqB;EACnC,QAAO,MAAUC,EAAoBT,GAAQ,YAAY;GACvD,IAAMU,IAAU,EAAEhB,GACZiB,IAAQ,MAAMP,GAAI,MAAUJ,EAAO,KAAKY,GAAW,QAAW,EAAE,QAAQC,EAAO,CAAC,GAAGC,CAAM;GAC/F,CAAIJ,KAAYhB,KAAY,CAACoB,EAAO,WAAW,CAACnB,MAAYI,EAAOY,CAAK,GAAGI,GAAS,YAAY,SAAS;EAC3G,CAAC;EACD,SAAS,OAZY,MAAyB;GAC9C,IAAIC,EAA2BhB,CAAM,GAAG;GACxC,IAAMU,IAAUhB,GACViB,IAAQ,MAAMP,GAAI,MAAUJ,EAAO,KAAKiB,GAAQ,EAAE,SAAShC,EAAuB,GAAG,EAAE,QAAQ4B,EAAO,CAAC,GAAGC,CAAM;GACtH,CAAIJ,KAAYhB,KAAY,CAACoB,GAAQ,WAAW,CAACnB,KAAUI,EAAOY,CAAK;EACzE;CAQA,CAAC,GACKI,IAAU,OAAO,mBAAqB,MAAc,IAAI,iBAAiBG,CAAuB,IAAI;CAC1G,CAAIH,KAAS,EAAQ,aAAY,MAAS;EACxC,CAAII,CAAM,SAAS,aAAaxB,KAAY,CAACJ,EAAS,WAAY,OAAO,YAAc,OAAe,UAAU,WAAW,MAC3HW,EAAQ,OAAO;CACjB;CACA,IAAMkB,UAA8B;EAAE,CAAKJ,CAA2BhB,CAAM,KAAGE,EAAQ,OAAOX,EAAS,OAAO;CAAG;CACjH,OAAO;EACL,mBAAmBA;EACnB,YAAW,OAAcC,EAAU,IAAIM,CAAQ,SAAgB;GAAE,EAAU,OAAOA,CAAQ;EAAG;EAC7F,MAAM,UAAU;GACd,IAAIkB,EAA2BhB,CAAM,GAAG;GACxC,EAAQ,MAAM;GACd,IAAMU,IAAU,EAAEhB;GAAU,EAAQ;IAAE,GAAGH;IAAU,YAAY;GAAK,CAAC;GACrE,IAAI;IAAE,IAAMoB,IAAQ,MAAMP,GAAI,MAAUJ,EAAO,KAAKiB,GAAQ,EAAE,SAAShC,EAAuB,GAAG,EAAE,UAAO,CAAC,CAAC;IAAG,CAAIyB,KAAYhB,KAAUK,EAAOY,CAAK;GAAG,SACjJvB,GAAO;IAAE,IAAIsB,MAAYhB,GAAU;IAAQ,IAAIN,aAAiBC,KAAYD,EAAM,WAAW,KAAK;KAAE,EAAO,IAAI;KAAG;IAAQ;IAAyB,CAAvBY,CAAO,aAAa,GAAGJ,EAAQ;KAAE,QAAQ;KAAe,SAAS;KAAM,YAAY;KAAO,OAAOR,aAAiB,QAAQA,IAAY,MAAM,OAAOA,CAAK,CAAC;IAAE,CAAC;GAAG;EACpS;EACA,MAAM,MAAM,GAAO;GAAmB,OAAjBc,EAAQ,MAAM,GAAUmB,EAAuBrB,GAAQ,YAAY;IAAE,IAAMU,IAAU,EAAEhB,GAAgBP,IAAS,MAAMiB,GAAI,MAAUJ,EAAO,KAAKsB,GAAW;KAAE,SAASrC;KAAwB,MAAMsC;IAAM,GAAG,EAAE,UAAO,CAAC,CAAC;IAAG,IAAIb,MAAYhB,GAAU,MAAM,IAAI,aAAa,mBAAmB,YAAY;IAAwE,OAAjEP,EAAO,QAAQ,SAAS,aAAWY,EAAOZ,EAAO,QAAQ,KAAK,GAAUA;GAAQ,CAAC,CAAC,CAAC,QAAQiC,CAAqB;EAAG;EAC1b,MAAM,uBAAuB,GAAQ;GAAmB,OAAjBlB,EAAQ,MAAM,GAAUmB,EAAuBrB,GAAQ,YAAY;IAAE,IAAMU,IAAU,EAAEhB,GAAgBP,IAAS,MAAMiB,GAAI,MAAUJ,EAAO,KAAKwB,GAA4B;KAAE,SAASvC;KAAwB,MAAM,EAAE,UAAO;IAAE,GAAG,EAAE,UAAO,CAAC,CAAC;IAAG,IAAIyB,MAAYhB,GAAU,MAAM,IAAI,aAAa,mBAAmB,YAAY;IAAG,IAAMO,IAAUf,EAAsBC,CAAM;IAAoB,OAAjBY,EAAOE,CAAO,GAAUA;GAAS,CAAC,CAAC,CAAC,QAAQmB,CAAqB;EAAG;EAC9d,MAAM,SAAS;GAAmB,OAAjBlB,EAAQ,MAAM,GAAUmB,EAAuBrB,GAAQ,YAAY;IAAE,IAAMU,IAAU,EAAEhB;IAAU,IAAI;KAAE,MAAMU,GAAI,MAAUJ,EAAO,KAAKyB,GAAY,QAAW,EAAE,UAAO,CAAC,CAAC;IAAG,SAASrC,GAAO;KAAE,IAAI,EAAEA,aAAiBC,MAAaD,EAAM,WAAW,KAAK,MAAMA;IAAO;IAAE,CAAIsB,KAAYhB,KAAUK,EAAO,IAAI;GAAG,CAAC,CAAC,CAAC,QAAQqB,CAAqB;EAAG;EACnW,WAAW,GAAM;GAAE,CAAI7B,CAAS,WAASK,EAAQ;IAAE,GAAGL;IAAU,SAAS;KAAE,GAAGA,EAAS;KAAS;IAAK;GAAE,CAAC;EAAG;EAC3G,UAAU;GAAkD,CAAhD,GAAW,IAAM,KAAYW,EAAQ,QAAQ,GAAGa,GAAS,MAAM;GAAG,KAAK,IAAMV,KAAcZ,GAAU,EAAW,MAAM;GAAoC,CAAjCA,CAAS,MAAM,GAAGU,EAAY,GAAGX,EAAU,MAAM;EAAG;CAC3L;AACF","names":["sessionMetadataHeaders","requireSessionOutcome","result","error","GoaError","createCookieSession","snapshot","listeners","requests","revision","disposed","publish","next","listener","accept","client","session","renewal","invalidated","run","controller","fn","parent","createSessionRenewal","admitSessionRenewal","current","value","authRenew","active","signal","channel","isSessionTransitionPending","authMe","SESSION_RENEWAL_CHANNEL","event","resumeAfterTransition","admitSessionTransition","authLogin","input","authResolveSessionConflict","authLogout"],"ignoreList":[],"sources":["../src/session.ts"],"sourcesContent":["import { admitSessionRenewal, admitSessionTransition, isSessionTransitionPending } from './session-transition';\nimport { GoaError, type GoaClient } from '@fudanda/client';\nimport { authLogin, authMe, authLogout, authRenew, authResolveSessionConflict, type ApiIdentitySession, type ApiLoginResult } from '@fudanda/shared/api/identity';\nimport type { GoaBodyOf } from '@fudanda/shared/core';\nimport { createSessionRenewal, SESSION_RENEWAL_CHANNEL } from './session-renewal';\nexport type GoSession = ApiIdentitySession;\nexport type User = ApiIdentitySession['user'];\nexport type LoginInput = GoaBodyOf<typeof authLogin>;\nexport type LoginResult = ApiLoginResult;\n/** Opt in per operation so older strict SDKs keep receiving their original DTOs. */\nexport const sessionMetadataHeaders = { 'X-ArcBase-Session-Metadata': true } as const;\nexport function requireSessionOutcome(result: LoginResult): GoSession { if (result.outcome.type === 'session') return result.outcome.value; const error = new GoaError(409, 'captcha_required', result.outcome.value.message); error.details = result; throw error; }\nexport type SessionStatus = 'checking' | 'authenticated' | 'anonymous' | 'unavailable';\nexport interface SessionSnapshot { status: SessionStatus; session: GoSession | null; error: Error | null; refreshing: boolean }\nexport interface SessionActions { login(input: LoginInput): Promise<LoginResult>; resolveSessionConflict(ticket: string): Promise<GoSession>; logout(): Promise<void>; refresh(): Promise<void>; updateUser(user: User): void }\nexport interface ArcBaseSessionAdapter extends SessionActions { getSnapshot(): SessionSnapshot; subscribe(listener: () => void): () => void }\nexport type ArcBaseSessionValue = SessionSnapshot & SessionActions;\n/** Cookie session with revision fencing; host-owned sessions are never revoked on unmount. */\nexport function createCookieSession(client: GoaClient): ArcBaseSessionAdapter & { dispose(): void } {\n let snapshot: SessionSnapshot = { status: 'checking', session: null, error: null, refreshing: false };\n const listeners = new Set<() => void>(); const requests = new Set<AbortController>(); let revision = 0; let disposed = false;\n const publish = (next: SessionSnapshot) => { snapshot = next; for (const listener of listeners) listener(); };\n const accept = (session: GoSession | null) => { client.setCSRFToken(session?.csrfToken ?? ''); publish({ status: session ? 'authenticated' : 'anonymous', session, error: null, refreshing: false }); renewal.update(session); };\n const invalidated = client.subscribeUnauthorized(() => { revision++; accept(null); });\n const run = async <T,>(fn: (signal: AbortSignal) => Promise<T>, parent?: AbortSignal): Promise<T> => { if (disposed) throw new DOMException('Session disposed', 'AbortError'); const controller = new AbortController(); requests.add(controller); try { return await fn(parent ? AbortSignal.any([controller.signal, parent]) : controller.signal); } finally { requests.delete(controller); } };\n const restore = async (signal?: AbortSignal) => {\n if (isSessionTransitionPending(client)) return;\n const current = revision;\n const value = await run(active => client.call(authMe, { headers: sessionMetadataHeaders }, { signal: active }), signal);\n if (current === revision && !signal?.aborted && !disposed) accept(value);\n };\n const renewal = createSessionRenewal({\n renew: signal => admitSessionRenewal(client, async () => {\n const current = ++revision;\n const value = await run(active => client.call(authRenew, undefined, { signal: active }), signal);\n if (current === revision && !signal.aborted && !disposed) { accept(value); channel?.postMessage('renewed'); }\n }),\n refresh: restore,\n });\n const channel = typeof BroadcastChannel !== 'undefined' ? new BroadcastChannel(SESSION_RENEWAL_CHANNEL) : null;\n if (channel) channel.onmessage = event => {\n if (event.data !== 'renewed' || disposed || !snapshot.session || (typeof navigator !== 'undefined' && navigator.onLine === false)) return;\n renewal.resume();\n };\n const resumeAfterTransition = () => { if (!isSessionTransitionPending(client)) renewal.update(snapshot.session); };\n return {\n getSnapshot: () => snapshot,\n subscribe: listener => { listeners.add(listener); return () => { listeners.delete(listener); }; },\n async refresh() {\n if (isSessionTransitionPending(client)) return;\n renewal.pause();\n const current = ++revision; publish({ ...snapshot, refreshing: true });\n try { const value = await run(signal => client.call(authMe, { headers: sessionMetadataHeaders }, { signal })); if (current === revision) accept(value); }\n catch (error) { if (current !== revision) return; if (error instanceof GoaError && error.status === 401) { accept(null); return; } client.clearSession(); publish({ status: 'unavailable', session: null, refreshing: false, error: error instanceof Error ? error : new Error(String(error)) }); }\n },\n async login(input) { renewal.pause(); return admitSessionTransition(client, async () => { const current = ++revision; const result = await run(signal => client.call(authLogin, { headers: sessionMetadataHeaders, body: input }, { signal })); if (current !== revision) throw new DOMException('Session changed', 'AbortError'); if (result.outcome.type === 'session') accept(result.outcome.value); return result; }).finally(resumeAfterTransition); },\n async resolveSessionConflict(ticket) { renewal.pause(); return admitSessionTransition(client, async () => { const current = ++revision; const result = await run(signal => client.call(authResolveSessionConflict, { headers: sessionMetadataHeaders, body: { ticket } }, { signal })); if (current !== revision) throw new DOMException('Session changed', 'AbortError'); const session = requireSessionOutcome(result); accept(session); return session; }).finally(resumeAfterTransition); },\n async logout() { renewal.pause(); return admitSessionTransition(client, async () => { const current = ++revision; try { await run(signal => client.call(authLogout, undefined, { signal })); } catch (error) { if (!(error instanceof GoaError) || error.status !== 401) throw error; } if (current === revision) accept(null); }).finally(resumeAfterTransition); },\n updateUser(user) { if (snapshot.session) publish({ ...snapshot, session: { ...snapshot.session, user } }); },\n dispose() { disposed = true; revision++; renewal.dispose(); channel?.close(); for (const controller of requests) controller.abort(); requests.clear(); invalidated(); listeners.clear(); },\n };\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e,r as t}from"./chunks/updates-BzsxLSMm.js";import{n,r,t as i}from"./src-
|
|
1
|
+
import{i as e,r as t}from"./chunks/updates-BzsxLSMm.js";import{n,r,t as i}from"./src-D6UlLiVN.js";r();export{i as ArcBaseAdmin,n as BasicTable,t as markSafeUpdateFormSaved,e as useSafeUpdateGuard};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import{n as e}from"./chunks/rolldown-runtime-Bruge11p.js";import{n as t}from"./chunks/updates-BzsxLSMm.js";import{n,t as r}from"./chunks/preload-helper-mKj9XlrD.js";import{Component as i,Suspense as a,createContext as o,lazy as s,useContext as c}from"react";import{reportAdminError as l}from"@fudanda/admin-antd/core/admin/runtime";import{Fragment as u,jsx as d,jsxs as f}from"react/jsx-runtime";import{readCachedPreferences as p}from"@fudanda/admin-antd/core/lib/preference-cache";import{defaultPreferences as m,isLoadingStyle as h,useOptionalPreferences as g}from"@fudanda/admin-antd/core/hooks/usePreferences";import{BasicTable as _}from"@fudanda/admin-antd/table";function v(){return(v=e((()=>{})))()}function y(){return c(b)}var b;function x(){return(x=e((()=>{b=o(void 0)})))()}function S({value:e,children:t}){return/* @__PURE__ */ d(b.Provider,{value:e,children:t})}function C(){return(C=e((()=>{x()})))()}function w(){return p().loadingStyle}function T({variant:e}){return/* @__PURE__ */ f(`span`,{className:`page-loading-indicator page-loading-indicator--${e}`,"data-loading-style":e,"aria-hidden":`true`,children:[e===`dots`&&/* @__PURE__ */ f(u,{children:[/* @__PURE__ */ d(`span`,{className:`page-loading__dot`}),/* @__PURE__ */ d(`span`,{className:`page-loading__dot`}),/* @__PURE__ */ d(`span`,{className:`page-loading__dot`})]}),e===`ring`&&/* @__PURE__ */ d(`span`,{className:`page-loading__ring`}),e===`flip`&&/* @__PURE__ */ d(`span`,{className:`page-loading__flip`}),e===`bars`&&/* @__PURE__ */ f(u,{children:[/* @__PURE__ */ d(`span`,{className:`page-loading__bar`}),/* @__PURE__ */ d(`span`,{className:`page-loading__bar`}),/* @__PURE__ */ d(`span`,{className:`page-loading__bar`}),/* @__PURE__ */ d(`span`,{className:`page-loading__bar`})]}),e===`spinner`&&/* @__PURE__ */ d(`span`,{className:`page-loading__spinner`,children:Array.from({length:8},(e,t)=>/* @__PURE__ */ d(`i`,{},t))}),e===`bounce`&&/* @__PURE__ */ f(u,{children:[/* @__PURE__ */ d(`span`,{className:`page-loading__bounce-dot`}),/* @__PURE__ */ d(`span`,{className:`page-loading__bounce-dot`})]}),e===`ripple`&&/* @__PURE__ */ f(`span`,{className:`page-loading__ripple`,children:[/* @__PURE__ */ d(`i`,{}),/* @__PURE__ */ d(`i`,{})]}),e===`progress`&&/* @__PURE__ */ d(`span`,{className:`page-loading__track`,children:/* @__PURE__ */ d(`i`,{className:`page-loading__thumb`})}),e===`orbit`&&/* @__PURE__ */ f(`span`,{className:`page-loading__orbit`,children:[/* @__PURE__ */ d(`i`,{}),/* @__PURE__ */ d(`i`,{})]}),e===`grid`&&/* @__PURE__ */ d(`span`,{className:`page-loading__grid`,children:Array.from({length:9},(e,t)=>/* @__PURE__ */ d(`i`,{},t))}),e===`travel`&&/* @__PURE__ */ d(`span`,{className:`page-loading__travel`}),e===`ellipsis`&&/* @__PURE__ */ f(u,{children:[/* @__PURE__ */ d(`span`,{className:`page-loading__ellipsis-dot`}),/* @__PURE__ */ d(`span`,{className:`page-loading__ellipsis-dot`}),/* @__PURE__ */ d(`span`,{className:`page-loading__ellipsis-dot`})]}),e===`carousel`&&/* @__PURE__ */ f(`span`,{className:`page-loading__carousel`,children:[/* @__PURE__ */ d(`i`,{className:`page-loading__carousel-slot`}),/* @__PURE__ */ d(`i`,{className:`page-loading__carousel-slot`}),/* @__PURE__ */ d(`i`,{className:`page-loading__carousel-slot`}),/* @__PURE__ */ d(`i`,{className:`page-loading__carousel-bead`})]}),e===`landing`&&/* @__PURE__ */ f(`span`,{className:`page-loading__landing`,children:[/* @__PURE__ */ d(`i`,{className:`page-loading__landing-ball`}),/* @__PURE__ */ d(`i`,{className:`page-loading__landing-shadow`})]}),e===`pendulum`&&/* @__PURE__ */ f(`span`,{className:`page-loading__pendulum`,children:[/* @__PURE__ */ d(`i`,{className:`page-loading__pendulum-pivot`}),/* @__PURE__ */ d(`span`,{className:`page-loading__pendulum-arm`,children:/* @__PURE__ */ d(`i`,{className:`page-loading__pendulum-bob`})})]}),e===`marquee`&&/* @__PURE__ */ d(`span`,{className:`page-loading__marquee`,children:/* @__PURE__ */ d(`i`,{className:`page-loading__marquee-track`})})]})}function E({inline:e=!1,variant:t,label:n=`页面加载中`}){let r=g(),i=t??r?.preferences.loadingStyle??w(),a=h(i)?i:m.loadingStyle;return/* @__PURE__ */ d(`div`,{className:`page-loading${e?` page-loading--inline`:``}`,"data-loading-style":a,role:`status`,"aria-label":n,children:/* @__PURE__ */ d(T,{variant:a})})}function D(){return(D=e((()=>{})))()}function O({preview:e,...t}){return/* @__PURE__ */ d(S,{value:e,children:/* @__PURE__ */ d(A,{fallback:t.errorFallback,telemetry:t.telemetry,children:/* @__PURE__ */ d(a,{fallback:t.loading??/* @__PURE__ */ d(E,{}),children:/* @__PURE__ */ d(k,{...t,assetBasePath:t.assetBasePath??new URL(
|
|
2
2
|
/* @vite-ignore */
|
|
3
|
-
`./public/`,import.meta.url).href})})})})}var k,A;function j(){return(j=e((()=>{C(),t(),D(),n(),k=s(()=>r(()=>import(`./chunks/ArcBaseAdmin
|
|
4
|
-
//# sourceMappingURL=src-
|
|
3
|
+
`./public/`,import.meta.url).href})})})})}var k,A;function j(){return(j=e((()=>{C(),t(),D(),n(),k=s(()=>r(()=>import(`./chunks/ArcBaseAdmin-CX7fQz4x.js`).then(e=>(e.n(),e.t)).then(e=>({default:e.ArcBaseAdmin})),[],import.meta.url)),A=class extends i{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){l(this.props.telemetry,e,t)}render(){return this.state.error?this.props.fallback?.(this.state.error)??/* @__PURE__ */ d(`div`,{role:`alert`,children:this.state.error.message}):this.props.children}}})))()}export{E as a,y as c,T as i,v as l,_ as n,D as o,j as r,x as s,O as t};
|
|
4
|
+
//# sourceMappingURL=src-D6UlLiVN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src-C8_bzBi4.js","mappings":"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","names":["usePreviewOptions","useContext","PreviewContext","createContext","PreviewProvider","readCachedLoadingStyle","readCachedPreferences","LoadingIndicator","variant","_Fragment","index","PageLoading","preferencesContext","useOptionalPreferences","preferredStyle","resolvedStyle","isLoadingStyle","defaultPreferences","inline","label","ArcBaseAdmin","props","preview","LoadingBoundary","Suspense","Admin","lazy","__vitePreload","n","module","Component","reportAdminError","error","info"],"ignoreList":[],"sources":["../src/preview-context.ts","../src/preview.tsx","../src/components/PageLoading.tsx","../src/index.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { ViewerOptions } from '@file-viewer/react';\nimport type { FileRenderHandler, FileViewerRendererPluginInput } from '@file-viewer/core';\n\nexport interface ArcBasePreviewOptions {\n /** Host-installed legacy PPT renderer and its self-hosted engine resources. */\n legacyPpt?: { renderers: FileViewerRendererPluginInput<FileRenderHandler<unknown, HTMLDivElement>>; presentation?: ViewerOptions['presentation'] };\n}\nexport const PreviewContext = createContext<ArcBasePreviewOptions | undefined>(undefined);\nexport function usePreviewOptions() { return useContext(PreviewContext); }\n","import type { ReactNode } from 'react';\nimport { PreviewContext, type ArcBasePreviewOptions } from './preview-context';\nexport type { ArcBasePreviewOptions } from './preview-context';\nexport function PreviewProvider({ value, children }: { value?: ArcBasePreviewOptions; children: ReactNode }) {\n return <PreviewContext.Provider value={value}>{children}</PreviewContext.Provider>;\n}\n","import { readCachedPreferences } from \"@fudanda/react-core/lib/preference-cache\";\nimport { defaultPreferences, isLoadingStyle, useOptionalPreferences } from \"@fudanda/react-core/hooks/usePreferences\";\nimport type { LoadingStyle } from \"@fudanda/react-core/hooks/usePreferences\";\nfunction readCachedLoadingStyle(): LoadingStyle {\n return readCachedPreferences().loadingStyle;\n}\nexport function LoadingIndicator({ variant }: Readonly<{\n variant: LoadingStyle;\n}>) {\n return (<span className={`page-loading-indicator page-loading-indicator--${variant}`} data-loading-style={variant} aria-hidden=\"true\">\n {variant === 'dots' && (<>\n <span className=\"page-loading__dot\"/>\n <span className=\"page-loading__dot\"/>\n <span className=\"page-loading__dot\"/>\n </>)}\n {variant === 'ring' && <span className=\"page-loading__ring\"/>}\n {variant === 'flip' && <span className=\"page-loading__flip\"/>}\n {variant === 'bars' && (<>\n <span className=\"page-loading__bar\"/>\n <span className=\"page-loading__bar\"/>\n <span className=\"page-loading__bar\"/>\n <span className=\"page-loading__bar\"/>\n </>)}\n {variant === 'spinner' && (<span className=\"page-loading__spinner\">\n {Array.from({ length: 8 }, (_, index) => <i key={index}/>)}\n </span>)}\n {variant === 'bounce' && (<>\n <span className=\"page-loading__bounce-dot\"/>\n <span className=\"page-loading__bounce-dot\"/>\n </>)}\n {variant === 'ripple' && (<span className=\"page-loading__ripple\">\n <i />\n <i />\n </span>)}\n {variant === 'progress' && (<span className=\"page-loading__track\">\n <i className=\"page-loading__thumb\"/>\n </span>)}\n {variant === 'orbit' && (\n // 两颗圆点固定在旋转容器的上下极:容器自转即两点绕圈,圆点自身无需再动\n <span className=\"page-loading__orbit\">\n <i />\n <i />\n </span>)}\n {variant === 'grid' && (<span className=\"page-loading__grid\">\n {Array.from({ length: 9 }, (_, index) => <i key={index}/>)}\n </span>)}\n {variant === 'travel' && <span className=\"page-loading__travel\"/>}\n {variant === 'ellipsis' && (<>\n <span className=\"page-loading__ellipsis-dot\"/>\n <span className=\"page-loading__ellipsis-dot\"/>\n <span className=\"page-loading__ellipsis-dot\"/>\n </>)}\n {variant === 'carousel' && (\n // 三个静态槽位 + 一颗游走的光点:单程从左到右,在首尾不可见时重置,故看不到回弹\n <span className=\"page-loading__carousel\">\n <i className=\"page-loading__carousel-slot\"/>\n <i className=\"page-loading__carousel-slot\"/>\n <i className=\"page-loading__carousel-slot\"/>\n <i className=\"page-loading__carousel-bead\"/>\n </span>)}\n {variant === 'landing' && (\n // 地面参照(影子)与球分开:球靠 transform-origin 落在底部做压扁,影子随高度缩放\n <span className=\"page-loading__landing\">\n <i className=\"page-loading__landing-ball\"/>\n <i className=\"page-loading__landing-shadow\"/>\n </span>)}\n {variant === 'pendulum' && (\n // 摆锤是摆杆的子元素:刚性由结构保证。曾把两者做成各自旋转的兄弟以避开透明度继承,\n // 但那样要求两个 transform-origin 换算到同一世界点(锤的轴心在自身负 y 方向),\n // 极易写错且错了看不出来 —— 两元素变换矩阵相同只代表角度相同,不代表轴心相同。\n <span className=\"page-loading__pendulum\">\n <i className=\"page-loading__pendulum-pivot\"/>\n <span className=\"page-loading__pendulum-arm\">\n <i className=\"page-loading__pendulum-bob\"/>\n </span>\n </span>)}\n {variant === 'marquee' && (\n // 轨道比可视区宽一倍,位移恰好等于虚线一个周期的整数倍,循环无缝\n <span className=\"page-loading__marquee\">\n <i className=\"page-loading__marquee-track\"/>\n </span>)}\n </span>);\n}\nexport default function PageLoading({ inline = false, variant, label = '页面加载中', }: Readonly<{\n inline?: boolean;\n variant?: LoadingStyle;\n label?: string;\n}>) {\n const preferencesContext = useOptionalPreferences();\n const preferredStyle = variant\n ?? preferencesContext?.preferences.loadingStyle\n ?? readCachedLoadingStyle();\n const resolvedStyle = isLoadingStyle(preferredStyle)\n ? preferredStyle\n : defaultPreferences.loadingStyle;\n return (<div className={`page-loading${inline ? ' page-loading--inline' : ''}`} data-loading-style={resolvedStyle} role=\"status\" aria-label={label}>\n <LoadingIndicator variant={resolvedStyle}/>\n </div>);\n}\n","import './styles.css';\nimport {Component,lazy,Suspense,type ReactNode} from 'react';\nimport type {ArcBaseAdminProps as CoreAdminProps} from '@fudanda/react-core/admin/types';\nimport {reportAdminError} from '@fudanda/react-core/admin/runtime';\nimport {PreviewProvider, type ArcBasePreviewOptions} from './preview';\nimport type {ArcBaseWebMcpOptions} from './webmcp-types';\nimport type {ArcBaseUpdateOptions} from './updates';\nexport {useSafeUpdateGuard, markSafeUpdateFormSaved} from './updates';\nexport type {ArcBaseUpdateOptions} from './updates';\nexport type {ArcBaseWebMcpOptions} from './webmcp-types';\nexport type {ArcBasePreviewOptions} from './preview';\nexport interface ArcBaseAdminProps extends CoreAdminProps { preview?: ArcBasePreviewOptions; webmcp?: ArcBaseWebMcpOptions; updates?: ArcBaseUpdateOptions | false }\nimport PageLoading from './components/PageLoading';\nconst Admin=lazy(()=>import('./admin/ArcBaseAdmin').then(module=>({default:module.ArcBaseAdmin})));\nclass LoadingBoundary extends Component<{children:ReactNode;fallback:ArcBaseAdminProps['errorFallback'];telemetry:ArcBaseAdminProps['telemetry']},{error:Error|null}> {\n state={error:null as Error|null};\n static getDerivedStateFromError(error:Error){return {error};}\n componentDidCatch(error:Error,info:{componentStack?:string|null}){reportAdminError(this.props.telemetry,error,info);}\n render(){return this.state.error?(this.props.fallback?.(this.state.error)??<div role=\"alert\">{this.state.error.message}</div>):this.props.children;}\n}\n// The build keeps this entry beside the public resources copied after bundling.\nexport function ArcBaseAdmin({preview,...props}:ArcBaseAdminProps){return <PreviewProvider value={preview}><LoadingBoundary fallback={props.errorFallback} telemetry={props.telemetry}><Suspense fallback={props.loading??<PageLoading/>}><Admin {...props} assetBasePath={props.assetBasePath??new URL(/* @vite-ignore */ './public/',import.meta.url).href}/></Suspense></LoadingBoundary></PreviewProvider>;}\nexport type {ArcBaseBrand,ArcBaseLocale,ArcBaseTheme,ArcBaseSessionAdapter,ArcBaseAdminModule,ArcBaseAdminPage,ArcBasePageProps,ArcBaseVersionInfo,ArcBaseFrontendProjectInfo,ArcBaseFrontendDependency} from '@fudanda/react-core/admin/types';\nexport {BasicTable,type BasicTableProps} from '@fudanda/table-antd';\n"]}
|
|
1
|
+
{"version":3,"file":"src-D6UlLiVN.js","mappings":"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","names":["usePreviewOptions","useContext","PreviewContext","createContext","PreviewProvider","readCachedLoadingStyle","readCachedPreferences","LoadingIndicator","variant","_Fragment","index","PageLoading","preferencesContext","useOptionalPreferences","preferredStyle","resolvedStyle","isLoadingStyle","defaultPreferences","inline","label","ArcBaseAdmin","props","preview","LoadingBoundary","Suspense","Admin","lazy","__vitePreload","n","module","Component","reportAdminError","error","info"],"ignoreList":[],"sources":["../src/preview-context.ts","../src/preview.tsx","../src/components/PageLoading.tsx","../src/index.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { ViewerOptions } from '@file-viewer/react';\nimport type { FileRenderHandler, FileViewerRendererPluginInput } from '@file-viewer/core';\n\nexport interface ArcBasePreviewOptions {\n /** Host-installed legacy PPT renderer and its self-hosted engine resources. */\n legacyPpt?: { renderers: FileViewerRendererPluginInput<FileRenderHandler<unknown, HTMLDivElement>>; presentation?: ViewerOptions['presentation'] };\n}\nexport const PreviewContext = createContext<ArcBasePreviewOptions | undefined>(undefined);\nexport function usePreviewOptions() { return useContext(PreviewContext); }\n","import type { ReactNode } from 'react';\nimport { PreviewContext, type ArcBasePreviewOptions } from './preview-context';\nexport type { ArcBasePreviewOptions } from './preview-context';\nexport function PreviewProvider({ value, children }: { value?: ArcBasePreviewOptions; children: ReactNode }) {\n return <PreviewContext.Provider value={value}>{children}</PreviewContext.Provider>;\n}\n","import { readCachedPreferences } from \"@fudanda/react-core/lib/preference-cache\";\nimport { defaultPreferences, isLoadingStyle, useOptionalPreferences } from \"@fudanda/react-core/hooks/usePreferences\";\nimport type { LoadingStyle } from \"@fudanda/react-core/hooks/usePreferences\";\nfunction readCachedLoadingStyle(): LoadingStyle {\n return readCachedPreferences().loadingStyle;\n}\nexport function LoadingIndicator({ variant }: Readonly<{\n variant: LoadingStyle;\n}>) {\n return (<span className={`page-loading-indicator page-loading-indicator--${variant}`} data-loading-style={variant} aria-hidden=\"true\">\n {variant === 'dots' && (<>\n <span className=\"page-loading__dot\"/>\n <span className=\"page-loading__dot\"/>\n <span className=\"page-loading__dot\"/>\n </>)}\n {variant === 'ring' && <span className=\"page-loading__ring\"/>}\n {variant === 'flip' && <span className=\"page-loading__flip\"/>}\n {variant === 'bars' && (<>\n <span className=\"page-loading__bar\"/>\n <span className=\"page-loading__bar\"/>\n <span className=\"page-loading__bar\"/>\n <span className=\"page-loading__bar\"/>\n </>)}\n {variant === 'spinner' && (<span className=\"page-loading__spinner\">\n {Array.from({ length: 8 }, (_, index) => <i key={index}/>)}\n </span>)}\n {variant === 'bounce' && (<>\n <span className=\"page-loading__bounce-dot\"/>\n <span className=\"page-loading__bounce-dot\"/>\n </>)}\n {variant === 'ripple' && (<span className=\"page-loading__ripple\">\n <i />\n <i />\n </span>)}\n {variant === 'progress' && (<span className=\"page-loading__track\">\n <i className=\"page-loading__thumb\"/>\n </span>)}\n {variant === 'orbit' && (\n // 两颗圆点固定在旋转容器的上下极:容器自转即两点绕圈,圆点自身无需再动\n <span className=\"page-loading__orbit\">\n <i />\n <i />\n </span>)}\n {variant === 'grid' && (<span className=\"page-loading__grid\">\n {Array.from({ length: 9 }, (_, index) => <i key={index}/>)}\n </span>)}\n {variant === 'travel' && <span className=\"page-loading__travel\"/>}\n {variant === 'ellipsis' && (<>\n <span className=\"page-loading__ellipsis-dot\"/>\n <span className=\"page-loading__ellipsis-dot\"/>\n <span className=\"page-loading__ellipsis-dot\"/>\n </>)}\n {variant === 'carousel' && (\n // 三个静态槽位 + 一颗游走的光点:单程从左到右,在首尾不可见时重置,故看不到回弹\n <span className=\"page-loading__carousel\">\n <i className=\"page-loading__carousel-slot\"/>\n <i className=\"page-loading__carousel-slot\"/>\n <i className=\"page-loading__carousel-slot\"/>\n <i className=\"page-loading__carousel-bead\"/>\n </span>)}\n {variant === 'landing' && (\n // 地面参照(影子)与球分开:球靠 transform-origin 落在底部做压扁,影子随高度缩放\n <span className=\"page-loading__landing\">\n <i className=\"page-loading__landing-ball\"/>\n <i className=\"page-loading__landing-shadow\"/>\n </span>)}\n {variant === 'pendulum' && (\n // 摆锤是摆杆的子元素:刚性由结构保证。曾把两者做成各自旋转的兄弟以避开透明度继承,\n // 但那样要求两个 transform-origin 换算到同一世界点(锤的轴心在自身负 y 方向),\n // 极易写错且错了看不出来 —— 两元素变换矩阵相同只代表角度相同,不代表轴心相同。\n <span className=\"page-loading__pendulum\">\n <i className=\"page-loading__pendulum-pivot\"/>\n <span className=\"page-loading__pendulum-arm\">\n <i className=\"page-loading__pendulum-bob\"/>\n </span>\n </span>)}\n {variant === 'marquee' && (\n // 轨道比可视区宽一倍,位移恰好等于虚线一个周期的整数倍,循环无缝\n <span className=\"page-loading__marquee\">\n <i className=\"page-loading__marquee-track\"/>\n </span>)}\n </span>);\n}\nexport default function PageLoading({ inline = false, variant, label = '页面加载中', }: Readonly<{\n inline?: boolean;\n variant?: LoadingStyle;\n label?: string;\n}>) {\n const preferencesContext = useOptionalPreferences();\n const preferredStyle = variant\n ?? preferencesContext?.preferences.loadingStyle\n ?? readCachedLoadingStyle();\n const resolvedStyle = isLoadingStyle(preferredStyle)\n ? preferredStyle\n : defaultPreferences.loadingStyle;\n return (<div className={`page-loading${inline ? ' page-loading--inline' : ''}`} data-loading-style={resolvedStyle} role=\"status\" aria-label={label}>\n <LoadingIndicator variant={resolvedStyle}/>\n </div>);\n}\n","import './styles.css';\nimport {Component,lazy,Suspense,type ReactNode} from 'react';\nimport type {ArcBaseAdminProps as CoreAdminProps} from '@fudanda/react-core/admin/types';\nimport {reportAdminError} from '@fudanda/react-core/admin/runtime';\nimport {PreviewProvider, type ArcBasePreviewOptions} from './preview';\nimport type {ArcBaseWebMcpOptions} from './webmcp-types';\nimport type {ArcBaseUpdateOptions} from './updates';\nexport {useSafeUpdateGuard, markSafeUpdateFormSaved} from './updates';\nexport type {ArcBaseUpdateOptions} from './updates';\nexport type {ArcBaseWebMcpOptions} from './webmcp-types';\nexport type {ArcBasePreviewOptions} from './preview';\nexport interface ArcBaseAdminProps extends CoreAdminProps { preview?: ArcBasePreviewOptions; webmcp?: ArcBaseWebMcpOptions; updates?: ArcBaseUpdateOptions | false }\nimport PageLoading from './components/PageLoading';\nconst Admin=lazy(()=>import('./admin/ArcBaseAdmin').then(module=>({default:module.ArcBaseAdmin})));\nclass LoadingBoundary extends Component<{children:ReactNode;fallback:ArcBaseAdminProps['errorFallback'];telemetry:ArcBaseAdminProps['telemetry']},{error:Error|null}> {\n state={error:null as Error|null};\n static getDerivedStateFromError(error:Error){return {error};}\n componentDidCatch(error:Error,info:{componentStack?:string|null}){reportAdminError(this.props.telemetry,error,info);}\n render(){return this.state.error?(this.props.fallback?.(this.state.error)??<div role=\"alert\">{this.state.error.message}</div>):this.props.children;}\n}\n// The build keeps this entry beside the public resources copied after bundling.\nexport function ArcBaseAdmin({preview,...props}:ArcBaseAdminProps){return <PreviewProvider value={preview}><LoadingBoundary fallback={props.errorFallback} telemetry={props.telemetry}><Suspense fallback={props.loading??<PageLoading/>}><Admin {...props} assetBasePath={props.assetBasePath??new URL(/* @vite-ignore */ './public/',import.meta.url).href}/></Suspense></LoadingBoundary></PreviewProvider>;}\nexport type {ArcBaseBrand,ArcBaseLocale,ArcBaseTheme,ArcBaseSessionAdapter,ArcBaseAdminModule,ArcBaseAdminPage,ArcBasePageProps,ArcBaseVersionInfo,ArcBaseFrontendProjectInfo,ArcBaseFrontendDependency} from '@fudanda/react-core/admin/types';\nexport {BasicTable,type BasicTableProps} from '@fudanda/table-antd';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fudanda/admin-antd",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.20261109.1-beta.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ArcBase admin-antd SDK.",
|
|
6
6
|
"sideEffects": [
|
|
@@ -564,13 +564,13 @@
|
|
|
564
564
|
"lint": "eslint src --max-warnings 0 && stylelint \"src/**/*.css\""
|
|
565
565
|
},
|
|
566
566
|
"peerDependencies": {
|
|
567
|
-
"@fudanda/client": "2.
|
|
567
|
+
"@fudanda/client": "2.20261109.1-beta.2",
|
|
568
568
|
"react": "^19.0.0",
|
|
569
569
|
"react-dom": "^19.0.0",
|
|
570
570
|
"antd": "6.6.8",
|
|
571
571
|
"@tanstack/react-query": "^5.0.0",
|
|
572
572
|
"react-router-dom": "^7.18.4",
|
|
573
|
-
"@fudanda/workflow": "2.
|
|
573
|
+
"@fudanda/workflow": "2.20261109.1-beta.2"
|
|
574
574
|
},
|
|
575
575
|
"dependencies": {
|
|
576
576
|
"dayjs": "^1.11.23",
|
|
@@ -585,7 +585,7 @@
|
|
|
585
585
|
"overlayscrollbars": "2.17.0",
|
|
586
586
|
"@json-render/core": "0.21.4",
|
|
587
587
|
"@json-render/react": "0.21.4",
|
|
588
|
-
"@fudanda/client": "2.
|
|
588
|
+
"@fudanda/client": "2.20261109.1-beta.2",
|
|
589
589
|
"@file-viewer/core": "3.3.3",
|
|
590
590
|
"@file-viewer/react": "3.3.3",
|
|
591
591
|
"@openobserve/browser-rum": "0.4.3",
|
|
@@ -626,11 +626,11 @@
|
|
|
626
626
|
"@embedpdf/plugin-pan": "2.15.1",
|
|
627
627
|
"@embedpdf/plugin-thumbnail": "2.15.1",
|
|
628
628
|
"@embedpdf/plugin-print": "2.15.1",
|
|
629
|
-
"@fudanda/shared": "2.
|
|
630
|
-
"@fudanda/react-core": "2.
|
|
631
|
-
"@fudanda/elements-antd": "2.
|
|
632
|
-
"@fudanda/table-antd": "2.
|
|
633
|
-
"@fudanda/json-render-antd": "2.
|
|
629
|
+
"@fudanda/shared": "2.20261109.1-beta.2",
|
|
630
|
+
"@fudanda/react-core": "2.20261109.1-beta.2",
|
|
631
|
+
"@fudanda/elements-antd": "2.20261109.1-beta.2",
|
|
632
|
+
"@fudanda/table-antd": "2.20261109.1-beta.2",
|
|
633
|
+
"@fudanda/json-render-antd": "2.20261109.1-beta.2",
|
|
634
634
|
"@file-viewer/renderer-pptx": "3.3.3",
|
|
635
635
|
"@mcp-b/webmcp-local-relay": "6.0.3",
|
|
636
636
|
"webmcp-types": "0.1.10",
|