From 1609a6f55ac4c313d4eaedf0ca2456af03ee73b0 Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Thu, 11 Jan 2024 15:05:51 +0100 Subject: [PATCH] fix(tracker): scan node tree for canvas on start --- tracker/tracker-assist/bun.lockb | Bin 241960 -> 249605 bytes tracker/tracker-assist/package.json | 4 +- tracker/tracker-assist/src/version.ts | 2 +- tracker/tracker/src/main/app/canvas.ts | 69 +++++++++++++------------ tracker/tracker/src/main/app/nodes.ts | 4 ++ 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/tracker/tracker-assist/bun.lockb b/tracker/tracker-assist/bun.lockb index 392e5ec71e7d75f93ee5e4add61586a9ac5642ac..7136f43beb6bd0b0021b5fcda14ef1399eaf7489 100755 GIT binary patch delta 14607 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 diff --git a/tracker/tracker-assist/package.json b/tracker/tracker-assist/package.json index d4d2ba54a..363e9910c 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": "7.0.2", + "version": "7.0.4", "keywords": [ "WebRTC", "assistance", @@ -34,7 +34,7 @@ "socket.io-client": "^4.7.2" }, "peerDependencies": { - "@openreplay/tracker": "^11.0.3" + "@openreplay/tracker": "^12.0.0" }, "devDependencies": { "@openreplay/tracker": "file:../tracker", diff --git a/tracker/tracker-assist/src/version.ts b/tracker/tracker-assist/src/version.ts index afb0e758f..39847a820 100644 --- a/tracker/tracker-assist/src/version.ts +++ b/tracker/tracker-assist/src/version.ts @@ -1 +1 @@ -export const pkgVersion = '7.0.2' +export const pkgVersion = '7.0.4' diff --git a/tracker/tracker/src/main/app/canvas.ts b/tracker/tracker/src/main/app/canvas.ts index c3ed92c6f..43c809155 100644 --- a/tracker/tracker/src/main/app/canvas.ts +++ b/tracker/tracker/src/main/app/canvas.ts @@ -25,42 +25,47 @@ class CanvasRecorder { } startTracking() { + this.app.nodes.scanTree(this.handleCanvasEl) this.app.nodes.attachNodeCallback((node: Node): void => { - const id = this.app.nodes.getID(node) - if (!id) { - return - } - - const isIgnored = this.app.sanitizer.isObscured(id) || this.app.sanitizer.isHidden(id) - if (isIgnored || !hasTag(node, 'canvas') || this.snapshots[id]) { - return - } - const ts = this.app.timestamp() - this.snapshots[id] = { - images: [], - createdAt: ts, - } - const canvasMsg = CanvasNode(id.toString(), ts) - this.app.send(canvasMsg as Message) - const int = setInterval(() => { - const cid = this.app.nodes.getID(node) - const canvas = cid ? this.app.nodes.getNode(cid) : undefined - if (!canvas || !hasTag(canvas, 'canvas') || canvas !== node) { - this.app.debug.log('Canvas element not in sync') - clearInterval(int) - } else { - const snapshot = captureSnapshot(canvas, this.options.quality) - this.snapshots[id].images.push({ id: this.app.timestamp(), data: snapshot }) - if (this.snapshots[id].images.length > 9) { - this.sendSnaps(this.snapshots[id].images, id, this.snapshots[id].createdAt) - this.snapshots[id].images = [] - } - } - }, this.interval) - this.intervals.push(int) + this.handleCanvasEl(node) }) } + handleCanvasEl = (node: Node) => { + const id = this.app.nodes.getID(node) + if (!id || !hasTag(node, 'canvas')) { + return + } + + const isIgnored = this.app.sanitizer.isObscured(id) || this.app.sanitizer.isHidden(id) + if (isIgnored || !hasTag(node, 'canvas') || this.snapshots[id]) { + return + } + const ts = this.app.timestamp() + this.snapshots[id] = { + images: [], + createdAt: ts, + } + const canvasMsg = CanvasNode(id.toString(), ts) + this.app.send(canvasMsg as Message) + const int = setInterval(() => { + const cid = this.app.nodes.getID(node) + const canvas = cid ? this.app.nodes.getNode(cid) : undefined + if (!canvas || !hasTag(canvas, 'canvas') || canvas !== node) { + this.app.debug.log('Canvas element not in sync') + clearInterval(int) + } else { + const snapshot = captureSnapshot(canvas, this.options.quality) + this.snapshots[id].images.push({ id: this.app.timestamp(), data: snapshot }) + if (this.snapshots[id].images.length > 9) { + this.sendSnaps(this.snapshots[id].images, id, this.snapshots[id].createdAt) + this.snapshots[id].images = [] + } + } + }, this.interval) + this.intervals.push(int) + } + sendSnaps(images: { data: string; id: number }[], canvasId: number, createdAt: number) { if (Object.keys(this.snapshots).length === 0) { return diff --git a/tracker/tracker/src/main/app/nodes.ts b/tracker/tracker/src/main/app/nodes.ts index 3901be780..92612d2e5 100644 --- a/tracker/tracker/src/main/app/nodes.ts +++ b/tracker/tracker/src/main/app/nodes.ts @@ -16,6 +16,10 @@ export default class Nodes { this.nodeCallbacks.push(nodeCallback) } + scanTree = (cb: (node: Node | void) => void) => { + this.nodes.forEach((node) => cb(node)) + } + attachNodeListener(node: Node, type: string, listener: EventListener, useCapture = true): void { const id = this.getID(node) if (id === undefined) {