From c0928e0ffd256d9348a73de9f0c7b60af044b080 Mon Sep 17 00:00:00 2001 From: Sheldon Guo Date: Sun, 27 Apr 2025 12:40:42 +0800 Subject: [PATCH] fix(notification): decode SSE messages and encode data for in-app notifications --- .../src/client/observables/sse.ts | 11 ++++++----- .../src/server/InAppNotificationChannel.ts | 18 ++++++++++-------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/observables/sse.ts b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/observables/sse.ts index 0b9f6b706b..b46d60bbb5 100644 --- a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/observables/sse.ts +++ b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/observables/sse.ts @@ -8,11 +8,11 @@ */ import { observable, reaction } from '@formily/reactive'; -import { SSEData } from '../../types'; -import { messageMapObs, updateUnreadMsgsCount } from './message'; -import { fetchChannels } from './channel'; -import { getAPIClient } from '../utils'; import { uid } from '@nocobase/utils/client'; +import { SSEData } from '../../types'; +import { getAPIClient } from '../utils'; +import { fetchChannels } from './channel'; +import { messageMapObs, updateUnreadMsgsCount } from './message'; export const liveSSEObs = observable<{ value: SSEData | null }>({ value: null }); reaction( @@ -66,7 +66,8 @@ export const startMsgSSEStreamWithRetry: () => () => void = () => { if (done) break; const messages = value.split('\n\n').filter(Boolean); for (const message of messages) { - const sseData: SSEData = JSON.parse(message.replace(/^data:\s*/, '').trim()); + const decodedMessage = decodeURIComponent(message); + const sseData: SSEData = JSON.parse(decodedMessage.replace(/^data:\s*/, '').trim()); liveSSEObs.value = sseData; } } diff --git a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/server/InAppNotificationChannel.ts b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/server/InAppNotificationChannel.ts index 63facc4060..0c48817dc1 100644 --- a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/server/InAppNotificationChannel.ts +++ b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/server/InAppNotificationChannel.ts @@ -60,14 +60,16 @@ export default class InAppNotificationChannel extends BaseNotificationChannel { for (const clientId in clients) { const stream = clients[clientId]; stream.write( - `data: ${JSON.stringify({ - type: message.type, - data: { - ...message.data, - title: message.data.title || '', - content: message.data.content || '', - }, - })}\n\n`, + `data: ${encodeURIComponent( + JSON.stringify({ + type: message.type, + data: { + ...message.data, + title: message.data.title || '', + content: message.data.content || '', + }, + }), + )}\n\n`, ); } }