@@ -3,6 +3,8 @@ import path from "node:path";
33import { readFileSync } from "node:fs" ;
44
55// Import Third-party Dependencies
6+ import pacote from "pacote" ;
7+ import * as npmRegistrySDK from "@nodesecure/npm-registry-sdk" ;
68import { Mutex , MutexRelease } from "@openally/mutex" ;
79import {
810 extractAndResolve ,
@@ -26,7 +28,8 @@ import {
2628 getManifestLinks ,
2729 NPM_TOKEN
2830} from "./utils/index.ts" ;
29- import { NpmRegistryProvider } from "./registry/NpmRegistryProvider.ts" ;
31+ import { NpmRegistryProvider , type NpmApiClient } from "./registry/NpmRegistryProvider.ts" ;
32+ import { StatsCollector } from "./class/StatsCollector.class.ts" ;
3033import { RegistryTokenStore } from "./registry/RegistryTokenStore.ts" ;
3134import { TempDirectory } from "./class/TempDirectory.class.ts" ;
3235import { Logger , ScannerLoggerEvents } from "./class/logger.class.ts" ;
@@ -94,7 +97,6 @@ type InitialPayload =
9497 Partial < Payload > &
9598 {
9699 rootDependency : Payload [ "rootDependency" ] ;
97- metadata : Payload [ "metadata" ] ;
98100 } ;
99101
100102export async function depWalker (
@@ -113,7 +115,7 @@ export async function depWalker(
113115 npmRcConfig
114116 } = options ;
115117
116- const startedAt = Date . now ( ) ;
118+ const statsCollector = new StatsCollector ( ) ;
117119 const isRemoteScanning = typeof location === "undefined" ;
118120 const tokenStore = new RegistryTokenStore ( npmRcConfig , NPM_TOKEN . token ) ;
119121
@@ -130,18 +132,36 @@ export async function depWalker(
130132 } ,
131133 scannerVersion : packageVersion ,
132134 vulnerabilityStrategy,
133- warnings : [ ] ,
134- metadata : {
135- startedAt,
136- executionTime : 0
137- }
135+ warnings : [ ]
138136 } ;
139137
140138 const dependencies : Map < string , Dependency > = new Map ( ) ;
141139 const highlightedPackages : Set < string > = new Set ( ) ;
142140 const npmTreeWalker = new npm . TreeWalker ( {
143- registry
141+ registry,
142+ providers : {
143+ pacote : {
144+ manifest : ( spec , opts ) => statsCollector . track ( `pacote.manifest ${ spec } ` , ( ) => pacote . manifest ( spec , opts ) ) ,
145+ packument : ( spec , opts ) => statsCollector . track ( `pacote.packument ${ spec } ` , ( ) => pacote . packument ( spec , opts ) )
146+ }
147+ }
144148 } ) ;
149+ const npmApiClient : NpmApiClient = {
150+ packument : ( name , opts ) => statsCollector . track (
151+ `npmRegistrySDK.packument ${ name } ` ,
152+ ( ) => npmRegistrySDK . packument ( name , opts )
153+ ) ,
154+
155+ packumentVersion : ( name , version , opts ) => statsCollector . track (
156+ `npmRegistrySDK.packumentVersion ${ name } @${ version } ` ,
157+ ( ) => npmRegistrySDK . packumentVersion ( name , version , opts )
158+ ) ,
159+
160+ org : ( namespace ) => statsCollector . track (
161+ `npmRegistrySDK.org ${ namespace } ` ,
162+ ( ) => npmRegistrySDK . org ( namespace )
163+ )
164+ } ;
145165 {
146166 logger
147167 . start ( ScannerLoggerEvents . analysis . tree )
@@ -181,7 +201,8 @@ export async function depWalker(
181201 operationsQueue . push (
182202 new NpmRegistryProvider ( name , version , {
183203 registry,
184- tokenStore
204+ tokenStore,
205+ npmApiClient
185206 } ) . enrichDependencyVersion ( dep , dependencyConfusionWarnings , org )
186207 ) ;
187208
@@ -350,7 +371,7 @@ export async function depWalker(
350371 packages : [ ...highlightedPackages ]
351372 } ;
352373 payload . dependencies = Object . fromEntries ( dependencies ) ;
353- payload . metadata . executionTime = Date . now ( ) - startedAt ;
374+ payload . metadata = statsCollector . getStats ( ) ;
354375
355376 return payload as Payload ;
356377 }
0 commit comments