Skip to content

Instantly share code, notes, and snippets.

@HDegroote
Last active July 20, 2022 18:52
Show Gist options
  • Save HDegroote/cf6d3c09a1f07e8dd7b56a8f00168bde to your computer and use it in GitHub Desktop.
Save HDegroote/cf6d3c09a1f07e8dd7b56a8f00168bde to your computer and use it in GitHub Desktop.
Illustration of a hyperbee-encoding bug in the browser
// See https://github.com/hypercore-protocol/hyperbee/issues/59
// The server code creates a dht-relay and shares a hyperbee
// The client code loads a hyperbee through the relay
// The client code can be executed both from the browser and form Node
// SERVER (see below for CLIENT code)
const DHT = require("@hyperswarm/dht");
const { relay } = require("@hyperswarm/dht-relay");
const { WebSocketServer } = require("ws");
const Hyperswarm = require("hyperswarm");
const Hypercore = require("hypercore");
const Hyperbee = require("hyperbee");
const Stream = require("@hyperswarm/dht-relay/ws");
async function runServer() {
const port = 8080;
const server = new WebSocketServer({ port: port });
const dht = new DHT();
const swarm = new Hyperswarm(dht);
server.on("connection", (socket) => {
console.log("Received connection -- relaying");
relay(dht, new Stream(false, socket));
socket.send("Hello from the server over a ws, you are relayed");
});
console.log(`Running websocket server at ${server.address()}`);
const core = new Hypercore("./myBee");
const bee = new Hyperbee(core, {
keyEncoding: "utf-8",
valueEncoding: "json",
});
await core.ready();
while (core.length < 100) {
await bee.put("block #" + core.length, "value " + core.length);
}
swarm.on("connection", (socket) => core.replicate(socket));
swarm.join(core.discoveryKey, { server: true, client: false });
console.log("Key: ", core.key.toString("hex"));
console.log(`Websocket server listening at port ${port}`);
}
runServer();
// CLIENT (don't forget to fill in the key hosted by your server)
const DHT = require("@hyperswarm/dht-relay");
const Stream = require("@hyperswarm/dht-relay/ws");
const Hypercore = require("hypercore");
const ram = require("random-access-memory");
const Hyperbee = require("hyperbee");
const Hyperswarm = require("hyperswarm");
// Comment out the Websocket import to run from the browser,
// which has built-in websocket support)
const { WebSocket } = require("ws");
const key = // TODO: fill in your key
async function runClient() {
const socket = new WebSocket("ws://localhost:8080");
const stream = new Stream(true, socket);
const dht = new DHT(stream);
const core = new Hypercore(ram, key);
await core.ready();
const bee = new Hyperbee(core, {
keyEncoding: "utf-8",
valueEncoding: "json",
});
const swarm = new Hyperswarm({ dht: dht });
swarm.on("connection", (socket) => core.replicate(socket));
console.log(`Created swarm--joining on key ${key}`);
swarm.join(core.discoveryKey, { server: false, client: true });
await swarm.flush();
console.log("joined swarm -- requesting block (can take up to ~30s)");
const block0 = await bee.get("block #0");
console.log("block 0: ", block0);
}
runClient();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment