Home Reference Source Repository

src/lib/network/ipfs-star.js

import { encode } from 'bs58';
import { netPrefix } from './../../params'
// TODO: rename to client
global.peerset = new Map();
/**
 * removes peer from peerset
 */
const peerdisconnect = message => {
  global.peerset.delete(message.from);
}

/**
 * removes peer from peerset
 */
const peerconnect = message => {
  global.peerset.set(message.from, message.data.toString());
}

/**
 * @param {method} options.subscribe pubsub subscriber
 * @param {method} options.publish pubsub publisher
 */
export default (address, pubsub) => {
	if (!pubsub && !global.ipfs) throw Error('pubsub client not found');
	else if (!pubsub && global.ipfs) pubsub = global.ipfs.pubsub;
	const {subscribe, publish, unsubscribe} = pubsub;
  const peers = message => {
    subscribe(encode(Buffer.from(`${netPrefix}peernet-peer-connect`)), peerconnect);
    JSON.parse(message.data.toString()).forEach(peer => {
      peerset.set(peer[0], peer[1]);
    })
  	unsubscribe(encode(Buffer.from(`${netPrefix}peernet-peers`)), () => {});
  };
	subscribe(encode(Buffer.from(`${netPrefix}peernet-peers`)), peers);
  subscribe(encode(Buffer.from(`${netPrefix}peernet-peer-disconnect`)), peerdisconnect);
  // let the network know there is a new peer
	setTimeout(function () {
    publish(encode(Buffer.from(`${netPrefix}peernet`)), new Buffer(address));
  }, 500);
	return {
		stop: async () => {
	    publish(encode(Buffer.from(`${netPrefix}peernet-peer-disconnect`)), Buffer(address));
		},
    peers: () => peerset
	};
};