From 5b6907639b9b6ef1818dfb7ea2b667eccae6c590 Mon Sep 17 00:00:00 2001 From: Hoang Pham Date: Mon, 1 Jul 2024 15:35:43 +0700 Subject: [PATCH] Fix ci/cd errs Signed-off-by: Hoang Pham --- lib/Controller/JWTController.php | 4 ++ lib/Controller/WhiteboardController.php | 8 +++- src/collaboration/Portal.ts | 53 ++++++++++++++++++------- src/collaboration/collab.ts | 27 ++++++++----- websocket_server/roomData.js | 6 +-- websocket_server/server.js | 4 +- websocket_server/socket.js | 14 +++---- 7 files changed, 79 insertions(+), 37 deletions(-) diff --git a/lib/Controller/JWTController.php b/lib/Controller/JWTController.php index 0fb4a9d..69c5431 100644 --- a/lib/Controller/JWTController.php +++ b/lib/Controller/JWTController.php @@ -1,6 +1,10 @@ 'Unauthorized'], Http::STATUS_UNAUTHORIZED); } - [$jwt] = sscanf($authHeader, 'Bearer %s'); + $assignedValues = sscanf($authHeader, 'Bearer %s', $jwt); - if (!$jwt) { + if (!$assignedValues) { + return new DataResponse(['message' => 'Unauthorized'], Http::STATUS_UNAUTHORIZED); + } + + if (!$jwt || !is_string($jwt)) { return new DataResponse(['message' => 'Unauthorized'], Http::STATUS_UNAUTHORIZED); } diff --git a/src/collaboration/Portal.ts b/src/collaboration/Portal.ts index 8063419..cc81b17 100644 --- a/src/collaboration/Portal.ts +++ b/src/collaboration/Portal.ts @@ -7,7 +7,7 @@ import type { ExcalidrawElement } from '@excalidraw/excalidraw/types/element/types' import { io, type Socket } from 'socket.io-client' import type { Collab } from './collab' -import type { Gesture } from '@excalidraw/excalidraw/types/types' +import type { AppState, Gesture } from '@excalidraw/excalidraw/types/types' import axios from '@nextcloud/axios' import { loadState } from '@nextcloud/initial-state' @@ -37,8 +37,8 @@ export class Portal { const socket = io(collabBackendUrl, { withCredentials: true, auth: { - token - } + token, + }, }) this.open(socket) @@ -51,12 +51,21 @@ export class Portal { eventsNeedingTokenRefresh.forEach((event) => this.socket?.on(event, async () => { await this.handleTokenRefresh() - }) + }), ) this.socket.on('read-only', () => this.handleReadOnlySocket()) this.socket.on('init-room', () => this.handleInitRoom()) - this.socket.on('room-user-change', (users: any) => this.collab.updateCollaborators(users)) + this.socket.on('room-user-change', (users: { + user: { + id: string, + name: string + }, + socketId: string, + pointer: { x: number, y: number, tool: 'pointer' | 'laser' }, + button: 'down' | 'up', + selectedElementIds: AppState['selectedElementIds'] + }[]) => this.collab.updateCollaborators(users)) this.socket.on('client-broadcast', (data) => this.handleClientBroadcast(data)) } @@ -85,12 +94,12 @@ export class Portal { handleClientBroadcast(data: ArrayBuffer) { const decoded = JSON.parse(new TextDecoder().decode(data)) switch (decoded.type) { - case BroadcastType.SceneInit: - this.handleSceneInit(decoded.payload.elements) - break - case BroadcastType.MouseLocation: - this.collab.updateCursor(decoded.payload) - break + case BroadcastType.SceneInit: + this.handleSceneInit(decoded.payload.elements) + break + case BroadcastType.MouseLocation: + this.collab.updateCursor(decoded.payload) + break } } @@ -115,10 +124,22 @@ export class Portal { } } - async _broadcastSocketData(data: any, volatile: boolean = false, roomId?: string) { + async _broadcastSocketData(data: { + type: string; + payload: { + elements?: readonly ExcalidrawElement[]; + socketId?: string; + pointer?: { x: number; y: number; tool: 'pointer' | 'laser' }; + button?: 'down' | 'up'; + selectedElementIds?: AppState['selectedElementIds']; + username?: string; + }; + }, volatile: boolean = false, roomId?: string) { + const json = JSON.stringify(data) const encryptedBuffer = new TextEncoder().encode(json) this.socket?.emit(volatile ? 'server-volatile-broadcast' : 'server-broadcast', roomId ?? this.roomId, encryptedBuffer, []) + } async broadcastScene(updateType: string, elements: readonly ExcalidrawElement[]) { @@ -130,6 +151,7 @@ export class Portal { button: 'down' | 'up'; pointersMap: Gesture['pointers']; }) { + const data = { type: BroadcastType.MouseLocation, payload: { @@ -137,9 +159,12 @@ export class Portal { pointer: payload.pointer, button: payload.button || 'up', selectedElementIds: this.collab.excalidrawAPI.getAppState().selectedElementIds, - username: this.socket?.id - } + username: this.socket?.id, + }, } + await this._broadcastSocketData(data, true) + } + } diff --git a/src/collaboration/collab.ts b/src/collaboration/collab.ts index a2fa42e..bcefdda 100644 --- a/src/collaboration/collab.ts +++ b/src/collaboration/collab.ts @@ -44,8 +44,8 @@ export class Collab { handleRemoteSceneUpdate = (elements: ExcalidrawElement[]) => { this.excalidrawAPI.updateScene({ - elements - } + elements, + }, ) } @@ -71,13 +71,22 @@ export class Collab { payload.pointersMap.size < 2 && this.portal.socket && this.portal.broadcastMouseLocation(payload) } - updateCollaborators = (users: any[]) => { + updateCollaborators = (users: { + user: { + id: string, + name: string + }, + socketId: string, + pointer: { x: number, y: number, tool: 'pointer' | 'laser' }, + button: 'down' | 'up', + selectedElementIds: AppState['selectedElementIds'] + }[]) => { const collaborators = new Map() users.forEach((payload) => { collaborators.set(payload.user.id, { username: payload.user.name, - ...payload + ...payload, }) }) @@ -100,8 +109,8 @@ export class Collab { collaborators: this.collaborators.set(payload.user.id, { ...this.collaborators.get(payload.user.id), ...payload, - username: payload.user.name - }) + username: payload.user.name, + }), }) } @@ -111,15 +120,15 @@ export class Collab { this.excalidrawAPI.scrollToContent(elements, { fitToContent: true, animate: true, - duration: 500 + duration: 500, }) } makeBoardReadOnly = () => { this.excalidrawAPI.updateScene({ appState: { - viewModeEnabled: true - } + viewModeEnabled: true, + }, }) } diff --git a/websocket_server/roomData.js b/websocket_server/roomData.js index cd88517..3f77bce 100644 --- a/websocket_server/roomData.js +++ b/websocket_server/roomData.js @@ -8,7 +8,7 @@ dotenv.config() const { NEXTCLOUD_URL = 'http://nextcloud.local', ADMIN_USER = 'admin', - ADMIN_PASS = 'admin' + ADMIN_PASS = 'admin', } = process.env export const roomDataStore = {} @@ -16,7 +16,7 @@ export const roomDataStore = {} const fetchOptions = (method, token, body = null) => { const headers = { 'Content-Type': 'application/json', - Authorization: `Bearer ${token}` + Authorization: `Bearer ${token}`, } if (method === 'PUT') { @@ -26,7 +26,7 @@ const fetchOptions = (method, token, body = null) => { return { method, headers, - ...(body && { body: JSON.stringify(body) }) + ...(body && { body: JSON.stringify(body) }), } } diff --git a/websocket_server/server.js b/websocket_server/server.js index 4728163..2e90ade 100644 --- a/websocket_server/server.js +++ b/websocket_server/server.js @@ -16,14 +16,14 @@ const { PORT = 3002, TLS, TLS_KEY: keyPath, - TLS_CERT: certPath + TLS_CERT: certPath, } = process.env const FORCE_CLOSE_TIMEOUT = 60 * 60 * 1000 const readTlsCredentials = (keyPath, certPath) => ({ key: keyPath ? fs.readFileSync(keyPath) : undefined, - cert: certPath ? fs.readFileSync(certPath) : undefined + cert: certPath ? fs.readFileSync(certPath) : undefined, }) const createConfiguredServer = (app) => { diff --git a/websocket_server/socket.js b/websocket_server/socket.js index 5acdb24..f1c30bf 100644 --- a/websocket_server/socket.js +++ b/websocket_server/socket.js @@ -10,7 +10,7 @@ dotenv.config() const { NEXTCLOUD_URL = 'http://nextcloud.local', - JWT_SECRET_KEY + JWT_SECRET_KEY, } = process.env const verifyToken = (token) => new Promise((resolve, reject) => { @@ -31,8 +31,8 @@ export const initSocket = (server) => { cors: { origin: NEXTCLOUD_URL, methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], - credentials: true - } + credentials: true, + }, }) io.use(socketAuthenticateHandler) @@ -90,7 +90,7 @@ const joinRoomHandler = async (socket, io, roomID) => { io.in(roomID).emit('room-user-change', sockets.map((s) => ({ socketId: s.id, - user: s.decodedData.user + user: s.decodedData.user, }))) } @@ -114,8 +114,8 @@ const serverVolatileBroadcastHandler = (socket, roomID, encryptedData) => { type: 'MOUSE_LOCATION', payload: { ...payload.payload, - user: socket.decodedData.user - } + user: socket.decodedData.user, + }, } const encodedEventData = convertStringToArrayBuffer(JSON.stringify(eventData)) @@ -139,7 +139,7 @@ const disconnectingHandler = async (socket, io) => { if (otherClients.length > 0) { socket.broadcast.to(roomID).emit('room-user-change', otherClients.map((s) => ({ socketId: s.id, - user: s.decodedData.user + user: s.decodedData.user, }))) } }