back to listing index

Ephemeral Hosting

[web search]
Original source (ephemeralp2p.durazo.us)
Tags: elixir p2p
Clipped on: 2016-07-28

Currently Viewing: 6

  • Connecting to websocket.
  • Connected!
  • Listening for content for hash 2bbbf21959178ef2f935e90fc60e5b6e368d27514fe305ca7dcecc32c0134838
  • Requesting content.
  • Received content for hash 2bbbf21959178ef2f935e90fc60e5b6e368d27514fe305ca7dcecc32c0134838
  • Standing by... ready to share this content!
  • Request received...
  • Content sent!
  • Connected!
  • Standing by... ready to share this content!
  • Request received...
  • Content sent!
  • Request received...
  • Content sent!
  • Request received...
  • Content sent!
  • Connected!
  • Standing by... ready to share this content!
  • Request received...
  • Content sent!
  • Request received...
  • Content sent!
  • Request received...
  • Content sent!
  • Request received...
  • Content sent!
  • Request received...
  • Content sent!
  • Connected!
  • Standing by... ready to share this content!
  • Connected!
  • Standing by... ready to share this content!
  • Request received...
  • Content sent!

This page exists only if someone is looking at it

Hi! Welcome to Ephemeral P2P. Thank you for loading this content. Your browser retrieved it from the browser of someone currently viewing this page. You're now a part of the network and someone who loads this page in the future may get it from you!

The server does not store this content anywhere, so as soon as the last person closes their browser, it's gone. You can see a count of how "healthy" the page is (how many people are viewing the content) at the top.

How does it work?

At a high level, this is what happens:

  1. From the homepage you enter the content you want to share.
  2. When you submit it, you register the SHA-256 hash of the content on the server.
  3. Your browser stands by with an open websocket to the server.
  4. When someone else visits a link "/[sha256hash]", the server tries to retrieve the content from anyone registered with that hash. The server double checks the hash of the content it gets and then passes it along to the new person.
  5. That new person now registers with the server as someone who knows the content for that hash.

But why?

Just a simple experiment to play with websockets and concurrency.

The app is built in Elixir (compiles to erlang) with the Phoenix framework, since it supports websockets out of the box. It's very "railsy" and in addition to rails-style "controllers", it has "channels" which are like controllers for websockets. Made building this thing a snap.

The app is hosted on a heroku 1X dyno and I'm hoping this hits the front page of HN to see how many concurrent connections I can squeeze out of it. Erlang is known for its concurrency, so I'd love to know how Elixir/Phoenix can serve as an alternative to my usual rails when highly concurrent solutions are needed. I plan to tweet my findings, so you can follow me (@losvedir) if you're interested in them.

Where do we go from here?

There are two aspects to this project that I've found quite interesting, that I hope people explore:

Peer-to-peer over browser websockets

Does something like this exist? I opted for P2P of HTML injected into a container div, since I didn't want to deal with the legalities of clients sharing binary files back and forth. But someone wanting to deal with DMCA and all that might have an interesting service here.

I could see this being a great alternative to something like sendfile (I think that's a thing?), or DropBox, or what have you, when you just want to send a file to a friend and it's too big for email. Big files could even be broken up into individual SHA-256'ed pieces, and the list of SHA-256 hashes could be the thing sent. The other side would then fetch each piece in turn and re-assemble.

But that's starting to sound kind of like BitTorrent... I wonder if someone could even make a web-based bittorrent client along these lines.

Content addressed web

The cool thing about the page content being represented by its SHA-256 hash is that it doesn't matter where the content comes from. If anyone sends you the content, you can verify that it's what you were looking for. This makes it well suited for peer-to-peer or otherwise distributed file serving.

Imagine essentially an archival service where all kinds of content (web pages, mp3s, videos, etc) are indexed according to their SHA-256. Hopefully this content would be distributed around the world and backed up and all that good stuff. Then if someone tweets a "hey, checkout this video I made [a2b89..]", it can be retrieved from this "global store of all content" using that hash. It's already very common to mention the SHA-256 alongside a download. Just think if you could take that and download from this service.

Wikipedia is an amazing collection of knowledge in terms of articles. It seems like it would be valuable to have a similar nonprofit service that was a repository of "notable" files.

A quick warning

I don't do any sanitization of the shared HTML content, so be wary of other links that folks may post. But I don't think it's too great of a security risk, since there's nothing private here (no https), and you shouldn't be trusting me any more than any other random internet person.

In closing...

Thanks for checking this out! Feel free to fork the repo on github and play around with it yourself!

And a big thanks to the friendly folks on the #elixir-lang IRC channel who have been very helpful in building this.

A (more) permament version of this content can be found here.