From e79734f51e3816fc19a27c3639e240556967712f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Fri, 6 Nov 2020 22:19:41 +0100 Subject: [PATCH] add state. --- src/app.vue | 2 +- src/components/canvas.vue | 34 +++++++++++++++++++++++++--------- src/types/state.ts | 11 +++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 src/types/state.ts diff --git a/src/app.vue b/src/app.vue index 1191b7e3..fbc8e904 100644 --- a/src/app.vue +++ b/src/app.vue @@ -12,7 +12,7 @@ -
+
diff --git a/src/components/canvas.vue b/src/components/canvas.vue index a0075acc..6654fb0e 100644 --- a/src/components/canvas.vue +++ b/src/components/canvas.vue @@ -9,7 +9,7 @@ :screenHeight="state.screen_size.height" :scrollSensitivity="5" :scrollInvert="true" - :isControling="true" + :isControling="state.is_controlling" /> @@ -47,6 +47,7 @@ import { NekoWebSocket } from '~/internal/websocket' import { NekoWebRTC } from '~/internal/webrtc' + import NekoState from '~/types/state' import Overlay from './overlay.vue' @Component({ @@ -60,17 +61,20 @@ @Ref('container') readonly _container!: HTMLElement @Ref('video') public readonly video!: HTMLVideoElement + private observer = new ResizeObserver(this.onResize.bind(this)) private websocket = new NekoWebSocket() private webrtc = new NekoWebRTC() - private observer = new ResizeObserver(this.onResize.bind(this)) private state = { + id: null, + display_name: null, screen_size: { - width: Number, - height: Number, - rate: Number, + width: 1280, + height: 720, + rate: 30, }, - } + is_controlling: false, + } as NekoState private websocket_state = 'disconnected' private webrtc_state = 'disconnected' @@ -108,15 +112,27 @@ this.websocket.on('message', async (event: string, payload: any) => { switch (event) { case 'signal/provide': + Vue.set(this.state, 'id', payload.id) + try { let sdp = await this.webrtc.connect(payload.sdp, payload.lite, payload.ice) - this.websocket.send('signal/answer', { sdp, displayname: 'test' }) + this.websocket.send('signal/answer', { sdp, displayname: this.state.display_name }) } catch (e) {} break case 'screen/resolution': Vue.set(this.state, 'screen_size', payload) this.onResize() break + case 'control/release': + if (payload.id === this.state.id) { + Vue.set(this.state, 'is_controlling', false) + } + break + case 'control/locked': + if (payload.id === this.state.id) { + Vue.set(this.state, 'is_controlling', true) + } + break default: console.log(event, payload) } @@ -175,7 +191,7 @@ const canvas_ratio = offsetWidth / offsetHeight // Vertical centering - if(screen_ratio > canvas_ratio) { + if (screen_ratio > canvas_ratio) { const vertical = offsetWidth / screen_ratio this._container.style.width = `${offsetWidth}px` this._container.style.height = `${vertical}px` @@ -183,7 +199,7 @@ this._container.style.marginLeft = `0px` } // Horizontal centering - else if(screen_ratio < canvas_ratio) { + else if (screen_ratio < canvas_ratio) { const horizontal = screen_ratio * offsetHeight this._container.style.width = `${horizontal}px` this._container.style.height = `${offsetHeight}px` diff --git a/src/types/state.ts b/src/types/state.ts new file mode 100644 index 00000000..ffc6843e --- /dev/null +++ b/src/types/state.ts @@ -0,0 +1,11 @@ +interface ScreenSize { + width: number + height: number + rate: number +} + +export default interface State { + id: string | null + display_name: string | null + screen_size: ScreenSize +}