UNPKG

6.9 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _regenerator = require('babel-runtime/regenerator');
8
9var _regenerator2 = _interopRequireDefault(_regenerator);
10
11var _extends2 = require('babel-runtime/helpers/extends');
12
13var _extends3 = _interopRequireDefault(_extends2);
14
15var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
16
17var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
18
19/**
20 * Take an `Object` containing a query and outputs records from the ISTEX API.
21 *
22 * @param {string} [query="*"] ISTEX query
23 * @param {string} [sid="ezs-istex"] User-agent identifier
24 * @param {number} maxPage Maximum number of pages to get
25 * @param {number} [size=2000] size of each page of results
26 * @param {string} [duration="5m"] maximum duration between two requests
27 * @param {Array<string>} [field=["doi"]] fields to get
28 * @returns {Array<Object>}
29 */
30var ISTEXScroll = function () {
31 var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(data, feed) {
32 var query, sid, maxPage, size, scroll, field, fields, output, location, parameters, urlObj, urlStr, response, json, nbPages, prevScrollId, i, _json, nextScrollURI, scrollId, res;
33
34 return _regenerator2.default.wrap(function _callee$(_context) {
35 while (1) {
36 switch (_context.prev = _context.next) {
37 case 0:
38 if (!this.isLast()) {
39 _context.next = 2;
40 break;
41 }
42
43 return _context.abrupt('return', feed.close());
44
45 case 2:
46 query = this.getParam('query') || data;
47 sid = this.getParam('sid', 'ezs-istex');
48 maxPage = Number(this.getParam('maxPage'));
49 size = Number(this.getParam('size', 2000));
50 scroll = this.getParam('duration', '5m');
51 field = this.getParam('field', ['doi']);
52 fields = Array.isArray(field) ? field : [field];
53 output = 'arkIstex,' + fields.map(function (e) {
54 return (/\w+/.exec(e)[0]
55 );
56 }).join();
57 location = {
58 protocol: 'https:',
59 host: 'api.istex.fr',
60 pathname: '/document/'
61 };
62 parameters = {
63 q: query,
64 scroll: scroll,
65 output: output,
66 size: size,
67 sid: sid
68 };
69 urlObj = (0, _extends3.default)({}, location, {
70 search: _qs2.default.stringify(parameters)
71 });
72 urlStr = _url2.default.format(urlObj);
73 _context.next = 16;
74 return (0, _fetchWithProxy2.default)(urlStr);
75
76 case 16:
77 response = _context.sent;
78 _context.next = 19;
79 return response.json();
80
81 case 19:
82 json = _context.sent;
83
84 if (!(json.total === 0)) {
85 _context.next = 22;
86 break;
87 }
88
89 return _context.abrupt('return', feed.send(new Error('No result.')));
90
91 case 22:
92 if (!json._error) {
93 _context.next = 24;
94 break;
95 }
96
97 return _context.abrupt('return', feed.send(new Error(json._error)));
98
99 case 24:
100 if (!(json.total === undefined)) {
101 _context.next = 26;
102 break;
103 }
104
105 return _context.abrupt('return', feed.send(new Error('Unexpected response.')));
106
107 case 26:
108 nbPages = Math.ceil(json.total / size);
109
110 if (nbPages > maxPage) {
111 nbPages = maxPage;
112 }
113 if (json.noMoreScrollResults) {
114 nbPages = 1;
115 }
116 prevScrollId = '';
117 i = 0;
118
119 case 31:
120 if (!(i < nbPages)) {
121 _context.next = 46;
122 break;
123 }
124
125 _json = json, nextScrollURI = _json.nextScrollURI, scrollId = _json.scrollId;
126
127 if (process.env.DEBUG) {
128 // eslint-disable-next-line no-console
129 console.assert(prevScrollId === scrollId, 'New ScrollId: ' + scrollId);
130 prevScrollId = scrollId;
131 }
132 feed.write(json);
133
134 if (!json.noMoreScrollResults) {
135 _context.next = 37;
136 break;
137 }
138
139 return _context.abrupt('break', 46);
140
141 case 37:
142 _context.next = 39;
143 return (0, _fetchWithProxy2.default)(nextScrollURI);
144
145 case 39:
146 res = _context.sent;
147 _context.next = 42;
148 return res.json();
149
150 case 42:
151 json = _context.sent;
152
153 case 43:
154 i += 1;
155 _context.next = 31;
156 break;
157
158 case 46:
159
160 feed.end();
161
162 case 47:
163 case 'end':
164 return _context.stop();
165 }
166 }
167 }, _callee, this);
168 }));
169
170 return function ISTEXScroll(_x, _x2) {
171 return _ref.apply(this, arguments);
172 };
173}(); /* eslint-disable no-await-in-loop */
174
175
176var _url = require('url');
177
178var _url2 = _interopRequireDefault(_url);
179
180var _qs = require('qs');
181
182var _qs2 = _interopRequireDefault(_qs);
183
184var _fetchWithProxy = require('fetch-with-proxy');
185
186var _fetchWithProxy2 = _interopRequireDefault(_fetchWithProxy);
187
188function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
189
190exports.default = {
191 ISTEXScroll: ISTEXScroll
192};
\No newline at end of file