@ecosyste-ms/critical 1.1.0 → 1.1.20260514

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
package/lib/index.js CHANGED
@@ -21,22 +21,39 @@ if (!existsSync(databasePath) && existsSync(gzPath)) {
21
21
  }
22
22
 
23
23
  const API_BASE = 'https://packages.ecosyste.ms/api/v1'
24
- const PER_PAGE = 1000
24
+ const PER_PAGE = 100
25
25
  const RATE_LIMIT_MS = 50
26
26
  const CONCURRENCY = 10
27
+ const MAX_RETRIES = 5
28
+ const RETRY_BASE_MS = 1000
27
29
 
28
30
  function sleep(ms) {
29
31
  return new Promise(resolve => setTimeout(resolve, ms))
30
32
  }
31
33
 
32
34
  async function fetchJson(url) {
33
- const response = await fetch(url, {
34
- headers: { 'User-Agent': USER_AGENT }
35
- })
36
- if (!response.ok) {
37
- throw new Error(`HTTP ${response.status}: ${url}`)
35
+ let lastErr
36
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
37
+ try {
38
+ const response = await fetch(url, {
39
+ headers: { 'User-Agent': USER_AGENT }
40
+ })
41
+ if (response.ok) return response.json()
42
+ // 4xx is a client error — don't retry. 5xx is server-side; retry.
43
+ if (response.status < 500) {
44
+ throw new Error(`HTTP ${response.status}: ${url}`)
45
+ }
46
+ lastErr = new Error(`HTTP ${response.status}: ${url}`)
47
+ } catch (err) {
48
+ // Network errors (fetch throws TypeError) are retryable.
49
+ if (err.message?.startsWith('HTTP ') && !err.message.match(/HTTP 5\d\d/)) throw err
50
+ lastErr = err
51
+ }
52
+ if (attempt < MAX_RETRIES) {
53
+ await sleep(RETRY_BASE_MS * Math.pow(2, attempt))
54
+ }
38
55
  }
39
- return response.json()
56
+ throw lastErr
40
57
  }
41
58
 
42
59
  async function fetchAllCriticalPackages(onProgress) {
@@ -263,14 +280,14 @@ function insertRepoMetadata(db, packageId, repoMetadata, host) {
263
280
 
264
281
  stmt.run(
265
282
  packageId,
266
- repoMetadata.owner,
267
- repoMetadata.name,
268
- repoMetadata.full_name,
269
- host?.name,
270
- repoMetadata.language,
271
- repoMetadata.stargazers_count,
272
- repoMetadata.forks_count,
273
- repoMetadata.open_issues_count,
283
+ repoMetadata.owner ?? null,
284
+ repoMetadata.name ?? null,
285
+ repoMetadata.full_name ?? null,
286
+ host?.name ?? null,
287
+ repoMetadata.language ?? null,
288
+ repoMetadata.stargazers_count ?? null,
289
+ repoMetadata.forks_count ?? null,
290
+ repoMetadata.open_issues_count ?? null,
274
291
  repoMetadata.archived ? 1 : 0,
275
292
  repoMetadata.fork ? 1 : 0
276
293
  )
@@ -399,4 +416,4 @@ async function build(options = {}) {
399
416
  return info
400
417
  }
401
418
 
402
- export { build, createDatabase, fetchAllCriticalPackages, fetchVersionNumbers, databasePath }
419
+ export { build, createDatabase, fetchAllCriticalPackages, fetchVersionNumbers, databasePath, insertRepoMetadata }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ecosyste-ms/critical",
3
- "version": "1.1.0",
3
+ "version": "1.1.20260514",
4
4
  "description": "SQLite database of critical packages from ecosyste.ms",
5
5
  "main": "./lib/index.js",
6
6
  "type": "module",