diff --git a/src/component/internal/messages.ts b/src/component/internal/messages.ts index e2765c84..467106d1 100644 --- a/src/component/internal/messages.ts +++ b/src/component/internal/messages.ts @@ -74,9 +74,6 @@ export class NekoMessages extends EventEmitter { this[EVENT.SCREEN_UPDATED](conf.screen_size) this[EVENT.CONTROL_HOST](conf.control_host) - if (conf.cursor_image) { - this[EVENT.CURSOR_IMAGE](conf.cursor_image) - } } protected [EVENT.SYSTEM_ADMIN]({ screen_sizes_list, broadcast_status }: message.SystemAdmin) { @@ -186,20 +183,6 @@ export class NekoMessages extends EventEmitter { this.emit('room.clipboard.updated', text) } - ///////////////////////////// - // Cursor Events - ///////////////////////////// - - protected [EVENT.CURSOR_IMAGE]({ uri, width, height, x, y }: message.CursorImage) { - this._log.debug('EVENT.CURSOR_IMAGE') - Vue.set(this.state.control.cursor, 'image', { uri, width, height, x, y }) - } - - protected [EVENT.CURSOR_POSITION]({ x, y }: message.CursorPosition) { - this._log.debug('EVENT.CURSOR_IMAGE') - Vue.set(this.state.control.cursor, 'position', { x, y }) - } - ///////////////////////////// // Broadcast Events ///////////////////////////// diff --git a/src/component/internal/webrtc.ts b/src/component/internal/webrtc.ts index 8fb8eca4..8f6d4f06 100644 --- a/src/component/internal/webrtc.ts +++ b/src/component/internal/webrtc.ts @@ -23,6 +23,8 @@ export interface NekoWebRTCEvents { track: (event: RTCTrackEvent) => void candidate: (candidate: RTCIceCandidateInit) => void stats: (stats: WebRTCStats) => void + ['cursor-position']: (data: { x: number; y: number }) => void + ['cursor-image']: (data: { width: number; height: number; x: number; y: number; uri: string }) => void } export class NekoWebRTC extends EventEmitter { @@ -204,9 +206,6 @@ export class NekoWebRTC extends EventEmitter { this._channel!.send(buffer) } - // not-implemented - private onData(e: MessageEvent) {} - private onTrack(event: RTCTrackEvent) { this._log.debug(`received ${event.track.kind} track from peer: ${event.track.id}`, event) const stream = event.streams[0] @@ -229,6 +228,42 @@ export class NekoWebRTC extends EventEmitter { this._channel.onclose = this.onDisconnected.bind(this, new Error('peer data channel closed')) } + // not-implemented + private onData(e: MessageEvent) { + const payload = new DataView(e.data) + const event = payload.getUint8(0) + const length = payload.getUint16(1) + + switch (event) { + case 1: + this.emit('cursor-position', { + x: payload.getUint16(3), + y: payload.getUint16(5), + }) + break + case 2: + const data = e.data.slice(11, length - 11) + + // TODO: get string from server + const blob = new Blob([data], { type: 'image/png' }) + const reader = new FileReader() + reader.onload = (e) => { + this.emit('cursor-image', { + width: payload.getUint16(3), + height: payload.getUint16(5), + x: payload.getUint16(7), + y: payload.getUint16(9), + uri: String(e.target!.result), + }) + } + reader.readAsDataURL(blob) + + break + default: + this._log.warn(`unhandled webrtc event '${event}'.`, payload) + } + } + private onConnected() { if (!this.connected) { this._log.warn(`onConnected called while being disconnected`) diff --git a/src/component/main.vue b/src/component/main.vue index 6cff5c92..8ee2b1b8 100644 --- a/src/component/main.vue +++ b/src/component/main.vue @@ -4,7 +4,7 @@