项目文件夹

文件
wehub-resource-sync 98e40dac97
CLI Smoke Test / smoke-test-linux (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-linux (24) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (20) (push) Has been cancelled
CLI Smoke Test / smoke-test-windows (24) (push) Has been cancelled
Expo App TypeScript typecheck / typecheck (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:40:49 +08:00

82 行
2.2 KiB
TypeScript

function getObjectValue(value: unknown, key: string): unknown {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
return null;
}
return (value as Record<string, unknown>)[key];
}
function parseJson(value: string): unknown {
try {
return JSON.parse(value);
} catch {
return value;
}
}
function normalizeNotificationData(data: unknown): unknown {
if (typeof data === 'string') {
return parseJson(data);
}
return data;
}
function getSessionRouteFromUrl(url: string): `/session/${string}` | null {
const trimmedUrl = url.trim();
if (!trimmedUrl) {
return null;
}
const match = trimmedUrl.match(/(?:^|\/)session\/([^/?#]+)/);
if (!match) {
return null;
}
const encodedSessionId = match[1];
const sessionId = (() => {
try {
return decodeURIComponent(encodedSessionId);
} catch {
return encodedSessionId;
}
})();
const trimmedSessionId = sessionId.trim();
if (!trimmedSessionId) {
return null;
}
return `/session/${encodeURIComponent(trimmedSessionId)}`;
}
export function getSessionRouteFromNotificationData(data: unknown): `/session/${string}` | null {
const normalizedData = normalizeNotificationData(data);
if (!normalizedData || typeof normalizedData !== 'object' || Array.isArray(normalizedData)) {
return null;
}
const url = getObjectValue(normalizedData, 'url');
if (typeof url === 'string') {
const routeFromUrl = getSessionRouteFromUrl(url);
if (routeFromUrl) {
return routeFromUrl;
}
}
const sessionId = getObjectValue(normalizedData, 'sessionId');
if (typeof sessionId !== 'string') {
return null;
}
const trimmedSessionId = sessionId.trim();
if (!trimmedSessionId) {
return null;
}
return `/session/${encodeURIComponent(trimmedSessionId)}`;
}
export function getSessionRouteFromNotificationResponse(response: unknown): `/session/${string}` | null {
const contentData = getObjectValue(getObjectValue(getObjectValue(response, 'notification'), 'request'), 'content');
return getSessionRouteFromNotificationData(getObjectValue(contentData, 'data'));
}