Files
wer-admin/src/utils/push-message.ts
2026-03-26 17:34:51 +08:00

83 lines
2.1 KiB
TypeScript

export const PUSH_MESSAGE_TYPE = {
MESSAGE: 'message',
NOTICE: 'notice',
LLM: 'llm',
CUSTOM: 'custom'
} as const;
export const PUSH_MESSAGE_SOURCE = {
BACKEND: 'backend',
NOTICE: 'notice',
WORKFLOW: 'workflow',
LLM: 'llm',
CLIENT: 'client'
} as const;
export const NOTICE_GROUP = {
SYSTEM: 'system',
NOTICE: 'notice',
WORKFLOW: 'workflow'
} as const;
export interface PushMessagePayload {
type?: string;
source?: string;
message?: string;
data?: Record<string, any> | null;
path?: string;
query?: Record<string, any> | null;
timestamp?: number;
}
const MESSAGE_CENTER_TYPES = new Set<string>([PUSH_MESSAGE_TYPE.MESSAGE, PUSH_MESSAGE_TYPE.NOTICE]);
export const parsePushMessage = (raw: string): PushMessagePayload => {
try {
const payload = JSON.parse(raw) as PushMessagePayload;
return {
type: payload.type ?? PUSH_MESSAGE_TYPE.MESSAGE,
source: payload.source ?? 'backend',
message: payload.message ?? '',
data: payload.data ?? null,
path: payload.path,
query: payload.query ?? null,
timestamp: payload.timestamp ?? Date.now()
};
} catch {
return {
type: PUSH_MESSAGE_TYPE.MESSAGE,
source: 'backend',
message: raw,
data: null,
path: undefined,
query: null,
timestamp: Date.now()
};
}
};
export const shouldAppendNotice = (payload: PushMessagePayload) => {
return MESSAGE_CENTER_TYPES.has(payload.type ?? PUSH_MESSAGE_TYPE.MESSAGE);
};
export const resolveNoticeGroup = (payload: PushMessagePayload) => {
if (payload.type === PUSH_MESSAGE_TYPE.NOTICE || payload.source === PUSH_MESSAGE_SOURCE.NOTICE) {
return NOTICE_GROUP.NOTICE;
}
if (payload.source === PUSH_MESSAGE_SOURCE.WORKFLOW) {
return NOTICE_GROUP.WORKFLOW;
}
return NOTICE_GROUP.SYSTEM;
};
export const resolveNoticeTitle = (payload: PushMessagePayload) => {
const group = resolveNoticeGroup(payload);
if (group === NOTICE_GROUP.NOTICE) {
return '通知公告消息';
}
if (group === NOTICE_GROUP.WORKFLOW) {
return '工作流消息';
}
return '系统消息';
};