# Interface StateRelay

All Known Implementing Classes:
  `RestStateRelay`

public interface StateRelay

Carries state between devices the platform will not carry it between -- an iPhone and an Android tablet, two devices that are never in the same room, a phone and the web build.

Codename One ships no server for this. A relay is the application's own endpoint, which is also the only honest arrangement: the relay has to know which states belong to the same person, and that is the app's account system, not the framework's. `RestStateRelay` covers the common case over HTTPS; implement this interface directly for anything else.

Both methods are called from a background thread and may block. Neither is called on the event dispatch thread, so ordinary blocking `com.codename1.io` code is correct here.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `AppState`
  `fetch()`
  Asks for the newest state this user has on any device.
  `void`
  `publish(AppState state)`
  Sends a state.

- ## Method Details

  - ### publish

    void publish(AppState state) throws IOException

    Sends a state. Called after each checkpoint, so implementations that talk to a slow endpoint should coalesce rather than send every one.

    ###### Parameters

    - `state`: the state to send

    ###### Throws

    - `java.io.IOException`: when the send failed. The framework logs it and keeps the state, which the next checkpoint's publisher sends -- unless a newer state has superseded it by then, or the user signed out in between. It is not retried on a timer: one attempt per change beats spinning against an endpoint that is down.
    Throws:
      `IOException`

  - ### fetch

    AppState fetch() throws IOException

    Asks for the newest state this user has on any device. Returning this device's own most recent state is fine and expected -- the framework recognizes its own echo by device id and sequence, and ignores it.

    ###### Returns

    the state, or null when the endpoint has nothing

    ###### Throws

    - `java.io.IOException`: when the fetch failed
    Throws:
      `IOException`