(messageBuffer: ArrayBuffer)
| 387 | } |
| 388 | |
| 389 | private async _handleMessage(messageBuffer: ArrayBuffer) { |
| 390 | const [sessionInvalidated, userPlan, pageGroupId, pageIsFree] = |
| 391 | await Promise.all([ |
| 392 | dataAbstraction().hget('session', this.sessionId!, 'invalidated'), |
| 393 | dataAbstraction().hget('user', this.userId!, 'plan'), |
| 394 | dataAbstraction().hget('page', this.room.pageId, 'group-id'), |
| 395 | dataAbstraction().hget('page', this.room.pageId, 'free'), |
| 396 | ]); |
| 397 | |
| 398 | // Check if session is invalidated |
| 399 | |
| 400 | if (sessionInvalidated) { |
| 401 | this.destroySocket(); |
| 402 | |
| 403 | return; |
| 404 | } |
| 405 | |
| 406 | // Check if has permission to edit |
| 407 | |
| 408 | const role = await dataAbstraction().hget( |
| 409 | 'group-member', |
| 410 | `${pageGroupId}:${this.userId}`, |
| 411 | 'role', |
| 412 | ); |
| 413 | |
| 414 | if ( |
| 415 | !rolesMap()[role]?.permissions.editGroupPages || |
| 416 | (userPlan !== 'pro' && !pageIsFree) |
| 417 | ) { |
| 418 | moduleLogger.info('Ignored message from unauthorized user'); |
| 419 | return; |
| 420 | } |
| 421 | |
| 422 | const message = new Uint8Array(messageBuffer); |
| 423 | |
| 424 | const decoder = decoding.createDecoder(message); |
| 425 | |
| 426 | const messageType = decoding.readVarUint(decoder); |
| 427 | |
| 428 | switch (messageType) { |
| 429 | case CollabMessageType.AWARENESS: |
| 430 | await this._handleAwarenessMessage(decoder, message); |
| 431 | break; |
| 432 | case CollabMessageType.DOC: |
| 433 | await this._handleDocMessage(decoder); |
| 434 | break; |
| 435 | default: |
| 436 | throw new Error('Unknown message type'); |
| 437 | } |
| 438 | } |
| 439 | |
| 440 | private async _handleAwarenessMessage( |
| 441 | decoder: decoding.Decoder, |
no test coverage detected