Home

Awesome

nostr-mux

Multiplexed connections management for Nostr client.

import { 
  Mux, 
  Relay, 
  Personalizer,
  AutoProfileSubscriber,
  GenericProfile,
  parseGenericProfile,
} from 'nostr-mux';

// Instantiate connection for relay.
const relay1 = new Relay('wss://relay.snort.social');
const relay2 = new Relay('wss://relay.damus.io');

const mux = new Mux();

// Multiplexe them.
mux.addRelay(relay1);
mux.addRelay(relay2);

// If necessary, you can use Personalizer plugin to load and apply data of user that is specified pubkey
const personalizer = new Personalizer('<hex pubkey>', {
  contactList: { enable: true },
  relayList: { enable: true }
});

personalizer.onUpdatedContactList(contactList => {
  console.log('contact list updated', contactList);
});

mux.installPlugin(personalizer);

// If necessary, you can use automated profile subscribing plugin.
const autoProfileSubscriber = new AutoProfileSubscriber({
  parser: parseGenericProfile,
  collectPubkeyFromEvent: (e, relayURL) => {
    // DONT collect from outgoing event.
    if (!relayURL) {
      return [];
    }

    // Subscribe automatically profile for creator of note.
    return e.kind === 1 ? [e.pubkey] : [];
  }
});

mux.installPlugin(autoProfileSubscriber);

// Subscribe
mux.waitRelayBecomesHealthy(1, 3000)
  .then(ok => {
    if (!ok) {
      console.error('no healthy relays');
      return;
    }

    mux.subscribe({
      filters: [
        { kinds: [1] }
      ],

      onEvent: (e) => {
        console.log(`received event(from: ${e.relay.url})`, e.received.event);
      },

      onEose: (subID) => {
        console.log(`subscription(id: ${subID}) EOSE`);
      },

      onRecovered: (relay) => {
        console.log(`relay(${relay.url}) was added or recovered. It joins subscription`);

        return [
          { kinds: [1], since: Math.floor(Date.now() / 1000) }
        ]
      },
    })  
  });

// Whenever, we can add or remove relay.
mux.removeRelay(relay2.url);

// Get events at once
const events = [];
mux.waitRelayBecomesHealthy(1, 3000)
  .then(ok => {
    if (!ok) {
      console.error('no healthy relays');
      return;
    }

    mux.subscribe({
      filters: [
        { kinds: [1], limit: 100 }
      ],

      onEvent: (e) => events.push(e.received.event),

      onEose: (subID) => {
        mux.unSubscribe(subID);
        console.log('loaded event', events);
      },
    })  
  });

// Publish event
mux.publish(
  {
    id: '...',
    pubkey: '...',
    created_at: Math.floor(Date.now() / 1000),
    kind: 1,
    tags: [],
    content: 'hello!',
    sig: '...',
  },
  {
    onResult: (results) => {
      const accepted = results.filter(r => r.received.accepted).length;
      console.log(`event published and accepted on ${accepted}/${results.length} relays`);
    },
  }
);