Promote BIM share on Launcher login event

This commit is contained in:
CODEX 2026-06-23 18:57:36 +03:00
parent 168b535953
commit ce34ecdd4d
1 changed files with 44 additions and 4 deletions

View File

@ -188,7 +188,8 @@ const SHARE_AUTH_GUEST_PARAM = "ndc_bim_guest";
const SHARE_PROMOTION_TIMEOUT_MS = 4500;
const SHARE_PROMOTION_RETRY_MS = 15000;
const SESSION_STATUS_WATCH_INTERVAL_MS = 2500;
const NODEDC_SESSION_EVENT_TYPE = "nodedc:session:logout";
const NODEDC_SESSION_LOGOUT_EVENT_TYPE = "nodedc:session:logout";
const NODEDC_SESSION_LOGIN_EVENT_TYPE = "nodedc:session:login";
const acceptByType = {
xkt: ".xkt",
@ -632,6 +633,13 @@ const getShareTopLevelPromotionUrl = () => {
return typeof promoteUrl === "string" && promoteUrl.trim() ? promoteUrl : "";
};
const buildLauncherOptionalServiceUrl = (nextPath = getCurrentReturnPath(), fallbackPath = nextPath) => {
const launchUrl = new URL("/api/services/bim-viewer/optional-launch", getLauncherUrl());
launchUrl.searchParams.set("returnTo", nextPath);
launchUrl.searchParams.set("fallbackTo", fallbackPath);
return launchUrl.toString();
};
const hasShareGuestAuthMarker = () => {
try {
return new URLSearchParams(window.location.search || "").get(SHARE_AUTH_GUEST_PARAM) === "1";
@ -660,12 +668,20 @@ const clearShareStartupPending = () => {
const isNodeDCSessionLogoutEvent = (value) => (
value &&
typeof value === "object" &&
value.type === NODEDC_SESSION_EVENT_TYPE &&
value.type === NODEDC_SESSION_LOGOUT_EVENT_TYPE &&
typeof value.id === "string"
);
const isNodeDCSessionLoginEvent = (value) => (
value &&
typeof value === "object" &&
value.type === NODEDC_SESSION_LOGIN_EVENT_TYPE &&
typeof value.id === "string"
);
let nodeDCSessionSyncCleanup = null;
let nodeDCLogoutHandling = false;
let nodeDCLoginHandling = false;
let nodeDCSessionWatchTimer = null;
let nodeDCSessionWatchInFlight = false;
@ -717,6 +733,24 @@ const handleNodeDCSessionLogout = async () => {
window.location.replace(loginUrl.toString());
};
const handleNodeDCSessionLogin = () => {
if (nodeDCLoginHandling || runtimeSessionInfo.authenticated === true) return;
nodeDCLoginHandling = true;
const shareToken = getShareTokenFromPath();
if (shareToken) {
const promotionUrl = getShareTopLevelPromotionUrl() ||
buildLauncherOptionalServiceUrl(
`/share/${encodeURIComponent(shareToken)}`,
`/share/${encodeURIComponent(shareToken)}?${SHARE_AUTH_GUEST_PARAM}=1`
);
window.location.assign(promotionUrl);
return;
}
window.location.assign(buildLauncherOptionalServiceUrl());
};
const setupNodeDCSessionSync = () => {
if (nodeDCSessionSyncCleanup || typeof document === "undefined") return;
@ -736,8 +770,14 @@ const setupNodeDCSessionSync = () => {
document.body.appendChild(iframe);
const handleMessage = (event) => {
if (event.origin !== launcherOrigin || !isNodeDCSessionLogoutEvent(event.data)) return;
void handleNodeDCSessionLogout();
if (event.origin !== launcherOrigin) return;
if (isNodeDCSessionLogoutEvent(event.data)) {
void handleNodeDCSessionLogout();
return;
}
if (isNodeDCSessionLoginEvent(event.data)) {
handleNodeDCSessionLogin();
}
};
window.addEventListener("message", handleMessage);