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:
- From the homepage you enter the content you want to share.
- When you submit it, you register the SHA-256 hash of the content on the server.
- Your browser stands by with an open websocket to the server.
- 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.
- That new person now registers with the server as someone who knows the content for that hash.
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.
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.