Skip to content

Commit f9ef131

Browse files
committed
refactor(telemetry): use globalState abstraction
1 parent 6ea5e27 commit f9ef131

File tree

7 files changed

+31
-77
lines changed

7 files changed

+31
-77
lines changed

packages/core/src/codewhisperer/client/codewhisperer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ export class DefaultCodeWhispererClient {
256256
ideCategory: 'VSCODE',
257257
operatingSystem: getOperatingSystem(),
258258
product: 'CodeWhisperer', // TODO: update this?
259-
clientId: getClientId(globals.context.globalState),
259+
clientId: getClientId(globals.globalState),
260260
ideVersion: extensionVersion,
261261
},
262262
}
@@ -273,7 +273,7 @@ export class DefaultCodeWhispererClient {
273273
ideCategory: 'VSCODE',
274274
operatingSystem: getOperatingSystem(),
275275
product: 'CodeWhisperer', // TODO: update this?
276-
clientId: getClientId(globals.context.globalState),
276+
clientId: getClientId(globals.globalState),
277277
ideVersion: extensionVersion,
278278
},
279279
}

packages/core/src/shared/globalState.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,20 @@ type globalKey =
3535
| 'aws.toolkit.separationPromptCommand'
3636
| 'aws.toolkit.separationPromptDismissed'
3737
// Deprecated/legacy names. New keys should start with "aws.".
38+
| '#sessionCreationDates' // Legacy name from `ssoAccessTokenProvider.ts`.
3839
| 'CODECATALYST_RECONNECT'
3940
| 'CODEWHISPERER_AUTO_SCANS_ENABLED'
4041
| 'CODEWHISPERER_AUTO_TRIGGER_ENABLED'
4142
| 'CODEWHISPERER_HINT_DISPLAYED'
4243
| 'CODEWHISPERER_PERSISTED_CUSTOMIZATIONS'
4344
| 'CODEWHISPERER_SELECTED_CUSTOMIZATION'
4445
| 'CODEWHISPERER_USER_GROUP'
46+
| 'awsTelemetryNoticeVersionAck'
4547
| 'globalsMostRecentVersion'
4648
| 'gumby.wasQCodeTransformationUsed'
49+
| 'hasAlreadyOpenedAmazonQ'
4750
| 'isExtensionFirstUse'
4851
| 'lastExtensionVersion'
49-
| 'hasAlreadyOpenedAmazonQ'
50-
// Legacy name from `ssoAccessTokenProvider.ts`.
51-
| '#sessionCreationDates'
5252

5353
/**
5454
* Extension-local (not visible to other vscode extensions) shared state which persists after IDE

packages/core/src/shared/telemetry/activation.ts

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ import { Commands } from '../vscode/commands2'
2424
export const noticeResponseViewSettings = localize('AWS.telemetry.notificationViewSettings', 'Settings')
2525
export const noticeResponseOk = localize('AWS.telemetry.notificationOk', 'OK')
2626

27-
// eslint-disable-next-line @typescript-eslint/naming-convention
28-
export const TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED = 'awsTelemetryNoticeVersionAck'
29-
3027
// Telemetry Notice Versions
3128
// Versioning the users' notice acknowledgement is forward looking, and allows us to better
3229
// track scenarios when we may need to re-prompt the user about telemetry.
@@ -83,8 +80,8 @@ export async function activate(
8380
}
8481

8582
// Prompt user about telemetry if they haven't been
86-
if (!isCloud9() && !hasUserSeenTelemetryNotice(extensionContext)) {
87-
showTelemetryNotice(extensionContext)
83+
if (!isCloud9() && !hasUserSeenTelemetryNotice()) {
84+
showTelemetryNotice()
8885
}
8986
await setupTelemetryId(extensionContext)
9087
await globals.telemetry.start()
@@ -100,23 +97,20 @@ export async function activate(
10097
}
10198
}
10299

103-
export function hasUserSeenTelemetryNotice(extensionContext: vscode.ExtensionContext): boolean {
104-
return (
105-
extensionContext.globalState.get<number>(TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED, 0) >=
106-
CURRENT_TELEMETRY_NOTICE_VERSION
107-
)
100+
export function hasUserSeenTelemetryNotice(): boolean {
101+
return globals.globalState.tryGet('awsTelemetryNoticeVersionAck', Number, 0) >= CURRENT_TELEMETRY_NOTICE_VERSION
108102
}
109103

110-
export async function setHasUserSeenTelemetryNotice(extensionContext: vscode.ExtensionContext): Promise<void> {
111-
await extensionContext.globalState.update(TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED, CURRENT_TELEMETRY_NOTICE_VERSION)
104+
export async function setHasUserSeenTelemetryNotice(): Promise<void> {
105+
await globals.globalState.update('awsTelemetryNoticeVersionAck', CURRENT_TELEMETRY_NOTICE_VERSION)
112106
getLogger().verbose('Telemetry notice has been shown')
113107
}
114108

115109
/**
116110
* Prompts user to Enable/Disable/Defer on Telemetry, then
117111
* handles the response appropriately.
118112
*/
119-
function showTelemetryNotice(extensionContext: vscode.ExtensionContext) {
113+
function showTelemetryNotice() {
120114
getLogger().verbose('Showing telemetry notice')
121115

122116
const telemetryNoticeText: string = localize(
@@ -128,13 +122,10 @@ function showTelemetryNotice(extensionContext: vscode.ExtensionContext) {
128122
// Don't wait for a response
129123
void vscode.window
130124
.showInformationMessage(telemetryNoticeText, noticeResponseViewSettings, noticeResponseOk)
131-
.then(async (response) => handleTelemetryNoticeResponse(response, extensionContext))
125+
.then(async (response) => handleTelemetryNoticeResponse(response))
132126
}
133127

134-
export async function handleTelemetryNoticeResponse(
135-
response: string | undefined,
136-
extensionContext: vscode.ExtensionContext
137-
) {
128+
export async function handleTelemetryNoticeResponse(response: string | undefined) {
138129
try {
139130
getLogger().verbose(`Telemetry notice response: ${response}`)
140131

@@ -143,7 +134,7 @@ export async function handleTelemetryNoticeResponse(
143134
return
144135
}
145136

146-
await setHasUserSeenTelemetryNotice(extensionContext)
137+
await setHasUserSeenTelemetryNotice()
147138

148139
// noticeResponseOk is a no-op
149140

packages/core/src/shared/telemetry/telemetryService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ export class DefaultTelemetryService {
216216
private async createDefaultPublisher(): Promise<TelemetryPublisher | undefined> {
217217
try {
218218
// grab our clientId and generate one if it doesn't exist
219-
const clientId = getClientId(this.context.globalState)
219+
const clientId = getClientId(globals.globalState)
220220
// grab our Cognito identityId
221221
const poolId = DefaultTelemetryClient.config.identityPool
222222
const identityMapJson = this.context.globalState.get<string>(

packages/core/src/shared/telemetry/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export async function setupTelemetryId(extensionContext: vscode.ExtensionContext
241241
getLogger().debug(`telemetry: Write telemetry client id to env ${currentClientId}`)
242242
process.env[telemetryClientIdEnvKey] = currentClientId
243243
} else {
244-
const clientId = getClientId(globals.context.globalState)
244+
const clientId = getClientId(globals.globalState)
245245
getLogger().debug(`telemetry: Setup telemetry client id ${clientId}`)
246246
process.env[telemetryClientIdEnvKey] = clientId
247247
}

packages/core/src/test/shared/telemetry/activation.test.ts

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,89 +4,52 @@
44
*/
55

66
import assert from 'assert'
7-
import * as sinon from 'sinon'
8-
import * as vscode from 'vscode'
9-
10-
import { FakeExtensionContext } from '../../fakeExtensionContext'
117
import {
128
handleTelemetryNoticeResponse,
139
noticeResponseViewSettings,
1410
noticeResponseOk,
15-
TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED,
1611
hasUserSeenTelemetryNotice,
1712
setHasUserSeenTelemetryNotice,
1813
} from '../../../shared/telemetry/activation'
14+
import globals from '../../../shared/extensionGlobals'
1915

2016
describe('handleTelemetryNoticeResponse', function () {
21-
let extensionContext: vscode.ExtensionContext
22-
let sandbox: sinon.SinonSandbox
23-
24-
before(function () {
25-
sandbox = sinon.createSandbox()
26-
})
27-
28-
after(function () {
29-
sandbox.restore()
30-
})
31-
32-
beforeEach(async function () {
33-
extensionContext = await FakeExtensionContext.create()
34-
})
35-
3617
it('does nothing when notice is discarded', async function () {
37-
await handleTelemetryNoticeResponse(undefined, extensionContext)
38-
18+
await handleTelemetryNoticeResponse(undefined)
3919
assert.strictEqual(
40-
extensionContext.globalState.get(TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED),
20+
globals.globalState.get('awsTelemetryNoticeVersionAck'),
4121
undefined,
4222
'Expected opt out shown state to remain unchanged'
4323
)
4424
})
4525

4626
it('handles View Settings response', async function () {
47-
const executeCommand = sandbox.stub(vscode.commands, 'executeCommand')
48-
49-
await handleTelemetryNoticeResponse(noticeResponseViewSettings, extensionContext)
50-
51-
assert.ok(executeCommand.calledOnce, 'Expected to trigger View Settings')
27+
await handleTelemetryNoticeResponse(noticeResponseViewSettings)
5228
assert.strictEqual(
53-
extensionContext.globalState.get(TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED),
29+
globals.globalState.get('awsTelemetryNoticeVersionAck'),
5430
2,
5531
'Expected opt out shown state to be set'
5632
)
5733
})
5834

5935
it('handles Ok response', async function () {
60-
await handleTelemetryNoticeResponse(noticeResponseOk, extensionContext)
36+
await handleTelemetryNoticeResponse(noticeResponseOk)
6137

6238
assert.strictEqual(
63-
extensionContext.globalState.get(TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED),
39+
globals.globalState.get('awsTelemetryNoticeVersionAck'),
6440
2,
6541
'Expected opt out shown state to be set'
6642
)
6743
})
6844
})
6945

7046
describe('hasUserSeenTelemetryNotice', async function () {
71-
let extensionContext: vscode.ExtensionContext
72-
let sandbox: sinon.SinonSandbox
73-
74-
before(function () {
75-
sandbox = sinon.createSandbox()
76-
})
77-
78-
after(function () {
79-
sandbox.restore()
80-
})
81-
82-
beforeEach(async function () {
83-
extensionContext = await FakeExtensionContext.create()
84-
})
47+
beforeEach(async function () {})
8548

8649
it('is affected by setHasUserSeenTelemetryNotice', async function () {
87-
assert.ok(!hasUserSeenTelemetryNotice(extensionContext))
88-
await setHasUserSeenTelemetryNotice(extensionContext)
89-
assert.ok(hasUserSeenTelemetryNotice(extensionContext))
50+
assert.ok(!hasUserSeenTelemetryNotice())
51+
await setHasUserSeenTelemetryNotice()
52+
assert.ok(hasUserSeenTelemetryNotice())
9053
})
9154

9255
const scenarios = [
@@ -98,8 +61,8 @@ describe('hasUserSeenTelemetryNotice', async function () {
9861

9962
scenarios.forEach((scenario) => {
10063
it(scenario.desc, async () => {
101-
await extensionContext.globalState.update(TELEMETRY_NOTICE_VERSION_ACKNOWLEDGED, scenario.currentState)
102-
assert.strictEqual(hasUserSeenTelemetryNotice(extensionContext), scenario.expectedHasSeen)
64+
await globals.globalState.update('awsTelemetryNoticeVersionAck', scenario.currentState)
65+
assert.strictEqual(hasUserSeenTelemetryNotice(), scenario.expectedHasSeen)
10366
})
10467
})
10568
})

packages/core/src/threatComposer/threatComposerEditorProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ export class ThreatComposerEditorProvider implements vscode.CustomTextEditorProv
130130
}
131131

132132
if (clientId === '') {
133-
clientId = getClientId(globals.context.globalState)
133+
clientId = getClientId(globals.globalState)
134134
}
135135
// Attempt to retrieve existing visualization if it exists.
136136
const existingVisualization = this.getExistingVisualization(document.uri.fsPath)

0 commit comments

Comments
 (0)