cnpmcore 2.4.0 → 2.4.1
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.
package/History.md
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
|
|
2
|
+
2.4.1 / 2022-10-28
|
|
3
|
+
==================
|
|
4
|
+
|
|
5
|
+
**features**
|
|
6
|
+
* [[`92350a8`](http://github.com/cnpm/cnpmcore/commit/92350a864313ee42a048d9e83886ef42db3419de)] - 👌 IMPROVE: Show changes stream create task log (#347) (fengmk2 <<fengmk2@gmail.com>>)
|
|
7
|
+
|
|
8
|
+
**fixes**
|
|
9
|
+
* [[`28eeeaf`](http://github.com/cnpm/cnpmcore/commit/28eeeafd9870c6b1c5b4f4c23916f6ae73ddda12)] - fix: registry host config (#346) (elrrrrrrr <<elrrrrrrr@gmail.com>>)
|
|
10
|
+
* [[`cd5bd92`](http://github.com/cnpm/cnpmcore/commit/cd5bd923b8d47bf90b5f077ce04777b38653b850)] - 🐛 FIX: Catch all error on changes stream handler (#344) (fengmk2 <<fengmk2@gmail.com>>)
|
|
11
|
+
|
|
2
12
|
2.4.0 / 2022-10-25
|
|
3
13
|
==================
|
|
4
14
|
|
|
@@ -21,7 +21,7 @@ export declare class NPMRegistry {
|
|
|
21
21
|
contentDownload: number;
|
|
22
22
|
} | undefined;
|
|
23
23
|
};
|
|
24
|
-
method: import("_undici@5.
|
|
24
|
+
method: import("_undici@5.12.0@undici/types/dispatcher").HttpMethod;
|
|
25
25
|
url: string;
|
|
26
26
|
}>;
|
|
27
27
|
createSyncTask(fullname: string): Promise<{
|
|
@@ -38,7 +38,7 @@ export declare class NPMRegistry {
|
|
|
38
38
|
contentDownload: number;
|
|
39
39
|
} | undefined;
|
|
40
40
|
};
|
|
41
|
-
method: import("_undici@5.
|
|
41
|
+
method: import("_undici@5.12.0@undici/types/dispatcher").HttpMethod;
|
|
42
42
|
url: string;
|
|
43
43
|
}>;
|
|
44
44
|
getSyncTask(fullname: string, id: string, offset: number): Promise<{
|
|
@@ -55,7 +55,7 @@ export declare class NPMRegistry {
|
|
|
55
55
|
contentDownload: number;
|
|
56
56
|
} | undefined;
|
|
57
57
|
};
|
|
58
|
-
method: import("_undici@5.
|
|
58
|
+
method: import("_undici@5.12.0@undici/types/dispatcher").HttpMethod;
|
|
59
59
|
url: string;
|
|
60
60
|
}>;
|
|
61
61
|
getDownloadRanges(registry: string, fullname: string, start: string, end: string): Promise<{
|
|
@@ -72,7 +72,7 @@ export declare class NPMRegistry {
|
|
|
72
72
|
contentDownload: number;
|
|
73
73
|
} | undefined;
|
|
74
74
|
};
|
|
75
|
-
method: import("_undici@5.
|
|
75
|
+
method: import("_undici@5.12.0@undici/types/dispatcher").HttpMethod;
|
|
76
76
|
url: string;
|
|
77
77
|
}>;
|
|
78
78
|
private request;
|
|
@@ -17,6 +17,7 @@ const Task_1 = require("../../common/enum/Task");
|
|
|
17
17
|
const AbstractService_1 = require("../../common/AbstractService");
|
|
18
18
|
const Task_2 = require("../entity/Task");
|
|
19
19
|
const PackageSyncerService_1 = require("./PackageSyncerService");
|
|
20
|
+
const Registry_1 = require("../../common/enum/Registry");
|
|
20
21
|
const egg_errors_1 = require("egg-errors");
|
|
21
22
|
const AbstractChangesStream_1 = require("../../common/adapter/changesStream/AbstractChangesStream");
|
|
22
23
|
const PackageUtil_1 = require("../../common/PackageUtil");
|
|
@@ -77,14 +78,14 @@ let ChangesStreamService = class ChangesStreamService extends AbstractService_1.
|
|
|
77
78
|
return registry;
|
|
78
79
|
}
|
|
79
80
|
// 从配置文件默认生成
|
|
80
|
-
const { changesStreamRegistryMode, changesStreamRegistry: host } = this.config.cnpmcore;
|
|
81
|
-
const type = changesStreamRegistryMode === 'json' ?
|
|
81
|
+
const { changesStreamRegistryMode, changesStreamRegistry: changesStreamHost, sourceRegistry: host } = this.config.cnpmcore;
|
|
82
|
+
const type = changesStreamRegistryMode === 'json' ? Registry_1.RegistryType.Cnpmcore : Registry_1.RegistryType.Npm;
|
|
82
83
|
const registry = await this.registryManagerService.createRegistry({
|
|
83
84
|
name: 'default',
|
|
84
|
-
type
|
|
85
|
+
type,
|
|
85
86
|
userPrefix: 'npm:',
|
|
86
87
|
host,
|
|
87
|
-
changeStream: `${
|
|
88
|
+
changeStream: `${changesStreamHost}/_changes`,
|
|
88
89
|
});
|
|
89
90
|
task.data = {
|
|
90
91
|
...(task.data || {}),
|
|
@@ -141,21 +142,26 @@ let ChangesStreamService = class ChangesStreamService extends AbstractService_1.
|
|
|
141
142
|
const valid = await this.needSync(registry, fullname);
|
|
142
143
|
if (valid) {
|
|
143
144
|
taskCount++;
|
|
145
|
+
const tips = `Sync cause by changes_stream(${registry.changeStream}) update seq: ${seq}`;
|
|
144
146
|
try {
|
|
145
|
-
await this.packageSyncerService.createTask(fullname, {
|
|
147
|
+
const task = await this.packageSyncerService.createTask(fullname, {
|
|
146
148
|
authorIp: Task_2.HOST_NAME,
|
|
147
149
|
authorId: 'ChangesStreamService',
|
|
148
150
|
registryId: registry.registryId,
|
|
149
151
|
skipDependencies: true,
|
|
150
|
-
tips
|
|
152
|
+
tips,
|
|
151
153
|
});
|
|
154
|
+
this.logger.info('[ChangesStreamService.createTask:success] fullname: %s, task: %s, tips: %s', fullname, task.id, tips);
|
|
152
155
|
}
|
|
153
|
-
catch (
|
|
154
|
-
if (
|
|
155
|
-
this.logger.warn('[ChangesStreamService.executeSync:skip] %s',
|
|
156
|
+
catch (err) {
|
|
157
|
+
if (err instanceof PackageSyncerService_1.RegistryNotMatchError) {
|
|
158
|
+
this.logger.warn('[ChangesStreamService.executeSync:skip] fullname: %s, error: %s, tips: %s', fullname, err, tips);
|
|
156
159
|
continue;
|
|
157
160
|
}
|
|
158
|
-
|
|
161
|
+
// only log error, make sure changes still reading
|
|
162
|
+
this.logger.error('[ChangesStreamService.executeSync:error] fullname: %s, error: %s, tips: %s', fullname, err, tips);
|
|
163
|
+
this.logger.error(err);
|
|
164
|
+
continue;
|
|
159
165
|
}
|
|
160
166
|
}
|
|
161
167
|
// 实时更新 task 信息
|
|
@@ -206,4 +212,4 @@ ChangesStreamService = __decorate([
|
|
|
206
212
|
})
|
|
207
213
|
], ChangesStreamService);
|
|
208
214
|
exports.ChangesStreamService = ChangesStreamService;
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhbmdlc1N0cmVhbVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcHAvY29yZS9zZXJ2aWNlL0NoYW5nZXNTdHJlYW1TZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQiw4Q0FBNkM7QUFDN0Msc0NBS3FCO0FBQ3JCLGlEQUFrRDtBQUNsRCxrRUFBK0Q7QUFFL0QseUNBQW9FO0FBQ3BFLGlFQUFxRjtBQUdyRix5REFBMEQ7QUFDMUQsMkNBQWtDO0FBRWxDLG9HQUFnRztBQUNoRywwREFBMkQ7QUFPM0QsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBcUIsU0FBUSxpQ0FBZTtJQWdCdkQsc0NBQXNDO0lBQ3RDLHdCQUF3QjtJQUN4QiwwQ0FBMEM7SUFDbkMsS0FBSyxDQUFDLGVBQWU7UUFDMUIsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDO1FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxlQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUcscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN2QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNoRjtRQUNELHlCQUF5QjtRQUN6QixtQ0FBbUM7UUFDbkMsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGVBQVEsQ0FBQyxhQUFhLENBQXNCLENBQUM7SUFDN0YsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBdUI7UUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFP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
|