@verdaccio/search 9.0.0-next-9.3 → 9.0.0-next-9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,23 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ exports.__toESM = __toESM;
package/build/index.js CHANGED
@@ -1,26 +1,8 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
5
4
  });
6
- var _exportNames = {};
7
- Object.defineProperty(exports, "default", {
8
- enumerable: true,
9
- get: function get() {
10
- return _search.Search;
11
- }
12
- });
13
- var _search = require("./search");
14
- var _searchUtils = require("./search-utils");
15
- Object.keys(_searchUtils).forEach(function (key) {
16
- if (key === "default" || key === "__esModule") return;
17
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
18
- if (key in exports && exports[key] === _searchUtils[key]) return;
19
- Object.defineProperty(exports, key, {
20
- enumerable: true,
21
- get: function get() {
22
- return _searchUtils[key];
23
- }
24
- });
25
- });
26
- //# sourceMappingURL=index.js.map
5
+ const require_search_utils = require("./search-utils.js");
6
+ const require_search = require("./search.js");
7
+ exports.default = require_search.Search;
8
+ exports.removeDuplicates = require_search_utils.removeDuplicates;
@@ -0,0 +1,3 @@
1
+ import { removeDuplicates } from "./search-utils.mjs";
2
+ import { Search } from "./search.mjs";
3
+ export { Search as default, removeDuplicates };
@@ -1,2 +1,2 @@
1
- import type { searchUtils } from '@verdaccio/core';
1
+ import { searchUtils } from '@verdaccio/core';
2
2
  export declare function removeDuplicates(results: searchUtils.SearchPackageItem[]): searchUtils.SearchPackageItem[];
@@ -1,20 +1,15 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.removeDuplicates = removeDuplicates;
7
- var _lodash = require("lodash");
1
+ require("./_virtual/_rolldown/runtime.js");
2
+ let lodash = require("lodash");
3
+ //#region src/search-utils.ts
8
4
  function removeDuplicates(results) {
9
- var pkgNames = [];
10
- var orderByResults = (0, _lodash.orderBy)(results, ['verdaccioPrivate', 'asc']);
11
- return orderByResults.filter(function (pkg) {
12
- var _pkg$package, _pkg$package2;
13
- if (pkgNames.includes(pkg === null || pkg === void 0 || (_pkg$package = pkg["package"]) === null || _pkg$package === void 0 ? void 0 : _pkg$package.name)) {
14
- return false;
15
- }
16
- pkgNames.push(pkg === null || pkg === void 0 || (_pkg$package2 = pkg["package"]) === null || _pkg$package2 === void 0 ? void 0 : _pkg$package2.name);
17
- return true;
18
- });
5
+ const pkgNames = [];
6
+ return (0, lodash.orderBy)(results, ["verdaccioPrivate", "asc"]).filter((pkg) => {
7
+ if (pkgNames.includes(pkg?.package?.name)) return false;
8
+ pkgNames.push(pkg?.package?.name);
9
+ return true;
10
+ });
19
11
  }
12
+ //#endregion
13
+ exports.removeDuplicates = removeDuplicates;
14
+
20
15
  //# sourceMappingURL=search-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-utils.js","names":["_lodash","require","removeDuplicates","results","pkgNames","orderByResults","orderBy","filter","pkg","_pkg$package","_pkg$package2","includes","name","push"],"sources":["../src/search-utils.ts"],"sourcesContent":["import { orderBy } from 'lodash';\n\nimport type { searchUtils } from '@verdaccio/core';\n\nexport function removeDuplicates(results: searchUtils.SearchPackageItem[]) {\n const pkgNames: any[] = [];\n const orderByResults = orderBy(results, ['verdaccioPrivate', 'asc']);\n return orderByResults.filter((pkg) => {\n if (pkgNames.includes(pkg?.package?.name)) {\n return false;\n }\n pkgNames.push(pkg?.package?.name);\n return true;\n });\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAIO,SAASC,gBAAgBA,CAACC,OAAwC,EAAE;EACzE,IAAMC,QAAe,GAAG,EAAE;EAC1B,IAAMC,cAAc,GAAG,IAAAC,eAAO,EAACH,OAAO,EAAE,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;EACpE,OAAOE,cAAc,CAACE,MAAM,CAAC,UAACC,GAAG,EAAK;IAAA,IAAAC,YAAA,EAAAC,aAAA;IACpC,IAAIN,QAAQ,CAACO,QAAQ,CAACH,GAAG,aAAHA,GAAG,gBAAAC,YAAA,GAAHD,GAAG,WAAS,cAAAC,YAAA,uBAAZA,YAAA,CAAcG,IAAI,CAAC,EAAE;MACzC,OAAO,KAAK;IACd;IACAR,QAAQ,CAACS,IAAI,CAACL,GAAG,aAAHA,GAAG,gBAAAE,aAAA,GAAHF,GAAG,WAAS,cAAAE,aAAA,uBAAZA,aAAA,CAAcE,IAAI,CAAC;IACjC,OAAO,IAAI;EACb,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"search-utils.js","names":[],"sources":["../src/search-utils.ts"],"sourcesContent":["import { orderBy } from 'lodash';\n\nimport type { searchUtils } from '@verdaccio/core';\n\nexport function removeDuplicates(results: searchUtils.SearchPackageItem[]) {\n const pkgNames: any[] = [];\n const orderByResults = orderBy(results, ['verdaccioPrivate', 'asc']);\n return orderByResults.filter((pkg) => {\n if (pkgNames.includes(pkg?.package?.name)) {\n return false;\n }\n pkgNames.push(pkg?.package?.name);\n return true;\n });\n}\n"],"mappings":";;;AAIA,SAAgB,iBAAiB,SAA0C;CACzE,MAAM,WAAkB,EAAE;AAE1B,SAAA,GAAA,OAAA,SAD+B,SAAS,CAAC,oBAAoB,MAAM,CAAC,CAC9C,QAAQ,QAAQ;AACpC,MAAI,SAAS,SAAS,KAAK,SAAS,KAAK,CACvC,QAAO;AAET,WAAS,KAAK,KAAK,SAAS,KAAK;AACjC,SAAO;GACP"}
@@ -0,0 +1,14 @@
1
+ import { orderBy } from "lodash";
2
+ //#region src/search-utils.ts
3
+ function removeDuplicates(results) {
4
+ const pkgNames = [];
5
+ return orderBy(results, ["verdaccioPrivate", "asc"]).filter((pkg) => {
6
+ if (pkgNames.includes(pkg?.package?.name)) return false;
7
+ pkgNames.push(pkg?.package?.name);
8
+ return true;
9
+ });
10
+ }
11
+ //#endregion
12
+ export { removeDuplicates };
13
+
14
+ //# sourceMappingURL=search-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-utils.mjs","names":[],"sources":["../src/search-utils.ts"],"sourcesContent":["import { orderBy } from 'lodash';\n\nimport type { searchUtils } from '@verdaccio/core';\n\nexport function removeDuplicates(results: searchUtils.SearchPackageItem[]) {\n const pkgNames: any[] = [];\n const orderByResults = orderBy(results, ['verdaccioPrivate', 'asc']);\n return orderByResults.filter((pkg) => {\n if (pkgNames.includes(pkg?.package?.name)) {\n return false;\n }\n pkgNames.push(pkg?.package?.name);\n return true;\n });\n}\n"],"mappings":";;AAIA,SAAgB,iBAAiB,SAA0C;CACzE,MAAM,WAAkB,EAAE;AAE1B,QADuB,QAAQ,SAAS,CAAC,oBAAoB,MAAM,CAAC,CAC9C,QAAQ,QAAQ;AACpC,MAAI,SAAS,SAAS,KAAK,SAAS,KAAK,CACvC,QAAO;AAET,WAAS,KAAK,KAAK,SAAS,KAAK;AACjC,SAAO;GACP"}
package/build/search.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import type { searchUtils } from '@verdaccio/core';
2
- import type { ProxyInstanceList, ProxySearchParams } from '@verdaccio/proxy';
3
- import type { Config, Logger } from '@verdaccio/types';
1
+ import { searchUtils } from '@verdaccio/core';
2
+ import { ProxyInstanceList, ProxySearchParams } from '@verdaccio/proxy';
3
+ import { Config, Logger } from '@verdaccio/types';
4
4
  declare class Search {
5
5
  readonly uplinks: ProxyInstanceList;
6
6
  readonly logger: Logger;
package/build/search.js CHANGED
@@ -1,194 +1,78 @@
1
- "use strict";
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
2
+ const require_search_utils = require("./search-utils.js");
3
+ let debug = require("debug");
4
+ debug = require_runtime.__toESM(debug);
5
+ let lodash = require("lodash");
6
+ lodash = require_runtime.__toESM(lodash);
7
+ let node_stream = require("node:stream");
8
+ let _verdaccio_proxy = require("@verdaccio/proxy");
9
+ //#region src/search.ts
10
+ var debug$1 = (0, debug.default)("verdaccio:search");
11
+ var Search = class {
12
+ uplinks;
13
+ logger;
14
+ constructor(config, logger) {
15
+ this.logger = logger.child({ module: "proxy" });
16
+ this.uplinks = (0, _verdaccio_proxy.setupUpLinks)(config, this.logger);
17
+ }
18
+ getProxyList() {
19
+ return Object.keys(this.uplinks);
20
+ }
21
+ /**
22
+ * Handle search on packages and proxies.
23
+ * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
24
+ * to a stream, once the proxies request has finished search in local storage for all packages
25
+ * (privated and cached).
26
+ */
27
+ async search(options) {
28
+ const results = [];
29
+ const upLinkList = this.getProxyList();
30
+ const streamPassThrough = new node_stream.PassThrough({ objectMode: true });
31
+ debug$1("uplinks found %s", upLinkList.length);
32
+ const searchUplinksStreams = upLinkList.map((uplinkName) => {
33
+ const uplink = this.uplinks[uplinkName];
34
+ if (!uplink) this.logger.error({ uplinkName }, "uplink @uplinkName not found");
35
+ return this.consumeSearchStream(uplinkName, uplink, options, streamPassThrough);
36
+ });
37
+ try {
38
+ debug$1("searching on %s uplinks...", searchUplinksStreams?.length);
39
+ await Promise.allSettled([...searchUplinksStreams]);
40
+ streamPassThrough.end();
41
+ for await (const chunk of streamPassThrough) if (lodash.default.isArray(chunk)) chunk.filter((pkgItem) => {
42
+ debug$1(`streaming remote pkg name ${pkgItem?.package?.name}`);
43
+ return true;
44
+ }).forEach((pkgItem) => {
45
+ return results.push({
46
+ ...pkgItem,
47
+ verdaccioPkgCached: false,
48
+ verdaccioPrivate: false
49
+ });
50
+ });
51
+ debug$1("searching all uplinks done");
52
+ } catch (err) {
53
+ this.logger.error({ err: err?.message }, " error on uplinks search @{err}");
54
+ throw err;
55
+ }
56
+ return require_search_utils.removeDuplicates(results);
57
+ }
58
+ /**
59
+ * Consume the upstream and pipe it to a transformable stream.
60
+ */
61
+ consumeSearchStream(uplinkName, uplink, options, searchPassThrough) {
62
+ return uplink.search({ ...options }).then((bodyStream) => {
63
+ bodyStream.pipe(searchPassThrough, { end: false });
64
+ bodyStream.on("error", (err) => {
65
+ this.logger.error({
66
+ uplinkName,
67
+ err
68
+ }, "search error for uplink @{uplinkName}: @{err?.message}");
69
+ searchPassThrough.end();
70
+ });
71
+ return new Promise((resolve) => bodyStream.on("end", resolve));
72
+ });
73
+ }
74
+ };
75
+ //#endregion
76
+ exports.Search = Search;
2
77
 
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.Search = void 0;
7
- var _debug = _interopRequireDefault(require("debug"));
8
- var _lodash = _interopRequireDefault(require("lodash"));
9
- var _nodeStream = require("node:stream");
10
- var _proxy = require("@verdaccio/proxy");
11
- var _searchUtils = require("./search-utils");
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
13
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
14
- function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
15
- function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
16
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
19
- function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
20
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
21
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
22
- function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
23
- function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
24
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
25
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
26
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
27
- function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
28
- function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
29
- function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
30
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
31
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
32
- function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
33
- function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(r) { var n = this.s["return"]; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, "throw": function _throw(r) { var n = this.s["return"]; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
34
- var debug = (0, _debug["default"])('verdaccio:search');
35
- var Search = exports.Search = /*#__PURE__*/function () {
36
- function Search(config, logger) {
37
- _classCallCheck(this, Search);
38
- this.logger = logger.child({
39
- module: 'proxy'
40
- });
41
- this.uplinks = (0, _proxy.setupUpLinks)(config, this.logger);
42
- }
43
- return _createClass(Search, [{
44
- key: "getProxyList",
45
- value: function getProxyList() {
46
- var uplinksList = Object.keys(this.uplinks);
47
- return uplinksList;
48
- }
49
-
50
- /**
51
- * Handle search on packages and proxies.
52
- * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
53
- * to a stream, once the proxies request has finished search in local storage for all packages
54
- * (privated and cached).
55
- */
56
- }, {
57
- key: "search",
58
- value: (function () {
59
- var _search = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
60
- var _this = this;
61
- var results, upLinkList, streamPassThrough, searchUplinksStreams, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, _t, _t2;
62
- return _regenerator().w(function (_context) {
63
- while (1) switch (_context.p = _context.n) {
64
- case 0:
65
- results = [];
66
- upLinkList = this.getProxyList(); // const transformResults = new TransFormResults({ objectMode: true });
67
- streamPassThrough = new _nodeStream.PassThrough({
68
- objectMode: true
69
- });
70
- debug('uplinks found %s', upLinkList.length);
71
- searchUplinksStreams = upLinkList.map(function (uplinkName) {
72
- var uplink = _this.uplinks[uplinkName];
73
- if (!uplink) {
74
- // this line should never happens
75
- _this.logger.error({
76
- uplinkName: uplinkName
77
- }, 'uplink @uplinkName not found');
78
- }
79
- return _this.consumeSearchStream(uplinkName, uplink, options, streamPassThrough);
80
- });
81
- _context.p = 1;
82
- debug('searching on %s uplinks...', searchUplinksStreams === null || searchUplinksStreams === void 0 ? void 0 : searchUplinksStreams.length);
83
- // only process those streams end successfully, if all request fails
84
- // just include local storage results (if local fails then return 500)
85
- _context.n = 2;
86
- return Promise.allSettled(_toConsumableArray(searchUplinksStreams));
87
- case 2:
88
- streamPassThrough.end();
89
- _iteratorAbruptCompletion = false;
90
- _didIteratorError = false;
91
- _context.p = 3;
92
- _iterator = _asyncIterator(streamPassThrough);
93
- case 4:
94
- _context.n = 5;
95
- return _iterator.next();
96
- case 5:
97
- if (!(_iteratorAbruptCompletion = !(_step = _context.v).done)) {
98
- _context.n = 7;
99
- break;
100
- }
101
- chunk = _step.value;
102
- if (_lodash["default"].isArray(chunk)) {
103
- chunk.filter(function (pkgItem) {
104
- var _pkgItem$package;
105
- debug("streaming remote pkg name ".concat(pkgItem === null || pkgItem === void 0 || (_pkgItem$package = pkgItem["package"]) === null || _pkgItem$package === void 0 ? void 0 : _pkgItem$package.name));
106
- return true;
107
- }).forEach(function (pkgItem) {
108
- // @ts-ignore
109
- return results.push(_objectSpread(_objectSpread({}, pkgItem), {}, {
110
- verdaccioPkgCached: false,
111
- verdaccioPrivate: false
112
- }));
113
- });
114
- }
115
- case 6:
116
- _iteratorAbruptCompletion = false;
117
- _context.n = 4;
118
- break;
119
- case 7:
120
- _context.n = 9;
121
- break;
122
- case 8:
123
- _context.p = 8;
124
- _t = _context.v;
125
- _didIteratorError = true;
126
- _iteratorError = _t;
127
- case 9:
128
- _context.p = 9;
129
- _context.p = 10;
130
- if (!(_iteratorAbruptCompletion && _iterator["return"] != null)) {
131
- _context.n = 11;
132
- break;
133
- }
134
- _context.n = 11;
135
- return _iterator["return"]();
136
- case 11:
137
- _context.p = 11;
138
- if (!_didIteratorError) {
139
- _context.n = 12;
140
- break;
141
- }
142
- throw _iteratorError;
143
- case 12:
144
- return _context.f(11);
145
- case 13:
146
- return _context.f(9);
147
- case 14:
148
- debug('searching all uplinks done');
149
- _context.n = 16;
150
- break;
151
- case 15:
152
- _context.p = 15;
153
- _t2 = _context.v;
154
- this.logger.error({
155
- err: _t2 === null || _t2 === void 0 ? void 0 : _t2.message
156
- }, ' error on uplinks search @{err}');
157
- throw _t2;
158
- case 16:
159
- return _context.a(2, (0, _searchUtils.removeDuplicates)(results));
160
- }
161
- }, _callee, this, [[10,, 11, 13], [3, 8, 9, 14], [1, 15]]);
162
- }));
163
- function search(_x) {
164
- return _search.apply(this, arguments);
165
- }
166
- return search;
167
- }()
168
- /**
169
- * Consume the upstream and pipe it to a transformable stream.
170
- */
171
- )
172
- }, {
173
- key: "consumeSearchStream",
174
- value: function consumeSearchStream(uplinkName, uplink, options, searchPassThrough) {
175
- var _this2 = this;
176
- return uplink.search(_objectSpread({}, options)).then(function (bodyStream) {
177
- bodyStream.pipe(searchPassThrough, {
178
- end: false
179
- });
180
- bodyStream.on('error', function (err) {
181
- _this2.logger.error({
182
- uplinkName: uplinkName,
183
- err: err
184
- }, 'search error for uplink @{uplinkName}: @{err?.message}');
185
- searchPassThrough.end();
186
- });
187
- return new Promise(function (resolve) {
188
- return bodyStream.on('end', resolve);
189
- });
190
- });
191
- }
192
- }]);
193
- }();
194
78
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","names":["_debug","_interopRequireDefault","require","_lodash","_nodeStream","_proxy","_searchUtils","e","__esModule","_typeof","o","Symbol","iterator","constructor","prototype","_regenerator","t","r","n","toStringTag","i","c","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","apply","_objectSpread","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_arrayLikeToArray","toString","slice","name","Array","from","test","isArray","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","_next","_throw","_classCallCheck","_defineProperties","key","_createClass","_toPrimitive","toPrimitive","String","Number","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","reject","s","next","_return","debug","buildDebug","Search","exports","config","logger","child","module","uplinks","setupUpLinks","getProxyList","uplinksList","_search","_callee","options","_this","results","upLinkList","streamPassThrough","searchUplinksStreams","_iteratorAbruptCompletion","_didIteratorError","_iteratorError","_iterator","_step","chunk","_t","_t2","_context","PassThrough","objectMode","map","uplinkName","uplink","error","consumeSearchStream","allSettled","end","_","pkgItem","_pkgItem$package","concat","verdaccioPkgCached","verdaccioPrivate","err","message","removeDuplicates","search","_x","searchPassThrough","_this2","bodyStream","pipe","on"],"sources":["../src/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport { PassThrough } from 'node:stream';\n\nimport type { searchUtils } from '@verdaccio/core';\nimport type { IProxy, ProxyInstanceList, ProxySearchParams } from '@verdaccio/proxy';\nimport { setupUpLinks } from '@verdaccio/proxy';\nimport type { Config, Logger } from '@verdaccio/types';\n\nimport { removeDuplicates } from './search-utils';\n\nconst debug = buildDebug('verdaccio:search');\n\nclass Search {\n public readonly uplinks: ProxyInstanceList;\n public readonly logger: Logger;\n constructor(config: Config, logger: Logger) {\n this.logger = logger.child({ module: 'proxy' });\n this.uplinks = setupUpLinks(config, this.logger);\n }\n\n private getProxyList() {\n const uplinksList = Object.keys(this.uplinks);\n\n return uplinksList;\n }\n\n /**\n * Handle search on packages and proxies.\n * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses\n * to a stream, once the proxies request has finished search in local storage for all packages\n * (privated and cached).\n */\n public async search(options: ProxySearchParams): Promise<searchUtils.SearchPackageItem[]> {\n const results: searchUtils.SearchPackageItem[] = [];\n const upLinkList = this.getProxyList();\n // const transformResults = new TransFormResults({ objectMode: true });\n const streamPassThrough = new PassThrough({ objectMode: true });\n debug('uplinks found %s', upLinkList.length);\n const searchUplinksStreams = upLinkList.map((uplinkName: string) => {\n const uplink = this.uplinks[uplinkName];\n if (!uplink) {\n // this line should never happens\n this.logger.error({ uplinkName }, 'uplink @uplinkName not found');\n }\n return this.consumeSearchStream(uplinkName, uplink, options, streamPassThrough);\n });\n\n try {\n debug('searching on %s uplinks...', searchUplinksStreams?.length);\n // only process those streams end successfully, if all request fails\n // just include local storage results (if local fails then return 500)\n await Promise.allSettled([...searchUplinksStreams]);\n streamPassThrough.end();\n\n for await (const chunk of streamPassThrough) {\n if (_.isArray(chunk)) {\n (chunk as searchUtils.SearchItem[])\n .filter((pkgItem) => {\n debug(`streaming remote pkg name ${pkgItem?.package?.name}`);\n return true;\n })\n .forEach((pkgItem) => {\n // @ts-ignore\n return results.push({\n ...pkgItem,\n verdaccioPkgCached: false,\n verdaccioPrivate: false,\n });\n });\n }\n }\n debug('searching all uplinks done');\n } catch (err: any) {\n this.logger.error({ err: err?.message }, ' error on uplinks search @{err}');\n throw err;\n }\n\n return removeDuplicates(results);\n }\n\n /**\n * Consume the upstream and pipe it to a transformable stream.\n */\n private consumeSearchStream(\n uplinkName: string,\n uplink: IProxy,\n options: ProxySearchParams,\n searchPassThrough: PassThrough\n ): Promise<any> {\n return uplink.search({ ...options }).then((bodyStream) => {\n bodyStream.pipe(searchPassThrough, { end: false });\n bodyStream.on('error', (err: any): void => {\n this.logger.error(\n { uplinkName, err: err },\n 'search error for uplink @{uplinkName}: @{err?.message}'\n );\n searchPassThrough.end();\n });\n return new Promise((resolve) => bodyStream.on('end', resolve));\n });\n }\n}\n\nexport { Search };\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,WAAA,GAAAF,OAAA;AAIA,IAAAG,MAAA,GAAAH,OAAA;AAGA,IAAAI,YAAA,GAAAJ,OAAA;AAAkD,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,gBAAAA,CAAA;AAAA,SAAAE,QAAAC,CAAA,sCAAAD,OAAA,wBAAAE,MAAA,uBAAAA,MAAA,CAAAC,QAAA,aAAAF,CAAA,kBAAAA,CAAA,gBAAAA,CAAA,WAAAA,CAAA,yBAAAC,MAAA,IAAAD,CAAA,CAAAG,WAAA,KAAAF,MAAA,IAAAD,CAAA,KAAAC,MAAA,CAAAG,SAAA,qBAAAJ,CAAA,KAAAD,OAAA,CAAAC,CAAA;AAAA,SAAAK,aAAA,IARlD,uKAAAR,CAAA,EAAAS,CAAA,EAAAC,CAAA,wBAAAN,MAAA,GAAAA,MAAA,OAAAO,CAAA,GAAAD,CAAA,CAAAL,QAAA,kBAAAF,CAAA,GAAAO,CAAA,CAAAE,WAAA,8BAAAC,EAAAH,CAAA,EAAAC,CAAA,EAAAR,CAAA,EAAAU,CAAA,QAAAC,CAAA,GAAAH,CAAA,IAAAA,CAAA,CAAAJ,SAAA,YAAAQ,SAAA,GAAAJ,CAAA,GAAAI,SAAA,EAAAC,CAAA,GAAAC,MAAA,CAAAC,MAAA,CAAAJ,CAAA,CAAAP,SAAA,UAAAY,mBAAA,CAAAH,CAAA,uBAAAN,CAAA,EAAAC,CAAA,EAAAR,CAAA,QAAAU,CAAA,EAAAC,CAAA,EAAAE,CAAA,EAAAI,CAAA,MAAAC,CAAA,GAAAlB,CAAA,QAAAmB,CAAA,OAAAC,CAAA,KAAAF,CAAA,KAAAV,CAAA,KAAAa,CAAA,EAAAxB,CAAA,EAAAyB,CAAA,EAAAC,CAAA,EAAAN,CAAA,EAAAM,CAAA,CAAAC,IAAA,CAAA3B,CAAA,MAAA0B,CAAA,WAAAA,EAAAjB,CAAA,EAAAC,CAAA,WAAAG,CAAA,GAAAJ,CAAA,EAAAK,CAAA,MAAAE,CAAA,GAAAhB,CAAA,EAAAuB,CAAA,CAAAZ,CAAA,GAAAD,CAAA,EAAAe,CAAA,gBAAAC,EAAAhB,CAAA,EAAAC,CAAA,SAAAG,CAAA,GAAAJ,CAAA,EAAAM,CAAA,GAAAL,CAAA,EAAAF,CAAA,OAAAa,CAAA,IAAAF,CAAA,KAAAjB,CAAA,IAAAM,CAAA,GAAAY,CAAA,CAAAO,MAAA,EAAAnB,CAAA,UAAAN,CAAA,EAAAU,CAAA,GAAAQ,CAAA,CAAAZ,CAAA,GAAAiB,CAAA,GAAAH,CAAA,CAAAF,CAAA,EAAAQ,CAAA,GAAAhB,CAAA,KAAAH,CAAA,QAAAP,CAAA,GAAA0B,CAAA,KAAAlB,CAAA,MAAAK,CAAA,GAAAH,CAAA,EAAAC,CAAA,GAAAD,CAAA,YAAAC,CAAA,WAAAD,CAAA,MAAAA,CAAA,MAAAb,CAAA,IAAAa,CAAA,OAAAa,CAAA,MAAAvB,CAAA,GAAAO,CAAA,QAAAgB,CAAA,GAAAb,CAAA,QAAAC,CAAA,MAAAS,CAAA,CAAAC,CAAA,GAAAb,CAAA,EAAAY,CAAA,CAAAZ,CAAA,GAAAE,CAAA,OAAAa,CAAA,GAAAG,CAAA,KAAA1B,CAAA,GAAAO,CAAA,QAAAG,CAAA,MAAAF,CAAA,IAAAA,CAAA,GAAAkB,CAAA,MAAAhB,CAAA,MAAAH,CAAA,EAAAG,CAAA,MAAAF,CAAA,EAAAY,CAAA,CAAAZ,CAAA,GAAAkB,CAAA,EAAAf,CAAA,cAAAX,CAAA,IAAAO,CAAA,aAAAe,CAAA,QAAAH,CAAA,OAAAX,CAAA,qBAAAR,CAAA,EAAAkB,CAAA,EAAAQ,CAAA,QAAAT,CAAA,YAAAU,SAAA,uCAAAR,CAAA,UAAAD,CAAA,IAAAK,CAAA,CAAAL,CAAA,EAAAQ,CAAA,GAAAf,CAAA,GAAAO,CAAA,EAAAL,CAAA,GAAAa,CAAA,GAAApB,CAAA,GAAAK,CAAA,OAAAd,CAAA,GAAAgB,CAAA,MAAAM,CAAA,KAAAT,CAAA,KAAAC,CAAA,GAAAA,CAAA,QAAAA,CAAA,SAAAS,CAAA,CAAAZ,CAAA,QAAAe,CAAA,CAAAZ,CAAA,EAAAE,CAAA,KAAAO,CAAA,CAAAZ,CAAA,GAAAK,CAAA,GAAAO,CAAA,CAAAC,CAAA,GAAAR,CAAA,aAAAI,CAAA,MAAAP,CAAA,QAAAC,CAAA,KAAAX,CAAA,YAAAM,CAAA,GAAAI,CAAA,CAAAV,CAAA,WAAAM,CAAA,GAAAA,CAAA,CAAAsB,IAAA,CAAAlB,CAAA,EAAAG,CAAA,UAAAc,SAAA,2CAAArB,CAAA,CAAAuB,IAAA,SAAAvB,CAAA,EAAAO,CAAA,GAAAP,CAAA,CAAAwB,KAAA,EAAAnB,CAAA,SAAAA,CAAA,oBAAAA,CAAA,KAAAL,CAAA,GAAAI,CAAA,eAAAJ,CAAA,CAAAsB,IAAA,CAAAlB,CAAA,GAAAC,CAAA,SAAAE,CAAA,GAAAc,SAAA,uCAAA3B,CAAA,gBAAAW,CAAA,OAAAD,CAAA,GAAAb,CAAA,cAAAS,CAAA,IAAAa,CAAA,GAAAC,CAAA,CAAAZ,CAAA,QAAAK,CAAA,GAAAN,CAAA,CAAAqB,IAAA,CAAApB,CAAA,EAAAY,CAAA,OAAAE,CAAA,kBAAAhB,CAAA,IAAAI,CAAA,GAAAb,CAAA,EAAAc,CAAA,MAAAE,CAAA,GAAAP,CAAA,cAAAW,CAAA,mBAAAa,KAAA,EAAAxB,CAAA,EAAAuB,IAAA,EAAAV,CAAA,SAAAZ,CAAA,EAAAP,CAAA,EAAAU,CAAA,QAAAG,CAAA,QAAAS,CAAA,gBAAAV,UAAA,cAAAmB,kBAAA,cAAAC,2BAAA,KAAA1B,CAAA,GAAAQ,MAAA,CAAAmB,cAAA,MAAAtB,CAAA,MAAAH,CAAA,IAAAF,CAAA,CAAAA,CAAA,IAAAE,CAAA,SAAAQ,mBAAA,CAAAV,CAAA,OAAAE,CAAA,iCAAAF,CAAA,GAAAO,CAAA,GAAAmB,0BAAA,CAAA5B,SAAA,GAAAQ,SAAA,CAAAR,SAAA,GAAAU,MAAA,CAAAC,MAAA,CAAAJ,CAAA,YAAAM,EAAApB,CAAA,WAAAiB,MAAA,CAAAoB,cAAA,GAAApB,MAAA,CAAAoB,cAAA,CAAArC,CAAA,EAAAmC,0BAAA,KAAAnC,CAAA,CAAAsC,SAAA,GAAAH,0BAAA,EAAAhB,mBAAA,CAAAnB,CAAA,EAAAG,CAAA,yBAAAH,CAAA,CAAAO,SAAA,GAAAU,MAAA,CAAAC,MAAA,CAAAF,CAAA,GAAAhB,CAAA,WAAAkC,iBAAA,CAAA3B,SAAA,GAAA4B,0BAAA,EAAAhB,mBAAA,CAAAH,CAAA,iBAAAmB,0BAAA,GAAAhB,mBAAA,CAAAgB,0BAAA,iBAAAD,iBAAA,GAAAA,iBAAA,CAAAK,WAAA,wBAAApB,mBAAA,CAAAgB,0BAAA,EAAAhC,CAAA,wBAAAgB,mBAAA,CAAAH,CAAA,GAAAG,mBAAA,CAAAH,CAAA,EAAAb,CAAA,gBAAAgB,mBAAA,CAAAH,CAAA,EAAAL,CAAA,iCAAAQ,mBAAA,CAAAH,CAAA,8DAAAR,YAAA,YAAAA,aAAA,aAAAgC,CAAA,EAAA3B,CAAA,EAAA4B,CAAA,EAAArB,CAAA;AAAA,SAAAD,oBAAAnB,CAAA,EAAAU,CAAA,EAAAC,CAAA,EAAAF,CAAA,QAAAI,CAAA,GAAAI,MAAA,CAAAyB,cAAA,QAAA7B,CAAA,uBAAAb,CAAA,IAAAa,CAAA,QAAAM,mBAAA,YAAAwB,mBAAA3C,CAAA,EAAAU,CAAA,EAAAC,CAAA,EAAAF,CAAA,aAAAN,EAAAO,CAAA,EAAAC,CAAA,IAAAQ,mBAAA,CAAAnB,CAAA,EAAAU,CAAA,YAAAV,CAAA,gBAAA4C,OAAA,CAAAlC,CAAA,EAAAC,CAAA,EAAAX,CAAA,SAAAU,CAAA,GAAAG,CAAA,GAAAA,CAAA,CAAAb,CAAA,EAAAU,CAAA,IAAAuB,KAAA,EAAAtB,CAAA,EAAAkC,UAAA,GAAApC,CAAA,EAAAqC,YAAA,GAAArC,CAAA,EAAAsC,QAAA,GAAAtC,CAAA,MAAAT,CAAA,CAAAU,CAAA,IAAAC,CAAA,IAAAR,CAAA,aAAAA,CAAA,cAAAA,CAAA,mBAAAgB,mBAAA,CAAAnB,CAAA,EAAAU,CAAA,EAAAC,CAAA,EAAAF,CAAA;AAAA,SAAAuC,QAAAhD,CAAA,EAAAU,CAAA,QAAAD,CAAA,GAAAQ,MAAA,CAAAgC,IAAA,CAAAjD,CAAA,OAAAiB,MAAA,CAAAiC,qBAAA,QAAA/C,CAAA,GAAAc,MAAA,CAAAiC,qBAAA,CAAAlD,CAAA,GAAAU,CAAA,KAAAP,CAAA,GAAAA,CAAA,CAAAgD,MAAA,WAAAzC,CAAA,WAAAO,MAAA,CAAAmC,wBAAA,CAAApD,CAAA,EAAAU,CAAA,EAAAmC,UAAA,OAAApC,CAAA,CAAA4C,IAAA,CAAAC,KAAA,CAAA7C,CAAA,EAAAN,CAAA,YAAAM,CAAA;AAAA,SAAA8C,cAAAvD,CAAA,aAAAU,CAAA,MAAAA,CAAA,GAAA8C,SAAA,CAAA5B,MAAA,EAAAlB,CAAA,UAAAD,CAAA,WAAA+C,SAAA,CAAA9C,CAAA,IAAA8C,SAAA,CAAA9C,CAAA,QAAAA,CAAA,OAAAsC,OAAA,CAAA/B,MAAA,CAAAR,CAAA,OAAAgD,OAAA,WAAA/C,CAAA,IAAAgD,eAAA,CAAA1D,CAAA,EAAAU,CAAA,EAAAD,CAAA,CAAAC,CAAA,SAAAO,MAAA,CAAA0C,yBAAA,GAAA1C,MAAA,CAAA2C,gBAAA,CAAA5D,CAAA,EAAAiB,MAAA,CAAA0C,yBAAA,CAAAlD,CAAA,KAAAuC,OAAA,CAAA/B,MAAA,CAAAR,CAAA,GAAAgD,OAAA,WAAA/C,CAAA,IAAAO,MAAA,CAAAyB,cAAA,CAAA1C,CAAA,EAAAU,CAAA,EAAAO,MAAA,CAAAmC,wBAAA,CAAA3C,CAAA,EAAAC,CAAA,iBAAAV,CAAA;AAAA,SAAA0D,gBAAA1D,CAAA,EAAAU,CAAA,EAAAD,CAAA,YAAAC,CAAA,GAAAmD,cAAA,CAAAnD,CAAA,MAAAV,CAAA,GAAAiB,MAAA,CAAAyB,cAAA,CAAA1C,CAAA,EAAAU,CAAA,IAAAuB,KAAA,EAAAxB,CAAA,EAAAoC,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAA/C,CAAA,CAAAU,CAAA,IAAAD,CAAA,EAAAT,CAAA;AAAA,SAAA8D,mBAAApD,CAAA,WAAAqD,kBAAA,CAAArD,CAAA,KAAAsD,gBAAA,CAAAtD,CAAA,KAAAuD,2BAAA,CAAAvD,CAAA,KAAAwD,kBAAA;AAAA,SAAAA,mBAAA,cAAApC,SAAA;AAAA,SAAAmC,4BAAAvD,CAAA,EAAAe,CAAA,QAAAf,CAAA,2BAAAA,CAAA,SAAAyD,iBAAA,CAAAzD,CAAA,EAAAe,CAAA,OAAAhB,CAAA,MAAA2D,QAAA,CAAArC,IAAA,CAAArB,CAAA,EAAA2D,KAAA,6BAAA5D,CAAA,IAAAC,CAAA,CAAAJ,WAAA,KAAAG,CAAA,GAAAC,CAAA,CAAAJ,WAAA,CAAAgE,IAAA,aAAA7D,CAAA,cAAAA,CAAA,GAAA8D,KAAA,CAAAC,IAAA,CAAA9D,CAAA,oBAAAD,CAAA,+CAAAgE,IAAA,CAAAhE,CAAA,IAAA0D,iBAAA,CAAAzD,CAAA,EAAAe,CAAA;AAAA,SAAAuC,iBAAAtD,CAAA,8BAAAN,MAAA,YAAAM,CAAA,CAAAN,MAAA,CAAAC,QAAA,aAAAK,CAAA,uBAAA6D,KAAA,CAAAC,IAAA,CAAA9D,CAAA;AAAA,SAAAqD,mBAAArD,CAAA,QAAA6D,KAAA,CAAAG,OAAA,CAAAhE,CAAA,UAAAyD,iBAAA,CAAAzD,CAAA;AAAA,SAAAyD,kBAAAzD,CAAA,EAAAe,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAf,CAAA,CAAAkB,MAAA,MAAAH,CAAA,GAAAf,CAAA,CAAAkB,MAAA,YAAA5B,CAAA,MAAAW,CAAA,GAAA4D,KAAA,CAAA9C,CAAA,GAAAzB,CAAA,GAAAyB,CAAA,EAAAzB,CAAA,IAAAW,CAAA,CAAAX,CAAA,IAAAU,CAAA,CAAAV,CAAA,UAAAW,CAAA;AAAA,SAAAgE,mBAAAhE,CAAA,EAAAF,CAAA,EAAAT,CAAA,EAAAU,CAAA,EAAAP,CAAA,EAAAsB,CAAA,EAAAX,CAAA,cAAAD,CAAA,GAAAF,CAAA,CAAAc,CAAA,EAAAX,CAAA,GAAAE,CAAA,GAAAH,CAAA,CAAAoB,KAAA,WAAAtB,CAAA,gBAAAX,CAAA,CAAAW,CAAA,KAAAE,CAAA,CAAAmB,IAAA,GAAAvB,CAAA,CAAAO,CAAA,IAAA4D,OAAA,CAAAC,OAAA,CAAA7D,CAAA,EAAA8D,IAAA,CAAApE,CAAA,EAAAP,CAAA;AAAA,SAAA4E,kBAAApE,CAAA,6BAAAF,CAAA,SAAAT,CAAA,GAAAwD,SAAA,aAAAoB,OAAA,WAAAlE,CAAA,EAAAP,CAAA,QAAAsB,CAAA,GAAAd,CAAA,CAAA2C,KAAA,CAAA7C,CAAA,EAAAT,CAAA,YAAAgF,MAAArE,CAAA,IAAAgE,kBAAA,CAAAlD,CAAA,EAAAf,CAAA,EAAAP,CAAA,EAAA6E,KAAA,EAAAC,MAAA,UAAAtE,CAAA,cAAAsE,OAAAtE,CAAA,IAAAgE,kBAAA,CAAAlD,CAAA,EAAAf,CAAA,EAAAP,CAAA,EAAA6E,KAAA,EAAAC,MAAA,WAAAtE,CAAA,KAAAqE,KAAA;AAAA,SAAAE,gBAAAzD,CAAA,EAAAd,CAAA,UAAAc,CAAA,YAAAd,CAAA,aAAAmB,SAAA;AAAA,SAAAqD,kBAAAnF,CAAA,EAAAU,CAAA,aAAAD,CAAA,MAAAA,CAAA,GAAAC,CAAA,CAAAkB,MAAA,EAAAnB,CAAA,UAAAN,CAAA,GAAAO,CAAA,CAAAD,CAAA,GAAAN,CAAA,CAAA0C,UAAA,GAAA1C,CAAA,CAAA0C,UAAA,QAAA1C,CAAA,CAAA2C,YAAA,kBAAA3C,CAAA,KAAAA,CAAA,CAAA4C,QAAA,QAAA9B,MAAA,CAAAyB,cAAA,CAAA1C,CAAA,EAAA6D,cAAA,CAAA1D,CAAA,CAAAiF,GAAA,GAAAjF,CAAA;AAAA,SAAAkF,aAAArF,CAAA,EAAAU,CAAA,EAAAD,CAAA,WAAAC,CAAA,IAAAyE,iBAAA,CAAAnF,CAAA,CAAAO,SAAA,EAAAG,CAAA,GAAAD,CAAA,IAAA0E,iBAAA,CAAAnF,CAAA,EAAAS,CAAA,GAAAQ,MAAA,CAAAyB,cAAA,CAAA1C,CAAA,iBAAA+C,QAAA,SAAA/C,CAAA;AAAA,SAAA6D,eAAApD,CAAA,QAAAI,CAAA,GAAAyE,YAAA,CAAA7E,CAAA,gCAAAP,OAAA,CAAAW,CAAA,IAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAyE,aAAA7E,CAAA,EAAAC,CAAA,oBAAAR,OAAA,CAAAO,CAAA,MAAAA,CAAA,SAAAA,CAAA,MAAAT,CAAA,GAAAS,CAAA,CAAAL,MAAA,CAAAmF,WAAA,kBAAAvF,CAAA,QAAAa,CAAA,GAAAb,CAAA,CAAA+B,IAAA,CAAAtB,CAAA,EAAAC,CAAA,gCAAAR,OAAA,CAAAW,CAAA,UAAAA,CAAA,YAAAiB,SAAA,yEAAApB,CAAA,GAAA8E,MAAA,GAAAC,MAAA,EAAAhF,CAAA;AAAA,SAAAiF,eAAAhF,CAAA,QAAAC,CAAA,EAAAF,CAAA,EAAAN,CAAA,EAAAH,CAAA,iCAAAI,MAAA,KAAAK,CAAA,GAAAL,MAAA,CAAAuF,aAAA,EAAAxF,CAAA,GAAAC,MAAA,CAAAC,QAAA,GAAAL,CAAA,WAAAS,CAAA,aAAAE,CAAA,GAAAD,CAAA,CAAAD,CAAA,WAAAE,CAAA,CAAAoB,IAAA,CAAArB,CAAA,OAAAP,CAAA,aAAAQ,CAAA,GAAAD,CAAA,CAAAP,CAAA,eAAAyF,qBAAA,CAAAjF,CAAA,CAAAoB,IAAA,CAAArB,CAAA,IAAAD,CAAA,sBAAAN,CAAA,6BAAA2B,SAAA;AAAA,SAAA8D,sBAAAlF,CAAA,aAAAmF,kCAAAnF,CAAA,QAAAO,MAAA,CAAAP,CAAA,MAAAA,CAAA,SAAAkE,OAAA,CAAAkB,MAAA,KAAAhE,SAAA,CAAApB,CAAA,+BAAAC,CAAA,GAAAD,CAAA,CAAAsB,IAAA,SAAA4C,OAAA,CAAAC,OAAA,CAAAnE,CAAA,CAAAuB,KAAA,EAAA6C,IAAA,WAAApE,CAAA,aAAAuB,KAAA,EAAAvB,CAAA,EAAAsB,IAAA,EAAArB,CAAA,iBAAAiF,qBAAA,YAAAA,sBAAAlF,CAAA,SAAAqF,CAAA,GAAArF,CAAA,OAAAC,CAAA,GAAAD,CAAA,CAAAsF,IAAA,KAAAJ,qBAAA,CAAArF,SAAA,KAAAwF,CAAA,QAAApF,CAAA,QAAAqF,IAAA,WAAAA,KAAA,WAAAH,iCAAA,MAAAlF,CAAA,CAAA2C,KAAA,MAAAyC,CAAA,EAAAvC,SAAA,0BAAAyC,QAAAvF,CAAA,QAAAC,CAAA,QAAAoF,CAAA,8BAAApF,CAAA,GAAAiE,OAAA,CAAAC,OAAA,GAAA5C,KAAA,EAAAvB,CAAA,EAAAsB,IAAA,UAAA6D,iCAAA,CAAAlF,CAAA,CAAA2C,KAAA,MAAAyC,CAAA,EAAAvC,SAAA,yBAAAyB,OAAAvE,CAAA,QAAAC,CAAA,QAAAoF,CAAA,8BAAApF,CAAA,GAAAiE,OAAA,CAAAkB,MAAA,CAAApF,CAAA,IAAAmF,iCAAA,CAAAlF,CAAA,CAAA2C,KAAA,MAAAyC,CAAA,EAAAvC,SAAA,aAAAoC,qBAAA,CAAAlF,CAAA;AAUA,IAAMwF,KAAK,GAAG,IAAAC,iBAAU,EAAC,kBAAkB,CAAC;AAAC,IAEvCC,MAAM,GAAAC,OAAA,CAAAD,MAAA;EAGV,SAAAA,OAAYE,MAAc,EAAEC,MAAc,EAAE;IAAArB,eAAA,OAAAkB,MAAA;IAC1C,IAAI,CAACG,MAAM,GAAGA,MAAM,CAACC,KAAK,CAAC;MAAEC,MAAM,EAAE;IAAQ,CAAC,CAAC;IAC/C,IAAI,CAACC,OAAO,GAAG,IAAAC,mBAAY,EAACL,MAAM,EAAE,IAAI,CAACC,MAAM,CAAC;EAClD;EAAC,OAAAlB,YAAA,CAAAe,MAAA;IAAAhB,GAAA;IAAAnD,KAAA,EAED,SAAQ2E,YAAYA,CAAA,EAAG;MACrB,IAAMC,WAAW,GAAG5F,MAAM,CAACgC,IAAI,CAAC,IAAI,CAACyD,OAAO,CAAC;MAE7C,OAAOG,WAAW;IACpB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAzB,GAAA;IAAAnD,KAAA;MAAA,IAAA6E,OAAA,GAAA/B,iBAAA,cAAAvE,YAAA,GAAAiC,CAAA,CAMA,SAAAsE,QAAoBC,OAA0B;QAAA,IAAAC,KAAA;QAAA,IAAAC,OAAA,EAAAC,UAAA,EAAAC,iBAAA,EAAAC,oBAAA,EAAAC,yBAAA,EAAAC,iBAAA,EAAAC,cAAA,EAAAC,SAAA,EAAAC,KAAA,EAAAC,KAAA,EAAAC,EAAA,EAAAC,GAAA;QAAA,OAAArH,YAAA,GAAAgC,CAAA,WAAAsF,QAAA;UAAA,kBAAAA,QAAA,CAAAzG,CAAA,GAAAyG,QAAA,CAAAnH,CAAA;YAAA;cACtCuG,OAAwC,GAAG,EAAE;cAC7CC,UAAU,GAAG,IAAI,CAACP,YAAY,CAAC,CAAC,EACtC;cACMQ,iBAAiB,GAAG,IAAIW,uBAAW,CAAC;gBAAEC,UAAU,EAAE;cAAK,CAAC,CAAC;cAC/D9B,KAAK,CAAC,kBAAkB,EAAEiB,UAAU,CAACvF,MAAM,CAAC;cACtCyF,oBAAoB,GAAGF,UAAU,CAACc,GAAG,CAAC,UAACC,UAAkB,EAAK;gBAClE,IAAMC,MAAM,GAAGlB,KAAI,CAACP,OAAO,CAACwB,UAAU,CAAC;gBACvC,IAAI,CAACC,MAAM,EAAE;kBACX;kBACAlB,KAAI,CAACV,MAAM,CAAC6B,KAAK,CAAC;oBAAEF,UAAU,EAAVA;kBAAW,CAAC,EAAE,8BAA8B,CAAC;gBACnE;gBACA,OAAOjB,KAAI,CAACoB,mBAAmB,CAACH,UAAU,EAAEC,MAAM,EAAEnB,OAAO,EAAEI,iBAAiB,CAAC;cACjF,CAAC,CAAC;cAAAU,QAAA,CAAAzG,CAAA;cAGA6E,KAAK,CAAC,4BAA4B,EAAEmB,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAEzF,MAAM,CAAC;cACjE;cACA;cAAAkG,QAAA,CAAAnH,CAAA;cAAA,OACMiE,OAAO,CAAC0D,UAAU,CAAAxE,kBAAA,CAAKuD,oBAAoB,CAAC,CAAC;YAAA;cACnDD,iBAAiB,CAACmB,GAAG,CAAC,CAAC;cAACjB,yBAAA;cAAAC,iBAAA;cAAAO,QAAA,CAAAzG,CAAA;cAAAoG,SAAA,GAAA/B,cAAA,CAEE0B,iBAAiB;YAAA;cAAAU,QAAA,CAAAnH,CAAA;cAAA,OAAA8G,SAAA,CAAAzB,IAAA;YAAA;cAAA,MAAAsB,yBAAA,KAAAI,KAAA,GAAAI,QAAA,CAAAtG,CAAA,EAAAQ,IAAA;gBAAA8F,QAAA,CAAAnH,CAAA;gBAAA;cAAA;cAA1BgH,KAAK,GAAAD,KAAA,CAAAzF,KAAA;cACpB,IAAIuG,kBAAC,CAAC9D,OAAO,CAACiD,KAAK,CAAC,EAAE;gBACnBA,KAAK,CACHxE,MAAM,CAAC,UAACsF,OAAO,EAAK;kBAAA,IAAAC,gBAAA;kBACnBxC,KAAK,8BAAAyC,MAAA,CAA8BF,OAAO,aAAPA,OAAO,gBAAAC,gBAAA,GAAPD,OAAO,WAAS,cAAAC,gBAAA,uBAAhBA,gBAAA,CAAkBpE,IAAI,CAAE,CAAC;kBAC5D,OAAO,IAAI;gBACb,CAAC,CAAC,CACDb,OAAO,CAAC,UAACgF,OAAO,EAAK;kBACpB;kBACA,OAAOvB,OAAO,CAAC7D,IAAI,CAAAE,aAAA,CAAAA,aAAA,KACdkF,OAAO;oBACVG,kBAAkB,EAAE,KAAK;oBACzBC,gBAAgB,EAAE;kBAAK,EACxB,CAAC;gBACJ,CAAC,CAAC;cACN;YAAC;cAAAvB,yBAAA;cAAAQ,QAAA,CAAAnH,CAAA;cAAA;YAAA;cAAAmH,QAAA,CAAAnH,CAAA;cAAA;YAAA;cAAAmH,QAAA,CAAAzG,CAAA;cAAAuG,EAAA,GAAAE,QAAA,CAAAtG,CAAA;cAAA+F,iBAAA;cAAAC,cAAA,GAAAI,EAAA;YAAA;cAAAE,QAAA,CAAAzG,CAAA;cAAAyG,QAAA,CAAAzG,CAAA;cAAA,MAAAiG,yBAAA,IAAAG,SAAA;gBAAAK,QAAA,CAAAnH,CAAA;gBAAA;cAAA;cAAAmH,QAAA,CAAAnH,CAAA;cAAA,OAAA8G,SAAA;YAAA;cAAAK,QAAA,CAAAzG,CAAA;cAAA,KAAAkG,iBAAA;gBAAAO,QAAA,CAAAnH,CAAA;gBAAA;cAAA;cAAA,MAAA6G,cAAA;YAAA;cAAA,OAAAM,QAAA,CAAA1G,CAAA;YAAA;cAAA,OAAA0G,QAAA,CAAA1G,CAAA;YAAA;cAEH8E,KAAK,CAAC,4BAA4B,CAAC;cAAC4B,QAAA,CAAAnH,CAAA;cAAA;YAAA;cAAAmH,QAAA,CAAAzG,CAAA;cAAAwG,GAAA,GAAAC,QAAA,CAAAtG,CAAA;cAEpC,IAAI,CAAC+E,MAAM,CAAC6B,KAAK,CAAC;gBAAEU,GAAG,EAAAjB,GAAA,aAAAA,GAAA,uBAAEA,GAAA,CAAKkB;cAAQ,CAAC,EAAE,iCAAiC,CAAC;cAAC,MAAAlB,GAAA;YAAA;cAAA,OAAAC,QAAA,CAAArG,CAAA,IAIvE,IAAAuH,6BAAgB,EAAC9B,OAAO,CAAC;UAAA;QAAA,GAAAH,OAAA;MAAA,CACjC;MAAA,SA9CYkC,MAAMA,CAAAC,EAAA;QAAA,OAAApC,OAAA,CAAAxD,KAAA,OAAAE,SAAA;MAAA;MAAA,OAANyF,MAAM;IAAA;IAgDnB;AACF;AACA;IAFE;EAAA;IAAA7D,GAAA;IAAAnD,KAAA,EAGA,SAAQoG,mBAAmBA,CACzBH,UAAkB,EAClBC,MAAc,EACdnB,OAA0B,EAC1BmC,iBAA8B,EAChB;MAAA,IAAAC,MAAA;MACd,OAAOjB,MAAM,CAACc,MAAM,CAAA1F,aAAA,KAAMyD,OAAO,CAAE,CAAC,CAAClC,IAAI,CAAC,UAACuE,UAAU,EAAK;QACxDA,UAAU,CAACC,IAAI,CAACH,iBAAiB,EAAE;UAAEZ,GAAG,EAAE;QAAM,CAAC,CAAC;QAClDc,UAAU,CAACE,EAAE,CAAC,OAAO,EAAE,UAACT,GAAQ,EAAW;UACzCM,MAAI,CAAC7C,MAAM,CAAC6B,KAAK,CACf;YAAEF,UAAU,EAAVA,UAAU;YAAEY,GAAG,EAAEA;UAAI,CAAC,EACxB,wDACF,CAAC;UACDK,iBAAiB,CAACZ,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC;QACF,OAAO,IAAI3D,OAAO,CAAC,UAACC,OAAO;UAAA,OAAKwE,UAAU,CAACE,EAAE,CAAC,KAAK,EAAE1E,OAAO,CAAC;QAAA,EAAC;MAChE,CAAC,CAAC;IACJ;EAAC;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"search.js","names":[],"sources":["../src/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport { PassThrough } from 'node:stream';\n\nimport type { searchUtils } from '@verdaccio/core';\nimport type { IProxy, ProxyInstanceList, ProxySearchParams } from '@verdaccio/proxy';\nimport { setupUpLinks } from '@verdaccio/proxy';\nimport type { Config, Logger } from '@verdaccio/types';\n\nimport { removeDuplicates } from './search-utils';\n\nconst debug = buildDebug('verdaccio:search');\n\nclass Search {\n public readonly uplinks: ProxyInstanceList;\n public readonly logger: Logger;\n constructor(config: Config, logger: Logger) {\n this.logger = logger.child({ module: 'proxy' });\n this.uplinks = setupUpLinks(config, this.logger);\n }\n\n private getProxyList() {\n const uplinksList = Object.keys(this.uplinks);\n\n return uplinksList;\n }\n\n /**\n * Handle search on packages and proxies.\n * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses\n * to a stream, once the proxies request has finished search in local storage for all packages\n * (privated and cached).\n */\n public async search(options: ProxySearchParams): Promise<searchUtils.SearchPackageItem[]> {\n const results: searchUtils.SearchPackageItem[] = [];\n const upLinkList = this.getProxyList();\n // const transformResults = new TransFormResults({ objectMode: true });\n const streamPassThrough = new PassThrough({ objectMode: true });\n debug('uplinks found %s', upLinkList.length);\n const searchUplinksStreams = upLinkList.map((uplinkName: string) => {\n const uplink = this.uplinks[uplinkName];\n if (!uplink) {\n // this line should never happens\n this.logger.error({ uplinkName }, 'uplink @uplinkName not found');\n }\n return this.consumeSearchStream(uplinkName, uplink, options, streamPassThrough);\n });\n\n try {\n debug('searching on %s uplinks...', searchUplinksStreams?.length);\n // only process those streams end successfully, if all request fails\n // just include local storage results (if local fails then return 500)\n await Promise.allSettled([...searchUplinksStreams]);\n streamPassThrough.end();\n\n for await (const chunk of streamPassThrough) {\n if (_.isArray(chunk)) {\n (chunk as searchUtils.SearchItem[])\n .filter((pkgItem) => {\n debug(`streaming remote pkg name ${pkgItem?.package?.name}`);\n return true;\n })\n .forEach((pkgItem) => {\n // @ts-ignore\n return results.push({\n ...pkgItem,\n verdaccioPkgCached: false,\n verdaccioPrivate: false,\n });\n });\n }\n }\n debug('searching all uplinks done');\n } catch (err: any) {\n this.logger.error({ err: err?.message }, ' error on uplinks search @{err}');\n throw err;\n }\n\n return removeDuplicates(results);\n }\n\n /**\n * Consume the upstream and pipe it to a transformable stream.\n */\n private consumeSearchStream(\n uplinkName: string,\n uplink: IProxy,\n options: ProxySearchParams,\n searchPassThrough: PassThrough\n ): Promise<any> {\n return uplink.search({ ...options }).then((bodyStream) => {\n bodyStream.pipe(searchPassThrough, { end: false });\n bodyStream.on('error', (err: any): void => {\n this.logger.error(\n { uplinkName, err: err },\n 'search error for uplink @{uplinkName}: @{err?.message}'\n );\n searchPassThrough.end();\n });\n return new Promise((resolve) => bodyStream.on('end', resolve));\n });\n }\n}\n\nexport { Search };\n"],"mappings":";;;;;;;;;AAWA,IAAM,WAAA,GAAA,MAAA,SAAmB,mBAAmB;AAE5C,IAAM,SAAN,MAAa;CACX;CACA;CACA,YAAY,QAAgB,QAAgB;AAC1C,OAAK,SAAS,OAAO,MAAM,EAAE,QAAQ,SAAS,CAAC;AAC/C,OAAK,WAAA,GAAA,iBAAA,cAAuB,QAAQ,KAAK,OAAO;;CAGlD,eAAuB;AAGrB,SAFoB,OAAO,KAAK,KAAK,QAAQ;;;;;;;;CAW/C,MAAa,OAAO,SAAsE;EACxF,MAAM,UAA2C,EAAE;EACnD,MAAM,aAAa,KAAK,cAAc;EAEtC,MAAM,oBAAoB,IAAI,YAAA,YAAY,EAAE,YAAY,MAAM,CAAC;AAC/D,UAAM,oBAAoB,WAAW,OAAO;EAC5C,MAAM,uBAAuB,WAAW,KAAK,eAAuB;GAClE,MAAM,SAAS,KAAK,QAAQ;AAC5B,OAAI,CAAC,OAEH,MAAK,OAAO,MAAM,EAAE,YAAY,EAAE,+BAA+B;AAEnE,UAAO,KAAK,oBAAoB,YAAY,QAAQ,SAAS,kBAAkB;IAC/E;AAEF,MAAI;AACF,WAAM,8BAA8B,sBAAsB,OAAO;AAGjE,SAAM,QAAQ,WAAW,CAAC,GAAG,qBAAqB,CAAC;AACnD,qBAAkB,KAAK;AAEvB,cAAW,MAAM,SAAS,kBACxB,KAAI,OAAA,QAAE,QAAQ,MAAM,CACjB,OACE,QAAQ,YAAY;AACnB,YAAM,6BAA6B,SAAS,SAAS,OAAO;AAC5D,WAAO;KACP,CACD,SAAS,YAAY;AAEpB,WAAO,QAAQ,KAAK;KAClB,GAAG;KACH,oBAAoB;KACpB,kBAAkB;KACnB,CAAC;KACF;AAGR,WAAM,6BAA6B;WAC5B,KAAU;AACjB,QAAK,OAAO,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,kCAAkC;AAC3E,SAAM;;AAGR,SAAO,qBAAA,iBAAiB,QAAQ;;;;;CAMlC,oBACE,YACA,QACA,SACA,mBACc;AACd,SAAO,OAAO,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,MAAM,eAAe;AACxD,cAAW,KAAK,mBAAmB,EAAE,KAAK,OAAO,CAAC;AAClD,cAAW,GAAG,UAAU,QAAmB;AACzC,SAAK,OAAO,MACV;KAAE;KAAiB;KAAK,EACxB,yDACD;AACD,sBAAkB,KAAK;KACvB;AACF,UAAO,IAAI,SAAS,YAAY,WAAW,GAAG,OAAO,QAAQ,CAAC;IAC9D"}
@@ -0,0 +1,75 @@
1
+ import { removeDuplicates } from "./search-utils.mjs";
2
+ import buildDebug from "debug";
3
+ import _ from "lodash";
4
+ import { PassThrough } from "node:stream";
5
+ import { setupUpLinks } from "@verdaccio/proxy";
6
+ //#region src/search.ts
7
+ var debug = buildDebug("verdaccio:search");
8
+ var Search = class {
9
+ uplinks;
10
+ logger;
11
+ constructor(config, logger) {
12
+ this.logger = logger.child({ module: "proxy" });
13
+ this.uplinks = setupUpLinks(config, this.logger);
14
+ }
15
+ getProxyList() {
16
+ return Object.keys(this.uplinks);
17
+ }
18
+ /**
19
+ * Handle search on packages and proxies.
20
+ * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses
21
+ * to a stream, once the proxies request has finished search in local storage for all packages
22
+ * (privated and cached).
23
+ */
24
+ async search(options) {
25
+ const results = [];
26
+ const upLinkList = this.getProxyList();
27
+ const streamPassThrough = new PassThrough({ objectMode: true });
28
+ debug("uplinks found %s", upLinkList.length);
29
+ const searchUplinksStreams = upLinkList.map((uplinkName) => {
30
+ const uplink = this.uplinks[uplinkName];
31
+ if (!uplink) this.logger.error({ uplinkName }, "uplink @uplinkName not found");
32
+ return this.consumeSearchStream(uplinkName, uplink, options, streamPassThrough);
33
+ });
34
+ try {
35
+ debug("searching on %s uplinks...", searchUplinksStreams?.length);
36
+ await Promise.allSettled([...searchUplinksStreams]);
37
+ streamPassThrough.end();
38
+ for await (const chunk of streamPassThrough) if (_.isArray(chunk)) chunk.filter((pkgItem) => {
39
+ debug(`streaming remote pkg name ${pkgItem?.package?.name}`);
40
+ return true;
41
+ }).forEach((pkgItem) => {
42
+ return results.push({
43
+ ...pkgItem,
44
+ verdaccioPkgCached: false,
45
+ verdaccioPrivate: false
46
+ });
47
+ });
48
+ debug("searching all uplinks done");
49
+ } catch (err) {
50
+ this.logger.error({ err: err?.message }, " error on uplinks search @{err}");
51
+ throw err;
52
+ }
53
+ return removeDuplicates(results);
54
+ }
55
+ /**
56
+ * Consume the upstream and pipe it to a transformable stream.
57
+ */
58
+ consumeSearchStream(uplinkName, uplink, options, searchPassThrough) {
59
+ return uplink.search({ ...options }).then((bodyStream) => {
60
+ bodyStream.pipe(searchPassThrough, { end: false });
61
+ bodyStream.on("error", (err) => {
62
+ this.logger.error({
63
+ uplinkName,
64
+ err
65
+ }, "search error for uplink @{uplinkName}: @{err?.message}");
66
+ searchPassThrough.end();
67
+ });
68
+ return new Promise((resolve) => bodyStream.on("end", resolve));
69
+ });
70
+ }
71
+ };
72
+ //#endregion
73
+ export { Search };
74
+
75
+ //# sourceMappingURL=search.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.mjs","names":[],"sources":["../src/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\nimport { PassThrough } from 'node:stream';\n\nimport type { searchUtils } from '@verdaccio/core';\nimport type { IProxy, ProxyInstanceList, ProxySearchParams } from '@verdaccio/proxy';\nimport { setupUpLinks } from '@verdaccio/proxy';\nimport type { Config, Logger } from '@verdaccio/types';\n\nimport { removeDuplicates } from './search-utils';\n\nconst debug = buildDebug('verdaccio:search');\n\nclass Search {\n public readonly uplinks: ProxyInstanceList;\n public readonly logger: Logger;\n constructor(config: Config, logger: Logger) {\n this.logger = logger.child({ module: 'proxy' });\n this.uplinks = setupUpLinks(config, this.logger);\n }\n\n private getProxyList() {\n const uplinksList = Object.keys(this.uplinks);\n\n return uplinksList;\n }\n\n /**\n * Handle search on packages and proxies.\n * Iterate all proxies configured and search in all endpoints in v2 and pipe all responses\n * to a stream, once the proxies request has finished search in local storage for all packages\n * (privated and cached).\n */\n public async search(options: ProxySearchParams): Promise<searchUtils.SearchPackageItem[]> {\n const results: searchUtils.SearchPackageItem[] = [];\n const upLinkList = this.getProxyList();\n // const transformResults = new TransFormResults({ objectMode: true });\n const streamPassThrough = new PassThrough({ objectMode: true });\n debug('uplinks found %s', upLinkList.length);\n const searchUplinksStreams = upLinkList.map((uplinkName: string) => {\n const uplink = this.uplinks[uplinkName];\n if (!uplink) {\n // this line should never happens\n this.logger.error({ uplinkName }, 'uplink @uplinkName not found');\n }\n return this.consumeSearchStream(uplinkName, uplink, options, streamPassThrough);\n });\n\n try {\n debug('searching on %s uplinks...', searchUplinksStreams?.length);\n // only process those streams end successfully, if all request fails\n // just include local storage results (if local fails then return 500)\n await Promise.allSettled([...searchUplinksStreams]);\n streamPassThrough.end();\n\n for await (const chunk of streamPassThrough) {\n if (_.isArray(chunk)) {\n (chunk as searchUtils.SearchItem[])\n .filter((pkgItem) => {\n debug(`streaming remote pkg name ${pkgItem?.package?.name}`);\n return true;\n })\n .forEach((pkgItem) => {\n // @ts-ignore\n return results.push({\n ...pkgItem,\n verdaccioPkgCached: false,\n verdaccioPrivate: false,\n });\n });\n }\n }\n debug('searching all uplinks done');\n } catch (err: any) {\n this.logger.error({ err: err?.message }, ' error on uplinks search @{err}');\n throw err;\n }\n\n return removeDuplicates(results);\n }\n\n /**\n * Consume the upstream and pipe it to a transformable stream.\n */\n private consumeSearchStream(\n uplinkName: string,\n uplink: IProxy,\n options: ProxySearchParams,\n searchPassThrough: PassThrough\n ): Promise<any> {\n return uplink.search({ ...options }).then((bodyStream) => {\n bodyStream.pipe(searchPassThrough, { end: false });\n bodyStream.on('error', (err: any): void => {\n this.logger.error(\n { uplinkName, err: err },\n 'search error for uplink @{uplinkName}: @{err?.message}'\n );\n searchPassThrough.end();\n });\n return new Promise((resolve) => bodyStream.on('end', resolve));\n });\n }\n}\n\nexport { Search };\n"],"mappings":";;;;;;AAWA,IAAM,QAAQ,WAAW,mBAAmB;AAE5C,IAAM,SAAN,MAAa;CACX;CACA;CACA,YAAY,QAAgB,QAAgB;AAC1C,OAAK,SAAS,OAAO,MAAM,EAAE,QAAQ,SAAS,CAAC;AAC/C,OAAK,UAAU,aAAa,QAAQ,KAAK,OAAO;;CAGlD,eAAuB;AAGrB,SAFoB,OAAO,KAAK,KAAK,QAAQ;;;;;;;;CAW/C,MAAa,OAAO,SAAsE;EACxF,MAAM,UAA2C,EAAE;EACnD,MAAM,aAAa,KAAK,cAAc;EAEtC,MAAM,oBAAoB,IAAI,YAAY,EAAE,YAAY,MAAM,CAAC;AAC/D,QAAM,oBAAoB,WAAW,OAAO;EAC5C,MAAM,uBAAuB,WAAW,KAAK,eAAuB;GAClE,MAAM,SAAS,KAAK,QAAQ;AAC5B,OAAI,CAAC,OAEH,MAAK,OAAO,MAAM,EAAE,YAAY,EAAE,+BAA+B;AAEnE,UAAO,KAAK,oBAAoB,YAAY,QAAQ,SAAS,kBAAkB;IAC/E;AAEF,MAAI;AACF,SAAM,8BAA8B,sBAAsB,OAAO;AAGjE,SAAM,QAAQ,WAAW,CAAC,GAAG,qBAAqB,CAAC;AACnD,qBAAkB,KAAK;AAEvB,cAAW,MAAM,SAAS,kBACxB,KAAI,EAAE,QAAQ,MAAM,CACjB,OACE,QAAQ,YAAY;AACnB,UAAM,6BAA6B,SAAS,SAAS,OAAO;AAC5D,WAAO;KACP,CACD,SAAS,YAAY;AAEpB,WAAO,QAAQ,KAAK;KAClB,GAAG;KACH,oBAAoB;KACpB,kBAAkB;KACnB,CAAC;KACF;AAGR,SAAM,6BAA6B;WAC5B,KAAU;AACjB,QAAK,OAAO,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,kCAAkC;AAC3E,SAAM;;AAGR,SAAO,iBAAiB,QAAQ;;;;;CAMlC,oBACE,YACA,QACA,SACA,mBACc;AACd,SAAO,OAAO,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,MAAM,eAAe;AACxD,cAAW,KAAK,mBAAmB,EAAE,KAAK,OAAO,CAAC;AAClD,cAAW,GAAG,UAAU,QAAmB;AACzC,SAAK,OAAO,MACV;KAAE;KAAiB;KAAK,EACxB,yDACD;AACD,sBAAkB,KAAK;KACvB;AACF,UAAO,IAAI,SAAS,YAAY,WAAW,GAAG,OAAO,QAAQ,CAAC;IAC9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/search",
3
- "version": "9.0.0-next-9.3",
3
+ "version": "9.0.0-next-9.4",
4
4
  "description": "Verdaccio Search Proxy",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -33,10 +33,10 @@
33
33
  "node": ">=24"
34
34
  },
35
35
  "dependencies": {
36
- "@verdaccio/config": "9.0.0-next-9.3",
37
- "@verdaccio/core": "9.0.0-next-9.3",
38
- "@verdaccio/logger": "9.0.0-next-9.3",
39
- "@verdaccio/proxy": "9.0.0-next-9.3",
36
+ "@verdaccio/config": "9.0.0-next-9.4",
37
+ "@verdaccio/core": "9.0.0-next-9.4",
38
+ "@verdaccio/logger": "9.0.0-next-9.4",
39
+ "@verdaccio/proxy": "9.0.0-next-9.4",
40
40
  "debug": "4.4.3",
41
41
  "lodash": "4.17.23"
42
42
  },
@@ -49,13 +49,24 @@
49
49
  "type": "opencollective",
50
50
  "url": "https://opencollective.com/verdaccio"
51
51
  },
52
+ "module": "./build/index.mjs",
53
+ "exports": {
54
+ ".": {
55
+ "import": {
56
+ "types": "./build/index.d.ts",
57
+ "default": "./build/index.mjs"
58
+ },
59
+ "require": {
60
+ "types": "./build/index.d.ts",
61
+ "default": "./build/index.js"
62
+ }
63
+ },
64
+ "./build/*": "./build/*"
65
+ },
52
66
  "scripts": {
53
67
  "clean": "rimraf ./build",
54
68
  "test": "vitest run",
55
- "type-check": "tsc --noEmit -p tsconfig.build.json",
56
- "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
57
- "build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
58
- "watch": "pnpm build:js -- --watch",
59
- "build": "pnpm run build:js && pnpm run build:types"
69
+ "watch": "vite build --watch",
70
+ "build": "vite build"
60
71
  }
61
72
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["_search","require","_searchUtils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get"],"sources":["../src/index.ts"],"sourcesContent":["export { Search as default } from './search';\nexport * from './search-utils';\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,YAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,YAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAZ,YAAA,CAAAI,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}