@elm-street-technology/passport-saml-metadata
Version:
SAML2 metadata loader
54 lines (45 loc) • 1.65 kB
JavaScript
const assert = require('assert');
const request = require('superagent');
const debug = require('debug')('passport-saml-metadata');
const defaults = {
timeout: 2000,
backupStore: new Map()
};
module.exports = (config = {}) => {
const { url, timeout, backupStore } = Object.assign({}, defaults, config);
assert.ok(url, 'url is required');
assert.ok(backupStore, 'backupStore is required');
assert.equal(typeof backupStore.get, 'function', 'backupStore must have a get(key) function');
assert.equal(typeof backupStore.set, 'function', 'backupStore must have a set(key, value) function');
debug('Loading metadata', url, timeout, backupStore);
return request.get(url)
.timeout(timeout)
.buffer(true)
.then((res) => {
debug('Metadata loaded', res.text.length);
backupStore.set(url, res.text);
return res.text;
})
.catch((err) => {
let error = err;
// Superagent emits errors with error.response instead of error.message
if (err.response) {
error = err.response.error || new Error(err.response.body.message);
error.status = err.response.status;
}
debug('Metadata request failed, attempting backup store', err);
return Promise.resolve(backupStore.get(url))
.then((data) => {
if (!data) {
debug('Backup store was empty');
return Promise.reject(error);
}
debug('Metadata loaded from backupStore', data.length);
return data;
})
.catch((err) => {
debug('Backup store request error', err);
return Promise.reject(error);
});
});
};