|
1 | | -import { eventWithTime } from "@rrweb/types"; |
| 1 | +import { isPromise } from "util/types"; |
2 | 2 | import { Callstack } from "./callstack"; |
3 | 3 | import * as cmds from "./commands"; |
4 | 4 | import { isGroup, normalizeCommandArgs, runWithHooks, shouldRecordSnapshots } from "./utils"; |
@@ -70,27 +70,40 @@ const runWithHistoryHooks = <T>({ session, callstack, nodeData, fn, config }: Ru |
70 | 70 | return fn(); |
71 | 71 | } |
72 | 72 |
|
| 73 | + let rrwebPromise: Promise<void> | null = null; |
| 74 | + |
| 75 | + try { |
| 76 | + const timeTravelMode = config.timeTravel.mode; |
| 77 | + const isRetry = (session.executionContext?.ctx?.attempt ?? 0) > 0; |
| 78 | + const shouldRecord = shouldRecordSnapshots(timeTravelMode, isRetry); |
| 79 | + |
| 80 | + if (shouldRecord && process.send && session.executionContext?.ctx?.currentTest) { |
| 81 | + rrwebPromise = installRrwebAndCollectEvents(session, callstack) |
| 82 | + .then(rrwebEvents => { |
| 83 | + const rrwebEventsFiltered = filterEvents(rrwebEvents); |
| 84 | + sendFilteredEvents(session, rrwebEventsFiltered); |
| 85 | + }) |
| 86 | + .catch(e => { |
| 87 | + console.warn("An error occurred during capturing snapshots in browser.", e); |
| 88 | + }); |
| 89 | + } |
| 90 | + } catch (e) { |
| 91 | + console.warn("An error occurred during capturing snapshots in browser.", e); |
| 92 | + } |
| 93 | + |
73 | 94 | return runWithHooks({ |
74 | | - before: async () => { |
75 | | - try { |
76 | | - const timeTravelMode = config.timeTravel.mode; |
77 | | - const isRetry = (session.executionContext?.ctx?.attempt ?? 0) > 0; |
78 | | - const shouldRecord = shouldRecordSnapshots(timeTravelMode, isRetry); |
79 | | - |
80 | | - let rrwebEvents: eventWithTime[] = []; |
81 | | - if (shouldRecord && process.send && session.executionContext?.ctx?.currentTest) { |
82 | | - rrwebEvents = await installRrwebAndCollectEvents(session, callstack); |
83 | | - } |
84 | | - |
85 | | - const rrwebEventsFiltered = filterEvents(rrwebEvents); |
86 | | - sendFilteredEvents(session, rrwebEventsFiltered); |
87 | | - } catch (e) { |
88 | | - console.warn("An error occurred during capturing snapshots in browser.", e); |
| 95 | + before: () => { |
| 96 | + callstack.enter(mkHistoryNode(nodeData)); |
| 97 | + }, |
| 98 | + fn: () => { |
| 99 | + const result = fn(); |
| 100 | + |
| 101 | + if (rrwebPromise && isPromise(result)) { |
| 102 | + return Promise.all([result, rrwebPromise]).then(([fnResult]) => fnResult) as T; |
89 | 103 | } |
90 | 104 |
|
91 | | - callstack.enter(mkHistoryNode(nodeData)); |
| 105 | + return result; |
92 | 106 | }, |
93 | | - fn, |
94 | 107 | after: () => callstack.leave(nodeData.key!), |
95 | 108 | error: () => callstack.markError(shouldPropagateFn), |
96 | 109 | }); |
|
0 commit comments