fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(replay): Ensure handleRecordingEmit aborts when event is not added - #8938

Merged
mydea merged 1 commit into
developfrom
fn/stop-addEvent
Sep 11, 2023
Merged

fix(replay): Ensure handleRecordingEmit aborts when event is not added#8938
mydea merged 1 commit into
developfrom
fn/stop-addEvent

Conversation

@mydea

@mydeamydea commented Sep 4, 2023

Copy link
Copy Markdown
Member

I noticed that in handleRecordingEmit, due to the async nature of addEvent it could happen that an event is actually not added (because it is discarded due to timestamp etc.). But we are still updating the initial session timestamp ([Replay] Updating session start time to earliest event in buffer to...), as we don't actually abort there.

This PR changes this to actually abort handleRecordingEmit in this case. I added an addEventSync method for this that just returns true/false instead of a promise, which should not change anything there as we haven't been waiting for the result of the promise anyhow.

@mydea
mydea requested a review from billyvgSeptember 4, 2023 11:57
@mydeamydea self-assigned this Sep 4, 2023
// Skip all further steps
if (!addEventSync(replay, event, isCheckout)) {
// Return true to skip scheduling a debounced flush
return true;

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This API for addUpdate is always confusing for me, I always have to double check what I should return to do what 😅 Nothing to do but maybe we can find a clearer API for this at some point.

@github-actions

github-actionsBot commented Sep 4, 2023

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize
@sentry/browser (incl. Tracing, Replay) - Webpack (gzipped)75.34 KB (-0.04% 🔽)
@sentry/browser (incl. Tracing) - Webpack (gzipped)31.29 KB (+0.06% 🔺)
@sentry/browser - Webpack (gzipped)21.89 KB (+0.07% 🔺)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (gzipped)70.04 KB (-0.08% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (gzipped)28.4 KB (-0.07% 🔽)
@sentry/browser - ES6 CDN Bundle (gzipped)20.47 KB (-0.06% 🔽)
@sentry/browser (incl. Tracing, Replay) - ES6 CDN Bundle (minified & uncompressed)221.29 KB (-0.11% 🔽)
@sentry/browser (incl. Tracing) - ES6 CDN Bundle (minified & uncompressed)85.82 KB (+0.01% 🔺)
@sentry/browser - ES6 CDN Bundle (minified & uncompressed)60.67 KB (+0.02% 🔺)
@sentry/browser (incl. Tracing) - ES5 CDN Bundle (gzipped)31.28 KB (-0.06% 🔽)
@sentry/react (incl. Tracing, Replay) - Webpack (gzipped)75.36 KB (-0.04% 🔽)
@sentry/react - Webpack (gzipped)21.92 KB (+0.07% 🔺)
@sentry/nextjs Client (incl. Tracing, Replay) - Webpack (gzipped)93.22 KB (-0.04% 🔽)
@sentry/nextjs Client - Webpack (gzipped)50.85 KB (+0.04% 🔺)

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this test as honestly I am not 100% sure what it is trying to prove/achieve 😅 it failed here due to timing issues, I first tried to change the timing etc. but ended up not really testing that much meaningful stuff.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's OK to delete this test as this is not really so relevant nowadays I think - as generally the earliest event in the buffer will be the initial timestamp that we check against...? Also this is not related to error sampled sessions anymore, at this point where a session may be stopped it is already a "session" session. Or do you want to keep this test around somehow?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was trying to explain the intention behind it -- I'm okay w/ removing it!

expect(replay).not.toHaveLastSentReplay();
});

it('does not stop replay based on earliest event in buffer', async () => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's testing that old contents in the buffer do not stop the replay recording

Comment threadpackages/replay/src/util/addEvent.ts Outdated
}
}

function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to have a unit test for this

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added tests for this!

@mydea
mydeaforce-pushed the fn/stop-addEvent branch 2 times, most recently from b828899 to 460595aCompareSeptember 11, 2023 07:51
@mydea
mydea merged commit a2ba075 into developSep 11, 2023
@mydea
mydea deleted the fn/stop-addEvent branch September 11, 2023 10:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@billyvg