UNPKG

@citation-js/core

Version:

Convert different bibliographic metadata sources

97 lines (96 loc) 3.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.fetchFile = fetchFile; exports.fetchFileAsync = fetchFileAsync; exports.setUserAgent = setUserAgent; var _syncFetch = _interopRequireDefault(require("sync-fetch")); var _fetchPonyfill = _interopRequireDefault(require("fetch-ponyfill")); var _logger = _interopRequireDefault(require("../logger.js")); var _package = _interopRequireDefault(require("../../package.json")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const isBrowser = typeof location !== 'undefined' && typeof navigator !== 'undefined'; const { fetch: asyncFetch, Headers: asyncHeaders } = typeof fetch === 'function' && isBrowser ? { fetch, Headers } : (0, _fetchPonyfill.default)(); let userAgent = `Citation.js/${_package.default.version}`; if (typeof process !== 'undefined' && process && process.release && process.release.name === 'node' && process.version) { userAgent += ` Node.js/${process.version}`; } function normaliseHeaders(headers) { const result = {}; const entries = headers instanceof asyncHeaders || headers instanceof _syncFetch.default.Headers ? Array.from(headers) : Object.entries(headers); for (const [name, header] of entries) { result[name.toLowerCase()] = header.toString(); } return result; } function parseOpts(opts = {}) { const reqOpts = { headers: { accept: '*/*' }, method: 'GET', checkContentType: opts.checkContentType }; if (userAgent && !isBrowser) { reqOpts.headers['user-agent'] = userAgent; } if (opts.body) { reqOpts.method = 'POST'; const isJson = typeof opts.body !== 'string'; reqOpts.body = isJson ? JSON.stringify(opts.body) : opts.body; reqOpts.headers['content-type'] = isJson ? 'application/json' : 'text/plain'; } if (opts.headers) { Object.assign(reqOpts.headers, normaliseHeaders(opts.headers)); } return reqOpts; } function sameType(request, response) { if (!request.accept || request.accept === '*/*' || !response['content-type']) { return true; } const [a, b] = response['content-type'].split(';')[0].trim().split('/'); return request.accept.split(',').map(type => type.split(';')[0].trim().split('/')).some(([c, d]) => (c === a || c === '*') && (d === b || d === '*')); } function checkResponse(response, opts) { const { status, headers } = response; let error; if (status >= 400) { error = new Error(`Server responded with status code ${status}`); } else if (opts.checkContentType === true && !sameType(opts.headers, normaliseHeaders(headers))) { error = new Error(`Server responded with content-type ${headers.get('content-type')}`); } if (error) { error.status = status; error.headers = headers; error.body = response.body; throw error; } return response; } function fetchFile(url, opts) { const reqOpts = parseOpts(opts); _logger.default.http('[core]', reqOpts.method, url, reqOpts); const response = checkResponse((0, _syncFetch.default)(url, reqOpts), reqOpts); return response.text(); } async function fetchFileAsync(url, opts) { const reqOpts = parseOpts(opts); _logger.default.http('[core]', reqOpts.method, url, reqOpts); return asyncFetch(url, reqOpts).then(response => checkResponse(response, reqOpts)).then(response => response.text()); } function setUserAgent(newUserAgent) { userAgent = newUserAgent; } var _default = exports.default = fetchFile;