node-mole-rpc icon indicating copy to clipboard operation
node-mole-rpc copied to clipboard

PeerJS transports

Open kimmobrunfeldt opened this issue 2 years ago • 2 comments

I don't have time now to put this into a proper project with autotester tests, but here's PeerJS transport adapter for anyone in need. License MIT.

PeerJsTransportClient.ts

import Peer from 'peerjs'

export type PeerJsTransportClientOptions = {
  peerConnection: Peer.DataConnection
}

export class PeerJsTransportClient {
  peerConnection: Peer.DataConnection

  constructor({ peerConnection }: PeerJsTransportClientOptions) {
    this.peerConnection = peerConnection
  }

  onData(callback: (data: unknown) => unknown) {
    this.peerConnection.on('data', callback)
  }

  async sendData(data: unknown) {
    return this.peerConnection.send(data)
  }
}

PeerJsTransportServer.ts

import Peer from 'peerjs'

export type PeerJsTransportServerOptions = {
  peerConnection: Peer.DataConnection
}

export class PeerJsTransportServer {
  peerConnection: Peer.DataConnection

  constructor({ peerConnection }: PeerJsTransportServerOptions) {
    this.peerConnection = peerConnection
  }

  onData(callback: (data: unknown) => unknown) {
    this.peerConnection.on('data', async (reqData) => {
      const respData = await callback(reqData)
      if (!respData) return // no data means notification
      this.peerConnection.send(respData)
    })
  }
}

Usage

server

const peer = new Peer('mouse-ghost-779', {
        debug: 10,
      })

      peer.on('open', (id) => {
        console.log('host open', id)
        peer.on('connection', (conn) => {
          console.log('peer on connection')

          conn.on('open', async () => {
            console.log('conn open, start server')
            const server = new MoleServer({
              transports: [
                new PeerJsTransportServer({
                  peerConnection: conn,
                }),
              ],
            })

            server.expose({
              getGreeting(name: string) {
                return new Promise((resolve, reject) => {
                  setTimeout(() => {
                    resolve(`Hi, ${name}`)
                  }, 1000)
                })
              },
            })

            await server.run()
          })
        })
      })

      peer.on('error', (err) => console.error(err))
    }

client

const peer = new Peer({
        debug: 10,
      })
      peer.on('open', () => {
        const conn = peer.connect('mouse-ghost-779')
        conn.on('open', async () => {
          console.log('conn open')

          const client = new MoleClient({
            transport: new PeerJsTransportClient({
              peerConnection: conn,
            }),
          })

          console.log(
            'FROM CLIENT 1',
            await client.callMethod('getGreeting', ['User1'])
          )
        })

        conn.on('close', () => console.log('conn close'))
        conn.on('error', (err) => console.error(err))
      })

      peer.on('error', (err) => console.error(err))
    }

kimmobrunfeldt avatar Apr 19 '22 20:04 kimmobrunfeldt

Good idea! WebRTC p2p can be a useful transport. Thank you! Maybe someone will pick up it to finish and publish to npm.

koorchik avatar Apr 25 '22 09:04 koorchik

local stream microphone not working while share screen + system audio shared in HTML JS

Screenshot 2023-07-19 182435

Here is code HTML + JS ✅

 function startScreenShare() {
        if (screenSharing) {
            stopScreenSharing()
        }
        navigator.mediaDevices.getDisplayMedia(
            { video: { mediaSource: "screen" }, audio: true }
        ).then((stream) => {
            setScreenSharingStream(stream);
    
            screenStream = stream;
            let videoTrack = screenStream.getAudioTracks()[0];
            videoTrack.onended = () => {
                stopScreenSharing()
            }
            if (peer) {
                let sender = currentPeer.peerConnection.getSenders().find(function (s) {
                    return s.track.kind == videoTrack.kind;
                })
                sender.replaceTrack(videoTrack)
                screenSharing = true
            }
            console.log(screenStream)
        })
    }

We have tried to share screen audio. When sharing the screen, microphone and screen-sharing audio do not work together. Mic does not work when system audio is on. System audio does not working if end mic is on. please explain me what is the about issue.

priyankgandhi0 avatar Jul 20 '23 03:07 priyankgandhi0