Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion packages/replay-canvas/src/canvas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ export const _replayCanvasIntegration = ((options: Partial<ReplayCanvasOptions>
] as [number, number],
};

let currentCanvasManager: CanvasManager | undefined;
let canvasManagerResolve: (value: CanvasManager) => void;
const _canvasManager: Promise<CanvasManager> = new Promise(resolve => (canvasManagerResolve = resolve));

Expand Down Expand Up @@ -104,14 +105,19 @@ export const _replayCanvasIntegration = ((options: Partial<ReplayCanvasOptions>
}
},
});

currentCanvasManager = manager;

// Resolve promise on first call for backward compatibility
canvasManagerResolve(manager);

return manager;
},
...(CANVAS_QUALITY[quality || 'medium'] || CANVAS_QUALITY.medium),
};
},
async snapshot(canvasElement?: HTMLCanvasElement, options?: SnapshotOptions) {
const canvasManager = await _canvasManager;
const canvasManager = currentCanvasManager || (await _canvasManager);

canvasManager.snapshot(canvasElement, options);
},
Expand Down
28 changes: 28 additions & 0 deletions packages/replay-canvas/test/canvas.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,31 @@ it('has correct types', () => {
const res2 = rc.snapshot(document.createElement('canvas'));
expect(res2).toBeInstanceOf(Promise);
});

it('tracks current canvas manager across multiple getCanvasManager calls', async () => {
const rc = _replayCanvasIntegration({ enableManualSnapshot: true });
const options = rc.getOptions();

// First call - simulates initial recording session
// @ts-expect-error don't care about the normal options we need to call this with
options.getCanvasManager({});
expect(CanvasManager).toHaveBeenCalledTimes(1);

const mockManager1 = vi.mocked(CanvasManager).mock.results[0].value;
mockManager1.snapshot = vi.fn();

// Second call - simulates session refresh after inactivity or max age
// @ts-expect-error don't care about the normal options we need to call this with
options.getCanvasManager({});
expect(CanvasManager).toHaveBeenCalledTimes(2);

const mockManager2 = vi.mocked(CanvasManager).mock.results[1].value;
mockManager2.snapshot = vi.fn();

void rc.snapshot();

await new Promise(resolve => setTimeout(resolve, 0));

expect(mockManager1.snapshot).toHaveBeenCalledTimes(0);
expect(mockManager2.snapshot).toHaveBeenCalledTimes(1);
});
Loading