Class PushWire

java.lang.Object
com.iizix.server.push.engine.http.PushWire

public final class PushWire extends Object
The version 2 wire vocabulary of POST /iizi-push/<operation>: the operation names, the member names and the closed error vocabulary of PUSH-WIRE-CONTRACT.md sections 1, 2 and 5, in one place.

This class is the server's half of a contract that has two ends. The other half is the WIRE object at the top of common/push/push.js, exposed as izPush.WIRE. PushWireAgreementTest runs the production client under Node and compares what it declares and what it sends with the lists here, so the two ends cannot drift apart unnoticed - which is how version 1's c came to mean three things. Every name the handler reads from a request, writes into a reply or answers as an error code comes from here and nowhere else; a literal wire name anywhere else in this package is a defect.

The lists are ordered as the contract orders them, so that a report or a test failure reads in the contract's order.

Author:
Christopher Mindus
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    The recipients entry that is the broadcast (section 5.6, Ruling 3).
    static final String
    The Cache-Control of every reply (section 1.2).
    static final String
    The reserved key of data the server writes (section 6.2).
    static final String
    400: the body is not a JSON object, a member is missing, of the wrong type or out of range, or X-iizi is missing or not a UUID on a device operation.
    static final String
    403: authenticated, but no group grants the operation's privilege.
    static final String
    500: anything else.
    static final String
    405: not POST.
    static final String
    409: the application is loaded but no transport can be offered for it.
    static final String
    400: the serialised notification exceeds section 6.3.
    static final String
    400: recipients is an empty array.
    static final String
    400: recipients is absent.
    static final String
    403: production server, request not on a secure port.
    static final String
    500: the subscription store failed.
    static final String
    401: no or unusable Authorization, unknown user or wrong password - one code for all of them.
    static final String
    404: app_id names an application this server has not loaded.
    static final String
    404: the path names no operation.
    static final List<String>
    The thirteen error codes, in the order of section 1.3.
    static final String
    The device UUID header, required on device operations only (section 1.1).
    static final String
    The Fetch Metadata header a Browser sets on a fetch, an XHR and a navigation to a potentially trustworthy origin (https, the loopback) and no page script can set or remove: a request carrying it is a Browser's, and its 401 carries no challenge (section 1.3).
    static final String
    The header a Browser sets on every request that is not a GET or a HEAD, over plain http to any address too, and no page script can set or remove: a request carrying it is a Browser's, and its 401 carries no challenge (section 1.3).
    static final String
    The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller).
    static final String
    The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller).
    static final String
    The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller).
    static final String
    The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller).
    static final String
    The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller).
    static final String
    The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller).
    static final int
    The default limit of list, and its ceiling.
    static final int
    The default limit of list, and its ceiling.
    static final String
    The application ID, * for the server itself (section 2.3).
    static final String
    subscriptions, count and list reply: the number matched.
    static final String
    subscribe reply: true when a new row was stored; an entry: the creation time.
    static final String
    push reply: delivered, in session or to a device.
    static final String
    reset request, administrative: the device UUID; an entry: the device UUID.
    static final String
    A failure: the code from ERRORS.
    static final String
    keys reply: the Firebase project ID.
    static final String
    A 409 reply: the FCM transport's reason.
    static final String
    subscribe request, Cordova: the FCM registration token.
    static final String
    An entry: when the device last presented itself.
    static final String
    list request: the most entries to return.
    static final String
    push reply: subscriptions matched.
    static final String
    A failure: the human text; and the push reply: the message ID (section 6.2).
    static final String
    push request: the section 6 content object.
    static final String
    list request: the first entry to return.
    static final String
    Every reply: true on success, false on failure.
    static final String
    push reply: the tally by DeliveryOutcome name.
    static final String
    push, count and list request: who is sent to; push reply: users resolved.
    static final String
    unsubscribe and reset reply: the number of rows removed.
    static final String
    subscriptions and list reply: the entries.
    static final String
    subscriptions reply: the entries whose device is the caller's.
    static final String
    push request: seconds, section 6.4.
    static final String
    The Topic, "" for the application-level subscription (section 2.4).
    static final String
    An entry: "vapid" or "fcm".
    static final String
    push request: high, normal or low, section 6.4.
    static final String
    reset request, administrative: the user name; an entry: the user name.
    static final String
    subscribe request and subscriptions entry: the client's user agent.
    static final String
    keys reply: the base64url VAPID public key; subscribe request, optional: the key a Browser subscription was made under (B-10b).
    static final String
    A 409 reply: the VAPID transport's reason.
    static final String
    subscribe request, Browser: the PushSubscription.toJSON() object.
    static final List<String>
    Every member name, in the order above.
    static final String
    Section 5.7: count what a push would match.
    static final String
    Section 5.1: the server keys of an application.
    static final String
    Section 5.8: list what a push would match.
    static final String
    Section 5.6: send a notification.
    static final String
    Section 5.4: remove every subscription of a device.
    static final String
    Section 5.2: register this device's subscription.
    static final String
    Section 5.5: this user's subscriptions.
    static final String
    Section 5.3: remove this device's subscription.
    static final List<String>
    The eight operations, in the order of section 5.0.
    static final String
    The transport value of an FCM entry.
    static final String
    The transport value of a VAPID entry.
    static final String
    The urgency values, section 6.4.
    static final String
    The urgency values, section 6.4.
    static final String
    The urgency values, section 6.4.
    static final String
    The challenge a 401 carries (RFC 7617 section 2.1), except to a Browser's request (HEADER_FETCH_MODE or HEADER_ORIGIN, section 1.3).
  • Method Summary

    Modifier and Type
    Method
    Description
    static Set<String>
    entryMembers(boolean withUserAgent)
    Gets the members of a subscription entry (section 5.5), with or without the user agent (section 5.8 omits it for every caller of list).
    static JSONObject
    iiziMembers(String messageId, String app, String topic, long sent, String server)
    Builds the server's data.iizi of a send (section 6.2): the ONE place its members are written, called by both writers - PushHttpHandler's push and the Java API's PushSendSupport.message - so that the two cannot drift apart (CC-DESIGN-PUSH-APPID-FILTER SV-2).
    static boolean
    Tells whether an operation is a device operation: X-iizi required and a database user required (section 5.0).
    static Set<String>
    replyMembers(String operation)
    Gets the members of an operation's success reply, ok included.
    static Set<String>
    Gets the request members an operation reads.
  • Field Details

    • OP_KEYS

      public static final String OP_KEYS
      Section 5.1: the server keys of an application.
      See Also:
    • OP_SUBSCRIBE

      public static final String OP_SUBSCRIBE
      Section 5.2: register this device's subscription.
      See Also:
    • OP_UNSUBSCRIBE

      public static final String OP_UNSUBSCRIBE
      Section 5.3: remove this device's subscription.
      See Also:
    • OP_RESET

      public static final String OP_RESET
      Section 5.4: remove every subscription of a device.
      See Also:
    • OP_SUBSCRIPTIONS

      public static final String OP_SUBSCRIPTIONS
      Section 5.5: this user's subscriptions.
      See Also:
    • OP_PUSH

      public static final String OP_PUSH
      Section 5.6: send a notification.
      See Also:
    • OP_COUNT

      public static final String OP_COUNT
      Section 5.7: count what a push would match.
      See Also:
    • OP_LIST

      public static final String OP_LIST
      Section 5.8: list what a push would match.
      See Also:
    • OPERATIONS

      public static final List<String> OPERATIONS
      The eight operations, in the order of section 5.0.
    • M_OK

      public static final String M_OK
      Every reply: true on success, false on failure.
      See Also:
    • M_ERROR

      public static final String M_ERROR
      A failure: the code from ERRORS.
      See Also:
    • M_MESSAGE

      public static final String M_MESSAGE
      A failure: the human text; and the push reply: the message ID (section 6.2).
      See Also:
    • M_APP_ID

      public static final String M_APP_ID
      The application ID, * for the server itself (section 2.3).
      See Also:
    • M_TOPIC

      public static final String M_TOPIC
      The Topic, "" for the application-level subscription (section 2.4).
      See Also:
    • M_USER_AGENT

      public static final String M_USER_AGENT
      subscribe request and subscriptions entry: the client's user agent.
      See Also:
    • M_VAPID_SUBSCRIPTION

      public static final String M_VAPID_SUBSCRIPTION
      subscribe request, Browser: the PushSubscription.toJSON() object.
      See Also:
    • M_FCM_TOKEN

      public static final String M_FCM_TOKEN
      subscribe request, Cordova: the FCM registration token.
      See Also:
    • M_CREATED

      public static final String M_CREATED
      subscribe reply: true when a new row was stored; an entry: the creation time.
      See Also:
    • M_REMOVED

      public static final String M_REMOVED
      unsubscribe and reset reply: the number of rows removed.
      See Also:
    • M_DEVICE

      public static final String M_DEVICE
      reset request, administrative: the device UUID; an entry: the device UUID.
      See Also:
    • M_USER

      public static final String M_USER
      reset request, administrative: the user name; an entry: the user name.
      See Also:
    • M_THIS_DEVICE

      public static final String M_THIS_DEVICE
      subscriptions reply: the entries whose device is the caller's.
      See Also:
    • M_COUNT

      public static final String M_COUNT
      subscriptions, count and list reply: the number matched.
      See Also:
    • M_SUBSCRIPTIONS

      public static final String M_SUBSCRIPTIONS
      subscriptions and list reply: the entries.
      See Also:
    • M_TRANSPORT

      public static final String M_TRANSPORT
      An entry: "vapid" or "fcm".
      See Also:
    • M_LAST_SEEN

      public static final String M_LAST_SEEN
      An entry: when the device last presented itself.
      See Also:
    • M_RECIPIENTS

      public static final String M_RECIPIENTS
      push, count and list request: who is sent to; push reply: users resolved.
      See Also:
    • M_NOTIFICATION

      public static final String M_NOTIFICATION
      push request: the section 6 content object.
      See Also:
    • M_TIME_TO_LIVE

      public static final String M_TIME_TO_LIVE
      push request: seconds, section 6.4.
      See Also:
    • M_URGENCY

      public static final String M_URGENCY
      push request: high, normal or low, section 6.4.
      See Also:
    • M_MATCHED

      public static final String M_MATCHED
      push reply: subscriptions matched.
      See Also:
    • M_DELIVERED

      public static final String M_DELIVERED
      push reply: delivered, in session or to a device.
      See Also:
    • M_OUTCOMES

      public static final String M_OUTCOMES
      push reply: the tally by DeliveryOutcome name.
      See Also:
    • M_OFFSET

      public static final String M_OFFSET
      list request: the first entry to return.
      See Also:
    • M_LIMIT

      public static final String M_LIMIT
      list request: the most entries to return.
      See Also:
    • M_VAPID_PUBLIC_KEY

      public static final String M_VAPID_PUBLIC_KEY
      keys reply: the base64url VAPID public key; subscribe request, optional: the key a Browser subscription was made under (B-10b).
      See Also:
    • M_FCM_PROJECT_ID

      public static final String M_FCM_PROJECT_ID
      keys reply: the Firebase project ID.
      See Also:
    • M_VAPID_REASON

      public static final String M_VAPID_REASON
      A 409 reply: the VAPID transport's reason.
      See Also:
    • M_FCM_REASON

      public static final String M_FCM_REASON
      A 409 reply: the FCM transport's reason.
      See Also:
    • MEMBERS

      public static final List<String> MEMBERS
      Every member name, in the order above.
    • E_BAD_REQUEST

      public static final String E_BAD_REQUEST
      400: the body is not a JSON object, a member is missing, of the wrong type or out of range, or X-iizi is missing or not a UUID on a device operation.
      See Also:
    • E_PAYLOAD_TOO_LARGE

      public static final String E_PAYLOAD_TOO_LARGE
      400: the serialised notification exceeds section 6.3.
      See Also:
    • E_RECIPIENTS_MISSING

      public static final String E_RECIPIENTS_MISSING
      400: recipients is absent.
      See Also:
    • E_RECIPIENTS_EMPTY

      public static final String E_RECIPIENTS_EMPTY
      400: recipients is an empty array.
      See Also:
    • E_UNAUTHENTICATED

      public static final String E_UNAUTHENTICATED
      401: no or unusable Authorization, unknown user or wrong password - one code for all of them.
      See Also:
    • E_FORBIDDEN

      public static final String E_FORBIDDEN
      403: authenticated, but no group grants the operation's privilege.
      See Also:
    • E_SECURE_PORT_REQUIRED

      public static final String E_SECURE_PORT_REQUIRED
      403: production server, request not on a secure port.
      See Also:
    • E_UNKNOWN_OPERATION

      public static final String E_UNKNOWN_OPERATION
      404: the path names no operation.
      See Also:
    • E_UNKNOWN_APPLICATION

      public static final String E_UNKNOWN_APPLICATION
      404: app_id names an application this server has not loaded.
      See Also:
    • E_METHOD_NOT_ALLOWED

      public static final String E_METHOD_NOT_ALLOWED
      405: not POST.
      See Also:
    • E_NOT_CONFIGURED

      public static final String E_NOT_CONFIGURED
      409: the application is loaded but no transport can be offered for it.
      See Also:
    • E_STORE_FAILURE

      public static final String E_STORE_FAILURE
      500: the subscription store failed.
      See Also:
    • E_INTERNAL

      public static final String E_INTERNAL
      500: anything else.
      See Also:
    • ERRORS

      public static final List<String> ERRORS
      The thirteen error codes, in the order of section 1.3.
    • HEADER_DEVICE

      public static final String HEADER_DEVICE
      The device UUID header, required on device operations only (section 1.1).
      See Also:
    • HEADER_FETCH_MODE

      public static final String HEADER_FETCH_MODE
      The Fetch Metadata header a Browser sets on a fetch, an XHR and a navigation to a potentially trustworthy origin (https, the loopback) and no page script can set or remove: a request carrying it is a Browser's, and its 401 carries no challenge (section 1.3).
      See Also:
    • HEADER_ORIGIN

      public static final String HEADER_ORIGIN
      The header a Browser sets on every request that is not a GET or a HEAD, over plain http to any address too, and no page script can set or remove: a request carrying it is a Browser's, and its 401 carries no challenge (section 1.3).
      See Also:
    • WWW_AUTHENTICATE

      public static final String WWW_AUTHENTICATE
      The challenge a 401 carries (RFC 7617 section 2.1), except to a Browser's request (HEADER_FETCH_MODE or HEADER_ORIGIN, section 1.3).
      See Also:
    • CACHE_CONTROL

      public static final String CACHE_CONTROL
      The Cache-Control of every reply (section 1.2).
      See Also:
    • TRANSPORT_VAPID

      public static final String TRANSPORT_VAPID
      The transport value of a VAPID entry.
      See Also:
    • TRANSPORT_FCM

      public static final String TRANSPORT_FCM
      The transport value of an FCM entry.
      See Also:
    • URGENCY_HIGH

      public static final String URGENCY_HIGH
      The urgency values, section 6.4.
      See Also:
    • URGENCY_NORMAL

      public static final String URGENCY_NORMAL
      The urgency values, section 6.4.
      See Also:
    • URGENCY_LOW

      public static final String URGENCY_LOW
      The urgency values, section 6.4.
      See Also:
    • BROADCAST

      public static final String BROADCAST
      The recipients entry that is the broadcast (section 5.6, Ruling 3).
      See Also:
    • DATA_IIZI

      public static final String DATA_IIZI
      The reserved key of data the server writes (section 6.2).
      See Also:
    • IIZI_MESSAGE

      public static final String IIZI_MESSAGE
      The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller). IIZI_SERVER since O-4a (CC-DESIGN-PUSH-APPID-FILTER SV-2): the subscription store the message was sent from, the same for every server sharing it.
      See Also:
    • IIZI_APP_ID

      public static final String IIZI_APP_ID
      The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller). IIZI_SERVER since O-4a (CC-DESIGN-PUSH-APPID-FILTER SV-2): the subscription store the message was sent from, the same for every server sharing it.
      See Also:
    • IIZI_TOPIC

      public static final String IIZI_TOPIC
      The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller). IIZI_SERVER since O-4a (CC-DESIGN-PUSH-APPID-FILTER SV-2): the subscription store the message was sent from, the same for every server sharing it.
      See Also:
    • IIZI_SENT

      public static final String IIZI_SENT
      The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller). IIZI_SERVER since O-4a (CC-DESIGN-PUSH-APPID-FILTER SV-2): the subscription store the message was sent from, the same for every server sharing it.
      See Also:
    • IIZI_SERVER

      public static final String IIZI_SERVER
      The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller). IIZI_SERVER since O-4a (CC-DESIGN-PUSH-APPID-FILTER SV-2): the subscription store the message was sent from, the same for every server sharing it.
      See Also:
    • IIZI_NOTIFICATION

      public static final String IIZI_NOTIFICATION
      The members of data.iizi: the message ID, the application, the Topic, when it was sent and the push server ID, on both legs; and on the FCM leg only, the section 6.1 object as the caller gave it, without its data (ruling of 2026-09-22, CC-PUSH-FCM-MAP finding 2: members mapped to native FCM fields never reach the device's JavaScript, so the content travels once more under data.iizi; ruling of 2026-09-23, CC-PUSH-P3 RR-11: added by FcmTransport.buildMessage and not at push, so that the Web Push leg, whose Service Worker decrypts the whole object, keeps its size for the caller). IIZI_SERVER since O-4a (CC-DESIGN-PUSH-APPID-FILTER SV-2): the subscription store the message was sent from, the same for every server sharing it.
      See Also:
    • LIST_LIMIT_DEFAULT

      public static final int LIST_LIMIT_DEFAULT
      The default limit of list, and its ceiling.
      See Also:
    • LIST_LIMIT_MAX

      public static final int LIST_LIMIT_MAX
      The default limit of list, and its ceiling.
      See Also:
  • Method Details

    • iiziMembers

      public static JSONObject iiziMembers(String messageId, String app, String topic, long sent, String server)
      Builds the server's data.iizi of a send (section 6.2): the ONE place its members are written, called by both writers - PushHttpHandler's push and the Java API's PushSendSupport.message - so that the two cannot drift apart (CC-DESIGN-PUSH-APPID-FILTER SV-2). The FCM leg's copy of the notification is FcmTransport.buildMessage's own, added to what this returns.
      Parameters:
      messageId - The message ID, a UUID.
      app - The canonical application ID, * for the server itself.
      topic - The Topic, empty for the application level.
      sent - When it is sent, epoch milliseconds.
      server - The push server ID (PushEngine.getServerId()); null only for an engine that was never started, in which case the member is left out, as a server built before O-4a leaves it out.
      Returns:
      A new object with the members.
    • requestMembers

      public static Set<String> requestMembers(String operation)
      Gets the request members an operation reads. A member outside this set is ignored, so the set is what the client may send and the agreement test checks it against.
      Parameters:
      operation - One of OPERATIONS.
      Returns:
      The members, never null.
    • replyMembers

      public static Set<String> replyMembers(String operation)
      Gets the members of an operation's success reply, ok included. Optional members (keys: each transport's member is present only when configured) are included.
      Parameters:
      operation - One of OPERATIONS.
      Returns:
      The members, never null.
    • entryMembers

      public static Set<String> entryMembers(boolean withUserAgent)
      Gets the members of a subscription entry (section 5.5), with or without the user agent (section 5.8 omits it for every caller of list).
      Parameters:
      withUserAgent - true for a subscriptions entry, false for a list entry.
      Returns:
      The members.
    • isDeviceOperation

      public static boolean isDeviceOperation(String operation)
      Tells whether an operation is a device operation: X-iizi required and a database user required (section 5.0).
      Parameters:
      operation - One of OPERATIONS.
      Returns:
      true for subscribe, unsubscribe, reset and subscriptions.