Mohammad Shahid commited on
Commit
f316cce
·
1 Parent(s): 5ce5ea7

Include pre-built files for HF deployment

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +1 -1
  2. build/api/crawler.js +1170 -0
  3. build/api/crawler.js.map +1 -0
  4. build/api/searcher.js +771 -0
  5. build/api/searcher.js.map +1 -0
  6. build/api/serp.js +513 -0
  7. build/api/serp.js.map +1 -0
  8. build/cloud-functions/adaptive-crawler.js +510 -0
  9. build/cloud-functions/adaptive-crawler.js.map +1 -0
  10. build/cloud-functions/data-crunching.js +260 -0
  11. build/cloud-functions/data-crunching.js.map +1 -0
  12. build/db/adaptive-crawl-task.js +93 -0
  13. build/db/adaptive-crawl-task.js.map +1 -0
  14. build/db/crawled.js +86 -0
  15. build/db/crawled.js.map +1 -0
  16. build/db/domain-blockade.js +46 -0
  17. build/db/domain-blockade.js.map +1 -0
  18. build/db/domain-profile.js +47 -0
  19. build/db/domain-profile.js.map +1 -0
  20. build/db/img-alt.js +60 -0
  21. build/db/img-alt.js.map +1 -0
  22. build/db/pdf.js +78 -0
  23. build/db/pdf.js.map +1 -0
  24. build/db/searched.js +79 -0
  25. build/db/searched.js.map +1 -0
  26. build/dto/adaptive-crawler-options.js +70 -0
  27. build/dto/adaptive-crawler-options.js.map +1 -0
  28. build/dto/crawler-options.js +753 -0
  29. build/dto/crawler-options.js.map +1 -0
  30. build/dto/jina-embeddings-auth.js +237 -0
  31. build/dto/jina-embeddings-auth.js.map +1 -0
  32. build/dto/turndown-tweakable-options.js +81 -0
  33. build/dto/turndown-tweakable-options.js.map +1 -0
  34. build/lib/transform-server-event-stream.js +151 -0
  35. build/lib/transform-server-event-stream.js.map +1 -0
  36. build/services/alt-text.js +131 -0
  37. build/services/alt-text.js.map +1 -0
  38. build/services/async-context.js +21 -0
  39. build/services/async-context.js.map +1 -0
  40. build/services/blackhole-detector.js +80 -0
  41. build/services/blackhole-detector.js.map +1 -0
  42. build/services/brave-search.js +186 -0
  43. build/services/brave-search.js.map +1 -0
  44. build/services/canvas.js +183 -0
  45. build/services/canvas.js.map +1 -0
  46. build/services/cf-browser-rendering.js +58 -0
  47. build/services/cf-browser-rendering.js.map +1 -0
  48. build/services/curl.js +431 -0
  49. build/services/curl.js.map +1 -0
  50. build/services/errors.js +101 -0
.gitignore CHANGED
@@ -69,7 +69,7 @@ node_modules/
69
  toy*.ts
70
 
71
  .DS_Store
72
- build/
73
  .firebase-emu/
74
  *.log
75
  .DS_Store
 
69
  toy*.ts
70
 
71
  .DS_Store
72
+ # build/ # Commented out for HF deployment - need pre-built files
73
  .firebase-emu/
74
  *.log
75
  .DS_Store
build/api/crawler.js ADDED
@@ -0,0 +1,1170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var _a, _b, _c, _d, _e, _f;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.CrawlerHost = void 0;
20
+ const tsyringe_1 = require("tsyringe");
21
+ const url_1 = require("url");
22
+ const crypto_1 = require("crypto");
23
+ const lodash_1 = __importDefault(require("lodash"));
24
+ const civ_rpc_1 = require("civkit/civ-rpc");
25
+ const lang_1 = require("civkit/lang");
26
+ const defer_1 = require("civkit/defer");
27
+ const decorators_1 = require("civkit/decorators");
28
+ const fancy_file_1 = require("civkit/fancy-file");
29
+ const crawler_options_1 = require("../dto/crawler-options");
30
+ const crawled_1 = require("../db/crawled");
31
+ const domain_blockade_1 = require("../db/domain-blockade");
32
+ const transform_server_event_stream_1 = require("../lib/transform-server-event-stream");
33
+ const puppeteer_1 = require("../services/puppeteer");
34
+ const jsdom_1 = require("../services/jsdom");
35
+ const snapshot_formatter_1 = require("../services/snapshot-formatter");
36
+ const curl_1 = require("../services/curl");
37
+ const lm_1 = require("../services/lm");
38
+ const misc_1 = require("../utils/misc");
39
+ const cf_browser_rendering_1 = require("../services/cf-browser-rendering");
40
+ const logger_1 = require("../services/logger");
41
+ const rate_limit_1 = require("../shared/services/rate-limit");
42
+ const async_context_1 = require("../services/async-context");
43
+ const registry_1 = require("../services/registry");
44
+ const errors_1 = require("../services/errors");
45
+ const openai_1 = require("../shared/utils/openai");
46
+ const proxy_provider_1 = require("../shared/services/proxy-provider");
47
+ const firebase_storage_bucket_1 = require("../shared/services/firebase-storage-bucket");
48
+ const jina_embeddings_auth_1 = require("../dto/jina-embeddings-auth");
49
+ const robots_text_1 = require("../services/robots-text");
50
+ const temp_file_1 = require("../services/temp-file");
51
+ const misc_2 = require("../services/misc");
52
+ const http_1 = require("civkit/http");
53
+ const geoip_1 = require("../services/geoip");
54
+ const indexProto = {
55
+ toString: function () {
56
+ return (0, lodash_1.default)(this)
57
+ .toPairs()
58
+ .map(([k, v]) => k ? `[${lodash_1.default.upperFirst(lodash_1.default.lowerCase(k))}] ${v}` : '')
59
+ .value()
60
+ .join('\n') + '\n';
61
+ }
62
+ };
63
+ let CrawlerHost = class CrawlerHost extends civ_rpc_1.RPCHost {
64
+ constructor(globalLogger, puppeteerControl, curlControl, cfBrowserRendering, proxyProvider, lmControl, jsdomControl, snapshotFormatter, firebaseObjectStorage, rateLimitControl, threadLocal, robotsTxtService, tempFileManager, geoIpService, miscService) {
65
+ super(...arguments);
66
+ this.globalLogger = globalLogger;
67
+ this.puppeteerControl = puppeteerControl;
68
+ this.curlControl = curlControl;
69
+ this.cfBrowserRendering = cfBrowserRendering;
70
+ this.proxyProvider = proxyProvider;
71
+ this.lmControl = lmControl;
72
+ this.jsdomControl = jsdomControl;
73
+ this.snapshotFormatter = snapshotFormatter;
74
+ this.firebaseObjectStorage = firebaseObjectStorage;
75
+ this.rateLimitControl = rateLimitControl;
76
+ this.threadLocal = threadLocal;
77
+ this.robotsTxtService = robotsTxtService;
78
+ this.tempFileManager = tempFileManager;
79
+ this.geoIpService = geoIpService;
80
+ this.miscService = miscService;
81
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
82
+ this.cacheRetentionMs = 1000 * 3600 * 24 * 7;
83
+ this.cacheValidMs = 1000 * 3600;
84
+ this.urlValidMs = 1000 * 3600 * 4;
85
+ this.abuseBlockMs = 1000 * 3600;
86
+ this.domainProfileRetentionMs = 1000 * 3600 * 24 * 30;
87
+ this.batchedCaches = [];
88
+ this.proxyIterMap = new WeakMap();
89
+ puppeteerControl.on('crawled', async (snapshot, options) => {
90
+ if (!snapshot.title?.trim() && !snapshot.pdfs?.length) {
91
+ return;
92
+ }
93
+ if (options.cookies?.length || options.private) {
94
+ // Potential privacy issue, dont cache if cookies are used
95
+ return;
96
+ }
97
+ if (options.injectFrameScripts?.length || options.injectPageScripts?.length || options.viewport) {
98
+ // Potentially mangeled content, dont cache if scripts are injected
99
+ return;
100
+ }
101
+ if (snapshot.isIntermediate) {
102
+ return;
103
+ }
104
+ if (!snapshot.lastMutationIdle) {
105
+ // Never reached mutationIdle, presumably too short timeout
106
+ return;
107
+ }
108
+ if (options.locale) {
109
+ Reflect.set(snapshot, 'locale', options.locale);
110
+ }
111
+ const analyzed = await this.jsdomControl.analyzeHTMLTextLite(snapshot.html);
112
+ if (analyzed.tokens < 200) {
113
+ // Does not contain enough content
114
+ if (snapshot.status !== 200) {
115
+ return;
116
+ }
117
+ if (snapshot.html.includes('captcha') || snapshot.html.includes('cf-turnstile')) {
118
+ return;
119
+ }
120
+ }
121
+ await this.setToCache(options.url, snapshot);
122
+ });
123
+ puppeteerControl.on('abuse', async (abuseEvent) => {
124
+ this.logger.warn(`Abuse detected on ${abuseEvent.url}, blocking ${abuseEvent.url.hostname}`, { reason: abuseEvent.reason, sn: abuseEvent.sn });
125
+ await domain_blockade_1.DomainBlockade.save(domain_blockade_1.DomainBlockade.from({
126
+ domain: abuseEvent.url.hostname.toLowerCase(),
127
+ triggerReason: `${abuseEvent.reason}`,
128
+ triggerUrl: abuseEvent.url.toString(),
129
+ createdAt: new Date(),
130
+ expireAt: new Date(Date.now() + this.abuseBlockMs),
131
+ })).catch((err) => {
132
+ this.logger.warn(`Failed to save domain blockade for ${abuseEvent.url.hostname}`, { err: (0, lang_1.marshalErrorLike)(err) });
133
+ });
134
+ });
135
+ setInterval(() => {
136
+ const thisBatch = this.batchedCaches;
137
+ this.batchedCaches = [];
138
+ if (!thisBatch.length) {
139
+ return;
140
+ }
141
+ const batch = crawled_1.Crawled.DB.batch();
142
+ for (const x of thisBatch) {
143
+ batch.set(crawled_1.Crawled.COLLECTION.doc(x._id), x.degradeForFireStore(), { merge: true });
144
+ }
145
+ batch.commit()
146
+ .then(() => {
147
+ this.logger.debug(`Saved ${thisBatch.length} caches by batch`);
148
+ })
149
+ .catch((err) => {
150
+ this.logger.warn(`Failed to save cache in batch`, { err });
151
+ });
152
+ }, 1000 * 10 + Math.round(1000 * Math.random())).unref();
153
+ }
154
+ async init() {
155
+ await this.dependencyReady();
156
+ if (this.puppeteerControl.effectiveUA) {
157
+ this.curlControl.impersonateChrome(this.puppeteerControl.effectiveUA);
158
+ }
159
+ this.emit('ready');
160
+ }
161
+ async getIndex(auth) {
162
+ const indexObject = Object.create(indexProto);
163
+ Object.assign(indexObject, {
164
+ usage1: 'https://r.jina.ai/YOUR_URL',
165
+ usage2: 'https://s.jina.ai/YOUR_SEARCH_QUERY',
166
+ homepage: 'https://jina.ai/reader',
167
+ });
168
+ await auth?.solveUID();
169
+ if (auth && auth.user) {
170
+ indexObject[''] = undefined;
171
+ indexObject.authenticatedAs = `${auth.user.user_id} (${auth.user.full_name})`;
172
+ indexObject.balanceLeft = auth.user.wallet.total_balance;
173
+ }
174
+ return indexObject;
175
+ }
176
+ async getIndexCtrl(ctx, auth) {
177
+ const indexObject = await this.getIndex(auth);
178
+ if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) {
179
+ return indexObject;
180
+ }
181
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${indexObject}`, { contentType: 'text/plain; charset=utf-8', envelope: null });
182
+ }
183
+ async crawl(rpcReflect, ctx, auth, crawlerOptionsHeaderOnly, crawlerOptionsParamsAllowed) {
184
+ const uid = await auth.solveUID();
185
+ let chargeAmount = 0;
186
+ const crawlerOptions = ctx.method === 'GET' ? crawlerOptionsHeaderOnly : crawlerOptionsParamsAllowed;
187
+ const tierPolicy = await this.saasAssertTierPolicy(crawlerOptions, auth);
188
+ // Use koa ctx.URL, a standard URL object to avoid node.js framework prop naming confusion
189
+ const targetUrl = await this.getTargetUrl((0, misc_1.tryDecodeURIComponent)(`${ctx.URL.pathname}${ctx.URL.search}`), crawlerOptions);
190
+ if (!targetUrl) {
191
+ return await this.getIndex(auth);
192
+ }
193
+ // Prevent circular crawling
194
+ this.puppeteerControl.circuitBreakerHosts.add(ctx.hostname.toLowerCase());
195
+ if (uid) {
196
+ const user = await auth.assertUser();
197
+ if (!(user.wallet.total_balance > 0)) {
198
+ throw new errors_1.InsufficientBalanceError(`Account balance not enough to run this query, please recharge.`);
199
+ }
200
+ const rateLimitPolicy = auth.getRateLimits('CRAWL') || [
201
+ parseInt(user.metadata?.speed_level) >= 2 ?
202
+ rate_limit_1.RateLimitDesc.from({
203
+ occurrence: 5000,
204
+ periodSeconds: 60
205
+ }) :
206
+ rate_limit_1.RateLimitDesc.from({
207
+ occurrence: 500,
208
+ periodSeconds: 60
209
+ })
210
+ ];
211
+ const apiRoll = await this.rateLimitControl.simpleRPCUidBasedLimit(rpcReflect, uid, ['CRAWL'], ...rateLimitPolicy);
212
+ rpcReflect.finally(() => {
213
+ if (crawlerOptions.tokenBudget && chargeAmount > crawlerOptions.tokenBudget) {
214
+ return;
215
+ }
216
+ if (chargeAmount) {
217
+ auth.reportUsage(chargeAmount, `reader-crawl`).catch((err) => {
218
+ this.logger.warn(`Unable to report usage for ${uid}`, { err: (0, lang_1.marshalErrorLike)(err) });
219
+ });
220
+ apiRoll.chargeAmount = chargeAmount;
221
+ }
222
+ });
223
+ }
224
+ else if (ctx.ip) {
225
+ const apiRoll = await this.rateLimitControl.simpleRpcIPBasedLimit(rpcReflect, ctx.ip, ['CRAWL'], [
226
+ // 20 requests per minute
227
+ new Date(Date.now() - 60 * 1000), 20
228
+ ]);
229
+ rpcReflect.finally(() => {
230
+ if (crawlerOptions.tokenBudget && chargeAmount > crawlerOptions.tokenBudget) {
231
+ return;
232
+ }
233
+ apiRoll.chargeAmount = chargeAmount;
234
+ });
235
+ }
236
+ if (!uid) {
237
+ // Enforce no proxy is allocated for anonymous users due to abuse.
238
+ crawlerOptions.proxy = 'none';
239
+ const blockade = (await domain_blockade_1.DomainBlockade.fromFirestoreQuery(domain_blockade_1.DomainBlockade.COLLECTION
240
+ .where('domain', '==', targetUrl.hostname.toLowerCase())
241
+ .where('expireAt', '>=', new Date())
242
+ .limit(1)))[0];
243
+ if (blockade) {
244
+ throw new errors_1.SecurityCompromiseError(`Domain ${targetUrl.hostname} blocked until ${blockade.expireAt || 'Eternally'} due to previous abuse found on ${blockade.triggerUrl || 'site'}: ${blockade.triggerReason}`);
245
+ }
246
+ }
247
+ const crawlOpts = await this.configure(crawlerOptions);
248
+ this.logger.info(`Accepting request from ${uid || ctx.ip}`, { opts: crawlerOptions });
249
+ if (crawlerOptions.robotsTxt) {
250
+ await this.robotsTxtService.assertAccessAllowed(targetUrl, crawlerOptions.robotsTxt);
251
+ }
252
+ if (rpcReflect.signal.aborted) {
253
+ return;
254
+ }
255
+ if (!ctx.accepts('text/plain') && ctx.accepts('text/event-stream')) {
256
+ const sseStream = new transform_server_event_stream_1.OutputServerEventStream();
257
+ rpcReflect.return(sseStream);
258
+ try {
259
+ for await (const scrapped of this.iterSnapshots(targetUrl, crawlOpts, crawlerOptions)) {
260
+ if (!scrapped) {
261
+ continue;
262
+ }
263
+ if (rpcReflect.signal.aborted) {
264
+ break;
265
+ }
266
+ const formatted = await this.formatSnapshot(crawlerOptions, scrapped, targetUrl, this.urlValidMs, crawlOpts);
267
+ chargeAmount = this.assignChargeAmount(formatted, tierPolicy);
268
+ sseStream.write({
269
+ event: 'data',
270
+ data: formatted,
271
+ });
272
+ if (chargeAmount && scrapped.pdfs?.length) {
273
+ break;
274
+ }
275
+ }
276
+ }
277
+ catch (err) {
278
+ this.logger.error(`Failed to crawl ${targetUrl}`, { err: (0, lang_1.marshalErrorLike)(err) });
279
+ sseStream.write({
280
+ event: 'error',
281
+ data: (0, lang_1.marshalErrorLike)(err),
282
+ });
283
+ }
284
+ sseStream.end();
285
+ return sseStream;
286
+ }
287
+ let lastScrapped;
288
+ if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) {
289
+ try {
290
+ for await (const scrapped of this.iterSnapshots(targetUrl, crawlOpts, crawlerOptions)) {
291
+ lastScrapped = scrapped;
292
+ if (rpcReflect.signal.aborted) {
293
+ break;
294
+ }
295
+ if (!scrapped || !crawlerOptions.isSnapshotAcceptableForEarlyResponse(scrapped)) {
296
+ continue;
297
+ }
298
+ if (!scrapped.title) {
299
+ continue;
300
+ }
301
+ const formatted = await this.formatSnapshot(crawlerOptions, scrapped, targetUrl, this.urlValidMs, crawlOpts);
302
+ chargeAmount = this.assignChargeAmount(formatted, tierPolicy);
303
+ if (scrapped?.pdfs?.length && !chargeAmount) {
304
+ continue;
305
+ }
306
+ return formatted;
307
+ }
308
+ }
309
+ catch (err) {
310
+ if (!lastScrapped) {
311
+ throw err;
312
+ }
313
+ }
314
+ if (!lastScrapped) {
315
+ if (crawlOpts.targetSelector) {
316
+ throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl} with target selector ${Array.isArray(crawlOpts.targetSelector) ? crawlOpts.targetSelector.join(', ') : crawlOpts.targetSelector}`);
317
+ }
318
+ throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl}`);
319
+ }
320
+ const formatted = await this.formatSnapshot(crawlerOptions, lastScrapped, targetUrl, this.urlValidMs, crawlOpts);
321
+ chargeAmount = this.assignChargeAmount(formatted, tierPolicy);
322
+ return formatted;
323
+ }
324
+ if (crawlerOptions.isRequestingCompoundContentFormat()) {
325
+ throw new civ_rpc_1.ParamValidationError({
326
+ path: 'respondWith',
327
+ message: `You are requesting compound content format, please explicitly accept 'text/event-stream' or 'application/json' in header.`
328
+ });
329
+ }
330
+ try {
331
+ for await (const scrapped of this.iterSnapshots(targetUrl, crawlOpts, crawlerOptions)) {
332
+ lastScrapped = scrapped;
333
+ if (rpcReflect.signal.aborted) {
334
+ break;
335
+ }
336
+ if (!scrapped || !crawlerOptions.isSnapshotAcceptableForEarlyResponse(scrapped)) {
337
+ continue;
338
+ }
339
+ if (!scrapped.title) {
340
+ continue;
341
+ }
342
+ const formatted = await this.formatSnapshot(crawlerOptions, scrapped, targetUrl, this.urlValidMs, crawlOpts);
343
+ chargeAmount = this.assignChargeAmount(formatted, tierPolicy);
344
+ if (crawlerOptions.respondWith === 'screenshot' && Reflect.get(formatted, 'screenshotUrl')) {
345
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'screenshotUrl') } });
346
+ }
347
+ if (crawlerOptions.respondWith === 'pageshot' && Reflect.get(formatted, 'pageshotUrl')) {
348
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'pageshotUrl') } });
349
+ }
350
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { contentType: 'text/plain; charset=utf-8', envelope: null });
351
+ }
352
+ }
353
+ catch (err) {
354
+ if (!lastScrapped) {
355
+ throw err;
356
+ }
357
+ }
358
+ if (!lastScrapped) {
359
+ if (crawlOpts.targetSelector) {
360
+ throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl} with target selector ${Array.isArray(crawlOpts.targetSelector) ? crawlOpts.targetSelector.join(', ') : crawlOpts.targetSelector}`);
361
+ }
362
+ throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl}`);
363
+ }
364
+ const formatted = await this.formatSnapshot(crawlerOptions, lastScrapped, targetUrl, this.urlValidMs, crawlOpts);
365
+ chargeAmount = this.assignChargeAmount(formatted, tierPolicy);
366
+ if (crawlerOptions.respondWith === 'screenshot' && Reflect.get(formatted, 'screenshotUrl')) {
367
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'screenshotUrl') } });
368
+ }
369
+ if (crawlerOptions.respondWith === 'pageshot' && Reflect.get(formatted, 'pageshotUrl')) {
370
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'pageshotUrl') } });
371
+ }
372
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { contentType: 'text/plain; charset=utf-8', envelope: null });
373
+ }
374
+ async getTargetUrl(originPath, crawlerOptions) {
375
+ let url = '';
376
+ const targetUrlFromGet = originPath.slice(1);
377
+ if (crawlerOptions.pdf) {
378
+ const pdfFile = crawlerOptions.pdf;
379
+ const identifier = pdfFile instanceof fancy_file_1.FancyFile ? (await pdfFile.sha256Sum) : (0, crypto_1.randomUUID)();
380
+ url = `blob://pdf/${identifier}`;
381
+ crawlerOptions.url ??= url;
382
+ }
383
+ else if (targetUrlFromGet) {
384
+ url = targetUrlFromGet.trim();
385
+ }
386
+ else if (crawlerOptions.url) {
387
+ url = crawlerOptions.url.trim();
388
+ }
389
+ if (!url) {
390
+ throw new civ_rpc_1.ParamValidationError({
391
+ message: 'No URL provided',
392
+ path: 'url'
393
+ });
394
+ }
395
+ const { url: safeURL, ips } = await this.miscService.assertNormalizedUrl(url);
396
+ if (this.puppeteerControl.circuitBreakerHosts.has(safeURL.hostname.toLowerCase())) {
397
+ throw new errors_1.SecurityCompromiseError({
398
+ message: `Circular hostname: ${safeURL.protocol}`,
399
+ path: 'url'
400
+ });
401
+ }
402
+ crawlerOptions._hintIps = ips;
403
+ return safeURL;
404
+ }
405
+ getUrlDigest(urlToCrawl) {
406
+ const normalizedURL = new URL(urlToCrawl);
407
+ if (!normalizedURL.hash.startsWith('#/')) {
408
+ normalizedURL.hash = '';
409
+ }
410
+ const normalizedUrl = normalizedURL.toString().toLowerCase();
411
+ const digest = snapshot_formatter_1.md5Hasher.hash(normalizedUrl.toString());
412
+ return digest;
413
+ }
414
+ async *queryCache(urlToCrawl, cacheTolerance) {
415
+ const digest = this.getUrlDigest(urlToCrawl);
416
+ const cache = (await (crawled_1.Crawled.fromFirestoreQuery(crawled_1.Crawled.COLLECTION.where('urlPathDigest', '==', digest).orderBy('createdAt', 'desc').limit(1)).catch((err) => {
417
+ this.logger.warn(`Failed to query cache, unknown issue`, { err });
418
+ // https://github.com/grpc/grpc-node/issues/2647
419
+ // https://github.com/googleapis/nodejs-firestore/issues/1023
420
+ // https://github.com/googleapis/nodejs-firestore/issues/1023
421
+ return undefined;
422
+ })))?.[0];
423
+ yield cache;
424
+ if (!cache) {
425
+ return;
426
+ }
427
+ const age = Date.now() - cache.createdAt.valueOf();
428
+ const stale = cache.createdAt.valueOf() < (Date.now() - cacheTolerance);
429
+ this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for ${urlToCrawl}, normalized digest: ${digest}, ${age}ms old, tolerance ${cacheTolerance}ms`, {
430
+ url: urlToCrawl, digest, age, stale, cacheTolerance
431
+ });
432
+ let snapshot;
433
+ let screenshotUrl;
434
+ let pageshotUrl;
435
+ const preparations = [
436
+ this.firebaseObjectStorage.downloadFile(`snapshots/${cache._id}`).then((r) => {
437
+ snapshot = JSON.parse(r.toString('utf-8'));
438
+ }),
439
+ cache.screenshotAvailable ?
440
+ this.firebaseObjectStorage.signDownloadUrl(`screenshots/${cache._id}`, Date.now() + this.urlValidMs).then((r) => {
441
+ screenshotUrl = r;
442
+ }) :
443
+ Promise.resolve(undefined),
444
+ cache.pageshotAvailable ?
445
+ this.firebaseObjectStorage.signDownloadUrl(`pageshots/${cache._id}`, Date.now() + this.urlValidMs).then((r) => {
446
+ pageshotUrl = r;
447
+ }) :
448
+ Promise.resolve(undefined)
449
+ ];
450
+ try {
451
+ await Promise.all(preparations);
452
+ }
453
+ catch (_err) {
454
+ // Swallow cache errors.
455
+ return undefined;
456
+ }
457
+ yield {
458
+ isFresh: !stale,
459
+ ...cache,
460
+ snapshot: {
461
+ ...snapshot,
462
+ screenshot: undefined,
463
+ pageshot: undefined,
464
+ screenshotUrl,
465
+ pageshotUrl,
466
+ }
467
+ };
468
+ }
469
+ async setToCache(urlToCrawl, snapshot) {
470
+ const digest = this.getUrlDigest(urlToCrawl);
471
+ this.logger.info(`Caching snapshot of ${urlToCrawl}...`, { url: urlToCrawl, digest, title: snapshot?.title, href: snapshot?.href });
472
+ const nowDate = new Date();
473
+ const cache = crawled_1.Crawled.from({
474
+ _id: (0, crypto_1.randomUUID)(),
475
+ url: urlToCrawl.toString(),
476
+ createdAt: nowDate,
477
+ expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs),
478
+ htmlSignificantlyModifiedByJs: snapshot.htmlSignificantlyModifiedByJs,
479
+ urlPathDigest: digest,
480
+ });
481
+ const savingOfSnapshot = this.firebaseObjectStorage.saveFile(`snapshots/${cache._id}`, Buffer.from(JSON.stringify({
482
+ ...snapshot,
483
+ screenshot: undefined,
484
+ pageshot: undefined,
485
+ }), 'utf-8'), {
486
+ metadata: {
487
+ contentType: 'application/json',
488
+ }
489
+ }).then((r) => {
490
+ cache.snapshotAvailable = true;
491
+ return r;
492
+ });
493
+ if (snapshot.screenshot) {
494
+ await this.firebaseObjectStorage.saveFile(`screenshots/${cache._id}`, snapshot.screenshot, {
495
+ metadata: {
496
+ contentType: 'image/png',
497
+ }
498
+ });
499
+ cache.screenshotAvailable = true;
500
+ }
501
+ if (snapshot.pageshot) {
502
+ await this.firebaseObjectStorage.saveFile(`pageshots/${cache._id}`, snapshot.pageshot, {
503
+ metadata: {
504
+ contentType: 'image/png',
505
+ }
506
+ });
507
+ cache.pageshotAvailable = true;
508
+ }
509
+ await savingOfSnapshot;
510
+ this.batchedCaches.push(cache);
511
+ // const r = await Crawled.save(cache.degradeForFireStore()).catch((err) => {
512
+ // this.logger.error(`Failed to save cache for ${urlToCrawl}`, { err: marshalErrorLike(err) });
513
+ // return undefined;
514
+ // });
515
+ return cache;
516
+ }
517
+ async *iterSnapshots(urlToCrawl, crawlOpts, crawlerOpts) {
518
+ // if (crawlerOpts?.respondWith.includes(CONTENT_FORMAT.VLM)) {
519
+ // const finalBrowserSnapshot = await this.getFinalSnapshot(urlToCrawl, {
520
+ // ...crawlOpts, engine: ENGINE_TYPE.BROWSER
521
+ // }, crawlerOpts);
522
+ // yield* this.lmControl.geminiFromBrowserSnapshot(finalBrowserSnapshot);
523
+ // return;
524
+ // }
525
+ if (crawlerOpts?.respondWith.includes(crawler_options_1.CONTENT_FORMAT.READER_LM)) {
526
+ const finalAutoSnapshot = await this.getFinalSnapshot(urlToCrawl, {
527
+ ...crawlOpts,
528
+ engine: crawlOpts?.engine || crawler_options_1.ENGINE_TYPE.AUTO,
529
+ }, crawler_options_1.CrawlerOptions.from({
530
+ ...crawlerOpts,
531
+ respondWith: 'html',
532
+ }));
533
+ if (!finalAutoSnapshot?.html) {
534
+ throw new civ_rpc_1.AssertionFailureError(`Unexpected non HTML content for ReaderLM: ${urlToCrawl}`);
535
+ }
536
+ if (crawlerOpts?.instruction || crawlerOpts?.jsonSchema) {
537
+ const jsonSchema = crawlerOpts.jsonSchema ? JSON.stringify(crawlerOpts.jsonSchema, undefined, 2) : undefined;
538
+ yield* this.lmControl.readerLMFromSnapshot(crawlerOpts.instruction, jsonSchema, finalAutoSnapshot);
539
+ return;
540
+ }
541
+ try {
542
+ yield* this.lmControl.readerLMMarkdownFromSnapshot(finalAutoSnapshot);
543
+ }
544
+ catch (err) {
545
+ if (err instanceof http_1.HTTPServiceError && err.status === 429) {
546
+ throw new errors_1.ServiceNodeResourceDrainError(`Reader LM is at capacity, please try again later.`);
547
+ }
548
+ throw err;
549
+ }
550
+ return;
551
+ }
552
+ yield* this.cachedScrap(urlToCrawl, crawlOpts, crawlerOpts);
553
+ }
554
+ async *cachedScrap(urlToCrawl, crawlOpts, crawlerOpts) {
555
+ if (crawlerOpts?.html) {
556
+ const snapshot = {
557
+ href: urlToCrawl.toString(),
558
+ html: crawlerOpts.html,
559
+ title: '',
560
+ text: '',
561
+ };
562
+ yield this.jsdomControl.narrowSnapshot(snapshot, crawlOpts);
563
+ return;
564
+ }
565
+ if (crawlerOpts?.pdf) {
566
+ const pdfFile = crawlerOpts.pdf instanceof fancy_file_1.FancyFile ? crawlerOpts.pdf : this.tempFileManager.cacheBuffer(Buffer.from(crawlerOpts.pdf, 'base64'));
567
+ const pdfLocalPath = (0, url_1.pathToFileURL)((await pdfFile.filePath));
568
+ const snapshot = {
569
+ href: urlToCrawl.toString(),
570
+ html: `<!DOCTYPE html><html><head></head><body style="height: 100%; width: 100%; overflow: hidden; margin:0px; background-color: rgb(82, 86, 89);"><embed style="position:absolute; left: 0; top: 0;" width="100%" height="100%" src="${crawlerOpts.url}"></body></html>`,
571
+ title: '',
572
+ text: '',
573
+ pdfs: [pdfLocalPath.href],
574
+ };
575
+ yield this.jsdomControl.narrowSnapshot(snapshot, crawlOpts);
576
+ return;
577
+ }
578
+ if (crawlOpts?.engine === crawler_options_1.ENGINE_TYPE.CURL ||
579
+ // deprecated name
580
+ crawlOpts?.engine === 'direct') {
581
+ let sideLoaded;
582
+ try {
583
+ sideLoaded = (crawlOpts?.allocProxy && !crawlOpts?.proxyUrl) ?
584
+ await this.sideLoadWithAllocatedProxy(urlToCrawl, crawlOpts) :
585
+ await this.curlControl.sideLoad(urlToCrawl, crawlOpts);
586
+ }
587
+ catch (err) {
588
+ if (err instanceof errors_1.ServiceBadAttemptError) {
589
+ throw new civ_rpc_1.AssertionFailureError(err.message);
590
+ }
591
+ throw err;
592
+ }
593
+ if (!sideLoaded?.file) {
594
+ throw new civ_rpc_1.AssertionFailureError(`Remote server did not return a body: ${urlToCrawl}`);
595
+ }
596
+ const draftSnapshot = await this.snapshotFormatter.createSnapshotFromFile(urlToCrawl, sideLoaded.file, sideLoaded.contentType, sideLoaded.fileName);
597
+ draftSnapshot.status = sideLoaded.status;
598
+ draftSnapshot.statusText = sideLoaded.statusText;
599
+ yield this.jsdomControl.narrowSnapshot(draftSnapshot, crawlOpts);
600
+ return;
601
+ }
602
+ if (crawlOpts?.engine === crawler_options_1.ENGINE_TYPE.CF_BROWSER_RENDERING) {
603
+ const html = await this.cfBrowserRendering.fetchContent(urlToCrawl.href);
604
+ const snapshot = {
605
+ href: urlToCrawl.toString(),
606
+ html,
607
+ title: '',
608
+ text: '',
609
+ };
610
+ yield this.jsdomControl.narrowSnapshot(snapshot, crawlOpts);
611
+ return;
612
+ }
613
+ const cacheTolerance = crawlerOpts?.cacheTolerance ?? this.cacheValidMs;
614
+ const cacheIt = this.queryCache(urlToCrawl, cacheTolerance);
615
+ let cache = (await cacheIt.next()).value;
616
+ if (cache?.htmlSignificantlyModifiedByJs === false) {
617
+ if (crawlerOpts && crawlerOpts.timeout === undefined) {
618
+ crawlerOpts.respondTiming ??= crawler_options_1.RESPOND_TIMING.HTML;
619
+ }
620
+ }
621
+ if (!crawlerOpts || crawlerOpts.isCacheQueryApplicable()) {
622
+ cache = (await cacheIt.next()).value;
623
+ }
624
+ cacheIt.return(undefined);
625
+ if (cache?.isFresh &&
626
+ (!crawlOpts?.favorScreenshot || (crawlOpts?.favorScreenshot && (cache.screenshotAvailable && cache.pageshotAvailable))) &&
627
+ (lodash_1.default.get(cache.snapshot, 'locale') === crawlOpts?.locale)) {
628
+ if (cache.snapshot) {
629
+ cache.snapshot.isFromCache = true;
630
+ }
631
+ yield this.jsdomControl.narrowSnapshot(cache.snapshot, crawlOpts);
632
+ return;
633
+ }
634
+ if (crawlOpts?.engine !== crawler_options_1.ENGINE_TYPE.BROWSER && !this.knownUrlThatSideLoadingWouldCrashTheBrowser(urlToCrawl)) {
635
+ const sideLoadSnapshotPermitted = crawlerOpts?.browserIsNotRequired() &&
636
+ [crawler_options_1.RESPOND_TIMING.HTML, crawler_options_1.RESPOND_TIMING.VISIBLE_CONTENT].includes(crawlerOpts.presumedRespondTiming);
637
+ try {
638
+ const altOpts = { ...crawlOpts };
639
+ let sideLoaded = (crawlOpts?.allocProxy && !crawlOpts?.proxyUrl) ?
640
+ await this.sideLoadWithAllocatedProxy(urlToCrawl, altOpts) :
641
+ await this.curlControl.sideLoad(urlToCrawl, altOpts).catch((err) => {
642
+ this.logger.warn(`Failed to side load ${urlToCrawl.origin}`, { err: (0, lang_1.marshalErrorLike)(err), href: urlToCrawl.href });
643
+ if (err instanceof civ_rpc_1.ApplicationError && !(err instanceof errors_1.ServiceBadAttemptError)) {
644
+ return Promise.reject(err);
645
+ }
646
+ return this.sideLoadWithAllocatedProxy(urlToCrawl, altOpts);
647
+ });
648
+ if (!sideLoaded.file) {
649
+ throw new errors_1.ServiceBadAttemptError(`Remote server did not return a body: ${urlToCrawl}`);
650
+ }
651
+ const draftSnapshot = await this.snapshotFormatter.createSnapshotFromFile(urlToCrawl, sideLoaded.file, sideLoaded.contentType, sideLoaded.fileName).catch((err) => {
652
+ if (err instanceof civ_rpc_1.ApplicationError) {
653
+ return Promise.reject(new errors_1.ServiceBadAttemptError(err.message));
654
+ }
655
+ return Promise.reject(err);
656
+ });
657
+ draftSnapshot.status = sideLoaded.status;
658
+ draftSnapshot.statusText = sideLoaded.statusText;
659
+ if (sideLoaded.status == 200 && !sideLoaded.contentType.startsWith('text/html')) {
660
+ yield draftSnapshot;
661
+ return;
662
+ }
663
+ let analyzed = await this.jsdomControl.analyzeHTMLTextLite(draftSnapshot.html);
664
+ draftSnapshot.title ??= analyzed.title;
665
+ draftSnapshot.isIntermediate = true;
666
+ if (sideLoadSnapshotPermitted) {
667
+ yield this.jsdomControl.narrowSnapshot(draftSnapshot, crawlOpts);
668
+ }
669
+ let fallbackProxyIsUsed = false;
670
+ if (((!crawlOpts?.allocProxy || crawlOpts.allocProxy !== 'none') && !crawlOpts?.proxyUrl) &&
671
+ (analyzed.tokens < 42 || sideLoaded.status !== 200)) {
672
+ const proxyLoaded = await this.sideLoadWithAllocatedProxy(urlToCrawl, altOpts);
673
+ if (!proxyLoaded.file) {
674
+ throw new errors_1.ServiceBadAttemptError(`Remote server did not return a body: ${urlToCrawl}`);
675
+ }
676
+ const proxySnapshot = await this.snapshotFormatter.createSnapshotFromFile(urlToCrawl, proxyLoaded.file, proxyLoaded.contentType, proxyLoaded.fileName).catch((err) => {
677
+ if (err instanceof civ_rpc_1.ApplicationError) {
678
+ return Promise.reject(new errors_1.ServiceBadAttemptError(err.message));
679
+ }
680
+ return Promise.reject(err);
681
+ });
682
+ proxySnapshot.status = proxyLoaded.status;
683
+ proxySnapshot.statusText = proxyLoaded.statusText;
684
+ if (proxyLoaded.status === 200 && crawlerOpts?.browserIsNotRequired()) {
685
+ }
686
+ analyzed = await this.jsdomControl.analyzeHTMLTextLite(proxySnapshot.html);
687
+ if (proxyLoaded.status === 200 || analyzed.tokens >= 200) {
688
+ proxySnapshot.isIntermediate = true;
689
+ if (sideLoadSnapshotPermitted) {
690
+ yield this.jsdomControl.narrowSnapshot(proxySnapshot, crawlOpts);
691
+ }
692
+ sideLoaded = proxyLoaded;
693
+ fallbackProxyIsUsed = true;
694
+ }
695
+ }
696
+ if (crawlOpts && (sideLoaded.status === 200 || analyzed.tokens >= 200 || crawlOpts.allocProxy)) {
697
+ this.logger.info(`Side load seems to work, applying to crawler.`, { url: urlToCrawl.href });
698
+ crawlOpts.sideLoad ??= sideLoaded.sideLoadOpts;
699
+ if (fallbackProxyIsUsed) {
700
+ this.logger.info(`Proxy seems to salvage the page`, { url: urlToCrawl.href });
701
+ }
702
+ }
703
+ }
704
+ catch (err) {
705
+ this.logger.warn(`Failed to side load ${urlToCrawl.origin}`, { err: (0, lang_1.marshalErrorLike)(err), href: urlToCrawl.href });
706
+ if (err instanceof civ_rpc_1.ApplicationError &&
707
+ !(err instanceof errors_1.ServiceBadAttemptError) &&
708
+ !(err instanceof civ_rpc_1.DataStreamBrokenError)) {
709
+ throw err;
710
+ }
711
+ }
712
+ }
713
+ else if (crawlOpts?.allocProxy && crawlOpts.allocProxy !== 'none' && !crawlOpts.proxyUrl) {
714
+ const proxyUrl = await this.proxyProvider.alloc(this.figureOutBestProxyCountry(crawlOpts));
715
+ crawlOpts.proxyUrl = proxyUrl.href;
716
+ }
717
+ try {
718
+ if (crawlOpts?.targetSelector || crawlOpts?.removeSelector || crawlOpts?.withIframe || crawlOpts?.withShadowDom) {
719
+ for await (const x of this.puppeteerControl.scrap(urlToCrawl, crawlOpts)) {
720
+ yield this.jsdomControl.narrowSnapshot(x, crawlOpts);
721
+ }
722
+ return;
723
+ }
724
+ yield* this.puppeteerControl.scrap(urlToCrawl, crawlOpts);
725
+ }
726
+ catch (err) {
727
+ if (cache && !(err instanceof errors_1.SecurityCompromiseError)) {
728
+ this.logger.warn(`Failed to scrap ${urlToCrawl}, but a stale cache is available. Falling back to cache`, { err: (0, lang_1.marshalErrorLike)(err) });
729
+ yield this.jsdomControl.narrowSnapshot(cache.snapshot, crawlOpts);
730
+ return;
731
+ }
732
+ throw err;
733
+ }
734
+ }
735
+ assignChargeAmount(formatted, saasTierPolicy) {
736
+ if (!formatted) {
737
+ return 0;
738
+ }
739
+ let amount = 0;
740
+ if (formatted.content) {
741
+ amount = (0, openai_1.countGPTToken)(formatted.content);
742
+ }
743
+ else if (formatted.description) {
744
+ amount += (0, openai_1.countGPTToken)(formatted.description);
745
+ }
746
+ if (formatted.text) {
747
+ amount += (0, openai_1.countGPTToken)(formatted.text);
748
+ }
749
+ if (formatted.html) {
750
+ amount += (0, openai_1.countGPTToken)(formatted.html);
751
+ }
752
+ if (formatted.screenshotUrl || formatted.screenshot) {
753
+ // OpenAI image token count for 1024x1024 image
754
+ amount += 765;
755
+ }
756
+ if (saasTierPolicy) {
757
+ amount = this.saasApplyTierPolicy(saasTierPolicy, amount);
758
+ }
759
+ Object.assign(formatted, { usage: { tokens: amount } });
760
+ (0, civ_rpc_1.assignMeta)(formatted, { usage: { tokens: amount } });
761
+ return amount;
762
+ }
763
+ async *scrapMany(urls, options, crawlerOpts) {
764
+ const iterators = urls.map((url) => this.cachedScrap(url, options, crawlerOpts));
765
+ const results = iterators.map((_x) => undefined);
766
+ let nextDeferred = (0, defer_1.Defer)();
767
+ let concluded = false;
768
+ const handler = async (it, idx) => {
769
+ try {
770
+ for await (const x of it) {
771
+ results[idx] = x;
772
+ if (x) {
773
+ nextDeferred.resolve();
774
+ nextDeferred = (0, defer_1.Defer)();
775
+ }
776
+ }
777
+ }
778
+ catch (err) {
779
+ this.logger.warn(`Failed to scrap ${urls[idx]}`, { err: (0, lang_1.marshalErrorLike)(err) });
780
+ }
781
+ };
782
+ Promise.allSettled(iterators.map((it, idx) => handler(it, idx))).finally(() => {
783
+ concluded = true;
784
+ nextDeferred.resolve();
785
+ });
786
+ yield results;
787
+ try {
788
+ while (!concluded) {
789
+ await nextDeferred.promise;
790
+ yield results;
791
+ }
792
+ yield results;
793
+ }
794
+ finally {
795
+ for (const x of iterators) {
796
+ x.return();
797
+ }
798
+ }
799
+ }
800
+ async configure(opts) {
801
+ this.threadLocal.set('withGeneratedAlt', opts.withGeneratedAlt);
802
+ this.threadLocal.set('withLinksSummary', opts.withLinksSummary);
803
+ this.threadLocal.set('withImagesSummary', opts.withImagesSummary);
804
+ this.threadLocal.set('keepImgDataUrl', opts.keepImgDataUrl);
805
+ this.threadLocal.set('cacheTolerance', opts.cacheTolerance);
806
+ this.threadLocal.set('withIframe', opts.withIframe);
807
+ this.threadLocal.set('withShadowDom', opts.withShadowDom);
808
+ this.threadLocal.set('userAgent', opts.userAgent);
809
+ if (opts.timeout) {
810
+ this.threadLocal.set('timeout', opts.timeout * 1000);
811
+ }
812
+ this.threadLocal.set('retainImages', opts.retainImages);
813
+ this.threadLocal.set('noGfm', opts.noGfm);
814
+ this.threadLocal.set('DNT', Boolean(opts.doNotTrack));
815
+ if (opts.markdown) {
816
+ this.threadLocal.set('turndownOpts', opts.markdown);
817
+ }
818
+ const crawlOpts = {
819
+ proxyUrl: opts.proxyUrl,
820
+ cookies: opts.setCookies,
821
+ favorScreenshot: ['screenshot', 'pageshot'].some((x) => opts.respondWith.includes(x)),
822
+ removeSelector: opts.removeSelector,
823
+ targetSelector: opts.targetSelector,
824
+ waitForSelector: opts.waitForSelector,
825
+ overrideUserAgent: opts.userAgent,
826
+ timeoutMs: opts.timeout ? opts.timeout * 1000 : undefined,
827
+ withIframe: opts.withIframe,
828
+ withShadowDom: opts.withShadowDom,
829
+ locale: opts.locale,
830
+ referer: opts.referer,
831
+ viewport: opts.viewport,
832
+ engine: opts.engine,
833
+ allocProxy: opts.proxy?.endsWith('+') ? opts.proxy.slice(0, -1) : opts.proxy,
834
+ proxyResources: (opts.proxyUrl || opts.proxy?.endsWith('+')) ? true : false,
835
+ private: Boolean(opts.doNotTrack),
836
+ };
837
+ if (crawlOpts.targetSelector?.length) {
838
+ if (typeof crawlOpts.targetSelector === 'string') {
839
+ crawlOpts.targetSelector = [crawlOpts.targetSelector];
840
+ }
841
+ for (const s of crawlOpts.targetSelector) {
842
+ for (const e of s.split(',').map((x) => x.trim())) {
843
+ if (e.startsWith('*') || e.startsWith(':') || e.includes('*:')) {
844
+ throw new civ_rpc_1.ParamValidationError({
845
+ message: `Unacceptable selector: '${e}'. We cannot accept match-all selector for performance reasons. Sorry.`,
846
+ path: 'targetSelector'
847
+ });
848
+ }
849
+ }
850
+ }
851
+ }
852
+ if (opts._hintIps?.length) {
853
+ const hints = await this.geoIpService.lookupCities(opts._hintIps);
854
+ const board = {};
855
+ for (const x of hints) {
856
+ if (x.country?.code) {
857
+ board[x.country.code] = (board[x.country.code] || 0) + 1;
858
+ }
859
+ }
860
+ const hintCountry = lodash_1.default.maxBy(Array.from(Object.entries(board)), 1)?.[0];
861
+ crawlOpts.countryHint = hintCountry?.toLowerCase();
862
+ }
863
+ if (opts.locale) {
864
+ crawlOpts.extraHeaders ??= {};
865
+ crawlOpts.extraHeaders['Accept-Language'] = opts.locale;
866
+ }
867
+ if (opts.respondWith.includes(crawler_options_1.CONTENT_FORMAT.VLM)) {
868
+ crawlOpts.favorScreenshot = true;
869
+ }
870
+ if (opts.injectFrameScript?.length) {
871
+ crawlOpts.injectFrameScripts = (await Promise.all(opts.injectFrameScript.map((x) => {
872
+ if (URL.canParse(x)) {
873
+ return fetch(x).then((r) => r.text());
874
+ }
875
+ return x;
876
+ }))).filter(Boolean);
877
+ }
878
+ if (opts.injectPageScript?.length) {
879
+ crawlOpts.injectPageScripts = (await Promise.all(opts.injectPageScript.map((x) => {
880
+ if (URL.canParse(x)) {
881
+ return fetch(x).then((r) => r.text());
882
+ }
883
+ return x;
884
+ }))).filter(Boolean);
885
+ }
886
+ return crawlOpts;
887
+ }
888
+ async formatSnapshot(crawlerOptions, snapshot, nominalUrl, urlValidMs, scrappingOptions) {
889
+ const presumedURL = crawlerOptions.base === 'final' ? new URL(snapshot.href) : nominalUrl;
890
+ const respondWith = crawlerOptions.respondWith;
891
+ if (respondWith === crawler_options_1.CONTENT_FORMAT.READER_LM || respondWith === crawler_options_1.CONTENT_FORMAT.VLM) {
892
+ const output = {
893
+ title: snapshot.title,
894
+ content: snapshot.parsed?.textContent,
895
+ url: presumedURL?.href || snapshot.href,
896
+ };
897
+ Object.defineProperty(output, 'textRepresentation', {
898
+ value: snapshot.parsed?.textContent,
899
+ enumerable: false,
900
+ });
901
+ return output;
902
+ }
903
+ return this.formatSnapshotWithPDFSideLoad(respondWith, snapshot, presumedURL, urlValidMs, scrappingOptions);
904
+ }
905
+ async formatSnapshotWithPDFSideLoad(mode, snapshot, nominalUrl, urlValidMs, scrappingOptions) {
906
+ const snapshotCopy = lodash_1.default.cloneDeep(snapshot);
907
+ if (snapshotCopy.pdfs?.length) {
908
+ const pdfUrl = snapshotCopy.pdfs[0];
909
+ if (pdfUrl.startsWith('http')) {
910
+ const sideLoaded = scrappingOptions?.sideLoad?.impersonate[pdfUrl];
911
+ if (sideLoaded?.status === 200 && sideLoaded.body) {
912
+ snapshotCopy.pdfs[0] = (0, url_1.pathToFileURL)(await sideLoaded?.body.filePath).href;
913
+ return this.snapshotFormatter.formatSnapshot(mode, snapshotCopy, nominalUrl, urlValidMs);
914
+ }
915
+ const r = await this.curlControl.sideLoad(new URL(pdfUrl), scrappingOptions).catch((err) => {
916
+ if (err instanceof errors_1.ServiceBadAttemptError) {
917
+ return Promise.reject(new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): ${err.message}`));
918
+ }
919
+ return Promise.reject(err);
920
+ });
921
+ if (r.status !== 200) {
922
+ throw new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): Server responded status ${r.status}`);
923
+ }
924
+ if (!r.contentType.includes('application/pdf')) {
925
+ throw new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): Server responded with wrong content type ${r.contentType}`);
926
+ }
927
+ if (!r.file) {
928
+ throw new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): Server did not return a body`);
929
+ }
930
+ snapshotCopy.pdfs[0] = (0, url_1.pathToFileURL)(await r.file.filePath).href;
931
+ }
932
+ }
933
+ return this.snapshotFormatter.formatSnapshot(mode, snapshotCopy, nominalUrl, urlValidMs);
934
+ }
935
+ async getFinalSnapshot(url, opts, crawlerOptions) {
936
+ const it = this.cachedScrap(url, opts, crawlerOptions);
937
+ let lastSnapshot;
938
+ let lastError;
939
+ try {
940
+ for await (const x of it) {
941
+ lastSnapshot = x;
942
+ }
943
+ }
944
+ catch (err) {
945
+ lastError = err;
946
+ }
947
+ if (!lastSnapshot && lastError) {
948
+ throw lastError;
949
+ }
950
+ if (!lastSnapshot) {
951
+ throw new civ_rpc_1.AssertionFailureError(`No content available`);
952
+ }
953
+ return lastSnapshot;
954
+ }
955
+ async simpleCrawl(mode, url, opts) {
956
+ const it = this.iterSnapshots(url, { ...opts, minIntervalMs: 500 });
957
+ let lastSnapshot;
958
+ let goodEnough = false;
959
+ try {
960
+ for await (const x of it) {
961
+ lastSnapshot = x;
962
+ if (goodEnough) {
963
+ break;
964
+ }
965
+ if (lastSnapshot?.parsed?.content) {
966
+ // After it's good enough, wait for next snapshot;
967
+ goodEnough = true;
968
+ }
969
+ }
970
+ }
971
+ catch (err) {
972
+ if (lastSnapshot) {
973
+ return this.snapshotFormatter.formatSnapshot(mode, lastSnapshot, url, this.urlValidMs);
974
+ }
975
+ throw err;
976
+ }
977
+ if (!lastSnapshot) {
978
+ throw new civ_rpc_1.AssertionFailureError(`No content available`);
979
+ }
980
+ return this.snapshotFormatter.formatSnapshot(mode, lastSnapshot, url, this.urlValidMs);
981
+ }
982
+ getDomainProfileUrlDigest(url) {
983
+ const pathname = url.pathname;
984
+ const pathVec = pathname.split('/');
985
+ const parentPath = pathVec.slice(0, -1).join('/');
986
+ const finalPath = parentPath || pathname;
987
+ const key = url.origin.toLocaleLowerCase() + finalPath;
988
+ return {
989
+ digest: snapshot_formatter_1.md5Hasher.hash(key),
990
+ path: finalPath,
991
+ };
992
+ }
993
+ async sideLoadWithAllocatedProxy(url, opts) {
994
+ if (opts?.allocProxy === 'none') {
995
+ return this.curlControl.sideLoad(url, opts);
996
+ }
997
+ let proxy;
998
+ if (opts) {
999
+ let it = this.proxyIterMap.get(opts);
1000
+ if (!it) {
1001
+ it = this.proxyProvider.iterAlloc(this.figureOutBestProxyCountry(opts));
1002
+ this.proxyIterMap.set(opts, it);
1003
+ }
1004
+ proxy = (await it.next()).value;
1005
+ }
1006
+ proxy ??= await this.proxyProvider.alloc(this.figureOutBestProxyCountry(opts));
1007
+ this.logger.debug(`Proxy allocated`, { proxy: proxy.href });
1008
+ const r = await this.curlControl.sideLoad(url, {
1009
+ ...opts,
1010
+ proxyUrl: proxy.href,
1011
+ });
1012
+ if (opts && opts.allocProxy) {
1013
+ opts.proxyUrl ??= proxy.href;
1014
+ }
1015
+ return { ...r, proxy };
1016
+ }
1017
+ figureOutBestProxyCountry(opts) {
1018
+ if (!opts) {
1019
+ return 'auto';
1020
+ }
1021
+ let draft;
1022
+ if (opts.allocProxy) {
1023
+ if (this.proxyProvider.supports(opts.allocProxy)) {
1024
+ draft = opts.allocProxy;
1025
+ }
1026
+ else if (opts.allocProxy === 'none') {
1027
+ return 'none';
1028
+ }
1029
+ }
1030
+ if (opts.countryHint) {
1031
+ if (this.proxyProvider.supports(opts.countryHint)) {
1032
+ draft ??= opts.countryHint;
1033
+ }
1034
+ }
1035
+ draft ??= opts.allocProxy || 'auto';
1036
+ return draft;
1037
+ }
1038
+ knownUrlThatSideLoadingWouldCrashTheBrowser(url) {
1039
+ if (url.hostname === 'chromewebstore.google.com') {
1040
+ return true;
1041
+ }
1042
+ return false;
1043
+ }
1044
+ async saasAssertTierPolicy(opts, auth) {
1045
+ let chargeScalar = 1;
1046
+ let minimalCharge = 0;
1047
+ if (opts.withGeneratedAlt) {
1048
+ await auth.assertTier(0, 'Alt text generation');
1049
+ minimalCharge = 765;
1050
+ }
1051
+ if (opts.injectPageScript || opts.injectFrameScript) {
1052
+ await auth.assertTier(0, 'Script injection');
1053
+ minimalCharge = 4_000;
1054
+ }
1055
+ if (opts.withIframe) {
1056
+ await auth.assertTier(0, 'Iframe');
1057
+ }
1058
+ if (opts.engine === crawler_options_1.ENGINE_TYPE.CF_BROWSER_RENDERING) {
1059
+ await auth.assertTier(0, 'Cloudflare browser rendering');
1060
+ minimalCharge = 4_000;
1061
+ }
1062
+ if (opts.respondWith.includes('lm') || opts.engine?.includes('lm')) {
1063
+ await auth.assertTier(0, 'Language model');
1064
+ minimalCharge = 4_000;
1065
+ chargeScalar = 3;
1066
+ }
1067
+ if (opts.proxy && opts.proxy !== 'none') {
1068
+ await auth.assertTier(['auto', 'any'].includes(opts.proxy) ? 0 : 2, 'Proxy allocation');
1069
+ chargeScalar = 5;
1070
+ }
1071
+ return {
1072
+ budget: opts.tokenBudget || 0,
1073
+ chargeScalar,
1074
+ minimalCharge,
1075
+ };
1076
+ }
1077
+ saasApplyTierPolicy(policy, chargeAmount) {
1078
+ const effectiveChargeAmount = policy.chargeScalar * Math.max(chargeAmount, policy.minimalCharge);
1079
+ if (policy.budget && policy.budget < effectiveChargeAmount) {
1080
+ throw new errors_1.BudgetExceededError(`Token budget (${policy.budget}) exceeded, intended charge amount ${effectiveChargeAmount}`);
1081
+ }
1082
+ return effectiveChargeAmount;
1083
+ }
1084
+ };
1085
+ exports.CrawlerHost = CrawlerHost;
1086
+ __decorate([
1087
+ (0, registry_1.Method)({
1088
+ name: 'getIndex',
1089
+ description: 'Index of the service',
1090
+ proto: {
1091
+ http: {
1092
+ action: 'get',
1093
+ path: '/',
1094
+ }
1095
+ },
1096
+ tags: ['misc', 'crawl'],
1097
+ returnType: [String, Object],
1098
+ }),
1099
+ __param(0, (0, registry_1.Ctx)()),
1100
+ __param(1, (0, registry_1.Param)({ required: false })),
1101
+ __metadata("design:type", Function),
1102
+ __metadata("design:paramtypes", [typeof (_c = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _c : Object, jina_embeddings_auth_1.JinaEmbeddingsAuthDTO]),
1103
+ __metadata("design:returntype", Promise)
1104
+ ], CrawlerHost.prototype, "getIndexCtrl", null);
1105
+ __decorate([
1106
+ (0, registry_1.Method)({
1107
+ name: 'crawlByPostingToIndex',
1108
+ description: 'Crawl any url into markdown',
1109
+ proto: {
1110
+ http: {
1111
+ action: 'POST',
1112
+ path: '/',
1113
+ }
1114
+ },
1115
+ tags: ['crawl'],
1116
+ returnType: [String, transform_server_event_stream_1.OutputServerEventStream],
1117
+ }),
1118
+ (0, registry_1.Method)({
1119
+ description: 'Crawl any url into markdown',
1120
+ proto: {
1121
+ http: {
1122
+ action: ['GET', 'POST'],
1123
+ path: '::url',
1124
+ }
1125
+ },
1126
+ tags: ['crawl'],
1127
+ returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString],
1128
+ }),
1129
+ __param(0, (0, registry_1.RPCReflect)()),
1130
+ __param(1, (0, registry_1.Ctx)()),
1131
+ __metadata("design:type", Function),
1132
+ __metadata("design:paramtypes", [typeof (_d = typeof civ_rpc_1.RPCReflection !== "undefined" && civ_rpc_1.RPCReflection) === "function" ? _d : Object, typeof (_e = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _e : Object, jina_embeddings_auth_1.JinaEmbeddingsAuthDTO,
1133
+ crawler_options_1.CrawlerOptionsHeaderOnly,
1134
+ crawler_options_1.CrawlerOptions]),
1135
+ __metadata("design:returntype", Promise)
1136
+ ], CrawlerHost.prototype, "crawl", null);
1137
+ __decorate([
1138
+ (0, decorators_1.retryWith)((err) => {
1139
+ if (err instanceof errors_1.ServiceBadApproachError) {
1140
+ return false;
1141
+ }
1142
+ if (err instanceof errors_1.ServiceBadAttemptError) {
1143
+ // Keep trying
1144
+ return true;
1145
+ }
1146
+ if (err instanceof civ_rpc_1.ApplicationError) {
1147
+ // Quit with this error
1148
+ return false;
1149
+ }
1150
+ return undefined;
1151
+ }, 3),
1152
+ __metadata("design:type", Function),
1153
+ __metadata("design:paramtypes", [typeof (_f = typeof URL !== "undefined" && URL) === "function" ? _f : Object, Object]),
1154
+ __metadata("design:returntype", Promise)
1155
+ ], CrawlerHost.prototype, "sideLoadWithAllocatedProxy", null);
1156
+ exports.CrawlerHost = CrawlerHost = __decorate([
1157
+ (0, tsyringe_1.singleton)(),
1158
+ __metadata("design:paramtypes", [logger_1.GlobalLogger,
1159
+ puppeteer_1.PuppeteerControl,
1160
+ curl_1.CurlControl,
1161
+ cf_browser_rendering_1.CFBrowserRendering, typeof (_a = typeof proxy_provider_1.ProxyProviderService !== "undefined" && proxy_provider_1.ProxyProviderService) === "function" ? _a : Object, lm_1.LmControl,
1162
+ jsdom_1.JSDomControl,
1163
+ snapshot_formatter_1.SnapshotFormatter,
1164
+ firebase_storage_bucket_1.FirebaseStorageBucketControl, typeof (_b = typeof rate_limit_1.RateLimitControl !== "undefined" && rate_limit_1.RateLimitControl) === "function" ? _b : Object, async_context_1.AsyncLocalContext,
1165
+ robots_text_1.RobotsTxtService,
1166
+ temp_file_1.TempFileManager,
1167
+ geoip_1.GeoIPService,
1168
+ misc_2.MiscService])
1169
+ ], CrawlerHost);
1170
+ //# sourceMappingURL=crawler.js.map
build/api/crawler.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"crawler.js","sourceRoot":"","sources":["../../src/api/crawler.ts"],"names":[],"mappings":"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"}
build/api/searcher.js ADDED
@@ -0,0 +1,771 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var _a, _b, _c, _d, _e, _f;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.SearcherHost = void 0;
20
+ const tsyringe_1 = require("tsyringe");
21
+ const civ_rpc_1 = require("civkit/civ-rpc");
22
+ const lang_1 = require("civkit/lang");
23
+ const hash_1 = require("civkit/hash");
24
+ const lodash_1 = __importDefault(require("lodash"));
25
+ const rate_limit_1 = require("../shared/services/rate-limit");
26
+ const crawler_1 = require("./crawler");
27
+ const crawler_options_1 = require("../dto/crawler-options");
28
+ const snapshot_formatter_1 = require("../services/snapshot-formatter");
29
+ const serper_search_1 = require("../services/serper-search");
30
+ const logger_1 = require("../services/logger");
31
+ const async_context_1 = require("../services/async-context");
32
+ const registry_1 = require("../services/registry");
33
+ const transform_server_event_stream_1 = require("../lib/transform-server-event-stream");
34
+ const jina_embeddings_auth_1 = require("../dto/jina-embeddings-auth");
35
+ const errors_1 = require("../services/errors");
36
+ // import { SerperBingSearchService, SerperGoogleSearchService } from '../services/serp/serper';
37
+ const misc_1 = require("../utils/misc");
38
+ const lru_cache_1 = require("lru-cache");
39
+ const api_roll_1 = require("../shared/db/api-roll");
40
+ const searched_1 = require("../db/searched");
41
+ // import { SerperSearchQueryParams, WORLD_COUNTRIES, WORLD_LANGUAGES } from '../shared/3rd-party/serper-search';
42
+ const internal_1 = require("../services/serp/internal");
43
+ const WORLD_COUNTRY_CODES = Object.keys(WORLD_COUNTRIES).map((x) => x.toLowerCase());
44
+ let SearcherHost = class SearcherHost extends civ_rpc_1.RPCHost {
45
+ constructor(globalLogger, rateLimitControl, threadLocal, crawler, snapshotFormatter, serperGoogle, serperBing, jinaSerp) {
46
+ super(...arguments);
47
+ this.globalLogger = globalLogger;
48
+ this.rateLimitControl = rateLimitControl;
49
+ this.threadLocal = threadLocal;
50
+ this.crawler = crawler;
51
+ this.snapshotFormatter = snapshotFormatter;
52
+ this.serperGoogle = serperGoogle;
53
+ this.serperBing = serperBing;
54
+ this.jinaSerp = jinaSerp;
55
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
56
+ this.cacheRetentionMs = 1000 * 3600 * 24 * 7;
57
+ this.cacheValidMs = 1000 * 3600;
58
+ this.pageCacheToleranceMs = 1000 * 3600 * 24;
59
+ this.reasonableDelayMs = 15_000;
60
+ this.targetResultCount = 5;
61
+ this.highFreqKeyCache = new lru_cache_1.LRUCache({
62
+ max: 256,
63
+ ttl: 60 * 60 * 1000,
64
+ updateAgeOnGet: false,
65
+ updateAgeOnHas: false,
66
+ });
67
+ this.batchedCaches = [];
68
+ setInterval(() => {
69
+ const thisBatch = this.batchedCaches;
70
+ this.batchedCaches = [];
71
+ if (!thisBatch.length) {
72
+ return;
73
+ }
74
+ const batch = searched_1.SERPResult.DB.batch();
75
+ for (const x of thisBatch) {
76
+ batch.set(searched_1.SERPResult.COLLECTION.doc(), x.degradeForFireStore());
77
+ }
78
+ batch.commit()
79
+ .then(() => {
80
+ this.logger.debug(`Saved ${thisBatch.length} caches by batch`);
81
+ })
82
+ .catch((err) => {
83
+ this.logger.warn(`Failed to cache search result in batch`, { err });
84
+ });
85
+ }, 1000 * 10 + Math.round(1000 * Math.random())).unref();
86
+ }
87
+ async init() {
88
+ await this.dependencyReady();
89
+ this.emit('ready');
90
+ }
91
+ async search(rpcReflect, ctx, auth, crawlerOptions, searchExplicitOperators, count, variant, searchEngine, num, gl, hl, location, page, fallback, q) {
92
+ // We want to make our search API follow SERP schema, so we need to expose 'num' parameter.
93
+ // Since we used 'count' as 'num' previously, we need to keep 'count' for old users.
94
+ // Here we combine 'count' and 'num' to 'count' for the rest of the function.
95
+ count = (num !== undefined ? num : count) ?? 10;
96
+ const authToken = auth.bearerToken;
97
+ let highFreqKey;
98
+ if (authToken && this.highFreqKeyCache.has(authToken)) {
99
+ highFreqKey = this.highFreqKeyCache.get(authToken);
100
+ auth.user = highFreqKey.user;
101
+ auth.uid = highFreqKey.user?.user_id;
102
+ }
103
+ const uid = await auth.solveUID();
104
+ // Return content by default
105
+ const crawlWithoutContent = crawlerOptions.respondWith.includes('no-content');
106
+ const withFavicon = Boolean(ctx.get('X-With-Favicons'));
107
+ this.threadLocal.set('collect-favicon', withFavicon);
108
+ crawlerOptions.respondTiming ??= crawler_options_1.RESPOND_TIMING.VISIBLE_CONTENT;
109
+ let chargeAmount = 0;
110
+ const noSlashPath = decodeURIComponent(ctx.path).slice(1);
111
+ if (!noSlashPath && !q) {
112
+ const index = await this.crawler.getIndex(auth);
113
+ if (!uid) {
114
+ index.note = 'Authentication is required to use this endpoint. Please provide a valid API key via Authorization header.';
115
+ }
116
+ if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) {
117
+ return index;
118
+ }
119
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${index}`, { contentType: 'text/plain', envelope: null });
120
+ }
121
+ const user = await auth.assertUser();
122
+ if (!(user.wallet.total_balance > 0)) {
123
+ throw new errors_1.InsufficientBalanceError(`Account balance not enough to run this query, please recharge.`);
124
+ }
125
+ if (highFreqKey?.blockedUntil) {
126
+ const now = new Date();
127
+ const blockedTimeRemaining = (highFreqKey.blockedUntil.valueOf() - now.valueOf());
128
+ if (blockedTimeRemaining > 0) {
129
+ throw rate_limit_1.RateLimitTriggeredError.from({
130
+ message: `Per UID rate limit exceeded (async)`,
131
+ retryAfter: Math.ceil(blockedTimeRemaining / 1000),
132
+ });
133
+ }
134
+ }
135
+ const rateLimitPolicy = auth.getRateLimits(rpcReflect.name.toUpperCase()) || [
136
+ parseInt(user.metadata?.speed_level) >= 2 ?
137
+ rate_limit_1.RateLimitDesc.from({
138
+ occurrence: 1000,
139
+ periodSeconds: 60
140
+ }) :
141
+ rate_limit_1.RateLimitDesc.from({
142
+ occurrence: 100,
143
+ periodSeconds: 60
144
+ })
145
+ ];
146
+ const apiRollPromise = this.rateLimitControl.simpleRPCUidBasedLimit(rpcReflect, uid, [rpcReflect.name.toUpperCase()], ...rateLimitPolicy);
147
+ if (!highFreqKey) {
148
+ // Normal path
149
+ await apiRollPromise;
150
+ if (rateLimitPolicy.some((x) => {
151
+ const rpm = x.occurrence / (x.periodSeconds / 60);
152
+ if (rpm >= 400) {
153
+ return true;
154
+ }
155
+ return false;
156
+ })) {
157
+ this.highFreqKeyCache.set(auth.bearerToken, {
158
+ user,
159
+ });
160
+ }
161
+ }
162
+ else {
163
+ // High freq key path
164
+ apiRollPromise.then(
165
+ // Rate limit not triggered, make sure not blocking.
166
+ () => {
167
+ delete highFreqKey.blockedUntil;
168
+ },
169
+ // Rate limit triggered
170
+ (err) => {
171
+ if (!(err instanceof rate_limit_1.RateLimitTriggeredError)) {
172
+ return;
173
+ }
174
+ const now = Date.now();
175
+ let tgtDate;
176
+ if (err.retryAfterDate) {
177
+ tgtDate = err.retryAfterDate;
178
+ }
179
+ else if (err.retryAfter) {
180
+ tgtDate = new Date(now + err.retryAfter * 1000);
181
+ }
182
+ if (tgtDate) {
183
+ const dt = tgtDate.valueOf() - now;
184
+ highFreqKey.blockedUntil = tgtDate;
185
+ setTimeout(() => {
186
+ if (highFreqKey.blockedUntil === tgtDate) {
187
+ delete highFreqKey.blockedUntil;
188
+ }
189
+ }, dt).unref();
190
+ }
191
+ }).finally(async () => {
192
+ // Always asynchronously update user(wallet);
193
+ const user = await auth.getBrief().catch(() => undefined);
194
+ if (user) {
195
+ highFreqKey.user = user;
196
+ }
197
+ });
198
+ }
199
+ rpcReflect.finally(async () => {
200
+ if (chargeAmount) {
201
+ auth.reportUsage(chargeAmount, `reader-${rpcReflect.name}`).catch((err) => {
202
+ this.logger.warn(`Unable to report usage for ${uid}`, { err: (0, lang_1.marshalErrorLike)(err) });
203
+ });
204
+ try {
205
+ const apiRoll = await apiRollPromise;
206
+ apiRoll.chargeAmount = chargeAmount;
207
+ }
208
+ catch (err) {
209
+ await this.rateLimitControl.record({
210
+ uid,
211
+ tags: [rpcReflect.name.toUpperCase()],
212
+ status: api_roll_1.API_CALL_STATUS.SUCCESS,
213
+ chargeAmount,
214
+ }).save().catch((err) => {
215
+ this.logger.warn(`Failed to save rate limit record`, { err: (0, lang_1.marshalErrorLike)(err) });
216
+ });
217
+ }
218
+ }
219
+ });
220
+ delete crawlerOptions.html;
221
+ const crawlOpts = await this.crawler.configure(crawlerOptions);
222
+ const searchQuery = searchExplicitOperators.addTo(q || noSlashPath);
223
+ let fetchNum = count;
224
+ if ((page ?? 1) === 1) {
225
+ fetchNum = count > 10 ? 30 : 20;
226
+ }
227
+ let fallbackQuery;
228
+ let chargeAmountScaler = 1;
229
+ if (searchEngine === 'bing') {
230
+ this.threadLocal.set('bing-preferred', true);
231
+ chargeAmountScaler = 3;
232
+ }
233
+ if (variant !== 'web') {
234
+ chargeAmountScaler = 5;
235
+ }
236
+ // Search with fallback logic if enabled
237
+ const searchParams = {
238
+ variant,
239
+ provider: searchEngine,
240
+ q: searchQuery,
241
+ num: fetchNum,
242
+ gl,
243
+ hl,
244
+ location,
245
+ page,
246
+ };
247
+ const { results, query: successQuery, tryTimes } = await this.searchWithFallback(searchParams, fallback, crawlerOptions.noCache);
248
+ chargeAmountScaler *= tryTimes;
249
+ fallbackQuery = successQuery !== searchQuery ? successQuery : undefined;
250
+ if (!results.length) {
251
+ throw new civ_rpc_1.AssertionFailureError(`No search results available for query ${searchQuery}`);
252
+ }
253
+ if (crawlOpts.timeoutMs && crawlOpts.timeoutMs < 30_000) {
254
+ delete crawlOpts.timeoutMs;
255
+ }
256
+ let lastScrapped;
257
+ const targetResultCount = crawlWithoutContent ? count : count + 2;
258
+ const trimmedResults = results.filter((x) => Boolean(x.link)).slice(0, targetResultCount).map((x) => this.mapToFinalResults(x));
259
+ trimmedResults.toString = function () {
260
+ let r = this.map((x, i) => x ? Reflect.apply(x.toString, x, [i]) : '').join('\n\n').trimEnd() + '\n';
261
+ if (fallbackQuery) {
262
+ r = `Fallback query: ${fallbackQuery}\n\n${r}`;
263
+ }
264
+ return r;
265
+ };
266
+ if (!crawlerOptions.respondWith.includes('no-content') &&
267
+ ['html', 'text', 'shot', 'markdown', 'content'].some((x) => crawlerOptions.respondWith.includes(x))) {
268
+ for (const x of trimmedResults) {
269
+ x.content ??= '';
270
+ }
271
+ }
272
+ const assigningOfGeneralMixins = Promise.allSettled(trimmedResults.map((x) => this.assignGeneralMixin(x)));
273
+ let it;
274
+ if (crawlWithoutContent || count === 0) {
275
+ it = (0, misc_1.toAsyncGenerator)(trimmedResults);
276
+ await assigningOfGeneralMixins;
277
+ }
278
+ else {
279
+ it = this.fetchSearchResults(crawlerOptions.respondWith, trimmedResults, crawlOpts, crawler_options_1.CrawlerOptions.from({ ...crawlerOptions, cacheTolerance: crawlerOptions.cacheTolerance ?? this.pageCacheToleranceMs }), count);
280
+ }
281
+ if (!ctx.accepts('text/plain') && ctx.accepts('text/event-stream')) {
282
+ const sseStream = new transform_server_event_stream_1.OutputServerEventStream();
283
+ rpcReflect.return(sseStream);
284
+ try {
285
+ for await (const scrapped of it) {
286
+ if (!scrapped) {
287
+ continue;
288
+ }
289
+ if (rpcReflect.signal.aborted) {
290
+ break;
291
+ }
292
+ chargeAmount = this.assignChargeAmount(scrapped, count, chargeAmountScaler, fallbackQuery);
293
+ lastScrapped = scrapped;
294
+ if (fallbackQuery) {
295
+ sseStream.write({
296
+ event: 'meta',
297
+ data: { fallback: fallbackQuery },
298
+ });
299
+ }
300
+ sseStream.write({
301
+ event: 'data',
302
+ data: scrapped,
303
+ });
304
+ }
305
+ }
306
+ catch (err) {
307
+ this.logger.error(`Failed to collect search result for query ${searchQuery}`, { err: (0, lang_1.marshalErrorLike)(err) });
308
+ sseStream.write({
309
+ event: 'error',
310
+ data: (0, lang_1.marshalErrorLike)(err),
311
+ });
312
+ }
313
+ sseStream.end();
314
+ return sseStream;
315
+ }
316
+ let earlyReturn = false;
317
+ if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) {
318
+ let earlyReturnTimer;
319
+ const setEarlyReturnTimer = () => {
320
+ if (earlyReturnTimer) {
321
+ return;
322
+ }
323
+ earlyReturnTimer = setTimeout(async () => {
324
+ if (!lastScrapped) {
325
+ return;
326
+ }
327
+ await assigningOfGeneralMixins;
328
+ chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery);
329
+ rpcReflect.return(lastScrapped);
330
+ earlyReturn = true;
331
+ }, ((crawlerOptions.timeout || 0) * 1000) || this.reasonableDelayMs);
332
+ };
333
+ for await (const scrapped of it) {
334
+ lastScrapped = scrapped;
335
+ if (rpcReflect.signal.aborted || earlyReturn) {
336
+ break;
337
+ }
338
+ if (lodash_1.default.some(scrapped, (x) => this.pageQualified(x))) {
339
+ setEarlyReturnTimer();
340
+ }
341
+ if (!this.searchResultsQualified(scrapped, count)) {
342
+ continue;
343
+ }
344
+ if (earlyReturnTimer) {
345
+ clearTimeout(earlyReturnTimer);
346
+ }
347
+ await assigningOfGeneralMixins;
348
+ chargeAmount = this.assignChargeAmount(scrapped, count, chargeAmountScaler, fallbackQuery);
349
+ return scrapped;
350
+ }
351
+ if (earlyReturnTimer) {
352
+ clearTimeout(earlyReturnTimer);
353
+ }
354
+ if (!lastScrapped) {
355
+ throw new civ_rpc_1.AssertionFailureError(`No content available for query ${searchQuery}`);
356
+ }
357
+ if (!earlyReturn) {
358
+ await assigningOfGeneralMixins;
359
+ chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery);
360
+ }
361
+ return lastScrapped;
362
+ }
363
+ let earlyReturnTimer;
364
+ const setEarlyReturnTimer = () => {
365
+ if (earlyReturnTimer) {
366
+ return;
367
+ }
368
+ earlyReturnTimer = setTimeout(async () => {
369
+ if (!lastScrapped) {
370
+ return;
371
+ }
372
+ await assigningOfGeneralMixins;
373
+ chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery);
374
+ rpcReflect.return((0, civ_rpc_1.assignTransferProtocolMeta)(`${lastScrapped}`, { contentType: 'text/plain', envelope: null }));
375
+ earlyReturn = true;
376
+ }, ((crawlerOptions.timeout || 0) * 1000) || this.reasonableDelayMs);
377
+ };
378
+ for await (const scrapped of it) {
379
+ lastScrapped = scrapped;
380
+ if (rpcReflect.signal.aborted || earlyReturn) {
381
+ break;
382
+ }
383
+ if (lodash_1.default.some(scrapped, (x) => this.pageQualified(x))) {
384
+ setEarlyReturnTimer();
385
+ }
386
+ if (!this.searchResultsQualified(scrapped, count)) {
387
+ continue;
388
+ }
389
+ if (earlyReturnTimer) {
390
+ clearTimeout(earlyReturnTimer);
391
+ }
392
+ await assigningOfGeneralMixins;
393
+ chargeAmount = this.assignChargeAmount(scrapped, count, chargeAmountScaler, fallbackQuery);
394
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${scrapped}`, { contentType: 'text/plain', envelope: null });
395
+ }
396
+ if (earlyReturnTimer) {
397
+ clearTimeout(earlyReturnTimer);
398
+ }
399
+ if (!lastScrapped) {
400
+ throw new civ_rpc_1.AssertionFailureError(`No content available for query ${searchQuery}`);
401
+ }
402
+ if (!earlyReturn) {
403
+ await assigningOfGeneralMixins;
404
+ chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery);
405
+ }
406
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${lastScrapped}`, { contentType: 'text/plain', envelope: null });
407
+ }
408
+ /**
409
+ * Search with fallback to progressively shorter queries if no results found
410
+ * @param params Search parameters
411
+ * @param useFallback Whether to use the fallback mechanism
412
+ * @param noCache Whether to bypass cache
413
+ * @returns Search response and the successful query
414
+ */
415
+ async searchWithFallback(params, useFallback = false, noCache = false) {
416
+ // Try original query first
417
+ const originalQuery = params.q;
418
+ const containsRTL = /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u0590-\u05FF\uFB1D-\uFB4F\u0700-\u074F\u0780-\u07BF\u07C0-\u07FF]/.test(originalQuery);
419
+ // Extract results based on variant
420
+ let tryTimes = 1;
421
+ const results = await this.cachedSearch(params.variant, params, noCache);
422
+ if (results.length || !useFallback) {
423
+ return { results, query: params.q, tryTimes };
424
+ }
425
+ let queryTerms = originalQuery.split(/\s+/);
426
+ const lastResort = containsRTL ? queryTerms.slice(queryTerms.length - 2) : queryTerms.slice(0, 2);
427
+ this.logger.info(`No results for "${originalQuery}", trying fallback queries`);
428
+ let terms = [];
429
+ // fallback n times
430
+ const n = 4;
431
+ while (tryTimes < n) {
432
+ const delta = Math.ceil(queryTerms.length / n) * tryTimes;
433
+ terms = containsRTL ? queryTerms.slice(delta) : queryTerms.slice(0, queryTerms.length - delta);
434
+ const query = terms.join(' ');
435
+ if (!query) {
436
+ break;
437
+ }
438
+ tryTimes += 1;
439
+ this.logger.info(`Retrying search with fallback query: "${query}"`);
440
+ const fallbackParams = { ...params, q: query };
441
+ const fallbackResults = await this.cachedSearch(params.variant, fallbackParams, noCache);
442
+ if (fallbackResults.length > 0) {
443
+ return { results: fallbackResults, query: fallbackParams.q, tryTimes };
444
+ }
445
+ }
446
+ if (terms.length > lastResort.length) {
447
+ const query = lastResort.join(' ');
448
+ this.logger.info(`Retrying search with fallback query: "${query}"`);
449
+ const fallbackParams = { ...params, q: query };
450
+ tryTimes += 1;
451
+ const fallbackResults = await this.cachedSearch(params.variant, fallbackParams, noCache);
452
+ if (fallbackResults.length > 0) {
453
+ return { results: fallbackResults, query, tryTimes };
454
+ }
455
+ }
456
+ return { results, query: originalQuery, tryTimes };
457
+ }
458
+ async *fetchSearchResults(mode, searchResults, options, crawlerOptions, count) {
459
+ if (!searchResults) {
460
+ return;
461
+ }
462
+ const urls = searchResults.map((x) => new URL(x.url));
463
+ const snapshotMap = new WeakMap();
464
+ for await (const scrapped of this.crawler.scrapMany(urls, options, crawlerOptions)) {
465
+ const mapped = scrapped.map((x, i) => {
466
+ if (!x) {
467
+ return {};
468
+ }
469
+ if (snapshotMap.has(x)) {
470
+ return snapshotMap.get(x);
471
+ }
472
+ return this.crawler.formatSnapshotWithPDFSideLoad(mode, x, urls[i], undefined, options).then((r) => {
473
+ snapshotMap.set(x, r);
474
+ return r;
475
+ }).catch((err) => {
476
+ this.logger.error(`Failed to format snapshot for ${urls[i].href}`, { err: (0, lang_1.marshalErrorLike)(err) });
477
+ return {};
478
+ });
479
+ });
480
+ const resultArray = await Promise.all(mapped);
481
+ for (const [i, v] of resultArray.entries()) {
482
+ if (v) {
483
+ Object.assign(searchResults[i], v);
484
+ }
485
+ }
486
+ yield this.reOrganizeSearchResults(searchResults, count);
487
+ }
488
+ }
489
+ reOrganizeSearchResults(searchResults, count) {
490
+ const targetResultCount = count || this.targetResultCount;
491
+ const [qualifiedPages, unqualifiedPages] = lodash_1.default.partition(searchResults, (x) => this.pageQualified(x));
492
+ const acceptSet = new Set(qualifiedPages);
493
+ const n = targetResultCount - qualifiedPages.length;
494
+ for (const x of unqualifiedPages.slice(0, n >= 0 ? n : 0)) {
495
+ acceptSet.add(x);
496
+ }
497
+ const filtered = searchResults.filter((x) => acceptSet.has(x)).slice(0, targetResultCount);
498
+ const resultArray = filtered;
499
+ resultArray.toString = searchResults.toString;
500
+ return resultArray;
501
+ }
502
+ assignChargeAmount(formatted, num, scaler, fallbackQuery) {
503
+ let contentCharge = 0;
504
+ for (const x of formatted) {
505
+ const itemAmount = this.crawler.assignChargeAmount(x) || 0;
506
+ if (!itemAmount) {
507
+ continue;
508
+ }
509
+ contentCharge += itemAmount;
510
+ }
511
+ const numCharge = Math.ceil(formatted.length / 10) * 10000 * scaler;
512
+ const final = Math.max(contentCharge, numCharge);
513
+ if (final === numCharge) {
514
+ for (const x of formatted) {
515
+ x.usage = { tokens: Math.ceil(numCharge / formatted.length) };
516
+ }
517
+ }
518
+ const metadata = { usage: { tokens: final } };
519
+ if (fallbackQuery) {
520
+ metadata.fallback = fallbackQuery;
521
+ }
522
+ (0, civ_rpc_1.assignMeta)(formatted, metadata);
523
+ return final;
524
+ }
525
+ pageQualified(formattedPage) {
526
+ return formattedPage.title &&
527
+ formattedPage.content ||
528
+ formattedPage.screenshotUrl ||
529
+ formattedPage.pageshotUrl ||
530
+ formattedPage.text ||
531
+ formattedPage.html;
532
+ }
533
+ searchResultsQualified(results, targetResultCount = this.targetResultCount) {
534
+ return lodash_1.default.every(results, (x) => this.pageQualified(x)) && results.length >= targetResultCount;
535
+ }
536
+ async getFavicon(domain) {
537
+ const url = `https://www.google.com/s2/favicons?sz=32&domain_url=${domain}`;
538
+ try {
539
+ const response = await fetch(url);
540
+ if (!response.ok) {
541
+ return '';
542
+ }
543
+ const ab = await response.arrayBuffer();
544
+ const buffer = Buffer.from(ab);
545
+ const base64 = buffer.toString('base64');
546
+ return `data:image/png;base64,${base64}`;
547
+ }
548
+ catch (error) {
549
+ this.logger.warn(`Failed to get favicon base64 string`, { err: (0, lang_1.marshalErrorLike)(error) });
550
+ return '';
551
+ }
552
+ }
553
+ *iterProviders(preference, variant) {
554
+ if (preference === 'bing') {
555
+ yield this.serperBing;
556
+ yield variant === 'web' ? this.jinaSerp : this.serperGoogle;
557
+ yield this.serperGoogle;
558
+ return;
559
+ }
560
+ if (preference === 'google') {
561
+ yield variant === 'web' ? this.jinaSerp : this.serperGoogle;
562
+ yield this.serperGoogle;
563
+ yield this.serperGoogle;
564
+ return;
565
+ }
566
+ yield variant === 'web' ? this.jinaSerp : this.serperGoogle;
567
+ yield this.serperGoogle;
568
+ yield this.serperGoogle;
569
+ }
570
+ async cachedSearch(variant, query, noCache) {
571
+ const queryDigest = (0, hash_1.objHashMd5B64Of)({ ...query, variant });
572
+ const provider = query.provider;
573
+ Reflect.deleteProperty(query, 'provider');
574
+ let cache;
575
+ if (!noCache) {
576
+ cache = (await searched_1.SERPResult.fromFirestoreQuery(searched_1.SERPResult.COLLECTION.where('queryDigest', '==', queryDigest)
577
+ .orderBy('createdAt', 'desc')
578
+ .limit(1)))[0];
579
+ if (cache) {
580
+ const age = Date.now() - cache.createdAt.valueOf();
581
+ const stale = cache.createdAt.valueOf() < (Date.now() - this.cacheValidMs);
582
+ this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for search query "${query.q}", normalized digest: ${queryDigest}, ${age}ms old`, {
583
+ query, digest: queryDigest, age, stale
584
+ });
585
+ if (!stale) {
586
+ return cache.response;
587
+ }
588
+ }
589
+ }
590
+ try {
591
+ let r;
592
+ let lastError;
593
+ outerLoop: for (const client of this.iterProviders(provider, variant)) {
594
+ const t0 = Date.now();
595
+ try {
596
+ switch (variant) {
597
+ case 'images': {
598
+ r = await Reflect.apply(client.imageSearch, client, [query]);
599
+ break;
600
+ }
601
+ case 'news': {
602
+ r = await Reflect.apply(client.newsSearch, client, [query]);
603
+ break;
604
+ }
605
+ case 'web':
606
+ default: {
607
+ r = await Reflect.apply(client.webSearch, client, [query]);
608
+ break;
609
+ }
610
+ }
611
+ const dt = Date.now() - t0;
612
+ this.logger.info(`Search took ${dt}ms, ${client.constructor.name}(${variant})`, { searchDt: dt, variant, client: client.constructor.name });
613
+ break outerLoop;
614
+ }
615
+ catch (err) {
616
+ lastError = err;
617
+ const dt = Date.now() - t0;
618
+ this.logger.warn(`Failed to do ${variant} search using ${client.constructor.name}`, { err, variant, searchDt: dt, });
619
+ }
620
+ }
621
+ if (r?.length) {
622
+ const nowDate = new Date();
623
+ const record = searched_1.SERPResult.from({
624
+ query,
625
+ queryDigest,
626
+ response: r,
627
+ createdAt: nowDate,
628
+ expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs)
629
+ });
630
+ this.batchedCaches.push(record);
631
+ }
632
+ else if (lastError) {
633
+ throw lastError;
634
+ }
635
+ return r;
636
+ }
637
+ catch (err) {
638
+ if (cache) {
639
+ this.logger.warn(`Failed to fetch search result, but a stale cache is available. falling back to stale cache`, { err: (0, lang_1.marshalErrorLike)(err) });
640
+ return cache.response;
641
+ }
642
+ throw err;
643
+ }
644
+ }
645
+ mapToFinalResults(input) {
646
+ const whitelistedProps = [
647
+ 'imageUrl', 'imageWidth', 'imageHeight', 'source', 'date', 'siteLinks'
648
+ ];
649
+ const result = {
650
+ title: input.title,
651
+ url: input.link,
652
+ description: Reflect.get(input, 'snippet'),
653
+ ...lodash_1.default.pick(input, whitelistedProps),
654
+ };
655
+ return result;
656
+ }
657
+ async assignGeneralMixin(result) {
658
+ const collectFavicon = this.threadLocal.get('collect-favicon');
659
+ if (collectFavicon && result.url) {
660
+ const url = new URL(result.url);
661
+ Reflect.set(result, 'favicon', await this.getFavicon(url.origin));
662
+ }
663
+ Object.setPrototypeOf(result, searchResultProto);
664
+ }
665
+ };
666
+ exports.SearcherHost = SearcherHost;
667
+ __decorate([
668
+ (0, registry_1.Method)({
669
+ name: 'searchIndex',
670
+ ext: {
671
+ http: {
672
+ action: ['get', 'post'],
673
+ path: '/search'
674
+ }
675
+ },
676
+ tags: ['search'],
677
+ returnType: [String, transform_server_event_stream_1.OutputServerEventStream],
678
+ }),
679
+ (0, registry_1.Method)({
680
+ ext: {
681
+ http: {
682
+ action: ['get', 'post'],
683
+ path: '::q'
684
+ }
685
+ },
686
+ tags: ['search'],
687
+ returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString],
688
+ }),
689
+ __param(0, (0, registry_1.RPCReflect)()),
690
+ __param(1, (0, registry_1.Ctx)()),
691
+ __param(5, (0, registry_1.Param)('count', { validate: (v) => v >= 0 && v <= 20 })),
692
+ __param(6, (0, registry_1.Param)('type', { type: new Set(['web', 'images', 'news']), default: 'web' })),
693
+ __param(7, (0, registry_1.Param)('provider', { type: new Set(['google', 'bing']), default: 'google' })),
694
+ __param(8, (0, registry_1.Param)('num', { validate: (v) => v >= 0 && v <= 20 })),
695
+ __param(9, (0, registry_1.Param)('gl', { validate: (v) => WORLD_COUNTRY_CODES.includes(v?.toLowerCase()) })),
696
+ __param(10, (0, registry_1.Param)('hl', { validate: (v) => WORLD_LANGUAGES.some(l => l.code === v) })),
697
+ __param(11, (0, registry_1.Param)('location')),
698
+ __param(12, (0, registry_1.Param)('page')),
699
+ __param(13, (0, registry_1.Param)('fallback', { type: Boolean, default: true })),
700
+ __param(14, (0, registry_1.Param)('q')),
701
+ __metadata("design:type", Function),
702
+ __metadata("design:paramtypes", [typeof (_d = typeof civ_rpc_1.RPCReflection !== "undefined" && civ_rpc_1.RPCReflection) === "function" ? _d : Object, typeof (_e = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _e : Object, jina_embeddings_auth_1.JinaEmbeddingsAuthDTO,
703
+ crawler_options_1.CrawlerOptions, typeof (_f = typeof serper_search_1.GoogleSearchExplicitOperatorsDto !== "undefined" && serper_search_1.GoogleSearchExplicitOperatorsDto) === "function" ? _f : Object, Number, String, String, Number, String, String, String, Number, Boolean, String]),
704
+ __metadata("design:returntype", Promise)
705
+ ], SearcherHost.prototype, "search", null);
706
+ exports.SearcherHost = SearcherHost = __decorate([
707
+ (0, tsyringe_1.singleton)(),
708
+ __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof rate_limit_1.RateLimitControl !== "undefined" && rate_limit_1.RateLimitControl) === "function" ? _a : Object, async_context_1.AsyncLocalContext,
709
+ crawler_1.CrawlerHost,
710
+ snapshot_formatter_1.SnapshotFormatter, typeof (_b = typeof SerperGoogleSearchService !== "undefined" && SerperGoogleSearchService) === "function" ? _b : Object, typeof (_c = typeof SerperBingSearchService !== "undefined" && SerperBingSearchService) === "function" ? _c : Object, internal_1.InternalJinaSerpService])
711
+ ], SearcherHost);
712
+ const dataItems = [
713
+ { key: 'title', label: 'Title' },
714
+ { key: 'source', label: 'Source' },
715
+ { key: 'url', label: 'URL Source' },
716
+ { key: 'imageUrl', label: 'Image URL' },
717
+ { key: 'description', label: 'Description' },
718
+ { key: 'publishedTime', label: 'Published Time' },
719
+ { key: 'imageWidth', label: 'Image Width' },
720
+ { key: 'imageHeight', label: 'Image Height' },
721
+ { key: 'date', label: 'Date' },
722
+ { key: 'favicon', label: 'Favicon' },
723
+ ];
724
+ const searchResultProto = {
725
+ toString(i) {
726
+ const chunks = [];
727
+ for (const item of dataItems) {
728
+ const v = Reflect.get(this, item.key);
729
+ if (typeof v !== 'undefined') {
730
+ if (i === undefined) {
731
+ chunks.push(`[${item.label}]: ${v}`);
732
+ }
733
+ else {
734
+ chunks.push(`[${i + 1}] ${item.label}: ${v}`);
735
+ }
736
+ }
737
+ }
738
+ if (this.content) {
739
+ chunks.push(`\n${this.content}`);
740
+ }
741
+ if (this.images) {
742
+ const imageSummaryChunks = [`${i === undefined ? '' : `[${i + 1}] `}Images:`];
743
+ for (const [k, v] of Object.entries(this.images)) {
744
+ imageSummaryChunks.push(`- ![${k}](${v})`);
745
+ }
746
+ if (imageSummaryChunks.length === 1) {
747
+ imageSummaryChunks.push('This page does not seem to contain any images.');
748
+ }
749
+ chunks.push(imageSummaryChunks.join('\n'));
750
+ }
751
+ if (this.links) {
752
+ const linkSummaryChunks = [`${i === undefined ? '' : `[${i + 1}] `}Links/Buttons:`];
753
+ if (Array.isArray(this.links)) {
754
+ for (const [k, v] of this.links) {
755
+ linkSummaryChunks.push(`- [${k}](${v})`);
756
+ }
757
+ }
758
+ else {
759
+ for (const [k, v] of Object.entries(this.links)) {
760
+ linkSummaryChunks.push(`- [${k}](${v})`);
761
+ }
762
+ }
763
+ if (linkSummaryChunks.length === 1) {
764
+ linkSummaryChunks.push('This page does not seem to contain any buttons/links.');
765
+ }
766
+ chunks.push(linkSummaryChunks.join('\n'));
767
+ }
768
+ return chunks.join('\n');
769
+ }
770
+ };
771
+ //# sourceMappingURL=searcher.js.map
build/api/searcher.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../src/api/searcher.ts"],"names":[],"mappings":"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"}
build/api/serp.js ADDED
@@ -0,0 +1,513 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var _a, _b, _c, _d, _e;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.SerpHost = void 0;
20
+ const tsyringe_1 = require("tsyringe");
21
+ const civ_rpc_1 = require("civkit/civ-rpc");
22
+ const lang_1 = require("civkit/lang");
23
+ const lodash_1 = __importDefault(require("lodash"));
24
+ const rate_limit_1 = require("../shared/services/rate-limit");
25
+ const logger_1 = require("../services/logger");
26
+ const async_context_1 = require("../services/async-context");
27
+ const registry_1 = require("../services/registry");
28
+ const transform_server_event_stream_1 = require("../lib/transform-server-event-stream");
29
+ const jina_embeddings_auth_1 = require("../dto/jina-embeddings-auth");
30
+ const errors_1 = require("../services/errors");
31
+ const serper_search_1 = require("../shared/3rd-party/serper-search");
32
+ const google_1 = require("../services/serp/google");
33
+ const crawler_options_1 = require("../dto/crawler-options");
34
+ const hash_1 = require("civkit/hash");
35
+ const searched_1 = require("../db/searched");
36
+ const serper_1 = require("../services/serp/serper");
37
+ const lru_cache_1 = require("lru-cache");
38
+ const api_roll_1 = require("../shared/db/api-roll");
39
+ const internal_1 = require("../services/serp/internal");
40
+ const WORLD_COUNTRY_CODES = Object.keys(serper_search_1.WORLD_COUNTRIES).map((x) => x.toLowerCase());
41
+ const indexProto = {
42
+ toString: function () {
43
+ return (0, lodash_1.default)(this)
44
+ .toPairs()
45
+ .map(([k, v]) => k ? `[${lodash_1.default.upperFirst(lodash_1.default.lowerCase(k))}] ${v}` : '')
46
+ .value()
47
+ .join('\n') + '\n';
48
+ }
49
+ };
50
+ let SerpHost = class SerpHost extends civ_rpc_1.RPCHost {
51
+ async getIndex(ctx, auth) {
52
+ const indexObject = Object.create(indexProto);
53
+ Object.assign(indexObject, {
54
+ usage1: 'https://r.jina.ai/YOUR_URL',
55
+ usage2: 'https://s.jina.ai/YOUR_SEARCH_QUERY',
56
+ usage3: `${ctx.origin}/?q=YOUR_SEARCH_QUERY`,
57
+ homepage: 'https://jina.ai/reader',
58
+ });
59
+ if (auth && auth.user) {
60
+ indexObject[''] = undefined;
61
+ indexObject.authenticatedAs = `${auth.user.user_id} (${auth.user.full_name})`;
62
+ indexObject.balanceLeft = auth.user.wallet.total_balance;
63
+ }
64
+ else {
65
+ indexObject.note = 'Authentication is required to use this endpoint. Please provide a valid API key via Authorization header.';
66
+ }
67
+ return indexObject;
68
+ }
69
+ constructor(globalLogger, rateLimitControl, threadLocal, googleSerp, serperGoogle, serperBing, jinaSerp) {
70
+ super(...arguments);
71
+ this.globalLogger = globalLogger;
72
+ this.rateLimitControl = rateLimitControl;
73
+ this.threadLocal = threadLocal;
74
+ this.googleSerp = googleSerp;
75
+ this.serperGoogle = serperGoogle;
76
+ this.serperBing = serperBing;
77
+ this.jinaSerp = jinaSerp;
78
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
79
+ this.cacheRetentionMs = 1000 * 3600 * 24 * 7;
80
+ this.cacheValidMs = 1000 * 3600;
81
+ this.pageCacheToleranceMs = 1000 * 3600 * 24;
82
+ this.reasonableDelayMs = 15_000;
83
+ this.targetResultCount = 5;
84
+ this.highFreqKeyCache = new lru_cache_1.LRUCache({
85
+ max: 256,
86
+ ttl: 60 * 60 * 1000,
87
+ updateAgeOnGet: false,
88
+ updateAgeOnHas: false,
89
+ });
90
+ this.batchedCaches = [];
91
+ setInterval(() => {
92
+ const thisBatch = this.batchedCaches;
93
+ this.batchedCaches = [];
94
+ if (!thisBatch.length) {
95
+ return;
96
+ }
97
+ const batch = searched_1.SERPResult.DB.batch();
98
+ for (const x of thisBatch) {
99
+ batch.set(searched_1.SERPResult.COLLECTION.doc(), x.degradeForFireStore());
100
+ }
101
+ batch.commit()
102
+ .then(() => {
103
+ this.logger.debug(`Saved ${thisBatch.length} caches by batch`);
104
+ })
105
+ .catch((err) => {
106
+ this.logger.warn(`Failed to cache search result in batch`, { err });
107
+ });
108
+ }, 1000 * 10 + Math.round(1000 * Math.random())).unref();
109
+ }
110
+ async init() {
111
+ await this.dependencyReady();
112
+ this.emit('ready');
113
+ }
114
+ async search(rpcReflect, ctx, crawlerOptions, auth, variant, q, searchEngine, num, gl, _hl, location, page, fallback) {
115
+ const authToken = auth.bearerToken;
116
+ let highFreqKey;
117
+ if (authToken && this.highFreqKeyCache.has(authToken)) {
118
+ highFreqKey = this.highFreqKeyCache.get(authToken);
119
+ auth.user = highFreqKey.user;
120
+ auth.uid = highFreqKey.user?.user_id;
121
+ }
122
+ const uid = await auth.solveUID();
123
+ if (!q) {
124
+ if (ctx.path === '/') {
125
+ const indexObject = await this.getIndex(ctx, auth);
126
+ if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) {
127
+ return indexObject;
128
+ }
129
+ return (0, civ_rpc_1.assignTransferProtocolMeta)(`${indexObject}`, { contentType: 'text/plain; charset=utf-8', envelope: null });
130
+ }
131
+ throw new civ_rpc_1.ParamValidationError({
132
+ path: 'q',
133
+ message: `Required but not provided`
134
+ });
135
+ }
136
+ // Return content by default
137
+ const user = await auth.assertUser();
138
+ if (!(user.wallet.total_balance > 0)) {
139
+ throw new errors_1.InsufficientBalanceError(`Account balance not enough to run this query, please recharge.`);
140
+ }
141
+ if (highFreqKey?.blockedUntil) {
142
+ const now = new Date();
143
+ const blockedTimeRemaining = (highFreqKey.blockedUntil.valueOf() - now.valueOf());
144
+ if (blockedTimeRemaining > 0) {
145
+ this.logger.warn(`Rate limit triggered for ${uid}, this request should have been blocked`);
146
+ // throw RateLimitTriggeredError.from({
147
+ // message: `Per UID rate limit exceeded (async)`,
148
+ // retryAfter: Math.ceil(blockedTimeRemaining / 1000),
149
+ // });
150
+ }
151
+ }
152
+ const PREMIUM_KEY_LIMIT = 400;
153
+ const rateLimitPolicy = auth.getRateLimits('SEARCH') || [
154
+ parseInt(user.metadata?.speed_level) >= 2 ?
155
+ rate_limit_1.RateLimitDesc.from({
156
+ occurrence: PREMIUM_KEY_LIMIT,
157
+ periodSeconds: 60
158
+ }) :
159
+ rate_limit_1.RateLimitDesc.from({
160
+ occurrence: 40,
161
+ periodSeconds: 60
162
+ })
163
+ ];
164
+ const apiRollPromise = this.rateLimitControl.simpleRPCUidBasedLimit(rpcReflect, uid, ['SEARCH'], ...rateLimitPolicy);
165
+ if (!highFreqKey) {
166
+ // Normal path
167
+ await apiRollPromise;
168
+ if (rateLimitPolicy.some((x) => {
169
+ const rpm = x.occurrence / (x.periodSeconds / 60);
170
+ if (rpm >= PREMIUM_KEY_LIMIT) {
171
+ return true;
172
+ }
173
+ return false;
174
+ })) {
175
+ this.highFreqKeyCache.set(auth.bearerToken, {
176
+ user,
177
+ });
178
+ }
179
+ }
180
+ else {
181
+ // High freq key path
182
+ apiRollPromise.then(
183
+ // Rate limit not triggered, make sure not blocking.
184
+ () => {
185
+ delete highFreqKey.blockedUntil;
186
+ },
187
+ // Rate limit triggered
188
+ (err) => {
189
+ if (!(err instanceof rate_limit_1.RateLimitTriggeredError)) {
190
+ return;
191
+ }
192
+ const now = Date.now();
193
+ let tgtDate;
194
+ if (err.retryAfterDate) {
195
+ tgtDate = err.retryAfterDate;
196
+ }
197
+ else if (err.retryAfter) {
198
+ tgtDate = new Date(now + err.retryAfter * 1000);
199
+ }
200
+ if (tgtDate) {
201
+ const dt = tgtDate.valueOf() - now;
202
+ highFreqKey.blockedUntil = tgtDate;
203
+ setTimeout(() => {
204
+ if (highFreqKey.blockedUntil === tgtDate) {
205
+ delete highFreqKey.blockedUntil;
206
+ }
207
+ }, dt).unref();
208
+ }
209
+ }).finally(async () => {
210
+ // Always asynchronously update user(wallet);
211
+ const user = await auth.getBrief().catch(() => undefined);
212
+ if (user) {
213
+ highFreqKey.user = user;
214
+ }
215
+ });
216
+ }
217
+ let chargeAmount = 0;
218
+ rpcReflect.finally(async () => {
219
+ if (chargeAmount) {
220
+ auth.reportUsage(chargeAmount, `reader-search`).catch((err) => {
221
+ this.logger.warn(`Unable to report usage for ${uid}`, { err: (0, lang_1.marshalErrorLike)(err) });
222
+ });
223
+ try {
224
+ const apiRoll = await apiRollPromise;
225
+ apiRoll.chargeAmount = chargeAmount;
226
+ }
227
+ catch (err) {
228
+ await this.rateLimitControl.record({
229
+ uid,
230
+ tags: [rpcReflect.name.toUpperCase()],
231
+ status: api_roll_1.API_CALL_STATUS.SUCCESS,
232
+ chargeAmount,
233
+ }).save().catch((err) => {
234
+ this.logger.warn(`Failed to save rate limit record`, { err: (0, lang_1.marshalErrorLike)(err) });
235
+ });
236
+ }
237
+ }
238
+ });
239
+ let chargeAmountScaler = 1;
240
+ if (searchEngine === 'bing') {
241
+ chargeAmountScaler = 3;
242
+ }
243
+ if (variant !== 'web') {
244
+ chargeAmountScaler = 5;
245
+ }
246
+ let realQuery = q;
247
+ let queryTerms = q.split(/\s+/g).filter((x) => !!x);
248
+ let results = await this.cachedSearch(variant, {
249
+ provider: searchEngine,
250
+ q,
251
+ num,
252
+ gl,
253
+ // hl,
254
+ location,
255
+ page,
256
+ }, crawlerOptions);
257
+ if (fallback && !results?.length && (!page || page === 1)) {
258
+ let tryTimes = 1;
259
+ const containsRTL = /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u0590-\u05FF\uFB1D-\uFB4F\u0700-\u074F\u0780-\u07BF\u07C0-\u07FF]/.test(q);
260
+ const lastResort = (containsRTL ? queryTerms.slice(queryTerms.length - 2) : queryTerms.slice(0, 2)).join(' ');
261
+ const n = 4;
262
+ let terms = [];
263
+ while (tryTimes < n) {
264
+ const delta = Math.ceil(queryTerms.length / n) * tryTimes;
265
+ terms = containsRTL ? queryTerms.slice(delta) : queryTerms.slice(0, queryTerms.length - delta);
266
+ const query = terms.join(' ');
267
+ if (!query) {
268
+ break;
269
+ }
270
+ if (realQuery === query) {
271
+ continue;
272
+ }
273
+ tryTimes += 1;
274
+ realQuery = query;
275
+ this.logger.info(`Retrying search with fallback query: "${realQuery}"`);
276
+ results = await this.cachedSearch(variant, {
277
+ provider: searchEngine,
278
+ q: realQuery,
279
+ num,
280
+ gl,
281
+ // hl,
282
+ location,
283
+ }, crawlerOptions);
284
+ if (results?.length) {
285
+ break;
286
+ }
287
+ }
288
+ if (!results?.length && realQuery.length > lastResort.length) {
289
+ realQuery = lastResort;
290
+ this.logger.info(`Retrying search with fallback query: "${realQuery}"`);
291
+ tryTimes += 1;
292
+ results = await this.cachedSearch(variant, {
293
+ provider: searchEngine,
294
+ q: realQuery,
295
+ num,
296
+ gl,
297
+ // hl,
298
+ location,
299
+ }, crawlerOptions);
300
+ }
301
+ chargeAmountScaler *= tryTimes;
302
+ }
303
+ if (!results?.length) {
304
+ results = [];
305
+ }
306
+ const finalResults = results.map((x) => this.mapToFinalResults(x));
307
+ await Promise.all(finalResults.map((x) => this.assignGeneralMixin(x)));
308
+ chargeAmount = this.assignChargeAmount(finalResults, chargeAmountScaler);
309
+ (0, civ_rpc_1.assignMeta)(finalResults, {
310
+ query: realQuery,
311
+ fallback: realQuery === q ? undefined : realQuery,
312
+ });
313
+ return finalResults;
314
+ }
315
+ assignChargeAmount(items, scaler) {
316
+ const numCharge = Math.ceil(items.length / 10) * 10000 * scaler;
317
+ (0, civ_rpc_1.assignMeta)(items, { usage: { tokens: numCharge } });
318
+ return numCharge;
319
+ }
320
+ async getFavicon(domain) {
321
+ const url = `https://www.google.com/s2/favicons?sz=32&domain_url=${domain}`;
322
+ try {
323
+ const response = await fetch(url);
324
+ if (!response.ok) {
325
+ return '';
326
+ }
327
+ const ab = await response.arrayBuffer();
328
+ const buffer = Buffer.from(ab);
329
+ const base64 = buffer.toString('base64');
330
+ return `data:image/png;base64,${base64}`;
331
+ }
332
+ catch (error) {
333
+ this.logger.warn(`Failed to get favicon base64 string`, { err: (0, lang_1.marshalErrorLike)(error) });
334
+ return '';
335
+ }
336
+ }
337
+ async configure(opts) {
338
+ const crawlOpts = {
339
+ proxyUrl: opts.proxyUrl,
340
+ cookies: opts.setCookies,
341
+ overrideUserAgent: opts.userAgent,
342
+ timeoutMs: opts.timeout ? opts.timeout * 1000 : undefined,
343
+ locale: opts.locale,
344
+ referer: opts.referer,
345
+ viewport: opts.viewport,
346
+ proxyResources: (opts.proxyUrl || opts.proxy?.endsWith('+')) ? true : false,
347
+ allocProxy: opts.proxy?.endsWith('+') ? opts.proxy.slice(0, -1) : opts.proxy,
348
+ };
349
+ if (opts.locale) {
350
+ crawlOpts.extraHeaders ??= {};
351
+ crawlOpts.extraHeaders['Accept-Language'] = opts.locale;
352
+ }
353
+ return crawlOpts;
354
+ }
355
+ mapToFinalResults(input) {
356
+ const whitelistedProps = [
357
+ 'imageUrl', 'imageWidth', 'imageHeight', 'source', 'date', 'siteLinks'
358
+ ];
359
+ const result = {
360
+ title: input.title,
361
+ url: input.link,
362
+ description: Reflect.get(input, 'snippet'),
363
+ ...lodash_1.default.pick(input, whitelistedProps),
364
+ };
365
+ return result;
366
+ }
367
+ *iterProviders(preference, variant) {
368
+ if (preference === 'bing') {
369
+ yield this.serperBing;
370
+ yield this.serperGoogle;
371
+ yield this.googleSerp;
372
+ return;
373
+ }
374
+ if (preference === 'google') {
375
+ yield this.googleSerp;
376
+ yield this.googleSerp;
377
+ yield this.serperGoogle;
378
+ return;
379
+ }
380
+ // yield variant === 'web' ? this.jinaSerp : this.serperGoogle;
381
+ yield this.serperGoogle;
382
+ yield this.serperGoogle;
383
+ yield this.googleSerp;
384
+ }
385
+ async cachedSearch(variant, query, opts) {
386
+ const queryDigest = (0, hash_1.objHashMd5B64Of)({ ...query, variant });
387
+ const provider = query.provider;
388
+ Reflect.deleteProperty(query, 'provider');
389
+ const noCache = opts.noCache;
390
+ let cache;
391
+ if (!noCache) {
392
+ cache = (await searched_1.SERPResult.fromFirestoreQuery(searched_1.SERPResult.COLLECTION.where('queryDigest', '==', queryDigest)
393
+ .orderBy('createdAt', 'desc')
394
+ .limit(1)))[0];
395
+ if (cache) {
396
+ const age = Date.now() - cache.createdAt.valueOf();
397
+ const stale = cache.createdAt.valueOf() < (Date.now() - this.cacheValidMs);
398
+ this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for search query "${query.q}", normalized digest: ${queryDigest}, ${age}ms old`, {
399
+ query, digest: queryDigest, age, stale
400
+ });
401
+ if (!stale) {
402
+ return cache.response;
403
+ }
404
+ }
405
+ }
406
+ const scrappingOptions = await this.configure(opts);
407
+ try {
408
+ let r;
409
+ let lastError;
410
+ outerLoop: for (const client of this.iterProviders(provider, variant)) {
411
+ const t0 = Date.now();
412
+ try {
413
+ switch (variant) {
414
+ case 'images': {
415
+ r = await Reflect.apply(client.imageSearch, client, [query, scrappingOptions]);
416
+ break;
417
+ }
418
+ case 'news': {
419
+ r = await Reflect.apply(client.newsSearch, client, [query, scrappingOptions]);
420
+ break;
421
+ }
422
+ case 'web':
423
+ default: {
424
+ r = await Reflect.apply(client.webSearch, client, [query, scrappingOptions]);
425
+ break;
426
+ }
427
+ }
428
+ const dt = Date.now() - t0;
429
+ this.logger.info(`Search took ${dt}ms, ${client.constructor.name}(${variant})`, { searchDt: dt, variant, client: client.constructor.name });
430
+ break outerLoop;
431
+ }
432
+ catch (err) {
433
+ lastError = err;
434
+ const dt = Date.now() - t0;
435
+ this.logger.warn(`Failed to do ${variant} search using ${client.constructor.name}`, { err, variant, searchDt: dt, });
436
+ }
437
+ }
438
+ if (r?.length) {
439
+ const nowDate = new Date();
440
+ const record = searched_1.SERPResult.from({
441
+ query,
442
+ queryDigest,
443
+ response: r,
444
+ createdAt: nowDate,
445
+ expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs)
446
+ });
447
+ this.batchedCaches.push(record);
448
+ }
449
+ else if (lastError) {
450
+ throw lastError;
451
+ }
452
+ return r;
453
+ }
454
+ catch (err) {
455
+ if (cache) {
456
+ this.logger.warn(`Failed to fetch search result, but a stale cache is available. falling back to stale cache`, { err: (0, lang_1.marshalErrorLike)(err) });
457
+ return cache.response;
458
+ }
459
+ throw err;
460
+ }
461
+ }
462
+ async assignGeneralMixin(result) {
463
+ const collectFavicon = this.threadLocal.get('collect-favicon');
464
+ if (collectFavicon && result.link) {
465
+ const url = new URL(result.link);
466
+ Reflect.set(result, 'favicon', await this.getFavicon(url.origin));
467
+ }
468
+ }
469
+ };
470
+ exports.SerpHost = SerpHost;
471
+ __decorate([
472
+ (0, registry_1.Method)({
473
+ name: 'searchIndex',
474
+ ext: {
475
+ http: {
476
+ action: ['get', 'post'],
477
+ path: '/'
478
+ }
479
+ },
480
+ tags: ['search'],
481
+ returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString],
482
+ }),
483
+ (0, registry_1.Method)({
484
+ ext: {
485
+ http: {
486
+ action: ['get', 'post'],
487
+ }
488
+ },
489
+ tags: ['search'],
490
+ returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString],
491
+ }),
492
+ __param(0, (0, registry_1.RPCReflect)()),
493
+ __param(1, (0, registry_1.Ctx)()),
494
+ __param(4, (0, registry_1.Param)('type', { type: new Set(['web', 'images', 'news']), default: 'web' })),
495
+ __param(5, (0, registry_1.Param)('q')),
496
+ __param(6, (0, registry_1.Param)('provider', { type: new Set(['google', 'bing']) })),
497
+ __param(7, (0, registry_1.Param)('num', { validate: (v) => v >= 0 && v <= 20 })),
498
+ __param(8, (0, registry_1.Param)('gl', { validate: (v) => WORLD_COUNTRY_CODES.includes(v?.toLowerCase()) })),
499
+ __param(9, (0, registry_1.Param)('hl', { validate: (v) => serper_search_1.WORLD_LANGUAGES.some(l => l.code === v) })),
500
+ __param(10, (0, registry_1.Param)('location')),
501
+ __param(11, (0, registry_1.Param)('page')),
502
+ __param(12, (0, registry_1.Param)('fallback')),
503
+ __metadata("design:type", Function),
504
+ __metadata("design:paramtypes", [typeof (_d = typeof civ_rpc_1.RPCReflection !== "undefined" && civ_rpc_1.RPCReflection) === "function" ? _d : Object, typeof (_e = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _e : Object, crawler_options_1.CrawlerOptions,
505
+ jina_embeddings_auth_1.JinaEmbeddingsAuthDTO, String, String, String, Number, String, String, String, Number, Boolean]),
506
+ __metadata("design:returntype", Promise)
507
+ ], SerpHost.prototype, "search", null);
508
+ exports.SerpHost = SerpHost = __decorate([
509
+ (0, tsyringe_1.singleton)(),
510
+ __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof rate_limit_1.RateLimitControl !== "undefined" && rate_limit_1.RateLimitControl) === "function" ? _a : Object, async_context_1.AsyncLocalContext,
511
+ google_1.GoogleSERP, typeof (_b = typeof serper_1.SerperGoogleSearchService !== "undefined" && serper_1.SerperGoogleSearchService) === "function" ? _b : Object, typeof (_c = typeof serper_1.SerperBingSearchService !== "undefined" && serper_1.SerperBingSearchService) === "function" ? _c : Object, internal_1.InternalJinaSerpService])
512
+ ], SerpHost);
513
+ //# sourceMappingURL=serp.js.map
build/api/serp.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"serp.js","sourceRoot":"","sources":["../../src/api/serp.ts"],"names":[],"mappings":"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"}
build/cloud-functions/adaptive-crawler.js ADDED
@@ -0,0 +1,510 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var AdaptiveCrawlerHost_1;
18
+ var _a, _b, _c, _d, _e, _f;
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.AdaptiveCrawlerHost = void 0;
21
+ const civkit_1 = require("civkit");
22
+ const tsyringe_1 = require("tsyringe");
23
+ const shared_1 = require("../shared");
24
+ const jina_embeddings_auth_1 = require("../shared/dto/jina-embeddings-auth");
25
+ const robots_parser_1 = __importDefault(require("robots-parser"));
26
+ const xmldom_1 = require("@xmldom/xmldom");
27
+ const adaptive_crawler_options_1 = require("../dto/adaptive-crawler-options");
28
+ const crawler_options_1 = require("../dto/crawler-options");
29
+ const adaptive_crawl_task_1 = require("../db/adaptive-crawl-task");
30
+ const functions_1 = require("firebase-admin/functions");
31
+ const get_function_url_1 = require("../utils/get-function-url");
32
+ const md5Hasher = new civkit_1.HashManager('md5', 'hex');
33
+ const removeURLHash = (url) => {
34
+ try {
35
+ const o = new URL(url);
36
+ o.hash = '';
37
+ return o.toString();
38
+ }
39
+ catch (e) {
40
+ return url;
41
+ }
42
+ };
43
+ let AdaptiveCrawlerHost = class AdaptiveCrawlerHost extends civkit_1.RPCHost {
44
+ static { AdaptiveCrawlerHost_1 = this; }
45
+ static { this.__singleCrawlQueueName = 'singleCrawlQueue'; }
46
+ constructor(globalLogger, firebaseObjectStorage) {
47
+ super(...arguments);
48
+ this.globalLogger = globalLogger;
49
+ this.firebaseObjectStorage = firebaseObjectStorage;
50
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
51
+ // Actual cache storage (gcp buckets) exists for 7 days, so here we need to select a time < 7 days.
52
+ this.cacheExpiry = 3 * 1000 * 60 * 60 * 24;
53
+ }
54
+ async init() {
55
+ await this.dependencyReady();
56
+ this.emit('ready');
57
+ }
58
+ async adaptiveCrawl(rpcReflect, ctx, auth, crawlerOptions, adaptiveCrawlerOptions) {
59
+ this.logger.debug({
60
+ adaptiveCrawlerOptions,
61
+ crawlerOptions,
62
+ });
63
+ const uid = await auth.solveUID();
64
+ const { useSitemap, maxPages } = adaptiveCrawlerOptions;
65
+ let tmpUrl = ctx.req.url.slice(1)?.trim();
66
+ if (!tmpUrl) {
67
+ tmpUrl = crawlerOptions.url?.trim() ?? '';
68
+ }
69
+ const targetUrl = new URL(tmpUrl);
70
+ if (!targetUrl) {
71
+ const latestUser = uid ? await auth.assertUser() : undefined;
72
+ if (!ctx.req.accepts('text/plain') && (ctx.req.accepts('text/json') || ctx.req.accepts('application/json'))) {
73
+ return this.getIndex(latestUser);
74
+ }
75
+ return (0, civkit_1.assignTransferProtocolMeta)(`${this.getIndex(latestUser)}`, { contentType: 'text/plain', envelope: null });
76
+ }
77
+ const meta = {
78
+ targetUrl: targetUrl.toString(),
79
+ useSitemap,
80
+ maxPages,
81
+ };
82
+ const digest = md5Hasher.hash(JSON.stringify(meta));
83
+ const shortDigest = Buffer.from(digest, 'hex').toString('base64url');
84
+ const existing = await adaptive_crawl_task_1.AdaptiveCrawlTask.fromFirestore(shortDigest);
85
+ if (existing?.createdAt) {
86
+ if (existing.createdAt.getTime() > Date.now() - this.cacheExpiry) {
87
+ this.logger.info(`Cache hit for ${shortDigest}, created at ${existing.createdAt.toDateString()}`);
88
+ return { taskId: shortDigest };
89
+ }
90
+ else {
91
+ this.logger.info(`Cache expired for ${shortDigest}, created at ${existing.createdAt.toDateString()}`);
92
+ }
93
+ }
94
+ await adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest).set({
95
+ _id: shortDigest,
96
+ status: adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.PENDING,
97
+ statusText: 'Pending',
98
+ meta,
99
+ createdAt: new Date(),
100
+ urls: [],
101
+ processed: {},
102
+ failed: {},
103
+ });
104
+ let urls = [];
105
+ if (useSitemap) {
106
+ urls = await this.crawlUrlsFromSitemap(targetUrl, maxPages);
107
+ }
108
+ if (urls.length > 0) {
109
+ await adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest).update({
110
+ status: adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.PROCESSING,
111
+ statusText: `Processing 0/${urls.length}`,
112
+ urls,
113
+ });
114
+ const promises = [];
115
+ for (const url of urls) {
116
+ promises.push((0, functions_1.getFunctions)().taskQueue(AdaptiveCrawlerHost_1.__singleCrawlQueueName).enqueue({
117
+ shortDigest, url, token: auth.bearerToken, meta
118
+ }, {
119
+ dispatchDeadlineSeconds: 1800,
120
+ uri: await (0, get_function_url_1.getFunctionUrl)(AdaptiveCrawlerHost_1.__singleCrawlQueueName),
121
+ }));
122
+ }
123
+ ;
124
+ await Promise.all(promises);
125
+ }
126
+ else {
127
+ meta.useSitemap = false;
128
+ await adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest).update({
129
+ urls: [targetUrl.toString()],
130
+ });
131
+ await (0, functions_1.getFunctions)().taskQueue(AdaptiveCrawlerHost_1.__singleCrawlQueueName).enqueue({
132
+ shortDigest, url: targetUrl.toString(), token: auth.bearerToken, meta
133
+ }, {
134
+ dispatchDeadlineSeconds: 1800,
135
+ uri: await (0, get_function_url_1.getFunctionUrl)(AdaptiveCrawlerHost_1.__singleCrawlQueueName),
136
+ });
137
+ }
138
+ return { taskId: shortDigest };
139
+ }
140
+ async adaptiveCrawlStatus(rpcReflect, ctx, auth, taskId, urls = []) {
141
+ if (!taskId) {
142
+ throw new civkit_1.ParamValidationError('taskId is required');
143
+ }
144
+ const state = await adaptive_crawl_task_1.AdaptiveCrawlTask.fromFirestore(taskId);
145
+ if (!state) {
146
+ throw new civkit_1.AssertionFailureError('The task does not exist');
147
+ }
148
+ if (state?.createdAt && state.createdAt.getTime() < Date.now() - this.cacheExpiry) {
149
+ throw new civkit_1.AssertionFailureError('The task has expired');
150
+ }
151
+ if (urls.length) {
152
+ const promises = Object.entries(state?.processed ?? {}).map(async ([url, cachePath]) => {
153
+ if (urls.includes(url)) {
154
+ const raw = await this.firebaseObjectStorage.downloadFile(cachePath);
155
+ state.processed[url] = JSON.parse(raw.toString('utf-8'));
156
+ }
157
+ });
158
+ await Promise.all(promises);
159
+ }
160
+ return state;
161
+ }
162
+ async singleCrawlQueue(shortDigest, url, token, meta) {
163
+ const error = {
164
+ reason: ''
165
+ };
166
+ const state = await adaptive_crawl_task_1.AdaptiveCrawlTask.fromFirestore(shortDigest);
167
+ if (state?.status === adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED) {
168
+ return;
169
+ }
170
+ try {
171
+ url = removeURLHash(url);
172
+ }
173
+ catch (e) {
174
+ error.reason = `Failed to parse url: ${url}`;
175
+ }
176
+ this.logger.debug(shortDigest, url, meta);
177
+ const cachePath = `adaptive-crawl-task/${shortDigest}/${md5Hasher.hash(url)}`;
178
+ if (!error.reason) {
179
+ const result = meta.useSitemap
180
+ ? await this.handleSingleCrawl(shortDigest, url, token, cachePath)
181
+ : await this.handleSingleCrawlRecursively(shortDigest, url, token, meta, cachePath);
182
+ if (!result) {
183
+ return;
184
+ }
185
+ error.reason = result.error.reason;
186
+ }
187
+ await adaptive_crawl_task_1.AdaptiveCrawlTask.DB.runTransaction(async (transaction) => {
188
+ const ref = adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest);
189
+ const state = await transaction.get(ref);
190
+ const data = state.data();
191
+ if (error.reason) {
192
+ data.failed[url] = error;
193
+ }
194
+ else {
195
+ data.processed[url] = cachePath;
196
+ }
197
+ const status = Object.keys(data.processed).length + Object.keys(data.failed).length >= data.urls.length
198
+ ? adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED : adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.PROCESSING;
199
+ const statusText = Object.keys(data.processed).length + Object.keys(data.failed).length >= data.urls.length
200
+ ? `Completed ${Object.keys(data.processed).length} Succeeded, ${Object.keys(data.failed).length} Failed`
201
+ : `Processing ${Object.keys(data.processed).length + Object.keys(data.failed).length}/${data.urls.length}`;
202
+ const payload = {
203
+ status,
204
+ statusText,
205
+ processed: data.processed,
206
+ failed: data.failed,
207
+ };
208
+ if (status === adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED) {
209
+ payload.finishedAt = new Date();
210
+ payload.duration = new Date().getTime() - data.createdAt.toDate().getTime();
211
+ }
212
+ transaction.update(ref, payload);
213
+ });
214
+ }
215
+ async handleSingleCrawl(shortDigest, url, token, cachePath) {
216
+ const error = {
217
+ reason: ''
218
+ };
219
+ const response = await fetch('https://r.jina.ai', {
220
+ method: 'POST',
221
+ headers: {
222
+ 'Content-Type': 'application/json',
223
+ 'Authorization': `Bearer ${token}`,
224
+ 'Accept': 'application/json',
225
+ },
226
+ body: JSON.stringify({ url })
227
+ });
228
+ if (!response.ok) {
229
+ error.reason = `Failed to crawl ${url}, ${response.statusText}`;
230
+ }
231
+ else {
232
+ const json = await response.json();
233
+ await this.firebaseObjectStorage.saveFile(cachePath, Buffer.from(JSON.stringify(json), 'utf-8'), {
234
+ metadata: {
235
+ contentType: 'application/json',
236
+ }
237
+ });
238
+ }
239
+ return {
240
+ error,
241
+ };
242
+ }
243
+ async handleSingleCrawlRecursively(shortDigest, url, token, meta, cachePath) {
244
+ const error = {
245
+ reason: ''
246
+ };
247
+ const response = await fetch('https://r.jina.ai', {
248
+ method: 'POST',
249
+ headers: {
250
+ 'Content-Type': 'application/json',
251
+ 'Authorization': `Bearer ${token}`,
252
+ 'Accept': 'application/json',
253
+ 'X-With-Links-Summary': 'true',
254
+ },
255
+ body: JSON.stringify({ url })
256
+ });
257
+ if (!response.ok) {
258
+ error.reason = `Failed to crawl ${url}, ${response.statusText}`;
259
+ }
260
+ else {
261
+ const json = await response.json();
262
+ await this.firebaseObjectStorage.saveFile(cachePath, Buffer.from(JSON.stringify(json), 'utf-8'), {
263
+ metadata: {
264
+ contentType: 'application/json',
265
+ }
266
+ });
267
+ const title = json.data.title;
268
+ const description = json.data.description;
269
+ const links = json.data.links;
270
+ const relevantUrls = await this.getRelevantUrls(token, { title, description, links });
271
+ this.logger.debug(`Total urls: ${Object.keys(links).length}, relevant urls: ${relevantUrls.length}`);
272
+ for (const url of relevantUrls) {
273
+ let abortContinue = false;
274
+ let abortBreak = false;
275
+ await adaptive_crawl_task_1.AdaptiveCrawlTask.DB.runTransaction(async (transaction) => {
276
+ const ref = adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest);
277
+ const state = await transaction.get(ref);
278
+ const data = state.data();
279
+ if (data.urls.includes(url)) {
280
+ this.logger.debug('Recursive CONTINUE', data);
281
+ abortContinue = true;
282
+ return;
283
+ }
284
+ const urls = [
285
+ ...data.urls,
286
+ url
287
+ ];
288
+ if (urls.length > meta.maxPages || data.status === adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED) {
289
+ this.logger.debug('Recursive BREAK', data);
290
+ abortBreak = true;
291
+ return;
292
+ }
293
+ transaction.update(ref, { urls });
294
+ });
295
+ if (abortContinue) {
296
+ continue;
297
+ }
298
+ if (abortBreak) {
299
+ break;
300
+ }
301
+ await (0, functions_1.getFunctions)().taskQueue(AdaptiveCrawlerHost_1.__singleCrawlQueueName).enqueue({
302
+ shortDigest, url, token, meta
303
+ }, {
304
+ dispatchDeadlineSeconds: 1800,
305
+ uri: await (0, get_function_url_1.getFunctionUrl)(AdaptiveCrawlerHost_1.__singleCrawlQueueName),
306
+ });
307
+ }
308
+ ;
309
+ }
310
+ return {
311
+ error,
312
+ };
313
+ }
314
+ async getRelevantUrls(token, { title, description, links }) {
315
+ const invalidSuffix = [
316
+ '.zip',
317
+ '.docx',
318
+ '.pptx',
319
+ '.xlsx',
320
+ ];
321
+ const validLinks = Object.entries(links)
322
+ .map(([title, link]) => link)
323
+ .filter(link => link.startsWith('http') && !invalidSuffix.some(suffix => link.endsWith(suffix)));
324
+ let query = '';
325
+ if (!description) {
326
+ query += title;
327
+ }
328
+ else {
329
+ query += `TITLE: ${title}; DESCRIPTION: ${description}`;
330
+ }
331
+ const data = {
332
+ model: 'jina-reranker-v2-base-multilingual',
333
+ query,
334
+ top_n: 15,
335
+ documents: validLinks,
336
+ };
337
+ const response = await fetch('https://api.jina.ai/v1/rerank', {
338
+ method: 'POST',
339
+ headers: {
340
+ 'Content-Type': 'application/json',
341
+ 'Authorization': `Bearer ${token}`
342
+ },
343
+ body: JSON.stringify(data)
344
+ });
345
+ const json = (await response.json());
346
+ const highestRelevanceScore = json.results[0]?.relevance_score ?? 0;
347
+ return json.results.filter(r => r.relevance_score > Math.max(highestRelevanceScore * 0.6, 0.1)).map(r => removeURLHash(r.document.text));
348
+ }
349
+ getIndex(user) {
350
+ // TODO: 需要更新使用方式
351
+ // const indexObject: Record<string, string | number | undefined> = Object.create(indexProto);
352
+ // Object.assign(indexObject, {
353
+ // usage1: 'https://r.jina.ai/YOUR_URL',
354
+ // usage2: 'https://s.jina.ai/YOUR_SEARCH_QUERY',
355
+ // homepage: 'https://jina.ai/reader',
356
+ // sourceCode: 'https://github.com/jina-ai/reader',
357
+ // });
358
+ // if (user) {
359
+ // indexObject[''] = undefined;
360
+ // indexObject.authenticatedAs = `${user.user_id} (${user.full_name})`;
361
+ // indexObject.balanceLeft = user.wallet.total_balance;
362
+ // }
363
+ // return indexObject;
364
+ }
365
+ async crawlUrlsFromSitemap(url, maxPages) {
366
+ const sitemapsFromRobotsTxt = await this.getSitemapsFromRobotsTxt(url);
367
+ const initialSitemaps = [];
368
+ if (sitemapsFromRobotsTxt === null) {
369
+ initialSitemaps.push(`${url.origin}/sitemap.xml`);
370
+ }
371
+ else {
372
+ initialSitemaps.push(...sitemapsFromRobotsTxt);
373
+ }
374
+ const allUrls = new Set();
375
+ const processedSitemaps = new Set();
376
+ const fetchSitemapUrls = async (sitemapUrl) => {
377
+ sitemapUrl = sitemapUrl.trim();
378
+ if (processedSitemaps.has(sitemapUrl)) {
379
+ return;
380
+ }
381
+ processedSitemaps.add(sitemapUrl);
382
+ try {
383
+ const response = await fetch(sitemapUrl);
384
+ const sitemapContent = await response.text();
385
+ const parser = new xmldom_1.DOMParser();
386
+ const xmlDoc = parser.parseFromString(sitemapContent, 'text/xml');
387
+ // handle normal sitemap
388
+ const urlElements = xmlDoc.getElementsByTagName('url');
389
+ for (let i = 0; i < urlElements.length; i++) {
390
+ const locElement = urlElements[i].getElementsByTagName('loc')[0];
391
+ if (locElement) {
392
+ const loc = locElement.textContent?.trim() || '';
393
+ if (loc.startsWith(url.origin) && !loc.endsWith('.xml')) {
394
+ allUrls.add(removeURLHash(loc));
395
+ }
396
+ if (allUrls.size >= maxPages) {
397
+ return;
398
+ }
399
+ }
400
+ }
401
+ // handle sitemap index
402
+ const sitemapElements = xmlDoc.getElementsByTagName('sitemap');
403
+ for (let i = 0; i < sitemapElements.length; i++) {
404
+ const locElement = sitemapElements[i].getElementsByTagName('loc')[0];
405
+ if (locElement) {
406
+ await fetchSitemapUrls(locElement.textContent?.trim() || '');
407
+ if (allUrls.size >= maxPages) {
408
+ return;
409
+ }
410
+ }
411
+ }
412
+ }
413
+ catch (error) {
414
+ this.logger.error(`Error fetching sitemap ${sitemapUrl}:`, error);
415
+ }
416
+ };
417
+ for (const sitemapUrl of initialSitemaps) {
418
+ await fetchSitemapUrls(sitemapUrl);
419
+ if (allUrls.size >= maxPages) {
420
+ break;
421
+ }
422
+ }
423
+ const urlsToProcess = Array.from(allUrls).slice(0, maxPages);
424
+ return urlsToProcess;
425
+ }
426
+ async getSitemapsFromRobotsTxt(url) {
427
+ const hostname = url.origin;
428
+ const robotsUrl = `${hostname}/robots.txt`;
429
+ const response = await fetch(robotsUrl);
430
+ if (response.status === 404) {
431
+ return null;
432
+ }
433
+ const robotsTxt = await response.text();
434
+ if (robotsTxt.length) {
435
+ const robot = (0, robots_parser_1.default)(robotsUrl, robotsTxt);
436
+ return robot.getSitemaps();
437
+ }
438
+ return null;
439
+ }
440
+ };
441
+ exports.AdaptiveCrawlerHost = AdaptiveCrawlerHost;
442
+ __decorate([
443
+ (0, shared_1.CloudHTTPv2)({
444
+ runtime: {
445
+ memory: '1GiB',
446
+ timeoutSeconds: 300,
447
+ concurrency: 22,
448
+ },
449
+ tags: ['Crawler'],
450
+ httpMethod: ['post', 'get'],
451
+ returnType: [String],
452
+ }),
453
+ __param(0, (0, shared_1.RPCReflect)()),
454
+ __param(1, (0, shared_1.Ctx)()),
455
+ __metadata("design:type", Function),
456
+ __metadata("design:paramtypes", [typeof (_c = typeof civkit_1.RPCReflection !== "undefined" && civkit_1.RPCReflection) === "function" ? _c : Object, Object, typeof (_d = typeof jina_embeddings_auth_1.JinaEmbeddingsAuthDTO !== "undefined" && jina_embeddings_auth_1.JinaEmbeddingsAuthDTO) === "function" ? _d : Object, crawler_options_1.CrawlerOptions,
457
+ adaptive_crawler_options_1.AdaptiveCrawlerOptions]),
458
+ __metadata("design:returntype", Promise)
459
+ ], AdaptiveCrawlerHost.prototype, "adaptiveCrawl", null);
460
+ __decorate([
461
+ (0, shared_1.CloudHTTPv2)({
462
+ runtime: {
463
+ memory: '1GiB',
464
+ timeoutSeconds: 300,
465
+ concurrency: 22,
466
+ },
467
+ tags: ['Crawler'],
468
+ httpMethod: ['post', 'get'],
469
+ returnType: adaptive_crawl_task_1.AdaptiveCrawlTask,
470
+ }),
471
+ __param(0, (0, shared_1.RPCReflect)()),
472
+ __param(1, (0, shared_1.Ctx)()),
473
+ __param(3, (0, shared_1.Param)('taskId')),
474
+ __param(4, (0, shared_1.Param)('urls')),
475
+ __metadata("design:type", Function),
476
+ __metadata("design:paramtypes", [typeof (_e = typeof civkit_1.RPCReflection !== "undefined" && civkit_1.RPCReflection) === "function" ? _e : Object, Object, typeof (_f = typeof jina_embeddings_auth_1.JinaEmbeddingsAuthDTO !== "undefined" && jina_embeddings_auth_1.JinaEmbeddingsAuthDTO) === "function" ? _f : Object, String, Array]),
477
+ __metadata("design:returntype", Promise)
478
+ ], AdaptiveCrawlerHost.prototype, "adaptiveCrawlStatus", null);
479
+ __decorate([
480
+ (0, shared_1.CloudTaskV2)({
481
+ name: AdaptiveCrawlerHost.__singleCrawlQueueName,
482
+ runtime: {
483
+ cpu: 1,
484
+ memory: '1GiB',
485
+ timeoutSeconds: 3600,
486
+ concurrency: 2,
487
+ maxInstances: 200,
488
+ retryConfig: {
489
+ maxAttempts: 3,
490
+ minBackoffSeconds: 60,
491
+ },
492
+ rateLimits: {
493
+ maxConcurrentDispatches: 150,
494
+ maxDispatchesPerSecond: 5,
495
+ },
496
+ }
497
+ }),
498
+ __param(0, (0, shared_1.Param)('shortDigest')),
499
+ __param(1, (0, shared_1.Param)('url')),
500
+ __param(2, (0, shared_1.Param)('token')),
501
+ __param(3, (0, shared_1.Param)('meta')),
502
+ __metadata("design:type", Function),
503
+ __metadata("design:paramtypes", [String, String, String, Object]),
504
+ __metadata("design:returntype", Promise)
505
+ ], AdaptiveCrawlerHost.prototype, "singleCrawlQueue", null);
506
+ exports.AdaptiveCrawlerHost = AdaptiveCrawlerHost = AdaptiveCrawlerHost_1 = __decorate([
507
+ (0, tsyringe_1.singleton)(),
508
+ __metadata("design:paramtypes", [typeof (_a = typeof shared_1.Logger !== "undefined" && shared_1.Logger) === "function" ? _a : Object, typeof (_b = typeof shared_1.FirebaseStorageBucketControl !== "undefined" && shared_1.FirebaseStorageBucketControl) === "function" ? _b : Object])
509
+ ], AdaptiveCrawlerHost);
510
+ //# sourceMappingURL=adaptive-crawler.js.map
build/cloud-functions/adaptive-crawler.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"adaptive-crawler.js","sourceRoot":"","sources":["../../src/cloud-functions/adaptive-crawler.ts"],"names":[],"mappings":"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"}
build/cloud-functions/data-crunching.js ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ var _a, _b, _c;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.DataCrunchingHost = void 0;
20
+ const civkit_1 = require("civkit");
21
+ const tsyringe_1 = require("tsyringe");
22
+ const shared_1 = require("../shared");
23
+ const lodash_1 = __importDefault(require("lodash"));
24
+ const crawler_1 = require("../api/crawler");
25
+ const crawled_1 = require("../db/crawled");
26
+ const dayjs_1 = __importDefault(require("dayjs"));
27
+ const fs_1 = require("fs");
28
+ const promises_1 = require("fs/promises");
29
+ const zlib_1 = require("zlib");
30
+ const functions_1 = require("firebase-admin/functions");
31
+ const snapshot_formatter_1 = require("../services/snapshot-formatter");
32
+ const get_function_url_1 = require("../utils/get-function-url");
33
+ dayjs_1.default.extend(require('dayjs/plugin/utc'));
34
+ let DataCrunchingHost = class DataCrunchingHost extends civkit_1.RPCHost {
35
+ constructor(globalLogger, crawler, snapshotFormatter, tempFileManager, firebaseObjectStorage) {
36
+ super(...lodash_1.default.without(arguments, crawler));
37
+ this.globalLogger = globalLogger;
38
+ this.crawler = crawler;
39
+ this.snapshotFormatter = snapshotFormatter;
40
+ this.tempFileManager = tempFileManager;
41
+ this.firebaseObjectStorage = firebaseObjectStorage;
42
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
43
+ this.pageCacheCrunchingPrefix = 'crunched-pages';
44
+ this.pageCacheCrunchingBatchSize = 5000;
45
+ this.pageCacheCrunchingTMinus = 6 * 24 * 60 * 60 * 1000;
46
+ this.rev = 7;
47
+ }
48
+ async init() {
49
+ await this.dependencyReady();
50
+ this.emit('ready');
51
+ }
52
+ // @CloudTaskV2({
53
+ // runtime: {
54
+ // cpu: 2,
55
+ // memory: '4GiB',
56
+ // timeoutSeconds: 3600,
57
+ // concurrency: 2,
58
+ // maxInstances: 200,
59
+ // retryConfig: {
60
+ // maxAttempts: 3,
61
+ // minBackoffSeconds: 60,
62
+ // },
63
+ // rateLimits: {
64
+ // maxConcurrentDispatches: 150,
65
+ // maxDispatchesPerSecond: 2,
66
+ // },
67
+ // },
68
+ // tags: ['DataCrunching'],
69
+ // })
70
+ async crunchPageCacheWorker(date, offset) {
71
+ this.logger.info(`Crunching page cache @${date}+${offset}...`);
72
+ for await (const { fileName, records } of this.iterPageCacheRecords(date, offset)) {
73
+ this.logger.info(`Crunching ${fileName}...`);
74
+ const fileOnDrive = await this.crunchCacheRecords(records);
75
+ const fstream = (0, fs_1.createReadStream)(fileOnDrive.path);
76
+ const gzipStream = (0, zlib_1.createGzip)();
77
+ fstream.pipe(gzipStream, { end: true });
78
+ await this.firebaseObjectStorage.bucket.file(fileName).save(gzipStream, {
79
+ contentType: 'application/jsonl+gzip',
80
+ });
81
+ }
82
+ this.logger.info(`Crunching page cache @${date}+${offset} done.`);
83
+ return true;
84
+ }
85
+ // @CloudScheduleV2('2 0 * * *', {
86
+ // name: 'crunchPageCacheEveryday',
87
+ // runtime: {
88
+ // cpu: 2,
89
+ // memory: '4GiB',
90
+ // timeoutSeconds: 1800,
91
+ // timeZone: 'UTC',
92
+ // retryCount: 3,
93
+ // minBackoffSeconds: 60,
94
+ // },
95
+ // tags: ['DataCrunching'],
96
+ // })
97
+ async dispatchPageCacheCrunching() {
98
+ for await (const { fileName, date, offset } of this.iterPageCacheChunks()) {
99
+ this.logger.info(`Dispatching ${fileName}...`);
100
+ // sse.write({ data: `Dispatching ${fileName}...` });
101
+ await (0, functions_1.getFunctions)().taskQueue('crunchPageCacheWorker').enqueue({ date, offset }, {
102
+ dispatchDeadlineSeconds: 1800,
103
+ uri: await (0, get_function_url_1.getFunctionUrl)('crunchPageCacheWorker'),
104
+ });
105
+ }
106
+ return true;
107
+ }
108
+ // @CloudHTTPv2({
109
+ // runtime: {
110
+ // cpu: 2,
111
+ // memory: '4GiB',
112
+ // timeoutSeconds: 3600,
113
+ // concurrency: 2,
114
+ // maxInstances: 200,
115
+ // },
116
+ // tags: ['DataCrunching'],
117
+ // })
118
+ // async dispatchPageCacheCrunching(
119
+ // @RPCReflect() rpcReflect: RPCReflection
120
+ // ) {
121
+ // const sse = new OutputServerEventStream({ highWaterMark: 4096 });
122
+ // rpcReflect.return(sse);
123
+ // rpcReflect.catch((err) => {
124
+ // sse.end({ data: `Error: ${err.message}` });
125
+ // });
126
+ // for await (const { fileName, date, offset } of this.iterPageCacheChunks()) {
127
+ // this.logger.info(`Dispatching ${fileName}...`);
128
+ // sse.write({ data: `Dispatching ${fileName}...` });
129
+ // await getFunctions().taskQueue('crunchPageCacheWorker').enqueue({ date, offset }, {
130
+ // dispatchDeadlineSeconds: 1800,
131
+ // uri: await getFunctionUrl('crunchPageCacheWorker'),
132
+ // });
133
+ // }
134
+ // sse.end({ data: 'done' });
135
+ // return true;
136
+ // }
137
+ async *iterPageCacheRecords(date, inputOffset) {
138
+ const startOfToday = (0, dayjs_1.default)().utc().startOf('day');
139
+ const startingPoint = (0, dayjs_1.default)().utc().subtract(this.pageCacheCrunchingTMinus, 'ms').startOf('day');
140
+ let theDay = startingPoint;
141
+ if (date) {
142
+ theDay = (0, dayjs_1.default)(date).utc().startOf('day');
143
+ }
144
+ let counter = 0;
145
+ if (inputOffset) {
146
+ counter = parseInt(inputOffset, 10);
147
+ }
148
+ while (theDay.isBefore(startOfToday)) {
149
+ const fileName = `${this.pageCacheCrunchingPrefix}/r${this.rev}/${theDay.format('YYYY-MM-DD')}/${counter}.jsonl.gz`;
150
+ const offset = counter;
151
+ counter += this.pageCacheCrunchingBatchSize;
152
+ const fileExists = (await this.firebaseObjectStorage.bucket.file(fileName).exists())[0];
153
+ if (fileExists) {
154
+ continue;
155
+ }
156
+ const records = await crawled_1.Crawled.fromFirestoreQuery(crawled_1.Crawled.COLLECTION
157
+ .where('createdAt', '>=', theDay.toDate())
158
+ .where('createdAt', '<', theDay.add(1, 'day').toDate())
159
+ .orderBy('createdAt', 'asc')
160
+ .offset(offset)
161
+ .limit(this.pageCacheCrunchingBatchSize));
162
+ this.logger.info(`Found ${records.length} records for ${theDay.format('YYYY-MM-DD')} at offset ${offset}`, { fileName, counter });
163
+ if (!records.length) {
164
+ if (date) {
165
+ break;
166
+ }
167
+ theDay = theDay.add(1, 'day');
168
+ counter = 0;
169
+ continue;
170
+ }
171
+ yield { fileName, records };
172
+ if (offset) {
173
+ break;
174
+ }
175
+ }
176
+ }
177
+ async *iterPageCacheChunks() {
178
+ const startOfToday = (0, dayjs_1.default)().utc().startOf('day');
179
+ const startingPoint = (0, dayjs_1.default)().utc().subtract(this.pageCacheCrunchingTMinus, 'ms').startOf('day');
180
+ let theDay = startingPoint;
181
+ let counter = 0;
182
+ while (theDay.isBefore(startOfToday)) {
183
+ const fileName = `${this.pageCacheCrunchingPrefix}/r${this.rev}/${theDay.format('YYYY-MM-DD')}/${counter}.jsonl.gz`;
184
+ const offset = counter;
185
+ counter += this.pageCacheCrunchingBatchSize;
186
+ const fileExists = (await this.firebaseObjectStorage.bucket.file(fileName).exists())[0];
187
+ if (fileExists) {
188
+ continue;
189
+ }
190
+ const nRecords = (await crawled_1.Crawled.COLLECTION
191
+ .where('createdAt', '>=', theDay.toDate())
192
+ .where('createdAt', '<', theDay.add(1, 'day').toDate())
193
+ .orderBy('createdAt', 'asc')
194
+ .offset(offset)
195
+ .limit(this.pageCacheCrunchingBatchSize)
196
+ .count().get()).data().count;
197
+ this.logger.info(`Found ${nRecords} records for ${theDay.format('YYYY-MM-DD')} at offset ${offset}`, { fileName, counter });
198
+ if (nRecords < this.pageCacheCrunchingBatchSize) {
199
+ theDay = theDay.add(1, 'day');
200
+ counter = 0;
201
+ }
202
+ if (nRecords) {
203
+ yield { fileName, date: theDay.toISOString(), offset };
204
+ }
205
+ }
206
+ }
207
+ async crunchCacheRecords(records) {
208
+ const throttle = new civkit_1.PromiseThrottle(30);
209
+ const localFilePath = this.tempFileManager.alloc();
210
+ let nextDrainDeferred = (0, civkit_1.Defer)();
211
+ nextDrainDeferred.resolve();
212
+ for (const record of records) {
213
+ await throttle.acquire();
214
+ this.firebaseObjectStorage.downloadFile(`snapshots/${record._id}`)
215
+ .then(async (snapshotTxt) => {
216
+ try {
217
+ const snapshot = JSON.parse(snapshotTxt.toString('utf-8'));
218
+ let formatted = await this.snapshotFormatter.formatSnapshot('default', snapshot);
219
+ if (!formatted.content) {
220
+ formatted = await this.snapshotFormatter.formatSnapshot('markdown', snapshot);
221
+ }
222
+ await nextDrainDeferred.promise;
223
+ await (0, promises_1.appendFile)(localFilePath, JSON.stringify({
224
+ url: snapshot.href,
225
+ title: snapshot.title || '',
226
+ html: snapshot.html || '',
227
+ text: snapshot.text || '',
228
+ content: formatted.content || '',
229
+ }) + '\n', { encoding: 'utf-8' });
230
+ }
231
+ catch (err) {
232
+ this.logger.warn(`Failed to parse snapshot for ${record._id}`, { err });
233
+ }
234
+ })
235
+ .finally(() => {
236
+ throttle.release();
237
+ });
238
+ }
239
+ await throttle.nextDrain();
240
+ const ro = {
241
+ path: localFilePath
242
+ };
243
+ this.tempFileManager.bindPathTo(ro, localFilePath);
244
+ return ro;
245
+ }
246
+ };
247
+ exports.DataCrunchingHost = DataCrunchingHost;
248
+ __decorate([
249
+ __param(0, (0, shared_1.Param)('date')),
250
+ __param(1, (0, shared_1.Param)('offset', { default: 0 })),
251
+ __metadata("design:type", Function),
252
+ __metadata("design:paramtypes", [String, Number]),
253
+ __metadata("design:returntype", Promise)
254
+ ], DataCrunchingHost.prototype, "crunchPageCacheWorker", null);
255
+ exports.DataCrunchingHost = DataCrunchingHost = __decorate([
256
+ (0, tsyringe_1.singleton)(),
257
+ __metadata("design:paramtypes", [typeof (_a = typeof shared_1.Logger !== "undefined" && shared_1.Logger) === "function" ? _a : Object, crawler_1.CrawlerHost,
258
+ snapshot_formatter_1.SnapshotFormatter, typeof (_b = typeof shared_1.TempFileManager !== "undefined" && shared_1.TempFileManager) === "function" ? _b : Object, typeof (_c = typeof shared_1.FirebaseStorageBucketControl !== "undefined" && shared_1.FirebaseStorageBucketControl) === "function" ? _c : Object])
259
+ ], DataCrunchingHost);
260
+ //# sourceMappingURL=data-crunching.js.map
build/cloud-functions/data-crunching.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"data-crunching.js","sourceRoot":"","sources":["../../src/cloud-functions/data-crunching.ts"],"names":[],"mappings":"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"}
build/db/adaptive-crawl-task.js ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AdaptiveCrawlTask_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AdaptiveCrawlTask = exports.AdaptiveCrawlTaskStatus = void 0;
14
+ const civkit_1 = require("civkit");
15
+ const firestore_1 = require("../shared/lib/firestore");
16
+ var AdaptiveCrawlTaskStatus;
17
+ (function (AdaptiveCrawlTaskStatus) {
18
+ AdaptiveCrawlTaskStatus["PENDING"] = "pending";
19
+ AdaptiveCrawlTaskStatus["PROCESSING"] = "processing";
20
+ AdaptiveCrawlTaskStatus["COMPLETED"] = "completed";
21
+ AdaptiveCrawlTaskStatus["FAILED"] = "failed";
22
+ })(AdaptiveCrawlTaskStatus || (exports.AdaptiveCrawlTaskStatus = AdaptiveCrawlTaskStatus = {}));
23
+ let AdaptiveCrawlTask = class AdaptiveCrawlTask extends firestore_1.FirestoreRecord {
24
+ static { AdaptiveCrawlTask_1 = this; }
25
+ static { this.collectionName = 'adaptiveCrawlTasks'; }
26
+ static { this.patchedFields = [
27
+ 'meta',
28
+ ]; }
29
+ static from(input) {
30
+ for (const field of this.patchedFields) {
31
+ if (typeof input[field] === 'string') {
32
+ input[field] = (0, civkit_1.parseJSONText)(input[field]);
33
+ }
34
+ }
35
+ return super.from(input);
36
+ }
37
+ degradeForFireStore() {
38
+ const copy = { ...this };
39
+ for (const field of this.constructor.patchedFields) {
40
+ if (typeof copy[field] === 'object') {
41
+ copy[field] = JSON.stringify(copy[field]);
42
+ }
43
+ }
44
+ return copy;
45
+ }
46
+ };
47
+ exports.AdaptiveCrawlTask = AdaptiveCrawlTask;
48
+ __decorate([
49
+ (0, civkit_1.Prop)({
50
+ required: true
51
+ }),
52
+ __metadata("design:type", String)
53
+ ], AdaptiveCrawlTask.prototype, "status", void 0);
54
+ __decorate([
55
+ (0, civkit_1.Prop)({
56
+ required: true
57
+ }),
58
+ __metadata("design:type", String)
59
+ ], AdaptiveCrawlTask.prototype, "statusText", void 0);
60
+ __decorate([
61
+ (0, civkit_1.Prop)(),
62
+ __metadata("design:type", Object)
63
+ ], AdaptiveCrawlTask.prototype, "meta", void 0);
64
+ __decorate([
65
+ (0, civkit_1.Prop)(),
66
+ __metadata("design:type", Array)
67
+ ], AdaptiveCrawlTask.prototype, "urls", void 0);
68
+ __decorate([
69
+ (0, civkit_1.Prop)(),
70
+ __metadata("design:type", Object)
71
+ ], AdaptiveCrawlTask.prototype, "processed", void 0);
72
+ __decorate([
73
+ (0, civkit_1.Prop)(),
74
+ __metadata("design:type", Object)
75
+ ], AdaptiveCrawlTask.prototype, "failed", void 0);
76
+ __decorate([
77
+ (0, civkit_1.Prop)(),
78
+ __metadata("design:type", Date)
79
+ ], AdaptiveCrawlTask.prototype, "createdAt", void 0);
80
+ __decorate([
81
+ (0, civkit_1.Prop)(),
82
+ __metadata("design:type", Date)
83
+ ], AdaptiveCrawlTask.prototype, "finishedAt", void 0);
84
+ __decorate([
85
+ (0, civkit_1.Prop)(),
86
+ __metadata("design:type", Number)
87
+ ], AdaptiveCrawlTask.prototype, "duration", void 0);
88
+ exports.AdaptiveCrawlTask = AdaptiveCrawlTask = AdaptiveCrawlTask_1 = __decorate([
89
+ (0, civkit_1.Also)({
90
+ dictOf: Object
91
+ })
92
+ ], AdaptiveCrawlTask);
93
+ //# sourceMappingURL=adaptive-crawl-task.js.map
build/db/adaptive-crawl-task.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"adaptive-crawl-task.js","sourceRoot":"","sources":["../../src/db/adaptive-crawl-task.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAG1D,IAAY,uBAKX;AALD,WAAY,uBAAuB;IAC/B,8CAAmB,CAAA;IACnB,oDAAyB,CAAA;IACzB,kDAAuB,CAAA;IACvB,4CAAiB,CAAA;AACrB,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAKM,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,2BAAe;;aAClC,mBAAc,GAAG,oBAAoB,AAAvB,CAAwB;aA2C/C,kBAAa,GAAG;QACnB,MAAM;KACT,AAFmB,CAElB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAsB,CAAC;IAClD,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAwC,CAAC,aAAa,EAAE,CAAC;YAC/E,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AApEQ,8CAAiB;AAQ1B;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;iDAC+B;AAKjC;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;qDACkB;AAGpB;IADC,IAAA,aAAI,GAAE;;+CAKL;AAGF;IADC,IAAA,aAAI,GAAE;;+CACS;AAGhB;IADC,IAAA,aAAI,GAAE;;oDAGL;AAGF;IADC,IAAA,aAAI,GAAE;;iDAGL;AAGF;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;oDAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACM,IAAI;qDAAC;AAGlB;IADC,IAAA,aAAI,GAAE;;mDACW;4BA1CT,iBAAiB;IAH7B,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,iBAAiB,CAuE7B"}
build/db/crawled.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var Crawled_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.Crawled = void 0;
14
+ const civkit_1 = require("civkit");
15
+ const firestore_1 = require("../shared/lib/firestore");
16
+ let Crawled = class Crawled extends firestore_1.FirestoreRecord {
17
+ static { Crawled_1 = this; }
18
+ static { this.collectionName = 'crawled'; }
19
+ static { this.patchedFields = [
20
+ 'snapshot'
21
+ ]; }
22
+ static from(input) {
23
+ for (const field of this.patchedFields) {
24
+ if (typeof input[field] === 'string') {
25
+ input[field] = (0, civkit_1.parseJSONText)(input[field]);
26
+ }
27
+ }
28
+ return super.from(input);
29
+ }
30
+ degradeForFireStore() {
31
+ const copy = { ...this };
32
+ for (const field of this.constructor.patchedFields) {
33
+ if (typeof copy[field] === 'object') {
34
+ copy[field] = JSON.stringify(copy[field]);
35
+ }
36
+ }
37
+ return copy;
38
+ }
39
+ };
40
+ exports.Crawled = Crawled;
41
+ __decorate([
42
+ (0, civkit_1.Prop)({
43
+ required: true
44
+ }),
45
+ __metadata("design:type", String)
46
+ ], Crawled.prototype, "url", void 0);
47
+ __decorate([
48
+ (0, civkit_1.Prop)({
49
+ required: true
50
+ }),
51
+ __metadata("design:type", String)
52
+ ], Crawled.prototype, "urlPathDigest", void 0);
53
+ __decorate([
54
+ (0, civkit_1.Prop)(),
55
+ __metadata("design:type", Boolean)
56
+ ], Crawled.prototype, "htmlSignificantlyModifiedByJs", void 0);
57
+ __decorate([
58
+ (0, civkit_1.Prop)(),
59
+ __metadata("design:type", Object)
60
+ ], Crawled.prototype, "snapshot", void 0);
61
+ __decorate([
62
+ (0, civkit_1.Prop)(),
63
+ __metadata("design:type", Boolean)
64
+ ], Crawled.prototype, "screenshotAvailable", void 0);
65
+ __decorate([
66
+ (0, civkit_1.Prop)(),
67
+ __metadata("design:type", Boolean)
68
+ ], Crawled.prototype, "pageshotAvailable", void 0);
69
+ __decorate([
70
+ (0, civkit_1.Prop)(),
71
+ __metadata("design:type", Boolean)
72
+ ], Crawled.prototype, "snapshotAvailable", void 0);
73
+ __decorate([
74
+ (0, civkit_1.Prop)(),
75
+ __metadata("design:type", Date)
76
+ ], Crawled.prototype, "createdAt", void 0);
77
+ __decorate([
78
+ (0, civkit_1.Prop)(),
79
+ __metadata("design:type", Date)
80
+ ], Crawled.prototype, "expireAt", void 0);
81
+ exports.Crawled = Crawled = Crawled_1 = __decorate([
82
+ (0, civkit_1.Also)({
83
+ dictOf: Object
84
+ })
85
+ ], Crawled);
86
+ //# sourceMappingURL=crawled.js.map
build/db/crawled.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"crawled.js","sourceRoot":"","sources":["../../src/db/crawled.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAOnD,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,2BAAe;;aACxB,mBAAc,GAAG,SAAS,AAAZ,CAAa;aAmCpC,kBAAa,GAAG;QACnB,UAAU;KACb,AAFmB,CAElB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAY,CAAC;IACxC,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAA8B,CAAC,aAAa,EAAE,CAAC;YACrE,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AA5DQ,0BAAO;AAQhB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;oCACW;AAKb;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;8CACqB;AAGvB;IADC,IAAA,aAAI,GAAE;;8DACiC;AAGxC;IADC,IAAA,aAAI,GAAE;;yCAC2D;AAGlE;IADC,IAAA,aAAI,GAAE;;oDACuB;AAG9B;IADC,IAAA,aAAI,GAAE;;kDACqB;AAG5B;IADC,IAAA,aAAI,GAAE;;kDACqB;AAG5B;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;0CAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;yCAAC;kBAlCP,OAAO;IAHnB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,OAAO,CA+DnB"}
build/db/domain-blockade.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DomainBlockade = void 0;
13
+ const civkit_1 = require("civkit");
14
+ const firestore_1 = require("../shared/lib/firestore");
15
+ let DomainBlockade = class DomainBlockade extends firestore_1.FirestoreRecord {
16
+ static { this.collectionName = 'domainBlockades'; }
17
+ };
18
+ exports.DomainBlockade = DomainBlockade;
19
+ __decorate([
20
+ (0, civkit_1.Prop)({
21
+ required: true
22
+ }),
23
+ __metadata("design:type", String)
24
+ ], DomainBlockade.prototype, "domain", void 0);
25
+ __decorate([
26
+ (0, civkit_1.Prop)({ required: true }),
27
+ __metadata("design:type", String)
28
+ ], DomainBlockade.prototype, "triggerReason", void 0);
29
+ __decorate([
30
+ (0, civkit_1.Prop)(),
31
+ __metadata("design:type", String)
32
+ ], DomainBlockade.prototype, "triggerUrl", void 0);
33
+ __decorate([
34
+ (0, civkit_1.Prop)(),
35
+ __metadata("design:type", Date)
36
+ ], DomainBlockade.prototype, "createdAt", void 0);
37
+ __decorate([
38
+ (0, civkit_1.Prop)(),
39
+ __metadata("design:type", Date)
40
+ ], DomainBlockade.prototype, "expireAt", void 0);
41
+ exports.DomainBlockade = DomainBlockade = __decorate([
42
+ (0, civkit_1.Also)({
43
+ dictOf: Object
44
+ })
45
+ ], DomainBlockade);
46
+ //# sourceMappingURL=domain-blockade.js.map
build/db/domain-blockade.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"domain-blockade.js","sourceRoot":"","sources":["../../src/db/domain-blockade.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AACpC,uDAA0D;AAKnD,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,2BAAe;aAC/B,mBAAc,GAAG,iBAAiB,AAApB,CAAqB;;AAD1C,wCAAc;AAQvB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;8CACc;AAGhB;IADC,IAAA,aAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDACF;AAGvB;IADC,IAAA,aAAI,GAAE;;kDACa;AAGpB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;iDAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;gDAAC;yBApBP,cAAc;IAH1B,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,cAAc,CAuB1B"}
build/db/domain-profile.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DomainProfile = void 0;
13
+ const civkit_1 = require("civkit");
14
+ const firestore_1 = require("../shared/lib/firestore");
15
+ const crawler_options_1 = require("../dto/crawler-options");
16
+ let DomainProfile = class DomainProfile extends firestore_1.FirestoreRecord {
17
+ static { this.collectionName = 'domainProfiles'; }
18
+ };
19
+ exports.DomainProfile = DomainProfile;
20
+ __decorate([
21
+ (0, civkit_1.Prop)({
22
+ required: true
23
+ }),
24
+ __metadata("design:type", String)
25
+ ], DomainProfile.prototype, "path", void 0);
26
+ __decorate([
27
+ (0, civkit_1.Prop)(),
28
+ __metadata("design:type", String)
29
+ ], DomainProfile.prototype, "triggerUrl", void 0);
30
+ __decorate([
31
+ (0, civkit_1.Prop)({ required: true, type: crawler_options_1.ENGINE_TYPE }),
32
+ __metadata("design:type", String)
33
+ ], DomainProfile.prototype, "engine", void 0);
34
+ __decorate([
35
+ (0, civkit_1.Prop)(),
36
+ __metadata("design:type", Date)
37
+ ], DomainProfile.prototype, "createdAt", void 0);
38
+ __decorate([
39
+ (0, civkit_1.Prop)(),
40
+ __metadata("design:type", Date)
41
+ ], DomainProfile.prototype, "expireAt", void 0);
42
+ exports.DomainProfile = DomainProfile = __decorate([
43
+ (0, civkit_1.Also)({
44
+ dictOf: Object
45
+ })
46
+ ], DomainProfile);
47
+ //# sourceMappingURL=domain-profile.js.map
build/db/domain-profile.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"domain-profile.js","sourceRoot":"","sources":["../../src/db/domain-profile.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AACpC,uDAA0D;AAC1D,4DAAqD;AAK9C,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,2BAAe;aAC9B,mBAAc,GAAG,gBAAgB,AAAnB,CAAoB;;AADzC,sCAAa;AAQtB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;2CACY;AAGd;IADC,IAAA,aAAI,GAAE;;iDACa;AAGpB;IADC,IAAA,aAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,6BAAW,EAAE,CAAC;;6CAC5B;AAGhB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;gDAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;+CAAC;wBApBP,aAAa;IAHzB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,aAAa,CAuBzB"}
build/db/img-alt.js ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ImgAlt = void 0;
13
+ const civkit_1 = require("civkit");
14
+ const firestore_1 = require("../shared/lib/firestore");
15
+ let ImgAlt = class ImgAlt extends firestore_1.FirestoreRecord {
16
+ static { this.collectionName = 'imgAlts'; }
17
+ };
18
+ exports.ImgAlt = ImgAlt;
19
+ __decorate([
20
+ (0, civkit_1.Prop)({
21
+ required: true
22
+ }),
23
+ __metadata("design:type", String)
24
+ ], ImgAlt.prototype, "src", void 0);
25
+ __decorate([
26
+ (0, civkit_1.Prop)({
27
+ required: true
28
+ }),
29
+ __metadata("design:type", String)
30
+ ], ImgAlt.prototype, "urlDigest", void 0);
31
+ __decorate([
32
+ (0, civkit_1.Prop)(),
33
+ __metadata("design:type", Number)
34
+ ], ImgAlt.prototype, "width", void 0);
35
+ __decorate([
36
+ (0, civkit_1.Prop)(),
37
+ __metadata("design:type", Number)
38
+ ], ImgAlt.prototype, "height", void 0);
39
+ __decorate([
40
+ (0, civkit_1.Prop)(),
41
+ __metadata("design:type", String)
42
+ ], ImgAlt.prototype, "generatedAlt", void 0);
43
+ __decorate([
44
+ (0, civkit_1.Prop)(),
45
+ __metadata("design:type", String)
46
+ ], ImgAlt.prototype, "originalAlt", void 0);
47
+ __decorate([
48
+ (0, civkit_1.Prop)(),
49
+ __metadata("design:type", Date)
50
+ ], ImgAlt.prototype, "createdAt", void 0);
51
+ __decorate([
52
+ (0, civkit_1.Prop)(),
53
+ __metadata("design:type", Date)
54
+ ], ImgAlt.prototype, "expireAt", void 0);
55
+ exports.ImgAlt = ImgAlt = __decorate([
56
+ (0, civkit_1.Also)({
57
+ dictOf: Object
58
+ })
59
+ ], ImgAlt);
60
+ //# sourceMappingURL=img-alt.js.map
build/db/img-alt.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"img-alt.js","sourceRoot":"","sources":["../../src/db/img-alt.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AACpC,uDAA0D;AAMnD,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,2BAAe;aACvB,mBAAc,GAAG,SAAS,AAAZ,CAAa;;AADlC,wBAAM;AAQf;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;mCACW;AAKb;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;yCACiB;AAGnB;IADC,IAAA,aAAI,GAAE;;qCACQ;AAGf;IADC,IAAA,aAAI,GAAE;;sCACS;AAGhB;IADC,IAAA,aAAI,GAAE;;4CACe;AAGtB;IADC,IAAA,aAAI,GAAE;;2CACc;AAGrB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;yCAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;wCAAC;iBA/BP,MAAM;IAHlB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,MAAM,CAkClB"}
build/db/pdf.js ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var PDFContent_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PDFContent = void 0;
14
+ const civkit_1 = require("civkit");
15
+ const firestore_1 = require("../shared/lib/firestore");
16
+ let PDFContent = class PDFContent extends firestore_1.FirestoreRecord {
17
+ static { PDFContent_1 = this; }
18
+ static { this.collectionName = 'pdfs'; }
19
+ static { this.patchedFields = [
20
+ 'meta'
21
+ ]; }
22
+ static from(input) {
23
+ for (const field of this.patchedFields) {
24
+ if (typeof input[field] === 'string') {
25
+ input[field] = (0, civkit_1.parseJSONText)(input[field]);
26
+ }
27
+ }
28
+ return super.from(input);
29
+ }
30
+ degradeForFireStore() {
31
+ const copy = { ...this };
32
+ for (const field of this.constructor.patchedFields) {
33
+ if (typeof copy[field] === 'object') {
34
+ copy[field] = JSON.stringify(copy[field]);
35
+ }
36
+ }
37
+ return copy;
38
+ }
39
+ };
40
+ exports.PDFContent = PDFContent;
41
+ __decorate([
42
+ (0, civkit_1.Prop)({
43
+ required: true
44
+ }),
45
+ __metadata("design:type", String)
46
+ ], PDFContent.prototype, "src", void 0);
47
+ __decorate([
48
+ (0, civkit_1.Prop)({
49
+ required: true
50
+ }),
51
+ __metadata("design:type", String)
52
+ ], PDFContent.prototype, "urlDigest", void 0);
53
+ __decorate([
54
+ (0, civkit_1.Prop)(),
55
+ __metadata("design:type", Object)
56
+ ], PDFContent.prototype, "meta", void 0);
57
+ __decorate([
58
+ (0, civkit_1.Prop)(),
59
+ __metadata("design:type", String)
60
+ ], PDFContent.prototype, "text", void 0);
61
+ __decorate([
62
+ (0, civkit_1.Prop)(),
63
+ __metadata("design:type", String)
64
+ ], PDFContent.prototype, "content", void 0);
65
+ __decorate([
66
+ (0, civkit_1.Prop)(),
67
+ __metadata("design:type", Date)
68
+ ], PDFContent.prototype, "createdAt", void 0);
69
+ __decorate([
70
+ (0, civkit_1.Prop)(),
71
+ __metadata("design:type", Date)
72
+ ], PDFContent.prototype, "expireAt", void 0);
73
+ exports.PDFContent = PDFContent = PDFContent_1 = __decorate([
74
+ (0, civkit_1.Also)({
75
+ dictOf: Object
76
+ })
77
+ ], PDFContent);
78
+ //# sourceMappingURL=pdf.js.map
build/db/pdf.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/db/pdf.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAMnD,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,2BAAe;;aAC3B,mBAAc,GAAG,MAAM,AAAT,CAAU;aA6BjC,kBAAa,GAAG;QACnB,MAAM;KACT,AAFmB,CAElB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAe,CAAC;IAC3C,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAiC,CAAC,aAAa,EAAE,CAAC;YACxE,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AAtDQ,gCAAU;AAQnB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;uCACW;AAKb;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;6CACiB;AAGnB;IADC,IAAA,aAAI,GAAE;;wCACsB;AAG7B;IADC,IAAA,aAAI,GAAE;;wCACO;AAGd;IADC,IAAA,aAAI,GAAE;;2CACU;AAGjB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;6CAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;4CAAC;qBA5BP,UAAU;IAHtB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,UAAU,CAyDtB"}
build/db/searched.js ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var SearchResult_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SERPResult = exports.SerperSearchResult = exports.SearchResult = void 0;
14
+ const civkit_1 = require("civkit");
15
+ const firestore_1 = require("../shared/lib/firestore");
16
+ let SearchResult = class SearchResult extends firestore_1.FirestoreRecord {
17
+ static { SearchResult_1 = this; }
18
+ static { this.collectionName = 'searchResults'; }
19
+ static { this.patchedFields = [
20
+ 'query',
21
+ 'response',
22
+ ]; }
23
+ static from(input) {
24
+ for (const field of this.patchedFields) {
25
+ if (typeof input[field] === 'string') {
26
+ input[field] = (0, civkit_1.parseJSONText)(input[field]);
27
+ }
28
+ }
29
+ return super.from(input);
30
+ }
31
+ degradeForFireStore() {
32
+ const copy = { ...this };
33
+ for (const field of this.constructor.patchedFields) {
34
+ if (typeof copy[field] === 'object') {
35
+ copy[field] = JSON.stringify(copy[field]);
36
+ }
37
+ }
38
+ return copy;
39
+ }
40
+ };
41
+ exports.SearchResult = SearchResult;
42
+ __decorate([
43
+ (0, civkit_1.Prop)({
44
+ required: true
45
+ }),
46
+ __metadata("design:type", Object)
47
+ ], SearchResult.prototype, "query", void 0);
48
+ __decorate([
49
+ (0, civkit_1.Prop)({
50
+ required: true
51
+ }),
52
+ __metadata("design:type", String)
53
+ ], SearchResult.prototype, "queryDigest", void 0);
54
+ __decorate([
55
+ (0, civkit_1.Prop)(),
56
+ __metadata("design:type", Object)
57
+ ], SearchResult.prototype, "response", void 0);
58
+ __decorate([
59
+ (0, civkit_1.Prop)(),
60
+ __metadata("design:type", Date)
61
+ ], SearchResult.prototype, "createdAt", void 0);
62
+ __decorate([
63
+ (0, civkit_1.Prop)(),
64
+ __metadata("design:type", Date)
65
+ ], SearchResult.prototype, "expireAt", void 0);
66
+ exports.SearchResult = SearchResult = SearchResult_1 = __decorate([
67
+ (0, civkit_1.Also)({
68
+ dictOf: Object
69
+ })
70
+ ], SearchResult);
71
+ class SerperSearchResult extends SearchResult {
72
+ static { this.collectionName = 'serperSearchResults'; }
73
+ }
74
+ exports.SerperSearchResult = SerperSearchResult;
75
+ class SERPResult extends SearchResult {
76
+ static { this.collectionName = 'SERPResults'; }
77
+ }
78
+ exports.SERPResult = SERPResult;
79
+ //# sourceMappingURL=searched.js.map
build/db/searched.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"searched.js","sourceRoot":"","sources":["../../src/db/searched.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAMnD,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,2BAAe;;aAC7B,mBAAc,GAAG,eAAe,AAAlB,CAAmB;aAyB1C,kBAAa,GAAG;QACnB,OAAO;QACP,UAAU;KACb,AAHmB,CAGlB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAiB,CAAC;IAC7C,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAmC,CAAC,aAAa,EAAE,CAAC;YAC1E,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AAnDQ,oCAAY;AAQrB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;2CACU;AAKZ;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;iDACmB;AAGrB;IADC,IAAA,aAAI,GAAE;;8CACQ;AAGf;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;+CAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;8CAAC;uBAtBP,YAAY;IAHxB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,YAAY,CAoDxB;AAED,MAAa,kBAAmB,SAAQ,YAAY;aAChC,mBAAc,GAAG,qBAAqB,CAAC;;AAD3D,gDAEC;AAED,MAAa,UAAW,SAAQ,YAAY;aACxB,mBAAc,GAAG,aAAa,CAAC;;AADnD,gCAEC"}
build/dto/adaptive-crawler-options.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AdaptiveCrawlerOptions = void 0;
13
+ const civkit_1 = require("civkit");
14
+ let AdaptiveCrawlerOptions = class AdaptiveCrawlerOptions extends civkit_1.AutoCastable {
15
+ static from(input) {
16
+ const instance = super.from(input);
17
+ const ctx = Reflect.get(input, civkit_1.RPC_CALL_ENVIRONMENT);
18
+ let maxPages = parseInt(ctx?.req.get('x-max-pages') || '');
19
+ if (!isNaN(maxPages) && maxPages > 0) {
20
+ instance.maxPages = maxPages <= 100 ? maxPages : 100;
21
+ }
22
+ const useSitemap = ctx?.req.get('x-use-sitemap');
23
+ if (useSitemap !== undefined) {
24
+ instance.useSitemap = Boolean(useSitemap);
25
+ }
26
+ return instance;
27
+ }
28
+ };
29
+ exports.AdaptiveCrawlerOptions = AdaptiveCrawlerOptions;
30
+ __decorate([
31
+ (0, civkit_1.Prop)({
32
+ default: true,
33
+ desc: 'Use sitemap to crawl the website.',
34
+ }),
35
+ __metadata("design:type", Boolean)
36
+ ], AdaptiveCrawlerOptions.prototype, "useSitemap", void 0);
37
+ __decorate([
38
+ (0, civkit_1.Prop)({
39
+ default: 10,
40
+ desc: 'Max number of pages to crawl.',
41
+ validate: (v) => v >= 1 && v <= 100,
42
+ }),
43
+ __metadata("design:type", Number)
44
+ ], AdaptiveCrawlerOptions.prototype, "maxPages", void 0);
45
+ exports.AdaptiveCrawlerOptions = AdaptiveCrawlerOptions = __decorate([
46
+ (0, civkit_1.Also)({
47
+ openapi: {
48
+ operation: {
49
+ parameters: {
50
+ 'X-Use-Sitemap': {
51
+ description: 'Use sitemap to crawl the website.',
52
+ in: 'header',
53
+ schema: { type: 'string' }
54
+ },
55
+ 'X-Max-Depth': {
56
+ description: 'Max deep level to crawl.',
57
+ in: 'header',
58
+ schema: { type: 'string' }
59
+ },
60
+ 'X-Max-Pages': {
61
+ description: 'Max number of pages to crawl.',
62
+ in: 'header',
63
+ schema: { type: 'string' }
64
+ },
65
+ }
66
+ }
67
+ }
68
+ })
69
+ ], AdaptiveCrawlerOptions);
70
+ //# sourceMappingURL=adaptive-crawler-options.js.map
build/dto/adaptive-crawler-options.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"adaptive-crawler-options.js","sourceRoot":"","sources":["../../src/dto/adaptive-crawler-options.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAwE;AA2BjE,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,qBAAY;IAcpD,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAA2B,CAAC;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,6BAAoB,CAGtC,CAAC;QAEd,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ,CAAA;AAjCY,wDAAsB;AAK/B;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,mCAAmC;KAC5C,CAAC;;0DACmB;AAOrB;IALC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,+BAA+B;QACrC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG;KAC9C,CAAC;;wDACgB;iCAZT,sBAAsB;IAvBlC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE;YACL,SAAS,EAAE;gBACP,UAAU,EAAE;oBACR,eAAe,EAAE;wBACb,WAAW,EAAE,mCAAmC;wBAChD,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC7B;oBACD,aAAa,EAAE;wBACX,WAAW,EAAE,0BAA0B;wBACvC,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC7B;oBACD,aAAa,EAAE;wBACX,WAAW,EAAE,+BAA+B;wBAC5C,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC7B;iBACJ;aACJ;SACJ;KACJ,CAAC;GACW,sBAAsB,CAiClC"}
build/dto/crawler-options.js ADDED
@@ -0,0 +1,753 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var _a;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CrawlerOptionsHeaderOnly = exports.CrawlerOptions = exports.BASE_URL_MODES = exports.IMAGE_RETENTION_MODES = exports.RESPOND_TIMING = exports.ENGINE_TYPE = exports.CONTENT_FORMAT = void 0;
14
+ const civ_rpc_1 = require("civkit/civ-rpc");
15
+ const fancy_file_1 = require("civkit/fancy-file");
16
+ const set_cookie_parser_1 = require("set-cookie-parser");
17
+ const turndown_tweakable_options_1 = require("./turndown-tweakable-options");
18
+ var CONTENT_FORMAT;
19
+ (function (CONTENT_FORMAT) {
20
+ CONTENT_FORMAT["CONTENT"] = "content";
21
+ CONTENT_FORMAT["MARKDOWN"] = "markdown";
22
+ CONTENT_FORMAT["HTML"] = "html";
23
+ CONTENT_FORMAT["TEXT"] = "text";
24
+ CONTENT_FORMAT["PAGESHOT"] = "pageshot";
25
+ CONTENT_FORMAT["SCREENSHOT"] = "screenshot";
26
+ CONTENT_FORMAT["VLM"] = "vlm";
27
+ CONTENT_FORMAT["READER_LM"] = "readerlm-v2";
28
+ })(CONTENT_FORMAT || (exports.CONTENT_FORMAT = CONTENT_FORMAT = {}));
29
+ var ENGINE_TYPE;
30
+ (function (ENGINE_TYPE) {
31
+ ENGINE_TYPE["AUTO"] = "auto";
32
+ ENGINE_TYPE["BROWSER"] = "browser";
33
+ ENGINE_TYPE["CURL"] = "curl";
34
+ ENGINE_TYPE["CF_BROWSER_RENDERING"] = "cf-browser-rendering";
35
+ })(ENGINE_TYPE || (exports.ENGINE_TYPE = ENGINE_TYPE = {}));
36
+ var RESPOND_TIMING;
37
+ (function (RESPOND_TIMING) {
38
+ RESPOND_TIMING["HTML"] = "html";
39
+ RESPOND_TIMING["VISIBLE_CONTENT"] = "visible-content";
40
+ RESPOND_TIMING["MUTATION_IDLE"] = "mutation-idle";
41
+ RESPOND_TIMING["RESOURCE_IDLE"] = "resource-idle";
42
+ RESPOND_TIMING["MEDIA_IDLE"] = "media-idle";
43
+ RESPOND_TIMING["NETWORK_IDLE"] = "network-idle";
44
+ })(RESPOND_TIMING || (exports.RESPOND_TIMING = RESPOND_TIMING = {}));
45
+ const CONTENT_FORMAT_VALUES = new Set(Object.values(CONTENT_FORMAT));
46
+ exports.IMAGE_RETENTION_MODES = ['none', 'all', 'alt', 'all_p', 'alt_p'];
47
+ const IMAGE_RETENTION_MODE_VALUES = new Set(exports.IMAGE_RETENTION_MODES);
48
+ exports.BASE_URL_MODES = ['initial', 'final'];
49
+ const BASE_URL_MODE_VALUES = new Set(exports.BASE_URL_MODES);
50
+ class Viewport extends civ_rpc_1.AutoCastable {
51
+ }
52
+ __decorate([
53
+ (0, civ_rpc_1.Prop)({
54
+ default: 1024
55
+ }),
56
+ __metadata("design:type", Number)
57
+ ], Viewport.prototype, "width", void 0);
58
+ __decorate([
59
+ (0, civ_rpc_1.Prop)({
60
+ default: 1024
61
+ }),
62
+ __metadata("design:type", Number)
63
+ ], Viewport.prototype, "height", void 0);
64
+ __decorate([
65
+ (0, civ_rpc_1.Prop)(),
66
+ __metadata("design:type", Number)
67
+ ], Viewport.prototype, "deviceScaleFactor", void 0);
68
+ __decorate([
69
+ (0, civ_rpc_1.Prop)(),
70
+ __metadata("design:type", Boolean)
71
+ ], Viewport.prototype, "isMobile", void 0);
72
+ __decorate([
73
+ (0, civ_rpc_1.Prop)(),
74
+ __metadata("design:type", Boolean)
75
+ ], Viewport.prototype, "isLandscape", void 0);
76
+ __decorate([
77
+ (0, civ_rpc_1.Prop)(),
78
+ __metadata("design:type", Boolean)
79
+ ], Viewport.prototype, "hasTouch", void 0);
80
+ let CrawlerOptions = class CrawlerOptions extends civ_rpc_1.AutoCastable {
81
+ static from(input) {
82
+ const instance = super.from(input);
83
+ const ctx = Reflect.get(input, civ_rpc_1.RPC_CALL_ENVIRONMENT);
84
+ const customMode = ctx?.get('x-respond-with') || ctx?.get('x-return-format');
85
+ if (customMode) {
86
+ instance.respondWith = customMode;
87
+ }
88
+ if (instance.respondWith) {
89
+ instance.respondWith = instance.respondWith.toLowerCase();
90
+ }
91
+ if (instance.respondWith?.includes('lm')) {
92
+ if (instance.respondWith.includes('content') || instance.respondWith.includes('markdown')) {
93
+ throw new civ_rpc_1.ParamValidationError({
94
+ path: 'respondWith',
95
+ message: `LM formats conflicts with content/markdown.`,
96
+ });
97
+ }
98
+ }
99
+ const locale = ctx?.get('x-locale');
100
+ if (locale) {
101
+ instance.locale = locale;
102
+ }
103
+ const referer = ctx?.get('x-referer');
104
+ if (referer) {
105
+ instance.referer = referer;
106
+ }
107
+ const withGeneratedAlt = ctx?.get('x-with-generated-alt');
108
+ if (withGeneratedAlt) {
109
+ instance.withGeneratedAlt = Boolean(withGeneratedAlt);
110
+ }
111
+ const withLinksSummary = ctx?.get('x-with-links-summary');
112
+ if (withLinksSummary) {
113
+ if (withLinksSummary === 'all') {
114
+ instance.withLinksSummary = withLinksSummary;
115
+ }
116
+ else {
117
+ instance.withLinksSummary = Boolean(withLinksSummary);
118
+ }
119
+ }
120
+ const withImagesSummary = ctx?.get('x-with-images-summary');
121
+ if (withImagesSummary) {
122
+ instance.withImagesSummary = Boolean(withImagesSummary);
123
+ }
124
+ const retainImages = ctx?.get('x-retain-images');
125
+ if (retainImages && IMAGE_RETENTION_MODE_VALUES.has(retainImages)) {
126
+ instance.retainImages = retainImages;
127
+ }
128
+ if (instance.withGeneratedAlt) {
129
+ instance.retainImages = 'all_p';
130
+ }
131
+ const noCache = ctx?.get('x-no-cache');
132
+ if (noCache) {
133
+ instance.noCache = Boolean(noCache);
134
+ }
135
+ if (instance.noCache && instance.cacheTolerance === undefined) {
136
+ instance.cacheTolerance = 0;
137
+ }
138
+ let cacheTolerance = parseInt(ctx?.get('x-cache-tolerance') || '');
139
+ if (!isNaN(cacheTolerance)) {
140
+ instance.cacheTolerance = cacheTolerance;
141
+ }
142
+ const noGfm = ctx?.get('x-no-gfm');
143
+ if (noGfm) {
144
+ instance.noGfm = noGfm === 'table' ? noGfm : Boolean(noGfm);
145
+ }
146
+ let timeoutSeconds = parseInt(ctx?.get('x-timeout') || '');
147
+ if (!isNaN(timeoutSeconds) && timeoutSeconds > 0) {
148
+ instance.timeout = timeoutSeconds <= 180 ? timeoutSeconds : 180;
149
+ }
150
+ else if (ctx?.get('x-timeout')) {
151
+ instance.timeout = null;
152
+ }
153
+ const removeSelector = ctx?.get('x-remove-selector')?.split(', ').filter(Boolean);
154
+ instance.removeSelector ??= removeSelector?.length ? removeSelector : undefined;
155
+ const targetSelector = ctx?.get('x-target-selector')?.split(', ').filter(Boolean);
156
+ instance.targetSelector ??= targetSelector?.length ? targetSelector : undefined;
157
+ const waitForSelector = ctx?.get('x-wait-for-selector')?.split(', ').filter(Boolean);
158
+ instance.waitForSelector ??= (waitForSelector?.length ? waitForSelector : undefined) || instance.targetSelector;
159
+ const overrideUserAgent = ctx?.get('x-user-agent') || undefined;
160
+ instance.userAgent ??= overrideUserAgent;
161
+ const engine = ctx?.get('x-engine');
162
+ if (engine) {
163
+ instance.engine = engine;
164
+ }
165
+ if (instance.engine) {
166
+ instance.engine = instance.engine.toLowerCase();
167
+ }
168
+ if (instance.engine === 'vlm') {
169
+ instance.engine = ENGINE_TYPE.BROWSER;
170
+ instance.respondWith = CONTENT_FORMAT.VLM;
171
+ }
172
+ else if (instance.engine === 'readerlm-v2') {
173
+ instance.engine = ENGINE_TYPE.AUTO;
174
+ instance.respondWith = CONTENT_FORMAT.READER_LM;
175
+ }
176
+ const keepImgDataUrl = ctx?.get('x-keep-img-data-url');
177
+ if (keepImgDataUrl) {
178
+ instance.keepImgDataUrl = Boolean(keepImgDataUrl);
179
+ }
180
+ const withIframe = ctx?.get('x-with-iframe');
181
+ if (withIframe) {
182
+ instance.withIframe = withIframe.toLowerCase() === 'quoted' ? 'quoted' : Boolean(withIframe);
183
+ }
184
+ if (instance.withIframe) {
185
+ instance.timeout ??= null;
186
+ }
187
+ const withShadowDom = ctx?.get('x-with-shadow-dom');
188
+ if (withShadowDom) {
189
+ instance.withShadowDom = Boolean(withShadowDom);
190
+ }
191
+ if (instance.withShadowDom) {
192
+ instance.timeout ??= null;
193
+ }
194
+ const cookies = [];
195
+ const setCookieHeaders = (ctx?.get('x-set-cookie')?.split(', ') || instance.setCookies).filter(Boolean);
196
+ if (Array.isArray(setCookieHeaders)) {
197
+ for (const setCookie of setCookieHeaders) {
198
+ cookies.push({
199
+ ...(0, set_cookie_parser_1.parseString)(setCookie, { decodeValues: true }),
200
+ });
201
+ }
202
+ }
203
+ else if (setCookieHeaders && typeof setCookieHeaders === 'string') {
204
+ cookies.push({
205
+ ...(0, set_cookie_parser_1.parseString)(setCookieHeaders, { decodeValues: true }),
206
+ });
207
+ }
208
+ instance.setCookies = cookies;
209
+ const proxyUrl = ctx?.get('x-proxy-url');
210
+ instance.proxyUrl ??= proxyUrl || undefined;
211
+ const proxy = ctx?.get('x-proxy');
212
+ instance.proxy ??= proxy || undefined;
213
+ const robotsTxt = ctx?.get('x-robots-txt');
214
+ instance.robotsTxt ??= robotsTxt || undefined;
215
+ const tokenBudget = ctx?.get('x-token-budget');
216
+ instance.tokenBudget ??= parseInt(tokenBudget || '') || undefined;
217
+ const baseMode = ctx?.get('x-base');
218
+ if (baseMode) {
219
+ instance.base = baseMode;
220
+ }
221
+ const dnt = ctx?.get('dnt');
222
+ instance.doNotTrack ??= (parseInt(dnt || '') || null);
223
+ const respondTiming = ctx?.get('x-respond-timing');
224
+ if (respondTiming) {
225
+ instance.respondTiming ??= respondTiming;
226
+ }
227
+ if (instance.cacheTolerance) {
228
+ instance.cacheTolerance = instance.cacheTolerance * 1000;
229
+ }
230
+ if (ctx) {
231
+ instance.markdown ??= turndown_tweakable_options_1.TurnDownTweakableOptions.fromCtx(ctx);
232
+ }
233
+ return instance;
234
+ }
235
+ get presumedRespondTiming() {
236
+ if (this.respondTiming) {
237
+ return this.respondTiming;
238
+ }
239
+ if (this.timeout && this.timeout >= 20) {
240
+ return RESPOND_TIMING.NETWORK_IDLE;
241
+ }
242
+ if (this.respondWith.includes('shot') || this.respondWith.includes('vlm')) {
243
+ return RESPOND_TIMING.MEDIA_IDLE;
244
+ }
245
+ return RESPOND_TIMING.RESOURCE_IDLE;
246
+ }
247
+ isSnapshotAcceptableForEarlyResponse(snapshot) {
248
+ if (this.waitForSelector?.length) {
249
+ return false;
250
+ }
251
+ const presumedTiming = this.presumedRespondTiming;
252
+ if (presumedTiming === RESPOND_TIMING.MEDIA_IDLE && snapshot.lastMediaResourceLoaded && snapshot.lastMutationIdle) {
253
+ const now = Date.now();
254
+ if ((Math.max(snapshot.lastMediaResourceLoaded, snapshot.lastContentResourceLoaded || 0) + 500) < now) {
255
+ return true;
256
+ }
257
+ }
258
+ if ((this.respondWith.includes('vlm') || this.respondWith.includes('pageshot')) && !snapshot.pageshot) {
259
+ return false;
260
+ }
261
+ if ((this.respondWith.includes('vlm') || this.respondWith.includes('screenshot')) && !snapshot.screenshot) {
262
+ return false;
263
+ }
264
+ if (presumedTiming === RESPOND_TIMING.RESOURCE_IDLE && snapshot.lastContentResourceLoaded && snapshot.lastMutationIdle) {
265
+ const now = Date.now();
266
+ if ((snapshot.lastContentResourceLoaded + 500) < now) {
267
+ return true;
268
+ }
269
+ }
270
+ if (this.injectFrameScript?.length || this.injectPageScript?.length) {
271
+ return false;
272
+ }
273
+ if (presumedTiming === RESPOND_TIMING.VISIBLE_CONTENT && snapshot.parsed?.content) {
274
+ return true;
275
+ }
276
+ if (presumedTiming === RESPOND_TIMING.HTML && snapshot.html) {
277
+ return true;
278
+ }
279
+ if (presumedTiming === RESPOND_TIMING.NETWORK_IDLE) {
280
+ return false;
281
+ }
282
+ if (presumedTiming === RESPOND_TIMING.MUTATION_IDLE && snapshot.lastMutationIdle) {
283
+ return true;
284
+ }
285
+ if (this.respondWith.includes('lm')) {
286
+ return false;
287
+ }
288
+ if (this.withIframe) {
289
+ return false;
290
+ }
291
+ return !snapshot.isIntermediate;
292
+ }
293
+ isCacheQueryApplicable() {
294
+ if (this.noCache) {
295
+ return false;
296
+ }
297
+ if (this.cacheTolerance === 0) {
298
+ return false;
299
+ }
300
+ if (this.setCookies?.length) {
301
+ return false;
302
+ }
303
+ if (this.injectFrameScript?.length || this.injectPageScript?.length) {
304
+ return false;
305
+ }
306
+ if (this.viewport) {
307
+ return false;
308
+ }
309
+ return true;
310
+ }
311
+ isRequestingCompoundContentFormat() {
312
+ return !CONTENT_FORMAT_VALUES.has(this.respondWith);
313
+ }
314
+ browserIsNotRequired() {
315
+ if (this.respondTiming && ![RESPOND_TIMING.HTML, RESPOND_TIMING.VISIBLE_CONTENT].includes(this.respondTiming)) {
316
+ return false;
317
+ }
318
+ if (this.respondWith.includes(CONTENT_FORMAT.PAGESHOT) || this.respondWith.includes(CONTENT_FORMAT.SCREENSHOT)) {
319
+ return false;
320
+ }
321
+ if (this.injectFrameScript?.length || this.injectPageScript?.length) {
322
+ return false;
323
+ }
324
+ if (this.waitForSelector?.length) {
325
+ return false;
326
+ }
327
+ if (this.withIframe || this.withShadowDom) {
328
+ return false;
329
+ }
330
+ if (this.viewport) {
331
+ return false;
332
+ }
333
+ if (this.pdf) {
334
+ return false;
335
+ }
336
+ if (this.html) {
337
+ return false;
338
+ }
339
+ return true;
340
+ }
341
+ };
342
+ exports.CrawlerOptions = CrawlerOptions;
343
+ __decorate([
344
+ (0, civ_rpc_1.Prop)(),
345
+ __metadata("design:type", String)
346
+ ], CrawlerOptions.prototype, "url", void 0);
347
+ __decorate([
348
+ (0, civ_rpc_1.Prop)(),
349
+ __metadata("design:type", String)
350
+ ], CrawlerOptions.prototype, "html", void 0);
351
+ __decorate([
352
+ (0, civ_rpc_1.Prop)({
353
+ type: BASE_URL_MODE_VALUES,
354
+ default: 'initial',
355
+ }),
356
+ __metadata("design:type", Object)
357
+ ], CrawlerOptions.prototype, "base", void 0);
358
+ __decorate([
359
+ (0, civ_rpc_1.Prop)({
360
+ desc: 'Base64 encoded PDF.',
361
+ type: [fancy_file_1.FancyFile, String]
362
+ }),
363
+ __metadata("design:type", Object)
364
+ ], CrawlerOptions.prototype, "pdf", void 0);
365
+ __decorate([
366
+ (0, civ_rpc_1.Prop)({
367
+ default: CONTENT_FORMAT.CONTENT,
368
+ type: [CONTENT_FORMAT, String]
369
+ }),
370
+ __metadata("design:type", String)
371
+ ], CrawlerOptions.prototype, "respondWith", void 0);
372
+ __decorate([
373
+ (0, civ_rpc_1.Prop)({
374
+ default: false,
375
+ }),
376
+ __metadata("design:type", Boolean)
377
+ ], CrawlerOptions.prototype, "withGeneratedAlt", void 0);
378
+ __decorate([
379
+ (0, civ_rpc_1.Prop)({ default: 'all', type: IMAGE_RETENTION_MODE_VALUES }),
380
+ __metadata("design:type", Object)
381
+ ], CrawlerOptions.prototype, "retainImages", void 0);
382
+ __decorate([
383
+ (0, civ_rpc_1.Prop)({
384
+ default: false,
385
+ }),
386
+ __metadata("design:type", Object)
387
+ ], CrawlerOptions.prototype, "withLinksSummary", void 0);
388
+ __decorate([
389
+ (0, civ_rpc_1.Prop)({
390
+ default: false,
391
+ }),
392
+ __metadata("design:type", Boolean)
393
+ ], CrawlerOptions.prototype, "withImagesSummary", void 0);
394
+ __decorate([
395
+ (0, civ_rpc_1.Prop)({
396
+ default: false,
397
+ }),
398
+ __metadata("design:type", Boolean)
399
+ ], CrawlerOptions.prototype, "noCache", void 0);
400
+ __decorate([
401
+ (0, civ_rpc_1.Prop)({
402
+ default: false,
403
+ }),
404
+ __metadata("design:type", Object)
405
+ ], CrawlerOptions.prototype, "noGfm", void 0);
406
+ __decorate([
407
+ (0, civ_rpc_1.Prop)(),
408
+ __metadata("design:type", Number)
409
+ ], CrawlerOptions.prototype, "cacheTolerance", void 0);
410
+ __decorate([
411
+ (0, civ_rpc_1.Prop)({ arrayOf: String }),
412
+ __metadata("design:type", Object)
413
+ ], CrawlerOptions.prototype, "targetSelector", void 0);
414
+ __decorate([
415
+ (0, civ_rpc_1.Prop)({ arrayOf: String }),
416
+ __metadata("design:type", Object)
417
+ ], CrawlerOptions.prototype, "waitForSelector", void 0);
418
+ __decorate([
419
+ (0, civ_rpc_1.Prop)({ arrayOf: String }),
420
+ __metadata("design:type", Object)
421
+ ], CrawlerOptions.prototype, "removeSelector", void 0);
422
+ __decorate([
423
+ (0, civ_rpc_1.Prop)({
424
+ default: false,
425
+ }),
426
+ __metadata("design:type", Boolean)
427
+ ], CrawlerOptions.prototype, "keepImgDataUrl", void 0);
428
+ __decorate([
429
+ (0, civ_rpc_1.Prop)({
430
+ default: false,
431
+ type: [String, Boolean]
432
+ }),
433
+ __metadata("design:type", Object)
434
+ ], CrawlerOptions.prototype, "withIframe", void 0);
435
+ __decorate([
436
+ (0, civ_rpc_1.Prop)({
437
+ default: false,
438
+ }),
439
+ __metadata("design:type", Boolean)
440
+ ], CrawlerOptions.prototype, "withShadowDom", void 0);
441
+ __decorate([
442
+ (0, civ_rpc_1.Prop)({
443
+ arrayOf: String,
444
+ }),
445
+ __metadata("design:type", Array)
446
+ ], CrawlerOptions.prototype, "setCookies", void 0);
447
+ __decorate([
448
+ (0, civ_rpc_1.Prop)(),
449
+ __metadata("design:type", String)
450
+ ], CrawlerOptions.prototype, "proxyUrl", void 0);
451
+ __decorate([
452
+ (0, civ_rpc_1.Prop)(),
453
+ __metadata("design:type", String)
454
+ ], CrawlerOptions.prototype, "proxy", void 0);
455
+ __decorate([
456
+ (0, civ_rpc_1.Prop)(),
457
+ __metadata("design:type", String)
458
+ ], CrawlerOptions.prototype, "userAgent", void 0);
459
+ __decorate([
460
+ (0, civ_rpc_1.Prop)(),
461
+ __metadata("design:type", String)
462
+ ], CrawlerOptions.prototype, "engine", void 0);
463
+ __decorate([
464
+ (0, civ_rpc_1.Prop)({
465
+ arrayOf: String,
466
+ }),
467
+ __metadata("design:type", Array)
468
+ ], CrawlerOptions.prototype, "injectPageScript", void 0);
469
+ __decorate([
470
+ (0, civ_rpc_1.Prop)({
471
+ arrayOf: String,
472
+ }),
473
+ __metadata("design:type", Array)
474
+ ], CrawlerOptions.prototype, "injectFrameScript", void 0);
475
+ __decorate([
476
+ (0, civ_rpc_1.Prop)({
477
+ validate: (v) => v > 0 && v <= 180,
478
+ type: Number,
479
+ nullable: true,
480
+ }),
481
+ __metadata("design:type", Object)
482
+ ], CrawlerOptions.prototype, "timeout", void 0);
483
+ __decorate([
484
+ (0, civ_rpc_1.Prop)(),
485
+ __metadata("design:type", String)
486
+ ], CrawlerOptions.prototype, "locale", void 0);
487
+ __decorate([
488
+ (0, civ_rpc_1.Prop)(),
489
+ __metadata("design:type", String)
490
+ ], CrawlerOptions.prototype, "referer", void 0);
491
+ __decorate([
492
+ (0, civ_rpc_1.Prop)(),
493
+ __metadata("design:type", Number)
494
+ ], CrawlerOptions.prototype, "tokenBudget", void 0);
495
+ __decorate([
496
+ (0, civ_rpc_1.Prop)(),
497
+ __metadata("design:type", Viewport)
498
+ ], CrawlerOptions.prototype, "viewport", void 0);
499
+ __decorate([
500
+ (0, civ_rpc_1.Prop)(),
501
+ __metadata("design:type", String)
502
+ ], CrawlerOptions.prototype, "instruction", void 0);
503
+ __decorate([
504
+ (0, civ_rpc_1.Prop)(),
505
+ __metadata("design:type", Object)
506
+ ], CrawlerOptions.prototype, "jsonSchema", void 0);
507
+ __decorate([
508
+ (0, civ_rpc_1.Prop)(),
509
+ __metadata("design:type", String)
510
+ ], CrawlerOptions.prototype, "robotsTxt", void 0);
511
+ __decorate([
512
+ (0, civ_rpc_1.Prop)(),
513
+ __metadata("design:type", Object)
514
+ ], CrawlerOptions.prototype, "doNotTrack", void 0);
515
+ __decorate([
516
+ (0, civ_rpc_1.Prop)(),
517
+ __metadata("design:type", turndown_tweakable_options_1.TurnDownTweakableOptions)
518
+ ], CrawlerOptions.prototype, "markdown", void 0);
519
+ __decorate([
520
+ (0, civ_rpc_1.Prop)({
521
+ type: RESPOND_TIMING,
522
+ }),
523
+ __metadata("design:type", String)
524
+ ], CrawlerOptions.prototype, "respondTiming", void 0);
525
+ exports.CrawlerOptions = CrawlerOptions = __decorate([
526
+ (0, civ_rpc_1.Also)({
527
+ openapi: {
528
+ operation: {
529
+ parameters: {
530
+ 'Accept': {
531
+ description: `Specifies your preference for the response format.\n\n` +
532
+ `Supported formats: \n` +
533
+ `- text/event-stream\n` +
534
+ `- application/json or text/json\n` +
535
+ `- text/plain`,
536
+ in: 'header',
537
+ schema: { type: 'string' }
538
+ },
539
+ 'X-Cache-Tolerance': {
540
+ description: `Sets internal cache tolerance in seconds if this header is specified with a integer.`,
541
+ in: 'header',
542
+ schema: { type: 'string' }
543
+ },
544
+ 'X-No-Cache': {
545
+ description: `Ignores internal cache if this header is specified with a value.\n\nEquivalent to X-Cache-Tolerance: 0`,
546
+ in: 'header',
547
+ schema: { type: 'string' }
548
+ },
549
+ 'X-Respond-With': {
550
+ description: `Specifies the (non-default) form of the crawled data you prefer.\n\n` +
551
+ `Supported formats: \n` +
552
+ `- markdown\n` +
553
+ `- html\n` +
554
+ `- text\n` +
555
+ `- pageshot\n` +
556
+ `- screenshot\n` +
557
+ `- content\n` +
558
+ `- any combination of the above\n` +
559
+ `- readerlm-v2\n` +
560
+ `- vlm\n\n` +
561
+ `Default: content\n`,
562
+ in: 'header',
563
+ schema: { type: 'string' }
564
+ },
565
+ 'X-Wait-For-Selector': {
566
+ description: `Specifies a CSS selector to wait for the appearance of such an element before returning.\n\n` +
567
+ 'Example: `X-Wait-For-Selector: .content-block`\n',
568
+ in: 'header',
569
+ schema: { type: 'string' }
570
+ },
571
+ 'X-Target-Selector': {
572
+ description: `Specifies a CSS selector for return target instead of the full html.\n\n` +
573
+ 'Implies `X-Wait-For-Selector: (same selector)`',
574
+ in: 'header',
575
+ schema: { type: 'string' }
576
+ },
577
+ 'X-Remove-Selector': {
578
+ description: `Specifies a CSS selector to remove elements from the full html.\n\n` +
579
+ 'Example `X-Remove-Selector: nav`',
580
+ in: 'header',
581
+ schema: { type: 'string' }
582
+ },
583
+ 'X-Keep-Img-Data-Url': {
584
+ description: `Keep data-url as it instead of transforming them to object-url. (Only applicable when targeting markdown format)\n\n` +
585
+ 'Example `X-Keep-Img-Data-Url: true`',
586
+ in: 'header',
587
+ schema: { type: 'string' }
588
+ },
589
+ 'X-Proxy-Url': {
590
+ description: `Specifies your custom proxy if you prefer to use one.\n\n` +
591
+ `Supported protocols: \n` +
592
+ `- http\n` +
593
+ `- https\n` +
594
+ `- socks4\n` +
595
+ `- socks5\n\n` +
596
+ `For authentication, https://user:pass@host:port`,
597
+ in: 'header',
598
+ schema: { type: 'string' }
599
+ },
600
+ 'X-Proxy': {
601
+ description: `Use a proxy server provided by us.\n\nOptionally specify two-letter country code.`,
602
+ in: 'header',
603
+ schema: { type: 'string' }
604
+ },
605
+ 'X-Robots-Txt': {
606
+ description: `Load and conform to the respective robot.txt on the target origin.\n\nOptionally specify a bot UA to check against.\n\n`,
607
+ in: 'header',
608
+ schema: { type: 'string' }
609
+ },
610
+ 'DNT': {
611
+ description: `When set to 1, prevent the result of this request to be cached in the system.\n\n`,
612
+ in: 'header',
613
+ schema: { type: 'string' }
614
+ },
615
+ 'X-Set-Cookie': {
616
+ description: `Sets cookie(s) to the headless browser for your request. \n\n` +
617
+ `Syntax is the same with standard Set-Cookie`,
618
+ in: 'header',
619
+ schema: { type: 'string' }
620
+ },
621
+ 'X-With-Generated-Alt': {
622
+ description: `Enable automatic alt-text generating for images without an meaningful alt-text.\n\n` +
623
+ `Note: Does not work when \`X-Respond-With\` is specified`,
624
+ in: 'header',
625
+ schema: { type: 'string' }
626
+ },
627
+ 'X-With-Images-Summary': {
628
+ description: `Enable dedicated summary section for images on the page.`,
629
+ in: 'header',
630
+ schema: { type: 'string' }
631
+ },
632
+ 'X-With-links-Summary': {
633
+ description: `Enable dedicated summary section for hyper links on the page.`,
634
+ in: 'header',
635
+ schema: { type: 'string' }
636
+ },
637
+ 'X-Retain-Images': {
638
+ description: `Image retention modes.\n\n` +
639
+ `Supported modes: \n` +
640
+ `- all: all images\n` +
641
+ `- none: no images\n` +
642
+ `- alt: only alt text\n` +
643
+ `- all_p: all images and with generated alt text\n` +
644
+ `- alt_p: only alt text and with generated alt\n\n`,
645
+ in: 'header',
646
+ schema: { type: 'string' }
647
+ },
648
+ 'X-With-Iframe': {
649
+ description: `Enable filling iframe contents into main. (violates standards)`,
650
+ in: 'header',
651
+ schema: { type: 'string' }
652
+ },
653
+ 'X-With-Shadow-Dom': {
654
+ description: `Enable filling shadow dom contents into main. (violates standards)`,
655
+ in: 'header',
656
+ schema: { type: 'string' }
657
+ },
658
+ 'X-User-Agent': {
659
+ description: `Override User-Agent.`,
660
+ in: 'header',
661
+ schema: { type: 'string' }
662
+ },
663
+ 'X-Timeout': {
664
+ description: `Specify timeout in seconds. Max 180.`,
665
+ in: 'header',
666
+ schema: { type: 'string' }
667
+ },
668
+ 'X-Locale': {
669
+ description: 'Specify browser locale for the page.',
670
+ in: 'header',
671
+ schema: { type: 'string' }
672
+ },
673
+ 'X-Referer': {
674
+ description: 'Specify referer for the page.',
675
+ in: 'header',
676
+ schema: { type: 'string' }
677
+ },
678
+ 'X-Token-Budget': {
679
+ description: 'Specify a budget in tokens.\n\nIf the resulting token cost exceeds the budget, the request is rejected.',
680
+ in: 'header',
681
+ schema: { type: 'string' }
682
+ },
683
+ 'X-Respond-Timing': {
684
+ description: `Explicitly specify the respond timing. One of the following:\n\n` +
685
+ `- html: directly return unrendered HTML\n` +
686
+ `- visible-content: return immediately when any content becomes available\n` +
687
+ `- mutation-idle: wait for DOM mutations to settle and remain unchanged for at least 0.2s\n` +
688
+ `- resource-idle: wait for no additional resources that would affect page logic and content has SUCCEEDED loading in 0.5s\n` +
689
+ `- media-idle: wait for no additional resources, including media resources, has SUCCEEDED loading in 0.5s\n` +
690
+ `- network-idle: wait for full load of webpage, also known as networkidle0.\n\n`,
691
+ in: 'header',
692
+ schema: { type: 'string' }
693
+ },
694
+ 'X-Engine': {
695
+ description: 'Specify the engine to use for crawling.\n\nSupported: browser, direct, cf-browser-rendering',
696
+ in: 'header',
697
+ schema: { type: 'string' }
698
+ },
699
+ 'X-Base': {
700
+ description: 'Select base modes of relative URLs.\n\nSupported: initial, final',
701
+ in: 'header',
702
+ schema: { type: 'string' }
703
+ },
704
+ 'X-Md-Heading-Style': {
705
+ description: 'Heading style of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: setext, atx',
706
+ in: 'header',
707
+ schema: { type: 'string' }
708
+ },
709
+ 'X-Md-Hr': {
710
+ description: 'Hr text of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).',
711
+ in: 'header',
712
+ schema: { type: 'string' }
713
+ },
714
+ 'X-Md-Bullet-List-Marker': {
715
+ description: 'Bullet list marker of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: -, +, *',
716
+ in: 'header',
717
+ schema: { type: 'string' }
718
+ },
719
+ 'X-Md-Em-Delimiter': {
720
+ description: 'Em delimiter of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: _, *',
721
+ in: 'header',
722
+ schema: { type: 'string' }
723
+ },
724
+ 'X-Md-Strong-Delimiter': {
725
+ description: 'Strong delimiter of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: **, __',
726
+ in: 'header',
727
+ schema: { type: 'string' }
728
+ },
729
+ 'X-Md-Link-Style': {
730
+ description: 'Link style of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: inlined, referenced, discarded',
731
+ in: 'header',
732
+ schema: { type: 'string' }
733
+ },
734
+ 'X-Md-Link-Reference-Style': {
735
+ description: 'Link reference style of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: full, collapsed, shortcut, discarded',
736
+ in: 'header',
737
+ schema: { type: 'string' }
738
+ },
739
+ }
740
+ }
741
+ }
742
+ })
743
+ ], CrawlerOptions);
744
+ class CrawlerOptionsHeaderOnly extends CrawlerOptions {
745
+ static from(input) {
746
+ const instance = super.from({
747
+ [civ_rpc_1.RPC_CALL_ENVIRONMENT]: Reflect.get(input, civ_rpc_1.RPC_CALL_ENVIRONMENT),
748
+ });
749
+ return instance;
750
+ }
751
+ }
752
+ exports.CrawlerOptionsHeaderOnly = CrawlerOptionsHeaderOnly;
753
+ //# sourceMappingURL=crawler-options.js.map
build/dto/crawler-options.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"crawler-options.js","sourceRoot":"","sources":["../../src/dto/crawler-options.ts"],"names":[],"mappings":"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"}
build/dto/jina-embeddings-auth.js ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.JinaEmbeddingsAuthDTO = void 0;
16
+ const civ_rpc_1 = require("civkit/civ-rpc");
17
+ const escape_1 = require("civkit/escape");
18
+ const lang_1 = require("civkit/lang");
19
+ const logger_1 = __importDefault(require("../services/logger"));
20
+ const registry_1 = require("../services/registry");
21
+ const async_context_1 = require("../services/async-context");
22
+ const secrets_1 = __importDefault(require("../shared/services/secrets"));
23
+ const jina_embeddings_1 = require("../shared/3rd-party/jina-embeddings");
24
+ const jina_embeddings_token_account_1 = require("../shared/db/jina-embeddings-token-account");
25
+ const errors_1 = require("../services/errors");
26
+ const authDtoLogger = logger_1.default.child({ service: 'JinaAuthDTO' });
27
+ const THE_VERY_SAME_JINA_EMBEDDINGS_CLIENT = new jina_embeddings_1.JinaEmbeddingsDashboardHTTP(secrets_1.default.JINA_EMBEDDINGS_DASHBOARD_API_KEY);
28
+ let JinaEmbeddingsAuthDTO = class JinaEmbeddingsAuthDTO extends civ_rpc_1.AutoCastable {
29
+ constructor() {
30
+ super(...arguments);
31
+ this.jinaEmbeddingsDashboard = THE_VERY_SAME_JINA_EMBEDDINGS_CLIENT;
32
+ }
33
+ static from(input) {
34
+ const instance = super.from(input);
35
+ const ctx = input[civ_rpc_1.RPC_CALL_ENVIRONMENT];
36
+ if (ctx) {
37
+ const authorization = ctx.get('authorization');
38
+ if (authorization) {
39
+ const authToken = authorization.split(' ')[1] || authorization;
40
+ instance.bearerToken = authToken;
41
+ }
42
+ }
43
+ if (!instance.bearerToken && input._token) {
44
+ instance.bearerToken = input._token;
45
+ }
46
+ return instance;
47
+ }
48
+ async getBrief(ignoreCache) {
49
+ if (!this.bearerToken) {
50
+ throw new civ_rpc_1.AuthenticationRequiredError({
51
+ message: 'Jina API key is required to authenticate. Please get one from https://jina.ai'
52
+ });
53
+ }
54
+ let firestoreDegradation = false;
55
+ let account;
56
+ try {
57
+ account = await jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.fromFirestore(this.bearerToken);
58
+ }
59
+ catch (err) {
60
+ // FireStore would not accept any string as input and may throw if not happy with it
61
+ firestoreDegradation = true;
62
+ logger_1.default.warn(`Firestore issue`, { err });
63
+ }
64
+ const age = account?.lastSyncedAt ? Date.now() - account.lastSyncedAt.valueOf() : Infinity;
65
+ const jitter = Math.ceil(Math.random() * 30 * 1000);
66
+ if (account && !ignoreCache) {
67
+ if ((age < (180_000 - jitter)) && (account.wallet?.total_balance > 0)) {
68
+ this.user = account;
69
+ this.uid = this.user?.user_id;
70
+ return account;
71
+ }
72
+ }
73
+ if (firestoreDegradation) {
74
+ logger_1.default.debug(`Using remote UC cached user`);
75
+ let r;
76
+ try {
77
+ r = await this.jinaEmbeddingsDashboard.authorization(this.bearerToken);
78
+ }
79
+ catch (err) {
80
+ if (err?.status === 401) {
81
+ throw new civ_rpc_1.AuthenticationFailedError({
82
+ message: 'Invalid API key, please get a new one from https://jina.ai'
83
+ });
84
+ }
85
+ logger_1.default.warn(`Failed load remote cached user: ${err}`, { err });
86
+ throw new civ_rpc_1.DownstreamServiceError(`Failed to authenticate: ${err}`);
87
+ }
88
+ const brief = r?.data;
89
+ const draftAccount = jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.from({
90
+ ...account, ...brief, _id: this.bearerToken,
91
+ lastSyncedAt: new Date()
92
+ });
93
+ this.user = draftAccount;
94
+ this.uid = this.user?.user_id;
95
+ return draftAccount;
96
+ }
97
+ try {
98
+ // TODO: go back using validateToken after performance issue fixed
99
+ const r = ((account?.wallet?.total_balance || 0) > 0) ?
100
+ await this.jinaEmbeddingsDashboard.authorization(this.bearerToken) :
101
+ await this.jinaEmbeddingsDashboard.validateToken(this.bearerToken);
102
+ const brief = r.data;
103
+ const draftAccount = jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.from({
104
+ ...account, ...brief, _id: this.bearerToken,
105
+ lastSyncedAt: new Date()
106
+ });
107
+ await jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.save(draftAccount.degradeForFireStore(), undefined, { merge: true });
108
+ this.user = draftAccount;
109
+ this.uid = this.user?.user_id;
110
+ return draftAccount;
111
+ }
112
+ catch (err) {
113
+ authDtoLogger.warn(`Failed to get user brief: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) });
114
+ if (err?.status === 401) {
115
+ throw new civ_rpc_1.AuthenticationFailedError({
116
+ message: 'Invalid API key, please get a new one from https://jina.ai'
117
+ });
118
+ }
119
+ if (account) {
120
+ this.user = account;
121
+ this.uid = this.user?.user_id;
122
+ return account;
123
+ }
124
+ throw new civ_rpc_1.DownstreamServiceError(`Failed to authenticate: ${err}`);
125
+ }
126
+ }
127
+ async reportUsage(tokenCount, mdl, endpoint = '/encode') {
128
+ const user = await this.assertUser();
129
+ const uid = user.user_id;
130
+ user.wallet.total_balance -= tokenCount;
131
+ return this.jinaEmbeddingsDashboard.reportUsage(this.bearerToken, {
132
+ model_name: mdl,
133
+ api_endpoint: endpoint,
134
+ consumer: {
135
+ id: uid,
136
+ user_id: uid,
137
+ },
138
+ usage: {
139
+ total_tokens: tokenCount
140
+ },
141
+ labels: {
142
+ model_name: mdl
143
+ }
144
+ }).then((r) => {
145
+ jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.COLLECTION.doc(this.bearerToken)
146
+ .update({ 'wallet.total_balance': jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.OPS.increment(-tokenCount) })
147
+ .catch((err) => {
148
+ authDtoLogger.warn(`Failed to update cache for ${uid}: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) });
149
+ });
150
+ return r;
151
+ }).catch((err) => {
152
+ user.wallet.total_balance += tokenCount;
153
+ authDtoLogger.warn(`Failed to report usage for ${uid}: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) });
154
+ });
155
+ }
156
+ async solveUID() {
157
+ if (this.uid) {
158
+ this.ctxMgr.set('uid', this.uid);
159
+ return this.uid;
160
+ }
161
+ if (this.bearerToken) {
162
+ await this.getBrief();
163
+ this.ctxMgr.set('uid', this.uid);
164
+ return this.uid;
165
+ }
166
+ return undefined;
167
+ }
168
+ async assertUID() {
169
+ const uid = await this.solveUID();
170
+ if (!uid) {
171
+ throw new civ_rpc_1.AuthenticationRequiredError('Authentication failed');
172
+ }
173
+ return uid;
174
+ }
175
+ async assertUser() {
176
+ if (this.user) {
177
+ return this.user;
178
+ }
179
+ await this.getBrief();
180
+ return this.user;
181
+ }
182
+ async assertTier(n, feature) {
183
+ let user;
184
+ try {
185
+ user = await this.assertUser();
186
+ }
187
+ catch (err) {
188
+ if (err instanceof civ_rpc_1.AuthenticationRequiredError) {
189
+ throw new civ_rpc_1.AuthenticationRequiredError({
190
+ message: `Authentication is required to use this feature${feature ? ` (${feature})` : ''}. Please provide a valid API key.`
191
+ });
192
+ }
193
+ throw err;
194
+ }
195
+ const tier = parseInt(user.metadata?.speed_level);
196
+ if (isNaN(tier) || tier < n) {
197
+ throw new errors_1.TierFeatureConstraintError({
198
+ message: `Your current plan does not support this feature${feature ? ` (${feature})` : ''}. Please upgrade your plan.`
199
+ });
200
+ }
201
+ return true;
202
+ }
203
+ getRateLimits(...tags) {
204
+ const descs = tags.map((x) => this.user?.customRateLimits?.[x] || []).flat().filter((x) => x.isEffective());
205
+ if (descs.length) {
206
+ return descs;
207
+ }
208
+ return undefined;
209
+ }
210
+ };
211
+ exports.JinaEmbeddingsAuthDTO = JinaEmbeddingsAuthDTO;
212
+ __decorate([
213
+ (0, registry_1.InjectProperty)(async_context_1.AsyncLocalContext),
214
+ __metadata("design:type", async_context_1.AsyncLocalContext)
215
+ ], JinaEmbeddingsAuthDTO.prototype, "ctxMgr", void 0);
216
+ exports.JinaEmbeddingsAuthDTO = JinaEmbeddingsAuthDTO = __decorate([
217
+ (0, civ_rpc_1.Also)({
218
+ openapi: {
219
+ operation: {
220
+ parameters: {
221
+ 'Authorization': {
222
+ description: (0, escape_1.htmlEscape) `Jina Token for authentication.\n\n` +
223
+ (0, escape_1.htmlEscape) `- Member of <JinaEmbeddingsAuthDTO>\n\n` +
224
+ `- Authorization: Bearer {YOUR_JINA_TOKEN}`,
225
+ in: 'header',
226
+ schema: {
227
+ anyOf: [
228
+ { type: 'string', format: 'token' }
229
+ ]
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ })
236
+ ], JinaEmbeddingsAuthDTO);
237
+ //# sourceMappingURL=jina-embeddings-auth.js.map
build/dto/jina-embeddings-auth.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"jina-embeddings-auth.js","sourceRoot":"","sources":["../../src/dto/jina-embeddings-auth.ts"],"names":[],"mappings":"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"}
build/dto/turndown-tweakable-options.js ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TurnDownTweakableOptions = void 0;
16
+ const civ_rpc_1 = require("civkit/civ-rpc");
17
+ const lodash_1 = __importDefault(require("lodash"));
18
+ class TurnDownTweakableOptions extends civ_rpc_1.AutoCastable {
19
+ static fromCtx(ctx, prefix = 'x-md-') {
20
+ const draft = {};
21
+ for (const [k, v] of Object.entries(ctx.headers)) {
22
+ if (k.startsWith(prefix)) {
23
+ const prop = k.slice(prefix.length);
24
+ const sk = lodash_1.default.camelCase(prop);
25
+ draft[sk] = v;
26
+ }
27
+ }
28
+ return this.from(draft);
29
+ }
30
+ }
31
+ exports.TurnDownTweakableOptions = TurnDownTweakableOptions;
32
+ __decorate([
33
+ (0, civ_rpc_1.Prop)({
34
+ desc: 'Turndown options > headingStyle',
35
+ type: new Set(['setext', 'atx']),
36
+ }),
37
+ __metadata("design:type", String)
38
+ ], TurnDownTweakableOptions.prototype, "headingStyle", void 0);
39
+ __decorate([
40
+ (0, civ_rpc_1.Prop)({
41
+ desc: 'Turndown options > hr',
42
+ validate: (v) => v.length > 0 && v.length <= 128
43
+ }),
44
+ __metadata("design:type", String)
45
+ ], TurnDownTweakableOptions.prototype, "hr", void 0);
46
+ __decorate([
47
+ (0, civ_rpc_1.Prop)({
48
+ desc: 'Turndown options > bulletListMarker',
49
+ type: new Set(['-', '+', '*']),
50
+ }),
51
+ __metadata("design:type", String)
52
+ ], TurnDownTweakableOptions.prototype, "bulletListMarker", void 0);
53
+ __decorate([
54
+ (0, civ_rpc_1.Prop)({
55
+ desc: 'Turndown options > emDelimiter',
56
+ type: new Set(['_', '*']),
57
+ }),
58
+ __metadata("design:type", String)
59
+ ], TurnDownTweakableOptions.prototype, "emDelimiter", void 0);
60
+ __decorate([
61
+ (0, civ_rpc_1.Prop)({
62
+ desc: 'Turndown options > strongDelimiter',
63
+ type: new Set(['__', '**']),
64
+ }),
65
+ __metadata("design:type", String)
66
+ ], TurnDownTweakableOptions.prototype, "strongDelimiter", void 0);
67
+ __decorate([
68
+ (0, civ_rpc_1.Prop)({
69
+ desc: 'Turndown options > linkStyle',
70
+ type: new Set(['inlined', 'referenced', 'discarded']),
71
+ }),
72
+ __metadata("design:type", String)
73
+ ], TurnDownTweakableOptions.prototype, "linkStyle", void 0);
74
+ __decorate([
75
+ (0, civ_rpc_1.Prop)({
76
+ desc: 'Turndown options > linkReferenceStyle',
77
+ type: new Set(['full', 'collapsed', 'shortcut', 'discarded']),
78
+ }),
79
+ __metadata("design:type", String)
80
+ ], TurnDownTweakableOptions.prototype, "linkReferenceStyle", void 0);
81
+ //# sourceMappingURL=turndown-tweakable-options.js.map
build/dto/turndown-tweakable-options.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"turndown-tweakable-options.js","sourceRoot":"","sources":["../../src/dto/turndown-tweakable-options.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAoD;AAEpD,oDAAuB;AAGvB,MAAa,wBAAyB,SAAQ,sBAAY;IA2CtD,MAAM,CAAC,OAAO,CAAC,GAAY,EAAE,MAAM,GAAE,OAAO;QACxC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,EAAE,GAAG,gBAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,CAAW,CAAC;YAC5B,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;CACJ;AAvDD,4DAuDC;AAlDG;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,iCAAiC;QACvC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;KACnC,CAAC;;8DAC8B;AAMhC;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;KAC3D,CAAC;;oDACU;AAMZ;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,qCAAqC;QAC3C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC;;kEACiC;AAMnC;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;KAC5B,CAAC;;6DACsB;AAMxB;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,oCAAoC;QAC1C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC9B,CAAC;;iEAC4B;AAM9B;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;KACxD,CAAC;;2DACiD;AAMnD;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,uCAAuC;QAC7C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;KAChE,CAAC;;oEACmE"}
build/lib/transform-server-event-stream.js ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var _a;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.OutputServerEventStream = exports.InputServerEventStream = void 0;
14
+ const civkit_1 = require("civkit");
15
+ const stream_1 = require("stream");
16
+ class InputServerEventStream extends stream_1.Transform {
17
+ constructor(options) {
18
+ super({
19
+ ...options,
20
+ readableObjectMode: true
21
+ });
22
+ this.cache = [];
23
+ }
24
+ decodeRoutine() {
25
+ if (!this.cache.length) {
26
+ return;
27
+ }
28
+ const vecs = this.cache.join('').split(/\r?\n\r?\n/);
29
+ this.cache.length = 0;
30
+ const lastVec = vecs.pop();
31
+ if (lastVec) {
32
+ this.cache.push(lastVec);
33
+ }
34
+ for (const x of vecs) {
35
+ const lines = x.split(/\r?\n/);
36
+ const event = {};
37
+ for (const l of lines) {
38
+ const columnPos = l.indexOf(':');
39
+ if (columnPos <= 0) {
40
+ continue;
41
+ }
42
+ const key = l.substring(0, columnPos);
43
+ const rawValue = l.substring(columnPos + 1);
44
+ const value = rawValue.startsWith(' ') ? rawValue.slice(1) : rawValue;
45
+ if (key === 'data') {
46
+ if (event.data) {
47
+ event.data += value || '\n';
48
+ }
49
+ else if (event.data === '') {
50
+ event.data += '\n';
51
+ event.data += value || '\n';
52
+ }
53
+ else {
54
+ event.data = value;
55
+ }
56
+ }
57
+ else if (key === 'retry') {
58
+ event.retry = parseInt(value, 10);
59
+ }
60
+ else {
61
+ Reflect.set(event, key, value);
62
+ }
63
+ }
64
+ if (event.data) {
65
+ const parsed = (0, civkit_1.parseJSONText)(event.data);
66
+ if (parsed && typeof parsed === 'object') {
67
+ event.data = parsed;
68
+ }
69
+ }
70
+ if (Object.keys(event).length) {
71
+ this.push(event);
72
+ }
73
+ }
74
+ }
75
+ _transform(chunk, encoding, callback) {
76
+ if (chunk === null) {
77
+ this.push(null);
78
+ }
79
+ this.cache.push(chunk.toString());
80
+ this.decodeRoutine();
81
+ callback();
82
+ }
83
+ _final(callback) {
84
+ this.decodeRoutine();
85
+ callback();
86
+ }
87
+ }
88
+ exports.InputServerEventStream = InputServerEventStream;
89
+ let OutputServerEventStream = class OutputServerEventStream extends stream_1.Transform {
90
+ constructor(options) {
91
+ super({
92
+ ...options, writableObjectMode: true, encoding: 'utf-8'
93
+ });
94
+ this.n = 0;
95
+ }
96
+ encodeRoutine(chunk) {
97
+ if (typeof chunk === 'object') {
98
+ const lines = [];
99
+ if (chunk.event) {
100
+ lines.push(`event: ${chunk.event}`);
101
+ }
102
+ if (chunk.data) {
103
+ if (typeof chunk.data === 'string') {
104
+ for (const x of chunk.data.split(/\r?\n/)) {
105
+ lines.push(`data: ${x}`);
106
+ }
107
+ }
108
+ else {
109
+ lines.push(`data: ${JSON.stringify(chunk.data)}`);
110
+ }
111
+ }
112
+ if (chunk.id) {
113
+ lines.push(`id: ${chunk.id}`);
114
+ }
115
+ if (chunk.retry) {
116
+ lines.push(`retry: ${chunk.retry}`);
117
+ }
118
+ if (!lines.length) {
119
+ lines.push(`data: ${JSON.stringify(chunk)}`);
120
+ }
121
+ this.push(lines.join('\n'));
122
+ this.push('\n\n');
123
+ this.n++;
124
+ return;
125
+ }
126
+ else if (typeof chunk === 'string') {
127
+ const lines = [];
128
+ for (const x of chunk.split(/\r?\n/)) {
129
+ lines.push(`data: ${x}`);
130
+ }
131
+ this.push(lines.join('\n'));
132
+ this.push('\n\n');
133
+ this.n++;
134
+ }
135
+ }
136
+ _transform(chunk, encoding, callback) {
137
+ if (chunk === null) {
138
+ this.push(null);
139
+ }
140
+ this.encodeRoutine(chunk);
141
+ callback();
142
+ }
143
+ };
144
+ exports.OutputServerEventStream = OutputServerEventStream;
145
+ exports.OutputServerEventStream = OutputServerEventStream = __decorate([
146
+ (0, civkit_1.TPM)({
147
+ contentType: 'text/event-stream',
148
+ }),
149
+ __metadata("design:paramtypes", [typeof (_a = typeof stream_1.TransformOptions !== "undefined" && stream_1.TransformOptions) === "function" ? _a : Object])
150
+ ], OutputServerEventStream);
151
+ //# sourceMappingURL=transform-server-event-stream.js.map
build/lib/transform-server-event-stream.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"transform-server-event-stream.js","sourceRoot":"","sources":["../../src/lib/transform-server-event-stream.ts"],"names":[],"mappings":"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"}
build/services/alt-text.js ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var _a;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AltTextService = void 0;
14
+ const civkit_1 = require("civkit");
15
+ const tsyringe_1 = require("tsyringe");
16
+ const logger_1 = require("./logger");
17
+ const canvas_1 = require("./canvas");
18
+ const common_iminterrogate_1 = require("../shared/services/common-iminterrogate");
19
+ const img_alt_1 = require("../db/img-alt");
20
+ const async_context_1 = require("./async-context");
21
+ const md5Hasher = new civkit_1.HashManager('md5', 'hex');
22
+ let AltTextService = class AltTextService extends civkit_1.AsyncService {
23
+ constructor(globalLogger, imageInterrogator, canvasService, asyncLocalContext) {
24
+ super(...arguments);
25
+ this.globalLogger = globalLogger;
26
+ this.imageInterrogator = imageInterrogator;
27
+ this.canvasService = canvasService;
28
+ this.asyncLocalContext = asyncLocalContext;
29
+ this.altsToIgnore = 'image,img,photo,picture,pic,alt,figure,fig'.split(',');
30
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
31
+ }
32
+ async init() {
33
+ await this.dependencyReady();
34
+ this.emit('ready');
35
+ }
36
+ async caption(url) {
37
+ try {
38
+ const img = await this.canvasService.loadImage(url);
39
+ const contentTypeHint = Reflect.get(img, 'contentType');
40
+ if (Math.min(img.naturalHeight, img.naturalWidth) <= 1) {
41
+ return `A ${img.naturalWidth}x${img.naturalHeight} image, likely be a tacker probe`;
42
+ }
43
+ if (Math.min(img.naturalHeight, img.naturalWidth) < 64) {
44
+ return `A ${img.naturalWidth}x${img.naturalHeight} small image, likely a logo, icon or avatar`;
45
+ }
46
+ const resized = this.canvasService.fitImageToSquareBox(img, 1024);
47
+ const exported = await this.canvasService.canvasToBuffer(resized, 'image/png');
48
+ const svgHint = contentTypeHint.includes('svg') ? `Beware this image is a SVG rendered on a gray background, the gray background is not part of the image.\n\n` : '';
49
+ const svgSystemHint = contentTypeHint.includes('svg') ? ` Sometimes the system renders SVG on a gray background. When this happens, you must not include the gray background in the description.` : '';
50
+ const r = await this.imageInterrogator.interrogate('vertex-gemini-2.0-flash', {
51
+ image: exported,
52
+ prompt: `${svgHint}Give a concise image caption descriptive sentence in third person. Start directly with the description.`,
53
+ system: `You are BLIP2, an image caption model. You will generate Alt Text (in web pages) for any image for a11y purposes. You must not start with "This image is sth...", instead, start direly with "sth..."${svgSystemHint}`,
54
+ });
55
+ return r.replaceAll(/[\n\"]|(\.\s*$)/g, '').trim();
56
+ }
57
+ catch (err) {
58
+ throw new civkit_1.AssertionFailureError({ message: `Could not generate alt text for url ${url}`, cause: err });
59
+ }
60
+ }
61
+ async getAltText(imgBrief) {
62
+ if (!imgBrief.src) {
63
+ return undefined;
64
+ }
65
+ if (imgBrief.alt && !this.altsToIgnore.includes(imgBrief.alt.trim().toLowerCase())) {
66
+ return imgBrief.alt;
67
+ }
68
+ const digest = md5Hasher.hash(imgBrief.src);
69
+ const shortDigest = Buffer.from(digest, 'hex').toString('base64url');
70
+ let dims = [];
71
+ do {
72
+ if (imgBrief.loaded) {
73
+ if (imgBrief.naturalWidth && imgBrief.naturalHeight) {
74
+ if (Math.min(imgBrief.naturalWidth, imgBrief.naturalHeight) < 64) {
75
+ dims = [imgBrief.naturalWidth, imgBrief.naturalHeight];
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ if (imgBrief.width && imgBrief.height) {
81
+ if (Math.min(imgBrief.width, imgBrief.height) < 64) {
82
+ dims = [imgBrief.width, imgBrief.height];
83
+ break;
84
+ }
85
+ }
86
+ } while (false);
87
+ if (Math.min(...dims) <= 1) {
88
+ return `A ${dims[0]}x${dims[1]} image, likely be a tacker probe`;
89
+ }
90
+ if (Math.min(...dims) < 64) {
91
+ return `A ${dims[0]}x${dims[1]} small image, likely a logo, icon or avatar`;
92
+ }
93
+ const existing = await img_alt_1.ImgAlt.fromFirestore(shortDigest);
94
+ if (existing) {
95
+ return existing.generatedAlt || existing.originalAlt || '';
96
+ }
97
+ let generatedCaption = '';
98
+ try {
99
+ generatedCaption = await this.caption(imgBrief.src);
100
+ }
101
+ catch (err) {
102
+ this.logger.warn(`Unable to generate alt text for ${imgBrief.src}`, { err });
103
+ }
104
+ if (this.asyncLocalContext.ctx.DNT) {
105
+ // Don't cache alt text if DNT is set
106
+ return generatedCaption;
107
+ }
108
+ // Don't try again until the next day
109
+ const expireMixin = generatedCaption ? {} : { expireAt: new Date(Date.now() + 1000 * 3600 * 24) };
110
+ await img_alt_1.ImgAlt.COLLECTION.doc(shortDigest).set({
111
+ _id: shortDigest,
112
+ src: imgBrief.src || '',
113
+ width: imgBrief.naturalWidth || 0,
114
+ height: imgBrief.naturalHeight || 0,
115
+ urlDigest: digest,
116
+ originalAlt: imgBrief.alt || '',
117
+ generatedAlt: generatedCaption || '',
118
+ createdAt: new Date(),
119
+ ...expireMixin
120
+ }, { merge: true });
121
+ return generatedCaption;
122
+ }
123
+ };
124
+ exports.AltTextService = AltTextService;
125
+ exports.AltTextService = AltTextService = __decorate([
126
+ (0, tsyringe_1.singleton)(),
127
+ __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof common_iminterrogate_1.ImageInterrogationManager !== "undefined" && common_iminterrogate_1.ImageInterrogationManager) === "function" ? _a : Object, canvas_1.CanvasService,
128
+ async_context_1.AsyncLocalContext])
129
+ ], AltTextService);
130
+ ;
131
+ //# sourceMappingURL=alt-text.js.map
build/services/alt-text.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"alt-text.js","sourceRoot":"","sources":["../../src/services/alt-text.ts"],"names":[],"mappings":"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"}
build/services/async-context.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AsyncLocalContext = void 0;
10
+ const async_context_1 = require("civkit/async-context");
11
+ const tsyringe_1 = require("tsyringe");
12
+ let AsyncLocalContext = class AsyncLocalContext extends async_context_1.GlobalAsyncContext {
13
+ };
14
+ exports.AsyncLocalContext = AsyncLocalContext;
15
+ exports.AsyncLocalContext = AsyncLocalContext = __decorate([
16
+ (0, tsyringe_1.singleton)()
17
+ ], AsyncLocalContext);
18
+ const instance = tsyringe_1.container.resolve(AsyncLocalContext);
19
+ Reflect.set(process, 'asyncLocalContext', instance);
20
+ exports.default = instance;
21
+ //# sourceMappingURL=async-context.js.map
build/services/async-context.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"async-context.js","sourceRoot":"","sources":["../../src/services/async-context.ts"],"names":[],"mappings":";;;;;;;;;AAAA,wDAA0D;AAC1D,uCAAgD;AAGzC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,kCAAkB;CAAI,CAAA;AAAhD,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,oBAAS,GAAE;GACC,iBAAiB,CAA+B;AAE7D,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACtD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAEpD,kBAAe,QAAQ,CAAC"}
build/services/blackhole-detector.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BlackHoleDetector = void 0;
13
+ const tsyringe_1 = require("tsyringe");
14
+ const async_service_1 = require("civkit/async-service");
15
+ const logger_1 = require("./logger");
16
+ const timeout_1 = require("civkit/timeout");
17
+ let BlackHoleDetector = class BlackHoleDetector extends async_service_1.AsyncService {
18
+ constructor(globalLogger) {
19
+ super(...arguments);
20
+ this.globalLogger = globalLogger;
21
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
22
+ this.maxDelay = 1000 * 30;
23
+ this.concurrentRequests = 0;
24
+ this.strikes = 0;
25
+ if (process.env.NODE_ENV?.startsWith('prod')) {
26
+ setInterval(() => {
27
+ this.routine();
28
+ }, 1000 * 30).unref();
29
+ }
30
+ }
31
+ async init() {
32
+ await this.dependencyReady();
33
+ this.logger.debug('BlackHoleDetector started');
34
+ this.emit('ready');
35
+ }
36
+ async routine() {
37
+ // We give routine a 3s grace period for potentially paused CPU to spin up and process some requests
38
+ await (0, timeout_1.delay)(3000);
39
+ const now = Date.now();
40
+ const lastWorked = this.lastWorkedTs;
41
+ if (!lastWorked) {
42
+ return;
43
+ }
44
+ const dt = (now - lastWorked);
45
+ if (this.concurrentRequests > 1 &&
46
+ this.lastIncomingRequestTs && lastWorked &&
47
+ this.lastIncomingRequestTs >= lastWorked &&
48
+ (dt > (this.maxDelay * (this.strikes + 1)))) {
49
+ this.logger.warn(`BlackHole detected, last worked: ${Math.ceil(dt / 1000)}s ago, concurrentRequests: ${this.concurrentRequests}`);
50
+ this.strikes += 1;
51
+ }
52
+ if (this.strikes >= 3) {
53
+ this.logger.error(`BlackHole detected for ${this.strikes} strikes, last worked: ${Math.ceil(dt / 1000)}s ago, concurrentRequests: ${this.concurrentRequests}`);
54
+ process.nextTick(() => {
55
+ this.emit('error', new Error(`BlackHole detected for ${this.strikes} strikes, last worked: ${Math.ceil(dt / 1000)}s ago, concurrentRequests: ${this.concurrentRequests}`));
56
+ // process.exit(1);
57
+ });
58
+ }
59
+ }
60
+ incomingRequest() {
61
+ this.lastIncomingRequestTs = Date.now();
62
+ this.lastWorkedTs ??= Date.now();
63
+ this.concurrentRequests++;
64
+ }
65
+ doneWithRequest() {
66
+ this.concurrentRequests--;
67
+ this.lastDoneRequestTs = Date.now();
68
+ }
69
+ itWorked() {
70
+ this.lastWorkedTs = Date.now();
71
+ this.strikes = 0;
72
+ }
73
+ };
74
+ exports.BlackHoleDetector = BlackHoleDetector;
75
+ exports.BlackHoleDetector = BlackHoleDetector = __decorate([
76
+ (0, tsyringe_1.singleton)(),
77
+ __metadata("design:paramtypes", [logger_1.GlobalLogger])
78
+ ], BlackHoleDetector);
79
+ ;
80
+ //# sourceMappingURL=blackhole-detector.js.map
build/services/blackhole-detector.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"blackhole-detector.js","sourceRoot":"","sources":["../../src/services/blackhole-detector.ts"],"names":[],"mappings":"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"}
build/services/brave-search.js ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BraveSearchExplicitOperatorsDto = exports.BraveSearchService = void 0;
13
+ const civkit_1 = require("civkit");
14
+ const tsyringe_1 = require("tsyringe");
15
+ const logger_1 = require("./logger");
16
+ const secrets_1 = require("../shared/services/secrets");
17
+ const brave_search_1 = require("../shared/3rd-party/brave-search");
18
+ const geoip_1 = require("./geoip");
19
+ const async_context_1 = require("./async-context");
20
+ const blackhole_detector_1 = require("./blackhole-detector");
21
+ let BraveSearchService = class BraveSearchService extends civkit_1.AsyncService {
22
+ constructor(globalLogger, secretExposer, geoipControl, threadLocal, blackHoleDetector) {
23
+ super(...arguments);
24
+ this.globalLogger = globalLogger;
25
+ this.secretExposer = secretExposer;
26
+ this.geoipControl = geoipControl;
27
+ this.threadLocal = threadLocal;
28
+ this.blackHoleDetector = blackHoleDetector;
29
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
30
+ }
31
+ async init() {
32
+ await this.dependencyReady();
33
+ this.emit('ready');
34
+ this.braveSearchHTTP = new brave_search_1.BraveSearchHTTP(this.secretExposer.BRAVE_SEARCH_API_KEY);
35
+ }
36
+ async webSearch(query) {
37
+ const ip = this.threadLocal.get('ip');
38
+ const extraHeaders = {};
39
+ if (ip) {
40
+ const geoip = await this.geoipControl.lookupCity(ip, geoip_1.GEOIP_SUPPORTED_LANGUAGES.EN);
41
+ if (geoip?.city) {
42
+ extraHeaders['X-Loc-City'] = encodeURIComponent(geoip.city);
43
+ }
44
+ if (geoip?.country) {
45
+ extraHeaders['X-Loc-Country'] = geoip.country.code;
46
+ }
47
+ if (geoip?.timezone) {
48
+ extraHeaders['X-Loc-Timezone'] = geoip.timezone;
49
+ }
50
+ if (geoip?.coordinates) {
51
+ extraHeaders['X-Loc-Lat'] = `${geoip.coordinates[0]}`;
52
+ extraHeaders['X-Loc-Long'] = `${geoip.coordinates[1]}`;
53
+ }
54
+ if (geoip?.subdivisions?.length) {
55
+ extraHeaders['X-Loc-State'] = encodeURIComponent(`${geoip.subdivisions[0].code}`);
56
+ extraHeaders['X-Loc-State-Name'] = encodeURIComponent(`${geoip.subdivisions[0].name}`);
57
+ }
58
+ }
59
+ if (this.threadLocal.get('userAgent')) {
60
+ extraHeaders['User-Agent'] = this.threadLocal.get('userAgent');
61
+ }
62
+ const encoded = { ...query };
63
+ if (encoded.q) {
64
+ encoded.q = (Buffer.from(encoded.q).toString('ascii') === encoded.q) ? encoded.q : encodeURIComponent(encoded.q);
65
+ }
66
+ let maxTries = 11;
67
+ while (maxTries--) {
68
+ try {
69
+ const r = await this.braveSearchHTTP.webSearch(encoded, { headers: extraHeaders });
70
+ this.blackHoleDetector.itWorked();
71
+ return r.parsed;
72
+ }
73
+ catch (err) {
74
+ this.logger.error(`Web search failed: ${err?.message}`, { err: (0, civkit_1.marshalErrorLike)(err) });
75
+ if (err?.status === 429) {
76
+ await (0, civkit_1.delay)(500 + 1000 * Math.random());
77
+ continue;
78
+ }
79
+ throw new civkit_1.DownstreamServiceFailureError({ message: `Search failed` });
80
+ }
81
+ }
82
+ throw new civkit_1.DownstreamServiceFailureError({ message: `Search failed` });
83
+ }
84
+ };
85
+ exports.BraveSearchService = BraveSearchService;
86
+ exports.BraveSearchService = BraveSearchService = __decorate([
87
+ (0, tsyringe_1.singleton)(),
88
+ __metadata("design:paramtypes", [logger_1.GlobalLogger,
89
+ secrets_1.SecretExposer,
90
+ geoip_1.GeoIPService,
91
+ async_context_1.AsyncLocalContext,
92
+ blackhole_detector_1.BlackHoleDetector])
93
+ ], BraveSearchService);
94
+ class BraveSearchExplicitOperatorsDto extends civkit_1.AutoCastable {
95
+ addTo(searchTerm) {
96
+ const chunks = [];
97
+ for (const [key, value] of Object.entries(this)) {
98
+ if (value) {
99
+ const values = Array.isArray(value) ? value : [value];
100
+ const textValue = values.map((v) => `${key}:${v}`).join(' OR ');
101
+ if (textValue) {
102
+ chunks.push(textValue);
103
+ }
104
+ }
105
+ }
106
+ const opPart = chunks.length > 1 ? chunks.map((x) => `(${x})`).join(' AND ') : chunks;
107
+ if (opPart.length) {
108
+ return [searchTerm, opPart].join(' ');
109
+ }
110
+ return searchTerm;
111
+ }
112
+ static from(input) {
113
+ const instance = super.from(input);
114
+ const ctx = Reflect.get(input, civkit_1.RPC_CALL_ENVIRONMENT);
115
+ const params = ['ext', 'filetype', 'inbody', 'intitle', 'inpage', 'lang', 'loc', 'site'];
116
+ for (const p of params) {
117
+ const customValue = ctx?.req.get(`x-${p}`) || ctx?.req.get(`${p}`);
118
+ if (!customValue) {
119
+ continue;
120
+ }
121
+ const filtered = customValue.split(', ').filter(Boolean);
122
+ if (filtered.length) {
123
+ Reflect.set(instance, p, filtered);
124
+ }
125
+ }
126
+ return instance;
127
+ }
128
+ }
129
+ exports.BraveSearchExplicitOperatorsDto = BraveSearchExplicitOperatorsDto;
130
+ __decorate([
131
+ (0, civkit_1.Prop)({
132
+ arrayOf: String,
133
+ desc: `Returns web pages with a specific file extension. Example: to find the Honda GX120 Owner’s manual in PDF, type “Honda GX120 ownners manual ext:pdf”.`
134
+ }),
135
+ __metadata("design:type", Object)
136
+ ], BraveSearchExplicitOperatorsDto.prototype, "ext", void 0);
137
+ __decorate([
138
+ (0, civkit_1.Prop)({
139
+ arrayOf: String,
140
+ desc: `Returns web pages created in the specified file type. Example: to find a web page created in PDF format about the evaluation of age-related cognitive changes, type “evaluation of age cognitive changes filetype:pdf”.`
141
+ }),
142
+ __metadata("design:type", Object)
143
+ ], BraveSearchExplicitOperatorsDto.prototype, "filetype", void 0);
144
+ __decorate([
145
+ (0, civkit_1.Prop)({
146
+ arrayOf: String,
147
+ desc: `Returns web pages containing the specified term in the body of the page. Example: to find information about the Nvidia GeForce GTX 1080 Ti, making sure the page contains the keywords “founders edition” in the body, type “nvidia 1080 ti inbody:“founders edition””.`
148
+ }),
149
+ __metadata("design:type", Object)
150
+ ], BraveSearchExplicitOperatorsDto.prototype, "inbody", void 0);
151
+ __decorate([
152
+ (0, civkit_1.Prop)({
153
+ arrayOf: String,
154
+ desc: `Returns webpages containing the specified term in the title of the page. Example: to find pages about SEO conferences making sure the results contain 2023 in the title, type “seo conference intitle:2023”.`
155
+ }),
156
+ __metadata("design:type", Object)
157
+ ], BraveSearchExplicitOperatorsDto.prototype, "intitle", void 0);
158
+ __decorate([
159
+ (0, civkit_1.Prop)({
160
+ arrayOf: String,
161
+ desc: `Returns webpages containing the specified term either in the title or in the body of the page. Example: to find pages about the 2024 Oscars containing the keywords “best costume design” in the page, type “oscars 2024 inpage:“best costume design””.`
162
+ }),
163
+ __metadata("design:type", Object)
164
+ ], BraveSearchExplicitOperatorsDto.prototype, "inpage", void 0);
165
+ __decorate([
166
+ (0, civkit_1.Prop)({
167
+ arrayOf: String,
168
+ desc: `Returns web pages written in the specified language. The language code must be in the ISO 639-1 two-letter code format. Example: to find information on visas only in Spanish, type “visas lang:es”.`
169
+ }),
170
+ __metadata("design:type", Object)
171
+ ], BraveSearchExplicitOperatorsDto.prototype, "lang", void 0);
172
+ __decorate([
173
+ (0, civkit_1.Prop)({
174
+ arrayOf: String,
175
+ desc: `Returns web pages written in the specified language. The language code must be in the ISO 639-1 two-letter code format. Example: to find information on visas only in Spanish, type “visas lang:es”.`
176
+ }),
177
+ __metadata("design:type", Object)
178
+ ], BraveSearchExplicitOperatorsDto.prototype, "loc", void 0);
179
+ __decorate([
180
+ (0, civkit_1.Prop)({
181
+ arrayOf: String,
182
+ desc: `Returns web pages coming only from a specific web site. Example: to find information about Goggles only on Brave pages, type “goggles site:brave.com”.`
183
+ }),
184
+ __metadata("design:type", Object)
185
+ ], BraveSearchExplicitOperatorsDto.prototype, "site", void 0);
186
+ //# sourceMappingURL=brave-search.js.map
build/services/brave-search.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"brave-search.js","sourceRoot":"","sources":["../../src/services/brave-search.ts"],"names":[],"mappings":"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"}
build/services/canvas.js ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CanvasService = void 0;
16
+ const tsyringe_1 = require("tsyringe");
17
+ const civkit_1 = require("civkit");
18
+ const promises_1 = require("fs/promises");
19
+ const logger_1 = require("./logger");
20
+ const temp_file_1 = require("./temp-file");
21
+ const worker_threads_1 = require("worker_threads");
22
+ const path_1 = __importDefault(require("path"));
23
+ const threaded_1 = require("./threaded");
24
+ const downloadFile = async (uri) => {
25
+ const resp = await fetch(uri);
26
+ if (!(resp.ok && resp.body)) {
27
+ throw new Error(`Unexpected response ${resp.statusText}`);
28
+ }
29
+ const contentLength = parseInt(resp.headers.get('content-length') || '0');
30
+ if (contentLength > 1024 * 1024 * 100) {
31
+ throw new Error('File too large');
32
+ }
33
+ const buff = await resp.arrayBuffer();
34
+ return { buff, contentType: resp.headers.get('content-type') };
35
+ };
36
+ let CanvasService = class CanvasService extends civkit_1.AsyncService {
37
+ constructor(temp, globalLogger) {
38
+ super(...arguments);
39
+ this.temp = temp;
40
+ this.globalLogger = globalLogger;
41
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
42
+ }
43
+ async init() {
44
+ await this.dependencyReady();
45
+ if (!worker_threads_1.isMainThread) {
46
+ const { createSvg2png, initialize } = require('svg2png-wasm');
47
+ const wasmBuff = await (0, promises_1.readFile)(path_1.default.resolve(path_1.default.dirname(require.resolve('svg2png-wasm')), '../svg2png_wasm_bg.wasm'));
48
+ const fontBuff = await (0, promises_1.readFile)(path_1.default.resolve(__dirname, '../../licensed/SourceHanSansSC-Regular.otf'));
49
+ await initialize(wasmBuff);
50
+ this.svg2png = createSvg2png({
51
+ fonts: [Uint8Array.from(fontBuff)],
52
+ defaultFontFamily: {
53
+ serifFamily: 'Source Han Sans SC',
54
+ sansSerifFamily: 'Source Han Sans SC',
55
+ cursiveFamily: 'Source Han Sans SC',
56
+ fantasyFamily: 'Source Han Sans SC',
57
+ monospaceFamily: 'Source Han Sans SC',
58
+ }
59
+ });
60
+ }
61
+ this.canvas = require('@napi-rs/canvas');
62
+ this.emit('ready');
63
+ }
64
+ async renderSvgToPng(svgContent) {
65
+ return this.svg2png(svgContent, { backgroundColor: '#D3D3D3' });
66
+ }
67
+ async _loadImage(input) {
68
+ let buff;
69
+ let contentType;
70
+ do {
71
+ if (typeof input === 'string') {
72
+ if (input.startsWith('data:')) {
73
+ const firstComma = input.indexOf(',');
74
+ const header = input.slice(0, firstComma);
75
+ const data = input.slice(firstComma + 1);
76
+ const encoding = header.split(';')[1];
77
+ contentType = header.split(';')[0].split(':')[1];
78
+ if (encoding?.startsWith('base64')) {
79
+ buff = Buffer.from(data, 'base64');
80
+ }
81
+ else {
82
+ buff = Buffer.from(decodeURIComponent(data), 'utf-8');
83
+ }
84
+ break;
85
+ }
86
+ if (input.startsWith('http')) {
87
+ const r = await downloadFile(input);
88
+ buff = Buffer.from(r.buff);
89
+ contentType = r.contentType;
90
+ break;
91
+ }
92
+ }
93
+ if (Buffer.isBuffer(input)) {
94
+ buff = input;
95
+ const mime = await (0, civkit_1.mimeOf)(buff);
96
+ contentType = `${mime.mediaType}/${mime.subType}`;
97
+ break;
98
+ }
99
+ throw new civkit_1.ParamValidationError('Invalid input');
100
+ } while (false);
101
+ if (!buff) {
102
+ throw new civkit_1.ParamValidationError('Invalid input');
103
+ }
104
+ if (contentType?.includes('svg')) {
105
+ buff = await this.renderSvgToPng(buff.toString('utf-8'));
106
+ }
107
+ const img = await this.canvas.loadImage(buff);
108
+ Reflect.set(img, 'contentType', contentType);
109
+ return img;
110
+ }
111
+ async loadImage(uri) {
112
+ const t0 = Date.now();
113
+ try {
114
+ const theImage = await this._loadImage(uri);
115
+ const t1 = Date.now();
116
+ this.logger.debug(`Image loaded in ${t1 - t0}ms`);
117
+ return theImage;
118
+ }
119
+ catch (err) {
120
+ if (err?.message?.includes('Unsupported image type') || err?.message?.includes('unsupported')) {
121
+ this.logger.warn(`Failed to load image ${uri.slice(0, 128)}`, { err });
122
+ throw new civkit_1.SubmittedDataMalformedError(`Unknown image format for ${uri.slice(0, 128)}`);
123
+ }
124
+ throw err;
125
+ }
126
+ }
127
+ fitImageToSquareBox(image, size = 1024) {
128
+ // this.logger.debug(`Fitting image(${ image.width }x${ image.height }) to ${ size } box`);
129
+ // const t0 = Date.now();
130
+ if (image.width <= size && image.height <= size) {
131
+ if (image instanceof this.canvas.Canvas) {
132
+ return image;
133
+ }
134
+ const canvasInstance = this.canvas.createCanvas(image.width, image.height);
135
+ const ctx = canvasInstance.getContext('2d');
136
+ ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvasInstance.width, canvasInstance.height);
137
+ // this.logger.debug(`No need to resize, copied to canvas in ${ Date.now() - t0 } ms`);
138
+ return canvasInstance;
139
+ }
140
+ const aspectRatio = image.width / image.height;
141
+ const resizedWidth = Math.round(aspectRatio > 1 ? size : size * aspectRatio);
142
+ const resizedHeight = Math.round(aspectRatio > 1 ? size / aspectRatio : size);
143
+ const canvasInstance = this.canvas.createCanvas(resizedWidth, resizedHeight);
144
+ const ctx = canvasInstance.getContext('2d');
145
+ ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, resizedWidth, resizedHeight);
146
+ // this.logger.debug(`Resized to ${ resizedWidth }x${ resizedHeight } in ${ Date.now() - t0 } ms`);
147
+ return canvasInstance;
148
+ }
149
+ corpImage(image, x, y, w, h) {
150
+ // this.logger.debug(`Cropping image(${ image.width }x${ image.height }) to ${ w }x${ h } at ${ x },${ y } `);
151
+ // const t0 = Date.now();
152
+ const canvasInstance = this.canvas.createCanvas(w, h);
153
+ const ctx = canvasInstance.getContext('2d');
154
+ ctx.drawImage(image, x, y, w, h, 0, 0, w, h);
155
+ // this.logger.debug(`Crop complete in ${ Date.now() - t0 } ms`);
156
+ return canvasInstance;
157
+ }
158
+ canvasToDataUrl(canvas, mimeType) {
159
+ // this.logger.debug(`Exporting canvas(${ canvas.width }x${ canvas.height })`);
160
+ // const t0 = Date.now();
161
+ return canvas.toDataURLAsync((mimeType || 'image/png'));
162
+ }
163
+ async canvasToBuffer(canvas, mimeType) {
164
+ // this.logger.debug(`Exporting canvas(${ canvas.width }x${ canvas.height })`);
165
+ // const t0 = Date.now();
166
+ return canvas.toBuffer((mimeType || 'image/png'));
167
+ }
168
+ };
169
+ exports.CanvasService = CanvasService;
170
+ __decorate([
171
+ (0, threaded_1.Threaded)(),
172
+ __metadata("design:type", Function),
173
+ __metadata("design:paramtypes", [String]),
174
+ __metadata("design:returntype", Promise)
175
+ ], CanvasService.prototype, "renderSvgToPng", null);
176
+ exports.CanvasService = CanvasService = __decorate([
177
+ (0, tsyringe_1.singleton)(),
178
+ __metadata("design:paramtypes", [temp_file_1.TempFileManager,
179
+ logger_1.GlobalLogger])
180
+ ], CanvasService);
181
+ const instance = tsyringe_1.container.resolve(CanvasService);
182
+ exports.default = instance;
183
+ //# sourceMappingURL=canvas.js.map
build/services/canvas.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/services/canvas.ts"],"names":[],"mappings":"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"}
build/services/cf-browser-rendering.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CFBrowserRendering = void 0;
13
+ const tsyringe_1 = require("tsyringe");
14
+ const async_service_1 = require("civkit/async-service");
15
+ const secrets_1 = require("../shared/services/secrets");
16
+ const logger_1 = require("./logger");
17
+ const cloud_flare_1 = require("../shared/3rd-party/cloud-flare");
18
+ const http_1 = require("civkit/http");
19
+ const errors_1 = require("./errors");
20
+ let CFBrowserRendering = class CFBrowserRendering extends async_service_1.AsyncService {
21
+ constructor(globalLogger, secretExposer) {
22
+ super(...arguments);
23
+ this.globalLogger = globalLogger;
24
+ this.secretExposer = secretExposer;
25
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
26
+ }
27
+ async init() {
28
+ await this.dependencyReady();
29
+ const [account, key] = this.secretExposer.CLOUD_FLARE_API_KEY?.split(':');
30
+ this.client = new cloud_flare_1.CloudFlareHTTP(account, key);
31
+ this.emit('ready');
32
+ }
33
+ async fetchContent(url) {
34
+ try {
35
+ const r = await this.client.fetchBrowserRenderedHTML({ url });
36
+ return r.parsed.result;
37
+ }
38
+ catch (err) {
39
+ if (err instanceof http_1.HTTPServiceError) {
40
+ if (err.status === 429) {
41
+ // Rate limit exceeded, return empty result
42
+ this.logger.warn('Cloudflare browser rendering rate limit exceeded', { url });
43
+ throw new errors_1.ServiceNodeResourceDrainError(`Cloudflare browser rendering (our account) is at capacity, please try again later or switch to another engine.`);
44
+ }
45
+ }
46
+ throw err;
47
+ }
48
+ }
49
+ };
50
+ exports.CFBrowserRendering = CFBrowserRendering;
51
+ exports.CFBrowserRendering = CFBrowserRendering = __decorate([
52
+ (0, tsyringe_1.singleton)(),
53
+ __metadata("design:paramtypes", [logger_1.GlobalLogger,
54
+ secrets_1.SecretExposer])
55
+ ], CFBrowserRendering);
56
+ const instance = tsyringe_1.container.resolve(CFBrowserRendering);
57
+ exports.default = instance;
58
+ //# sourceMappingURL=cf-browser-rendering.js.map
build/services/cf-browser-rendering.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"cf-browser-rendering.js","sourceRoot":"","sources":["../../src/services/cf-browser-rendering.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAAgD;AAChD,wDAAoD;AACpD,wDAA2D;AAC3D,qCAAwC;AACxC,iEAAiE;AACjE,sCAA+C;AAC/C,qCAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,4BAAY;IAKhD,YACc,YAA0B,EAC1B,aAA4B;QAEtC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QAHV,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAL1C,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAQrE,CAAC;IAGQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,4BAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC1B,IAAI,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAE9D,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,GAAG,YAAY,uBAAgB,EAAE,CAAC;gBAClC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrB,2CAA2C;oBAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBAE9E,MAAM,IAAI,sCAA6B,CAAC,gHAAgH,CAAE,CAAC;gBAC/J,CAAC;YACL,CAAC;YAED,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;CAEJ,CAAA;AAxCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,oBAAS,GAAE;qCAOoB,qBAAY;QACX,uBAAa;GAPjC,kBAAkB,CAwC9B;AAED,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEvD,kBAAe,QAAQ,CAAC"}
build/services/curl.js ADDED
@@ -0,0 +1,431 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CurlControl = void 0;
16
+ const async_service_1 = require("civkit/async-service");
17
+ const tsyringe_1 = require("tsyringe");
18
+ const node_libcurl_1 = require("node-libcurl");
19
+ const set_cookie_parser_1 = require("set-cookie-parser");
20
+ const logger_1 = require("./logger");
21
+ const civkit_1 = require("civkit");
22
+ const errors_1 = require("./errors");
23
+ const temp_file_1 = require("../services/temp-file");
24
+ const zlib_1 = require("zlib");
25
+ const simple_zstd_1 = require("simple-zstd");
26
+ const lodash_1 = __importDefault(require("lodash"));
27
+ const async_context_1 = require("./async-context");
28
+ const blackhole_detector_1 = require("./blackhole-detector");
29
+ let CurlControl = class CurlControl extends async_service_1.AsyncService {
30
+ constructor(globalLogger, tempFileManager, asyncLocalContext, blackHoleDetector) {
31
+ super(...arguments);
32
+ this.globalLogger = globalLogger;
33
+ this.tempFileManager = tempFileManager;
34
+ this.asyncLocalContext = asyncLocalContext;
35
+ this.blackHoleDetector = blackHoleDetector;
36
+ this.logger = this.globalLogger.child({ service: this.constructor.name });
37
+ this.chromeVersion = `132`;
38
+ this.safariVersion = `537.36`;
39
+ this.platform = `Linux`;
40
+ this.ua = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/${this.safariVersion} (KHTML, like Gecko) Chrome/${this.chromeVersion}.0.0.0 Safari/${this.safariVersion}`;
41
+ this.lifeCycleTrack = new WeakMap();
42
+ }
43
+ async init() {
44
+ await this.dependencyReady();
45
+ if (process.platform === 'darwin') {
46
+ this.platform = `macOS`;
47
+ }
48
+ else if (process.platform === 'win32') {
49
+ this.platform = `Windows`;
50
+ }
51
+ this.emit('ready');
52
+ }
53
+ impersonateChrome(ua) {
54
+ this.chromeVersion = ua.match(/Chrome\/(\d+)/)[1];
55
+ this.safariVersion = ua.match(/AppleWebKit\/([\d\.]+)/)[1];
56
+ this.ua = ua;
57
+ }
58
+ curlImpersonateHeader(curl, headers) {
59
+ let uaPlatform = this.platform;
60
+ if (this.ua.includes('Windows')) {
61
+ uaPlatform = 'Windows';
62
+ }
63
+ else if (this.ua.includes('Android')) {
64
+ uaPlatform = 'Android';
65
+ }
66
+ else if (this.ua.includes('iPhone') || this.ua.includes('iPad') || this.ua.includes('iPod')) {
67
+ uaPlatform = 'iOS';
68
+ }
69
+ else if (this.ua.includes('CrOS')) {
70
+ uaPlatform = 'Chrome OS';
71
+ }
72
+ else if (this.ua.includes('Macintosh')) {
73
+ uaPlatform = 'macOS';
74
+ }
75
+ const mixinHeaders = {
76
+ 'Sec-Ch-Ua': `Not A(Brand";v="8", "Chromium";v="${this.chromeVersion}", "Google Chrome";v="${this.chromeVersion}"`,
77
+ 'Sec-Ch-Ua-Mobile': '?0',
78
+ 'Sec-Ch-Ua-Platform': `"${uaPlatform}"`,
79
+ 'Upgrade-Insecure-Requests': '1',
80
+ 'User-Agent': this.ua,
81
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
82
+ 'Sec-Fetch-Site': 'none',
83
+ 'Sec-Fetch-Mode': 'navigate',
84
+ 'Sec-Fetch-User': '?1',
85
+ 'Sec-Fetch-Dest': 'document',
86
+ 'Accept-Encoding': 'gzip, deflate, br, zstd',
87
+ 'Accept-Language': 'en-US,en;q=0.9',
88
+ };
89
+ const headersCopy = { ...headers };
90
+ for (const k of Object.keys(mixinHeaders)) {
91
+ const lowerK = k.toLowerCase();
92
+ if (headersCopy[lowerK]) {
93
+ mixinHeaders[k] = headersCopy[lowerK];
94
+ delete headersCopy[lowerK];
95
+ }
96
+ }
97
+ Object.assign(mixinHeaders, headersCopy);
98
+ curl.setOpt(node_libcurl_1.Curl.option.HTTPHEADER, Object.entries(mixinHeaders).flatMap(([k, v]) => {
99
+ if (Array.isArray(v) && v.length) {
100
+ return v.map((v2) => `${k}: ${v2}`);
101
+ }
102
+ return [`${k}: ${v}`];
103
+ }));
104
+ return curl;
105
+ }
106
+ urlToFile1Shot(urlToCrawl, crawlOpts) {
107
+ return new Promise((resolve, reject) => {
108
+ let contentType = '';
109
+ const curl = new node_libcurl_1.Curl();
110
+ curl.enable(node_libcurl_1.CurlFeature.StreamResponse);
111
+ curl.setOpt('URL', urlToCrawl.toString());
112
+ curl.setOpt(node_libcurl_1.Curl.option.FOLLOWLOCATION, false);
113
+ curl.setOpt(node_libcurl_1.Curl.option.SSL_VERIFYPEER, false);
114
+ curl.setOpt(node_libcurl_1.Curl.option.TIMEOUT_MS, crawlOpts?.timeoutMs || 30_000);
115
+ curl.setOpt(node_libcurl_1.Curl.option.CONNECTTIMEOUT_MS, 3_000);
116
+ curl.setOpt(node_libcurl_1.Curl.option.LOW_SPEED_LIMIT, 32768);
117
+ curl.setOpt(node_libcurl_1.Curl.option.LOW_SPEED_TIME, 5_000);
118
+ if (crawlOpts?.method) {
119
+ curl.setOpt(node_libcurl_1.Curl.option.CUSTOMREQUEST, crawlOpts.method.toUpperCase());
120
+ }
121
+ if (crawlOpts?.body) {
122
+ curl.setOpt(node_libcurl_1.Curl.option.POSTFIELDS, crawlOpts.body.toString());
123
+ }
124
+ const headersToSet = { ...crawlOpts?.extraHeaders };
125
+ if (crawlOpts?.cookies?.length) {
126
+ const cookieKv = {};
127
+ for (const cookie of crawlOpts.cookies) {
128
+ cookieKv[cookie.name] = cookie.value;
129
+ }
130
+ for (const cookie of crawlOpts.cookies) {
131
+ if (cookie.maxAge && cookie.maxAge < 0) {
132
+ delete cookieKv[cookie.name];
133
+ continue;
134
+ }
135
+ if (cookie.expires && cookie.expires < new Date()) {
136
+ delete cookieKv[cookie.name];
137
+ continue;
138
+ }
139
+ if (cookie.secure && urlToCrawl.protocol !== 'https:') {
140
+ delete cookieKv[cookie.name];
141
+ continue;
142
+ }
143
+ if (cookie.domain && !urlToCrawl.hostname.endsWith(cookie.domain)) {
144
+ delete cookieKv[cookie.name];
145
+ continue;
146
+ }
147
+ if (cookie.path && !urlToCrawl.pathname.startsWith(cookie.path)) {
148
+ delete cookieKv[cookie.name];
149
+ continue;
150
+ }
151
+ }
152
+ const cookieChunks = Object.entries(cookieKv).map(([k, v]) => `${k}=${encodeURIComponent(v)}`);
153
+ headersToSet.cookie ??= cookieChunks.join('; ');
154
+ }
155
+ if (crawlOpts?.referer) {
156
+ headersToSet.referer ??= crawlOpts.referer;
157
+ }
158
+ if (crawlOpts?.overrideUserAgent) {
159
+ headersToSet['user-agent'] ??= crawlOpts.overrideUserAgent;
160
+ }
161
+ this.curlImpersonateHeader(curl, headersToSet);
162
+ if (crawlOpts?.proxyUrl) {
163
+ const proxyUrlCopy = new URL(crawlOpts.proxyUrl);
164
+ curl.setOpt(node_libcurl_1.Curl.option.PROXY, proxyUrlCopy.href);
165
+ }
166
+ let curlStream;
167
+ curl.on('error', (err, errCode) => {
168
+ curl.close();
169
+ this.logger.warn(`Curl ${urlToCrawl.origin}: ${err}`, { err, urlToCrawl });
170
+ const err2 = this.digestCurlCode(errCode, err.message) ||
171
+ new civkit_1.AssertionFailureError(`Failed to access ${urlToCrawl.origin}: ${err.message}`);
172
+ err2.cause ??= err;
173
+ if (curlStream) {
174
+ // For some reason, manually emitting error event is required for curlStream.
175
+ curlStream.emit('error', err2);
176
+ curlStream.destroy(err2);
177
+ }
178
+ reject(err2);
179
+ });
180
+ curl.setOpt(node_libcurl_1.Curl.option.MAXFILESIZE, 4 * 1024 * 1024 * 1024); // 4GB
181
+ let status = -1;
182
+ let statusText;
183
+ let contentEncoding = '';
184
+ curl.once('end', () => {
185
+ if (curlStream) {
186
+ curlStream.once('end', () => curl.close());
187
+ return;
188
+ }
189
+ curl.close();
190
+ });
191
+ curl.on('stream', (stream, statusCode, headers) => {
192
+ this.logger.debug(`CURL: [${statusCode}] ${urlToCrawl.origin}`, { statusCode });
193
+ status = statusCode;
194
+ curlStream = stream;
195
+ for (const headerSet of headers) {
196
+ for (const [k, v] of Object.entries(headerSet)) {
197
+ if (k.trim().endsWith(':')) {
198
+ Reflect.set(headerSet, k.slice(0, k.indexOf(':')), v || '');
199
+ Reflect.deleteProperty(headerSet, k);
200
+ continue;
201
+ }
202
+ if (v === undefined) {
203
+ Reflect.set(headerSet, k, '');
204
+ continue;
205
+ }
206
+ if (k.toLowerCase() === 'content-type' && typeof v === 'string') {
207
+ contentType = v.toLowerCase();
208
+ }
209
+ }
210
+ }
211
+ const lastResHeaders = headers[headers.length - 1];
212
+ statusText = lastResHeaders.result?.reason;
213
+ for (const [k, v] of Object.entries(lastResHeaders)) {
214
+ const kl = k.toLowerCase();
215
+ if (kl === 'content-type') {
216
+ contentType = (v || '').toLowerCase();
217
+ }
218
+ if (kl === 'content-encoding') {
219
+ contentEncoding = (v || '').toLowerCase();
220
+ }
221
+ if (contentType && contentEncoding) {
222
+ break;
223
+ }
224
+ }
225
+ if ([301, 302, 303, 307, 308].includes(statusCode)) {
226
+ if (stream) {
227
+ stream.resume();
228
+ }
229
+ resolve({
230
+ statusCode: status,
231
+ statusText,
232
+ data: undefined,
233
+ headers: headers,
234
+ });
235
+ return;
236
+ }
237
+ if (!stream) {
238
+ resolve({
239
+ statusCode: status,
240
+ statusText,
241
+ data: undefined,
242
+ headers: headers,
243
+ });
244
+ return;
245
+ }
246
+ switch (contentEncoding) {
247
+ case 'gzip': {
248
+ const decompressed = (0, zlib_1.createGunzip)();
249
+ stream.pipe(decompressed);
250
+ stream.once('error', (err) => {
251
+ decompressed.destroy(err);
252
+ });
253
+ stream = decompressed;
254
+ break;
255
+ }
256
+ case 'deflate': {
257
+ const decompressed = (0, zlib_1.createInflate)();
258
+ stream.pipe(decompressed);
259
+ stream.once('error', (err) => {
260
+ decompressed.destroy(err);
261
+ });
262
+ stream = decompressed;
263
+ break;
264
+ }
265
+ case 'br': {
266
+ const decompressed = (0, zlib_1.createBrotliDecompress)();
267
+ stream.pipe(decompressed);
268
+ stream.once('error', (err) => {
269
+ decompressed.destroy(err);
270
+ });
271
+ stream = decompressed;
272
+ break;
273
+ }
274
+ case 'zstd': {
275
+ const decompressed = (0, simple_zstd_1.ZSTDDecompress)();
276
+ stream.pipe(decompressed);
277
+ stream.once('error', (err) => {
278
+ decompressed.destroy(err);
279
+ });
280
+ stream = decompressed;
281
+ break;
282
+ }
283
+ default: {
284
+ break;
285
+ }
286
+ }
287
+ const fpath = this.tempFileManager.alloc();
288
+ const fancyFile = civkit_1.FancyFile.auto(stream, fpath);
289
+ this.tempFileManager.bindPathTo(fancyFile, fpath);
290
+ resolve({
291
+ statusCode: status,
292
+ statusText,
293
+ data: fancyFile,
294
+ headers: headers,
295
+ });
296
+ });
297
+ curl.perform();
298
+ });
299
+ }
300
+ async urlToFile(urlToCrawl, crawlOpts) {
301
+ let leftRedirection = 6;
302
+ let cookieRedirects = 0;
303
+ let opts = { ...crawlOpts };
304
+ let nextHopUrl = urlToCrawl;
305
+ const fakeHeaderInfos = [];
306
+ do {
307
+ const r = await this.urlToFile1Shot(nextHopUrl, opts);
308
+ if ([301, 302, 303, 307, 308].includes(r.statusCode)) {
309
+ fakeHeaderInfos.push(...r.headers);
310
+ const headers = r.headers[r.headers.length - 1];
311
+ const location = headers.Location || headers.location;
312
+ const setCookieHeader = headers['Set-Cookie'] || headers['set-cookie'];
313
+ if (setCookieHeader) {
314
+ const cookieAssignments = Array.isArray(setCookieHeader) ? setCookieHeader : [setCookieHeader];
315
+ const parsed = cookieAssignments.filter(Boolean).map((x) => (0, set_cookie_parser_1.parseString)(x, { decodeValues: true }));
316
+ if (parsed.length) {
317
+ opts.cookies = [...(opts.cookies || []), ...parsed];
318
+ }
319
+ if (!location) {
320
+ cookieRedirects += 1;
321
+ }
322
+ }
323
+ if (!location && !setCookieHeader) {
324
+ // Follow curl behavior
325
+ return {
326
+ statusCode: r.statusCode,
327
+ data: r.data,
328
+ headers: fakeHeaderInfos.concat(r.headers),
329
+ };
330
+ }
331
+ if (!location && cookieRedirects > 1) {
332
+ throw new errors_1.ServiceBadApproachError(`Failed to access ${urlToCrawl}: Browser required to solve complex cookie preconditions.`);
333
+ }
334
+ nextHopUrl = new URL(location || '', nextHopUrl);
335
+ leftRedirection -= 1;
336
+ continue;
337
+ }
338
+ return {
339
+ statusCode: r.statusCode,
340
+ statusText: r.statusText,
341
+ data: r.data,
342
+ headers: fakeHeaderInfos.concat(r.headers),
343
+ };
344
+ } while (leftRedirection > 0);
345
+ throw new errors_1.ServiceBadAttemptError(`Failed to access ${urlToCrawl}: Too many redirections.`);
346
+ }
347
+ async sideLoad(targetUrl, crawlOpts) {
348
+ const curlResult = await this.urlToFile(targetUrl, crawlOpts);
349
+ this.blackHoleDetector.itWorked();
350
+ let finalURL = targetUrl;
351
+ const sideLoadOpts = {
352
+ impersonate: {},
353
+ proxyOrigin: {},
354
+ };
355
+ for (const headers of curlResult.headers) {
356
+ sideLoadOpts.impersonate[finalURL.href] = {
357
+ status: headers.result?.code || -1,
358
+ headers: lodash_1.default.omit(headers, 'result'),
359
+ contentType: headers['Content-Type'] || headers['content-type'],
360
+ };
361
+ if (crawlOpts?.proxyUrl) {
362
+ sideLoadOpts.proxyOrigin[finalURL.origin] = crawlOpts.proxyUrl;
363
+ }
364
+ if (headers.result?.code && [301, 302, 307, 308].includes(headers.result.code)) {
365
+ const location = headers.Location || headers.location;
366
+ if (location) {
367
+ finalURL = new URL(location, finalURL);
368
+ }
369
+ }
370
+ }
371
+ const lastHeaders = curlResult.headers[curlResult.headers.length - 1];
372
+ const contentType = (lastHeaders['Content-Type'] || lastHeaders['content-type'])?.toLowerCase() || (await curlResult.data?.mimeType) || 'application/octet-stream';
373
+ const contentDisposition = lastHeaders['Content-Disposition'] || lastHeaders['content-disposition'];
374
+ const fileName = contentDisposition?.match(/filename="([^"]+)"/i)?.[1] || finalURL.pathname.split('/').pop();
375
+ if (sideLoadOpts.impersonate[finalURL.href] && (await curlResult.data?.size)) {
376
+ sideLoadOpts.impersonate[finalURL.href].body = curlResult.data;
377
+ }
378
+ // This should keep the file from being garbage collected and deleted until this asyncContext/request is done.
379
+ this.lifeCycleTrack.set(this.asyncLocalContext.ctx, curlResult.data);
380
+ return {
381
+ finalURL,
382
+ sideLoadOpts,
383
+ chain: curlResult.headers,
384
+ status: curlResult.statusCode,
385
+ statusText: curlResult.statusText,
386
+ headers: lastHeaders,
387
+ contentType,
388
+ contentDisposition,
389
+ fileName,
390
+ file: curlResult.data
391
+ };
392
+ }
393
+ digestCurlCode(code, msg) {
394
+ switch (code) {
395
+ // 400 User errors
396
+ case node_libcurl_1.CurlCode.CURLE_COULDNT_RESOLVE_HOST: {
397
+ return new civkit_1.AssertionFailureError(msg);
398
+ }
399
+ // Maybe retry but dont retry with curl again
400
+ case node_libcurl_1.CurlCode.CURLE_OPERATION_TIMEDOUT:
401
+ case node_libcurl_1.CurlCode.CURLE_UNSUPPORTED_PROTOCOL:
402
+ case node_libcurl_1.CurlCode.CURLE_PEER_FAILED_VERIFICATION: {
403
+ return new errors_1.ServiceBadApproachError(msg);
404
+ }
405
+ // Retryable errors
406
+ case node_libcurl_1.CurlCode.CURLE_REMOTE_ACCESS_DENIED:
407
+ case node_libcurl_1.CurlCode.CURLE_SEND_ERROR:
408
+ case node_libcurl_1.CurlCode.CURLE_RECV_ERROR:
409
+ case node_libcurl_1.CurlCode.CURLE_GOT_NOTHING:
410
+ case node_libcurl_1.CurlCode.CURLE_SSL_CONNECT_ERROR:
411
+ case node_libcurl_1.CurlCode.CURLE_QUIC_CONNECT_ERROR:
412
+ case node_libcurl_1.CurlCode.CURLE_COULDNT_RESOLVE_PROXY:
413
+ case node_libcurl_1.CurlCode.CURLE_COULDNT_CONNECT:
414
+ case node_libcurl_1.CurlCode.CURLE_PARTIAL_FILE: {
415
+ return new errors_1.ServiceBadAttemptError(msg);
416
+ }
417
+ default: {
418
+ return undefined;
419
+ }
420
+ }
421
+ }
422
+ };
423
+ exports.CurlControl = CurlControl;
424
+ exports.CurlControl = CurlControl = __decorate([
425
+ (0, tsyringe_1.singleton)(),
426
+ __metadata("design:paramtypes", [logger_1.GlobalLogger,
427
+ temp_file_1.TempFileManager,
428
+ async_context_1.AsyncLocalContext,
429
+ blackhole_detector_1.BlackHoleDetector])
430
+ ], CurlControl);
431
+ //# sourceMappingURL=curl.js.map
build/services/curl.js.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"file":"curl.js","sourceRoot":"","sources":["../../src/services/curl.ts"],"names":[],"mappings":"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"}
build/services/errors.js ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BatchSizeTooLargeError = exports.SecurityCompromiseError = exports.HarmfulContentError = exports.BudgetExceededError = exports.LockConflictError = exports.InsufficientBalanceError = exports.TierFeatureConstraintError = exports.InsufficientCreditsError = exports.EmailUnverifiedError = exports.ServiceBadApproachError = exports.ServiceBadAttemptError = exports.ServiceNodeResourceDrainError = exports.ServiceCrashedError = exports.ServiceDisabledError = void 0;
13
+ const civ_rpc_1 = require("civkit/civ-rpc");
14
+ const dayjs_1 = __importDefault(require("dayjs"));
15
+ const utc_1 = __importDefault(require("dayjs/plugin/utc"));
16
+ dayjs_1.default.extend(utc_1.default);
17
+ let ServiceDisabledError = class ServiceDisabledError extends civ_rpc_1.ApplicationError {
18
+ };
19
+ exports.ServiceDisabledError = ServiceDisabledError;
20
+ exports.ServiceDisabledError = ServiceDisabledError = __decorate([
21
+ (0, civ_rpc_1.StatusCode)(50301)
22
+ ], ServiceDisabledError);
23
+ let ServiceCrashedError = class ServiceCrashedError extends civ_rpc_1.ApplicationError {
24
+ };
25
+ exports.ServiceCrashedError = ServiceCrashedError;
26
+ exports.ServiceCrashedError = ServiceCrashedError = __decorate([
27
+ (0, civ_rpc_1.StatusCode)(50302)
28
+ ], ServiceCrashedError);
29
+ let ServiceNodeResourceDrainError = class ServiceNodeResourceDrainError extends civ_rpc_1.ApplicationError {
30
+ };
31
+ exports.ServiceNodeResourceDrainError = ServiceNodeResourceDrainError;
32
+ exports.ServiceNodeResourceDrainError = ServiceNodeResourceDrainError = __decorate([
33
+ (0, civ_rpc_1.StatusCode)(50303)
34
+ ], ServiceNodeResourceDrainError);
35
+ let ServiceBadAttemptError = class ServiceBadAttemptError extends civ_rpc_1.ApplicationError {
36
+ };
37
+ exports.ServiceBadAttemptError = ServiceBadAttemptError;
38
+ exports.ServiceBadAttemptError = ServiceBadAttemptError = __decorate([
39
+ (0, civ_rpc_1.StatusCode)(50304)
40
+ ], ServiceBadAttemptError);
41
+ let ServiceBadApproachError = class ServiceBadApproachError extends ServiceBadAttemptError {
42
+ };
43
+ exports.ServiceBadApproachError = ServiceBadApproachError;
44
+ exports.ServiceBadApproachError = ServiceBadApproachError = __decorate([
45
+ (0, civ_rpc_1.StatusCode)(50305)
46
+ ], ServiceBadApproachError);
47
+ let EmailUnverifiedError = class EmailUnverifiedError extends civ_rpc_1.ApplicationError {
48
+ };
49
+ exports.EmailUnverifiedError = EmailUnverifiedError;
50
+ exports.EmailUnverifiedError = EmailUnverifiedError = __decorate([
51
+ (0, civ_rpc_1.StatusCode)(40104)
52
+ ], EmailUnverifiedError);
53
+ let InsufficientCreditsError = class InsufficientCreditsError extends civ_rpc_1.ApplicationError {
54
+ };
55
+ exports.InsufficientCreditsError = InsufficientCreditsError;
56
+ exports.InsufficientCreditsError = InsufficientCreditsError = __decorate([
57
+ (0, civ_rpc_1.StatusCode)(40201)
58
+ ], InsufficientCreditsError);
59
+ let TierFeatureConstraintError = class TierFeatureConstraintError extends civ_rpc_1.ApplicationError {
60
+ };
61
+ exports.TierFeatureConstraintError = TierFeatureConstraintError;
62
+ exports.TierFeatureConstraintError = TierFeatureConstraintError = __decorate([
63
+ (0, civ_rpc_1.StatusCode)(40202)
64
+ ], TierFeatureConstraintError);
65
+ let InsufficientBalanceError = class InsufficientBalanceError extends civ_rpc_1.ApplicationError {
66
+ };
67
+ exports.InsufficientBalanceError = InsufficientBalanceError;
68
+ exports.InsufficientBalanceError = InsufficientBalanceError = __decorate([
69
+ (0, civ_rpc_1.StatusCode)(40203)
70
+ ], InsufficientBalanceError);
71
+ let LockConflictError = class LockConflictError extends civ_rpc_1.ApplicationError {
72
+ };
73
+ exports.LockConflictError = LockConflictError;
74
+ exports.LockConflictError = LockConflictError = __decorate([
75
+ (0, civ_rpc_1.StatusCode)(40903)
76
+ ], LockConflictError);
77
+ let BudgetExceededError = class BudgetExceededError extends civ_rpc_1.ApplicationError {
78
+ };
79
+ exports.BudgetExceededError = BudgetExceededError;
80
+ exports.BudgetExceededError = BudgetExceededError = __decorate([
81
+ (0, civ_rpc_1.StatusCode)(40904)
82
+ ], BudgetExceededError);
83
+ let HarmfulContentError = class HarmfulContentError extends civ_rpc_1.ApplicationError {
84
+ };
85
+ exports.HarmfulContentError = HarmfulContentError;
86
+ exports.HarmfulContentError = HarmfulContentError = __decorate([
87
+ (0, civ_rpc_1.StatusCode)(45101)
88
+ ], HarmfulContentError);
89
+ let SecurityCompromiseError = class SecurityCompromiseError extends civ_rpc_1.ApplicationError {
90
+ };
91
+ exports.SecurityCompromiseError = SecurityCompromiseError;
92
+ exports.SecurityCompromiseError = SecurityCompromiseError = __decorate([
93
+ (0, civ_rpc_1.StatusCode)(45102)
94
+ ], SecurityCompromiseError);
95
+ let BatchSizeTooLargeError = class BatchSizeTooLargeError extends civ_rpc_1.ApplicationError {
96
+ };
97
+ exports.BatchSizeTooLargeError = BatchSizeTooLargeError;
98
+ exports.BatchSizeTooLargeError = BatchSizeTooLargeError = __decorate([
99
+ (0, civ_rpc_1.StatusCode)(41201)
100
+ ], BatchSizeTooLargeError);
101
+ //# sourceMappingURL=errors.js.map