Skip to content

Commit 43897d6

Browse files
committed
Add comprehensive message lifecycle events
1 parent 6317758 commit 43897d6

File tree

3 files changed

+77
-4
lines changed

3 files changed

+77
-4
lines changed

.changeset/orange-mayflies-sip.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@segment/analytics-next': patch
3+
'@segment/analytics-core': patch
4+
---
5+
6+
Add comprehensive message lifecycle events

packages/browser/src/browser/__tests__/inspector.integration.test.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,67 @@ describe('Inspector', () => {
5555

5656
await deliveryPromise
5757

58-
expect(enrichedFn).toHaveBeenCalledTimes(1)
58+
expect(enrichedFn).toHaveBeenCalledTimes(2)
5959
expect(deliveredFn).toHaveBeenCalledTimes(1)
6060
})
61+
62+
it('emits message enrichment events with enricher information', async () => {
63+
const [analytics] = await AnalyticsBrowser.load({
64+
writeKey,
65+
})
66+
67+
const enrichedFn = jest.fn()
68+
69+
analytics.queue.on('message_enriched', enrichedFn)
70+
71+
await analytics.register({
72+
name: 'Test plugin',
73+
version: '1.0.0',
74+
type: 'before',
75+
isLoaded: () => true,
76+
load: () => Promise.resolve(),
77+
track: (ctx) => ctx,
78+
})
79+
80+
const ctx = await analytics.track('Test event').catch(() => {})
81+
82+
expect(enrichedFn).toHaveBeenLastCalledWith(
83+
ctx,
84+
expect.objectContaining({
85+
name: 'Test plugin',
86+
type: 'before',
87+
})
88+
)
89+
})
90+
91+
it('emits expected events if before plugin throws error ', async () => {
92+
const [analytics] = await AnalyticsBrowser.load(
93+
{
94+
writeKey,
95+
},
96+
{ retryQueue: false }
97+
)
98+
99+
const failedFn = jest.fn()
100+
const deliveredFn = jest.fn()
101+
102+
analytics.queue.on('delivery_failure', failedFn)
103+
analytics.queue.on('message_delivered', deliveredFn)
104+
105+
await analytics.register({
106+
name: 'Faulty Plugin',
107+
version: '1.0.0',
108+
type: 'before',
109+
isLoaded: () => true,
110+
load: () => Promise.resolve(),
111+
track: () => {
112+
throw new Error()
113+
},
114+
})
115+
116+
await analytics.track('Faulty event')
117+
118+
expect(failedFn).toHaveBeenCalledTimes(1)
119+
expect(deliveredFn).not.toHaveBeenCalled()
120+
})
61121
})

packages/core/src/queue/event-queue.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import { isOffline } from '../connection'
1212

1313
export type EventQueueEmitterContract<Ctx extends CoreContext> = {
1414
message_delivered: [ctx: Ctx]
15-
message_enriched: [ctx: Ctx]
15+
message_enriched: [ctx: Ctx, plugin: CorePlugin<Ctx>]
1616
delivery_success: [ctx: Ctx]
17+
delivery_retry: [ctx: Ctx]
1718
delivery_failure: [ctx: Ctx, err: Ctx | Error | ContextCancelation]
1819
flush: [ctx: Ctx, delivered: boolean]
1920
}
@@ -265,6 +266,10 @@ export abstract class CoreEventQueue<
265266
throw new Error('Not ready')
266267
}
267268

269+
if (ctx.attempts > 1) {
270+
this.emit('delivery_retry', ctx)
271+
}
272+
268273
const { before, enrichment } = this.availableExtensions(
269274
ctx.event.integrations ?? {}
270275
)
@@ -274,16 +279,18 @@ export abstract class CoreEventQueue<
274279
if (temp instanceof CoreContext) {
275280
ctx = temp
276281
}
282+
283+
this.emit('message_enriched', ctx, beforeWare)
277284
}
278285

279286
for (const enrichmentWare of enrichment) {
280287
const temp = await attempt(ctx, enrichmentWare)
281288
if (temp instanceof CoreContext) {
282289
ctx = temp
283290
}
284-
}
285291

286-
this.emit('message_enriched', ctx)
292+
this.emit('message_enriched', ctx, enrichmentWare)
293+
}
287294

288295
// Enrichment and before plugins can re-arrange the deny list dynamically
289296
// so we need to pluck them at the end

0 commit comments

Comments
 (0)