@@ -4,6 +4,42 @@ import { pool } from '../db/postgres';
44import { env } from '../config/env' ;
55import { Tier , TIER_RATE_LIMITS } from '../types/vault.types' ;
66
7+ const NPM_PACKAGE = '@aarna-ai/mcp-server-atv' ;
8+ const NPM_BASE = 'https://api.npmjs.org/downloads' ;
9+
10+ export async function getNpmDownloads ( _req : Request , res : Response ) : Promise < void > {
11+ const today = new Date ( ) . toISOString ( ) . slice ( 0 , 10 ) ;
12+ const pkg = encodeURIComponent ( NPM_PACKAGE ) ;
13+
14+ const [ rangeRes , monthlyRes , weeklyRes ] = await Promise . all ( [
15+ fetch ( `${ NPM_BASE } /range/2000-01-01:${ today } /${ pkg } ` ) ,
16+ fetch ( `${ NPM_BASE } /point/last-month/${ pkg } ` ) ,
17+ fetch ( `${ NPM_BASE } /point/last-week/${ pkg } ` ) ,
18+ ] ) ;
19+
20+ if ( ! rangeRes . ok || ! monthlyRes . ok || ! weeklyRes . ok ) {
21+ res . status ( 502 ) . json ( { error : 'npm registry request failed' } ) ;
22+ return ;
23+ }
24+
25+ const [ rangeData , monthlyData , weeklyData ] = await Promise . all ( [
26+ rangeRes . json ( ) as Promise < { downloads : { downloads : number ; day : string } [ ] } > ,
27+ monthlyRes . json ( ) as Promise < { downloads : number } > ,
28+ weeklyRes . json ( ) as Promise < { downloads : number } > ,
29+ ] ) ;
30+
31+ const allDownloads = rangeData . downloads ?? [ ] ;
32+ const total = allDownloads . reduce ( ( sum : number , d : { downloads : number } ) => sum + d . downloads , 0 ) ;
33+ const trend = allDownloads . slice ( - 30 ) ;
34+
35+ res . json ( {
36+ total,
37+ monthly : monthlyData . downloads ?? 0 ,
38+ weekly : weeklyData . downloads ?? 0 ,
39+ trend,
40+ } ) ;
41+ }
42+
743const VALID_PERIODS : Record < string , string > = {
844 '24h' : '24 hours' ,
945 '7d' : '7 days' ,
0 commit comments