Skip to content

Commit 2af5f91

Browse files
fix(fastify): invoke Fastify's request listeners directly (#1386)
* fix(fastify): invoke Fastify's request listeners directly * Add changeset * Fix test * simplify * Add test for multiple listeners * Remove unneeded expect
1 parent 8ac3442 commit 2af5f91

3 files changed

Lines changed: 32 additions & 3 deletions

File tree

.changeset/three-parrots-wonder.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@gasket/plugin-fastify": patch
3+
---
4+
5+
Invoke Fastify's request listeners directly

packages/gasket-plugin-fastify/lib/create-servers.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ export default async function createServers(gasket, serverOpts) {
3636
...serverOpts,
3737
handler: async function handler(...args) {
3838
await app.ready();
39-
app.server.emit('request', ...args);
39+
// Invoke Fastify's request listeners directly instead of emitting 'request'
40+
// on app.server. Emit would cause OpenTelemetry HTTP instrumentation to
41+
// record a second "incoming request" for the same req/res (double trace).
42+
const listeners = app.server.listeners('request');
43+
for (const listener of listeners) {
44+
listener.apply(app.server, args);
45+
}
4046
}
4147
};
4248
}

packages/gasket-plugin-fastify/test/create-servers.test.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
22

3+
const mockRequestListener = vi.fn();
34
const mockApp = {
45
ready: vi.fn(),
56
server: {
6-
emit: vi.fn()
7+
emit: vi.fn(),
8+
listeners: vi.fn().mockReturnValue([mockRequestListener])
79
},
810
register: vi.fn(),
911
use: vi.fn()
@@ -55,9 +57,25 @@ describe('createServers', () => {
5557
await result.handler(request);
5658

5759
expect(mockApp.ready).toHaveBeenCalled();
58-
expect(mockApp.server.emit).toHaveBeenCalledWith('request', request);
60+
expect(mockApp.server.listeners).toHaveBeenCalledWith('request');
61+
expect(mockRequestListener).toHaveBeenCalledWith(request);
5962
});
6063

64+
it('invokes all request listeners', async function () {
65+
const listener1 = vi.fn();
66+
const listener2 = vi.fn();
67+
const listener3 = vi.fn();
68+
mockApp.server.listeners.mockReturnValue([listener1, listener2, listener3]);
69+
70+
const result = await createServers(gasket, {});
71+
const request = { mock: 'request' };
72+
const response = { mock: 'response' };
73+
await result.handler(request, response);
74+
75+
expect(listener1).toHaveBeenCalledWith(request, response);
76+
expect(listener2).toHaveBeenCalledWith(request, response);
77+
expect(listener3).toHaveBeenCalledWith(request, response);
78+
});
6179

6280
it('executes the `fastify` lifecycle', async function () {
6381
await createServers(gasket, {});

0 commit comments

Comments
 (0)