Skip to content
Open
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
29433d8
docs: add design spec for network transport fallback in isolated serv…
AlemTuzlak Mar 12, 2026
42b3beb
docs: address spec review findings for network transport fallback
AlemTuzlak Mar 12, 2026
ed6e0a7
docs: clarify dual handler paths in network transport spec
AlemTuzlak Mar 12, 2026
c1b7af1
docs: add implementation plan for network transport fallback
AlemTuzlak Mar 12, 2026
76d7711
feat: add eventId and source fields to TanStackDevtoolsEvent interface
AlemTuzlak Mar 12, 2026
b4e9e7d
feat: add server bridge WebSocket connection support to ServerEventBus
AlemTuzlak Mar 12, 2026
884ba69
feat: add source-based routing to POST handlers for server bridge sup…
AlemTuzlak Mar 12, 2026
2d2b0f0
feat: add RingBuffer utility for event ID deduplication
AlemTuzlak Mar 12, 2026
e6a3e57
feat: add network transport detection and compile-time placeholders t…
AlemTuzlak Mar 12, 2026
76907ad
feat: add WebSocket network transport fallback to EventClient
AlemTuzlak Mar 12, 2026
1b7f1a2
fix: improve WebSocket error handling and destroy cleanup in EventClient
AlemTuzlak Mar 12, 2026
f17620a
test: add end-to-end integration tests for network transport fallback
AlemTuzlak Mar 12, 2026
693e472
docs: mark network transport fallback spec as implemented
AlemTuzlak Mar 12, 2026
64ae1bb
ci: apply automated fixes
autofix-ci[bot] Mar 12, 2026
ac41406
feat: add Nitro v3 and Cloudflare Workers test examples
AlemTuzlak Mar 12, 2026
3f82eeb
Merge branch 'main' into worktree-polished-cuddling-lark
AlemTuzlak Mar 13, 2026
c61ea0f
Refactor code structure for improved readability and maintainability
AlemTuzlak Mar 27, 2026
939ac70
Merge branch 'worktree-polished-cuddling-lark' of https://github.com/…
AlemTuzlak Mar 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: add end-to-end integration tests for network transport fallback
  • Loading branch information
AlemTuzlak committed Mar 12, 2026
commit f17620adc4c0c0e44547737cb7047983ce12df16
124 changes: 124 additions & 0 deletions packages/event-bus-client/tests/integration.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// @vitest-environment node
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { ServerEventBus } from '@tanstack/devtools-event-bus/server'
import { createNetworkTransportClient } from '../src/plugin'

describe('End-to-end: ServerEventBus + EventClient network transport', () => {
let serverBus: ServerEventBus

beforeEach(() => {
globalThis.__TANSTACK_EVENT_TARGET__ = null
globalThis.__TANSTACK_DEVTOOLS_SERVER__ = null
globalThis.__TANSTACK_DEVTOOLS_WSS_SERVER__ = null
process.env.NODE_ENV = 'development'
})

afterEach(async () => {
serverBus?.stop()
globalThis.__TANSTACK_EVENT_TARGET__ = null
globalThis.__TANSTACK_DEVTOOLS_SERVER__ = null
globalThis.__TANSTACK_DEVTOOLS_WSS_SERVER__ = null
await new Promise((resolve) => setTimeout(resolve, 100))
})

it('should support bidirectional events between isolated EventClient and ServerEventBus', async () => {
// 1. Start ServerEventBus
serverBus = new ServerEventBus({ port: 0 })
const port = await serverBus.start()
const serverEventTarget = globalThis.__TANSTACK_EVENT_TARGET__!

// 2. Simulate isolation: null out globalThis
globalThis.__TANSTACK_EVENT_TARGET__ = null

// 3. Create isolated EventClient with network transport
const client = createNetworkTransportClient({
pluginId: 'e2e-test',
port,
host: 'localhost',
protocol: 'http',
})

// 4. Set up listener on the isolated client
const clientReceived = new Promise<any>((resolve) => {
client.on('from-server', (event) => resolve(event))
})

// 5. Emit from client → should reach server
const serverReceived = new Promise<any>((resolve) => {
serverEventTarget.addEventListener('e2e-test:from-client', (e) => {
resolve((e as CustomEvent).detail)
})
})

client.emit('from-client', { direction: 'client-to-server' })

// Wait for connection + delivery
const fromClient = await Promise.race([
serverReceived,
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout: client→server')), 3000)),
])

expect(fromClient.payload).toEqual({ direction: 'client-to-server' })

// 6. Now emit from server → should reach isolated client
await new Promise((resolve) => setTimeout(resolve, 200))

serverEventTarget.dispatchEvent(
new CustomEvent('tanstack-dispatch-event', {
detail: {
type: 'e2e-test:from-server',
payload: { direction: 'server-to-client' },
pluginId: 'e2e-test',
},
}),
)

const fromServer = await Promise.race([
clientReceived,
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout: server→client')), 3000)),
])

expect(fromServer.payload).toEqual({ direction: 'server-to-client' })

client.destroy()
})

it('should handle multiple isolated clients simultaneously', async () => {
serverBus = new ServerEventBus({ port: 0 })
const port = await serverBus.start()
const serverEventTarget = globalThis.__TANSTACK_EVENT_TARGET__!
globalThis.__TANSTACK_EVENT_TARGET__ = null

const client1 = createNetworkTransportClient({
pluginId: 'multi-1',
port,
host: 'localhost',
})

const client2 = createNetworkTransportClient({
pluginId: 'multi-2',
port,
host: 'localhost',
})

// Both emit, both should reach server
const received: Array<any> = []
serverEventTarget.addEventListener('multi-1:ping', (e) => {
received.push((e as CustomEvent).detail)
})
serverEventTarget.addEventListener('multi-2:ping', (e) => {
received.push((e as CustomEvent).detail)
})

client1.emit('ping', { from: 1 })
client2.emit('ping', { from: 2 })

await new Promise((resolve) => setTimeout(resolve, 2000))

expect(received.length).toBe(2)
expect(received.map((e) => e.payload.from).sort()).toEqual([1, 2])

client1.destroy()
client2.destroy()
})
})