2014-05-22 10:41:40 -07:00
|
|
|
<!doctype html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
|
|
|
|
<title>Cosmopolite by flamingcowtv</title>
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="stylesheets/styles.css">
|
|
|
|
|
<link rel="stylesheet" href="stylesheets/pygment_trac.css">
|
|
|
|
|
<script src="javascripts/scale.fix.js"></script>
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
|
|
|
|
<!--[if lt IE 9]>
|
|
|
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
|
|
|
<![endif]-->
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<div class="wrapper">
|
|
|
|
|
<header>
|
|
|
|
|
<h1 class="header">Cosmopolite</h1>
|
|
|
|
|
<p class="header">Client/server publish/subscribe and key/value storage for AppEngine</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li class="download"><a class="buttons" href="https://github.com/flamingcowtv/cosmopolite/zipball/master">Download ZIP</a></li>
|
|
|
|
|
<li class="download"><a class="buttons" href="https://github.com/flamingcowtv/cosmopolite/tarball/master">Download TAR</a></li>
|
|
|
|
|
<li><a class="buttons github" href="https://github.com/flamingcowtv/cosmopolite">View On GitHub</a></li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
</header>
|
|
|
|
|
<section>
|
|
|
|
|
<h1>
|
|
|
|
|
<a name="cosmopolite" class="anchor" href="#cosmopolite"><span class="octicon octicon-link"></span></a>cosmopolite</h1>
|
|
|
|
|
|
|
|
|
|
<p>Client/server publish/subscribe and key/value storage for AppEngine.</p>
|
|
|
|
|
|
|
|
|
|
<p>Components:</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li>A server API built on the AppEngine Python framework.</li>
|
|
|
|
|
<li>A browser client library written in JavaScript.</li>
|
|
|
|
|
</ul><p>Feature overview:</p>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li>Near-realtime notification to subscribers of messages published to a "subject"</li>
|
|
|
|
|
<li>Server-side storage of past messages for replay later to clients</li>
|
|
|
|
|
<li>Support for associating a key with a message and for lookup of the most recent
|
|
|
|
|
message for a given key</li>
|
|
|
|
|
<li>Client identification persistence via localStorage tokens or in combination
|
|
|
|
|
with Google account signin</li>
|
|
|
|
|
<li>Complex messages supported via transparent JSON serialization</li>
|
|
|
|
|
<li>Server-side strict ordering of messages</li>
|
|
|
|
|
<li>Client-side message queueing in localStorage and resumption on restart</li>
|
|
|
|
|
<li>Message duplication detection and elimination</li>
|
|
|
|
|
<li>Promise support for notification of client -> server operation completion</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
<!--[if !IE]><script>fixScale(document);</script><![endif]-->
|
2014-05-22 10:44:03 -07:00
|
|
|
<script type="text/javascript">
|
|
|
|
|
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
|
|
|
|
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
|
|
|
|
</script>
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
try {
|
|
|
|
|
var pageTracker = _gat._getTracker("UA-37845853-2");
|
|
|
|
|
pageTracker._trackPageview();
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
</script>
|
|
|
|
|
|
2014-05-22 10:41:40 -07:00
|
|
|
</body>
|
|
|
|
|
</html>
|