Skip to content

Commit 59b8bd2

Browse files
committed
add in-flight requests test and support retrying all fetch errors
1 parent 51eb079 commit 59b8bd2

File tree

5 files changed

+78
-9
lines changed

5 files changed

+78
-9
lines changed

packages/browser-integration-tests/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"@playwright/test": "^1.28.1",
2121
"@segment/analytics-next": "workspace:^",
2222
"http-server": "14.1.1",
23-
"nock": "^13.2.9"
23+
"nock": "^13.2.9",
24+
"tslib": "^2.4.1"
2425
}
2526
}

packages/browser-integration-tests/src/segment-retries.test.ts

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { test, expect } from '@playwright/test'
1+
import { Request, test, expect } from '@playwright/test'
22
import { SettingsBuilder } from './fixtures/settings'
33
import { standaloneMock } from './helpers/standalone-mock'
44

@@ -25,9 +25,14 @@ test.describe('Standalone tests', () => {
2525
)
2626
})
2727

28-
test.skip('supports retries on page navigation', async ({ page }) => {
28+
test('supports retrying failed requests on page navigation', async ({
29+
page,
30+
}) => {
2931
// Load analytics.js
3032
await page.goto('/standalone.html')
33+
await page.evaluate(() =>
34+
window.addEventListener('pagehide', () => console.log('hidden'))
35+
)
3136
await page.evaluate(() => window.analytics.load('fake-key'))
3237

3338
// fail the 1st request
@@ -60,5 +65,55 @@ test.describe('Standalone tests', () => {
6065

6166
expect(request.method()).toBe('POST')
6267
})
68+
69+
test('supports retrying in-flight requests on page navigation', async ({
70+
page,
71+
}) => {
72+
// Load analytics.js
73+
await page.goto('/standalone.html')
74+
await page.evaluate(() =>
75+
window.addEventListener('pagehide', () => console.log('hidden'))
76+
)
77+
await page.evaluate(() => window.analytics.load('fake-key'))
78+
79+
// blackhole the request so that it stays in-flight when we reload the page
80+
await page.route(
81+
'https://api.segment.io/v1/t',
82+
async () => {
83+
// do nothing
84+
},
85+
{
86+
times: 1,
87+
}
88+
)
89+
90+
// Detect when we've seen a track request initiated by the browser
91+
const requestSent = new Promise<void>((resolve) => {
92+
const onRequest: (req: Request) => void = (req) => {
93+
if (req.url() === 'https://api.segment.io/v1/t') {
94+
page.off('request', onRequest)
95+
resolve()
96+
}
97+
}
98+
99+
page.on('request', onRequest)
100+
})
101+
102+
// trigger an event
103+
await page.evaluate(() => {
104+
void window.analytics.track('test event')
105+
})
106+
107+
await requestSent
108+
await page.reload()
109+
110+
// load analytics.js again and wait for a new request.
111+
const [request] = await Promise.all([
112+
page.waitForRequest('https://api.segment.io/v1/t'),
113+
page.evaluate(() => window.analytics.load('fake-key')),
114+
])
115+
116+
expect(request.method()).toBe('POST')
117+
})
63118
})
64119
})
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { AnalyticsSnippet } from '@segment/analytics-next'
2+
3+
declare global {
4+
interface Window {
5+
analytics: AnalyticsSnippet
6+
}
7+
}

packages/browser/src/plugins/segmentio/index.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,10 @@ export function segmentio(
103103
normalize(analytics, json, settings, integrations)
104104
)
105105
.then(() => ctx)
106-
.catch((err) => {
107-
if (err.type === 'error' || err.message === 'Failed to fetch') {
108-
buffer.pushWithBackoff(ctx)
109-
// eslint-disable-next-line @typescript-eslint/no-use-before-define
110-
scheduleFlush(flushing, buffer, segmentio, scheduleFlush)
111-
}
106+
.catch(() => {
107+
buffer.pushWithBackoff(ctx)
108+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
109+
scheduleFlush(flushing, buffer, segmentio, scheduleFlush)
112110
return ctx
113111
})
114112
.finally(() => {

yarn.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,7 @@ __metadata:
11941194
"@segment/analytics-next": "workspace:^"
11951195
http-server: 14.1.1
11961196
nock: ^13.2.9
1197+
tslib: ^2.4.1
11971198
languageName: unknown
11981199
linkType: soft
11991200

@@ -13795,6 +13796,13 @@ __metadata:
1379513796
languageName: node
1379613797
linkType: hard
1379713798

13799+
"tslib@npm:^2.4.1":
13800+
version: 2.4.1
13801+
resolution: "tslib@npm:2.4.1"
13802+
checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca
13803+
languageName: node
13804+
linkType: hard
13805+
1379813806
"tsutils@npm:^3.21.0":
1379913807
version: 3.21.0
1380013808
resolution: "tsutils@npm:3.21.0"

0 commit comments

Comments
 (0)