User Services/Meta

From MozillaWiki
< User Services
Revision as of 18:17, 15 August 2013 by Rnewman (talk | contribs) (Created page with "== Context == Given that Firefox Account is a multi-service account system, and the set of services will grow and change over time, we need a small service to manage the set ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Context

Given that Firefox Account is a multi-service account system, and the set of services will grow and change over time, we need a small service to manage the set of service descriptors and allow clients to make and describe their choices.

This is one of two privileged services — privileged meaning "directly known to the account system" — the other being device management itself (very likely simply a role of the account system).

Outline

The service description system is envisioned to be a standalone service with the same availability and durability requirements as the account service. It exposes a simple API for managing three domain entities:

  • Device descriptions.
  • Service descriptions.
  • Device-service elections.

That is, by talking to the service description system, armed with canonical knowledge of connected devices (via device management, which is the source of truth for active/inactive etc.), it's possible to discover:

  • The protocol (and feature) capabilities of those connected devices.
  • The services known to implement those protocols.
  • Which services are in use by which connected devices.

Note that this service is 'not' responsible for storing service-specific data: no last-sync timestamps, no preferences for days of history, etc. The general rule of thumb is that if it changes infrequently and is useful for selecting an endpoint it lives here; if it describes the operation of a particular service it lives near that service.

This data is used to select, present, and sometimes seamlessly transition between services.

Flow

 [Auth with FxA] => (devices)
 [Query SD server] => (services and elections)
   [Decide on service and user elections]
 [Update SD server]
 [Connect to individual services]

Categories, protocols, services, and features

One can imagine a taxonomy like this:

 "Data synchronization"
   Firefox Sync 1.1
     Mozilla's Firefox Sync 1.1 service
     JoeCorp's Firefox Sync 1.1 service
   Firefox Sync 3.0
     Mozilla's Firefox Sync 3.0 service
       — supersedes Mozilla's Firefox Sync 1.1 service
 "Reading list"
   Pocket Share 1.0
     Pocket's hosted sharing service

That is: a category of related protocols that achieve a stated goal; a set of defined protocols that services (and clients) implement; and then concrete endpoints that expose that protocol.

The assumption is that services which implement a particular protocol are — to a point — interchangeable; more accurately, that any decision to use one provider over another is a personal or policy decision, not technical.

Clients are the other half of this. Shipping clients support a certain set of protocols — a set which might be extended by add-ons or future releases. They use those protocols to synchronize certain data types; for example, Sync 1.1 ships with engines for bookmarks, forms, history, etc.

Protocol selection

In short: choose the best protocol and service within the desired category, where "best" means:

  • The most features you need
  • The best overlap with your other devices
  • Not superseded by another protocol/service.

Typically this will be a trivial decision: there will be one or two services, one or two protocols, and a limited feature set. Beyond that most services are likely to be disjoint sets, so I'm not concerned about intractible set cover problems and awkward heuristics.

Protocol transition

  • Supersedes
  • Cost to transition
    • Transition itself has a cost: no flip-flopping (though directional "upgrade arrows" should prevent this anyway)
    • Distinction between one-shot and persistent, and between cleartext and encrypted
      • Easy to switch to a new Pocket API; less so for encrypted profile data.
    • Unsupported devices
    • Unsupported features
    • Reupload
    • Re-encryption

Service descriptions

Straight to the JSON:

 {"id": "daecb5b2-8235-479f-91ca-09447d4bb339",      — Or a URL?
  "v": 1,                                            — Descriptors can 'mutate' by bumping versions.
  "name": "Mozilla Sync 1.1",
  "provides": "org.mozilla.sync.1.1",
  "url": "https://auth.services.mozilla.com/",       — Protocol-specific.
  "pp": "https://services.mozilla.com/privacy-policy/",   — We'd like these included in the digest, so not metadata.
  "tos": "https://services.mozilla.com/tos/",
  "supersedes": [],
  "digest": "...", "owner": "...",                   — Some mechanism for verifying and protecting service descriptions.
  "metadata": "http://services.mozilla.com/sync-1.1/meta", — Support URL, icon bundles, descriptive text; clients can cache.
 }

Device descriptions and elections

Note that this augments the basic device info from the account service.

 {"id": ...,                — Stable identifier.
  "protocols": {
    "org.mozilla.sync.1.1": ["bookmarks", "adblockplus"],
    "org.mozilla.sync.3.0": ["bookmarks", "readinglist"],
  },
  "elections": {
    "org.mozilla.sync.1.1": {
      "service": "daecb5b2-8235-479f-91ca-09447d4bb339",      — Foreign key!
      "features": ["bookmarks"],                              — Protocol-specific; can be ignored/omitted.
    }
    "org.mozilla.sync.3.0": ...
  }
 }

Note also that this assumes that each device can elect its own datatypes — that is, each can sync a different set of data to a different service. Different user experiences can be layered on this; each device knows the other devices' elections, and can mirror them accordingly.