blob: 7a93b6dccb7b893b1f6ccab866eaeb1966215835 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* gapi-loader.js provides a method for loading gapi.js asynchronously.
*
* gapi.js docs:
* https://developers.google.com/identity/sign-in/web/reference
* (we load gapi.js via the chops-signin module)
*/
import * as signin from '@chopsui/chops-signin';
const BUGANIZER_SCOPE = 'https://www.googleapis.com/auth/buganizer';
// Only allow google.com profiles through currently.
const RESTRICT_TO_DOMAIN = '@google.com';
// loadGapi loads window.gapi and returns a logged in user object or null.
// Allows overriding signinImpl for testing.
export default function loadGapi() {
const signinImpl = getSigninInstance();
// Validate client_id exists.
if (!CS_env.gapi_client_id) {
throw new Error('Cannot find gapi.js client id');
}
// Prevent gapi.js from being loaded multiple times.
if (window.__gapiLoadPromise) {
return window.__gapiLoadPromise;
}
window.__gapiLoadPromise = new Promise(async (resolve) => {
signinImpl.init(CS_env.gapi_client_id, ['client'], [BUGANIZER_SCOPE]);
resolve(await fetchGapiEmail(signinImpl));
});
return window.__gapiLoadPromise;
}
// For fetching current email. May have changed since load.
export function fetchGapiEmail() {
const signinImpl = getSigninInstance();
return new Promise((resolve) => {
signinImpl.getUserProfileAsync().then((profile) => {
resolve(
(
profile &&
profile.getEmail instanceof Function &&
profile.getEmail().endsWith(RESTRICT_TO_DOMAIN) &&
profile.getEmail()
) || null,
);
});
});
}
// Provide a singleton chops-signin instance to make testing easier.
let signinInstance;
export function getSigninInstance(signinImpl=signin, overwrite=false) {
// Assign on first run.
if (overwrite || !signinInstance) {
signinInstance = signinImpl;
}
return signinInstance;
}