Spaces:
Build error
Build error
Mohammad Shahid commited on
Commit ·
f316cce
1
Parent(s): 5ce5ea7
Include pre-built files for HF deployment
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitignore +1 -1
- build/api/crawler.js +1170 -0
- build/api/crawler.js.map +1 -0
- build/api/searcher.js +771 -0
- build/api/searcher.js.map +1 -0
- build/api/serp.js +513 -0
- build/api/serp.js.map +1 -0
- build/cloud-functions/adaptive-crawler.js +510 -0
- build/cloud-functions/adaptive-crawler.js.map +1 -0
- build/cloud-functions/data-crunching.js +260 -0
- build/cloud-functions/data-crunching.js.map +1 -0
- build/db/adaptive-crawl-task.js +93 -0
- build/db/adaptive-crawl-task.js.map +1 -0
- build/db/crawled.js +86 -0
- build/db/crawled.js.map +1 -0
- build/db/domain-blockade.js +46 -0
- build/db/domain-blockade.js.map +1 -0
- build/db/domain-profile.js +47 -0
- build/db/domain-profile.js.map +1 -0
- build/db/img-alt.js +60 -0
- build/db/img-alt.js.map +1 -0
- build/db/pdf.js +78 -0
- build/db/pdf.js.map +1 -0
- build/db/searched.js +79 -0
- build/db/searched.js.map +1 -0
- build/dto/adaptive-crawler-options.js +70 -0
- build/dto/adaptive-crawler-options.js.map +1 -0
- build/dto/crawler-options.js +753 -0
- build/dto/crawler-options.js.map +1 -0
- build/dto/jina-embeddings-auth.js +237 -0
- build/dto/jina-embeddings-auth.js.map +1 -0
- build/dto/turndown-tweakable-options.js +81 -0
- build/dto/turndown-tweakable-options.js.map +1 -0
- build/lib/transform-server-event-stream.js +151 -0
- build/lib/transform-server-event-stream.js.map +1 -0
- build/services/alt-text.js +131 -0
- build/services/alt-text.js.map +1 -0
- build/services/async-context.js +21 -0
- build/services/async-context.js.map +1 -0
- build/services/blackhole-detector.js +80 -0
- build/services/blackhole-detector.js.map +1 -0
- build/services/brave-search.js +186 -0
- build/services/brave-search.js.map +1 -0
- build/services/canvas.js +183 -0
- build/services/canvas.js.map +1 -0
- build/services/cf-browser-rendering.js +58 -0
- build/services/cf-browser-rendering.js.map +1 -0
- build/services/curl.js +431 -0
- build/services/curl.js.map +1 -0
- 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(`- `);
|
| 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":";;;;;;;;;;;;AAAA,mCAAwI;AACxI,uCAAqC;AACrC,qCAAwC;AACxC,wDAA2D;AAC3D,mEAAyF;AACzF,mCAAkE;AAClE,mDAAoD;AAGpD,6DAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,qBAAY;IAMhD,YACc,YAA0B,EAC1B,aAA4B,EAC5B,YAA0B,EAC1B,WAA8B,EAC9B,iBAAoC;QAE9C,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QANV,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAC5B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,gBAAW,GAAX,WAAW,CAAmB;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QATlD,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAYrE,CAAC;IAEQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnB,IAAI,CAAC,eAAe,GAAG,IAAI,8BAAe,CAAC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAA2B;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,YAAY,GAAmC,EAAE,CAAC;QACxD,IAAI,EAAE,EAAE,CAAC;YACL,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,EAAE,iCAAyB,CAAC,EAAE,CAAC,CAAC;YAEnF,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;gBACd,YAAY,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;gBACjB,YAAY,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACvD,CAAC;YACD,IAAI,KAAK,EAAE,QAAQ,EAAE,CAAC;gBAClB,YAAY,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;YACpD,CAAC;YACD,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC;gBACrB,YAAY,CAAC,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,YAAY,CAAC,YAAY,CAAC,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,CAAC;YACD,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBAC9B,YAAY,CAAC,aAAa,CAAC,GAAG,kBAAkB,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClF,YAAY,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3F,CAAC;QACL,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrH,CAAC;QAED,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,OAAO,QAAQ,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC;gBACD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAsC,EAAE,CAAC,CAAC;gBAC7G,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;gBAElC,OAAO,CAAC,CAAC,MAAM,CAAC;YACpB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAA,yBAAgB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxF,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACtB,MAAM,IAAA,cAAK,EAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBACxC,SAAS;gBACb,CAAC;gBAED,MAAM,IAAI,sCAA6B,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YAC1E,CAAC;QACL,CAAC;QAED,MAAM,IAAI,sCAA6B,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAC1E,CAAC;CAEJ,CAAA;AA9EY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,oBAAS,GAAE;qCAQoB,qBAAY;QACX,uBAAa;QACd,oBAAY;QACb,iCAAiB;QACX,sCAAiB;GAXzC,kBAAkB,CA8E9B;AAGD,MAAa,+BAAgC,SAAQ,qBAAY;IAiD7D,KAAK,CAAC,UAAkB;QACpB,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChE,IAAI,SAAS,EAAE,CAAC;oBACZ,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAEtF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAoC,CAAC;QACtE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,6BAAoB,CAGtC,CAAC;QAEd,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEzF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,SAAS;YACb,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AA5FD,0EA4FC;AAvFG;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,sJAAsJ;KAC/J,CAAC;;4DACsB;AAMxB;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yNAAyN;KAClO,CAAC;;iEAC2B;AAM7B;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yQAAyQ;KAClR,CAAC;;+DACyB;AAM3B;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,8MAA8M;KACvN,CAAC;;gEAC0B;AAM5B;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,yPAAyP;KAClQ,CAAC;;+DACyB;AAM3B;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,sMAAsM;KAC/M,CAAC;;6DACuB;AAMzB;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,sMAAsM;KAC/M,CAAC;;4DACsB;AAMxB;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,wJAAwJ;KACjK,CAAC;;6DACuB"}
|
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
|