Hello
This commit is contained in:
commit
e88c493182
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
/node_modules
|
||||||
|
/package-lock.json
|
115
index.js
Executable file
115
index.js
Executable file
|
@ -0,0 +1,115 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
var { Client } = require('undici');
|
||||||
|
var { parseArgs } = require('node:util');
|
||||||
|
|
||||||
|
var { values, positionals } = parseArgs({
|
||||||
|
options: {
|
||||||
|
help: {
|
||||||
|
type: 'boolean'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
allowPositionals: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
var help =
|
||||||
|
`Usage: webtimediff <URL>
|
||||||
|
Calculate system clock difference between this host and a web server.
|
||||||
|
|
||||||
|
--help display this help and exit
|
||||||
|
`;
|
||||||
|
|
||||||
|
if (values.help || positionals.length != 1) {
|
||||||
|
console.log(help);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sleep(ms) {
|
||||||
|
return new Promise((res, rej) => setTimeout(_ => res(), ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
((async function(url) {
|
||||||
|
var conn = new Client(url.origin, {
|
||||||
|
pipelining: 1000,
|
||||||
|
headersTimeout: 10e3,
|
||||||
|
bodyTimeout: 10e3,
|
||||||
|
});
|
||||||
|
|
||||||
|
let step = 20;
|
||||||
|
let end = 2000;
|
||||||
|
let errors = [];
|
||||||
|
let resps = [];
|
||||||
|
let firstRemoteTime = undefined;
|
||||||
|
let foundChange = undefined;
|
||||||
|
|
||||||
|
await conn.request({
|
||||||
|
method: "HEAD",
|
||||||
|
path: url.pathname + url.search,
|
||||||
|
blocking: false,
|
||||||
|
idempotent: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
for (let i = 0; (!foundChange) && i < end; i += step) {
|
||||||
|
if (errors.length > 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
let date = new Date();
|
||||||
|
let ii=i;
|
||||||
|
let res = conn.request({
|
||||||
|
method: "OPTIONS",
|
||||||
|
path: url.pathname + url.search,
|
||||||
|
blocking: false,
|
||||||
|
idempotent: true,
|
||||||
|
}).then(e => (
|
||||||
|
e.date = new Date(e.headers.date),
|
||||||
|
firstRemoteTime = firstRemoteTime ?? e.date,
|
||||||
|
e.madeAt = date,
|
||||||
|
e.doneAt = new Date(),
|
||||||
|
foundChange = foundChange ??
|
||||||
|
((firstRemoteTime && (firstRemoteTime.getTime() != e.date.getTime()))
|
||||||
|
? {
|
||||||
|
remoteTime: e.date.getTime()/1000,
|
||||||
|
beginTime: e.madeAt.getTime()/1000,
|
||||||
|
endTime: e.doneAt.getTime()/1000,
|
||||||
|
}
|
||||||
|
: foundChange),
|
||||||
|
e));
|
||||||
|
resps.push(res);
|
||||||
|
|
||||||
|
if (i + step < end)
|
||||||
|
await sleep(step);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errors.length > 0)
|
||||||
|
await Promise.all(errors);
|
||||||
|
|
||||||
|
Promise.all(resps).catch(e => {});
|
||||||
|
|
||||||
|
let firstReq = [await (resps[0])].map(res => ({
|
||||||
|
remoteTime: res.date.getTime()/1000,
|
||||||
|
beginTime: res.madeAt.getTime()/1000,
|
||||||
|
endTime: res.doneAt.getTime()/1000,
|
||||||
|
}))[0];
|
||||||
|
|
||||||
|
let reqEnds = (foundChange.endTime - firstReq.endTime);
|
||||||
|
let reqBegins = (foundChange.beginTime - firstReq.beginTime)
|
||||||
|
|
||||||
|
let lag = reqEnds / reqBegins;
|
||||||
|
|
||||||
|
if (!(lag < 1.08)) {
|
||||||
|
console.error("WARNING: Big Lag ("
|
||||||
|
+reqEnds+
|
||||||
|
"s / "
|
||||||
|
+reqBegins+
|
||||||
|
"s) detected, reported result may be inaccurate.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundChange) {
|
||||||
|
throw new Error("The remote clock does not work.");
|
||||||
|
}
|
||||||
|
|
||||||
|
let diff = (foundChange.remoteTime - (foundChange.beginTime + foundChange.endTime) / 2);
|
||||||
|
|
||||||
|
console.log("remote_time = local_time "+(diff < 0 ? "-" : "+")+" " + Math.abs(diff)+ " s");
|
||||||
|
process.exit();
|
||||||
|
})(new URL(positionals[0])))
|
5
package.json
Normal file
5
package.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"undici": "^7.8.0"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue