@galileocap/peer-mesh

1.3.0 • Public • Published

Peer Mesh

A wrapper for PeerJS that makes reactive peer-to-peer connections easy using Zustand.

npm install @galileocap/peer-mesh

Documentation

Quick Start

Create and initialize a store

In peerStore.js

import { PeerStore } from '@galileocap/peer-mesh';

export default const usePeerStore = new PeerStore();
usePeerStore.init({ number: 0 });

Use your data

import { usePeerStore } from './store';
import { MY_PEER } from '@galileocap/peer-mesh';

function Peer({ peer }) {
  return <p>id: {peer._id}, number: {peer.number}</p>;
}

export default function App() {
  const myPeer = usePeerStore.usePeer(MY_PEER);

  return (
    <div id='App'>
      { myPeer
        ? <Peer peer={myPeer} />
        : <p>Loading...</p>
      }
    </div>
  );
}

Connect to other peers

NOTE: You can use multiple tabs to test the perspective of multiple peers at the same time.

import { useState } from 'react';
import { usePeerStore } from './store';
import { ALL_PEERS } from '@galileocap/peer-mesh';

function Peer({ peer }) {
  return <p>id: {peer._id}, number: {peer.number}</p>;
}

function Connect({ }) {
  const [ peerId, setPeerId ] = useState('');
  const onChangePeerId = (event) => setPeerId(event.target.value);
  const onConnect = () => usePeerStore.connectTo(peerId);

  return (
    <div>
      <input onChange={onChangePeerId} value={peerId} />
      <button onClick={onConnect}>Connect</button>
    </div>
  );
}


export default function App() {
  const allPeers = usePeerStore.usePeer(ALL_PEERS);

  return (
    <div id='App'>
      <Connect />
      {allPeers.map((peer, idx) => <Peer peer={peer} key={idx} />)}
    </div>
  );
}

Update you own peer's data

And see it update in everyone's screen.

import { useState } from 'react';
import { usePeerStore } from './store';
import { ALL_PEERS } from '@galileocap/peer-mesh';

function Peer({ peer }) {
  return <p>id: {peer._id}, number: {peer.number}</p>;
}

function Connect({ }) {
  const [ peerId, setPeerId ] = useState('');
  const onChangePeerId = (event) => setPeerId(event.target.value);
  const onConnect = () => usePeerStore.connectTo(peerId);

  return (
    <div>
      <input onChange={onChangePeerId} value={peerId} />
      <button onClick={onConnect}>Connect</button>
    </div>
  );
}

export default function App() {
  const allPeers = usePeerStore.usePeer(ALL_PEERS);
  const onIncrementMyNumber = () => {
    usePeerStore.sendUpdate((myPeer) => { myPeer.number++ });
  }

  return (
    <div id='App'>
      <Connect />
      <button onClick={onIncrementMyNumber}>Increment your number</button>
      {allPeers.map((peer, idx) => <Peer peer={peer} key={idx} />)}
    </div>
  );
}

Update the shared state

import { useState } from 'react';
import { usePeerStore } from './store';
import { ALL_PEERS } from '@galileocap/peer-mesh';

function Peer({ peer }) {
  return <p>id: {peer._id}, number: {peer.number}</p>;
}

function Connect({ }) {
  const [ peerId, setPeerId ] = useState('');
  const onChangePeerId = (event) => setPeerId(event.target.value);
  const onConnect = () => usePeerStore.connectTo(peerId);

  return (
    <div>
      <input onChange={onChangePeerId} value={peerId} />
      <button onClick={onConnect}>Connect</button>
    </div>
  );
}

export default function App() {
  const allPeers = usePeerStore.usePeer(ALL_PEERS);
  const onIncrementMyNumber = () => {
    usePeerStore.sendUpdate((myPeer) => { myPeer.number++ });
  }

  const sharedNumber = usePeerStore.useShared().number;
  const onIncrementSharedNumber = () => {
    usePeerStore.sharedUpdate((sharedState) => { sharedState.number++; });
  }

  return (
    <div id='App'>
      <Connect />
      <button onClick={onIncrementMyNumber}>Increment your number</button>
      <button onClick={onIncrementSharedNumber}>Increment shared number</button>
      <p>Shared number: {sharedNumber}</p>
      {allPeers.map((peer, idx) => <Peer peer={peer} key={idx} />)}
    </div>
  );
}

Dependents (0)

Package Sidebar

Install

npm i @galileocap/peer-mesh

Weekly Downloads

1

Version

1.3.0

License

ISC

Unpacked Size

3.57 MB

Total Files

247

Last publish

Collaborators

  • galileocap