Skip to content

Commit 4859ce8

Browse files
fengmk2Copilot
andauthored
feat: try to avoid recalculating integrity (#880)
Especially for packages with many versions, reduce one JSON stringify operation. [skip ci] <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Optimized integrity calculation to defer processing until necessary, reducing unnecessary recalculations. * **Refactor** * Improved type safety for manifest handling with explicit type definitions. * Updated method return values to provide fixed manifest versions list instead of in-place updates. * **Tests** * Updated test cases to reflect revised service method signatures. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: MK (fengmk2) <fengmk2@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 95543b1 commit 4859ce8

File tree

6 files changed

+80
-34
lines changed

6 files changed

+80
-34
lines changed

.github/workflows/nodejs.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ jobs:
116116
strategy:
117117
fail-fast: false
118118
matrix:
119-
node-version: [20, 22, 24]
119+
node-version: [22, 24]
120120
os: [ubuntu-latest]
121121
# 0-based index
122122
shardIndex: [0, 1, 2]
@@ -212,7 +212,7 @@ jobs:
212212
strategy:
213213
fail-fast: false
214214
matrix:
215-
node-version: [20, 22, 24]
215+
node-version: [22, 24]
216216
os: [ubuntu-latest]
217217
# 0-based index
218218
shardIndex: [0, 1, 2]
@@ -270,7 +270,7 @@ jobs:
270270
strategy:
271271
fail-fast: false
272272
matrix:
273-
node-version: [20, 22]
273+
node-version: [22, 24]
274274
os: [ubuntu-latest]
275275

276276
concurrency:

app/core/service/BugVersionService.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AccessLevel, Inject, SingletonProto, Logger } from 'egg';
22
import pMap from 'p-map';
33
import { BugVersion } from '../entity/BugVersion.ts';
44
import type {
5+
AbbreviatedPackageJSONType,
56
PackageJSONType,
67
PackageRepository,
78
} from '../../repository/PackageRepository.ts';
@@ -69,29 +70,41 @@ export class BugVersionService {
6970
);
7071
}
7172

73+
/**
74+
* Fix package bug version with all versions
75+
* @param bugVersion - The bug version
76+
* @param fullname - The fullname of the package
77+
* @param manifests - The manifests of the package
78+
* @returns The versions of the fixed manifests
79+
*/
7280
async fixPackageBugVersions(
7381
bugVersion: BugVersion,
7482
fullname: string,
75-
// oxlint-disable-next-line typescript-eslint/no-explicit-any
76-
manifests: Record<string, any>
83+
manifests: Record<string, PackageJSONType | AbbreviatedPackageJSONType | undefined>
7784
) {
85+
const fixedVersions: string[] = [];
7886
// If package all version unpublished(like pinyin-tool), versions is undefined
79-
if (!manifests) return;
87+
if (!manifests) {
88+
return fixedVersions;
89+
}
8090
for (const manifest of Object.values(manifests)) {
81-
this.fixPackageBugVersionWithAllVersions(
91+
const fixedVersion = this.fixPackageBugVersionWithAllVersions(
8292
fullname,
8393
bugVersion,
84-
manifest,
85-
manifests
94+
manifest as PackageJSONType,
95+
manifests as Record<string, PackageJSONType>
8696
);
97+
if (fixedVersion) {
98+
fixedVersions.push(fixedVersion);
99+
}
87100
}
101+
return fixedVersions;
88102
}
89103

90104
async fixPackageBugVersion(
91105
bugVersion: BugVersion,
92106
fullname: string,
93-
// oxlint-disable-next-line typescript-eslint/no-explicit-any
94-
manifest: any
107+
manifest: PackageJSONType
95108
) {
96109
const advice = bugVersion.fixVersion(fullname, manifest.version);
97110
if (!advice) {
@@ -119,13 +132,19 @@ export class BugVersionService {
119132
return bugVersion.fixManifest(manifest, fixedManifest);
120133
}
121134

135+
/**
136+
* Fix package bug version with all versions
137+
* @param fullname - The fullname of the package
138+
* @param bugVersion - The bug version
139+
* @param manifest - The manifest of the package
140+
* @param manifests - The manifests of the package
141+
* @returns The version of the fixed manifest
142+
*/
122143
private fixPackageBugVersionWithAllVersions(
123144
fullname: string,
124145
bugVersion: BugVersion,
125-
// oxlint-disable-next-line typescript-eslint/no-explicit-any
126-
manifest: any,
127-
// oxlint-disable-next-line typescript-eslint/no-explicit-any
128-
manifests: Record<string, any>
146+
manifest: PackageJSONType,
147+
manifests: Record<string, PackageJSONType>
129148
) {
130149
const advice = bugVersion.fixVersion(fullname, manifest.version);
131150
if (!advice) {
@@ -142,5 +161,7 @@ export class BugVersionService {
142161
}
143162
const newManifest = bugVersion.fixManifest(manifest, fixedManifest);
144163
manifests[manifest.version] = newManifest;
164+
165+
return manifest.version;
145166
}
146167
}

app/core/service/PackageManagerService.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,10 @@ export class PackageManagerService extends AbstractService {
11771177
let etag = '';
11781178
let blockReason = '';
11791179
const pkg = await this.packageRepository.findPackage(scope, name);
1180-
if (!pkg) return { etag, data: null, blockReason };
1180+
if (!pkg) {
1181+
return { etag, data: null, blockReason };
1182+
}
1183+
11811184
const registry = await this.getSourceRegistry(pkg);
11821185

11831186
const block = await this.packageVersionBlockRepository.findPackageBlock(
@@ -1199,25 +1202,34 @@ export class PackageManagerService extends AbstractService {
11991202
if (dist?.distId) {
12001203
etag = `"${dist.shasum}"`;
12011204
const data = (await this.distRepository.readDistBytesToJSON(dist)) as T;
1205+
let needCalculateIntegrity = false;
12021206
if (bugVersion) {
1203-
await this.bugVersionService.fixPackageBugVersions(
1207+
const fixedVersions = await this.bugVersionService.fixPackageBugVersions(
12041208
bugVersion,
12051209
fullname,
12061210
data.versions
12071211
);
1212+
if (fixedVersions.length > 0) {
1213+
// calculate integrity after fix bug version
1214+
needCalculateIntegrity = true;
1215+
}
12081216
}
12091217
// set _source_registry_name in full manifestDist
1210-
if (registry) {
1211-
data._source_registry_name = registry?.name;
1218+
if (registry?.name && data._source_registry_name !== registry.name) {
1219+
data._source_registry_name = registry.name;
1220+
// calculate integrity after set _source_registry_name
1221+
needCalculateIntegrity = true;
12121222
}
12131223

1214-
const distBytes = Buffer.from(JSON.stringify(data));
1215-
const distIntegrity = await calculateIntegrity(distBytes);
1216-
etag = `"${distIntegrity.shasum}"`;
1224+
if (needCalculateIntegrity) {
1225+
const distBytes = Buffer.from(JSON.stringify(data));
1226+
const distIntegrity = await calculateIntegrity(distBytes);
1227+
etag = `"${distIntegrity.shasum}"`;
1228+
}
12171229
return { etag, data, blockReason };
12181230
}
12191231

1220-
// read from database
1232+
// read from database then update to dist, the next time will read from dist
12211233
const fullManifests = isFullManifests
12221234
? await this._listPackageFullManifests(pkg)
12231235
: null;
@@ -1228,25 +1240,28 @@ export class PackageManagerService extends AbstractService {
12281240
// not exists
12291241
return { etag, data: null, blockReason };
12301242
}
1243+
1244+
// update to dist, the next time will read from dist
12311245
await this._updatePackageManifestsToDists(
12321246
pkg,
12331247
fullManifests,
12341248
abbreviatedManifests
12351249
);
12361250
const manifests = (fullManifests || abbreviatedManifests) as T;
1237-
/* c8 ignore next 5 */
12381251
if (bugVersion) {
1239-
await this.bugVersionService.fixPackageBugVersions(
1252+
const fixedVersions = await this.bugVersionService.fixPackageBugVersions(
12401253
bugVersion,
12411254
fullname,
12421255
manifests.versions
12431256
);
1244-
const distBytes = Buffer.from(JSON.stringify(manifests));
1245-
const distIntegrity = await calculateIntegrity(distBytes);
1246-
etag = `"${distIntegrity.shasum}"`;
1257+
if (fixedVersions.length > 0) {
1258+
// calculate integrity after fix bug version
1259+
const distBytes = Buffer.from(JSON.stringify(manifests));
1260+
const distIntegrity = await calculateIntegrity(distBytes);
1261+
etag = `"${distIntegrity.shasum}"`;
1262+
}
12471263
} else {
12481264
dist = isFullManifests ? pkg.manifestsDist : pkg.abbreviatedsDist;
1249-
// oxlint-disable-next-line typescript-eslint/no-non-null-assertion
12501265
etag = `"${dist!.shasum}"`;
12511266
}
12521267
return { etag, data: manifests, blockReason };

app/core/service/PackageSyncerService.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ export class PackageSyncerService extends AbstractService {
810810
);
811811
specificVersions.push(distTags.latest);
812812
}
813+
// Get the list of versions to sync this time
813814
const versions = specificVersions
814815
? Object.values<PackageJSONType>(versionMap).filter(verItem =>
815816
specificVersions.includes(verItem.version)
@@ -858,6 +859,7 @@ export class PackageSyncerService extends AbstractService {
858859
let syncIndex = 0;
859860
for (const item of versions) {
860861
const version: string = item.version;
862+
// Skip empty versions, handle abnormal data
861863
if (!version) continue;
862864
let existsItem: (typeof existsVersionMap)[string] | undefined =
863865
existsVersionMap[version];
@@ -945,10 +947,16 @@ export class PackageSyncerService extends AbstractService {
945947
diffMeta.readme = undefined;
946948
}
947949
if (!isEmpty(diffMeta)) {
950+
// Differences found, need to sync the changed metadata
948951
differentMetas.push([existsItem, diffMeta]);
949952
}
953+
954+
// Skip versions that have already been synced
955+
// Avoid duplicate syncing
950956
continue;
951957
}
958+
959+
// New version found, start syncing
952960
syncIndex++;
953961
const description = item.description;
954962
// "dist": {

test/core/service/BugVersionService/fixPackageBugVersion.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { app, mock } from '@eggjs/mock/bootstrap';
44
import { TestUtil } from '../../../../test/TestUtil.ts';
55
import { BugVersionService } from '../../../../app/core/service/BugVersionService.ts';
66
import { DistRepository } from '../../../../app/repository/DistRepository.ts';
7-
import { PackageRepository } from '../../../../app/repository/PackageRepository.ts';
7+
import { PackageJSONType, PackageRepository } from '../../../../app/repository/PackageRepository.ts';
88
import { BugVersion } from '../../../../app/core/entity/BugVersion.ts';
99
import { Package } from '../../../../app/core/entity/Package.ts';
1010
import { PackageVersion } from '../../../../app/core/entity/PackageVersion.ts';
@@ -145,7 +145,7 @@ describe('test/core/service/BugVersionService/fixPackageBugVersion.test.ts', ()
145145
const newManifest = await bugVersionService.fixPackageBugVersion(
146146
bugVersion,
147147
'colors',
148-
manifest
148+
manifest as unknown as PackageJSONType
149149
);
150150
assert.deepStrictEqual(newManifest, {
151151
name: 'colors',
@@ -197,7 +197,7 @@ describe('test/core/service/BugVersionService/fixPackageBugVersion.test.ts', ()
197197
const newManifest = await bugVersionService.fixPackageBugVersion(
198198
bugVersion,
199199
'colors',
200-
manifest
200+
manifest as unknown as PackageJSONType
201201
);
202202
assert.ok(newManifest === manifest);
203203
});
@@ -227,7 +227,7 @@ describe('test/core/service/BugVersionService/fixPackageBugVersion.test.ts', ()
227227
const newManifest = await bugVersionService.fixPackageBugVersion(
228228
bugVersion,
229229
'colors',
230-
manifest
230+
manifest as unknown as PackageJSONType
231231
);
232232
assert.ok(newManifest === manifest);
233233
});

test/core/service/BugVersionService/fixPackageBugVersions.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import assert from 'node:assert/strict';
2+
23
import { app, mock } from '@eggjs/mock/bootstrap';
34

45
import { TestUtil } from '../../../../test/TestUtil.ts';
56
import { BugVersionService } from '../../../../app/core/service/BugVersionService.ts';
67
import { BugVersion } from '../../../../app/core/entity/BugVersion.ts';
8+
import { AbbreviatedPackageJSONType } from '../../../../app/repository/PackageRepository.ts';
79

810
describe('test/core/service/BugVersionService/fixPackageBugVersions.test.ts', () => {
911
let bugVersionService: BugVersionService;
@@ -89,7 +91,7 @@ describe('test/core/service/BugVersionService/fixPackageBugVersions.test.ts', ()
8991
await bugVersionService.fixPackageBugVersions(
9092
bugVersion,
9193
'colors',
92-
manifests
94+
manifests as unknown as Record<string, AbbreviatedPackageJSONType>
9395
);
9496
assert.deepStrictEqual(manifests, {
9597
'1.4.0': {

0 commit comments

Comments
 (0)