{
  "version": 3,
  "sources": ["../../../src/home/runner/work/dxos/dxos/packages/core/mesh/network-generator/src/index.ts", "../../../src/home/runner/work/dxos/dxos/packages/core/mesh/network-generator/src/network.ts", "../../../src/home/runner/work/dxos/dxos/packages/core/mesh/network-generator/src/network-generator.ts"],
  "sourcesContent": ["//\n// Copyright 2021 DXOS.org\n//\n\nexport * from './network';\nexport * from './network-generator';\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport eos from 'end-of-stream';\nimport { EventedType } from 'ngraph.events';\nimport createGraph, { Graph } from 'ngraph.graph';\nimport assert from 'node:assert';\nimport { EventEmitter } from 'node:events';\nimport { PassThrough, Stream } from 'node:stream';\n\nimport { PublicKey } from '@dxos/keys';\n\nexport interface CreateStreamOptions {\n  initiator?: boolean;\n  topic?: Buffer;\n  channel?: Buffer;\n  options?: any;\n}\n\nexport interface Peer {\n  id: Buffer;\n  createStream?: (options: CreateStreamOptions) => Stream; // TODO(burdon): streamx?\n}\n\ninterface Connection {\n  fromPeer: Peer;\n  toPeer: Peer;\n  stream: Stream;\n}\n\n/**\n * @param id Random buffer of 32 bytes to represent the id of the peer\n */\ntype CreatePeerCallback = (id: Buffer) => Promise<Peer>;\n\n/**\n *\n * @param fromPeer Peer initiator of the connection\n * @param toPeer Peer target\n */\ntype CreateConnectionCallback = (fromPeer: Peer, toPeer: Peer) => Promise<Stream | undefined>;\n\n/**\n * Class helper to generate random buffer ids based on a number.\n */\nexport class IdGenerator {\n  private _ids = new Map();\n\n  get(id: any) {\n    if (this._ids.has(id)) {\n      return this._ids.get(id);\n    }\n\n    const newId = PublicKey.random().asBuffer();\n    this._ids.set(id, newId);\n    return newId;\n  }\n}\n\nexport interface NetworkOptions {\n  createPeer?: CreatePeerCallback;\n  createConnection?: CreateConnectionCallback;\n}\n\nexport class Network extends EventEmitter {\n  private _createPeer: CreatePeerCallback;\n  private _createConnection: CreateConnectionCallback;\n  private _connectionsOpening: Map<any, any>;\n  private _graph: Graph<any, any> & EventedType;\n\n  constructor(options: NetworkOptions = {}) {\n    super();\n\n    const { createPeer = (id) => ({ id }), createConnection = () => new PassThrough() } = options;\n\n    this._createPeer = async (...args) => createPeer(...args);\n    this._createConnection = async (...args) => createConnection(...args);\n    this._graph = createGraph();\n    this._graph.on('changed', (changes: any) => {\n      changes.forEach(async ({ changeType, node, link }: any) => {\n        if (changeType === 'update') {\n          return;\n        }\n        const type = changeType === 'add' ? 'added' : 'deleted';\n        const ev = `${node ? 'peer' : 'connection'}-${type}`;\n        this.emit(ev, node ? await node.data : await link.data);\n      });\n    });\n    this._connectionsOpening = new Map();\n  }\n\n  get graph() {\n    return this._graph;\n  }\n\n  get peers() {\n    const peers: Peer[] = [];\n    this._graph.forEachNode((node: any) => {\n      peers.push(node.data);\n    });\n    return peers;\n  }\n\n  get connections() {\n    const connections: Connection[] = [];\n    this._graph.forEachLink((link: any) => {\n      const fromPeer = this._graph.getNode(link.fromId)?.data;\n      const toPeer = this._graph.getNode(link.toId)?.data;\n      connections.push({ fromPeer, toPeer, stream: link.data });\n    });\n    return connections;\n  }\n\n  get connectionsOpening(): Promise<any>[] {\n    return Array.from(this._connectionsOpening.values());\n  }\n\n  /**\n   * Add a new peer supplied by the caller to the network\n   */\n  // TOOD(dboreham): better method name?\n  insertPeer(peer: Peer) {\n    assert(peer);\n    assert(Buffer.isBuffer(peer.id));\n    this._graph.addNode(peer.id.toString('hex'), peer);\n  }\n\n  /**\n   * Add a new peer to the network\n   */\n  async addPeer(id: Buffer): Promise<Peer> {\n    assert(Buffer.isBuffer(id));\n\n    const peer = this._createPeer(id)\n      .then((peer) => {\n        if (!Buffer.isBuffer(peer.id)) {\n          throw new Error('createPeer expect to return an object with an \"id\" buffer prop');\n        }\n\n        node.data = peer;\n        return peer;\n      })\n      .catch((err) => {\n        this._graph.removeNode(id.toString('hex'));\n        throw err;\n      });\n\n    const node = this._graph.addNode(\n      id.toString('hex'),\n      peer.catch(() => {})\n    );\n\n    return peer;\n  }\n\n  /**\n   * Add a new connection to the network\n   */\n  async addConnection(from: Buffer, to: Buffer, conn?: Connection): Promise<Connection> {\n    assert(Buffer.isBuffer(from));\n    assert(Buffer.isBuffer(to));\n\n    const fromHex = from.toString('hex');\n    const toHex = to.toString('hex');\n    const nonce = PublicKey.random().toHex();\n    const id = `${fromHex}-${toHex}-${nonce}`;\n\n    const connection = this._addConnection(from, to, conn).finally(() => {\n      this._connectionsOpening.delete(id);\n    });\n    this._connectionsOpening.set(id, connection);\n    return connection;\n  }\n\n  /**\n   * Delete a peer\n   */\n  deletePeer(id: Buffer) {\n    assert(Buffer.isBuffer(id));\n\n    const idHex = id.toString('hex');\n\n    if (!this._graph.hasNode(idHex)) {\n      throw new Error(`Peer ${idHex} not found`);\n    }\n\n    const promises: Promise<any>[] = [];\n    this._graph.forEachLinkedNode(\n      idHex,\n      (_: any, link: any) => {\n        promises.push(this._destroyLink(link));\n      },\n      false\n    );\n    this._graph.removeNode(idHex);\n    return Promise.all(promises);\n  }\n\n  /**\n   * Delete a connection\n   */\n  deleteConnection(from: Buffer, to: Buffer) {\n    const fromHex = from.toString('hex');\n    const toHex = to.toString('hex');\n\n    const promises: Promise<any>[] = [];\n    this._graph.forEachLinkedNode(\n      fromHex,\n      (_: any, link: any) => {\n        if (link.fromId === fromHex && link.toId === toHex) {\n          promises.push(this._destroyLink(link));\n        }\n      },\n      false\n    );\n\n    return Promise.all(promises);\n  }\n\n  /**\n   * Destroy all the peers and connections related\n   */\n  async destroy() {\n    return Promise.all(this.peers.map((peer) => this.deletePeer(peer.id)));\n  }\n\n  async _addConnection(from: Buffer, to: Buffer, conn?: Connection) {\n    const fromHex = from.toString('hex');\n    const toHex = to.toString('hex');\n\n    const fromPeer = await this._getPeerOrCreate(from);\n    const toPeer = await this._getPeerOrCreate(to);\n\n    const connection = (async () => conn || (await this._createConnection(fromPeer, toPeer)) || new PassThrough())()\n      .then((stream) => {\n        if (!(typeof stream === 'object' && typeof (stream as any).pipe === 'function')) {\n          throw new Error('createConnection expect to return a stream');\n        }\n\n        eos(stream as any, () => {\n          this._graph.removeLink(link);\n        });\n\n        link.data = stream;\n        return stream as Stream;\n      })\n      .catch((err) => {\n        this._graph.removeLink(link);\n        throw err;\n      });\n\n    const link = this._graph.addLink(\n      fromHex,\n      toHex,\n      connection.catch(() => {})\n    );\n\n    const stream = await connection;\n\n    return { fromPeer, toPeer, stream };\n  }\n\n  async _getPeerOrCreate(id: Buffer) {\n    if (!this._graph.hasNode(id.toString('hex'))) {\n      return this.addPeer(id);\n    }\n\n    const err = new Error('peer not found');\n    const node = this._graph.getNode(id.toString('hex'));\n    if (!node) {\n      throw err;\n    }\n\n    const peer = await node.data;\n    if (!peer) {\n      throw err;\n    }\n\n    return peer;\n  }\n\n  async _destroyLink(link: any) {\n    if (!link.data.destroyed) {\n      const p = new Promise<void>((resolve) =>\n        eos(link.data, () => {\n          resolve();\n        })\n      );\n      link.data.destroy();\n      return p;\n    }\n  }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport graphGenerators from 'ngraph.generators';\n\nimport { Event } from '@dxos/async';\n\nimport { IdGenerator, Network, NetworkOptions } from './network';\n\nexport const TOPOLOGIES = [\n  'ladder',\n  'complete',\n  'completeBipartite',\n  'balancedBinTree',\n  'path',\n  'circularLadder',\n  'grid',\n  'grid3',\n  'noLinks',\n  'cliqueCircle',\n  'wattsStrogatz'\n] as const;\n\nexport type Topology = typeof TOPOLOGIES[number];\n\ntype Generator = (...args: any) => Promise<Network>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface NetworkGenerator extends Record<Topology, Generator> {}\n\nexport class NetworkGenerator {\n  readonly error = new Event<Error>();\n  private readonly generator: any;\n\n  constructor(options: NetworkOptions = {}) {\n    const self = this; // eslint-disable-line\n    // TODO(wittjosiah): Use typing here.\n    this.generator = (graphGenerators as any).factory(() => {\n      const idGenerator = new IdGenerator();\n\n      const network = new Network(options);\n\n      return {\n        network,\n        addNode(id: any) {\n          network.addPeer(idGenerator.get(id)).catch((err) => self.error.emit(err));\n        },\n        addLink(from: Buffer, to: Buffer) {\n          network.addConnection(idGenerator.get(from), idGenerator.get(to)).catch((err) => self.error.emit(err));\n        },\n        getNodesCount() {\n          return network.graph.getNodesCount();\n        }\n      };\n    });\n\n    TOPOLOGIES.forEach((topology) => {\n      this[topology] = async (...args: any) => this.createTopology(topology, ...args);\n    });\n  }\n\n  async createTopology(topology: Topology, ...args: any): Promise<Network> {\n    const { network } = this.generator[topology](...args);\n    await Promise.all(network.peers);\n    await Promise.all(network.connectionsOpening);\n    return network;\n  }\n}\n"],
  "mappings": "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",
  "names": ["IdGenerator", "_ids", "Map", "get", "id", "has", "newId", "PublicKey", "random", "asBuffer", "set", "Network", "EventEmitter", "constructor", "options", "createPeer", "createConnection", "PassThrough", "_createPeer", "args", "_createConnection", "_graph", "createGraph", "on", "changes", "forEach", "changeType", "node", "link", "type", "ev", "emit", "data", "_connectionsOpening", "graph", "peers", "forEachNode", "push", "connections", "forEachLink", "fromPeer", "getNode", "fromId", "toPeer", "toId", "stream", "connectionsOpening", "Array", "from", "values", "insertPeer", "peer", "assert", "Buffer", "isBuffer", "addNode", "toString", "addPeer", "then", "Error", "catch", "err", "removeNode", "addConnection", "to", "conn", "fromHex", "toHex", "nonce", "connection", "_addConnection", "finally", "delete", "deletePeer", "idHex", "hasNode", "promises", "forEachLinkedNode", "_", "_destroyLink", "Promise", "all", "deleteConnection", "destroy", "map", "_getPeerOrCreate", "pipe", "eos", "removeLink", "addLink", "destroyed", "p", "resolve", "import_ngraph", "TOPOLOGIES", "NetworkGenerator", "constructor", "options", "error", "Event", "self", "generator", "graphGenerators", "factory", "idGenerator", "IdGenerator", "network", "Network", "addNode", "id", "addPeer", "get", "catch", "err", "emit", "addLink", "from", "to", "addConnection", "getNodesCount", "graph", "forEach", "topology", "args", "createTopology", "Promise", "all", "peers", "connectionsOpening"]
}
