@aimee-blue/ab-service-kit
Version:
Aimee Blue Service Template
1 lines • 5.46 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/shared/time/index.ts"],"names":["initialNow","Date","now","initialHr","process","hrtime","initialDiff","quickNowWithMicroseconds","seconds","nanoseconds","result","reInitializeTime","oldDiff","logger","log","newDiff","localNow","diff","Math","abs","defaultDeps","determineTime","serverTime","serverTimeInfo","promise","time","deps","env","TIME_URL","Promise","resolve","offset","then","start","stop","took","catch","err","error"],"mappings":"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","sourcesContent":["import { serverTime } from './serverTime';\nimport { registerError } from '../registerError';\nimport { defaultBasicLogger } from '../logging';\n\n// in the docs is mentioned that `hrtime` is more stable\n// that the Date.now and doesn't drift, so we use it to\n// determine current local time, also it gives us nanosecond precision\nlet initialNow = Date.now();\nlet initialHr = process.hrtime();\nlet initialDiff = Date.now() - quickNowWithMicroseconds();\n\n// microsecond precision, as there is simply no room for nanos in JavaScript number\nfunction quickNowWithMicroseconds() {\n const [seconds, nanoseconds] = process.hrtime(initialHr);\n const result = initialNow + seconds * 1e3 + nanoseconds / 1e6;\n return result;\n}\n\n// it is possible that the VM sleeps (typically on local dev desktop)\n// so we need to reinitialize the time\nexport function reInitializeTime() {\n const oldDiff = initialDiff;\n\n initialNow = Date.now();\n initialHr = process.hrtime();\n initialDiff = Date.now() - quickNowWithMicroseconds();\n\n const logger = defaultBasicLogger();\n\n logger.log('💡 Re-initializing time', {\n oldDiff,\n newDiff: initialDiff,\n });\n}\n\nexport function localNow() {\n const result = quickNowWithMicroseconds();\n\n // reinitialize after clock synchronizations and hibernation's\n const diff = Math.abs(Date.now() - result - initialDiff);\n if (diff > 10) {\n reInitializeTime();\n return quickNowWithMicroseconds();\n }\n\n return result;\n}\n\nconst defaultDeps = {\n determineTime: serverTime,\n};\n\nlet serverTimeInfo: {\n offset: number;\n took: number;\n} | null = null;\n\nlet promise: Promise<number> | null = null;\n\nexport const time = (deps = defaultDeps) => {\n if (!process.env.TIME_URL) {\n return Promise.resolve(localNow());\n }\n\n if (serverTimeInfo !== null) {\n return Promise.resolve(localNow() - serverTimeInfo.offset);\n }\n\n const logger = defaultBasicLogger();\n\n return (\n promise ||\n (promise = deps\n .determineTime()\n .then(() => {\n const start = localNow();\n return deps.determineTime().then(result => {\n const stop = localNow();\n const took = stop - start;\n\n // the right time is somewhere in between\n serverTimeInfo = {\n offset: localNow() - result,\n took,\n };\n promise = null;\n\n logger.log(\n '⏰ Time synchronized, it took',\n took,\n 'offset is',\n serverTimeInfo.offset\n );\n\n return localNow() - serverTimeInfo.offset;\n });\n })\n .catch(err => {\n registerError(err);\n promise = null;\n\n logger.error('💥 Error when synchronizing time', err);\n return localNow();\n }))\n );\n};\n"],"file":"index.js"}