diff --git a/tracker/tracker-assist/package-lock.json b/tracker/tracker-assist/package-lock.json index 45f467ba7..db1a0b7e2 100644 --- a/tracker/tracker-assist/package-lock.json +++ b/tracker/tracker-assist/package-lock.json @@ -1,6 +1,6 @@ { "name": "@openreplay/tracker-assist", - "version": "3.5.0", + "version": "3.5.1-beta.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index bb2edd4ab..358bc3b40 100644 --- a/tracker/tracker-assist/package.json +++ b/tracker/tracker-assist/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-assist", "description": "Tracker plugin for screen assistance through the WebRTC", - "version": "3.5.0", + "version": "3.5.2", "keywords": [ "WebRTC", "assistance", diff --git a/tracker/tracker-assist/src/Assist.ts b/tracker/tracker-assist/src/Assist.ts index f9e010559..96f3f1997 100644 --- a/tracker/tracker-assist/src/Assist.ts +++ b/tracker/tracker-assist/src/Assist.ts @@ -18,6 +18,7 @@ export interface Options { onAgentConnect: () => ((()=>{}) | void), onCallStart: () => ((()=>{}) | void), session_calling_peer_key: string, + session_control_peer_key: string, callConfirm: ConfirmOptions, controlConfirm: ConfirmOptions, @@ -58,6 +59,7 @@ export default class Assist { ) { this.options = Object.assign({ session_calling_peer_key: "__openreplay_calling_peer", + session_control_peer_key: "__openreplay_control_peer", config: null, onCallStart: ()=>{}, onAgentConnect: ()=>{}, @@ -103,7 +105,8 @@ export default class Assist { "peerId": peerID, "identity": "session", "sessionInfo": JSON.stringify(this.app.getSessionInfo()), - } + }, + transports: ["websocket"], }) socket.onAny((...args) => app.debug.log("Socket:", ...args)) @@ -125,37 +128,53 @@ export default class Assist { this.assistDemandedRestart = true this.app.stop(); this.app.start().then(() => { this.assistDemandedRestart = false }) + const storedControllingAgent = sessionStorage.getItem(this.options.session_control_peer_key) + if (storedControllingAgent !== null && ids.includes(storedControllingAgent)) { + grantControl(storedControllingAgent) + socket.emit("control_granted", storedControllingAgent) + } else { + sessionStorage.removeItem(this.options.session_control_peer_key) + } }) let confirmRC: ConfirmWindow | null = null const mouse = new Mouse() // TODO: lazy init let controllingAgent: string | null = null - function releaseControl() { - confirmRC?.remove() - mouse.remove() - controllingAgent = null - } - socket.on("request_control", (id: string) => { + const requestControl = (id: string) => { if (controllingAgent !== null) { socket.emit("control_rejected", id) return } - controllingAgent = id + controllingAgent = id // TODO: more explicit pending state confirmRC = new ConfirmWindow(controlConfirmDefault(this.options.controlConfirm)) confirmRC.mount().then(allowed => { - if (allowed) { // TODO: per agent id - mouse.mount() + if (allowed) { + grantControl(id) socket.emit("control_granted", id) } else { releaseControl() socket.emit("control_rejected", id) } }).catch() - }) + } + const grantControl = (id: string) => { + controllingAgent = id + mouse.mount() + sessionStorage.setItem(this.options.session_control_peer_key, id) + } + const releaseControl = () => { + confirmRC?.remove() + mouse.remove() + controllingAgent = null + sessionStorage.removeItem(this.options.session_control_peer_key) + } + socket.on("request_control", requestControl) socket.on("release_control", (id: string) => { if (controllingAgent !== id) { return } releaseControl() }) + + socket.on("scroll", (id, d) => { id === controllingAgent && mouse.scroll(d) }) socket.on("click", (id, xy) => { id === controllingAgent && mouse.click(xy) }) socket.on("move", (id, xy) => { id === controllingAgent && mouse.move(xy) }) diff --git a/tracker/tracker-assist/tsconfig.json b/tracker/tracker-assist/tsconfig.json index 95d4f9408..bb8f6a4c4 100644 --- a/tracker/tracker-assist/tsconfig.json +++ b/tracker/tracker-assist/tsconfig.json @@ -5,7 +5,7 @@ "alwaysStrict": true, "target": "es6", "module": "es6", - "moduleResolution": "nodenext", + "moduleResolution": "node", "allowSyntheticDefaultImports": true, "declaration": true, "outDir": "./lib"