Skip to content

Commit 47d863b

Browse files
committed
Merge branch 'develop'
2 parents de89403 + f6864e0 commit 47d863b

File tree

1 file changed

+73
-3
lines changed

1 file changed

+73
-3
lines changed

src/domain/Room.ts

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import UserInfoDomain from '@/domain/UserInfo'
77
import { desert, getTextByteSize, upsert } from '@/utils'
88
import { nanoid } from 'nanoid'
99
import StatusModule from '@/domain/modules/Status'
10-
import { ToastExtern } from './externs/Toast'
1110
import { SYNC_HISTORY_MAX_DAYS, WEB_RTC_MAX_MESSAGE_SIZE } from '@/constants/config'
11+
import * as v from 'valibot'
1212

1313
export { MessageType }
1414

@@ -60,12 +60,78 @@ export type RoomMessage = SyncUserMessage | SyncHistoryMessage | LikeMessage | H
6060

6161
export type RoomUser = MessageUser & { peerId: string; joinTime: number }
6262

63+
const MessageUserSchema = {
64+
userId: v.string(),
65+
username: v.string(),
66+
userAvatar: v.string()
67+
}
68+
69+
const AtUserSchema = {
70+
userId: v.string(),
71+
username: v.string(),
72+
userAvatar: v.string(),
73+
positions: v.array(v.tuple([v.number(), v.number()]))
74+
}
75+
76+
const NormalMessageSchema = {
77+
id: v.string(),
78+
type: v.literal(MessageType.Normal),
79+
body: v.string(),
80+
sendTime: v.number(),
81+
receiveTime: v.number(),
82+
likeUsers: v.array(v.object(MessageUserSchema)),
83+
hateUsers: v.array(v.object(MessageUserSchema)),
84+
atUsers: v.array(v.object(AtUserSchema))
85+
}
86+
87+
const RoomMessageSchema = v.union([
88+
v.object({
89+
type: v.literal(SendType.Text),
90+
id: v.string(),
91+
body: v.string(),
92+
sendTime: v.number(),
93+
atUsers: v.array(v.object(AtUserSchema)),
94+
...MessageUserSchema
95+
}),
96+
v.object({
97+
type: v.literal(SendType.Like),
98+
id: v.string(),
99+
sendTime: v.number(),
100+
...MessageUserSchema
101+
}),
102+
v.object({
103+
type: v.literal(SendType.Hate),
104+
id: v.string(),
105+
sendTime: v.number(),
106+
...MessageUserSchema
107+
}),
108+
v.object({
109+
type: v.literal(SendType.SyncUser),
110+
id: v.string(),
111+
peerId: v.string(),
112+
joinTime: v.number(),
113+
sendTime: v.number(),
114+
lastMessageTime: v.number(),
115+
...MessageUserSchema
116+
}),
117+
v.object({
118+
type: v.literal(SendType.SyncHistory),
119+
id: v.string(),
120+
sendTime: v.number(),
121+
messages: v.array(v.object(NormalMessageSchema)),
122+
...MessageUserSchema
123+
})
124+
])
125+
126+
// Check if the message conforms to the format
127+
const checkMessageFormat = (message: v.InferInput<typeof RoomMessageSchema>) =>
128+
v.safeParse(RoomMessageSchema, message).success
129+
63130
const RoomDomain = Remesh.domain({
64131
name: 'RoomDomain',
65132
impl: (domain) => {
66133
const messageListDomain = domain.getDomain(MessageListDomain())
67134
const userInfoDomain = domain.getDomain(UserInfoDomain())
68-
const toast = domain.getExtern(ToastExtern)
69135
const peerRoom = domain.getExtern(PeerRoomExtern)
70136

71137
const PeerIdState = domain.state<string>({
@@ -407,7 +473,11 @@ const RoomDomain = Remesh.domain({
407473
impl: ({ get }) => {
408474
const onMessage$ = fromEventPattern<RoomMessage>(peerRoom.onMessage).pipe(
409475
mergeMap((message) => {
410-
// console.log('onMessage', message)
476+
// Filter out messages that do not conform to the format
477+
if (!checkMessageFormat(message)) {
478+
console.warn('Invalid message format', message)
479+
return EMPTY
480+
}
411481

412482
const messageEvent$ = of(OnMessageEvent(message))
413483

0 commit comments

Comments
 (0)