@graphql-hive/core
Version:
89 lines (88 loc) • 3.35 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createSchemaFetcher = createSchemaFetcher;
exports.createServicesFetcher = createServicesFetcher;
const version_js_1 = require("../version.js");
const http_client_js_1 = require("./http-client.js");
const utils_js_1 = require("./utils.js");
function createFetcher(options) {
var _a;
const logger = (_a = options.logger) !== null && _a !== void 0 ? _a : console;
let cacheETag = null;
let cached = null;
const endpoint = options.endpoint.endsWith('/services')
? options.endpoint
: (0, utils_js_1.joinUrl)(options.endpoint, 'services');
return function fetcher() {
const headers = {
'X-Hive-CDN-Key': options.key,
accept: 'application/json',
'User-Agent': `hive-client/${version_js_1.version}`,
};
if (cacheETag) {
headers['If-None-Match'] = cacheETag;
}
return http_client_js_1.http
.get(endpoint, {
headers,
retry: {
retries: 10,
maxTimeout: 200,
minTimeout: 1,
},
isRequestOk: response => response.ok || response.status === 304,
logger,
})
.then(async (response) => {
if (response.ok) {
const result = await response.json();
const etag = response.headers.get('etag');
if (etag) {
cached = result;
cacheETag = etag;
}
return result;
}
if (response.status === 304 && cached !== null) {
return cached;
}
throw new Error(`Unexpected error.`);
});
};
}
function createSchemaFetcher(options) {
const fetcher = createFetcher(options);
return function schemaFetcher() {
return fetcher().then(schema => {
let service;
// Before the new artifacts endpoint the body returned an array or a single object depending on the project type.
// This handles both in a backwards-compatible way.
if (schema instanceof Array) {
if (schema.length !== 1) {
throw new Error('Encountered multiple services instead of a single service. Please use createServicesFetcher instead.');
}
service = schema[0];
}
else {
service = schema;
}
return Object.assign({ id: createSchemaId(service) }, service);
});
};
}
function createServicesFetcher(options) {
const fetcher = createFetcher(options);
return function schemaFetcher() {
return fetcher().then(async (services) => {
if (services instanceof Array) {
return Promise.all(services.map(service => createSchemaId(service).then(id => (Object.assign({ id }, service)))));
}
throw new Error('Encountered a single service instead of a multiple services. Please use createSchemaFetcher instead.');
});
};
}
const createSchemaId = (service) => (0, utils_js_1.createHash)('SHA-256')
.update(service.sdl)
.update(service.url || '')
.update(service.name)
.digest('base64');
;