# discovery-swarm-stream

> Proxy discovery over a stream

Latest version **2.1.1** (published 2019-05-27) · MIT license · 0 weekly downloads

## Install

```sh
npm install discovery-swarm-stream
pnpm add discovery-swarm-stream
yarn add discovery-swarm-stream
bun add discovery-swarm-stream
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.1.1 |
| Published | 2019-05-27 |
| First published | 2019-01-31 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 8 |
| Unpacked size | 23.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 17 |
| Author | rangermauve |
| Maintainers | rangermauve |
| Keywords | dat, swarm, dns, discovery, beaker |

## Links

- npm: https://www.npmjs.com/package/discovery-swarm-stream
- Repository: https://github.com/RangerMauve/discovery-swarm-stream
- Homepage: https://github.com/RangerMauve/discovery-swarm-stream#readme
- Issues: https://github.com/RangerMauve/discovery-swarm-stream/issues
- npm.io page: https://npm.io/package/discovery-swarm-stream

## Dependencies (8)

- [pump](https://npm.io/package/pump.md) ^3.0.0
- [debug](https://npm.io/package/debug.md) ^4.1.1
- [hyperdiscovery](https://npm.io/package/hyperdiscovery.md) ^9.0.0
- [readable-stream](https://npm.io/package/readable-stream.md) ^2.3.6
- [sodium-universal](https://npm.io/package/sodium-universal.md) ^2.0.0
- [length-prefixed-stream](https://npm.io/package/length-prefixed-stream.md) ^1.6.0
- [length-prefixed-message](https://npm.io/package/length-prefixed-message.md) ^3.0.3
- [protocol-buffers-encodings](https://npm.io/package/protocol-buffers-encodings.md) ^1.1.0

## Alternatives

- [@regle/core](https://npm.io/package/@regle/core.md) — 47.0K weekly downloads
- [typeof-arguments](https://npm.io/package/typeof-arguments.md) — 12.5K weekly downloads
- [@lokalise/projects-engine-contracts](https://npm.io/package/@lokalise/projects-engine-contracts.md) — 978 weekly downloads
- [@osjwnpm/nam-laboriosam-quibusdam](https://npm.io/package/@osjwnpm/nam-laboriosam-quibusdam.md) — 70 weekly downloads
- [@oridune/validator](https://npm.io/package/@oridune/validator.md) — 16 weekly downloads

## Recent versions

- 2.1.1 (latest) — 2019-05-27
- 2.1.0 — 2019-05-27
- 2.0.0 — 2019-04-30
- 1.1.5 — 2019-03-20
- 1.1.4 — 2019-03-20
- 1.1.3 — 2019-03-18
- 1.1.2 — 2019-03-18
- 1.1.1 — 2019-03-18
- 1.1.0 — 2019-03-18
- 1.0.0 — 2019-01-31

## README

# Discovery Swarm Stream

Alows clients to use [discovery-channel](https://github.com/maxogden/discovery-channel) to discover and connect to peers.

Clients connect to the server, search for "discovery keys", and the proxy automatically discovers and connects to peers and then proxies those connections to the client.

If two clients are discovering the same key, the proxy can connect them to each other if you set the `connectExistingClients` on the server.

By default it supports connections for the [hypercore-protocol](https://github.com/mafintosh/hypercore-protocol) used in [Dat](https://datproject.org/). If you'd like to support a different protocol, provide a `stream` argument that conforms to what's expected in [discovery-swarm](https://www.npmjs.com/package/discovery-swarm#var-sw--swarmopts).

Requires:

- ES6 classes
- Arrow functions
- Weak Sets (server only)

## Example

```javascript
// On a server
const DSS = require('discovery-swarm-stream/server')

const swarm = new DSS({
	// Hash topics through sha1 before passing them through
	defaultHash: false,

	// Use the default discovery-swarm handshaking
	defaultHandshake: false,

	// swarm options here
	// Doesn't support UTP for now
})

const httpServer = require('http').createServer()
httpServer.listen(4200)

const server = require('websocket-stream').createServer({server: httpServer}, (ws) => {
	swarm.handleConnection(ws)
})

// On a client
const DSS = require('discovery-swarm-stream/client')
const websocket = require('websocket-stream')

const socket = websocket('ws://localhost:4200')

const swarm = new DSS({
	connection: socket,
	stream: (connection) => connection.write('hello!')
})

swarm.join('wowcool')

swarm.leave('wowcool')

// If you want to add auto-reconnect logic
swarm.on('disconnected', () => {
	swarm.reconnect(websocket('ws://localhost:4200'))
})

setTimeout(() => {
	swarm.close()
}, 10000)
```

Check out `demo/index.js` for an example of how this can be used with hyperdrive.

### Protocol

Sent to the server
- connect
- join(discoveryKey)
- leave(discoveryKey)

Sent from the server
- streamOpen(streamID)

Sent from either end
- streamData(streamId, data)
- streamClose(streamId)

### Behind the scenes
- Take a discovery-swarm instance
- When getting a new connection
	- Find out how many clients want it's advertising keys
	- If only one exists, proxy the connection to it
	- I multiples exist, create new connections per client and proxy them
- Client side will get streams and should do handshaking on them themselves

---
_Source: https://npm.io/package/discovery-swarm-stream · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
