add smartlog dependency and integrate logging into NpmRegistry class
This commit is contained in:
@@ -46,6 +46,7 @@
|
||||
"dependencies": {
|
||||
"@push.rocks/qenv": "^6.1.3",
|
||||
"@push.rocks/smartbucket": "^4.3.0",
|
||||
"@push.rocks/smartlog": "^3.1.10",
|
||||
"@push.rocks/smartpath": "^6.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
3
pnpm-lock.yaml
generated
3
pnpm-lock.yaml
generated
@@ -14,6 +14,9 @@ importers:
|
||||
'@push.rocks/smartbucket':
|
||||
specifier: ^4.3.0
|
||||
version: 4.3.0
|
||||
'@push.rocks/smartlog':
|
||||
specifier: ^3.1.10
|
||||
version: 3.1.10
|
||||
'@push.rocks/smartpath':
|
||||
specifier: ^6.0.0
|
||||
version: 6.0.0
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { Smartlog } from '@push.rocks/smartlog';
|
||||
import { BaseRegistry } from '../core/classes.baseregistry.js';
|
||||
import { RegistryStorage } from '../core/classes.registrystorage.js';
|
||||
import { AuthManager } from '../core/classes.authmanager.js';
|
||||
@@ -23,6 +24,7 @@ export class NpmRegistry extends BaseRegistry {
|
||||
private authManager: AuthManager;
|
||||
private basePath: string = '/npm';
|
||||
private registryUrl: string;
|
||||
private logger: Smartlog;
|
||||
|
||||
constructor(
|
||||
storage: RegistryStorage,
|
||||
@@ -35,6 +37,19 @@ export class NpmRegistry extends BaseRegistry {
|
||||
this.authManager = authManager;
|
||||
this.basePath = basePath;
|
||||
this.registryUrl = registryUrl;
|
||||
|
||||
// Initialize logger
|
||||
this.logger = new Smartlog({
|
||||
logContext: {
|
||||
company: 'push.rocks',
|
||||
companyunit: 'smartregistry',
|
||||
containerName: 'npm-registry',
|
||||
environment: (process.env.NODE_ENV as any) || 'development',
|
||||
runtime: 'node',
|
||||
zone: 'npm'
|
||||
}
|
||||
});
|
||||
this.logger.enableConsole();
|
||||
}
|
||||
|
||||
public async init(): Promise<void> {
|
||||
@@ -47,14 +62,17 @@ export class NpmRegistry extends BaseRegistry {
|
||||
|
||||
public async handleRequest(context: IRequestContext): Promise<IResponse> {
|
||||
const path = context.path.replace(this.basePath, '');
|
||||
console.log(`[NPM handleRequest] method=${context.method}, path=${path}`);
|
||||
|
||||
// Extract token from Authorization header
|
||||
const authHeader = context.headers['authorization'] || context.headers['Authorization'];
|
||||
const tokenString = authHeader?.replace(/^Bearer\s+/i, '');
|
||||
console.log(`[NPM handleRequest] authHeader=${authHeader}, tokenString=${tokenString}`);
|
||||
const token = tokenString ? await this.authManager.validateToken(tokenString, 'npm') : null;
|
||||
console.log(`[NPM handleRequest] token validated:`, token);
|
||||
|
||||
this.logger.log('debug', `handleRequest: ${context.method} ${path}`, {
|
||||
method: context.method,
|
||||
path,
|
||||
hasAuth: !!token
|
||||
});
|
||||
|
||||
// Registry root
|
||||
if (path === '/' || path === '') {
|
||||
@@ -192,7 +210,12 @@ export class NpmRegistry extends BaseRegistry {
|
||||
query: Record<string, string>
|
||||
): Promise<IResponse> {
|
||||
const packument = await this.storage.getNpmPackument(packageName);
|
||||
console.log(`[getPackument] packageName=${packageName}, versions=`, packument ? Object.keys(packument.versions) : 'null');
|
||||
this.logger.log('debug', `getPackument: ${packageName}`, {
|
||||
packageName,
|
||||
found: !!packument,
|
||||
versions: packument ? Object.keys(packument.versions).length : 0
|
||||
});
|
||||
|
||||
if (!packument) {
|
||||
return {
|
||||
status: 404,
|
||||
@@ -279,9 +302,16 @@ export class NpmRegistry extends BaseRegistry {
|
||||
body: IPublishRequest,
|
||||
token: IAuthToken | null
|
||||
): Promise<IResponse> {
|
||||
console.log(`[publishPackage] packageName=${packageName}, token=`, token);
|
||||
this.logger.log('info', `publishPackage: ${packageName}`, {
|
||||
packageName,
|
||||
versions: Object.keys(body.versions || {}),
|
||||
hasAuth: !!token
|
||||
});
|
||||
|
||||
const hasPermission = await this.checkPermission(token, packageName, 'write');
|
||||
console.log(`[publishPackage] hasPermission=${hasPermission}`);
|
||||
if (!hasPermission) {
|
||||
this.logger.log('warn', `publishPackage: unauthorized`, { packageName, userId: token?.userId });
|
||||
}
|
||||
if (!hasPermission) {
|
||||
return {
|
||||
status: 401,
|
||||
@@ -382,9 +412,12 @@ export class NpmRegistry extends BaseRegistry {
|
||||
}
|
||||
|
||||
// Save packument
|
||||
console.log(`[publishPackage] Saving packument with versions:`, Object.keys(packument.versions));
|
||||
await this.storage.putNpmPackument(packageName, packument);
|
||||
console.log(`[publishPackage] Packument saved successfully`);
|
||||
this.logger.log('success', `publishPackage: saved ${packageName}`, {
|
||||
packageName,
|
||||
versions: Object.keys(packument.versions),
|
||||
distTags: packument['dist-tags']
|
||||
});
|
||||
|
||||
return {
|
||||
status: 201,
|
||||
@@ -531,13 +564,14 @@ export class NpmRegistry extends BaseRegistry {
|
||||
const size = parseInt(query.size || '20', 10);
|
||||
const from = parseInt(query.from || '0', 10);
|
||||
|
||||
this.logger.log('debug', `handleSearch: query="${text}"`, { text, size, from });
|
||||
|
||||
// Simple search implementation
|
||||
const results: ISearchResult[] = [];
|
||||
|
||||
try {
|
||||
// List all package paths
|
||||
const packagePaths = await this.storage.listObjects('npm/packages/');
|
||||
console.log(`[handleSearch] packagePaths (${packagePaths.length}):`, packagePaths.slice(0, 10));
|
||||
|
||||
// Extract unique package names from paths (format: npm/packages/{packageName}/...)
|
||||
const packageNames = new Set<string>();
|
||||
@@ -547,7 +581,11 @@ export class NpmRegistry extends BaseRegistry {
|
||||
packageNames.add(match[1]);
|
||||
}
|
||||
}
|
||||
console.log(`[handleSearch] Found ${packageNames.size} packages:`, Array.from(packageNames));
|
||||
|
||||
this.logger.log('debug', `handleSearch: found ${packageNames.size} packages`, {
|
||||
totalPackages: packageNames.size,
|
||||
pathsScanned: packagePaths.length
|
||||
});
|
||||
|
||||
// Load packuments and filter by search text
|
||||
for (const packageName of packageNames) {
|
||||
|
||||
@@ -5,6 +5,7 @@ export { path };
|
||||
|
||||
// @push.rocks scope
|
||||
import * as smartbucket from '@push.rocks/smartbucket';
|
||||
import * as smartlog from '@push.rocks/smartlog';
|
||||
import * as smartpath from '@push.rocks/smartpath';
|
||||
|
||||
export { smartbucket, smartpath };
|
||||
export { smartbucket, smartlog, smartpath };
|
||||
|
||||
Reference in New Issue
Block a user