@@ -7,8 +7,8 @@ import UserInfoDomain from '@/domain/UserInfo'
7
7
import { desert , getTextByteSize , upsert } from '@/utils'
8
8
import { nanoid } from 'nanoid'
9
9
import StatusModule from '@/domain/modules/Status'
10
- import { ToastExtern } from './externs/Toast'
11
10
import { SYNC_HISTORY_MAX_DAYS , WEB_RTC_MAX_MESSAGE_SIZE } from '@/constants/config'
11
+ import * as v from 'valibot'
12
12
13
13
export { MessageType }
14
14
@@ -60,12 +60,78 @@ export type RoomMessage = SyncUserMessage | SyncHistoryMessage | LikeMessage | H
60
60
61
61
export type RoomUser = MessageUser & { peerId : string ; joinTime : number }
62
62
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
+
63
130
const RoomDomain = Remesh . domain ( {
64
131
name : 'RoomDomain' ,
65
132
impl : ( domain ) => {
66
133
const messageListDomain = domain . getDomain ( MessageListDomain ( ) )
67
134
const userInfoDomain = domain . getDomain ( UserInfoDomain ( ) )
68
- const toast = domain . getExtern ( ToastExtern )
69
135
const peerRoom = domain . getExtern ( PeerRoomExtern )
70
136
71
137
const PeerIdState = domain . state < string > ( {
@@ -407,7 +473,11 @@ const RoomDomain = Remesh.domain({
407
473
impl : ( { get } ) => {
408
474
const onMessage$ = fromEventPattern < RoomMessage > ( peerRoom . onMessage ) . pipe (
409
475
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
+ }
411
481
412
482
const messageEvent$ = of ( OnMessageEvent ( message ) )
413
483
0 commit comments