@clockworkdog/timesync 2.11.1 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/timesync.d.ts +8 -0
- package/dist/timesync.js +14 -12
- package/package.json +5 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { createTimeSyncClient, createTimeSyncServer, TimeSyncClient, TimeSyncRequestData, TimeSyncResponseData, TimeSyncServer } from './timesync';
|
|
2
2
|
export * from './setDate';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { createTimeSyncClient, createTimeSyncServer } from './timesync';
|
|
2
2
|
export * from './setDate';
|
package/dist/timesync.d.ts
CHANGED
|
@@ -16,6 +16,12 @@ export interface TimeSyncClient {
|
|
|
16
16
|
export interface TimeSyncServer {
|
|
17
17
|
receive(data: TimeSyncRequestData): void;
|
|
18
18
|
}
|
|
19
|
+
interface CompletedRequest {
|
|
20
|
+
sentAt: number;
|
|
21
|
+
receivedAt: number;
|
|
22
|
+
serverNow: number;
|
|
23
|
+
clientNow: number;
|
|
24
|
+
}
|
|
19
25
|
export declare function createTimeSyncClient({ interval, send, onChange, syncSampleSize, syncRequestTimeout, }: {
|
|
20
26
|
interval: number;
|
|
21
27
|
send: (data: TimeSyncRequestData) => void | Promise<void>;
|
|
@@ -23,6 +29,8 @@ export declare function createTimeSyncClient({ interval, send, onChange, syncSam
|
|
|
23
29
|
syncSampleSize?: number;
|
|
24
30
|
syncRequestTimeout?: number;
|
|
25
31
|
}): TimeSyncClient;
|
|
32
|
+
export declare function calculateDelta(results: CompletedRequest[]): number;
|
|
26
33
|
export declare function createTimeSyncServer({ send }: {
|
|
27
34
|
send: (data: TimeSyncResponseData) => void | Promise<void>;
|
|
28
35
|
}): TimeSyncServer;
|
|
36
|
+
export {};
|
package/dist/timesync.js
CHANGED
|
@@ -13,9 +13,10 @@ export function createTimeSyncClient({ interval, send, onChange = setDate, syncS
|
|
|
13
13
|
for (let i = 0; i < syncSampleSize; i++) {
|
|
14
14
|
const promise = new Promise((resolve) => {
|
|
15
15
|
const id = getId();
|
|
16
|
+
const clientNow = Date.now();
|
|
16
17
|
const sentAt = performance.now();
|
|
17
18
|
send({ timesync: { id } });
|
|
18
|
-
const complete = (receivedAt, serverNow) => resolve({ sentAt, receivedAt, serverNow, clientNow
|
|
19
|
+
const complete = (receivedAt, serverNow) => resolve({ sentAt, receivedAt, serverNow, clientNow });
|
|
19
20
|
requests[id] = { complete };
|
|
20
21
|
setTimeout(() => resolve(null), syncRequestTimeout);
|
|
21
22
|
});
|
|
@@ -23,17 +24,10 @@ export function createTimeSyncClient({ interval, send, onChange = setDate, syncS
|
|
|
23
24
|
await promise;
|
|
24
25
|
}
|
|
25
26
|
// Perform calculation with results
|
|
26
|
-
const results = await Promise.all(promises);
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
.
|
|
30
|
-
const { sentAt, receivedAt, serverNow, clientNow } = result;
|
|
31
|
-
const halfLatency = (receivedAt - sentAt) / 2;
|
|
32
|
-
return clientNow - serverNow + halfLatency;
|
|
33
|
-
});
|
|
34
|
-
const averageDelta = deltas.reduce((d1, d2) => d1 + d2, 0) / deltas.length;
|
|
35
|
-
if (!isNaN(averageDelta)) {
|
|
36
|
-
onChange(Date.now() + averageDelta);
|
|
27
|
+
const results = (await Promise.all(promises)).filter((result) => result !== null);
|
|
28
|
+
const delta = calculateDelta(results);
|
|
29
|
+
if (!isNaN(delta)) {
|
|
30
|
+
onChange(Date.now() + delta);
|
|
37
31
|
}
|
|
38
32
|
}
|
|
39
33
|
const receive = (data) => {
|
|
@@ -53,6 +47,14 @@ export function createTimeSyncClient({ interval, send, onChange = setDate, syncS
|
|
|
53
47
|
destroy,
|
|
54
48
|
};
|
|
55
49
|
}
|
|
50
|
+
export function calculateDelta(results) {
|
|
51
|
+
return (results
|
|
52
|
+
.map(({ sentAt, receivedAt, clientNow, serverNow }) => {
|
|
53
|
+
const halfLatency = (receivedAt - sentAt) / 2;
|
|
54
|
+
return serverNow - clientNow - halfLatency;
|
|
55
|
+
})
|
|
56
|
+
.reduce((d1, d2) => d1 + d2, 0) / results.length);
|
|
57
|
+
}
|
|
56
58
|
export function createTimeSyncServer({ send }) {
|
|
57
59
|
return {
|
|
58
60
|
receive(data) {
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "A library to synchronize a client's clock to a server's",
|
|
4
4
|
"author": "Clockwork Dog <info@clockwork.dog>",
|
|
5
5
|
"homepage": "https://github.com/clockwork-dog/cogs-sdk/tree/main/packages/timesync",
|
|
6
|
-
"version": "
|
|
6
|
+
"version": "3.0.0-alpha.0",
|
|
7
7
|
"keywords": [],
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"repository": {
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
"test": "yarn lint && vitest",
|
|
22
22
|
"lint": "eslint .",
|
|
23
23
|
"build": "tsc",
|
|
24
|
-
"release": "yarn npm publish --access public"
|
|
24
|
+
"release": "yarn npm publish --access public",
|
|
25
|
+
"prerelease": "yarn npm publish --access public --tag=next"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
28
|
"@eslint/js": "^9.17.0",
|
|
@@ -32,5 +33,6 @@
|
|
|
32
33
|
"typescript": "~5.7.2",
|
|
33
34
|
"typescript-eslint": "^8.18.1",
|
|
34
35
|
"vitest": "^4.0.6"
|
|
35
|
-
}
|
|
36
|
+
},
|
|
37
|
+
"stableVersion": "0.0.0"
|
|
36
38
|
}
|