* Validate a message and return errors if any
(message: AsterUIMessage)
| 173 | * Validate a message and return errors if any |
| 174 | */ |
| 175 | validateMessage(message: AsterUIMessage): ValidationError[] { |
| 176 | const errors: ValidationError[] = []; |
| 177 | |
| 178 | // Check that exactly one message type is present |
| 179 | const messageTypes = [ |
| 180 | message.createSurface, |
| 181 | message.surfaceUpdate, |
| 182 | message.dataModelUpdate, |
| 183 | message.beginRendering, |
| 184 | message.deleteSurface, |
| 185 | ].filter(Boolean); |
| 186 | |
| 187 | if (messageTypes.length === 0) { |
| 188 | errors.push(createValidationError('', '/', 'Message must contain exactly one operation type')); |
| 189 | } |
| 190 | else if (messageTypes.length > 1) { |
| 191 | errors.push(createValidationError('', '/', 'Message must contain exactly one operation type')); |
| 192 | } |
| 193 | |
| 194 | // Validate createSurface |
| 195 | if (message.createSurface) { |
| 196 | if (!message.createSurface.surfaceId) { |
| 197 | errors.push(createValidationError('', '/createSurface/surfaceId', 'surfaceId is required')); |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | // Validate surfaceUpdate |
| 202 | if (message.surfaceUpdate) { |
| 203 | if (!message.surfaceUpdate.surfaceId) { |
| 204 | errors.push(createValidationError('', '/surfaceUpdate/surfaceId', 'surfaceId is required')); |
| 205 | } |
| 206 | if (!Array.isArray(message.surfaceUpdate.components)) { |
| 207 | errors.push(createValidationError( |
| 208 | message.surfaceUpdate.surfaceId || '', |
| 209 | '/surfaceUpdate/components', |
| 210 | 'components must be an array', |
| 211 | )); |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | // Validate dataModelUpdate |
| 216 | if (message.dataModelUpdate) { |
| 217 | if (!message.dataModelUpdate.surfaceId) { |
| 218 | errors.push(createValidationError('', '/dataModelUpdate/surfaceId', 'surfaceId is required')); |
| 219 | } |
| 220 | const op = message.dataModelUpdate.op; |
| 221 | if (op && !['add', 'replace', 'remove'].includes(op)) { |
| 222 | errors.push(createValidationError( |
| 223 | message.dataModelUpdate.surfaceId || '', |
| 224 | '/dataModelUpdate/op', |
| 225 | 'op must be "add", "replace", or "remove"', |
| 226 | )); |
| 227 | } |
| 228 | if (op !== 'remove' && message.dataModelUpdate.contents === undefined) { |
| 229 | errors.push(createValidationError( |
| 230 | message.dataModelUpdate.surfaceId || '', |
| 231 | '/dataModelUpdate/contents', |
| 232 | 'contents is required for add and replace operations', |
no test coverage detected