WebAPI/SimplePush: Difference between revisions
Line 186: | Line 186: | ||
GET http://push.m.o/update | GET http://push.m.o/update | ||
--- | --- | ||
{" | {"digest": "hash string", "updates": [{"channelID":"1ced595d7f6c9f60cc5c9395dc6b72aa7e1a69a7","version":"42"},{"channelID":"bf08e25861c900c3ab343670eee1873d0b724eef","version":"1"}], "expired": ["channelID1", "channelID2", ...]} | ||
<h4> POST /update </h4> | <h4> POST /update </h4> |
Revision as of 19:27, 8 January 2013
Client Side API
partial interface Navigator { PushNotification pushNotification; }; interface PushNotification : EventTarget { // registers to receive push notifications for a given topic // DOMRequest.result is a PushRegistration in case of success DOMRequest register(); // registers to stop receiving push notifications for a given topic // DOMRequest.result is a PushRegistration in case of success DOMRequest unregister(ChannelID channelID); // returns the list of all push registrations for this origin PushRegistration[] registrations(); }; interface PushRegistration { // this is the URL to which push notifications from the web application // must be sent to. // application should send this and pushRequestID as a pair to the // application server DOMString pushEndpoint; // this is the push request id that must be sent to the push server with // every push notification update DOMString channelID; }; interface PushEvent : Event { // this is topic string used when registering for push notifications DOMString channelID; // this is the most current version unsigned long long version; }
Client Example
App manifest
{ ... "permissions": { ... "push": { "description": "Check for new mail" } }, "messages": [ {"notification": "/view_to_launch.html"} {"notification-register": "/view_to_launch.html"} ] }
JavaScript
// all notifications will be sent to the system message handler. // which is up to the U/A to implement // apps can do something like // This handler may be triggered *immediately* after mozSetMessageHandler is called // so applications should ensure they are ready (UI created, state loaded etc.) navigator.mozSetMessageHandler('push-register', { handleMessage: function(e) { // (re)issue register() calls // to register to listen for a notification, // you simply call push.register navigator.pushNotifications.register(); } }); navigator.mozSetMessageHandler('push', { handleMessage: function(e) { e.channelID == This is the topic that is being observed e.version == This is the current version for this topic } }); // to unregister, you simply call.. navigator.pushNotifications.unregister(channelID);
Server API
Definitions
- UserAgent
- The client acting on behalf of the user and consumer of update notices
- UAID
- A server generated, globally unique UserAgent ID
- PushServer
- The server managing interactions between AppServers and the UserAgent
- AppServer
- The third party publisher of update notices
- Channel
- The flow of information from AppServer through PushServer to UserAgent
- ChannelID
- Globally Unique identifier for a Channel
UserAgent and AppServer will use a RESTful API to interact with the Push Server.
API
- Requests from UserAgent to PushServer MUST provide a PushServer Generated UserAgentID (UAID) as the "X-UserAgent-ID" header.
- UserAgent requests may include a /{network} prefix to indicate a request may be handled by a third party network (e.g.
GET http:host/foonet/update
will return update requests for elements provided by the "foonet" sub-provider. - Calls will return standard HTTP status headers.
- Calls will return status 200 (unless otherwise noted below).
- On Errors, calls will return a proper error code, and where permitted, a standard JSON block containing information regarding the error. The contents of this block are not intended for end user display and have yet to be finalized.
GET /register
Request a new ChannelID.
If the X-UserAgent-ID is not provided, the UserAgent is presumed to be new and a new UserAgentID will be generated for the UserAgent.
Arguments
No additional arguments are required.
Returns
{ "channelID": "New Channel ID", "uaid": "UserAgent ID" }
NOTE: The uaid is either the X-UserAgent-ID value echoed back, or a new X-UserAgent-ID value to be used for all subsequent calls if no X-UserAgent-ID was present.
Example
GET http://push.m.o/register --- {"channelID": "foo1234", "uaid": "bar5678"}
DELETE /<ChannelID>
Delete an associated ChannelID. Subsequent calls to this ChannelID will result in a 404 status.
NOTE: the X-UserAgent-ID Header must be present and match the one associated with this ChannelID
Arguments
There are no arguments for this call.
Returns
This returns an empty JSON object
{}
Example
DELETE http://push.m.o/unregister/foo1234 --- {}
GET /update
Return a list of known ChannelIDs and current versions.
NOTE: the X-UserAgent-ID must be provided and match the value returned by the /register
call.
Arguments
There are no arguments for this call.
Returns
The server should return an object with the following fields:
- digest - This will return a digest of the known ChannelIDs for the calling User Agent. This digest is used as a checksum to ensure UA and Push Server have the same state. If a mismatch occurs, it is resolved using the Registration Sync Protocol.
- updates - An association of ChannelIDs and versions that have changed since the last time the UA called /update.
- expired - A list of ChannelIDs which have expired. The UA should remove these from its own database, and ask applications to re-register.
TODO Do we need acknowledgement of the /update from the UA. It is possible for the response to be lost in flight.
NOTE: If the server is unable to determine previous data for this X-UserAgent-ID, it will return a 410 leading to the Registration Sync Protocol occurring.
See POST /update
for details.
Example
GET http://push.m.o/update --- {"digest": "hash string", "updates": [{"channelID":"1ced595d7f6c9f60cc5c9395dc6b72aa7e1a69a7","version":"42"},{"channelID":"bf08e25861c900c3ab343670eee1873d0b724eef","version":"1"}], "expired": ["channelID1", "channelID2", ...]}
POST /update
Refresh the server from the client.
This request requires a X-UserAgent-ID header. If the UserAgent attempts to POST information to the server which already has data for that X-UserAgent-ID, the server will deny the request with a 403 error. In that case, the UserAgent should request re-registration for all Channels.
Arguments
The POST body is a JSON encoded block which matches the form and structure of the GET /update/ request.
Returns
This will return an empty object.
Example
POST http://push.m.o/update {"channels":[{"channelID":"1ced595d7f6c9f60cc5c9395dc6b72aa7e1a69a7","version":"42"},{"channelID":"bf08e25861c900c3ab343670eee1873d0b724eef","version":"1"}]}
--- {}
PUT /update/<ChannelID>
Update the version of a given channel.
Arguments should be passed as standard form data (enctype: multipart/form-data) This call does not require a X-UserAgent-ID, as it may be called by the AppServer.
Arguments
version=<version>
The version is the AppServer specific VersionID to use. This ID is opaque to the PushServer, however it is suggested that:
- The ID be sequential.
- The ID be less than 100 characters.
- The ID should be UTF8 compliant.
Returns
This call returns an empty JSON object.
Example
PUT http://push.m.o/update/foo1234 version=1.3 --- {}