cnpmcore 0.0.2 → 1.2.0

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.
Files changed (243) hide show
  1. package/History.md +19 -0
  2. package/LICENSE +1 -1
  3. package/README.md +13 -4
  4. package/dist/app/common/AbstractService.d.ts +5 -0
  5. package/dist/app/{port/type/BaseController.js → common/AbstractService.js} +11 -9
  6. package/dist/app/common/FileUtil.d.ts +15 -0
  7. package/dist/app/common/FileUtil.js +77 -0
  8. package/dist/app/common/PackageUtil.d.ts +9 -0
  9. package/dist/app/common/PackageUtil.js +38 -16
  10. package/dist/app/common/SyncUtil.d.ts +2 -0
  11. package/dist/app/common/SyncUtil.js +17 -0
  12. package/dist/app/common/UserUtil.d.ts +5 -0
  13. package/dist/app/common/UserUtil.js +72 -0
  14. package/dist/app/common/adapter/BugVersionStore.d.ts +7 -0
  15. package/dist/app/common/adapter/BugVersionStore.js +28 -0
  16. package/dist/app/common/adapter/CacheAdapter.d.ts +13 -0
  17. package/dist/app/common/adapter/CacheAdapter.js +78 -0
  18. package/dist/app/common/adapter/NFSAdapter.d.ts +16 -0
  19. package/dist/app/common/adapter/NFSAdapter.js +62 -22
  20. package/dist/app/common/adapter/NPMRegistry.d.ts +78 -0
  21. package/dist/app/common/adapter/NPMRegistry.js +98 -0
  22. package/dist/app/common/adapter/QueueAdapter.d.ts +7 -0
  23. package/dist/app/common/adapter/QueueAdapter.js +37 -0
  24. package/dist/app/common/adapter/binary/AbstractBinary.d.ts +33 -0
  25. package/dist/app/common/adapter/binary/AbstractBinary.js +76 -0
  26. package/dist/app/common/adapter/binary/ApiBinary.d.ts +8 -0
  27. package/dist/app/common/adapter/binary/ApiBinary.js +31 -0
  28. package/dist/app/common/adapter/binary/BucketBinary.d.ts +5 -0
  29. package/dist/app/common/adapter/binary/BucketBinary.js +77 -0
  30. package/dist/app/common/adapter/binary/CypressBinary.d.ts +5 -0
  31. package/dist/app/common/adapter/binary/CypressBinary.js +63 -0
  32. package/dist/app/common/adapter/binary/ElectronBinary.d.ts +5 -0
  33. package/dist/app/common/adapter/binary/ElectronBinary.js +44 -0
  34. package/dist/app/common/adapter/binary/GithubBinary.d.ts +7 -0
  35. package/dist/app/common/adapter/binary/GithubBinary.js +93 -0
  36. package/dist/app/common/adapter/binary/ImageminBinary.d.ts +5 -0
  37. package/dist/app/common/adapter/binary/ImageminBinary.js +96 -0
  38. package/dist/app/common/adapter/binary/NodeBinary.d.ts +4 -0
  39. package/dist/app/common/adapter/binary/NodeBinary.js +41 -0
  40. package/dist/app/common/adapter/binary/NodePreGypBinary.d.ts +5 -0
  41. package/dist/app/common/adapter/binary/NodePreGypBinary.js +136 -0
  42. package/dist/app/common/adapter/binary/NwjsBinary.d.ts +6 -0
  43. package/dist/app/common/adapter/binary/NwjsBinary.js +47 -0
  44. package/dist/app/common/adapter/binary/PlaywrightBinary.d.ts +5 -0
  45. package/dist/app/common/adapter/binary/PlaywrightBinary.js +214 -0
  46. package/dist/app/common/adapter/binary/PuppeteerBinary.d.ts +6 -0
  47. package/dist/app/common/adapter/binary/PuppeteerBinary.js +125 -0
  48. package/dist/app/common/adapter/binary/SqlcipherBinary.d.ts +5 -0
  49. package/dist/app/common/adapter/binary/SqlcipherBinary.js +78 -0
  50. package/dist/app/common/aop/AsyncTimer.d.ts +9 -0
  51. package/dist/app/common/aop/AsyncTimer.js +36 -0
  52. package/dist/app/common/constants.d.ts +2 -0
  53. package/dist/app/common/constants.js +6 -0
  54. package/dist/app/common/dayjs.d.ts +2 -0
  55. package/dist/app/common/dayjs.js +10 -0
  56. package/dist/app/common/enum/Task.d.ts +12 -0
  57. package/dist/app/common/enum/Task.js +18 -0
  58. package/dist/app/common/enum/User.d.ts +5 -0
  59. package/dist/app/common/enum/User.js +10 -0
  60. package/dist/app/common/typing.d.ts +28 -0
  61. package/dist/app/common/typing.js +3 -0
  62. package/dist/app/core/entity/Binary.d.ts +28 -0
  63. package/dist/app/core/entity/Binary.js +29 -0
  64. package/dist/app/core/entity/BugVersion.d.ts +14 -0
  65. package/dist/app/core/entity/BugVersion.js +43 -0
  66. package/dist/app/core/entity/Change.d.ts +17 -0
  67. package/dist/app/core/entity/Change.js +20 -0
  68. package/dist/app/core/entity/Dist.d.ts +21 -0
  69. package/dist/app/core/entity/Dist.js +1 -2
  70. package/dist/app/core/entity/Entity.d.ts +11 -0
  71. package/dist/app/core/entity/Entity.js +3 -3
  72. package/dist/app/core/entity/Package.d.ts +45 -0
  73. package/dist/app/core/entity/Package.js +33 -25
  74. package/dist/app/core/entity/PackageTag.d.ts +17 -0
  75. package/dist/app/core/entity/PackageVersion.d.ts +26 -0
  76. package/dist/app/core/entity/PackageVersionBlock.d.ts +17 -0
  77. package/dist/app/core/entity/PackageVersionBlock.js +20 -0
  78. package/dist/app/core/entity/PackageVersionManifest.d.ts +17 -0
  79. package/dist/app/core/entity/PackageVersionManifest.js +20 -0
  80. package/dist/app/core/entity/Task.d.ts +43 -0
  81. package/dist/app/core/entity/Task.js +94 -0
  82. package/dist/app/core/entity/Token.d.ts +24 -0
  83. package/dist/app/core/entity/Token.js +23 -0
  84. package/dist/app/core/entity/User.d.ts +25 -0
  85. package/dist/app/core/entity/User.js +24 -0
  86. package/dist/app/core/event/BugVersionFixHandler.d.ts +6 -0
  87. package/dist/app/core/event/BugVersionFixHandler.js +42 -0
  88. package/dist/app/core/event/CacheCleaner.d.ts +38 -0
  89. package/dist/app/core/event/CacheCleaner.js +119 -0
  90. package/dist/app/core/event/ChangesStream.d.ts +32 -0
  91. package/dist/app/core/event/ChangesStream.js +106 -0
  92. package/dist/app/core/event/StoreManifest.d.ts +11 -0
  93. package/dist/app/core/event/StoreManifest.js +54 -0
  94. package/dist/app/core/event/index.d.ts +27 -0
  95. package/dist/app/core/event/index.js +11 -3
  96. package/dist/app/core/service/BinarySyncerService.d.ts +23 -0
  97. package/dist/app/core/service/BinarySyncerService.js +281 -0
  98. package/dist/app/core/service/BugVersionService.d.ts +11 -0
  99. package/dist/app/core/service/BugVersionService.js +86 -0
  100. package/dist/app/core/service/CacheService.d.ts +33 -0
  101. package/dist/app/core/service/CacheService.js +75 -0
  102. package/dist/app/core/service/ChangesStreamService.d.ts +11 -0
  103. package/dist/app/core/service/ChangesStreamService.js +186 -0
  104. package/dist/app/core/service/PackageManagerService.d.ts +83 -0
  105. package/dist/app/core/service/PackageManagerService.js +675 -78
  106. package/dist/app/core/service/PackageSyncerService.d.ts +24 -0
  107. package/dist/app/core/service/PackageSyncerService.js +667 -0
  108. package/dist/app/core/service/TaskService.d.ts +22 -0
  109. package/dist/app/core/service/TaskService.js +142 -0
  110. package/dist/app/core/service/UserService.d.ts +36 -0
  111. package/dist/app/core/service/UserService.js +120 -0
  112. package/dist/app/core/util/EntityUtil.d.ts +8 -0
  113. package/dist/app/core/util/EntityUtil.js +3 -3
  114. package/dist/app/infra/NFSClientAdapter.d.ts +18 -0
  115. package/dist/app/infra/NFSClientAdapter.js +74 -0
  116. package/dist/app/infra/package.json +6 -0
  117. package/dist/app/port/UserRoleManager.d.ts +24 -0
  118. package/dist/app/port/UserRoleManager.js +146 -0
  119. package/dist/app/port/controller/AbstractController.d.ts +32 -0
  120. package/dist/app/port/controller/AbstractController.js +112 -0
  121. package/dist/app/port/controller/BinarySyncController.d.ts +36 -0
  122. package/dist/app/port/controller/BinarySyncController.js +123 -0
  123. package/dist/app/port/controller/ChangesStreamController.d.ts +13 -0
  124. package/dist/app/port/controller/ChangesStreamController.js +53 -0
  125. package/dist/app/port/controller/DownloadController.d.ts +18 -0
  126. package/dist/app/port/controller/DownloadController.js +134 -0
  127. package/dist/app/port/controller/HomeController.d.ts +37 -0
  128. package/dist/app/port/controller/HomeController.js +72 -0
  129. package/dist/app/port/controller/PackageBlockController.d.ts +24 -0
  130. package/dist/app/port/controller/PackageBlockController.js +108 -0
  131. package/dist/app/port/controller/PackageSyncController.d.ts +35 -0
  132. package/dist/app/port/controller/PackageSyncController.js +205 -0
  133. package/dist/app/port/controller/PackageTagController.d.ts +12 -0
  134. package/dist/app/port/controller/PackageTagController.js +88 -0
  135. package/dist/app/port/controller/TokenController.d.ts +38 -0
  136. package/dist/app/port/controller/TokenController.js +125 -0
  137. package/dist/app/port/controller/UserController.d.ts +39 -0
  138. package/dist/app/port/controller/UserController.js +223 -0
  139. package/dist/app/port/controller/package/DownloadPackageVersionTar.d.ts +9 -0
  140. package/dist/app/port/controller/package/DownloadPackageVersionTar.js +82 -0
  141. package/dist/app/port/controller/package/RemovePackageVersionController.d.ts +8 -0
  142. package/dist/app/port/controller/package/RemovePackageVersionController.js +56 -0
  143. package/dist/app/port/controller/package/SavePackageVersionController.d.ts +48 -0
  144. package/dist/app/port/controller/package/SavePackageVersionController.js +221 -0
  145. package/dist/app/port/controller/package/ShowPackageController.d.ts +8 -0
  146. package/dist/app/port/controller/package/ShowPackageController.js +99 -0
  147. package/dist/app/port/controller/package/ShowPackageVersionController.d.ts +6 -0
  148. package/dist/app/port/controller/package/ShowPackageVersionController.js +55 -0
  149. package/dist/app/port/controller/package/UpdatePackageController.d.ts +17 -0
  150. package/dist/app/port/controller/package/UpdatePackageController.js +68 -0
  151. package/dist/app/port/middleware/AlwaysAuth.d.ts +2 -0
  152. package/dist/app/port/middleware/AlwaysAuth.js +17 -0
  153. package/dist/app/port/middleware/ErrorHandler.d.ts +2 -0
  154. package/dist/app/port/middleware/ErrorHandler.js +27 -5
  155. package/dist/app/port/middleware/Tracing.d.ts +2 -0
  156. package/dist/app/port/middleware/Tracing.js +22 -0
  157. package/dist/app/port/middleware/index.d.ts +2 -0
  158. package/dist/app/port/middleware/index.js +22 -0
  159. package/dist/app/port/typebox.d.ts +29 -0
  160. package/dist/app/port/typebox.js +71 -0
  161. package/dist/app/repository/AbstractRepository.d.ts +4 -0
  162. package/dist/app/repository/AbstractRepository.js +17 -0
  163. package/dist/app/repository/BinaryRepository.d.ts +7 -0
  164. package/dist/app/repository/BinaryRepository.js +45 -0
  165. package/dist/app/repository/ChangeRepository.d.ts +8 -0
  166. package/dist/app/repository/ChangeRepository.js +31 -0
  167. package/dist/app/repository/DistRepository.d.ts +15 -0
  168. package/dist/app/repository/DistRepository.js +69 -0
  169. package/dist/app/repository/PackageRepository.d.ts +39 -0
  170. package/dist/app/repository/PackageRepository.js +223 -36
  171. package/dist/app/repository/PackageVersionBlockRepository.d.ts +10 -0
  172. package/dist/app/repository/PackageVersionBlockRepository.js +51 -0
  173. package/dist/app/repository/PackageVersionDownloadRepository.d.ts +7 -0
  174. package/dist/app/repository/PackageVersionDownloadRepository.js +77 -0
  175. package/dist/app/repository/TaskRepository.d.ts +10 -0
  176. package/dist/app/repository/TaskRepository.js +82 -0
  177. package/dist/app/repository/UserRepository.d.ts +15 -0
  178. package/dist/app/repository/UserRepository.js +81 -0
  179. package/dist/app/repository/model/Binary.d.ts +13 -0
  180. package/dist/app/repository/model/Binary.js +53 -0
  181. package/dist/app/repository/model/Change.d.ts +10 -0
  182. package/dist/app/repository/model/Change.js +44 -0
  183. package/dist/app/repository/model/Dist.d.ts +12 -0
  184. package/dist/app/repository/model/Dist.js +10 -13
  185. package/dist/app/repository/model/HistoryTask.d.ts +18 -0
  186. package/dist/app/repository/model/HistoryTask.js +65 -0
  187. package/dist/app/repository/model/Maintainer.d.ts +8 -0
  188. package/dist/app/repository/model/Maintainer.js +36 -0
  189. package/dist/app/repository/model/Package.d.ts +13 -0
  190. package/dist/app/repository/model/Package.js +18 -9
  191. package/dist/app/repository/model/PackageDep.d.ts +11 -0
  192. package/dist/app/repository/model/PackageDep.js +9 -9
  193. package/dist/app/repository/model/PackageTag.d.ts +10 -0
  194. package/dist/app/repository/model/PackageTag.js +9 -9
  195. package/dist/app/repository/model/PackageVersion.d.ts +14 -0
  196. package/dist/app/repository/model/PackageVersion.js +9 -9
  197. package/dist/app/repository/model/PackageVersionBlock.d.ts +10 -0
  198. package/dist/app/repository/model/PackageVersionBlock.js +44 -0
  199. package/dist/app/repository/model/PackageVersionDownload.d.ts +40 -0
  200. package/dist/app/repository/model/PackageVersionDownload.js +132 -0
  201. package/dist/app/repository/model/PackageVersionManifest.d.ts +10 -0
  202. package/dist/app/repository/model/PackageVersionManifest.js +46 -0
  203. package/dist/app/repository/model/Task.d.ts +18 -0
  204. package/dist/app/repository/model/Task.js +65 -0
  205. package/dist/app/repository/model/Token.d.ts +13 -0
  206. package/dist/app/repository/model/Token.js +55 -0
  207. package/dist/app/repository/model/User.d.ts +14 -0
  208. package/dist/app/repository/model/User.js +56 -0
  209. package/dist/app/repository/util/EntityProperty.d.ts +1 -0
  210. package/dist/app/repository/util/ModelConvertor.d.ts +7 -0
  211. package/dist/app/repository/util/ModelConvertor.js +35 -2
  212. package/dist/app/repository/util/ModelConvertorUtil.d.ts +8 -0
  213. package/dist/app/schedule/ChangesStreamWorker.d.ts +8 -0
  214. package/dist/app/schedule/ChangesStreamWorker.js +27 -0
  215. package/dist/app/schedule/CheckRecentlyUpdatedPackages.d.ts +8 -0
  216. package/dist/app/schedule/CheckRecentlyUpdatedPackages.js +66 -0
  217. package/dist/app/schedule/CleanTempDir.d.ts +8 -0
  218. package/dist/app/schedule/CleanTempDir.js +48 -0
  219. package/dist/app/schedule/CreateSyncBinaryTask.d.ts +8 -0
  220. package/dist/app/schedule/CreateSyncBinaryTask.js +34 -0
  221. package/dist/app/schedule/SavePackageVersionDownloadCounter.d.ts +8 -0
  222. package/dist/app/schedule/SavePackageVersionDownloadCounter.js +21 -0
  223. package/dist/app/schedule/SyncBinaryWorker.d.ts +8 -0
  224. package/dist/app/schedule/SyncBinaryWorker.js +30 -0
  225. package/dist/app/schedule/SyncPackageWorker.d.ts +8 -0
  226. package/dist/app/schedule/SyncPackageWorker.js +44 -0
  227. package/dist/app/schedule/TaskTimeoutHandler.d.ts +9 -0
  228. package/dist/app/schedule/TaskTimeoutHandler.js +27 -0
  229. package/dist/app/schedule/UpdateTotalData.d.ts +9 -0
  230. package/dist/app/schedule/UpdateTotalData.js +103 -0
  231. package/dist/app.d.ts +11 -0
  232. package/dist/app.js +22 -0
  233. package/dist/config/binaries.d.ts +38 -0
  234. package/dist/config/binaries.js +810 -0
  235. package/dist/config/config.default.d.ts +3 -0
  236. package/dist/config/config.default.js +128 -9
  237. package/dist/config/config.unittest.d.ts +3 -0
  238. package/dist/config/config.unittest.js +18 -0
  239. package/dist/config/plugin.d.ts +3 -0
  240. package/dist/config/plugin.js +19 -3
  241. package/package.json +76 -21
  242. package/dist/app/common/adapter/NFSClientAdapter.js +0 -43
  243. package/dist/app/port/controller/PackageController.js +0 -273
@@ -0,0 +1,667 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PackageSyncerService = void 0;
13
+ const os_1 = __importDefault(require("os"));
14
+ const tegg_1 = require("@eggjs/tegg");
15
+ const promises_1 = require("timers/promises");
16
+ const promises_2 = require("fs/promises");
17
+ const PackageUtil_1 = require("../../common/PackageUtil");
18
+ const FileUtil_1 = require("../../common/FileUtil");
19
+ const Task_1 = require("../../common/enum/Task");
20
+ const AbstractService_1 = require("../../common/AbstractService");
21
+ const Task_2 = require("../entity/Task");
22
+ function isoNow() {
23
+ return new Date().toISOString();
24
+ }
25
+ let PackageSyncerService = class PackageSyncerService extends AbstractService_1.AbstractService {
26
+ async createTask(fullname, options) {
27
+ return await this.taskService.createTask(Task_2.Task.createSyncPackage(fullname, options), true);
28
+ }
29
+ async findTask(taskId) {
30
+ return await this.taskService.findTask(taskId);
31
+ }
32
+ async findTaskLog(task) {
33
+ return await this.taskService.findTaskLog(task);
34
+ }
35
+ async findExecuteTask() {
36
+ return await this.taskService.findExecuteTask(Task_1.TaskType.SyncPackage);
37
+ }
38
+ get allowSyncDownloadData() {
39
+ const config = this.config.cnpmcore;
40
+ if (config.enableSyncDownloadData && config.syncDownloadDataSourceRegistry && config.syncDownloadDataMaxDate) {
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ async syncDownloadData(task, pkg) {
46
+ if (!this.allowSyncDownloadData) {
47
+ return;
48
+ }
49
+ const fullname = pkg.fullname;
50
+ const start = '2011-01-01';
51
+ const end = this.config.cnpmcore.syncDownloadDataMaxDate;
52
+ const registry = this.config.cnpmcore.syncDownloadDataSourceRegistry;
53
+ const logs = [];
54
+ let downloads;
55
+ logs.push(`[${isoNow()}][DownloadData] 🚧🚧🚧🚧🚧 Syncing "${fullname}" download data "${start}:${end}" on ${registry} 🚧🚧🚧🚧🚧`);
56
+ const failEnd = '❌❌❌❌❌ 🚮 give up 🚮 ❌❌❌❌❌';
57
+ try {
58
+ const { data, status, res } = await this.npmRegistry.getDownloadRanges(registry, fullname, start, end);
59
+ downloads = data.downloads || [];
60
+ logs.push(`[${isoNow()}][DownloadData] 🚧 HTTP [${status}] timing: ${JSON.stringify(res.timing)}, downloads: ${downloads.length}`);
61
+ }
62
+ catch (err) {
63
+ const status = err.status || 'unknow';
64
+ logs.push(`[${isoNow()}][DownloadData] ❌ Get download data error: ${err}, status: ${status}`);
65
+ logs.push(`[${isoNow()}][DownloadData] ${failEnd}`);
66
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
67
+ return;
68
+ }
69
+ const datas = new Map();
70
+ for (const item of downloads) {
71
+ // {
72
+ // "day": "2021-09-21",
73
+ // "downloads": 45
74
+ // },
75
+ const day = item.day;
76
+ const [year, month, date] = day.split('-');
77
+ const yearMonth = parseInt(`${year}${month}`);
78
+ if (!datas.has(yearMonth)) {
79
+ datas.set(yearMonth, []);
80
+ }
81
+ const counters = datas.get(yearMonth);
82
+ counters.push([date, item.downloads]);
83
+ }
84
+ for (const [yearMonth, counters] of datas.entries()) {
85
+ await this.packageVersionDownloadRepository.saveSyncDataByMonth(pkg.packageId, yearMonth, counters);
86
+ logs.push(`[${isoNow()}][DownloadData] 🟢 ${yearMonth}: ${counters.length} days`);
87
+ }
88
+ logs.push(`[${isoNow()}][DownloadData] 🟢🟢🟢🟢🟢 ${registry}/${fullname} 🟢🟢🟢🟢🟢`);
89
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
90
+ }
91
+ async syncUpstream(task) {
92
+ const registry = this.npmRegistry.registry;
93
+ const fullname = task.targetName;
94
+ let logs = [];
95
+ let logId = '';
96
+ logs.push(`[${isoNow()}][UP] 🚧🚧🚧🚧🚧 Waiting sync "${fullname}" task on ${registry} 🚧🚧🚧🚧🚧`);
97
+ const failEnd = `❌❌❌❌❌ Sync ${registry}/${fullname} 🚮 give up 🚮 ❌❌❌❌❌`;
98
+ try {
99
+ const { data, status, res } = await this.npmRegistry.createSyncTask(fullname);
100
+ logs.push(`[${isoNow()}][UP] 🚧 HTTP [${status}] timing: ${JSON.stringify(res.timing)}, data: ${JSON.stringify(data)}`);
101
+ logId = data.logId;
102
+ }
103
+ catch (err) {
104
+ const status = err.status || 'unknow';
105
+ logs.push(`[${isoNow()}][UP] ❌ Sync ${fullname} fail, create sync task error: ${err}, status: ${status}`);
106
+ logs.push(`[${isoNow()}][UP] ${failEnd}`);
107
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
108
+ return;
109
+ }
110
+ if (!logId) {
111
+ logs.push(`[${isoNow()}][UP] ❌ Sync ${fullname} fail, missing logId`);
112
+ logs.push(`[${isoNow()}][UP] ${failEnd}`);
113
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
114
+ return;
115
+ }
116
+ const startTime = Date.now();
117
+ const maxTimeout = this.config.cnpmcore.sourceRegistrySyncTimeout;
118
+ let logUrl = '';
119
+ let offset = 0;
120
+ let useTime = Date.now() - startTime;
121
+ while (useTime < maxTimeout) {
122
+ // sleep 1s ~ 6s in random
123
+ await (0, promises_1.setTimeout)(1000 + Math.random() * 5000);
124
+ try {
125
+ const { data, status, url } = await this.npmRegistry.getSyncTask(fullname, logId, offset);
126
+ useTime = Date.now() - startTime;
127
+ if (!logUrl) {
128
+ logUrl = url;
129
+ }
130
+ const log = data && data.log || '';
131
+ offset += log.length;
132
+ if (data && data.syncDone) {
133
+ logs.push(`[${isoNow()}][UP] 🟢 Sync ${fullname} success [${useTime}ms], log: ${logUrl}, offset: ${offset}`);
134
+ logs.push(`[${isoNow()}][UP] 🟢🟢🟢🟢🟢 ${registry}/${fullname} 🟢🟢🟢🟢🟢`);
135
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
136
+ return;
137
+ }
138
+ logs.push(`[${isoNow()}][UP] 🚧 HTTP [${status}] [${useTime}ms], offset: ${offset}`);
139
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
140
+ logs = [];
141
+ }
142
+ catch (err) {
143
+ useTime = Date.now() - startTime;
144
+ const status = err.status || 'unknow';
145
+ logs.push(`[${isoNow()}][UP] 🚧 HTTP [${status}] [${useTime}ms] error: ${err}`);
146
+ }
147
+ }
148
+ // timeout
149
+ logs.push(`[${isoNow()}][UP] ❌ Sync ${fullname} fail, timeout, log: ${logUrl}, offset: ${offset}`);
150
+ logs.push(`[${isoNow()}][UP] ${failEnd}`);
151
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
152
+ }
153
+ async executeTask(task) {
154
+ var _a, _b;
155
+ const fullname = task.targetName;
156
+ const { tips, skipDependencies: originSkipDependencies, syncDownloadData } = task.data;
157
+ const registry = this.npmRegistry.registry;
158
+ let logs = [];
159
+ if (tips) {
160
+ logs.push(`[${isoNow()}] 👉👉👉👉👉 Tips: ${tips} 👈👈👈👈👈`);
161
+ }
162
+ const taskQueueLength = await this.taskService.getTaskQueueLength(task.type);
163
+ const taskQueueHighWaterSize = this.config.cnpmcore.taskQueueHighWaterSize;
164
+ const taskQueueInHighWaterState = taskQueueLength >= taskQueueHighWaterSize;
165
+ const skipDependencies = taskQueueInHighWaterState ? true : !!originSkipDependencies;
166
+ const syncUpstream = !!(!taskQueueInHighWaterState && this.config.cnpmcore.sourceRegistryIsCNpm && this.config.cnpmcore.syncUpstreamFirst);
167
+ const logUrl = `${this.config.cnpmcore.registry}/-/package/${fullname}/syncs/${task.taskId}/log`;
168
+ this.logger.info('[PackageSyncerService.executeTask:start] taskId: %s, targetName: %s, attempts: %s, taskQueue: %s/%s, syncUpstream: %s, log: %s', task.taskId, task.targetName, task.attempts, taskQueueLength, taskQueueHighWaterSize, syncUpstream, logUrl);
169
+ logs.push(`[${isoNow()}] 🚧🚧🚧🚧🚧 Syncing from ${registry}/${fullname}, skipDependencies: ${skipDependencies}, syncUpstream: ${syncUpstream}, syncDownloadData: ${!!syncDownloadData}, attempts: ${task.attempts}, worker: "${os_1.default.hostname()}/${process.pid}", taskQueue: ${taskQueueLength}/${taskQueueHighWaterSize} 🚧🚧🚧🚧🚧`);
170
+ logs.push(`[${isoNow()}] 🚧 log: ${logUrl}`);
171
+ const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname);
172
+ let pkg = await this.packageRepository.findPackage(scope, name);
173
+ if (syncDownloadData && pkg) {
174
+ await this.syncDownloadData(task, pkg);
175
+ logs.push(`[${isoNow()}] 🟢 log: ${logUrl}`);
176
+ logs.push(`[${isoNow()}] 🟢🟢🟢🟢🟢 Sync "${fullname}" download data success 🟢🟢🟢🟢🟢`);
177
+ await this.taskService.finishTask(task, Task_1.TaskState.Success, logs.join('\n'));
178
+ this.logger.info('[PackageSyncerService.executeTask:success] taskId: %s, targetName: %s', task.taskId, task.targetName);
179
+ return;
180
+ }
181
+ if (syncUpstream) {
182
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
183
+ logs = [];
184
+ // create sync task on sourceRegistry and skipDependencies = true
185
+ await this.syncUpstream(task);
186
+ }
187
+ if (this.config.cnpmcore.syncPackageBlockList.includes(fullname)) {
188
+ task.error = `stop sync by block list: ${JSON.stringify(this.config.cnpmcore.syncPackageBlockList)}`;
189
+ logs.push(`[${isoNow()}] ❌ ${task.error}, log: ${logUrl}`);
190
+ logs.push(`[${isoNow()}] ❌❌❌❌❌ ${fullname} ❌❌❌❌❌`);
191
+ await this.taskService.finishTask(task, Task_1.TaskState.Fail, logs.join('\n'));
192
+ this.logger.info('[PackageSyncerService.executeTask:fail-block-list] taskId: %s, targetName: %s, %s', task.taskId, task.targetName, task.error);
193
+ return;
194
+ }
195
+ let result;
196
+ try {
197
+ result = await this.npmRegistry.getFullManifests(fullname);
198
+ }
199
+ catch (err) {
200
+ const status = err.status || 'unknow';
201
+ task.error = `request manifests error: ${err}, status: ${status}`;
202
+ logs.push(`[${isoNow()}] ❌ Synced ${fullname} fail, ${task.error}, log: ${logUrl}`);
203
+ logs.push(`[${isoNow()}] ❌❌❌❌❌ ${fullname} ❌❌❌❌❌`);
204
+ this.logger.info('[PackageSyncerService.executeTask:fail-request-error] taskId: %s, targetName: %s, %s', task.taskId, task.targetName, task.error);
205
+ await this.taskService.retryTask(task, logs.join('\n'));
206
+ return;
207
+ }
208
+ const { url, data, headers, res, status } = result;
209
+ let readme = data.readme || '';
210
+ if (typeof readme !== 'string') {
211
+ readme = JSON.stringify(readme);
212
+ }
213
+ // "time": {
214
+ // "created": "2021-03-27T12:30:23.891Z",
215
+ // "0.0.2": "2021-03-27T12:30:24.349Z",
216
+ // "modified": "2021-12-08T14:59:57.264Z",
217
+ const timeMap = data.time || {};
218
+ const failEnd = `❌❌❌❌❌ ${url || fullname} ❌❌❌❌❌`;
219
+ const contentLength = headers['content-length'] || '-';
220
+ logs.push(`[${isoNow()}] HTTP [${status}] content-length: ${contentLength}, timing: ${JSON.stringify(res.timing)}`);
221
+ if (status === 404) {
222
+ if (pkg) {
223
+ await this.packageManagerService.unpublishPackage(pkg);
224
+ logs.push(`[${isoNow()}] 🟢 Package "${fullname}" was unpublished caused by 404 response: ${JSON.stringify(data)}`);
225
+ logs.push(`[${isoNow()}] 🟢 log: ${logUrl}`);
226
+ logs.push(`[${isoNow()}] 🟢🟢🟢🟢🟢 ${url} 🟢🟢🟢🟢🟢`);
227
+ await this.taskService.finishTask(task, Task_1.TaskState.Success, logs.join('\n'));
228
+ this.logger.info('[PackageSyncerService.executeTask:remove-package] taskId: %s, targetName: %s', task.taskId, task.targetName);
229
+ }
230
+ else {
231
+ task.error = `Package not exists, response data: ${JSON.stringify(data)}`;
232
+ logs.push(`[${isoNow()}] ❌ ${task.error}, log: ${logUrl}`);
233
+ logs.push(`[${isoNow()}] ${failEnd}`);
234
+ await this.taskService.finishTask(task, Task_1.TaskState.Fail, logs.join('\n'));
235
+ this.logger.info('[PackageSyncerService.executeTask:fail-404] taskId: %s, targetName: %s, %s', task.taskId, task.targetName, task.error);
236
+ }
237
+ return;
238
+ }
239
+ const versionMap = data.versions || {};
240
+ const distTags = data['dist-tags'] || {};
241
+ // 1. save maintainers
242
+ // maintainers: [
243
+ // { name: 'bomsy', email: 'b4bomsy@gmail.com' },
244
+ // { name: 'jasonlaster11', email: 'jason.laster.11@gmail.com' }
245
+ // ],
246
+ let maintainers = data.maintainers;
247
+ const maintainersMap = {};
248
+ const users = [];
249
+ let changedUserCount = 0;
250
+ if (!Array.isArray(maintainers) || maintainers.length === 0) {
251
+ // https://r.cnpmjs.org/webpack.js.org/sync/log/61dbc7c8ff747911a5701068
252
+ // https://registry.npmjs.org/webpack.js.org
253
+ // security holding package will not contains maintainers, auto set npm and npm@npmjs.com to maintainer
254
+ // "description": "security holding package",
255
+ // "repository": "npm/security-holder"
256
+ if (data.description === 'security holding package' || data.repository === 'npm/security-holder') {
257
+ maintainers = data.maintainers = [{ name: 'npm', email: 'npm@npmjs.com' }];
258
+ }
259
+ else {
260
+ // try to use latest tag version's maintainers instead
261
+ const latestPackageVersion = distTags.latest && versionMap[distTags.latest];
262
+ if (latestPackageVersion && Array.isArray(latestPackageVersion.maintainers)) {
263
+ maintainers = latestPackageVersion.maintainers;
264
+ logs.push(`[${isoNow()}] 📖 Use the latest version(${latestPackageVersion.version}) maintainers instead`);
265
+ }
266
+ }
267
+ }
268
+ if (Array.isArray(maintainers) && maintainers.length > 0) {
269
+ logs.push(`[${isoNow()}] 🚧 Syncing maintainers: ${JSON.stringify(maintainers)}`);
270
+ for (const maintainer of maintainers) {
271
+ if (maintainer.name && maintainer.email) {
272
+ maintainersMap[maintainer.name] = maintainer;
273
+ const { changed, user } = await this.userService.savePublicUser(maintainer.name, maintainer.email);
274
+ users.push(user);
275
+ if (changed) {
276
+ changedUserCount++;
277
+ logs.push(`[${isoNow()}] 🟢 [${changedUserCount}] Synced ${maintainer.name} => ${user.name}(${user.userId})`);
278
+ }
279
+ }
280
+ }
281
+ }
282
+ if (users.length === 0) {
283
+ // check unpublished
284
+ // https://r.cnpmjs.org/-/package/babel-plugin-autocss/syncs/61e4be46c7cbfac94d2ec597/log
285
+ // {
286
+ // "name": "babel-plugin-autocss",
287
+ // "time": {
288
+ // "created": "2021-10-29T08:21:56.032Z",
289
+ // "0.0.1": "2021-10-29T08:21:56.206Z",
290
+ // "modified": "2022-01-14T12:34:23.941Z",
291
+ // "unpublished": {
292
+ // "time": "2022-01-14T12:34:23.941Z",
293
+ // "versions": [
294
+ // "0.0.1"
295
+ // ]
296
+ // }
297
+ // }
298
+ // }
299
+ if (timeMap.unpublished) {
300
+ if (pkg) {
301
+ await this.packageManagerService.unpublishPackage(pkg);
302
+ logs.push(`[${isoNow()}] 🟢 Sync unpublished package: ${JSON.stringify(timeMap.unpublished)} success`);
303
+ }
304
+ else {
305
+ logs.push(`[${isoNow()}] 📖 Ignore unpublished package: ${JSON.stringify(timeMap.unpublished)}`);
306
+ }
307
+ logs.push(`[${isoNow()}] 🟢 log: ${logUrl}`);
308
+ logs.push(`[${isoNow()}] 🟢🟢🟢🟢🟢 ${url} 🟢🟢🟢🟢🟢`);
309
+ await this.taskService.finishTask(task, Task_1.TaskState.Success, logs.join('\n'));
310
+ this.logger.info('[PackageSyncerService.executeTask:success] taskId: %s, targetName: %s', task.taskId, task.targetName);
311
+ return;
312
+ }
313
+ // invalid maintainers, sync fail
314
+ task.error = `invalid maintainers: ${JSON.stringify(maintainers)}`;
315
+ logs.push(`[${isoNow()}] ❌ ${task.error}, log: ${logUrl}`);
316
+ logs.push(`[${isoNow()}] ${failEnd}`);
317
+ await this.taskService.finishTask(task, Task_1.TaskState.Fail, logs.join('\n'));
318
+ this.logger.info('[PackageSyncerService.executeTask:fail-invalid-maintainers] taskId: %s, targetName: %s, %s', task.taskId, task.targetName, task.error);
319
+ return;
320
+ }
321
+ let lastErrorMessage = '';
322
+ const dependenciesSet = new Set();
323
+ const { data: existsData } = await this.packageManagerService.listPackageFullManifests(scope, name);
324
+ const { data: abbreviatedManifests } = await this.packageManagerService.listPackageAbbreviatedManifests(scope, name);
325
+ const existsVersionMap = (_a = existsData === null || existsData === void 0 ? void 0 : existsData.versions) !== null && _a !== void 0 ? _a : {};
326
+ const existsVersionCount = Object.keys(existsVersionMap).length;
327
+ const abbreviatedVersionMap = (_b = abbreviatedManifests === null || abbreviatedManifests === void 0 ? void 0 : abbreviatedManifests.versions) !== null && _b !== void 0 ? _b : {};
328
+ // 2. save versions
329
+ const versions = Object.values(versionMap);
330
+ logs.push(`[${isoNow()}] 🚧 Syncing versions ${existsVersionCount} => ${versions.length}`);
331
+ const updateVersions = [];
332
+ const differentMetas = [];
333
+ let syncIndex = 0;
334
+ for (const item of versions) {
335
+ const version = item.version;
336
+ if (!version)
337
+ continue;
338
+ let existsItem = existsVersionMap[version];
339
+ const existsAbbreviatedItem = abbreviatedVersionMap[version];
340
+ const shouldDeleteReadme = !!(existsItem && 'readme' in existsItem);
341
+ if (pkg) {
342
+ if (existsItem) {
343
+ // check item on AbbreviatedManifests
344
+ if (!existsAbbreviatedItem) {
345
+ updateVersions.push(version);
346
+ logs.push(`[${isoNow()}] 🐛 Remote version ${version} not exists on local abbreviated manifests, need to refresh`);
347
+ }
348
+ }
349
+ else {
350
+ // try to read from db detect if last sync interrupt before refreshPackageManifestsToDists() be called
351
+ existsItem = await this.distRepository.findPackageVersionManifest(pkg.packageId, version);
352
+ // only allow existsItem on db to force refresh, to avoid big versions fresh
353
+ // see https://r.cnpmjs.org/-/package/@npm-torg/public-scoped-free-org-test-package-2/syncs/61fcc7e8c1646e26a845b674/log
354
+ if (existsItem) {
355
+ // version not exists on manifests, need to refresh
356
+ // bugfix: https://github.com/cnpm/cnpmcore/issues/115
357
+ updateVersions.push(version);
358
+ logs.push(`[${isoNow()}] 🐛 Remote version ${version} not exists on local manifests, need to refresh`);
359
+ }
360
+ }
361
+ }
362
+ if (existsItem) {
363
+ // check metaDataKeys, if different value, override exists one
364
+ // https://github.com/cnpm/cnpmjs.org/issues/1667
365
+ // need libc field https://github.com/cnpm/cnpmcore/issues/187
366
+ const metaDataKeys = [
367
+ 'peerDependenciesMeta', 'os', 'cpu', 'libc', 'workspaces', 'hasInstallScript', 'deprecated',
368
+ ];
369
+ let diffMeta;
370
+ for (const key of metaDataKeys) {
371
+ let remoteItemValue = item[key];
372
+ // make sure hasInstallScript exists
373
+ if (key === 'hasInstallScript' && remoteItemValue === undefined) {
374
+ if ((0, PackageUtil_1.detectInstallScript)(item)) {
375
+ remoteItemValue = true;
376
+ }
377
+ }
378
+ const remoteItemDiffValue = JSON.stringify(remoteItemValue);
379
+ if (remoteItemDiffValue !== JSON.stringify(existsItem[key])) {
380
+ if (!diffMeta)
381
+ diffMeta = {};
382
+ diffMeta[key] = remoteItemValue;
383
+ }
384
+ else if (existsAbbreviatedItem && remoteItemDiffValue !== JSON.stringify(existsAbbreviatedItem[key])) {
385
+ // should diff exists abbreviated item too
386
+ if (!diffMeta)
387
+ diffMeta = {};
388
+ diffMeta[key] = remoteItemValue;
389
+ }
390
+ }
391
+ // should delete readme
392
+ if (shouldDeleteReadme) {
393
+ if (!diffMeta)
394
+ diffMeta = {};
395
+ diffMeta.readme = undefined;
396
+ }
397
+ if (diffMeta) {
398
+ differentMetas.push([existsItem, diffMeta]);
399
+ }
400
+ continue;
401
+ }
402
+ syncIndex++;
403
+ const description = item.description;
404
+ // "dist": {
405
+ // "shasum": "943e0ec03df00ebeb6273a5b94b916ba54b47581",
406
+ // "tarball": "https://registry.npmjs.org/foo/-/foo-1.0.0.tgz"
407
+ // },
408
+ const dist = item.dist;
409
+ const tarball = dist && dist.tarball;
410
+ if (!tarball) {
411
+ lastErrorMessage = `missing tarball, dist: ${JSON.stringify(dist)}`;
412
+ logs.push(`[${isoNow()}] ❌ [${syncIndex}] Synced version ${version} fail, ${lastErrorMessage}`);
413
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
414
+ logs = [];
415
+ continue;
416
+ }
417
+ const publishTimeISO = timeMap[version];
418
+ const publishTime = publishTimeISO ? new Date(publishTimeISO) : new Date();
419
+ const delay = Date.now() - publishTime.getTime();
420
+ logs.push(`[${isoNow()}] 🚧 [${syncIndex}] Syncing version ${version}, delay: ${delay}ms [${publishTimeISO}], tarball: ${tarball}`);
421
+ let localFile;
422
+ try {
423
+ const { tmpfile, headers, timing } = await (0, FileUtil_1.downloadToTempfile)(this.httpclient, this.config.dataDir, tarball);
424
+ localFile = tmpfile;
425
+ logs.push(`[${isoNow()}] 🚧 [${syncIndex}] HTTP content-length: ${headers['content-length']}, timing: ${JSON.stringify(timing)} => ${localFile}`);
426
+ }
427
+ catch (err) {
428
+ this.logger.error('Download tarball %s error: %s', tarball, err);
429
+ lastErrorMessage = `download tarball error: ${err}`;
430
+ logs.push(`[${isoNow()}] ❌ [${syncIndex}] Synced version ${version} fail, ${lastErrorMessage}`);
431
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
432
+ logs = [];
433
+ continue;
434
+ }
435
+ if (!pkg) {
436
+ pkg = await this.packageRepository.findPackage(scope, name);
437
+ }
438
+ if (pkg) {
439
+ // check again, make sure prefix version not exists
440
+ const existsPkgVersion = await this.packageRepository.findPackageVersion(pkg.packageId, version);
441
+ if (existsPkgVersion) {
442
+ await (0, promises_2.rm)(localFile, { force: true });
443
+ logs.push(`[${isoNow()}] 🐛 [${syncIndex}] Synced version ${version} already exists, skip publish it`);
444
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
445
+ logs = [];
446
+ continue;
447
+ }
448
+ }
449
+ const publishCmd = {
450
+ scope,
451
+ name,
452
+ version,
453
+ description,
454
+ packageJson: item,
455
+ readme,
456
+ dist: {
457
+ localFile,
458
+ },
459
+ isPrivate: false,
460
+ publishTime,
461
+ skipRefreshPackageManifests: true,
462
+ };
463
+ try {
464
+ const pkgVersion = await this.packageManagerService.publish(publishCmd, users[0]);
465
+ updateVersions.push(pkgVersion.version);
466
+ logs.push(`[${isoNow()}] 🟢 [${syncIndex}] Synced version ${version} success, packageVersionId: ${pkgVersion.packageVersionId}, db id: ${pkgVersion.id}`);
467
+ }
468
+ catch (err) {
469
+ if (err.name === 'ForbiddenError') {
470
+ logs.push(`[${isoNow()}] 🐛 [${syncIndex}] Synced version ${version} already exists, skip publish error`);
471
+ }
472
+ else {
473
+ err.taskId = task.taskId;
474
+ this.logger.error(err);
475
+ lastErrorMessage = `publish error: ${err}`;
476
+ logs.push(`[${isoNow()}] ❌ [${syncIndex}] Synced version ${version} error, ${lastErrorMessage}`);
477
+ }
478
+ }
479
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
480
+ logs = [];
481
+ await (0, promises_2.rm)(localFile, { force: true });
482
+ if (!skipDependencies) {
483
+ const dependencies = item.dependencies || {};
484
+ for (const dependencyName in dependencies) {
485
+ dependenciesSet.add(dependencyName);
486
+ }
487
+ }
488
+ }
489
+ // try to read package entity again after first sync
490
+ if (!pkg) {
491
+ pkg = await this.packageRepository.findPackage(scope, name);
492
+ }
493
+ if (!pkg || !pkg.id) {
494
+ // sync all versions fail in the first time
495
+ logs.push(`[${isoNow()}] ❌ All versions sync fail, package not exists, log: ${logUrl}`);
496
+ logs.push(`[${isoNow()}] ${failEnd}`);
497
+ task.error = lastErrorMessage;
498
+ await this.taskService.finishTask(task, Task_1.TaskState.Fail, logs.join('\n'));
499
+ this.logger.info('[PackageSyncerService.executeTask:fail] taskId: %s, targetName: %s, package not exists', task.taskId, task.targetName);
500
+ return;
501
+ }
502
+ // 2.1 save differentMetas
503
+ for (const [existsItem, diffMeta] of differentMetas) {
504
+ const pkgVersion = await this.packageRepository.findPackageVersion(pkg.packageId, existsItem.version);
505
+ if (pkgVersion) {
506
+ await this.packageManagerService.savePackageVersionManifest(pkgVersion, diffMeta, diffMeta);
507
+ updateVersions.push(pkgVersion.version);
508
+ let diffMetaInfo = JSON.stringify(diffMeta);
509
+ if ('readme' in diffMeta) {
510
+ diffMetaInfo += ', delete exists readme';
511
+ }
512
+ logs.push(`[${isoNow()}] 🟢 Synced version ${existsItem.version} success, different meta: ${diffMetaInfo}`);
513
+ }
514
+ }
515
+ const removeVersions = [];
516
+ // 2.3 find out remove versions
517
+ for (const existsVersion in existsVersionMap) {
518
+ if (!(existsVersion in versionMap)) {
519
+ const pkgVersion = await this.packageRepository.findPackageVersion(pkg.packageId, existsVersion);
520
+ if (pkgVersion) {
521
+ await this.packageManagerService.removePackageVersion(pkg, pkgVersion, true);
522
+ logs.push(`[${isoNow()}] 🟢 Removed version ${existsVersion} success`);
523
+ }
524
+ removeVersions.push(existsVersion);
525
+ }
526
+ }
527
+ logs.push(`[${isoNow()}] 🟢 Synced updated ${updateVersions.length} versions, removed ${removeVersions.length} versions`);
528
+ if (updateVersions.length > 0 || removeVersions.length > 0) {
529
+ logs.push(`[${isoNow()}] 🚧 Refreshing manifests to dists ......`);
530
+ const start = Date.now();
531
+ await this.taskService.appendTaskLog(task, logs.join('\n'));
532
+ logs = [];
533
+ await this.packageManagerService.refreshPackageChangeVersionsToDists(pkg, updateVersions, removeVersions);
534
+ logs.push(`[${isoNow()}] 🟢 Refresh use ${Date.now() - start}ms`);
535
+ }
536
+ // 3. update tags
537
+ // "dist-tags": {
538
+ // "latest": "0.0.7"
539
+ // },
540
+ const changedTags = [];
541
+ const existsDistTags = existsData && existsData['dist-tags'] || {};
542
+ let shouldRefreshDistTags = false;
543
+ for (const tag in distTags) {
544
+ const version = distTags[tag];
545
+ const changed = await this.packageManagerService.savePackageTag(pkg, tag, version);
546
+ if (changed) {
547
+ changedTags.push({ action: 'change', tag, version });
548
+ shouldRefreshDistTags = false;
549
+ }
550
+ else if (version !== existsDistTags[tag]) {
551
+ shouldRefreshDistTags = true;
552
+ logs.push(`[${isoNow()}] 🚧 Remote tag(${tag}: ${version}) not exists in local dist-tags`);
553
+ }
554
+ }
555
+ // 3.1 find out remove tags
556
+ for (const tag in existsDistTags) {
557
+ if (!(tag in distTags)) {
558
+ const changed = await this.packageManagerService.removePackageTag(pkg, tag);
559
+ if (changed) {
560
+ changedTags.push({ action: 'remove', tag });
561
+ shouldRefreshDistTags = false;
562
+ }
563
+ }
564
+ }
565
+ if (changedTags.length > 0) {
566
+ logs.push(`[${isoNow()}] 🟢 Synced ${changedTags.length} tags: ${JSON.stringify(changedTags)}`);
567
+ }
568
+ if (shouldRefreshDistTags) {
569
+ await this.packageManagerService.refreshPackageDistTagsToDists(pkg);
570
+ logs.push(`[${isoNow()}] 🟢 Refresh dist-tags`);
571
+ }
572
+ // 4. add package maintainers
573
+ await this.packageManagerService.savePackageMaintainers(pkg, users);
574
+ // 4.1 find out remove maintainers
575
+ const removedMaintainers = [];
576
+ const existsMaintainers = existsData && existsData.maintainers || [];
577
+ let shouldRefreshMaintainers = false;
578
+ for (const maintainer of existsMaintainers) {
579
+ let npmUserName = maintainer.name;
580
+ if (npmUserName.startsWith('npm:')) {
581
+ // fix cache npm user name
582
+ npmUserName = npmUserName.replace('npm:', '');
583
+ shouldRefreshMaintainers = true;
584
+ }
585
+ if (!(npmUserName in maintainersMap)) {
586
+ const user = await this.userRepository.findUserByName(`npm:${npmUserName}`);
587
+ if (user) {
588
+ await this.packageManagerService.removePackageMaintainer(pkg, user);
589
+ removedMaintainers.push(maintainer);
590
+ }
591
+ }
592
+ }
593
+ if (removedMaintainers.length > 0) {
594
+ logs.push(`[${isoNow()}] 🟢 Removed ${removedMaintainers.length} maintainers: ${JSON.stringify(removedMaintainers)}`);
595
+ }
596
+ else if (shouldRefreshMaintainers) {
597
+ await this.packageManagerService.refreshPackageMaintainersToDists(pkg);
598
+ logs.push(`[${isoNow()}] 🟢 Refresh maintainers`);
599
+ }
600
+ // 5. add deps sync task
601
+ for (const dependencyName of dependenciesSet) {
602
+ const existsTask = await this.taskRepository.findTaskByTargetName(fullname, Task_1.TaskType.SyncPackage, Task_1.TaskState.Waiting);
603
+ if (existsTask) {
604
+ logs.push(`[${isoNow()}] 📖 Has dependency "${dependencyName}" sync task: ${existsTask.taskId}, db id: ${existsTask.id}`);
605
+ continue;
606
+ }
607
+ const tips = `Sync cause by "${fullname}" dependencies, parent task: ${task.taskId}`;
608
+ const dependencyTask = await this.createTask(dependencyName, {
609
+ authorId: task.authorId,
610
+ authorIp: task.authorIp,
611
+ tips,
612
+ });
613
+ logs.push(`[${isoNow()}] 📦 Add dependency "${dependencyName}" sync task: ${dependencyTask.taskId}, db id: ${dependencyTask.id}`);
614
+ }
615
+ if (syncDownloadData) {
616
+ await this.syncDownloadData(task, pkg);
617
+ }
618
+ // clean cache
619
+ await this.cacheService.removeCache(fullname);
620
+ logs.push(`[${isoNow()}] 🟢 Clean cache`);
621
+ logs.push(`[${isoNow()}] 🟢 log: ${logUrl}`);
622
+ logs.push(`[${isoNow()}] 🟢🟢🟢🟢🟢 ${url} 🟢🟢🟢🟢🟢`);
623
+ task.error = lastErrorMessage;
624
+ await this.taskService.finishTask(task, Task_1.TaskState.Success, logs.join('\n'));
625
+ this.logger.info('[PackageSyncerService.executeTask:success] taskId: %s, targetName: %s', task.taskId, task.targetName);
626
+ }
627
+ };
628
+ __decorate([
629
+ (0, tegg_1.Inject)()
630
+ ], PackageSyncerService.prototype, "taskRepository", void 0);
631
+ __decorate([
632
+ (0, tegg_1.Inject)()
633
+ ], PackageSyncerService.prototype, "packageRepository", void 0);
634
+ __decorate([
635
+ (0, tegg_1.Inject)()
636
+ ], PackageSyncerService.prototype, "packageVersionDownloadRepository", void 0);
637
+ __decorate([
638
+ (0, tegg_1.Inject)()
639
+ ], PackageSyncerService.prototype, "userRepository", void 0);
640
+ __decorate([
641
+ (0, tegg_1.Inject)()
642
+ ], PackageSyncerService.prototype, "npmRegistry", void 0);
643
+ __decorate([
644
+ (0, tegg_1.Inject)()
645
+ ], PackageSyncerService.prototype, "userService", void 0);
646
+ __decorate([
647
+ (0, tegg_1.Inject)()
648
+ ], PackageSyncerService.prototype, "taskService", void 0);
649
+ __decorate([
650
+ (0, tegg_1.Inject)()
651
+ ], PackageSyncerService.prototype, "packageManagerService", void 0);
652
+ __decorate([
653
+ (0, tegg_1.Inject)()
654
+ ], PackageSyncerService.prototype, "cacheService", void 0);
655
+ __decorate([
656
+ (0, tegg_1.Inject)()
657
+ ], PackageSyncerService.prototype, "httpclient", void 0);
658
+ __decorate([
659
+ (0, tegg_1.Inject)()
660
+ ], PackageSyncerService.prototype, "distRepository", void 0);
661
+ PackageSyncerService = __decorate([
662
+ (0, tegg_1.ContextProto)({
663
+ accessLevel: tegg_1.AccessLevel.PUBLIC,
664
+ })
665
+ ], PackageSyncerService);
666
+ exports.PackageSyncerService = PackageSyncerService;
667
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZVN5bmNlclNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcHAvY29yZS9zZXJ2aWNlL1BhY2thZ2VTeW5jZXJTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixzQ0FJcUI7QUFJckIsOENBQTZDO0FBQzdDLDBDQUFpQztBQUVqQywwREFBZ0Y7QUFDaEYsb0RBQTJEO0FBQzNELGlEQUE2RDtBQUM3RCxrRUFBK0Q7QUFNL0QseUNBQThEO0FBUTlELFNBQVMsTUFBTTtJQUNiLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBS0QsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBcUIsU0FBUSxpQ0FBZTtJQXdCaEQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFnQixFQUFFLE9BQWdDO1FBQ3hFLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxXQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWM7UUFDbEMsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVU7UUFDakMsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUMxQixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsZUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFXLHFCQUFxQjtRQUM5QixNQUFNLE1BQU0s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