@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 +1 -2
- package/README.md +40 -4
- package/dist/bing-media.d.ts +2 -0
- package/dist/bing-media.d.ts.map +1 -1
- package/dist/bing-media.js +80 -9
- package/dist/bing-media.js.map +1 -1
- package/dist/bing.d.ts.map +1 -1
- package/dist/bing.js +149 -35
- package/dist/bing.js.map +1 -1
- package/dist/debug.d.ts +90 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +203 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/trace-events.d.ts +69 -0
- package/dist/trace-events.d.ts.map +1 -0
- package/dist/trace-events.js +69 -0
- package/dist/trace-events.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -24,10 +24,16 @@ const results = await searchBingImages({
|
|
|
24
24
|
mkt: "en-US", // default
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
package/dist/bing-media.d.ts
CHANGED
|
@@ -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). */
|
package/dist/bing-media.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bing-media.d.ts","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
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"}
|
package/dist/bing-media.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 " for quotes (HTML-encoded).
|
|
93
141
|
const cardRe = /m="\{"[^}]*\}"/g;
|
|
94
|
-
|
|
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":"(.*?)"/g)].map((m) => m[1]);
|
|
123
185
|
const turls = [...html.matchAll(/turl":"(.*?)"/g)]
|
|
124
186
|
.map((m) => m[1])
|
|
125
187
|
.filter(Boolean);
|
|
126
|
-
|
|
188
|
+
const purls = [...html.matchAll(/purl":"(.*?)"/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
|
}
|
package/dist/bing-media.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bing-media.js","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAM,OAAO,GAA2B;IACtC,YAAY,EACV,iHAAiH;IACnH,MAAM,EACJ,uFAAuF;IACzF,iBAAiB,EAAE,gBAAgB;IACnC,OAAO,EAAE,uBAAuB;CACjC,CAAC;
|
|
1
|
+
{"version":3,"file":"bing-media.js","sourceRoot":"","sources":["../src/bing-media.ts"],"names":[],"mappings":"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"}
|
package/dist/bing.d.ts.map
CHANGED
|
@@ -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;
|
|
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 ??
|
|
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
|
-
|
|
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
|
-
|
|
122
|
+
log.trace("Gunzip failed — treating as already decompressed", { page });
|
|
102
123
|
}
|
|
103
124
|
}
|
|
104
|
-
|
|
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":"(.*?)"/g;
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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
|
-
|
|
197
|
-
|
|
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
|
-
|
|
278
|
+
log.trace(T.FileNotFound, { filePath });
|
|
205
279
|
}
|
|
206
280
|
}
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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
|
-
|
|
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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"}
|
package/dist/debug.d.ts
ADDED
|
@@ -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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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.
|
|
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",
|