Class TimesyncExtension

java.lang.Object
org.cometd.server.ext.TimesyncExtension
All Implemented Interfaces:
org.cometd.bayeux.server.BayeuxServer.Extension

public class TimesyncExtension
extends java.lang.Object
implements org.cometd.bayeux.server.BayeuxServer.Extension

Timesync extension (server side).

With each handshake or connect, the extension sends timestamps within the ext field like: {ext:{timesync:{tc:12345567890,l:23,o:4567},...},...} where:

  • tc is the client timestamp in ms since 1970 of when the message was sent.
  • l is the network lag that the client has calculated.
  • o is the clock offset that the client has calculated.

A CometD server that supports timesync, can respond with an ext field like: {ext:{timesync:{tc:12345567890,ts:1234567900,p:123,a:3},...},...} where:

  • tc is the client timestamp of when the message was sent,
  • ts is the server timestamp of when the message was received
  • p is the poll duration in ms - ie the time the server took before sending the response.
  • a is the measured accuracy of the calculated offset and lag sent by the client

The relationship between tc, ts, o and l on the server is given by ts=tc+o+l (the time the server received the message is the client time plus the offset plus the network lag). Thus the accuracy of the o and l settings can be determined with a=tc+o+l-ts.

When the client has received the response, it can make a more accurate estimate of the lag as l2=(now-tc-p)/2 (assuming symmetric lag). A new offset can then be calculated with the relationship on the client that ts=tc+o2+l2, thus o2=ts-tc-l2.

Since the client also receives the a value calculated on the server, it should be possible to analyse this and compensate for some asymmetry in the lag. But the current client does not do this.

  • Nested Class Summary

    Nested classes/interfaces inherited from interface org.cometd.bayeux.server.BayeuxServer.Extension

    org.cometd.bayeux.server.BayeuxServer.Extension.Adapter
  • Field Summary

    Fields 
    Modifier and Type Field Description
    static java.lang.String LAG_ATTRIBUTE  
  • Constructor Summary

    Constructors 
    Constructor Description
    TimesyncExtension()  
  • Method Summary

    Modifier and Type Method Description
    int getAccuracyTarget()
    timesync responses are not set if the measured accuracy is less than the accuracyTarget.
    boolean rcvMeta​(org.cometd.bayeux.server.ServerSession from, org.cometd.bayeux.server.ServerMessage.Mutable message)  
    boolean sendMeta​(org.cometd.bayeux.server.ServerSession session, org.cometd.bayeux.server.ServerMessage.Mutable message)  
    void setAccuracyTarget​(int target)
    timesync responses are not set if the measured accuracy is less than the accuracyTarget.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.cometd.bayeux.server.BayeuxServer.Extension

    incoming, outgoing, rcv, send
  • Field Details

  • Constructor Details

  • Method Details

    • getAccuracyTarget

      public int getAccuracyTarget()
      timesync responses are not set if the measured accuracy is less than the accuracyTarget.
      Returns:
      accuracy target in ms (default 25ms)
    • setAccuracyTarget

      public void setAccuracyTarget​(int target)
      timesync responses are not set if the measured accuracy is less than the accuracyTarget.
      Parameters:
      target - accuracy target in ms
    • rcvMeta

      public boolean rcvMeta​(org.cometd.bayeux.server.ServerSession from, org.cometd.bayeux.server.ServerMessage.Mutable message)
      Specified by:
      rcvMeta in interface org.cometd.bayeux.server.BayeuxServer.Extension
    • sendMeta

      public boolean sendMeta​(org.cometd.bayeux.server.ServerSession session, org.cometd.bayeux.server.ServerMessage.Mutable message)
      Specified by:
      sendMeta in interface org.cometd.bayeux.server.BayeuxServer.Extension