@lglen/bing-image-search 0.1.1 → 0.2.0

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.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,3 @@
1
1
  # Changelog
2
2
 
3
- - Copied files over from my better bing image search typescript fork
4
- - added thumbnail url support
3
+ Proper Changelog coming soon
package/README.md CHANGED
@@ -24,10 +24,16 @@ const results = await searchBingImages({
24
24
  mkt: "en-US", // default
25
25
  });
26
26
 
27
- // results[0].thumbnailUrl → "https://ts1.mm.bing.net/th?id=..."
28
- // results[0].sourceUrl → original source URL
29
- // results[0].title → alt text
30
- // results[0].width/height dimensions (0 if unknown)
27
+ console.log(`Found ${results.length} results:\n`);
28
+
29
+ for (const r of results) {
30
+ console.log(` Title: ${r.title || "(none)"}`);
31
+ console.log(` Source: ${r.sourceUrl.substring(0, 100)}...`);
32
+ console.log(` Thumb: ${r.thumbnailUrl.substring(0, 100)}...`);
33
+ console.log(` Page: ${r.pageUrl.substring(0, 100)}...`);
34
+ console.log(` Size: ${r.width}x${r.height}`);
35
+ console.log();
36
+ }
31
37
  ```
32
38
 
33
39
  ### `Bing` class — download images to disk
@@ -64,6 +70,36 @@ All download errors extend `ImageSaveError`:
64
70
  import { ImageSaveError, NetworkError } from "@lglen/bing-image-search";
65
71
  ```
66
72
 
73
+ ### Debugging
74
+
75
+ Debug logging is **off by default**. Enable it to see internal requests, parsed data, and errors:
76
+
77
+ ```ts
78
+ import { debug, TraceEvents } from "@lglen/bing-image-search";
79
+
80
+ debug.enable("trace", {
81
+ [TraceEvents.BingMedia.ParsedCardJson]: 5,
82
+ [TraceEvents.BingMedia.AcceptedResult]: 20,
83
+ [TraceEvents.Bing.FileExists]: 10,
84
+ });
85
+
86
+ // Reset counters between runs:
87
+ debug.resetCounts();
88
+ ```
89
+
90
+ **Custom handler** — for Firebase Cloud Functions or structured logging:
91
+
92
+ ```ts
93
+ debug.setHandler((entry) => {
94
+ // entry.timestamp, entry.level, entry.module, entry.message, entry.data
95
+ console.log(JSON.stringify(entry));
96
+ });
97
+ ```
98
+
99
+ Levels: `"off"` | `"error"` | `"warn"` | `"info"` | `"debug"` | `"trace"`
100
+
101
+ > **Tip:** "trace" level logs are rate-limited internally to avoid flooding — noisy per-item logs auto-cap at 5–20 entries. Call `debug.resetCounts()` to reset the caps between runs.
102
+
67
103
  ## License
68
104
 
69
105
  MIT
@@ -17,6 +17,8 @@ export interface BingImageResult {
17
17
  thumbnailUrl: string;
18
18
  /** The original source URL (may 403 if the host blocks hotlinking). */
19
19
  sourceUrl: string;
20
+ /** The webpage URL that contains this image (the page it links to). */
21
+ pageUrl: string;
20
22
  /** Title/alt text from the search result. */
21
23
  title: string;
22
24
  /** Width of the full image in pixels (0 if unknown). */
@@ -1 +1 @@
1
- {"version":3,"file":"bing-media.d.ts","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAaH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,eAAe,EAAE,CAAC,CAwE5B"}
1
+ {"version":3,"file":"bing-media.d.ts","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkBH,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,eAAe,EAAE,CAAC,CA2H5B"}
@@ -12,6 +12,10 @@
12
12
  * // results[0].thumbnailUrl → "https://ts1.mm.bing.net/th?id=..."
13
13
  * // <img src={results[0].thumbnailUrl} />
14
14
  */
15
+ import { createLogger } from "./debug.js";
16
+ import { TraceEvents } from "./trace-events.js";
17
+ const log = createLogger("bing-media");
18
+ const T = TraceEvents.BingMedia;
15
19
  const PAGE_SIZE = 35;
16
20
  const HEADERS = {
17
21
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
@@ -31,6 +35,7 @@ export async function searchBingImages(options) {
31
35
  const seenThumbUrls = new Set();
32
36
  while (results.length < limit) {
33
37
  const url = buildPageUrl(query, page, adult, mkt);
38
+ log.debug("Fetching page", { page, url });
34
39
  let html;
35
40
  try {
36
41
  const resp = await fetch(url, {
@@ -41,8 +46,20 @@ export async function searchBingImages(options) {
41
46
  throw new Error(`HTTP ${resp.status}`);
42
47
  }
43
48
  html = await resp.text();
49
+ log.debug("Received HTML", { page, length: html.length, status: resp.status });
50
+ log.trace("Response details", {
51
+ page,
52
+ url: url.substring(0, 150),
53
+ status: resp.status,
54
+ statusText: resp.statusText,
55
+ contentType: resp.headers.get("content-type"),
56
+ contentEncoding: resp.headers.get("content-encoding"),
57
+ htmlPreview: html.substring(0, 500),
58
+ htmlSuffix: html.length > 500 ? html.substring(html.length - 200) : "",
59
+ });
44
60
  }
45
61
  catch (e) {
62
+ log.warn("Fetch failed", { page, error: e.message });
46
63
  // Network error or timeout — try next page after brief pause
47
64
  if (page < 5) {
48
65
  page++;
@@ -53,37 +70,68 @@ export async function searchBingImages(options) {
53
70
  }
54
71
  // Parse each image card from the HTML
55
72
  const cards = parseImageCards(html);
56
- if (cards.length === 0)
73
+ log.debug("Parsed cards", { page, cardCount: cards.length });
74
+ if (cards.length === 0) {
75
+ log.info("No cards found — stopping pagination");
57
76
  break;
77
+ }
58
78
  for (const card of cards) {
59
79
  if (results.length >= limit)
60
80
  break;
61
81
  // Dedupe by thumbnail URL (Bing sometimes repeats)
62
82
  const thumbKey = card.turl ?? card.murl;
63
- if (!thumbKey || seenThumbUrls.has(thumbKey))
83
+ if (!thumbKey || seenThumbUrls.has(thumbKey)) {
84
+ log.trace(T.DedupedThumbnail, {
85
+ thumbKey: thumbKey?.substring(0, 100),
86
+ reason: !thumbKey ? "no thumbnail key" : "already seen",
87
+ });
64
88
  continue;
89
+ }
65
90
  const sourceUrl = card.murl ?? "";
66
- if (sourceUrl && seenSourceUrls.has(sourceUrl))
91
+ if (sourceUrl && seenSourceUrls.has(sourceUrl)) {
92
+ log.trace(T.DedupedSource, { sourceUrl: sourceUrl.substring(0, 100) });
67
93
  continue;
94
+ }
68
95
  if (sourceUrl)
69
96
  seenSourceUrls.add(sourceUrl);
70
97
  if (thumbKey)
71
98
  seenThumbUrls.add(thumbKey);
99
+ log.trace(T.AcceptedResult, {
100
+ index: results.length,
101
+ thumb: card.turl?.substring(0, 100),
102
+ source: sourceUrl.substring(0, 100),
103
+ page: card.purl?.substring(0, 100),
104
+ title: card.desc?.substring(0, 80),
105
+ });
72
106
  results.push({
73
107
  thumbnailUrl: card.turl ?? sourceUrl,
74
108
  sourceUrl,
109
+ pageUrl: card.purl ?? "",
75
110
  title: card.desc ?? "",
76
111
  width: card.width ?? 0,
77
112
  height: card.height ?? 0,
78
113
  });
79
114
  }
80
115
  // If we got fewer results than page size, we're probably at the end
81
- if (cards.length < PAGE_SIZE)
116
+ if (cards.length < PAGE_SIZE) {
117
+ log.trace("Ending pagination — fewer cards than page size", {
118
+ cards: cards.length,
119
+ pageSize: PAGE_SIZE,
120
+ page,
121
+ });
82
122
  break;
123
+ }
83
124
  page++;
84
- if (page > 28)
85
- break; // safety: ~1000 results max
125
+ if (page > 28) {
126
+ log.trace("Hit max page limit — safety cut-off", { page });
127
+ break;
128
+ }
86
129
  }
130
+ log.info(`Search complete`, {
131
+ query,
132
+ totalResults: results.length,
133
+ pagesFetched: page + 1,
134
+ });
87
135
  return results;
88
136
  }
89
137
  function parseImageCards(html) {
@@ -91,7 +139,9 @@ function parseImageCards(html) {
91
139
  // Bing wraps each image result with an m="{...}" JSON attribute.
92
140
  // The JSON uses &quot; for quotes (HTML-encoded).
93
141
  const cardRe = /m="\{&quot;[^}]*\}"/g;
94
- for (const match of html.matchAll(cardRe)) {
142
+ const rawMatches = [...html.matchAll(cardRe)];
143
+ log.trace("JSON card parsing", { matchCount: rawMatches.length });
144
+ for (const match of rawMatches) {
95
145
  try {
96
146
  // Extract JSON string, decode HTML entities, unescape
97
147
  const raw = match[0]
@@ -105,28 +155,49 @@ function parseImageCards(html) {
105
155
  card.murl = m.murl;
106
156
  if (m.turl)
107
157
  card.turl = m.turl;
158
+ if (m.purl)
159
+ card.purl = m.purl;
108
160
  if (m.desc)
109
161
  card.desc = m.desc;
110
162
  if (m.w)
111
163
  card.width = Number(m.w);
112
164
  if (m.h)
113
165
  card.height = Number(m.h);
166
+ log.trace(T.ParsedCardJson, {
167
+ murl: m.murl?.substring(0, 120),
168
+ turl: m.turl?.substring(0, 120),
169
+ purl: m.purl?.substring(0, 120),
170
+ desc: m.desc?.substring(0, 100),
171
+ w: m.w,
172
+ h: m.h,
173
+ });
114
174
  cards.push(card);
115
175
  }
116
176
  catch {
177
+ log.trace(T.SkippedMalformedCard, { raw: match[0].substring(0, 200) });
117
178
  // Skip malformed entries
118
179
  }
119
180
  }
120
- // Fallback: if the JSON approach didn't work, regex the turl/murl directly.
181
+ // Fallback: if the JSON approach didn't work, regex the turl/murl/purl directly.
121
182
  if (cards.length === 0) {
183
+ log.trace("Falling back to regex extraction");
122
184
  const murls = [...html.matchAll(/murl&quot;:&quot;(.*?)&quot;/g)].map((m) => m[1]);
123
185
  const turls = [...html.matchAll(/turl&quot;:&quot;(.*?)&quot;/g)]
124
186
  .map((m) => m[1])
125
187
  .filter(Boolean);
126
- for (let i = 0; i < Math.max(murls.length, turls.length); i++) {
188
+ const purls = [...html.matchAll(/purl&quot;:&quot;(.*?)&quot;/g)]
189
+ .map((m) => m[1])
190
+ .filter(Boolean);
191
+ log.trace("Regex fallback counts", {
192
+ murlCount: murls.length,
193
+ turlCount: turls.length,
194
+ purlCount: purls.length,
195
+ });
196
+ for (let i = 0; i < Math.max(murls.length, turls.length, purls.length); i++) {
127
197
  cards.push({
128
198
  murl: murls[i] ?? undefined,
129
199
  turl: turls[i] ?? undefined,
200
+ purl: purls[i] ?? undefined,
130
201
  });
131
202
  }
132
203
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bing-media.js","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bing-media.js","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bing.d.ts","sourceRoot":"","sources":["../src/bing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,IAAI;IACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,OAAO,CAA2B;IAG1C,MAAM,EAAE,WAAW,EAAE,CAAM;IAC3B,OAAO,SAAK;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAM;IAClD,cAAc,UAAS;IACvB,SAAS,UAAS;gBAEN,OAAO,EAAE,WAAW;IAgBhC,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,YAAY;YAmBN,SAAS;IA+BvB,OAAO,CAAC,YAAY;IAOd,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAsFZ,aAAa;YAwDb,SAAS;IAyEvB,OAAO,CAAC,cAAc;CAKvB"}
1
+ {"version":3,"file":"bing.d.ts","sourceRoot":"","sources":["../src/bing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuB9C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,IAAI;IACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,OAAO,CAA2B;IAG1C,MAAM,EAAE,WAAW,EAAE,CAAM;IAC3B,OAAO,SAAK;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC,CAAM;IAClD,cAAc,UAAS;IACvB,SAAS,UAAS;gBAEN,OAAO,EAAE,WAAW;IAsBhC,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,YAAY;YAmBN,SAAS;IA+CvB,OAAO,CAAC,YAAY;IAYd,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA4HZ,aAAa;YA4Db,SAAS;IAoHvB,OAAO,CAAC,cAAc;CAKvB"}
package/dist/bing.js CHANGED
@@ -9,6 +9,10 @@ import { basename, join, extname } from "node:path";
9
9
  import { gunzipSync } from "node:zlib";
10
10
  import { NetworkError, InvalidImageError, DuplicateImageError, WriteError, } from "./errors.js";
11
11
  import { VALID_IMAGE_EXTENSIONS, MIME_TO_EXT, DEFAULT_HEADERS, } from "./constants.js";
12
+ import { createLogger, debug } from "./debug.js";
13
+ import { TraceEvents } from "./trace-events.js";
14
+ const log = createLogger("bing");
15
+ const T = TraceEvents.Bing;
12
16
  const PAGE_SIZE = 35;
13
17
  const BACKOFF_INITIAL = 2.0;
14
18
  const BACKOFF_FACTOR = 2.0;
@@ -41,11 +45,16 @@ export class Bing {
41
45
  this.adult = options.adult ?? "moderate";
42
46
  this.timeout = options.timeout ?? 60;
43
47
  this.filter = options.filter ?? "";
44
- this.verbose = options.verbose ?? true;
48
+ this.verbose = options.verbose ?? false;
45
49
  this.badsites = new Set(options.badsites ?? []);
46
50
  this.imageName = options.name ?? "Image";
47
51
  this.forceReplace = options.forceReplace ?? false;
48
52
  this.mkt = options.mkt ?? "en-US";
53
+ // Wire verbose into the global debug system so consumers
54
+ // can set a custom handler and still see Bing download logs.
55
+ if (this.verbose && debug.getLevel() === "off") {
56
+ debug.enable("info");
57
+ }
49
58
  }
50
59
  // ─── filter shorthand → Bing filterui string ──────────────────────
51
60
  getFilter(shorthand) {
@@ -78,6 +87,7 @@ export class Bing {
78
87
  // ─── Fetch a single Bing results page ─────────────────────────────
79
88
  async fetchPage(page) {
80
89
  const url = this.buildPageUrl(page);
90
+ log.trace("Fetching Bing page", { page, url: url.substring(0, 200) });
81
91
  const resp = await fetch(url, {
82
92
  headers: {
83
93
  ...DEFAULT_HEADERS,
@@ -85,6 +95,14 @@ export class Bing {
85
95
  },
86
96
  signal: AbortSignal.timeout(this.timeout * 1000),
87
97
  });
98
+ log.trace("Bing page response", {
99
+ page,
100
+ status: resp.status,
101
+ statusText: resp.statusText,
102
+ contentType: resp.headers.get("content-type"),
103
+ contentEncoding: resp.headers.get("content-encoding"),
104
+ contentLength: resp.headers.get("content-length"),
105
+ });
88
106
  if (!resp.ok) {
89
107
  throw new NetworkError(url, `HTTP ${resp.status} ${resp.statusText}`);
90
108
  }
@@ -94,29 +112,50 @@ export class Bing {
94
112
  const buf = new Uint8Array(await resp.arrayBuffer());
95
113
  const enc = resp.headers.get("Content-Encoding");
96
114
  if (enc === "gzip") {
115
+ log.trace("Manually gunzipping response", { page });
97
116
  try {
98
- return new TextDecoder().decode(gunzipSync(buf));
117
+ const decoded = new TextDecoder().decode(gunzipSync(buf));
118
+ log.trace("HTML after gunzip", { page, length: decoded.length, preview: decoded.substring(0, 400) });
119
+ return decoded;
99
120
  }
100
121
  catch {
101
- // Already decompressed by fetch decode as-is
122
+ log.trace("Gunzip failed treating as already decompressed", { page });
102
123
  }
103
124
  }
104
- return new TextDecoder().decode(buf);
125
+ const html = new TextDecoder().decode(buf);
126
+ log.trace("HTML decoded", { page, length: html.length, preview: html.substring(0, 400) });
127
+ return html;
105
128
  }
106
129
  // ─── Extract image URLs from Bing HTML ────────────────────────────
107
130
  extractLinks(html) {
108
131
  const re = /murl&quot;:&quot;(.*?)&quot;/g;
109
- return [...html.matchAll(re)].map((m) => m[1]);
132
+ const links = [...html.matchAll(re)].map((m) => m[1]);
133
+ log.trace("Extracted source URLs", {
134
+ count: links.length,
135
+ samples: links.slice(0, 5).map((l) => l.substring(0, 120)),
136
+ });
137
+ return links;
110
138
  }
111
139
  // ─── Main run loop ────────────────────────────────────────────────
112
140
  async run() {
141
+ log.trace("Bing download run starting", {
142
+ query: this.query,
143
+ limit: this.limit,
144
+ outputDir: this.outputDir,
145
+ adult: this.adult,
146
+ timeout: this.timeout,
147
+ filter: this.filter,
148
+ forceReplace: this.forceReplace,
149
+ verbose: this.verbose,
150
+ mkt: this.mkt,
151
+ badsites: [...this.badsites],
152
+ imageName: this.imageName,
153
+ });
113
154
  await mkdir(this.outputDir, { recursive: true });
114
155
  let pageCounter = 0;
115
156
  let slotsUsed = 0;
116
157
  while (slotsUsed < this.limit) {
117
- if (this.verbose) {
118
- console.log(`\n[!] Indexing page: ${pageCounter + 1}`);
119
- }
158
+ log.info(`Indexing page ${pageCounter + 1}`, { query: this.query });
120
159
  // Fetch page
121
160
  let html;
122
161
  try {
@@ -125,27 +164,48 @@ export class Bing {
125
164
  catch (e) {
126
165
  if (e instanceof NetworkError) {
127
166
  const wait = this.consumeBackoff();
128
- console.error(`Network error requesting Bing: ${e.message}. Retrying in ${wait.toFixed(1)}s.`);
167
+ log.warn("Network error retrying", {
168
+ error: e.message,
169
+ retryInSec: wait,
170
+ page: pageCounter,
171
+ });
129
172
  await sleep(wait * 1000);
130
173
  continue;
131
174
  }
132
- console.error(`Unexpected error: ${e}`);
175
+ log.error("Unexpected error fetching page", {
176
+ error: String(e),
177
+ page: pageCounter,
178
+ });
133
179
  break;
134
180
  }
135
181
  if (!html) {
136
- console.log("[%] No more images are available");
182
+ log.info("No more images available — empty response");
137
183
  this.noResultsFound = true;
138
184
  break;
139
185
  }
140
186
  // Extract + filter links
141
187
  const links = this.extractLinks(html);
142
- if (this.verbose) {
143
- console.log(`[%] Indexed ${links.length} Images on Page ${pageCounter + 1}.`);
144
- }
145
- const filtered = links.filter((link) => !this.seen.has(link) &&
146
- ![...this.badsites].some((bs) => link.includes(bs)));
188
+ log.info(`Indexed ${links.length} images on page ${pageCounter + 1}`);
189
+ const filtered = links.filter((link) => {
190
+ const alreadySeen = this.seen.has(link);
191
+ const isBadsite = [...this.badsites].some((bs) => link.includes(bs));
192
+ if (alreadySeen) {
193
+ log.trace(T.FilteredSeen, { url: link.substring(0, 120) });
194
+ }
195
+ if (isBadsite) {
196
+ log.trace(T.FilteredBadsite, { url: link.substring(0, 120) });
197
+ }
198
+ return !alreadySeen && !isBadsite;
199
+ });
200
+ log.trace("Link filtering stats", {
201
+ page: pageCounter,
202
+ total: links.length,
203
+ kept: filtered.length,
204
+ seen: this.seen.size,
205
+ badsites: [...this.badsites],
206
+ });
147
207
  if (filtered.length === 0) {
148
- console.log("[%] No new images are available");
208
+ log.info("No new images available on this page");
149
209
  break;
150
210
  }
151
211
  for (const link of filtered)
@@ -153,6 +213,14 @@ export class Bing {
153
213
  const remaining = this.limit - slotsUsed;
154
214
  const toDownload = filtered.slice(0, remaining);
155
215
  const slotsBefore = slotsUsed;
216
+ log.trace("Download batch", {
217
+ page: pageCounter,
218
+ toDownload: toDownload.length,
219
+ remaining,
220
+ slotsUsed,
221
+ totalLimit: this.limit,
222
+ urls: toDownload.map((l) => l.substring(0, 100)),
223
+ });
156
224
  for (const link of toDownload) {
157
225
  if (slotsUsed >= this.limit)
158
226
  break;
@@ -167,7 +235,7 @@ export class Bing {
167
235
  // result === "fail" → doesn't consume a slot
168
236
  }
169
237
  if (slotsUsed === slotsBefore) {
170
- console.warn("No images could be downloaded from this page");
238
+ log.warn("No images could be downloaded from this page");
171
239
  break;
172
240
  }
173
241
  if (slotsUsed >= this.limit)
@@ -175,9 +243,11 @@ export class Bing {
175
243
  pageCounter++;
176
244
  this.backoff = BACKOFF_INITIAL;
177
245
  }
178
- if (this.verbose) {
179
- console.log(`\n[%] Done. Downloaded ${this.images.length} images.`);
180
- }
246
+ log.info("Download run complete", {
247
+ downloaded: this.images.length,
248
+ skipped: this.skipped,
249
+ errors: this.errors.length,
250
+ });
181
251
  }
182
252
  // ─── Download a single image ──────────────────────────────────────
183
253
  async downloadImage(link, index) {
@@ -185,40 +255,44 @@ export class Bing {
185
255
  const urlPath = link.split("?")[0];
186
256
  let ext = extname(urlPath).replace(".", "").toLowerCase();
187
257
  if (!VALID_IMAGE_EXTENSIONS.has(ext)) {
258
+ log.trace(T.ExtFallback, {
259
+ originalExt: ext,
260
+ urlPath: urlPath.substring(0, 120),
261
+ });
188
262
  ext = "jpg"; // fallback
189
263
  }
190
264
  const filePath = join(this.outputDir, `${this.imageName}_${index}.${ext}`);
265
+ log.trace(T.TargetFilePath, { index, filePath, ext, sourceUrl: link.substring(0, 120) });
191
266
  // Resume: skip if file already exists
192
267
  if (!this.forceReplace) {
193
268
  try {
194
269
  const stat = await import("node:fs/promises").then((fs) => fs.stat(filePath));
195
270
  if (stat.isFile()) {
196
- if (this.verbose) {
197
- console.log(`Skipping already-downloaded image #${index}`);
198
- }
271
+ log.info(`Skipping existing image #${index}`);
272
+ log.trace(T.FileExists, { filePath, size: stat.size });
199
273
  this.skipped++;
200
274
  return "skip";
201
275
  }
202
276
  }
203
277
  catch {
204
- // File doesn't exist — proceed
278
+ log.trace(T.FileNotFound, { filePath });
205
279
  }
206
280
  }
207
- if (this.verbose) {
208
- console.log(`Downloading Image #${index} from ${link}`);
281
+ else {
282
+ log.trace(T.ForceReplace, { filePath });
209
283
  }
284
+ log.debug(`Downloading image #${index}`, { url: link });
210
285
  try {
211
286
  await this.saveImage(link, filePath);
212
- if (this.verbose) {
213
- console.log(`Downloaded File #${index}`);
214
- }
287
+ log.debug(`Downloaded image #${index}`);
215
288
  return "ok";
216
289
  }
217
290
  catch (e) {
218
291
  this.errors.push({ url: link, error: e });
219
- if (this.verbose) {
220
- console.error(`Issue getting image ${link}: ${e.message}`);
221
- }
292
+ log.warn(`Download failed for image #${index}`, {
293
+ url: link,
294
+ error: e.message,
295
+ });
222
296
  return "fail";
223
297
  }
224
298
  }
@@ -234,6 +308,14 @@ export class Bing {
234
308
  },
235
309
  signal: AbortSignal.timeout(this.timeout * 1000),
236
310
  });
311
+ log.trace(T.FetchResponse, {
312
+ url: link.substring(0, 120),
313
+ status: resp.status,
314
+ statusText: resp.statusText,
315
+ contentType: resp.headers.get("content-type"),
316
+ contentLength: resp.headers.get("content-length"),
317
+ contentDisposition: resp.headers.get("content-disposition"),
318
+ });
237
319
  if (!resp.ok) {
238
320
  throw new NetworkError(link, `HTTP ${resp.status} ${resp.statusText}`);
239
321
  }
@@ -241,30 +323,60 @@ export class Bing {
241
323
  catch (e) {
242
324
  if (e instanceof NetworkError)
243
325
  throw e;
326
+ log.trace(T.FetchError, {
327
+ url: link.substring(0, 120),
328
+ error: e.message,
329
+ errorType: e.constructor.name,
330
+ });
244
331
  throw new NetworkError(link, `fetch error: ${e.message}`);
245
332
  }
246
333
  const image = new Uint8Array(await resp.arrayBuffer());
247
334
  // Validate MIME type from Content-Type header
248
335
  const contentType = resp.headers.get("Content-Type") ?? "";
336
+ log.debug("Image fetched", {
337
+ url: link.substring(0, 100),
338
+ size: image.byteLength,
339
+ contentType,
340
+ status: resp.status,
341
+ });
249
342
  if (!contentType.startsWith("image/")) {
343
+ log.trace(T.InvalidContentType, {
344
+ url: link.substring(0, 120),
345
+ contentType,
346
+ });
250
347
  throw new InvalidImageError(link);
251
348
  }
252
349
  // MD5 dedup
253
350
  const fileHash = createHash("md5").update(image).digest("hex");
351
+ log.trace(T.ComputedMd5, { hash: fileHash, url: link.substring(0, 100) });
254
352
  if (this.fileHashes.has(fileHash)) {
353
+ log.debug("Duplicate image skipped (MD5)", { url: link.substring(0, 100) });
255
354
  throw new DuplicateImageError(link);
256
355
  }
257
356
  this.fileHashes.add(fileHash);
258
357
  // Determine extension from MIME, update filePath if needed
259
358
  const ext = MIME_TO_EXT[contentType.split(";")[0]] ?? "jpg";
260
359
  const finalPath = filePath.replace(/\.[^.]+$/, `.${ext}`);
360
+ log.trace(T.ResolvedExt, {
361
+ contentType,
362
+ ext,
363
+ requestedPath: filePath,
364
+ finalPath,
365
+ });
261
366
  // Atomic write: temp file → rename
262
367
  const tmpPath = join(tmpdir(), `.tmp_${basename(finalPath)}_${Date.now()}`);
368
+ log.trace(T.AtomicWrite, { tmpPath, finalPath, size: image.byteLength });
263
369
  try {
264
370
  await writeFile(tmpPath, image);
265
371
  await rename(tmpPath, finalPath);
372
+ log.debug("Image saved", { path: finalPath, size: image.byteLength });
266
373
  }
267
374
  catch (e) {
375
+ log.trace(T.WriteFailed, {
376
+ tmpPath,
377
+ finalPath,
378
+ error: e.message,
379
+ });
268
380
  // Clean up temp file on failure
269
381
  try {
270
382
  await import("node:fs/promises").then((fs) => fs.unlink(tmpPath));
@@ -275,7 +387,7 @@ export class Bing {
275
387
  throw new WriteError(link, `write failed: ${e.message}`);
276
388
  }
277
389
  // Record success
278
- this.images.push({
390
+ const result = {
279
391
  path: finalPath,
280
392
  sourceUrl: link,
281
393
  engine: "bing",
@@ -283,7 +395,9 @@ export class Bing {
283
395
  imageIndex: this.images.length + 1,
284
396
  sizeBytes: image.byteLength,
285
397
  mimeType: contentType.split(";")[0],
286
- });
398
+ };
399
+ log.trace(T.RecordedResult, result);
400
+ this.images.push(result);
287
401
  }
288
402
  // ─── Backoff helpers ──────────────────────────────────────────────
289
403
  consumeBackoff() {
package/dist/bing.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bing.js","sourceRoot":"","sources":["../src/bing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bing.js","sourceRoot":"","sources":["../src/bing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Centralized debug logger for the SDK.
3
+ *
4
+ * Off by default — consumers opt in:
5
+ * ```ts
6
+ * import { debug } from "@lglen/bing-image-search";
7
+ * debug.enable();
8
+ * // or: debug.setLevel("debug");
9
+ * ```
10
+ *
11
+ * For custom logging (e.g. Firebase / structured logging):
12
+ * ```ts
13
+ * import { debug } from "@lglen/bing-image-search";
14
+ * debug.enable();
15
+ * debug.setHandler((entry) => {
16
+ * console.log(JSON.stringify(entry));
17
+ * });
18
+ * ```
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+ /** Log severity levels. */
23
+ export type LogLevel = "off" | "error" | "warn" | "info" | "debug" | "trace";
24
+ /** Structured log entry passed to custom handlers. */
25
+ export interface LogEntry {
26
+ /** ISO-8601 timestamp. */
27
+ timestamp: string;
28
+ /** Severity level. */
29
+ level: LogLevel;
30
+ /** Module that produced the log (e.g. "bing", "bing-media"). */
31
+ module: string;
32
+ /** Human-readable message. */
33
+ message: string;
34
+ /** Optional structured data payload. */
35
+ data?: unknown;
36
+ }
37
+ /** Custom log handler — replace the default console output. */
38
+ export type LogHandler = (entry: LogEntry) => void;
39
+ /** Global debug configuration. */
40
+ export declare const debug: {
41
+ /**
42
+ * Enable debug logging at the given level (default "debug").
43
+ *
44
+ * Optionally pass per-message rate limits to cap noisy trace logs:
45
+ * ```ts
46
+ * debug.enable("trace", { parsed_card_json: 5, accepted_result: 20 });
47
+ * ```
48
+ */
49
+ enable(level?: LogLevel, rateLimits?: Record<string, number>): void;
50
+ /** Disable all debug logging. */
51
+ disable(): void;
52
+ /**
53
+ * Set the minimum log level, optionally with per-message rate limits.
54
+ * Same signature as `enable()` — keeps any existing limits if none are passed.
55
+ */
56
+ setLevel(level: LogLevel, rateLimits?: Record<string, number>): void;
57
+ /** Get the current log level. */
58
+ getLevel(): LogLevel;
59
+ /**
60
+ * Replace the default console-based handler with a custom one.
61
+ * Useful for integrating with Firebase Cloud Logging, pino, winston, etc.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * debug.setHandler((entry) => {
66
+ * functions.logger.log(entry.message, { ...entry });
67
+ * });
68
+ * ```
69
+ */
70
+ setHandler(handler: LogHandler): void;
71
+ /**
72
+ * Reset all per-message invocation counters.
73
+ * Useful between runs if you want fresh rate-limit tracking.
74
+ */
75
+ resetCounts(): void;
76
+ };
77
+ /** A logger scoped to a specific module. Created via `createLogger("modulename")`. */
78
+ export interface Logger {
79
+ trace(message: string, data?: unknown): void;
80
+ debug(message: string, data?: unknown): void;
81
+ info(message: string, data?: unknown): void;
82
+ warn(message: string, data?: unknown): void;
83
+ error(message: string, data?: unknown): void;
84
+ }
85
+ /**
86
+ * Create a logger scoped to a module name.
87
+ * Internal use only — modules call this once at the top of their file.
88
+ */
89
+ export declare function createLogger(module: string): Logger;
90
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,2BAA2B;AAC3B,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7E,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAwGnD,kCAAkC;AAClC,eAAO,MAAM,KAAK;IAChB;;;;;;;OAOG;mBACW,QAAQ,eAAyB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAY5E,iCAAiC;eACtB,IAAI;IAKf;;;OAGG;oBACa,QAAQ,eAAe,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAYpE,iCAAiC;gBACrB,QAAQ;IAIpB;;;;;;;;;;OAUG;wBACiB,UAAU,GAAG,IAAI;IAIrC;;;OAGG;mBACY,IAAI;CAIpB,CAAC;AAIF,sFAAsF;AACtF,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBnD"}
package/dist/debug.js ADDED
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Centralized debug logger for the SDK.
3
+ *
4
+ * Off by default — consumers opt in:
5
+ * ```ts
6
+ * import { debug } from "@lglen/bing-image-search";
7
+ * debug.enable();
8
+ * // or: debug.setLevel("debug");
9
+ * ```
10
+ *
11
+ * For custom logging (e.g. Firebase / structured logging):
12
+ * ```ts
13
+ * import { debug } from "@lglen/bing-image-search";
14
+ * debug.enable();
15
+ * debug.setHandler((entry) => {
16
+ * console.log(JSON.stringify(entry));
17
+ * });
18
+ * ```
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+ // ─── State ───────────────────────────────────────────────────────────
23
+ const LEVEL_RANK = {
24
+ off: 0,
25
+ error: 1,
26
+ warn: 2,
27
+ info: 3,
28
+ debug: 4,
29
+ trace: 5,
30
+ };
31
+ let currentLevel = "off";
32
+ let currentHandler = defaultHandler;
33
+ function defaultHandler(entry) {
34
+ const prefix = `[${entry.timestamp}] [${entry.module}]`;
35
+ switch (entry.level) {
36
+ case "error":
37
+ console.error(prefix, entry.message, entry.data ?? "");
38
+ break;
39
+ case "warn":
40
+ console.warn(prefix, entry.message, entry.data ?? "");
41
+ break;
42
+ case "info":
43
+ case "debug":
44
+ case "trace":
45
+ console.log(prefix, entry.message, entry.data ?? "");
46
+ break;
47
+ }
48
+ }
49
+ function shouldLog(level) {
50
+ return LEVEL_RANK[level] <= LEVEL_RANK[currentLevel];
51
+ }
52
+ function emit(level, module, message, data) {
53
+ if (!shouldLog(level))
54
+ return;
55
+ // Rate-limit: if a limit is configured for this message key, enforce it.
56
+ const limit = limits.get(message);
57
+ if (limit !== undefined) {
58
+ const count = (counterMap.get(message) ?? 0) + 1;
59
+ counterMap.set(message, count);
60
+ if (count > limit) {
61
+ // Over cap — track as a silent skip.
62
+ if (lastCappedKey !== message) {
63
+ flushSkipped();
64
+ lastCappedKey = message;
65
+ lastCappedModule = module;
66
+ }
67
+ skipCount++;
68
+ return;
69
+ }
70
+ }
71
+ // About to emit. If a different key was being silently skipped, flush the summary first.
72
+ if (lastCappedKey && lastCappedKey !== message) {
73
+ flushSkipped();
74
+ }
75
+ const entry = {
76
+ timestamp: new Date().toISOString(),
77
+ level,
78
+ module,
79
+ message,
80
+ data,
81
+ };
82
+ currentHandler(entry);
83
+ }
84
+ // ─── Skip tracking ───────────────────────────────────────────────────
85
+ // The message key currently being silently skipped (over cap), if any.
86
+ let lastCappedKey = null;
87
+ let lastCappedModule = "";
88
+ let skipCount = 0;
89
+ /** Print a summary of skipped calls for the last capped key, then reset. */
90
+ function flushSkipped() {
91
+ if (lastCappedKey && skipCount > 0) {
92
+ const entry = {
93
+ timestamp: new Date().toISOString(),
94
+ level: "info",
95
+ module: lastCappedModule,
96
+ message: lastCappedKey,
97
+ data: { skipped: skipCount },
98
+ };
99
+ currentHandler(entry);
100
+ lastCappedKey = null;
101
+ lastCappedModule = "";
102
+ skipCount = 0;
103
+ }
104
+ }
105
+ // Consumer-configured per-message limits (set via debug.enable(level, limits)).
106
+ const limits = new Map();
107
+ // Running invocation counts per message key.
108
+ const counterMap = new Map();
109
+ // ─── Public API (consumer-facing) ────────────────────────────────────
110
+ /** Global debug configuration. */
111
+ export const debug = {
112
+ /**
113
+ * Enable debug logging at the given level (default "debug").
114
+ *
115
+ * Optionally pass per-message rate limits to cap noisy trace logs:
116
+ * ```ts
117
+ * debug.enable("trace", { parsed_card_json: 5, accepted_result: 20 });
118
+ * ```
119
+ */
120
+ enable(level = "debug", rateLimits) {
121
+ currentLevel = level;
122
+ if (rateLimits) {
123
+ flushSkipped();
124
+ counterMap.clear();
125
+ limits.clear();
126
+ for (const [key, n] of Object.entries(rateLimits)) {
127
+ if (n > 0)
128
+ limits.set(key, n);
129
+ }
130
+ }
131
+ },
132
+ /** Disable all debug logging. */
133
+ disable() {
134
+ flushSkipped();
135
+ currentLevel = "off";
136
+ },
137
+ /**
138
+ * Set the minimum log level, optionally with per-message rate limits.
139
+ * Same signature as `enable()` — keeps any existing limits if none are passed.
140
+ */
141
+ setLevel(level, rateLimits) {
142
+ currentLevel = level;
143
+ if (rateLimits) {
144
+ flushSkipped();
145
+ counterMap.clear();
146
+ limits.clear();
147
+ for (const [key, n] of Object.entries(rateLimits)) {
148
+ if (n > 0)
149
+ limits.set(key, n);
150
+ }
151
+ }
152
+ },
153
+ /** Get the current log level. */
154
+ getLevel() {
155
+ return currentLevel;
156
+ },
157
+ /**
158
+ * Replace the default console-based handler with a custom one.
159
+ * Useful for integrating with Firebase Cloud Logging, pino, winston, etc.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * debug.setHandler((entry) => {
164
+ * functions.logger.log(entry.message, { ...entry });
165
+ * });
166
+ * ```
167
+ */
168
+ setHandler(handler) {
169
+ currentHandler = handler;
170
+ },
171
+ /**
172
+ * Reset all per-message invocation counters.
173
+ * Useful between runs if you want fresh rate-limit tracking.
174
+ */
175
+ resetCounts() {
176
+ flushSkipped();
177
+ counterMap.clear();
178
+ },
179
+ };
180
+ /**
181
+ * Create a logger scoped to a module name.
182
+ * Internal use only — modules call this once at the top of their file.
183
+ */
184
+ export function createLogger(module) {
185
+ return {
186
+ trace(message, data) {
187
+ emit("trace", module, message, data);
188
+ },
189
+ debug(message, data) {
190
+ emit("debug", module, message, data);
191
+ },
192
+ info(message, data) {
193
+ emit("info", module, message, data);
194
+ },
195
+ warn(message, data) {
196
+ emit("warn", module, message, data);
197
+ },
198
+ error(message, data) {
199
+ emit("error", module, message, data);
200
+ },
201
+ };
202
+ }
203
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -24,6 +24,10 @@
24
24
  * @packageDocumentation
25
25
  */
26
26
  export type { ImageResult, Result } from "./types.js";
27
+ export { debug } from "./debug.js";
28
+ export type { LogLevel, LogEntry, LogHandler } from "./debug.js";
29
+ export { TraceEvents } from "./trace-events.js";
30
+ export type { TraceEventId } from "./trace-events.js";
27
31
  export { ImageSaveError, NetworkError, InvalidImageError, DuplicateImageError, WriteError, } from "./errors.js";
28
32
  export { Bing } from "./bing.js";
29
33
  export type { BingOptions } from "./bing.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAItD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,GACX,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAItD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,GACX,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAI7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -23,6 +23,9 @@
23
23
  *
24
24
  * @packageDocumentation
25
25
  */
26
+ // ─── Debugging (off by default — opt in with debug.enable()) ─────────
27
+ export { debug } from "./debug.js";
28
+ export { TraceEvents } from "./trace-events.js";
26
29
  // ─── Error hierarchy ─────────────────────────────────────────────────
27
30
  export { ImageSaveError, NetworkError, InvalidImageError, DuplicateImageError, WriteError, } from "./errors.js";
28
31
  // ─── Bing: image download engine ─────────────────────────────────────
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,wEAAwE;AAExE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,wEAAwE;AAExE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,wEAAwE;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,wEAAwE;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,wEAAwE;AAExE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,wEAAwE;AAExE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,wEAAwE;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Standardized trace-log event identifiers.
3
+ *
4
+ * Every rate-limitable `log.trace(...)` call in the SDK uses one of these
5
+ * instead of a raw string. Consumers reference the same object when
6
+ * configuring limits:
7
+ *
8
+ * ```ts
9
+ * import { TraceEvents } from "@lglen/bing-image-search";
10
+ * debug.enable("trace", {
11
+ * [TraceEvents.BingMedia.ParsedCardJson]: 5,
12
+ * [TraceEvents.Bing.AcceptedResult]: 20,
13
+ * });
14
+ * ```
15
+ *
16
+ * Non-trace logs (debug / info / warn / error) use free-form messages
17
+ * and are **not** rate-limited — only trace-level events use these IDs.
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+ export declare const TraceEvents: {
22
+ readonly BingMedia: {
23
+ /** Emitted for every JSON image card parsed from Bing's HTML. High volume — cap aggressively. */
24
+ readonly ParsedCardJson: "parsed_card_json";
25
+ /** A card's JSON failed to parse. Usually rare unless Bing changes markup. */
26
+ readonly SkippedMalformedCard: "skipped_malformed_card";
27
+ /** Card skipped because its thumbnail URL was already seen. */
28
+ readonly DedupedThumbnail: "deduped_thumbnail";
29
+ /** Card skipped because its source URL was already seen. */
30
+ readonly DedupedSource: "deduped_source";
31
+ /** Card accepted into the final result set. */
32
+ readonly AcceptedResult: "accepted_result";
33
+ };
34
+ readonly Bing: {
35
+ /** Link filtered — already crawled in this run. */
36
+ readonly FilteredSeen: "filtered_seen";
37
+ /** Link filtered — matched a badsites entry. */
38
+ readonly FilteredBadsite: "filtered_badsite";
39
+ /** URL path extension not recognized — falling back to .jpg. */
40
+ readonly ExtFallback: "ext_fallback";
41
+ /** Derived output file path for an image being downloaded. */
42
+ readonly TargetFilePath: "target_file_path";
43
+ /** Resume: file already exists on disk, skipping. */
44
+ readonly FileExists: "file_exists";
45
+ /** Resume: file not on disk, will download. */
46
+ readonly FileNotFound: "file_not_found";
47
+ /** forceReplace is enabled — will overwrite. */
48
+ readonly ForceReplace: "force_replace";
49
+ /** HTTP response metadata from the image source host. */
50
+ readonly FetchResponse: "fetch_response";
51
+ /** Fetch threw an error that is NOT a NetworkError. */
52
+ readonly FetchError: "fetch_error";
53
+ /** Content-Type header was not image/*. */
54
+ readonly InvalidContentType: "invalid_content_type";
55
+ /** MD5 hash computed for a downloaded image. */
56
+ readonly ComputedMd5: "computed_md5";
57
+ /** MIME type → file extension resolution result. */
58
+ readonly ResolvedExt: "resolved_ext";
59
+ /** Temp-write + rename details (atomic write). */
60
+ readonly AtomicWrite: "atomic_write";
61
+ /** Write or rename failed (before error is thrown). */
62
+ readonly WriteFailed: "write_failed";
63
+ /** ImageResult pushed onto bing.images[]. */
64
+ readonly RecordedResult: "recorded_result";
65
+ };
66
+ };
67
+ /** Union of every trace event ID string. */
68
+ export type TraceEventId = (typeof TraceEvents.BingMedia)[keyof typeof TraceEvents.BingMedia] | (typeof TraceEvents.Bing)[keyof typeof TraceEvents.Bing];
69
+ //# sourceMappingURL=trace-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-events.d.ts","sourceRoot":"","sources":["../src/trace-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,eAAO,MAAM,WAAW;;QAIpB,iGAAiG;;QAEjG,8EAA8E;;QAE9E,+DAA+D;;QAE/D,4DAA4D;;QAE5D,+CAA+C;;;;QAO/C,mDAAmD;;QAEnD,gDAAgD;;QAEhD,gEAAgE;;QAEhE,8DAA8D;;QAE9D,qDAAqD;;QAErD,+CAA+C;;QAE/C,gDAAgD;;QAEhD,yDAAyD;;QAEzD,uDAAuD;;QAEvD,2CAA2C;;QAE3C,gDAAgD;;QAEhD,oDAAoD;;QAEpD,kDAAkD;;QAElD,uDAAuD;;QAEvD,6CAA6C;;;CAGvC,CAAC;AAEX,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GACpB,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,SAAS,CAAC,GAClE,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Standardized trace-log event identifiers.
3
+ *
4
+ * Every rate-limitable `log.trace(...)` call in the SDK uses one of these
5
+ * instead of a raw string. Consumers reference the same object when
6
+ * configuring limits:
7
+ *
8
+ * ```ts
9
+ * import { TraceEvents } from "@lglen/bing-image-search";
10
+ * debug.enable("trace", {
11
+ * [TraceEvents.BingMedia.ParsedCardJson]: 5,
12
+ * [TraceEvents.Bing.AcceptedResult]: 20,
13
+ * });
14
+ * ```
15
+ *
16
+ * Non-trace logs (debug / info / warn / error) use free-form messages
17
+ * and are **not** rate-limited — only trace-level events use these IDs.
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+ export const TraceEvents = {
22
+ // ─── bing-media.ts ────────────────────────────────────────────────
23
+ BingMedia: {
24
+ /** Emitted for every JSON image card parsed from Bing's HTML. High volume — cap aggressively. */
25
+ ParsedCardJson: "parsed_card_json",
26
+ /** A card's JSON failed to parse. Usually rare unless Bing changes markup. */
27
+ SkippedMalformedCard: "skipped_malformed_card",
28
+ /** Card skipped because its thumbnail URL was already seen. */
29
+ DedupedThumbnail: "deduped_thumbnail",
30
+ /** Card skipped because its source URL was already seen. */
31
+ DedupedSource: "deduped_source",
32
+ /** Card accepted into the final result set. */
33
+ AcceptedResult: "accepted_result",
34
+ },
35
+ // ─── bing.ts (download engine) ────────────────────────────────────
36
+ Bing: {
37
+ /** Link filtered — already crawled in this run. */
38
+ FilteredSeen: "filtered_seen",
39
+ /** Link filtered — matched a badsites entry. */
40
+ FilteredBadsite: "filtered_badsite",
41
+ /** URL path extension not recognized — falling back to .jpg. */
42
+ ExtFallback: "ext_fallback",
43
+ /** Derived output file path for an image being downloaded. */
44
+ TargetFilePath: "target_file_path",
45
+ /** Resume: file already exists on disk, skipping. */
46
+ FileExists: "file_exists",
47
+ /** Resume: file not on disk, will download. */
48
+ FileNotFound: "file_not_found",
49
+ /** forceReplace is enabled — will overwrite. */
50
+ ForceReplace: "force_replace",
51
+ /** HTTP response metadata from the image source host. */
52
+ FetchResponse: "fetch_response",
53
+ /** Fetch threw an error that is NOT a NetworkError. */
54
+ FetchError: "fetch_error",
55
+ /** Content-Type header was not image/*. */
56
+ InvalidContentType: "invalid_content_type",
57
+ /** MD5 hash computed for a downloaded image. */
58
+ ComputedMd5: "computed_md5",
59
+ /** MIME type → file extension resolution result. */
60
+ ResolvedExt: "resolved_ext",
61
+ /** Temp-write + rename details (atomic write). */
62
+ AtomicWrite: "atomic_write",
63
+ /** Write or rename failed (before error is thrown). */
64
+ WriteFailed: "write_failed",
65
+ /** ImageResult pushed onto bing.images[]. */
66
+ RecordedResult: "recorded_result",
67
+ },
68
+ };
69
+ //# sourceMappingURL=trace-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-events.js","sourceRoot":"","sources":["../src/trace-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qEAAqE;IAErE,SAAS,EAAE;QACT,iGAAiG;QACjG,cAAc,EAAE,kBAAkB;QAClC,8EAA8E;QAC9E,oBAAoB,EAAE,wBAAwB;QAC9C,+DAA+D;QAC/D,gBAAgB,EAAE,mBAAmB;QACrC,4DAA4D;QAC5D,aAAa,EAAE,gBAAgB;QAC/B,+CAA+C;QAC/C,cAAc,EAAE,iBAAiB;KAClC;IAED,qEAAqE;IAErE,IAAI,EAAE;QACJ,mDAAmD;QACnD,YAAY,EAAE,eAAe;QAC7B,gDAAgD;QAChD,eAAe,EAAE,kBAAkB;QACnC,gEAAgE;QAChE,WAAW,EAAE,cAAc;QAC3B,8DAA8D;QAC9D,cAAc,EAAE,kBAAkB;QAClC,qDAAqD;QACrD,UAAU,EAAE,aAAa;QACzB,+CAA+C;QAC/C,YAAY,EAAE,gBAAgB;QAC9B,gDAAgD;QAChD,YAAY,EAAE,eAAe;QAC7B,yDAAyD;QACzD,aAAa,EAAE,gBAAgB;QAC/B,uDAAuD;QACvD,UAAU,EAAE,aAAa;QACzB,2CAA2C;QAC3C,kBAAkB,EAAE,sBAAsB;QAC1C,gDAAgD;QAChD,WAAW,EAAE,cAAc;QAC3B,oDAAoD;QACpD,WAAW,EAAE,cAAc;QAC3B,kDAAkD;QAClD,WAAW,EAAE,cAAc;QAC3B,uDAAuD;QACvD,WAAW,EAAE,cAAc;QAC3B,6CAA6C;QAC7C,cAAc,EAAE,iBAAiB;KAClC;CACO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lglen/bing-image-search",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "TypeScript SDK for searching and downloading images from Bing. Returns Bing-hosted thumbnail URLs (safe for <img> tags) and supports batch image downloads with deduplication.",
5
5
  "type": "module",
6
6
  "license": "MIT",