Class EnvProps

All Implemented Interfaces:
EventListener, IGProp<GProp<?>[]>, IPropCnr, Cloneable

public class EnvProps extends PropCnr
VOIP, see PhoneRTC at http://phonertc.io/ or https://www.twilio.com/
  • Field Details

    • clientEnv

      protected StringMapProp clientEnv
      The client environment properties.
    • geoProps

      protected GeoProps geoProps
      The Geolocation properties.
    • serverEnv

      protected StringMapProp serverEnv
      The server environment properties.
    • PASSKEY_NOT_ALLOWED

      public static final String PASSKEY_NOT_ALLOWED
      The name of the error of a ceremony the user cancelled or let time out, or that the authenticator refused (NotAllowedError): the sign-in failed, and nothing is to be handed to the server's finish... call.
      See Also:
    • PASSKEY_INVALID_STATE

      public static final String PASSKEY_INVALID_STATE
      The name of the error of a registration on an authenticator that holds a passkey of the user already (InvalidStateError): no failure of the user's, to be told with a text of its own.
      See Also:
    • PASSKEY_ABORTED

      public static final String PASSKEY_ABORTED
      The name of the error of a request that was aborted in the client (AbortError): the autofill of the user name field, when the user took a passkey button instead.
      See Also:
    • PASSKEY_NOT_SUPPORTED

      public static final String PASSKEY_NOT_SUPPORTED
      The name of the error of a request the client cannot run (NotSupportedError): a client without WebAuthn (iiziRun among them, whose passkeys are SignIn L-12), or an autofill in a client without conditional mediation.
      See Also:
    • PASSKEY_RENEWAL_FAILED

      public static final String PASSKEY_RENEWAL_FAILED
      The name of the error of an autofill whose options could not be made again at its renewal (the reason is in the server log). It is the bridge's own, not a DOMException.
      See Also:
    • PASSKEY_CAPABILITIES_DEADLINE_MS

      public static final long PASSKEY_CAPABILITIES_DEADLINE_MS
      How long the client has to report its capabilities: 30 seconds.
      See Also:
    • PASSKEY_AUTOFILL_RENEW_MS

      public static final long PASSKEY_AUTOFILL_RENEW_MS
      The age at which the options of an autofill are made again and handed to the client: 14 minutes, one before the 15 minutes the server keeps the challenge of an autofill.
      See Also:
  • Constructor Details

    • EnvProps

      protected EnvProps()
      Creates the environment properties without a name.
    • EnvProps

      public EnvProps(Atom atom)
      Creates the environment properties with a name.
      Parameters:
      atom - The atom name.
  • Method Details

    • getClientSessionGyro

      public IClientSessionGyro getClientSessionGyro()
      Gets the client session gyro instance.
      Specified by:
      getClientSessionGyro in interface IGProp<GProp<?>[]>
      Overrides:
      getClientSessionGyro in class GProp<GProp<?>[]>
      Returns:
      The instance, or null if not found.
    • shouldSerializeToXML

      protected boolean shouldSerializeToXML(int programType)
      The EnvProps are never written to XML.
      Overrides:
      shouldSerializeToXML in class GProp<GProp<?>[]>
      Parameters:
      programType - From PropFactory.getProgramType(): 0=PropFactory.CLIENT, 1=PropFactory.SERVER or 2=PropFactory.EDITOR.
      Returns:
      true (default if not VOLATILE) to save to XML, false to avoid writing the property to XML.
    • addPredefinedProps

      protected void addPredefinedProps() throws PropException
      Adds the predefined properties for this container. This method is called once just after construction of the property container.

      Properties added:

       - client environment  StringMapProp  Atom.A_CLIENT
       - server environment  StringMapProp  Atom.A_SERVER
      

      Overrides:
      addPredefinedProps in class PropCnr
      Throws:
      PropException - for property exceptions.
    • getPredefinedProps

      protected void getPredefinedProps()
      Gets potential references to predefined properties for this container. This method is called once just after cloning of the property container.

      The method should get reference to using the getProp(...) methods. This allows the subclass to be able to retrieve the new instances to the properties created during addPredefinedProps() if stored in instance variables.

      Overrides:
      getPredefinedProps in class PropCnr
    • onInsertProp

      protected void onInsertProp(GProp<?> aProperty, int index, boolean replace, boolean isCloning, PropMgr propMgr, boolean isMoving) throws PropException
      Called when a property is inserted. The atoms of the children the remote party creates are recorded, so that onRemoteRootCreated() can tell which of the predefined properties it did not send.
      Overrides:
      onInsertProp in class PropCnr
      Parameters:
      aProperty - The property to insert.
      index - Index where to insert the property.
      replace - Flag indicating if the value should be replaced or not.
      isCloning - Flag indicating this property is being cloned.
      propMgr - The property manager for remote change, null for local.
      isMoving - Flag indicating the property is moved.
      Throws:
      PropException - For property exceptions.
    • onRemoteRootCreated

      public void onRemoteRootCreated()
      Called once by the property manager after the root has been created from the remote party. The predefined $geo and $zones properties that the remote party did not create are marked private: they stay present, non-null and attached, but are never sent to a party that has no such properties. The Integrated Designer creates neither, the Design Viewer and the VSViewers create only $zones, and a client creates both. The change flag of a property made private is reset, otherwise it would mark this container as changed after every send transaction and an empty update would be sent forever.
    • clone

      public EnvProps clone()
      Clones the environment properties.
      Overrides:
      clone in class PropCnr
    • getServerEnv

      public StringMapProp getServerEnv()
      Gets the server environment properties.
      Returns:
      StringMapProp for the server environment.
    • getClientEnv

      public StringMapProp getClientEnv()
      Gets the client environment properties.
      Returns:
      StringMapProp for the client environment.
    • iiziRunPresent

      public boolean iiziRunPresent()
      Checks if iiziRun (Corvova) is present.
      Returns:
      true if present, false otherwise.
    • getGeolocation

      public GeoProps getGeolocation()
      Gets the Geolocation properties.
    • getSpeechSynthesis

      public SpeechSynthesisProp getSpeechSynthesis()
      Gets the speech synthesis instance.
      Returns:
      The instance, or null if not supported.
    • getSpeechRecognition

      public SpeechRecognitionProp getSpeechRecognition()
      Gets the speech recognition instance.
      Returns:
      The instance, or null if not supported.
    • getLocale

      public LocaleInfo getLocale()
      Gets the client local info class instance.
      Returns:
      The client locale info class instance when the client environment has been set, otherwise the default client locale info instance specified for the server.
    • setLocale

      public LocaleInfo setLocale(LocaleInfo locale) throws PropTypeException
      Changes or sets the LocaleInfo for the environment. This method is intended to be used to change the language setting of a client session.

      Note that this change does not fire any refresh to the client property tree, use the IClientSessionGyro.setLocale(LocaleInfo) instead.

      Parameters:
      locale - localeInfo The locale information to use.
      Returns:
      The old LocaleInfo, or null if not set.
      Throws:
      PropTypeException - If the property is read-only.
    • getDPR

      public double getDPR()
      The device pixel ratio of the client.
      Returns:
      The Device Pixel Ratio, or 1.0 if not found.
    • getLanguageCode

      public String getLanguageCode()
      Gets the language code to use.
      Returns:
      The language code, or null for default (not defined by the client).
    • getUIScheme

      public UISchemes.Scheme getUIScheme()
      Gets the theme scheme the client shows: the shipped theme family and the resolved mode, light or dark, never auto (UISchemes; THEME-DESIGN.md section 4.6). The client reports it as the uiScheme string property at connect and on every change (iz/uischeme.js), so that app code can ask.
      Returns:
      The scheme, or null when the client has not reported one: an older client, a Designer session before the Panel Editor sent its choice, or a report that is not a shipped family and mode.
    • getUISchemeChoice

      public UISchemes.Scheme getUISchemeChoice()
      Gets the theme scheme the client was told to show, the mode as chosen: light, dark, auto or auto_dark (UISchemes; order CC-THEME-DARK-V5). The client reports it as the uiSchemeChoice string property at connect and on every change, beside the resolved getUIScheme().
      Returns:
      The choice, or null when the client has not reported one: an older client, a Designer session before the Panel Editor sent its choice, or a report that is not a shipped family and mode.
    • setCachedValue

      public void setCachedValue(String name, Object value)
      Sets a cached property by name. This is set for this instance only.
      Parameters:
      name - The name.
      value - An object.
    • getCachedValue

      public <TYPE> TYPE getCachedValue(String name, Class<TYPE> valueClass)
      Gets a cached property of a certain type.
      Parameters:
      name - The name.
      valueClass - The value class to retrieve.
      Returns:
      The cached value, or null if not found or class mismatch.
    • hasClientCapabilities

      public boolean hasClientCapabilities(EnvProps.ClientCapability capability)
      Checks if a client has the specified capabilities. It is important to use the appropriate EnvProps instance, i.e. the client session EnvProps and not e.g. the server's.
      Parameters:
      capability - The capability to query.
      Returns:
      true for support, false when client doesn't have the capability.
    • getParsedUserAgent

      public ua_parser.Client getParsedUserAgent() throws Exception
      Gets the parsed user agent instance.
      Returns:
      The parsed user agent for the client, a cached value (i.e. parsed once only).
      Throws:
      Exception - An exception due to failure in performing the test, with a message why it failed.
    • getDeviceDetectionFromUserAgent

      public io.github.mngsk.devicedetector.Detection getDeviceDetectionFromUserAgent() throws Exception
      Gets the cached device detection instance based on the parsed user agent.
      Returns:
      The cached device detection instance based on the parsed user agent (i.e. parsed once only).
      Throws:
      Exception - An exception due to failure in performing the test, with a message why it failed.
    • registerSession

      public IRemoteSessionControl registerSession(IClientSessionGyro clientGyro, IRemoteSessionControlListener listener)
      Assigns the application session control listener.

      This method is only intended for the framework and will throw an error if called.

      Parameters:
      clientGyro - The client gyro instance.
      listener - The control listener.
      Throws:
      IllegalStateException - If not called from the framework.
    • onRemoteEvent

      public void onRemoteEvent(RemoteEvent event)
      Called when a remote property event should be processed by this property.

      A subclass can override this method to perform appropriate processing and is not required to call super.onRemoteEvent(e).

      The onRemoteEvent is NOT called when in a proxied property container, but rather the normal onEventSelf method.

      Specified by:
      onRemoteEvent in interface IGProp<GProp<?>[]>
      Overrides:
      onRemoteEvent in class GProp<GProp<?>[]>
      Parameters:
      event - The remote event.
    • onEventSelf

      public void onEventSelf(GEvent event)
      Called when a property event is send to this property.

      A subclass can override this method to perform appropriate processing and is not required to call super.onEventSelf(e).

      Specified by:
      onEventSelf in interface IGProp<GProp<?>[]>
      Overrides:
      onEventSelf in class GProp<GProp<?>[]>
      Parameters:
      event - The property event.
    • addUISchemeListener

      public boolean addUISchemeListener(IUISchemeListener listener)
      Adds a theme scheme listener for the client session: told when the resolved scheme the client shows changes, by the user, a URL, the OS under auto, or the API. Calling this method multiple times with the same listener will have no effect (but to return false).
      Parameters:
      listener - The listener to add.
      Returns:
      true if the listener was added, false otherwise.
      Throws:
      NullPointerException - If the listener is null.
    • removeUISchemeListener

      public boolean removeUISchemeListener(IUISchemeListener listener)
      Removes a theme scheme listener for the client session.
      Parameters:
      listener - The listener to remove.
      Returns:
      true if listener is successfully removed, false otherwise.
    • addScreenSizeListener

      public boolean addScreenSizeListener(IScreenSizeListener listener)
      Adds a screen size listener for the client session. Calling this method multiple times with the same listener will have no effect (but to return false).
      Parameters:
      listener - The listener to add.
      Returns:
      true if the listener was added, false otherwise.
      Throws:
      NullPointerException - If the listener is null.
    • removeScreenSizeListener

      public boolean removeScreenSizeListener(IScreenSizeListener listener)
      Removes a screen size listener for the client session.
      Parameters:
      listener - The listener to remove.
      Returns:
      true if listener is successfully removed, false otherwise.
    • getScreenWidth

      public int getScreenWidth()
      Gets the current screen width.
      Returns:
      The current screen width, or zero if not initialized.
    • getScreenHeight

      public int getScreenHeight()
      Gets the current screen height.
      Returns:
      The current screen height, or zero if not initialized.
    • getScreenSize

      public Size getScreenSize()
      Gets the current screen size.
      Returns:
      The current screen size, or zero width and/or height if not initialized.
    • addScreenOrientationListener

      public boolean addScreenOrientationListener(IScreenOrientationListener listener)
      Adds a screen orientation listener for the client session. Calling this method multiple times with the same listener will have no effect (but to return false).
      Parameters:
      listener - The listener to add.
      Returns:
      true if the listener was added, false otherwise.
      Throws:
      NullPointerException - If the listener is null.
    • removeScreenOrientationListener

      public boolean removeScreenOrientationListener(IScreenOrientationListener listener)
      Removes a screen orientation listener for the client session.
      Parameters:
      listener - The listener to remove.
      Returns:
      true if listener is successfully removed, false otherwise.
    • isScreenOrientationLockSupported

      public boolean isScreenOrientationLockSupported()
      Checks if screen orientation locking is supported or not.
      Returns:
      true if the functions to lock or unlock screen orientation are supported, false otherwise.
    • getScreenOrientation

      public ScreenOrientation getScreenOrientation()
      Gets the current screen orientation.
      Returns:
      The orientation, ScreenOrientation.unknown if not supported.
    • setScreenOrientation

      public boolean setScreenOrientation(ScreenOrientation orientation)
      Locks the screen orientation.

      Note that there may be a delay in the orientation change after calling this method. This could be due to slow client connection, disconnected client or just due to device lag.

      Parameters:
      orientation - The orientation.
      Returns:
      true for success, false for not supported.
      Throws:
      IllegalArgumentException - If orientation is ScreenOrientation.unknown.
    • unlockScreenOrientation

      public boolean unlockScreenOrientation()
      Unlocks the screen orientation.

      Note that there may be a delay in the orientation change after calling this method. This could be due to slow client connection, disconnected client or just due to device lag.

      Returns:
      true for success, false for not supported.
    • getDeviceUUID

      public String getDeviceUUID()
      Gets the device UUID.
      Returns:
      The device's UUID if iiziRun is used and has been initialized, unknown otherwise. It is always "browser" for browsers.
    • getDeviceUUID

      public String getDeviceUUID(boolean mustBeValid)
      Gets the device UUID.
      Parameters:
      mustBeValid - Flag requiring device UUID to be from a valid device, otherwise null is returned. When flag is false,
      Returns:
      The device's UUID if iiziRun is used and has been initialized, when mustBeValid is false unknown otherwise. It is always "browser" for browsers when mustBeValid is false. When mustBeValid is true, null is returned.
    • configureStatusBar

      public boolean configureStatusBar(StatusBarConfig config)
      Sets the client sessions status bar to the configuration specified.

      Note: this only works on devices using iiziRun.

      Parameters:
      config - The configuration.
      Returns:
      true for ch
    • addStatusBarTapListener

      public boolean addStatusBarTapListener(IStatusBarTapListener listener)
      Adds a status bar tap listener for the client session. Calling this method multiple times with the same listener will have no effect (but to return false).

      Status bar tap events are only fired for devices using iiziRun with status bars available, using iOS devices.

      Parameters:
      listener - The listener to add.
      Returns:
      true if the listener was added, false otherwise.
      Throws:
      NullPointerException - If the listener is null.
    • removeStatusBarTapListener

      public boolean removeStatusBarTapListener(IStatusBarTapListener listener)
      Removes a status bar tap listener for the client session.
      Parameters:
      listener - The listener to remove.
      Returns:
      true if listener is successfully removed, false otherwise.
    • getAnalyticsConsent

      public Boolean getAnalyticsConsent()
      Gets the user's Web Analytics consent as the client last reported it in this environment (the PN_ANALYTICS_CONSENT boolean, set at connect and at every decision).

      Never a cookie wall: the server may read this value, for example to decide what to log or to offer a privacy page, but no function of the application or of IIZI may ever depend on it. A user who declined must get exactly the same application as one who accepted.

      Returns:
      Boolean.TRUE when accepted, Boolean.FALSE when declined, or null when undecided, when the client is not a Browser running an application with a Measurement ID (iiziRun, the Designer pages), or when it has not reported yet.
    • askAnalyticsConsent

      public boolean askAnalyticsConsent()
      Asks the client to show IIZI's Web Analytics consent prompt now, even when a decision is already stored. The user's answer is written on the device, applied by the client without a page reload and reported back through getAnalyticsConsent(); this method does not wait for it.

      Only a Browser client running an application with a Measurement ID shows anything; iiziRun and the Designer pages ignore the event.

      Returns:
      true when the request was sent, false when the environment is disposed of.
    • setAnalyticsConsent

      public boolean setAnalyticsConsent(boolean granted)
      Sets the user's Web Analytics consent directly, when the application asked the user itself (the App page's consent choice "the application asks"). The client writes the decision on the device, starts or stops Analytics accordingly without a page reload, and reports the new value back through getAnalyticsConsent(); this method does not wait for it.

      Only a Browser client running an application with a Measurement ID acts on it; iiziRun and the Designer pages ignore the event.

      Parameters:
      granted - true when the user accepted, false when the user declined.
      Returns:
      true when the decision was sent, false when the environment is disposed of.
    • credentialsAccepted

      public boolean credentialsAccepted(UIContainer form)
      Tells the client that the credentials the user typed in a form container were accepted, so that the password manager of the Browser offers to save them. Call it once the sign-in, the sign-up or the change of password has succeeded, BEFORE the container is hidden, swapped out or its fields are cleared: the client reads the fields as they are in the page.

      Why it is needed. A Browser offers to save a password when it sees a sign-in succeed: a form submission that navigates, or a fetch. An IIZI application talks over its WebSocket, which no password manager watches, so without this call nothing is ever offered.

      What the client does. It hides a revealed password again, dispatches the submit event of the form (cancelled: a form of an IIZI application is never posted) and replaces the current entry of the session history with itself, which adds no entry and changes no address. Browsers pair the fields by their autocomplete tokens: username with current-password or new-password. Nothing typed travels in this call: only the path of the container does.

      The container should have the "Data entry form" option (form); without it no submit event is dispatched, the rest is done. This method does not wait for the client and gets no answer: whether the Browser offers anything is its decision, and the user's.

      Parameters:
      form - The container holding the text fields of the credentials.
      Returns:
      true when the signal was sent, false when the environment is disposed of.
      Throws:
      NullPointerException - If the container is null.
      IllegalArgumentException - If the container is not in the property tree of this environment's client session.
    • getWebEngineStatus

      public WebEngineStatus getWebEngineStatus()
      Gets the verdict on the web engine this environment's client runs on, as the server computed it when the client session connected, and again at every reconnect.

      The verdict is kept on this instance only, as the parsed user agents are (getCachedValue(String, Class)): a clone has none.

      Returns:
      The verdict, or null when none was computed: on a client, in a Designer session, in a clone, or before the client session exists.
    • setWebEngineStatus

      public void setWebEngineStatus(WebEngineStatus status)
      Sets the verdict on the web engine this environment's client runs on. This method is not intended to be called by user code: the server calls it when it has classified the client. The verdict decides no access, so nothing is gained by setting another one.
      Parameters:
      status - The verdict, null for none.
    • showWebEngineWarning

      public boolean showWebEngineWarning(boolean now)
      Tells the client that its web engine no longer receives security updates, so that it warns its user: the engine and its version, that it stopped receiving security updates, and since when. The client shows the notice after the first panel of the application, never on top of another prompt; it never blocks the application. This method does not wait for the client and gets no answer.

      Nothing is sent when the verdict is not WebEngineStatus.isUnpatched(): a patched engine, or one that is not assessed, is never warned about.

      Parameters:
      now - true when the application asks for the warning: the client shows it now, whether or not it showed it on this device before. false for the warning IIZI sends when the client session connects, which the client shows once per device and engine version and again after 30 days.
      Returns:
      true when the warning was sent, false when there is no verdict, the engine is not unpatched, or the environment is disposed of.
    • setPasskeyTimerEngine

      public void setPasskeyTimerEngine(ITimerEngine engine)
      Sets the timer engine the deadline of a capability report and the renewal of an autofill are registered with, e.g. the client session's.
      Parameters:
      engine - The engine, or null for the system's.
    • requestPasskeyCapabilities

      public int requestPasskeyCapabilities(EnvProps.IPasskeyCapabilitiesCallback callback)
      Asks the client what it can do with passkeys - at the start of every sign-in, since a user can set up a platform authenticator at any time. The answer is handed first to IUserAuthenticationUI.setPasskeyCapabilities of the application, on which what is offered and the policy "require a passkey where available" rest, and then to the callback. A client that does not answer within PASSKEY_CAPABILITIES_DEADLINE_MS is reported as having none of the three (EnvProps.PasskeyCapabilities.reported() false).

      The answer is the client's own statement: it decides what is offered, never whether a credential is accepted.

      Parameters:
      callback - The callback, called once.
      Returns:
      The request ID, or 0 when the environment is disposed of: nothing was sent and the callback is never called.
      Throws:
      NullPointerException - If callback is null.
    • armPasskeyAssertion

      public int armPasskeyAssertion(UIComp comp, String options, EnvProps.IPasskeyCallback callback)
      Arms a sign-in with a passkey on a component: when the user clicks it, the client calls navigator.credentials.get() with the options, inside the click - a Browser may refuse a ceremony that is not started by the user's gesture, and a message of the server is none. The options are those of IUserAuthenticationUI.startPasskeyAssertion for the button "Sign in with a passkey", for a sign-in that waits for its passkey, or for the confirmation of the signed-in user.

      One click, one ceremony: the component is disarmed by it, and the callback gets the credential for finishPasskeyAssertion, or the error. An autofill that runs is aborted by the click and answered PASSKEY_ABORTED. The challenge in the options has the time the server gives it; a click after it gets PASSKEY_REQUEST_EXPIRED from finishPasskeyAssertion, after which the component is armed again with new options.

      Parameters:
      comp - The component, typically a button, in the property tree of this environment's client session.
      options - The JSON text of the PublicKeyCredentialRequestOptionsJSON.
      callback - The callback, called once unless the request is cancelled.
      Returns:
      The request ID, or 0 when the environment is disposed of.
      Throws:
      NullPointerException - If an argument is null.
      IllegalArgumentException - If the component is not in the property tree of this environment's client session.
    • armPasskeyRegistration

      public int armPasskeyRegistration(UIComp comp, String options, EnvProps.IPasskeyCallback callback)
      Arms the registration of a passkey on a component: when the user clicks it, the client calls navigator.credentials.create() with the options, inside the click. The options are those of IUserAuthenticationUI.startPasskeyRegistration. The callback gets the credential for finishPasskeyRegistration, or the error: PASSKEY_INVALID_STATE when the authenticator holds a passkey of the user already. Otherwise as armPasskeyAssertion(UIComp, String, EnvProps.IPasskeyCallback).
      Parameters:
      comp - The component, typically a button, in the property tree of this environment's client session.
      options - The JSON text of the PublicKeyCredentialCreationOptionsJSON.
      callback - The callback, called once unless the request is cancelled.
      Returns:
      The request ID, or 0 when the environment is disposed of.
      Throws:
      NullPointerException - If an argument is null.
      IllegalArgumentException - If the component is not in the property tree of this environment's client session.
    • startPasskeyAutofill

      public int startPasskeyAutofill(EnvProps.IPasskeyOptions options, EnvProps.IPasskeyCallback callback) throws Exception
      Starts the autofill of the user name field with passkeys (conditional mediation): the Browser offers the passkeys it holds for the application in the autofill of the field whose autocomplete has the token webauthn, while the page is open, with no button. The options are made at once, on the caller's thread, and again every PASSKEY_AUTOFILL_RENEW_MS on the worker of the application session, before the server's challenge runs out; the client then replaces the request it waits with.

      One autofill at a time: a new one cancels the one that runs. The callback gets the credential for finishPasskeyAssertion when the user picks a passkey, PASSKEY_ABORTED when the user took an armed button instead, PASSKEY_NOT_SUPPORTED in a client without conditional mediation, or PASSKEY_RENEWAL_FAILED. After any of these the autofill has ended; to offer it again, start a new one.

      Parameters:
      options - Makes the options, typically with startPasskeyAssertion(clientGyro,true).
      callback - The callback, called once unless the autofill is cancelled.
      Returns:
      The request ID, or 0 when the environment is disposed of.
      Throws:
      NullPointerException - If an argument is null, or the options made are.
      Exception - What options throws at the start: nothing was sent.
    • cancelPasskeyRequest

      public boolean cancelPasskeyRequest(int request)
      Cancels a passkey request: a component is disarmed, an autofill ends. The client is told and answers nothing, and the callback is not called.
      Parameters:
      request - The request ID.
      Returns:
      true when the request was waiting, false when it had ended or is unknown.
    • getPendingPasskeyRequests

      public int getPendingPasskeyRequests()
      Gets the number of passkey requests that wait for the client.
      Returns:
      The count.
    • onPropDispose

      protected void onPropDispose()
      Called when the environment is disposed of, with its root: every passkey request that waits is logged as not completed and dropped; no callback is called.
      Overrides:
      onPropDispose in class PropCnr