- From: Anton Vayvod via GitHub <sysbot+gh@w3.org>
- Date: Mon, 08 Jun 2015 00:39:06 +0000
- To: public-secondscreen@w3.org
I haven't found any examples of using getRegistration() and getRegistrations() on HTML5Rocks or MDN or in the API draft. From the algorithm description linked it seems that getRegistration() is used to get a registration for ServiceWorker with a known scope URL, while getRegistrations() is an enumeration method to query all registrations available. There's also no event to notify the page when a new registration is available. IMHO, it doesn't match what's needed by the Presentation API... (get the session for the initial controller page and get the rest of them as they connect). Answers to the questions: 1. the UA could reject the Promise returned by a consequently called method or queue the promises and resolve them one by one when getting new connections. 2. in the example there's an // assert controller.state == "connecting"; meaning that the page waits for the state to become "connected" before appending the controller to its list 3. yes (it's related to the issues #34 and #32 ) 4. it seems to be redundant The questions I have about the proposed resolution: - ```getSession().then(setSession)``` seems to be redundant for the simple use case since can be expressed as ```getSessions().then(function (sessions) { setSession(sessions[0]); })``` - why is it needed then? it could be useful to distinguish between the first controller (e.g. game master) from the rest - then the page should call both ```getSession()``` and ```getSessions()``` and filter the result of the former from the results of the latter. - what does getSession() return if the initial controller has disconnected but there're some other controllers still connected? - the page will have to subscribe to the ```onsessionavailable``` after ```getSessions()``` is resolved; having a promise and an event seems to be uncommon; as discussed over availability a few times it's usually a Promise or a property (e.g. ```sessions``` and an event); we could consider an approach similar to availability in #81 ```idl partial interface NavigatorPresentation { Promise<PresentationContext> presentationContext(); } interface PresentationContext : EventTarget { readonly attribute PresentationSession[] sessions; attribute EventHandler onsessionavailable; }; ``` - the API seems to unnecessarily push a concept of a uniform array of the controllers to the page; which may not be convenient My example using the proposed resolution from F2F would look something like: ```javascript // controlling pages that successfully connected var mSessions = []; // maximum number of sessions to join the presentation var MAX_SESSIONS = 5; // announce that the page is ready to become a presentation and receive the controllers that are // already connected or connecting // NOTE: if knowning the initial controller is important, the page must first call getSession() and execute // the call below in the promise resolution handler: // var initialSession = null; // navigator.presentation.getSession().then(function (firstSession) { // initialSession = firstSession; navigator.presentation.getSessions().then(handleSessionsAdded); var handleSessionsAdded = function(sessions) { // page could get more than the maximum supported number of sessions received in getSessions() for (var i = 0; i < min(sessions.length, MAX_SESSIONS); i++) handleSessionAdded(sessions[i]); navigator.presentation.onsessionavailable = function(evt) { if (mSessions.length == MAX_SESSIONS) evt.preventDefault(); handleSessionAdded(evt.session); }; }; var handleSessionAdded = function(session) { showMessage("Session added: " + session.id); // assert session.state == "connecting"; session.onstatechange = function(e) { if (e.state == "connected") { handleSessionConnection(this) } else if (e.state == "disconnected" || e.state == "terminated") { handleSessionDisconnection(this); } }; }; var handleSessionConnection = function(session) { if (mControllers.empty()) { setUp(); } mSessions.add(sessions); session.onmessage = function(e) { showMessage("Received message " + e.msg + " from " + this.id); }; }; var handleSessionDisconnection = function(session) { mSessions.remove(session); if (mSessions.empty()) { shutDown(); } }; var setUp = function() { showMessage("The presentation is connected"); }; var shutDown = function() { showMessage("No controllers, please connect."); }; ``` -- GitHub Notif of comment by avayvod See https://github.com/w3c/presentation-api/issues/19#issuecomment-109818596
Received on Monday, 8 June 2015 00:39:11 UTC