Add the start of a reference page. Also add backlinks to the index.
This commit is contained in:
21
app.yaml
21
app.yaml
@@ -14,18 +14,27 @@ handlers:
|
|||||||
X-Content-Type-Options: nosniff
|
X-Content-Type-Options: nosniff
|
||||||
Strict-Transport-Security: max-age=31536000; includeSubDomains
|
Strict-Transport-Security: max-age=31536000; includeSubDomains
|
||||||
|
|
||||||
- url: /tutorial
|
- url: /overview
|
||||||
static_files: tutorial.html
|
static_files: overview.html
|
||||||
upload: tutorial.html
|
upload: overview.html
|
||||||
secure: always
|
secure: always
|
||||||
http_headers:
|
http_headers:
|
||||||
X-Frame-Options: DENY
|
X-Frame-Options: DENY
|
||||||
X-Content-Type-Options: nosniff
|
X-Content-Type-Options: nosniff
|
||||||
Strict-Transport-Security: max-age=31536000; includeSubDomains
|
Strict-Transport-Security: max-age=31536000; includeSubDomains
|
||||||
|
|
||||||
- url: /overview
|
- url: /reference
|
||||||
static_files: overview.html
|
static_files: reference.html
|
||||||
upload: overview.html
|
upload: reference.html
|
||||||
|
secure: always
|
||||||
|
http_headers:
|
||||||
|
X-Frame-Options: DENY
|
||||||
|
X-Content-Type-Options: nosniff
|
||||||
|
Strict-Transport-Security: max-age=31536000; includeSubDomains
|
||||||
|
|
||||||
|
- url: /tutorial
|
||||||
|
static_files: tutorial.html
|
||||||
|
upload: tutorial.html
|
||||||
secure: always
|
secure: always
|
||||||
http_headers:
|
http_headers:
|
||||||
X-Frame-Options: DENY
|
X-Frame-Options: DENY
|
||||||
|
|||||||
@@ -30,9 +30,10 @@
|
|||||||
<h3>Dig in</h3>
|
<h3>Dig in</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
<li style="font-weight: bold;">Try out <a href="https://playground.cosmopolite.org/">the playground</a></li>
|
||||||
<li style="font-weight: bold;">Read <a href="overview">the overview</a></li>
|
<li style="font-weight: bold;">Read <a href="overview">the overview</a></li>
|
||||||
<li style="font-weight: bold;">Read <a href="tutorial">the tutorial</a></li>
|
<li style="font-weight: bold;">Read <a href="tutorial">the tutorial</a></li>
|
||||||
<li style="font-weight: bold;">Try out <a href="https://playground.cosmopolite.org/">the playground</a></li>
|
<li style="font-weight: bold;">Read <a href="reference">the reference</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3>Components</h3>
|
<h3>Components</h3>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<header>
|
<header>
|
||||||
<h1 class="header">Cosmopolite</h1>
|
<h1 class="header"><a href="/">Cosmopolite</a></h1>
|
||||||
<p class="header">Client/server publish/subscribe, presence and key/value storage for AppEngine</p>
|
<p class="header">Client/server publish/subscribe, presence and key/value storage for AppEngine</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
338
reference.html
Normal file
338
reference.html
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||||
|
<title>Cosmopolite Reference</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="stylesheets/styles.css">
|
||||||
|
<link rel="stylesheet" href="stylesheets/pygment_trac.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="wrapper">
|
||||||
|
<header>
|
||||||
|
<h1 class="header"><a href="/">Cosmopolite</a></h1>
|
||||||
|
<p class="header">Client/server publish/subscribe, presence 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 Reference</h1>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="#terms">Terms</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#profile">Profile</a></li>
|
||||||
|
<li><a href="#client">Client</a></li>
|
||||||
|
<li><a href="#instance">Instance</a></li>
|
||||||
|
<li><a href="#channel">Channel</a></li>
|
||||||
|
<li><a href="#subject">Subject</a></li>
|
||||||
|
<li><a href="#subscription">Subscription</a></li>
|
||||||
|
<li><a href="#message">Message</a></li>
|
||||||
|
<li><a href="#pin">Pin</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li><a href="#callbacks">Callbacks</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#onConnect">onConnect</a></li>
|
||||||
|
<li><a href="#onDisconnect">onDisconnect</a></li>
|
||||||
|
<li><a href="#onLogin">onLogin</a></li>
|
||||||
|
<li><a href="#onLogout">onLogout</a></li>
|
||||||
|
<li><a href="#onMessage">onMessage</a></li>
|
||||||
|
<li><a href="#onPin">onPin</a></li>
|
||||||
|
<li><a href="#onUnpin">onUnpin</a></li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3><a name="terms">Terms</a></h3>
|
||||||
|
|
||||||
|
<h4><a name="profile">Profile</a></h4>
|
||||||
|
|
||||||
|
<p>A profile is a collection of clients that all speak as the same user, and so should appear as the
|
||||||
|
same to subscribers. Profiles are identified by a string key assigned by the server. Clients can
|
||||||
|
fetch their own profile by calling <a href="#getProfile">getProfile()</a> or
|
||||||
|
<a href="#currentProfile">currentProfile()</a>. Profile information for other users is provided
|
||||||
|
in the <i>sender</i> field of a <a href="#message">Message</a>.</p>
|
||||||
|
|
||||||
|
<p>A client keeps its profile when it logs in to a Google account, accept if that account is
|
||||||
|
already associated with a different profile. In that case, messages that were sent using the old
|
||||||
|
profile are re-assigned to the profile associated with the logged in user.</p>
|
||||||
|
|
||||||
|
<p>Logging out changes profiles.</p>
|
||||||
|
|
||||||
|
<p>The profile key is passed to Google Analytics (if enabled) as the userId, so sessions from
|
||||||
|
different clients across different browsers are associated with the same user for analytics
|
||||||
|
purposes.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="client">Client</a></h4>
|
||||||
|
|
||||||
|
<p>A client is a persistent identifier for a given browser. It is identified by a string key
|
||||||
|
generated by the client and stored in localStorage, so it is persistent across restarts (except in
|
||||||
|
incognito mode or the like). A client is associated with exactly one <a href="#profile">profile</a>
|
||||||
|
at any time, but may change associated profiles on log in.</p>
|
||||||
|
|
||||||
|
<p>Logging out generates and stores a new client key.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="instance">Instance</a></h4>
|
||||||
|
|
||||||
|
<p>An instance is a persistent identifier for a single connection to the server. It is generated
|
||||||
|
when a new Cosmopolite instance is constructed or whenever the server -> client
|
||||||
|
<a href="#channel">channel</a> connection is interrupted.</p>
|
||||||
|
|
||||||
|
<p>Instances are used to track <a href="#subscription">Subscriptions</a> and <a href="#pin">Pins</a>
|
||||||
|
which cease to exist (from the server perspective) when a client disconnects.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="channel">Channel</a></h4>
|
||||||
|
|
||||||
|
<p>A channel is the message push connection from the server to the client used to send updates. It
|
||||||
|
uses Google AppEngine's
|
||||||
|
<a href="https://developers.google.com/appengine/docs/python/channel/">Channel service</a>.</p>
|
||||||
|
|
||||||
|
<p>In addition to message passing, the channel library also provides notification of connection
|
||||||
|
state to the server. This is passed to the application code using the
|
||||||
|
<a href="#onConnect">onConnect</a> and <a href="#onDisconnect">onDisconnect</a> callbacks.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="subject">Subject</a></h4>
|
||||||
|
|
||||||
|
<p>A subject is a topic that clients publish and subscribe to. Subjects may be strings, numbers
|
||||||
|
or objects with access control information embedded. The follow are all valid <b>and different</b>
|
||||||
|
subjects:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><code>"foo"</code></li>
|
||||||
|
<li><code>5</code></li>
|
||||||
|
<li><code>{ name: "foo", readable_only_by: "XXXprofileXXX" }</code></li>
|
||||||
|
<li><code>{ name: "foo", writable_only_by: "YYYprofileYYY" }</code></li>
|
||||||
|
<li><code>{ name: "foo", readable_only_by: "XXXprofileXXX", writable_only_by: "YYYprofileYYY" }</code></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
(where XXXprofileXXX and YYYprofileYYY are profile keys)</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="subscription">Subscription</a></h4>
|
||||||
|
|
||||||
|
<p>A subscription ties an <a href="#instance">instance</a> to a <a href="#subject">subject</a> and
|
||||||
|
requests that the client be kept informed of changes to that subject. Changes that cause
|
||||||
|
notification are:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>A client sends a <a href="#message">message</a> to the subject.</li>
|
||||||
|
<li>A client adds a <a href="#pin">pin</a> to the subject.</li>
|
||||||
|
<li>A client removes a <a href="#pin">pin</a> from the subject.</li>
|
||||||
|
<li>A client which had previously added a <a href="#pin">pin</a> disconnects. This appears to an
|
||||||
|
observer as if the client had removed the pin.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
When a new subscription is established, the server sends all active pins and a client-specified
|
||||||
|
subset of historical messages to the client.</p>
|
||||||
|
|
||||||
|
<p>Subscriptions are automatically destroyed on the server side when an instance disconnects. The
|
||||||
|
client library keeps lists of subjects and the last messages seen from them and automatically
|
||||||
|
re-subscribes after reconnection. This process is transparent to application code.</p>
|
||||||
|
|
||||||
|
<p>Subscriptions are created by the application using the <a href="#subscribe">subscribe()</a>
|
||||||
|
method.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="message">Message</a></h4>
|
||||||
|
|
||||||
|
<p>A message is a piece of information sent by a <a href="#client">client</a> to a
|
||||||
|
<a href="#subject">subject</a>. It is stored by the server and transmitted to any clients currently
|
||||||
|
<a href="#subscription">subscribing</a> to that subject.</p>
|
||||||
|
|
||||||
|
<p>A message can consist of any type that is serializable in JSON: numbers, booleans, strings,
|
||||||
|
null, arrays and objects composed of these values (or of other arrays and objects). Serialization
|
||||||
|
and deserialization is handled by Cosmopolite.</p>
|
||||||
|
|
||||||
|
<p>When a message is received (via the <a href="#onMessage">onMessage callback</a> or the return
|
||||||
|
result from <a href="#getMessages">getMessages()</a> or
|
||||||
|
<a href="#getLastMessage">getLastMessage()</a>), metadata is attached, packaged into an object with
|
||||||
|
the message data itself:
|
||||||
|
|
||||||
|
<pre>{
|
||||||
|
<comment>// Server-assigned sequence number</comment>
|
||||||
|
"id": 1,
|
||||||
|
|
||||||
|
<comment>// Type may also be <a href="#pin">"pin"</a></comment>
|
||||||
|
"event_type": "message",
|
||||||
|
|
||||||
|
<comment>// Sender-assigned UUID</comment>
|
||||||
|
"sender_message_id": "cbdae48d-7a02-4850-208c-986b18121b9c",
|
||||||
|
|
||||||
|
<comment>// Canonical subject that message was sent to</comment>
|
||||||
|
"subject": {
|
||||||
|
"name": "foobar"
|
||||||
|
},
|
||||||
|
|
||||||
|
<comment>// Server-recorded UNIX timestamp that the server received the message</comment>
|
||||||
|
"created": 1402212355.0,
|
||||||
|
|
||||||
|
<comment>// Deserialized message data</comment>
|
||||||
|
"message": "test",
|
||||||
|
|
||||||
|
<comment>// <a href="#profile">Profile</a> key of sender</comment>
|
||||||
|
"sender": "XXXprofileXXX"
|
||||||
|
}</pre></p>
|
||||||
|
|
||||||
|
<p>Messages are sent by the application using the <a href="#sendMessage">sendMessage()</a>
|
||||||
|
method.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="pin">Pin</a></h4>
|
||||||
|
|
||||||
|
<p>A pin is a <a href="#message">message</a> that is deleted when the
|
||||||
|
<a href="#instance">instance</a> that sent it disconnects. Subscribers to the pin's
|
||||||
|
<a href="#subject">subject</a> are notified (via the <a href="#onPin">onPin</a> and
|
||||||
|
<a href="#onUnpin">onUnpin</a> callbacks) when it is added and deleted. This allows pins to be
|
||||||
|
used for presence detection.</p>
|
||||||
|
|
||||||
|
<p>Pins are added and deleted by the application using the <a href="#pin_method">pin()</a>
|
||||||
|
and <a href="#unpin">unpin()</a> methods.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h3><a name="callbacks">Callbacks</a></h3>
|
||||||
|
|
||||||
|
Callbacks are used by the Cosmopolite client library to notify the application of events. Callbacks
|
||||||
|
are passed to the Cosmopolite constructor in an object. The object itself and all callbacks are
|
||||||
|
optional.
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onConnect">onConnect</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments: <i>none</i></p>
|
||||||
|
|
||||||
|
<p>The onConnect callback is called when the <a href="#channel">channel</a> is established to the
|
||||||
|
server. It is paired with the <a href="#onDisconnect">onDisconnect</a> callback except when
|
||||||
|
<a href="#shutdown">shutdown()</a> is called.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onDisconnect">onDisconnect</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments: <i>none</i></p>
|
||||||
|
|
||||||
|
<p>The onDisconnect callback is called when the <a href="#channel">channel</a> is disconnected.
|
||||||
|
This can happen due to connectivity problems, server outages or periodically when the channel
|
||||||
|
expires.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onLogin">onLogin</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments:
|
||||||
|
<ol>
|
||||||
|
<li><code>username</code>: The user's Google username string.</li>
|
||||||
|
<li><code>logout_url</code>: A URL that the user can load to terminate their session. This should
|
||||||
|
be opened in a new window (using <code>target="_blank"</code>).</li>
|
||||||
|
</ol></p>
|
||||||
|
|
||||||
|
<p>The onLogin callback is called when the user logs in. It is also called after the first RPC
|
||||||
|
to the server succeeds if the user was already logged in. It is guaranteed that either onLogin
|
||||||
|
or <a href="#onLogout">onLogout</a> is called after the first RPC succeeds.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onLogout">onLogout</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments:
|
||||||
|
<ol>
|
||||||
|
<li><code>login_url</code>: A URL that the user cna load to log in to their Google account. This
|
||||||
|
should be opened in a new window (using <code>target="_blank"</code>).</li>
|
||||||
|
</ol></p>
|
||||||
|
|
||||||
|
<p>The onLogin callback is called when the user logs out or is logged out by Google. It is also
|
||||||
|
called after the first RPC to the server succeeds if the user was not already logged in. It is
|
||||||
|
guaranteed that either <a href="#onLogin">onLogin</a> or onLogout is called after the first RPC
|
||||||
|
succeeds.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onMessage">onMessage</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments:
|
||||||
|
<ol>
|
||||||
|
<li><code>message</code>: A <a href="#message">message</a> object including metadata and message
|
||||||
|
content.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>The onMessage callback is called when a historical or new message is received from the server.
|
||||||
|
It is only called for <a href="#subject">subjects</a> that the client is currently subscribed to.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>After a call to <a href="#subscribe">subscribe()</a>, onMessage fires once for each historical
|
||||||
|
message received from the server. After all historical messages have been processed, the resolve
|
||||||
|
callback for the Promise returned by subscribe() is called. Any onMessage events after that point
|
||||||
|
are for new messages.</p>
|
||||||
|
|
||||||
|
<p>Calling <a href="#subscribe">subscribe()</a> more than once may lead to additional historical
|
||||||
|
messages being retreived. onMessage will not fire twice for the same message unless
|
||||||
|
<a href="#unsubscribe">unsubscribe()</a> is called in the interim.</p>
|
||||||
|
|
||||||
|
<p>onMessage fires for messages sent by our own <a href="#profile">profile</a> and
|
||||||
|
<a href="#client">client</a>. You can filter messages by comparing their sender field to the return
|
||||||
|
value of <a href="#currentProfile">currentProfile()</a> to avoid processing your own messages.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onPin">onPin</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments:
|
||||||
|
<ol>
|
||||||
|
<li><code>message</code>: A <a href="#message">message</a> object including metadata and message
|
||||||
|
content.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>The onPin callback is called when a new pin is received from the server. It is only called for
|
||||||
|
<a href="#subject">subjects</a> that the client is currently subscribed to.</p>
|
||||||
|
|
||||||
|
<p>After a call to <a href="#subscribe">subscribe()</a>, onPin fires once for each pin already
|
||||||
|
present in the subject. After all standing pins have been processed, the resolve callback for the
|
||||||
|
Promise returned by subscribe() is called. Any onPin events after that point are for new pins.</p>
|
||||||
|
|
||||||
|
<p>onPin callbacks are paired with <a href="#onUnpin">onUnpin</a> callbacks except when
|
||||||
|
<a href="#shutdown">shutdown()</a> is called.</p>
|
||||||
|
|
||||||
|
<p>onPin fires for pins from own <a href="#profile">profile</a> and <a href="#client">client</a>.
|
||||||
|
You can filter pins by comparing their sender field to the return value of
|
||||||
|
<a href="#currentProfile">currentProfile()</a> to avoid processing your own pins.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="onUnpin">onUnpin</a></h4>
|
||||||
|
|
||||||
|
<p>Arguments:
|
||||||
|
<ol>
|
||||||
|
<li><code>message</code>: A <a href="#message">message</a> object including metadata and message
|
||||||
|
content.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>The onUnpin callback is called when a pin is deleted on from the server. It is also called when
|
||||||
|
the <a href="#channel">channel</a> disconnects from the server, hence the server state of pins is
|
||||||
|
unknown.</p>
|
||||||
|
|
||||||
|
<p>onUnpin callbacks are paired with <a href="#onPin">onPin</a> callbacks except when
|
||||||
|
<a href="#shutdown">shutdown()</a> is called.</p>
|
||||||
|
|
||||||
|
<p>onUnpin fires for pins from own <a href="#profile">profile</a> and <a href="#client">client</a>.
|
||||||
|
You can filter pins by comparing their sender field to the return value of
|
||||||
|
<a href="#currentProfile">currentProfile()</a> to avoid processing your own pins.</p>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
|
ga('create', 'UA-37845853-2', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -164,6 +164,10 @@ code, pre {
|
|||||||
font-size:14px;
|
font-size:14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comment {
|
||||||
|
color:#00f;
|
||||||
|
}
|
||||||
|
|
||||||
pre {
|
pre {
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
background: #FDFEFB;
|
background: #FDFEFB;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<header>
|
<header>
|
||||||
<h1 class="header">Cosmopolite</h1>
|
<h1 class="header"><a href="/">Cosmopolite</a></h1>
|
||||||
<p class="header">Client/server publish/subscribe, presence and key/value storage for AppEngine</p>
|
<p class="header">Client/server publish/subscribe, presence and key/value storage for AppEngine</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
@@ -83,17 +83,6 @@ cosmo.sendMessage('testsubject', 'test message');</pre></li>
|
|||||||
<li>You've written code that uses cosmopolite!</li>
|
<li>You've written code that uses cosmopolite!</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h3>Time out for concepts</h3>
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li><b>Subject</b>: a topic that clients that publish and subscribe to, e.g. "books"</li>
|
|
||||||
<li><b>Message</b>: a single chunk of data transmitted to a single subject, e.g. "I love books!"</li>
|
|
||||||
<li><b>Pin</b>: an ephemeral message that is deleted when the client that pinned it disconnects</li>
|
|
||||||
<li><b>Instance</b>: a single instantiation of Cosmopolite() in a browser (destroyed on page close)</li>
|
|
||||||
<li><b>Client</b>: a persistent identifier for a browser (consistent across browser restarts)</li>
|
|
||||||
<li><b>Profile</b>: a collection of clients that all speak as the same user (and so should appear the same to subscribers)</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<h3>Subscribe to a subject</h3>
|
<h3>Subscribe to a subject</h3>
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
|
|||||||
Reference in New Issue
Block a user