From 7638c999ce0beba081251e1671c21e3e31bf8c6e Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Sat, 20 Jul 2024 09:18:26 +0200 Subject: [PATCH] Buffer heartbeats in offline db and only send to API when we have 25 heartbeats --- src/wakatime.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/wakatime.ts b/src/wakatime.ts index 4062a4c..9218227 100644 --- a/src/wakatime.ts +++ b/src/wakatime.ts @@ -61,6 +61,8 @@ export class WakaTime { private resourcesLocation: string; private lastApiKeyPrompted: number = 0; private isMetricsEnabled: boolean = false; + private heartbeatsOfflineOnlySentAt: number = 0; + private heartbeatsOfflineOnlyCount: number = 0; constructor(extensionPath: string, logger: Logger) { this.extensionPath = extensionPath; @@ -368,7 +370,9 @@ export class WakaTime { if (apiUrl.value?.trim()) { try { const parsedUrl = new URL(apiUrl.value); - url = `${parsedUrl.protocol}//${parsedUrl.hostname}${parsedUrl.port ? `:${parsedUrl.port}` : ''}`; + url = `${parsedUrl.protocol}//${parsedUrl.hostname}${ + parsedUrl.port ? `:${parsedUrl.port}` : '' + }`; } catch (e) { this.logger.warnException(e); } @@ -549,6 +553,14 @@ export class WakaTime { args.push('--entity', Utils.quote(file)); + if (this._useOfflineOnly()) { + args.push('--offline-only'); + this.heartbeatsOfflineOnlyCount += 1; + } else { + this.heartbeatsOfflineOnlySentAt = Date.now(); + this.heartbeatsOfflineOnlyCount = 0; + } + let user_agent = this.agentName + '/' + vscode.version + ' vscode-wakatime/' + this.extension.version; args.push('--plugin', Utils.quote(user_agent)); @@ -645,6 +657,13 @@ export class WakaTime { }); } + private _useOfflineOnly() { + if (!this.heartbeatsOfflineOnlySentAt) return false; + if (this.heartbeatsOfflineOnlyCount >= 24) return false; + if (this.heartbeatsOfflineOnlySentAt + 120000 < Date.now()) return false; + return true; + } + private getCodingActivity() { if (!this.showStatusBar) return;