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>
85 lines
2.3 KiB
TypeScript
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|