From f1d871dbf12839d14720003226752b580a71d97c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 8 Mar 2023 14:37:38 +0100 Subject: [PATCH] getMachineId should not use errors.onUnexpectedError (#176512) --- src/vs/base/node/id.ts | 9 ++++----- src/vs/base/test/node/id.test.ts | 4 +++- src/vs/code/electron-main/app.ts | 2 +- src/vs/code/node/cliProcessMain.ts | 2 +- .../platform/telemetry/electron-main/telemetryUtils.ts | 5 +++-- src/vs/platform/telemetry/node/telemetryUtils.ts | 5 +++-- src/vs/platform/windows/electron-main/windowImpl.ts | 2 +- src/vs/server/node/serverServices.ts | 2 +- 8 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/vs/base/node/id.ts b/src/vs/base/node/id.ts index 65bff8cc522..a5ea6a2bb0d 100644 --- a/src/vs/base/node/id.ts +++ b/src/vs/base/node/id.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { networkInterfaces } from 'os'; -import * as errors from 'vs/base/common/errors'; import { TernarySearchTree } from 'vs/base/common/ternarySearchTree'; import * as uuid from 'vs/base/common/uuid'; import { getMac } from 'vs/base/node/macAddress'; @@ -78,10 +77,10 @@ export const virtualMachineHint: { value(): number } = new class { }; let machineId: Promise; -export async function getMachineId(): Promise { +export async function getMachineId(errorLogger: (error: any) => void): Promise { if (!machineId) { machineId = (async () => { - const id = await getMacMachineId(); + const id = await getMacMachineId(errorLogger); return id || uuid.generateUuid(); // fallback, generate a UUID })(); @@ -90,13 +89,13 @@ export async function getMachineId(): Promise { return machineId; } -async function getMacMachineId(): Promise { +async function getMacMachineId(errorLogger: (error: any) => void): Promise { try { const crypto = await import('crypto'); const macAddress = getMac(); return crypto.createHash('sha256').update(macAddress, 'utf8').digest('hex'); } catch (err) { - errors.onUnexpectedError(err); + errorLogger(err); return undefined; } } diff --git a/src/vs/base/test/node/id.test.ts b/src/vs/base/test/node/id.test.ts index 2ef49a3d4ba..ed4b0d0cb2f 100644 --- a/src/vs/base/test/node/id.test.ts +++ b/src/vs/base/test/node/id.test.ts @@ -11,8 +11,10 @@ import { flakySuite } from 'vs/base/test/node/testUtils'; flakySuite('ID', () => { test('getMachineId', async function () { - const id = await getMachineId(); + const errors = []; + const id = await getMachineId(err => errors.push(err)); assert.ok(id); + assert.strictEqual(errors.length, 0); }); test('getMac', async () => { diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 58be55593cd..0176cd92e88 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -530,7 +530,7 @@ export class CodeApplication extends Disposable { // Resolve unique machine ID this.logService.trace('Resolving machine identifier...'); - const machineId = await resolveMachineId(this.stateService); + const machineId = await resolveMachineId(this.stateService, this.logService); this.logService.trace(`Resolved machine identifier: ${machineId}`); // Shared process diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 4d661e13e9e..714d8b37d52 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -209,7 +209,7 @@ class CliMain extends Disposable { commonProperties: (async () => { let machineId: string | undefined = undefined; try { - machineId = await resolveMachineId(stateService); + machineId = await resolveMachineId(stateService, logService); } catch (error) { if (error.code !== 'ENOENT') { logService.error(error); diff --git a/src/vs/platform/telemetry/electron-main/telemetryUtils.ts b/src/vs/platform/telemetry/electron-main/telemetryUtils.ts index 8736daf87ff..db3bb1bcd8b 100644 --- a/src/vs/platform/telemetry/electron-main/telemetryUtils.ts +++ b/src/vs/platform/telemetry/electron-main/telemetryUtils.ts @@ -3,13 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { ILogService } from 'vs/platform/log/common/log'; import { IStateService } from 'vs/platform/state/node/state'; import { machineIdKey } from 'vs/platform/telemetry/common/telemetry'; import { resolveMachineId as resolveNodeMachineId } from 'vs/platform/telemetry/node/telemetryUtils'; -export async function resolveMachineId(stateService: IStateService) { +export async function resolveMachineId(stateService: IStateService, logService: ILogService) { // Call the node layers implementation to avoid code duplication - const machineId = await resolveNodeMachineId(stateService); + const machineId = await resolveNodeMachineId(stateService, logService); stateService.setItem(machineIdKey, machineId); return machineId; } diff --git a/src/vs/platform/telemetry/node/telemetryUtils.ts b/src/vs/platform/telemetry/node/telemetryUtils.ts index 588ef5d9d4a..4e970ce6afa 100644 --- a/src/vs/platform/telemetry/node/telemetryUtils.ts +++ b/src/vs/platform/telemetry/node/telemetryUtils.ts @@ -5,16 +5,17 @@ import { isMacintosh } from 'vs/base/common/platform'; import { getMachineId } from 'vs/base/node/id'; +import { ILogService } from 'vs/platform/log/common/log'; import { IStateReadService } from 'vs/platform/state/node/state'; import { machineIdKey } from 'vs/platform/telemetry/common/telemetry'; -export async function resolveMachineId(stateService: IStateReadService) { +export async function resolveMachineId(stateService: IStateReadService, logService: ILogService) { // We cache the machineId for faster lookups // and resolve it only once initially if not cached or we need to replace the macOS iBridge device let machineId = stateService.getItem(machineIdKey); if (typeof machineId !== 'string' || (isMacintosh && machineId === '6c9d2bc8f91b89624add29c0abeae7fb42bf539fa1cdb2e3e57cd668fa9bcead')) { - machineId = await getMachineId(); + machineId = await getMachineId(logService.error.bind(logService)); } return machineId; diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index e4c28d41a84..11f16a36bb3 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -800,7 +800,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { } const { installSourcePath } = this.environmentMainService; - const machineId = await resolveMachineId(this.stateService); + const machineId = await resolveMachineId(this.stateService, this.logService); const config: ITelemetryServiceConfig = { appenders, diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts index fb3b32d8c37..09649061cb1 100644 --- a/src/vs/server/node/serverServices.ts +++ b/src/vs/server/node/serverServices.ts @@ -137,7 +137,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken const [, , machineId] = await Promise.all([ configurationService.initialize(), userDataProfilesService.init(), - getMachineId() + getMachineId(logService.error.bind(logService)) ]); const extensionHostStatusService = new ExtensionHostStatusService();