Cache username for a given auth to avoid fetching it every time

Change-type: patch
This commit is contained in:
Pagan Gazzard 2020-05-04 14:40:12 +01:00 committed by Balena CI
parent ab9dabaf77
commit 2f7dd54e37
2 changed files with 42 additions and 7 deletions

View File

@ -29,6 +29,11 @@ const getMixpanel = _.once((balenaUrl: string) => {
});
});
interface CachedUsername {
token: string;
username: string;
}
/**
* Mixpanel.com analytics tracking (information on balena CLI usage).
*
@ -48,14 +53,44 @@ export async function trackCommand(commandSignature: string) {
Sentry.configureScope((scope) => {
scope.setExtra('command', commandSignature);
});
const balena = getBalenaSdk();
const balenaUrlPromise = balena.settings.get('balenaUrl');
const settings = await import('balena-settings-client');
const balenaUrl = settings.get('balenaUrl') as string;
return Bluebird.props({
balenaUrl: balenaUrlPromise,
username: balena.auth.whoami().catchReturn(undefined),
mixpanel: balenaUrlPromise.then(getMixpanel),
username: (async () => {
const getStorage = await import('balena-settings-storage');
const dataDirectory = settings.get('dataDirectory') as string;
const storage = getStorage({ dataDirectory });
let token;
try {
token = await storage.get('token');
} catch {
// If we can't get a token then we can't get a username
return;
}
try {
const result = (await storage.get('cachedUsername')) as CachedUsername;
if (result.token === token) {
return result.username;
}
} catch {
// ignore
}
try {
const balena = getBalenaSdk();
const username = await balena.auth.whoami();
storage.set('cachedUsername', {
token,
username,
} as CachedUsername);
return username;
} catch {
return;
}
})(),
mixpanel: getMixpanel(balenaUrl),
})
.then(({ username, balenaUrl, mixpanel }) => {
.then(({ username, mixpanel }) => {
Sentry.configureScope((scope) => {
scope.setUser({
id: username,

View File

@ -336,7 +336,7 @@ export class BalenaAPIMock extends NockMock {
// User details are cached in the SDK
// so often we don't know if we can expect the whoami request
public expectGetWhoAmI(opts: ScopeOpts = {}) {
public expectGetWhoAmI(opts: ScopeOpts = { optional: true }) {
this.optGet('/user/v1/whoami', opts).reply(200, {
id: 99999,
username: 'gh_user',