Runtime Adapters
The SDK core stays lean. It depends on fetch and accepts an injected browser-style WebSocket factory when the runtime does not provide one.
Browser
Modern browsers provide both globals:
ts
import { createSimulatorClient } from '@my-swu/simulator-client'
const simulatorClient = createSimulatorClient({
// Browsers already provide fetch and WebSocket globals.
baseUrl: 'https://simulator.example.com',
})Node
Node 18+ provides fetch, but not WebSocket:
ts
import WebSocket from 'ws'
import { createSimulatorClient } from '@my-swu/simulator-client'
import type { WebSocketFactory } from '@my-swu/simulator-client'
// `ws` gives Node the browser-style constructor the SDK expects.
const nodeWebSocketFactory: WebSocketFactory = url => new WebSocket(url)
const simulatorClient = createSimulatorClient({
baseUrl: 'http://127.0.0.1:4000',
// Required when opening match sessions from Node.
webSocketFactory: nodeWebSocketFactory,
})If you only use HTTP methods, you do not need a socket factory.
Edge runtimes
Edge runtimes vary. If fetch exists but socket APIs differ, keep HTTP calls in the edge function and open match sockets from the browser client.
Nuxt
Use one singleton client and open sockets only on the client side:
ts
import { createSimulatorClient } from '@my-swu/simulator-client'
import type { SimulatorClient } from '@my-swu/simulator-client'
let simulatorClient: SimulatorClient | undefined
export function useSimulatorClient(): SimulatorClient {
if (simulatorClient == null) {
const config = useRuntimeConfig()
// Reuse one SDK instance so resource helpers share the same config.
simulatorClient = createSimulatorClient({
baseUrl: config.public.simulatorBaseUrl,
})
}
return simulatorClient
}Call matchSession.connect() from onMounted() or a <ClientOnly> block.
