@jbrowse/plugin-authentication
Version:
JBrowse 2 Authentication
56 lines (55 loc) • 2.12 kB
JavaScript
import { ConfigurationReference, getConf } from '@jbrowse/core/configuration';
import { InternetAccount } from '@jbrowse/core/pluggableElementTypes/models';
import { getRoot, types } from '@jbrowse/mobx-state-tree';
import { ExternalTokenEntryForm } from "./ExternalTokenEntryForm.js";
const stateModelFactory = (configSchema) => {
return InternetAccount.named('ExternalTokenInternetAccount')
.props({
type: types.literal('ExternalTokenInternetAccount'),
configuration: ConfigurationReference(configSchema),
})
.views(self => ({
get validateWithHEAD() {
return getConf(self, 'validateWithHEAD');
},
}))
.actions(self => ({
getTokenFromUser(resolve, reject) {
const { session } = getRoot(self);
session.queueDialog((doneCallback) => [
ExternalTokenEntryForm,
{
internetAccountId: self.internetAccountId,
handleClose: (token) => {
if (token) {
resolve(token);
}
else {
reject(new Error('user cancelled entry'));
}
doneCallback();
},
},
]);
},
async validateToken(token, location) {
if (!self.validateWithHEAD) {
return token;
}
const newInit = self.addAuthHeaderToInit({ method: 'HEAD' }, token);
const response = await fetch(location.uri, newInit);
if (!response.ok) {
let errorMessage;
try {
errorMessage = await response.text();
}
catch (error) {
errorMessage = '';
}
throw new Error(`Token could not be validated — ${response.status} ${errorMessage ? ` (${errorMessage})` : ''}`);
}
return token;
},
}));
};
export default stateModelFactory;