Files
cnpmcore/app/common/adapter/changesStream/NpmChangesStream.ts
MK (fengmk2) e5162f20aa fix: improve TypeScript type definitions across codebase (#844)
This commit enhances type safety and fixes type-related issues
throughout the project including:
- Updated type definitions in entities, repositories, and models
- Improved type annotations in services and controllers
- Fixed type issues in adapters and utilities
- Enhanced test file type definitions
- Added typings/index.d.ts for global type declarations

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-23 00:58:59 +08:00

85 lines
2.3 KiB
TypeScript

import { SingletonProto } from '@eggjs/tegg';
import { E500 } from 'egg-errors';
import { RegistryType } from '../../../common/enum/Registry.ts';
import type { Registry } from '../../../core/entity/Registry.ts';
import {
AbstractChangeStream,
RegistryChangesStream,
type ChangesStreamChange,
} from './AbstractChangesStream.ts';
@SingletonProto()
@RegistryChangesStream(RegistryType.Npm)
export class NpmChangesStream extends AbstractChangeStream {
async getInitialSince(registry: Registry): Promise<string> {
const db = new URL(registry.changeStream).origin;
const { status, data } = await this.httpclient.request(db, {
followRedirect: true,
timeout: 10_000,
dataType: 'json',
headers: {
'npm-replication-opt-in': 'true',
},
});
const since = String(data.update_seq - 10);
if (!data.update_seq) {
throw new E500(`get getInitialSince failed: ${data.update_seq}`);
}
this.logger.warn(
'[NpmChangesStream.getInitialSince] GET %s status: %s, data: %j, since: %s',
registry.name,
registry.changeStream,
status,
data,
since
);
return since;
}
async *fetchChanges(
registry: Registry,
since: string
): AsyncGenerator<ChangesStreamChange> {
// https://github.com/orgs/community/discussions/152515
const db = this.getChangesStreamUrl(registry, since);
const { data, headers } = await this.httpclient.request(db, {
timeout: 60_000,
headers: {
'npm-replication-opt-in': 'true',
},
dataType: 'json',
gzip: true,
});
const count = data.results?.length;
const last_seq = data.last_seq;
this.logger.info(
'[NpmChangesStream.fetchChanges] %s, count: %s, last_seq: %s, headers: %j',
db,
count,
last_seq,
headers
);
if (data.results?.length > 0) {
for (const change of data.results) {
// {
// seq: 2495018,
// id: 'ng-create-all-project',
// changes: [ { rev: '3-be3a014aab8e379ba28a28adb8e10142' }, [length]: 1 ],
// deleted: true
// },
const seq = String(change.seq);
const fullname = change.id;
if (seq && fullname && seq !== since) {
const change = {
fullname,
seq,
};
yield change;
}
}
}
}
}