## org.mortbay.cometd.ext
Class TimesyncExtension

    java.lang.Object
      org.mortbay.cometd.ext.TimesyncExtension

All Implemented Interfaces:
  org.cometd.Extension

    public class TimesyncExtension

extends java.lang.Object
implements org.cometd.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 & 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.

Constructor Summary
`TimesyncExtension()`

Method Summary
`int` `getAccuracyTarget()` timesync responses are not set if the measured accuracy is less than the accuracyTarget.
`org.cometd.Message` `rcv(org.cometd.Client from, org.cometd.Message message)`
`org.cometd.Message` `rcvMeta(org.cometd.Client from, org.cometd.Message message)`
`org.cometd.Message` `send(org.cometd.Client from, org.cometd.Message message)`
`org.cometd.Message` `sendMeta(org.cometd.Client from, org.cometd.Message 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`

Constructor Detail

### TimesyncExtension

    public TimesyncExtension()

Method Detail

### 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

### rcv

    public org.cometd.Message rcv(org.cometd.Client from,
                                  org.cometd.Message message)

  Specified by:
    `rcv` in interface `org.cometd.Extension`

### rcvMeta

    public org.cometd.Message rcvMeta(org.cometd.Client from,
                                      org.cometd.Message message)

  Specified by:
    `rcvMeta` in interface `org.cometd.Extension`

### send

    public org.cometd.Message send(org.cometd.Client from,
                                   org.cometd.Message message)

  Specified by:
    `send` in interface `org.cometd.Extension`

### sendMeta

    public org.cometd.Message sendMeta(org.cometd.Client from,
                                       org.cometd.Message message)

  Specified by:
    `sendMeta` in interface `org.cometd.Extension`

Copyright © 1995-2010 Mort Bay Consulting. All Rights Reserved.