Skip to content

Adapter ​

Adapters provide a unified interface for communicating with relays. Adapters aren't meant to be used directly, but as an injection point for custom logic.

Core Classes ​

AbstractAdapter ​

Base class for all adapters. Handles events and cleanup.

  • send(message) - Send message to relay
  • cleanup() - Clean up resources
  • Emits AdapterEvent.Receive when messages arrive

Built-in Adapters ​

  • SocketAdapter(socket) - WebSocket relay connections
  • LocalAdapter(relay) - Local in-memory relays
  • MockAdapter(url, sendHandler) - Testing with manual control

Factory ​

getAdapter(url, context?) creates the appropriate adapter:

typescript
const adapter = getAdapter('wss://relay.example.com')
adapter.on(AdapterEvent.Receive, (message, url) => {
  console.log('Received:', message)
})
adapter.send(['REQ', 'sub1', {}])
adapter.cleanup()

Custom Adapter Example ​

Custom adapters can be created against any target:

typescript
class IPFSAdapter extends AbstractAdapter {
  constructor(private url string) {
    super()

    // Set up an IPFS connection here
  }

  get urls() { return [this.url] }
  get sockets() { return [] }

  send(message: ClientMessage) {
    // Handle messages as if the ipfs backend was a relay
  }
}

Custom adapters can also be provided to several net utilities, including publish and request:

typescript
request({
  relays: ['ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb'],
  filters: [{kinds: [1]}],
  context: {
    getAdapter: (url: string) => {
      // getAdapter optionally returns an adapter. If none is returned, the stock adapters will be used.
      if (url.startsWith('ipfs://')) {
        return new IPFSAdapter(url)
      }
    },
  },
})