@nitpicker/archive 0.0.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +106 -0
- package/lib/apply-connection-pragmas.d.ts +18 -0
- package/lib/apply-connection-pragmas.js +40 -0
- package/lib/archive-accessor.d.ts +265 -0
- package/lib/archive-accessor.js +477 -0
- package/lib/archive-lock.d.ts +45 -0
- package/lib/archive-lock.js +154 -0
- package/lib/archive.d.ts +736 -0
- package/lib/archive.js +1055 -0
- package/lib/body-hash/compute-body-hash.d.ts +32 -0
- package/lib/body-hash/compute-body-hash.js +35 -0
- package/lib/cache/clear-archive-cache-entry.d.ts +18 -0
- package/lib/cache/clear-archive-cache-entry.js +24 -0
- package/lib/cache/clear-archive-cache-root.d.ts +26 -0
- package/lib/cache/clear-archive-cache-root.js +32 -0
- package/lib/cache/compute-archive-cache-key.d.ts +39 -0
- package/lib/cache/compute-archive-cache-key.js +95 -0
- package/lib/cache/extract-archive-to-cache.d.ts +57 -0
- package/lib/cache/extract-archive-to-cache.js +326 -0
- package/lib/cache/get-archive-cache-root.d.ts +20 -0
- package/lib/cache/get-archive-cache-root.js +53 -0
- package/lib/cache/is-archive-cache-disabled.d.ts +24 -0
- package/lib/cache/is-archive-cache-disabled.js +34 -0
- package/lib/cache/list-archive-cache-entries.d.ts +23 -0
- package/lib/cache/list-archive-cache-entries.js +130 -0
- package/lib/cache/path-exists.d.ts +9 -0
- package/lib/cache/path-exists.js +18 -0
- package/lib/cache/resolve-archive-cache-dir.d.ts +26 -0
- package/lib/cache/resolve-archive-cache-dir.js +32 -0
- package/lib/cache/types.d.ts +33 -0
- package/lib/cache/types.js +1 -0
- package/lib/content-type/is-html-content-type.d.ts +17 -0
- package/lib/content-type/is-html-content-type.js +19 -0
- package/lib/content-type/normalize-content-type.d.ts +14 -0
- package/lib/content-type/normalize-content-type.js +20 -0
- package/lib/create-adjunct-tables.d.ts +66 -0
- package/lib/create-adjunct-tables.js +510 -0
- package/lib/create-entity-tables.d.ts +191 -0
- package/lib/create-entity-tables.js +387 -0
- package/lib/create-progress-reporter.d.ts +30 -0
- package/lib/create-progress-reporter.js +38 -0
- package/lib/create-ref-tables.d.ts +35 -0
- package/lib/create-ref-tables.js +185 -0
- package/lib/create-template-tables.d.ts +28 -0
- package/lib/create-template-tables.js +92 -0
- package/lib/database.d.ts +549 -0
- package/lib/database.js +803 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.d.ts +27 -0
- package/lib/db-ops/_shared/clear-write-ref-caches.js +35 -0
- package/lib/db-ops/_shared/compress-payload.d.ts +26 -0
- package/lib/db-ops/_shared/compress-payload.js +30 -0
- package/lib/db-ops/_shared/create-write-ref-caches.d.ts +17 -0
- package/lib/db-ops/_shared/create-write-ref-caches.js +27 -0
- package/lib/db-ops/_shared/decode-json-ref.d.ts +17 -0
- package/lib/db-ops/_shared/decode-json-ref.js +31 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.d.ts +49 -0
- package/lib/db-ops/_shared/keyset-paginate-by-id.js +69 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.d.ts +20 -0
- package/lib/db-ops/_shared/load-response-headers-by-set-ids.js +53 -0
- package/lib/db-ops/_shared/resolve-content-item-id.d.ts +62 -0
- package/lib/db-ops/_shared/resolve-content-item-id.js +143 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.d.ts +23 -0
- package/lib/db-ops/_shared/resolve-url-or-blob.js +29 -0
- package/lib/db-ops/_shared/retry-setting.d.ts +16 -0
- package/lib/db-ops/_shared/retry-setting.js +18 -0
- package/lib/db-ops/_shared/safe-parse-json.d.ts +11 -0
- package/lib/db-ops/_shared/safe-parse-json.js +18 -0
- package/lib/db-ops/_shared/types.d.ts +94 -0
- package/lib/db-ops/_shared/types.js +1 -0
- package/lib/db-ops/_shared/upsert-blob-ref.d.ts +25 -0
- package/lib/db-ops/_shared/upsert-blob-ref.js +48 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.d.ts +30 -0
- package/lib/db-ops/_shared/upsert-content-type-ref.js +45 -0
- package/lib/db-ops/_shared/upsert-json-ref.d.ts +22 -0
- package/lib/db-ops/_shared/upsert-json-ref.js +41 -0
- package/lib/db-ops/_shared/upsert-response-headers.d.ts +35 -0
- package/lib/db-ops/_shared/upsert-response-headers.js +49 -0
- package/lib/db-ops/_shared/upsert-url-ref.d.ts +39 -0
- package/lib/db-ops/_shared/upsert-url-ref.js +62 -0
- package/lib/db-ops/anchors/get-anchors-on-page.d.ts +10 -0
- package/lib/db-ops/anchors/get-anchors-on-page.js +21 -0
- package/lib/db-ops/config/get-base-url.d.ts +8 -0
- package/lib/db-ops/config/get-base-url.js +14 -0
- package/lib/db-ops/config/get-config.d.ts +10 -0
- package/lib/db-ops/config/get-config.js +29 -0
- package/lib/db-ops/config/get-created-cwd.d.ts +11 -0
- package/lib/db-ops/config/get-created-cwd.js +13 -0
- package/lib/db-ops/config/get-name.d.ts +8 -0
- package/lib/db-ops/config/get-name.js +14 -0
- package/lib/db-ops/config/info-column-allowlist.d.ts +7 -0
- package/lib/db-ops/config/info-column-allowlist.js +29 -0
- package/lib/db-ops/config/info-json-columns.d.ts +5 -0
- package/lib/db-ops/config/info-json-columns.js +11 -0
- package/lib/db-ops/config/set-config.d.ts +12 -0
- package/lib/db-ops/config/set-config.js +21 -0
- package/lib/db-ops/config/update-config.d.ts +17 -0
- package/lib/db-ops/config/update-config.js +36 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.d.ts +19 -0
- package/lib/db-ops/console-logs/compute-console-log-hash.js +30 -0
- package/lib/db-ops/console-logs/replace-console-logs.d.ts +34 -0
- package/lib/db-ops/console-logs/replace-console-logs.js +123 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.d.ts +16 -0
- package/lib/db-ops/console-logs/stringify-console-log-args.js +26 -0
- package/lib/db-ops/console-logs/types.d.ts +38 -0
- package/lib/db-ops/console-logs/types.js +1 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.d.ts +29 -0
- package/lib/db-ops/console-logs/upsert-console-log-item.js +52 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.d.ts +18 -0
- package/lib/db-ops/dedupe-cap/accumulate-dedupe-cap-rejected-count.js +23 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.d.ts +12 -0
- package/lib/db-ops/dedupe-cap/finalize-dedupe-cap-event.js +15 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.d.ts +14 -0
- package/lib/db-ops/dedupe-cap/insert-dedupe-cap-event.js +30 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.d.ts +57 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-observations.js +87 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.d.ts +21 -0
- package/lib/db-ops/dedupe-cap/list-dedupe-cap-shape-keys.js +27 -0
- package/lib/db-ops/errors/insert-crawl-error.d.ts +15 -0
- package/lib/db-ops/errors/insert-crawl-error.js +21 -0
- package/lib/db-ops/errors/insert-page-error.d.ts +21 -0
- package/lib/db-ops/errors/insert-page-error.js +30 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.d.ts +33 -0
- package/lib/db-ops/errors/list-dns-burned-host-candidates.js +158 -0
- package/lib/db-ops/html/read-page-html-blob.d.ts +17 -0
- package/lib/db-ops/html/read-page-html-blob.js +20 -0
- package/lib/db-ops/lifecycle/checkpoint.d.ts +8 -0
- package/lib/db-ops/lifecycle/checkpoint.js +9 -0
- package/lib/db-ops/lifecycle/destroy.d.ts +6 -0
- package/lib/db-ops/lifecycle/destroy.js +7 -0
- package/lib/db-ops/lifecycle/init.d.ts +58 -0
- package/lib/db-ops/lifecycle/init.js +122 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.d.ts +22 -0
- package/lib/db-ops/list-reconcile/record-list-reconcile-run.js +41 -0
- package/lib/db-ops/meta/get-audios-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-audios-of-page.js +15 -0
- package/lib/db-ops/meta/get-buttons-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-buttons-of-page.js +15 -0
- package/lib/db-ops/meta/get-canvases-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-canvases-of-page.js +15 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-custom-elements-of-page.js +15 -0
- package/lib/db-ops/meta/get-headings-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-headings-of-page.js +15 -0
- package/lib/db-ops/meta/get-iframes-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-iframes-of-page.js +15 -0
- package/lib/db-ops/meta/get-jsonld-of-page.d.ts +13 -0
- package/lib/db-ops/meta/get-jsonld-of-page.js +27 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-images-of-page.js +15 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-main-content-tables-of-page.js +15 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-page-technologies-of-page.js +15 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-technology-signals-of-page.js +15 -0
- package/lib/db-ops/meta/get-videos-of-page.d.ts +11 -0
- package/lib/db-ops/meta/get-videos-of-page.js +15 -0
- package/lib/db-ops/outages/close-network-outage.d.ts +12 -0
- package/lib/db-ops/outages/close-network-outage.js +15 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.d.ts +26 -0
- package/lib/db-ops/outages/close-stale-open-network-outages.js +42 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.d.ts +26 -0
- package/lib/db-ops/outages/compute-outage-clamp-timestamp.js +31 -0
- package/lib/db-ops/outages/insert-network-outage.d.ts +14 -0
- package/lib/db-ops/outages/insert-network-outage.js +29 -0
- package/lib/db-ops/outages/list-network-outages.d.ts +28 -0
- package/lib/db-ops/outages/list-network-outages.js +42 -0
- package/lib/db-ops/pages/order/set-url-order.d.ts +13 -0
- package/lib/db-ops/pages/order/set-url-order.js +38 -0
- package/lib/db-ops/pages/read/build-page-query.d.ts +18 -0
- package/lib/db-ops/pages/read/build-page-query.js +40 -0
- package/lib/db-ops/pages/read/get-crawling-state.d.ts +117 -0
- package/lib/db-ops/pages/read/get-crawling-state.js +161 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.d.ts +15 -0
- package/lib/db-ops/pages/read/get-existing-page-urls.js +30 -0
- package/lib/db-ops/pages/read/get-page-count.d.ts +12 -0
- package/lib/db-ops/pages/read/get-page-count.js +21 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.d.ts +24 -0
- package/lib/db-ops/pages/read/get-page-source-by-url.js +28 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.d.ts +38 -0
- package/lib/db-ops/pages/read/get-pages-with-rels.js +107 -0
- package/lib/db-ops/pages/read/get-pages.d.ts +11 -0
- package/lib/db-ops/pages/read/get-pages.js +51 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.d.ts +18 -0
- package/lib/db-ops/pages/read/get-scraped-html-page-count.js +25 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.d.ts +31 -0
- package/lib/db-ops/pages/read/reconstruct-page-rows.js +32 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.d.ts +20 -0
- package/lib/db-ops/pages/reset/clear-page-derived-rows.js +37 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.d.ts +30 -0
- package/lib/db-ops/pages/reset/repromote-external-pages.js +91 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.d.ts +88 -0
- package/lib/db-ops/pages/reset/reset-failed-pages.js +216 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.d.ts +80 -0
- package/lib/db-ops/pages/reset/reset-pages-by-urls.js +151 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.d.ts +24 -0
- package/lib/db-ops/pages/reset/retryable-image-scan-codes.js +24 -0
- package/lib/db-ops/pages/write/insert-audios.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-audios.js +25 -0
- package/lib/db-ops/pages/write/insert-buttons.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-buttons.js +29 -0
- package/lib/db-ops/pages/write/insert-canvases.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-canvases.js +26 -0
- package/lib/db-ops/pages/write/insert-custom-elements.d.ts +27 -0
- package/lib/db-ops/pages/write/insert-custom-elements.js +40 -0
- package/lib/db-ops/pages/write/insert-headings.d.ts +15 -0
- package/lib/db-ops/pages/write/insert-headings.js +27 -0
- package/lib/db-ops/pages/write/insert-iframes.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-iframes.js +28 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.d.ts +38 -0
- package/lib/db-ops/pages/write/insert-inventory-content-items.js +60 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.d.ts +36 -0
- package/lib/db-ops/pages/write/insert-inventory-seeds.js +48 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.d.ts +42 -0
- package/lib/db-ops/pages/write/insert-inventory-skipped-pages.js +56 -0
- package/lib/db-ops/pages/write/insert-jsonld.d.ts +17 -0
- package/lib/db-ops/pages/write/insert-jsonld.js +49 -0
- package/lib/db-ops/pages/write/insert-main-content-images.d.ts +20 -0
- package/lib/db-ops/pages/write/insert-main-content-images.js +32 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-main-content-tables.js +29 -0
- package/lib/db-ops/pages/write/insert-page.d.ts +56 -0
- package/lib/db-ops/pages/write/insert-page.js +259 -0
- package/lib/db-ops/pages/write/insert-technologies.d.ts +25 -0
- package/lib/db-ops/pages/write/insert-technologies.js +45 -0
- package/lib/db-ops/pages/write/insert-videos.d.ts +14 -0
- package/lib/db-ops/pages/write/insert-videos.js +28 -0
- package/lib/db-ops/pages/write/link-redirect-sources.d.ts +42 -0
- package/lib/db-ops/pages/write/link-redirect-sources.js +101 -0
- package/lib/db-ops/pages/write/record-redirect.d.ts +35 -0
- package/lib/db-ops/pages/write/record-redirect.js +100 -0
- package/lib/db-ops/pages/write/set-skipped-page.d.ts +13 -0
- package/lib/db-ops/pages/write/set-skipped-page.js +24 -0
- package/lib/db-ops/pages/write/update-page.d.ts +40 -0
- package/lib/db-ops/pages/write/update-page.js +419 -0
- package/lib/db-ops/pages/write/write-page-html-blob.d.ts +19 -0
- package/lib/db-ops/pages/write/write-page-html-blob.js +41 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.d.ts +9 -0
- package/lib/db-ops/referrers/get-redirects-for-pages.js +15 -0
- package/lib/db-ops/referrers/get-referrers-of-page.d.ts +17 -0
- package/lib/db-ops/referrers/get-referrers-of-page.js +32 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.d.ts +8 -0
- package/lib/db-ops/referrers/get-referrers-of-resource.js +15 -0
- package/lib/db-ops/resources/build-resource-query.d.ts +25 -0
- package/lib/db-ops/resources/build-resource-query.js +29 -0
- package/lib/db-ops/resources/get-existing-resource-urls.d.ts +9 -0
- package/lib/db-ops/resources/get-existing-resource-urls.js +24 -0
- package/lib/db-ops/resources/get-resource-by-url.d.ts +13 -0
- package/lib/db-ops/resources/get-resource-by-url.js +22 -0
- package/lib/db-ops/resources/get-resource-url-list.d.ts +17 -0
- package/lib/db-ops/resources/get-resource-url-list.js +26 -0
- package/lib/db-ops/resources/get-resources.d.ts +8 -0
- package/lib/db-ops/resources/get-resources.js +11 -0
- package/lib/db-ops/resources/insert-inventory-resources.d.ts +24 -0
- package/lib/db-ops/resources/insert-inventory-resources.js +64 -0
- package/lib/db-ops/resources/insert-resource-referrers.d.ts +15 -0
- package/lib/db-ops/resources/insert-resource-referrers.js +54 -0
- package/lib/db-ops/resources/insert-resource.d.ts +34 -0
- package/lib/db-ops/resources/insert-resource.js +73 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.d.ts +26 -0
- package/lib/db-ops/resources/reconstruct-resource-rows.js +30 -0
- package/lib/db-ops/templates/assign-template-labels.d.ts +60 -0
- package/lib/db-ops/templates/assign-template-labels.js +187 -0
- package/lib/db-ops/templates/replace-page-templates.d.ts +44 -0
- package/lib/db-ops/templates/replace-page-templates.js +174 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.d.ts +16 -0
- package/lib/db-ops/templates/serialize-template-cluster-reason.js +17 -0
- package/lib/db-ops/templates/types.d.ts +103 -0
- package/lib/db-ops/templates/types.js +1 -0
- package/lib/debug.d.ts +8 -0
- package/lib/debug.js +9 -0
- package/lib/decode-html-blob.d.ts +20 -0
- package/lib/decode-html-blob.js +23 -0
- package/lib/decode-page-html-blob-bytes.d.ts +25 -0
- package/lib/decode-page-html-blob-bytes.js +29 -0
- package/lib/decode-stored-blob-bytes.d.ts +25 -0
- package/lib/decode-stored-blob-bytes.js +47 -0
- package/lib/derive-lineage-from-parent.d.ts +37 -0
- package/lib/derive-lineage-from-parent.js +42 -0
- package/lib/drop-legacy-tables.d.ts +45 -0
- package/lib/drop-legacy-tables.js +56 -0
- package/lib/error-kind/classify-error-kind.d.ts +20 -0
- package/lib/error-kind/classify-error-kind.js +136 -0
- package/lib/error-kind/network-related-error-kinds.d.ts +23 -0
- package/lib/error-kind/network-related-error-kinds.js +28 -0
- package/lib/error-kind/permanent-error-kinds.d.ts +48 -0
- package/lib/error-kind/permanent-error-kinds.js +54 -0
- package/lib/error-kind/types.d.ts +54 -0
- package/lib/error-kind/types.js +1 -0
- package/lib/filesystem/append-text.d.ts +9 -0
- package/lib/filesystem/append-text.js +14 -0
- package/lib/filesystem/copy-dir-sync.d.ts +6 -0
- package/lib/filesystem/copy-dir-sync.js +9 -0
- package/lib/filesystem/copy-dir.d.ts +7 -0
- package/lib/filesystem/copy-dir.js +13 -0
- package/lib/filesystem/copy-file-with-progress.d.ts +20 -0
- package/lib/filesystem/copy-file-with-progress.js +34 -0
- package/lib/filesystem/exists.d.ts +6 -0
- package/lib/filesystem/exists.js +9 -0
- package/lib/filesystem/get-file-list.d.ts +8 -0
- package/lib/filesystem/get-file-list.js +12 -0
- package/lib/filesystem/is-dir.d.ts +6 -0
- package/lib/filesystem/is-dir.js +10 -0
- package/lib/filesystem/mkdir.d.ts +8 -0
- package/lib/filesystem/mkdir.js +15 -0
- package/lib/filesystem/output-binary.d.ts +12 -0
- package/lib/filesystem/output-binary.js +17 -0
- package/lib/filesystem/output-json.d.ts +9 -0
- package/lib/filesystem/output-json.js +14 -0
- package/lib/filesystem/output-text.d.ts +11 -0
- package/lib/filesystem/output-text.js +32 -0
- package/lib/filesystem/parse-pax-path.d.ts +18 -0
- package/lib/filesystem/parse-pax-path.js +45 -0
- package/lib/filesystem/parse-tar-size-field.d.ts +13 -0
- package/lib/filesystem/parse-tar-size-field.js +37 -0
- package/lib/filesystem/peek-tar-top-dir.d.ts +35 -0
- package/lib/filesystem/peek-tar-top-dir.js +215 -0
- package/lib/filesystem/read-json.d.ts +7 -0
- package/lib/filesystem/read-json.js +11 -0
- package/lib/filesystem/read-text.d.ts +6 -0
- package/lib/filesystem/read-text.js +10 -0
- package/lib/filesystem/readline.d.ts +11 -0
- package/lib/filesystem/readline.js +26 -0
- package/lib/filesystem/remove.d.ts +5 -0
- package/lib/filesystem/remove.js +10 -0
- package/lib/filesystem/rename.d.ts +16 -0
- package/lib/filesystem/rename.js +48 -0
- package/lib/filesystem/tar.d.ts +23 -0
- package/lib/filesystem/tar.js +78 -0
- package/lib/filesystem/untar.d.ts +33 -0
- package/lib/filesystem/untar.js +84 -0
- package/lib/get-failed-page-messages.d.ts +56 -0
- package/lib/get-failed-page-messages.js +146 -0
- package/lib/get-json.d.ts +10 -0
- package/lib/get-json.js +25 -0
- package/lib/html-snapshot/match-selector-html.d.ts +25 -0
- package/lib/html-snapshot/match-selector-html.js +28 -0
- package/lib/html-snapshot/match-selector-snapshots.d.ts +33 -0
- package/lib/html-snapshot/match-selector-snapshots.js +33 -0
- package/lib/html-snapshot/search-html-document.d.ts +29 -0
- package/lib/html-snapshot/search-html-document.js +27 -0
- package/lib/html-snapshot/search-html-snapshots.d.ts +36 -0
- package/lib/html-snapshot/search-html-snapshots.js +35 -0
- package/lib/html-snapshot/types.d.ts +111 -0
- package/lib/html-snapshot/types.js +7 -0
- package/lib/html-snapshot/validate-search-pattern.d.ts +15 -0
- package/lib/html-snapshot/validate-search-pattern.js +17 -0
- package/lib/init-schema.d.ts +48 -0
- package/lib/init-schema.js +124 -0
- package/lib/is-inventory-source.d.ts +21 -0
- package/lib/is-inventory-source.js +22 -0
- package/lib/is-within-outage-window.d.ts +49 -0
- package/lib/is-within-outage-window.js +33 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.d.ts +24 -0
- package/lib/isolated-cluster/create-isolated-cluster-run.js +26 -0
- package/lib/libsql-dialect.d.ts +115 -0
- package/lib/libsql-dialect.js +116 -0
- package/lib/limited-page-ids.d.ts +9 -0
- package/lib/limited-page-ids.js +18 -0
- package/lib/meta/assert-compatible-version.d.ts +60 -0
- package/lib/meta/assert-compatible-version.js +93 -0
- package/lib/meta/classify-jsonld-type.d.ts +23 -0
- package/lib/meta/classify-jsonld-type.js +43 -0
- package/lib/meta/compare-semver.d.ts +23 -0
- package/lib/meta/compare-semver.js +51 -0
- package/lib/meta/compute-main-contents-denormalized.d.ts +41 -0
- package/lib/meta/compute-main-contents-denormalized.js +88 -0
- package/lib/meta/compute-page-denormalized.d.ts +20 -0
- package/lib/meta/compute-page-denormalized.js +35 -0
- package/lib/meta/derive-flat-from-meta.d.ts +34 -0
- package/lib/meta/derive-flat-from-meta.js +158 -0
- package/lib/meta/derive-meta-extras.d.ts +20 -0
- package/lib/meta/derive-meta-extras.js +23 -0
- package/lib/meta/extract-tags-for-archive.d.ts +17 -0
- package/lib/meta/extract-tags-for-archive.js +36 -0
- package/lib/meta/parse-main-content-class-list.d.ts +19 -0
- package/lib/meta/parse-main-content-class-list.js +34 -0
- package/lib/meta/summarize-jsonld.d.ts +17 -0
- package/lib/meta/summarize-jsonld.js +29 -0
- package/lib/meta/technologies/combine-technology-confidence.d.ts +46 -0
- package/lib/meta/technologies/combine-technology-confidence.js +93 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.d.ts +45 -0
- package/lib/meta/technologies/convert-legacy-page-tags-to-inserts.js +53 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.d.ts +33 -0
- package/lib/meta/technologies/convert-tag-row-to-wappalyzer-signal.js +46 -0
- package/lib/meta/technologies/extract-technologies-for-archive.d.ts +33 -0
- package/lib/meta/technologies/extract-technologies-for-archive.js +30 -0
- package/lib/meta/technologies/match-js-license-comment-signal.d.ts +21 -0
- package/lib/meta/technologies/match-js-license-comment-signal.js +23 -0
- package/lib/meta/technologies/match-structural-technology-signals.d.ts +26 -0
- package/lib/meta/technologies/match-structural-technology-signals.js +48 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.d.ts +25 -0
- package/lib/meta/technologies/normalize-wappalyzer-entries.js +35 -0
- package/lib/meta/technologies/technology-signal-definitions.d.ts +44 -0
- package/lib/meta/technologies/technology-signal-definitions.js +60 -0
- package/lib/meta/technologies/types.d.ts +70 -0
- package/lib/meta/technologies/types.js +13 -0
- package/lib/meta/types.d.ts +1490 -0
- package/lib/meta/types.js +65 -0
- package/lib/migrate-content-items-alias-of-id.d.ts +52 -0
- package/lib/migrate-content-items-alias-of-id.js +69 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.d.ts +46 -0
- package/lib/migrate-content-items-dedupe-cap-event-id.js +62 -0
- package/lib/migrate-content-items-is-metadata-only.d.ts +44 -0
- package/lib/migrate-content-items-is-metadata-only.js +60 -0
- package/lib/migrate-entity-tables.d.ts +55 -0
- package/lib/migrate-entity-tables.js +66 -0
- package/lib/migrate-info-created-cwd.d.ts +17 -0
- package/lib/migrate-info-created-cwd.js +36 -0
- package/lib/migrate-info-main-content-selector.d.ts +16 -0
- package/lib/migrate-info-main-content-selector.js +35 -0
- package/lib/migrate-info-request-header-names.d.ts +16 -0
- package/lib/migrate-info-request-header-names.js +35 -0
- package/lib/migrate-info-roots.d.ts +20 -0
- package/lib/migrate-info-roots.js +52 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.d.ts +34 -0
- package/lib/migrate-inventory-runs-to-list-reconcile-runs.js +51 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.d.ts +25 -0
- package/lib/migrate-list-reconcile-runs-exclude-skipped.js +44 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.d.ts +16 -0
- package/lib/migrate-list-reconcile-runs-invalid-skipped.js +35 -0
- package/lib/migrate-main-contents-columns.d.ts +26 -0
- package/lib/migrate-main-contents-columns.js +61 -0
- package/lib/migrate-page-meta-body-hash.d.ts +44 -0
- package/lib/migrate-page-meta-body-hash.js +63 -0
- package/lib/migrate-page-meta-console-error-count.d.ts +27 -0
- package/lib/migrate-page-meta-console-error-count.js +45 -0
- package/lib/migrate-page-meta-custom-element-count.d.ts +33 -0
- package/lib/migrate-page-meta-custom-element-count.js +51 -0
- package/lib/migrate-page-meta-image-scan.d.ts +27 -0
- package/lib/migrate-page-meta-image-scan.js +52 -0
- package/lib/migrate-page-tags-to-page-technologies.d.ts +39 -0
- package/lib/migrate-page-tags-to-page-technologies.js +79 -0
- package/lib/migrate-ref-tables.d.ts +25 -0
- package/lib/migrate-ref-tables.js +38 -0
- package/lib/native-executor/check-native-executor-config.d.ts +17 -0
- package/lib/native-executor/check-native-executor-config.js +20 -0
- package/lib/page-meta-column-maps.d.ts +32 -0
- package/lib/page-meta-column-maps.js +43 -0
- package/lib/page.d.ts +546 -0
- package/lib/page.js +764 -0
- package/lib/peek-archive-lock.d.ts +40 -0
- package/lib/peek-archive-lock.js +62 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.d.ts +41 -0
- package/lib/populate-entity-tables/collapse-anchor-rows.js +87 -0
- package/lib/populate-entity-tables/derive-dom-path.d.ts +35 -0
- package/lib/populate-entity-tables/derive-dom-path.js +72 -0
- package/lib/populate-entity-tables/is-blob-ref-value.d.ts +16 -0
- package/lib/populate-entity-tables/is-blob-ref-value.js +19 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.d.ts +66 -0
- package/lib/populate-entity-tables/match-images-to-dom-paths.js +96 -0
- package/lib/populate-entity-tables/populate-anchor-edges.d.ts +33 -0
- package/lib/populate-entity-tables/populate-anchor-edges.js +153 -0
- package/lib/populate-entity-tables/populate-content-items.d.ts +40 -0
- package/lib/populate-entity-tables/populate-content-items.js +141 -0
- package/lib/populate-entity-tables/populate-entities.d.ts +81 -0
- package/lib/populate-entity-tables/populate-entities.js +110 -0
- package/lib/populate-entity-tables/populate-image-items.d.ts +91 -0
- package/lib/populate-entity-tables/populate-image-items.js +226 -0
- package/lib/populate-entity-tables/populate-page-meta.d.ts +33 -0
- package/lib/populate-entity-tables/populate-page-meta.js +267 -0
- package/lib/populate-entity-tables/populate-resource-items.d.ts +22 -0
- package/lib/populate-entity-tables/populate-resource-items.js +114 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.d.ts +31 -0
- package/lib/populate-entity-tables/populate-resource-ref-edges.js +33 -0
- package/lib/populate-entity-tables/resolve-blob-refs.d.ts +31 -0
- package/lib/populate-entity-tables/resolve-blob-refs.js +100 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.d.ts +22 -0
- package/lib/populate-entity-tables/resolve-content-type-refs.js +27 -0
- package/lib/populate-entity-tables/resolve-header-sets.d.ts +49 -0
- package/lib/populate-entity-tables/resolve-header-sets.js +122 -0
- package/lib/populate-entity-tables/resolve-json-refs.d.ts +25 -0
- package/lib/populate-entity-tables/resolve-json-refs.js +67 -0
- package/lib/populate-entity-tables/resolve-text-refs.d.ts +30 -0
- package/lib/populate-entity-tables/resolve-text-refs.js +61 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.d.ts +21 -0
- package/lib/populate-entity-tables/resolve-url-or-blob-from-maps.js +27 -0
- package/lib/populate-entity-tables/resolve-url-refs.d.ts +33 -0
- package/lib/populate-entity-tables/resolve-url-refs.js +60 -0
- package/lib/populate-entity-tables/test-utils/count-rows.d.ts +17 -0
- package/lib/populate-entity-tables/test-utils/count-rows.js +20 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.d.ts +25 -0
- package/lib/populate-entity-tables/test-utils/seed-content-items.js +42 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.d.ts +30 -0
- package/lib/populate-entity-tables/test-utils/setup-entities-db.js +175 -0
- package/lib/populate-entity-tables/types.d.ts +157 -0
- package/lib/populate-entity-tables/types.js +12 -0
- package/lib/populate-entity-tables/upsert-text-refs.d.ts +38 -0
- package/lib/populate-entity-tables/upsert-text-refs.js +78 -0
- package/lib/populate-ref-tables/classify-content-type.d.ts +16 -0
- package/lib/populate-ref-tables/classify-content-type.js +52 -0
- package/lib/populate-ref-tables/compute-content-hash.d.ts +22 -0
- package/lib/populate-ref-tables/compute-content-hash.js +26 -0
- package/lib/populate-ref-tables/compute-header-flags.d.ts +16 -0
- package/lib/populate-ref-tables/compute-header-flags.js +70 -0
- package/lib/populate-ref-tables/content-type-rules.d.ts +38 -0
- package/lib/populate-ref-tables/content-type-rules.js +133 -0
- package/lib/populate-ref-tables/create-header-table-caches.d.ts +25 -0
- package/lib/populate-ref-tables/create-header-table-caches.js +49 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.d.ts +15 -0
- package/lib/populate-ref-tables/data-uri-url-refs-limit.js +15 -0
- package/lib/populate-ref-tables/decode-data-uri.d.ts +21 -0
- package/lib/populate-ref-tables/decode-data-uri.js +126 -0
- package/lib/populate-ref-tables/decompose-header-set.d.ts +29 -0
- package/lib/populate-ref-tables/decompose-header-set.js +157 -0
- package/lib/populate-ref-tables/decompose-url.d.ts +25 -0
- package/lib/populate-ref-tables/decompose-url.js +70 -0
- package/lib/populate-ref-tables/header-stability.d.ts +19 -0
- package/lib/populate-ref-tables/header-stability.js +22 -0
- package/lib/populate-ref-tables/header-value-cache-key.d.ts +17 -0
- package/lib/populate-ref-tables/header-value-cache-key.js +19 -0
- package/lib/populate-ref-tables/normalize-mime.d.ts +24 -0
- package/lib/populate-ref-tables/normalize-mime.js +36 -0
- package/lib/populate-ref-tables/populate-blob-refs.d.ts +38 -0
- package/lib/populate-ref-tables/populate-blob-refs.js +134 -0
- package/lib/populate-ref-tables/populate-content-type-refs.d.ts +27 -0
- package/lib/populate-ref-tables/populate-content-type-refs.js +70 -0
- package/lib/populate-ref-tables/populate-header-tables.d.ts +35 -0
- package/lib/populate-ref-tables/populate-header-tables.js +80 -0
- package/lib/populate-ref-tables/populate-json-refs.d.ts +29 -0
- package/lib/populate-ref-tables/populate-json-refs.js +101 -0
- package/lib/populate-ref-tables/populate-refs.d.ts +51 -0
- package/lib/populate-ref-tables/populate-refs.js +62 -0
- package/lib/populate-ref-tables/populate-text-refs.d.ts +32 -0
- package/lib/populate-ref-tables/populate-text-refs.js +133 -0
- package/lib/populate-ref-tables/populate-url-refs.d.ts +28 -0
- package/lib/populate-ref-tables/populate-url-refs.js +148 -0
- package/lib/populate-ref-tables/test-utils/count-rows.d.ts +15 -0
- package/lib/populate-ref-tables/test-utils/count-rows.js +17 -0
- package/lib/populate-ref-tables/types.d.ts +197 -0
- package/lib/populate-ref-tables/types.js +7 -0
- package/lib/populate-ref-tables/upsert-one-header-set.d.ts +34 -0
- package/lib/populate-ref-tables/upsert-one-header-set.js +208 -0
- package/lib/populate-ref-tables/volatile-header-names.d.ts +20 -0
- package/lib/populate-ref-tables/volatile-header-names.js +33 -0
- package/lib/redirect-table.d.ts +9 -0
- package/lib/redirect-table.js +28 -0
- package/lib/release-finished-statements.d.ts +42 -0
- package/lib/release-finished-statements.js +45 -0
- package/lib/resolve-redirect-chain.d.ts +33 -0
- package/lib/resolve-redirect-chain.js +27 -0
- package/lib/resource.d.ts +46 -0
- package/lib/resource.js +62 -0
- package/lib/retarget-legacy-fk-tables.d.ts +61 -0
- package/lib/retarget-legacy-fk-tables.js +137 -0
- package/lib/safe-path.d.ts +9 -0
- package/lib/safe-path.js +17 -0
- package/lib/scope/build-scope-map.d.ts +21 -0
- package/lib/scope/build-scope-map.js +32 -0
- package/lib/scope/find-scope-entry.d.ts +25 -0
- package/lib/scope/find-scope-entry.js +45 -0
- package/lib/template-classification/classify-archive-page-templates.d.ts +42 -0
- package/lib/template-classification/classify-archive-page-templates.js +70 -0
- package/lib/template-classification/classify-page-templates.d.ts +33 -0
- package/lib/template-classification/classify-page-templates.js +60 -0
- package/lib/template-classification/collect-page-ids-with-html.d.ts +24 -0
- package/lib/template-classification/collect-page-ids-with-html.js +30 -0
- package/lib/template-classification/collect-page-stylesheet-urls.d.ts +32 -0
- package/lib/template-classification/collect-page-stylesheet-urls.js +132 -0
- package/lib/template-classification/create-content-root-hint.d.ts +41 -0
- package/lib/template-classification/create-content-root-hint.js +51 -0
- package/lib/template-classification/create-page-cluster-factory.d.ts +36 -0
- package/lib/template-classification/create-page-cluster-factory.js +52 -0
- package/lib/template-classification/load-page-cluster-candidates.d.ts +32 -0
- package/lib/template-classification/load-page-cluster-candidates.js +93 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.d.ts +34 -0
- package/lib/template-classification/page-cluster/resolve-page-cluster-keys.js +236 -0
- package/lib/template-classification/page-cluster/types.d.ts +123 -0
- package/lib/template-classification/page-cluster/types.js +1 -0
- package/lib/template-classification/types.d.ts +234 -0
- package/lib/template-classification/types.js +1 -0
- package/lib/test-utils/build-full-schema-test-db.d.ts +34 -0
- package/lib/test-utils/build-full-schema-test-db.js +74 -0
- package/lib/test-utils/compare-strings.d.ts +12 -0
- package/lib/test-utils/compare-strings.js +14 -0
- package/lib/test-utils/create-legacy-analysis-tables.d.ts +13 -0
- package/lib/test-utils/create-legacy-analysis-tables.js +37 -0
- package/lib/test-utils/fk-parent-tables.d.ts +15 -0
- package/lib/test-utils/fk-parent-tables.js +19 -0
- package/lib/test-utils/seed-content-item.d.ts +35 -0
- package/lib/test-utils/seed-content-item.js +42 -0
- package/lib/test-utils/setup-legacy-fk-db.d.ts +34 -0
- package/lib/test-utils/setup-legacy-fk-db.js +271 -0
- package/lib/transfer/attach-source-database.d.ts +31 -0
- package/lib/transfer/attach-source-database.js +40 -0
- package/lib/transfer/build-split-config.d.ts +30 -0
- package/lib/transfer/build-split-config.js +42 -0
- package/lib/transfer/clear-replaced-page-rows.d.ts +23 -0
- package/lib/transfer/clear-replaced-page-rows.js +61 -0
- package/lib/transfer/concat-archives.d.ts +55 -0
- package/lib/transfer/concat-archives.js +95 -0
- package/lib/transfer/concat-source-transfer-phases.d.ts +10 -0
- package/lib/transfer/concat-source-transfer-phases.js +17 -0
- package/lib/transfer/content-item-rank-sql.d.ts +21 -0
- package/lib/transfer/content-item-rank-sql.js +23 -0
- package/lib/transfer/copy-anchor-edges.d.ts +28 -0
- package/lib/transfer/copy-anchor-edges.js +42 -0
- package/lib/transfer/copy-dictionaries-for-concat.d.ts +39 -0
- package/lib/transfer/copy-dictionaries-for-concat.js +81 -0
- package/lib/transfer/copy-dictionaries-for-split.d.ts +29 -0
- package/lib/transfer/copy-dictionaries-for-split.js +224 -0
- package/lib/transfer/copy-header-set-children.d.ts +27 -0
- package/lib/transfer/copy-header-set-children.js +51 -0
- package/lib/transfer/copy-image-items.d.ts +21 -0
- package/lib/transfer/copy-image-items.js +62 -0
- package/lib/transfer/copy-inventory-source-lists.d.ts +30 -0
- package/lib/transfer/copy-inventory-source-lists.js +61 -0
- package/lib/transfer/copy-journal-tables.d.ts +30 -0
- package/lib/transfer/copy-journal-tables.js +56 -0
- package/lib/transfer/copy-page-console-logs.d.ts +16 -0
- package/lib/transfer/copy-page-console-logs.js +27 -0
- package/lib/transfer/copy-page-html-blobs.d.ts +31 -0
- package/lib/transfer/copy-page-html-blobs.js +43 -0
- package/lib/transfer/copy-page-meta.d.ts +27 -0
- package/lib/transfer/copy-page-meta.js +68 -0
- package/lib/transfer/copy-page-template-clusters.d.ts +31 -0
- package/lib/transfer/copy-page-template-clusters.js +56 -0
- package/lib/transfer/copy-page-template-labels.d.ts +34 -0
- package/lib/transfer/copy-page-template-labels.js +88 -0
- package/lib/transfer/copy-resource-items.d.ts +29 -0
- package/lib/transfer/copy-resource-items.js +89 -0
- package/lib/transfer/copy-resource-ref-edges.d.ts +20 -0
- package/lib/transfer/copy-resource-ref-edges.js +33 -0
- package/lib/transfer/copy-simple-page-scoped-tables.d.ts +15 -0
- package/lib/transfer/copy-simple-page-scoped-tables.js +34 -0
- package/lib/transfer/count-external-pages-in-scope.d.ts +26 -0
- package/lib/transfer/count-external-pages-in-scope.js +40 -0
- package/lib/transfer/create-transfer-temp-tables.d.ts +30 -0
- package/lib/transfer/create-transfer-temp-tables.js +59 -0
- package/lib/transfer/dictionary-copy-specs.d.ts +32 -0
- package/lib/transfer/dictionary-copy-specs.js +28 -0
- package/lib/transfer/drop-transfer-temp-tables.d.ts +9 -0
- package/lib/transfer/drop-transfer-temp-tables.js +18 -0
- package/lib/transfer/flatten-redirect-chains.d.ts +44 -0
- package/lib/transfer/flatten-redirect-chains.js +74 -0
- package/lib/transfer/insert-content-items.d.ts +35 -0
- package/lib/transfer/insert-content-items.js +116 -0
- package/lib/transfer/list-transfer-columns.d.ts +35 -0
- package/lib/transfer/list-transfer-columns.js +45 -0
- package/lib/transfer/mark-in-scope-content-items.d.ts +31 -0
- package/lib/transfer/mark-in-scope-content-items.js +54 -0
- package/lib/transfer/merge-archive-configs.d.ts +51 -0
- package/lib/transfer/merge-archive-configs.js +85 -0
- package/lib/transfer/plan-content-items-for-concat.d.ts +33 -0
- package/lib/transfer/plan-content-items-for-concat.js +51 -0
- package/lib/transfer/plan-content-items-for-split.d.ts +42 -0
- package/lib/transfer/plan-content-items-for-split.js +83 -0
- package/lib/transfer/plan-resource-items.d.ts +40 -0
- package/lib/transfer/plan-resource-items.js +69 -0
- package/lib/transfer/quote-transfer-identifier.d.ts +18 -0
- package/lib/transfer/quote-transfer-identifier.js +20 -0
- package/lib/transfer/reclassify-resource-externality.d.ts +37 -0
- package/lib/transfer/reclassify-resource-externality.js +66 -0
- package/lib/transfer/remap-redirect-dest-ids.d.ts +34 -0
- package/lib/transfer/remap-redirect-dest-ids.js +51 -0
- package/lib/transfer/replace-content-items.d.ts +39 -0
- package/lib/transfer/replace-content-items.js +83 -0
- package/lib/transfer/simple-page-scoped-tables.d.ts +25 -0
- package/lib/transfer/simple-page-scoped-tables.js +38 -0
- package/lib/transfer/split-archive.d.ts +55 -0
- package/lib/transfer/split-archive.js +98 -0
- package/lib/transfer/split-source-transfer-phases.d.ts +11 -0
- package/lib/transfer/split-source-transfer-phases.js +18 -0
- package/lib/transfer/transfer-action.d.ts +34 -0
- package/lib/transfer/transfer-action.js +32 -0
- package/lib/transfer/transfer-archive-rows.d.ts +65 -0
- package/lib/transfer/transfer-archive-rows.js +156 -0
- package/lib/transfer/transfer-dictionary-tables.d.ts +12 -0
- package/lib/transfer/transfer-dictionary-tables.js +22 -0
- package/lib/transfer/transfer-post-phases.d.ts +10 -0
- package/lib/transfer/transfer-post-phases.js +13 -0
- package/lib/transfer/transfer-source-alias.d.ts +9 -0
- package/lib/transfer/transfer-source-alias.js +9 -0
- package/lib/transfer/types.d.ts +111 -0
- package/lib/transfer/types.js +35 -0
- package/lib/types.d.ts +772 -0
- package/lib/types.js +1 -0
- package/lib/url-alias/compute-tier-a-alias-key.d.ts +44 -0
- package/lib/url-alias/compute-tier-a-alias-key.js +47 -0
- package/lib/url-alias/compute-tier-b-alias-key.d.ts +23 -0
- package/lib/url-alias/compute-tier-b-alias-key.js +26 -0
- package/lib/url-alias/group-alias-candidates.d.ts +27 -0
- package/lib/url-alias/group-alias-candidates.js +29 -0
- package/lib/url-alias/types.d.ts +12 -0
- package/lib/url-alias/types.js +1 -0
- package/lib/url-pattern/compute-shape-key.d.ts +58 -0
- package/lib/url-pattern/compute-shape-key.js +129 -0
- package/lib/url-pattern/decompose-url.d.ts +33 -0
- package/lib/url-pattern/decompose-url.js +79 -0
- package/lib/url-pattern/reconstruct-url.d.ts +15 -0
- package/lib/url-pattern/reconstruct-url.js +33 -0
- package/lib/url-sort/compute-url-sort-ranks.d.ts +30 -0
- package/lib/url-sort/compute-url-sort-ranks.js +33 -0
- package/lib/utils/array/each-splitted.d.ts +10 -0
- package/lib/utils/array/each-splitted.js +14 -0
- package/lib/utils/debug.d.ts +8 -0
- package/lib/utils/debug.js +8 -0
- package/lib/utils/error/emit-error-with-retry.d.ts +40 -0
- package/lib/utils/error/emit-error-with-retry.js +44 -0
- package/lib/utils/error/emit-error.d.ts +39 -0
- package/lib/utils/error/emit-error.js +41 -0
- package/lib/utils/object/parse-response-headers.d.ts +12 -0
- package/lib/utils/object/parse-response-headers.js +26 -0
- package/lib/utils/object/redact-request-headers.d.ts +15 -0
- package/lib/utils/object/redact-request-headers.js +27 -0
- package/lib/utils/types/types.d.ts +383 -0
- package/lib/utils/types/types.js +1 -0
- package/lib/verify-migration/capture-rejection.d.ts +24 -0
- package/lib/verify-migration/capture-rejection.js +31 -0
- package/lib/verify-migration/check-anchor-edges-count.d.ts +34 -0
- package/lib/verify-migration/check-anchor-edges-count.js +72 -0
- package/lib/verify-migration/check-anchor-edges-sum.d.ts +13 -0
- package/lib/verify-migration/check-anchor-edges-sum.js +27 -0
- package/lib/verify-migration/check-content-items-count.d.ts +16 -0
- package/lib/verify-migration/check-content-items-count.js +30 -0
- package/lib/verify-migration/check-content-type-preservation.d.ts +22 -0
- package/lib/verify-migration/check-content-type-preservation.js +40 -0
- package/lib/verify-migration/check-foreign-key-integrity.d.ts +31 -0
- package/lib/verify-migration/check-foreign-key-integrity.js +47 -0
- package/lib/verify-migration/check-image-items-count.d.ts +12 -0
- package/lib/verify-migration/check-image-items-count.js +26 -0
- package/lib/verify-migration/check-page-meta-count.d.ts +15 -0
- package/lib/verify-migration/check-page-meta-count.js +31 -0
- package/lib/verify-migration/check-reader-parity.d.ts +23 -0
- package/lib/verify-migration/check-reader-parity.js +182 -0
- package/lib/verify-migration/check-resource-items-count.d.ts +17 -0
- package/lib/verify-migration/check-resource-items-count.js +33 -0
- package/lib/verify-migration/check-url-round-trip.d.ts +43 -0
- package/lib/verify-migration/check-url-round-trip.js +112 -0
- package/lib/verify-migration/types.d.ts +70 -0
- package/lib/verify-migration/types.js +63 -0
- package/lib/verify-migration/verify-migration.d.ts +41 -0
- package/lib/verify-migration/verify-migration.js +120 -0
- package/lib/with-bulk-write-pragmas.d.ts +51 -0
- package/lib/with-bulk-write-pragmas.js +132 -0
- package/lib/write-queue.d.ts +32 -0
- package/lib/write-queue.js +55 -0
- package/package.json +350 -3
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Adds `rejectedCount` onto the `rejected_count` of the `dedupe_cap_events`
|
|
4
|
+
* row for `shapeKey`, treating a still-`NULL` count as `0`. Unlike
|
|
5
|
+
* `finalize-dedupe-cap-event.ts` (which stamps a session's own newly-capped
|
|
6
|
+
* shape exactly once, guarded by `whereNull`), this targets a shape that
|
|
7
|
+
* capped in an EARLIER session and was preloaded into `DedupeCapTracker`'s
|
|
8
|
+
* sticky set (see `DedupeCapTracker`'s constructor JSDoc) — gate rejections
|
|
9
|
+
* for such a shape still occur in the current session, but no `dedupeCap`
|
|
10
|
+
* event (and thus no new row) is ever emitted for it, since the tracker
|
|
11
|
+
* short-circuits on an already-sticky shape before `observe` runs. Matches
|
|
12
|
+
* by `shape_key` rather than `id` because the caller (`CrawlerOrchestrator`)
|
|
13
|
+
* only has the shape key for a preloaded-sticky shape, never its row id.
|
|
14
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
15
|
+
* @param shapeKey - The capped shape whose rejection count to accumulate.
|
|
16
|
+
* @param rejectedCount - Additional anchors rejected for this shape in the current session.
|
|
17
|
+
*/
|
|
18
|
+
export declare function accumulateDedupeCapRejectedCount(knex: Knex, shapeKey: string, rejectedCount: number): Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adds `rejectedCount` onto the `rejected_count` of the `dedupe_cap_events`
|
|
3
|
+
* row for `shapeKey`, treating a still-`NULL` count as `0`. Unlike
|
|
4
|
+
* `finalize-dedupe-cap-event.ts` (which stamps a session's own newly-capped
|
|
5
|
+
* shape exactly once, guarded by `whereNull`), this targets a shape that
|
|
6
|
+
* capped in an EARLIER session and was preloaded into `DedupeCapTracker`'s
|
|
7
|
+
* sticky set (see `DedupeCapTracker`'s constructor JSDoc) — gate rejections
|
|
8
|
+
* for such a shape still occur in the current session, but no `dedupeCap`
|
|
9
|
+
* event (and thus no new row) is ever emitted for it, since the tracker
|
|
10
|
+
* short-circuits on an already-sticky shape before `observe` runs. Matches
|
|
11
|
+
* by `shape_key` rather than `id` because the caller (`CrawlerOrchestrator`)
|
|
12
|
+
* only has the shape key for a preloaded-sticky shape, never its row id.
|
|
13
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
14
|
+
* @param shapeKey - The capped shape whose rejection count to accumulate.
|
|
15
|
+
* @param rejectedCount - Additional anchors rejected for this shape in the current session.
|
|
16
|
+
*/
|
|
17
|
+
export async function accumulateDedupeCapRejectedCount(knex, shapeKey, rejectedCount) {
|
|
18
|
+
await knex('dedupe_cap_events')
|
|
19
|
+
.where({ shape_key: shapeKey })
|
|
20
|
+
.update({
|
|
21
|
+
rejected_count: knex.raw('COALESCE(rejected_count, 0) + ?', [rejectedCount]),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Finalizes a `dedupe_cap_events` row by stamping `rejected_count` — but
|
|
4
|
+
* ONLY if it is still unset. The `whereNull('rejected_count')` guard makes
|
|
5
|
+
* this idempotent, mirroring `close-network-outage.ts`'s `ended_at` guard: a
|
|
6
|
+
* second call matches zero rows and is a silent no-op rather than
|
|
7
|
+
* overwriting an already-finalized count.
|
|
8
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
9
|
+
* @param id - The `dedupe_cap_events.id` to finalize.
|
|
10
|
+
* @param rejectedCount - Number of anchors rejected for this shape after it capped.
|
|
11
|
+
*/
|
|
12
|
+
export declare function finalizeDedupeCapEvent(knex: Knex, id: number, rejectedCount: number): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finalizes a `dedupe_cap_events` row by stamping `rejected_count` — but
|
|
3
|
+
* ONLY if it is still unset. The `whereNull('rejected_count')` guard makes
|
|
4
|
+
* this idempotent, mirroring `close-network-outage.ts`'s `ended_at` guard: a
|
|
5
|
+
* second call matches zero rows and is a silent no-op rather than
|
|
6
|
+
* overwriting an already-finalized count.
|
|
7
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
8
|
+
* @param id - The `dedupe_cap_events.id` to finalize.
|
|
9
|
+
* @param rejectedCount - Number of anchors rejected for this shape after it capped.
|
|
10
|
+
*/
|
|
11
|
+
export async function finalizeDedupeCapEvent(knex, id, rejectedCount) {
|
|
12
|
+
await knex('dedupe_cap_events').where({ id }).whereNull('rejected_count').update({
|
|
13
|
+
rejected_count: rejectedCount,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { InsertDedupeCapEventParams } from '../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Appends one row to the `dedupe_cap_events` journal, with `rejected_count`
|
|
5
|
+
* left `NULL` — the row starts life without a finalized rejection count.
|
|
6
|
+
*
|
|
7
|
+
* Called the instant `DedupeCapTracker#observe` confirms a URL shape as a
|
|
8
|
+
* same-cluster trap (the `dedupeCap` event). See
|
|
9
|
+
* `finalize-dedupe-cap-event.ts` for how `rejected_count` is later set.
|
|
10
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
11
|
+
* @param params - The newly-capped shape's fields to record.
|
|
12
|
+
* @returns The autoincremented `id` of the newly-inserted row.
|
|
13
|
+
*/
|
|
14
|
+
export declare function insertDedupeCapEvent(knex: Knex, params: InsertDedupeCapEventParams): Promise<number>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Appends one row to the `dedupe_cap_events` journal, with `rejected_count`
|
|
3
|
+
* left `NULL` — the row starts life without a finalized rejection count.
|
|
4
|
+
*
|
|
5
|
+
* Called the instant `DedupeCapTracker#observe` confirms a URL shape as a
|
|
6
|
+
* same-cluster trap (the `dedupeCap` event). See
|
|
7
|
+
* `finalize-dedupe-cap-event.ts` for how `rejected_count` is later set.
|
|
8
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
9
|
+
* @param params - The newly-capped shape's fields to record.
|
|
10
|
+
* @returns The autoincremented `id` of the newly-inserted row.
|
|
11
|
+
*/
|
|
12
|
+
export async function insertDedupeCapEvent(knex, params) {
|
|
13
|
+
const inserted = await knex
|
|
14
|
+
.from('dedupe_cap_events')
|
|
15
|
+
.insert({
|
|
16
|
+
shape_key: params.shapeKey,
|
|
17
|
+
sample_url: params.sampleUrl,
|
|
18
|
+
body_hash: params.bodyHash,
|
|
19
|
+
effective_threshold: params.effectiveThreshold,
|
|
20
|
+
observed_count: params.observedCount,
|
|
21
|
+
detected_at: params.detectedAt,
|
|
22
|
+
rejected_count: null,
|
|
23
|
+
})
|
|
24
|
+
.returning('id');
|
|
25
|
+
const id = inserted[0]?.id;
|
|
26
|
+
if (typeof id !== 'number') {
|
|
27
|
+
throw new TypeError('insertDedupeCapEvent: INSERT returned no row id');
|
|
28
|
+
}
|
|
29
|
+
return id;
|
|
30
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { DedupeCapObservationRow } from '../../types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Reads back every previously-scraped internal page's raw fields in the
|
|
5
|
+
* exact population a live crawl's `DedupeCapTracker#observe` call site
|
|
6
|
+
* would have fed it, so `CrawlerOrchestrator`'s five resuming-session
|
|
7
|
+
* methods (`append`/`inventory`/`recrawl`/`retryFailed`/`resume`) can
|
|
8
|
+
* replay a prior session's Misra-Gries observations into a fresh tracker
|
|
9
|
+
* instance (see `buildDedupeCapObservation`) instead of restarting every
|
|
10
|
+
* not-yet-capped shape's counter at 0.
|
|
11
|
+
*
|
|
12
|
+
* The WHERE clause reproduces the live observation gate
|
|
13
|
+
* (`!isExternal && !isMetadataOnly && html.length > 0`) using columns that
|
|
14
|
+
* survive a process restart:
|
|
15
|
+
*
|
|
16
|
+
* - `is_external = 0` — external pages carry no useful signal (same
|
|
17
|
+
* exclusion `computeMetaSignature`'s design already assumes).
|
|
18
|
+
* - `is_target = 1` — the archived equivalent of "not metadata-only": a
|
|
19
|
+
* metadata-only fetch never invokes the browser and is written with
|
|
20
|
+
* `is_target = 0` (see `Crawler`'s metadata-only branch), matching the
|
|
21
|
+
* live gate's `!isMetadataOnly` exactly.
|
|
22
|
+
* - `redirect_dest_id IS NULL` — a redirect source's own body was never
|
|
23
|
+
* rendered; only the destination page (a separate row) was.
|
|
24
|
+
* - `is_skipped IS NULL OR is_skipped = 0` — a skipped placeholder row
|
|
25
|
+
* (`source = 'inventory-seed'` etc.) has no rendered body either.
|
|
26
|
+
* - `pm.body_hash IS NOT NULL` — the archived proxy for `html.length > 0`:
|
|
27
|
+
* `update-page.ts` only ever writes a non-null `body_hash` on the same
|
|
28
|
+
* `writeHtml && html.length > 0` gate the live site's `precomputedBodyHash`
|
|
29
|
+
* computation uses, so this column faithfully reconstructs that
|
|
30
|
+
* condition. Also excludes pre-`body_hash`-migration legacy archives'
|
|
31
|
+
* un-backfilled rows (`migrate-page-meta-body-hash.ts` adds the column on
|
|
32
|
+
* every writer open but does not compute values for existing rows) —
|
|
33
|
+
* understating the replayed count is safe (never over-counts), so no
|
|
34
|
+
* column-presence guard is needed here.
|
|
35
|
+
*
|
|
36
|
+
* Deliberately does NOT exclude rows already marked
|
|
37
|
+
* `content_items.dedupe_cap_event_id` (the post-hoc marking column) —
|
|
38
|
+
* unlike `body_hash`, that column is only backfilled during a
|
|
39
|
+
* `viewer-build`, not written during a live crawl, so filtering on it here
|
|
40
|
+
* would silently diverge from what the live crawl-time gate actually saw.
|
|
41
|
+
* `DedupeCapTracker#observe` is an O(1) no-op for a shape already in its
|
|
42
|
+
* sticky set regardless, so replaying an already-capped shape's rows costs
|
|
43
|
+
* a discarded observation, never an incorrect one.
|
|
44
|
+
*
|
|
45
|
+
* Rows are read in `ci.id` order (insertion / discovery order) via
|
|
46
|
+
* `keysetPaginateById` — Misra-Gries counting is order-dependent, so
|
|
47
|
+
* replaying in the archive's original discovery order reproduces what the
|
|
48
|
+
* tracker's state would look like had the process never restarted, subject
|
|
49
|
+
* to the same `mapCap` LRU eviction.
|
|
50
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
51
|
+
* @param onProgress - Called after each chunk, with the highest `ci.id`
|
|
52
|
+
* scanned so far and the max `ci.id` in the table — mirrors
|
|
53
|
+
* `getResourceUrlList`'s progress shape (`SetupProgressCallbacks.onChunkProgress`).
|
|
54
|
+
* Omit for no reporting (tests, and callers that don't need it).
|
|
55
|
+
* @returns Every qualifying page's raw fields, in `ci.id` order.
|
|
56
|
+
*/
|
|
57
|
+
export declare function listDedupeCapObservations(knex: Knex, onProgress?: (scannedUpToId: number, maxId: number) => void): Promise<DedupeCapObservationRow[]>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { keysetPaginateById } from '../_shared/keyset-paginate-by-id.js';
|
|
2
|
+
const READ_CHUNK_SIZE = 2000;
|
|
3
|
+
/**
|
|
4
|
+
* Reads back every previously-scraped internal page's raw fields in the
|
|
5
|
+
* exact population a live crawl's `DedupeCapTracker#observe` call site
|
|
6
|
+
* would have fed it, so `CrawlerOrchestrator`'s five resuming-session
|
|
7
|
+
* methods (`append`/`inventory`/`recrawl`/`retryFailed`/`resume`) can
|
|
8
|
+
* replay a prior session's Misra-Gries observations into a fresh tracker
|
|
9
|
+
* instance (see `buildDedupeCapObservation`) instead of restarting every
|
|
10
|
+
* not-yet-capped shape's counter at 0.
|
|
11
|
+
*
|
|
12
|
+
* The WHERE clause reproduces the live observation gate
|
|
13
|
+
* (`!isExternal && !isMetadataOnly && html.length > 0`) using columns that
|
|
14
|
+
* survive a process restart:
|
|
15
|
+
*
|
|
16
|
+
* - `is_external = 0` — external pages carry no useful signal (same
|
|
17
|
+
* exclusion `computeMetaSignature`'s design already assumes).
|
|
18
|
+
* - `is_target = 1` — the archived equivalent of "not metadata-only": a
|
|
19
|
+
* metadata-only fetch never invokes the browser and is written with
|
|
20
|
+
* `is_target = 0` (see `Crawler`'s metadata-only branch), matching the
|
|
21
|
+
* live gate's `!isMetadataOnly` exactly.
|
|
22
|
+
* - `redirect_dest_id IS NULL` — a redirect source's own body was never
|
|
23
|
+
* rendered; only the destination page (a separate row) was.
|
|
24
|
+
* - `is_skipped IS NULL OR is_skipped = 0` — a skipped placeholder row
|
|
25
|
+
* (`source = 'inventory-seed'` etc.) has no rendered body either.
|
|
26
|
+
* - `pm.body_hash IS NOT NULL` — the archived proxy for `html.length > 0`:
|
|
27
|
+
* `update-page.ts` only ever writes a non-null `body_hash` on the same
|
|
28
|
+
* `writeHtml && html.length > 0` gate the live site's `precomputedBodyHash`
|
|
29
|
+
* computation uses, so this column faithfully reconstructs that
|
|
30
|
+
* condition. Also excludes pre-`body_hash`-migration legacy archives'
|
|
31
|
+
* un-backfilled rows (`migrate-page-meta-body-hash.ts` adds the column on
|
|
32
|
+
* every writer open but does not compute values for existing rows) —
|
|
33
|
+
* understating the replayed count is safe (never over-counts), so no
|
|
34
|
+
* column-presence guard is needed here.
|
|
35
|
+
*
|
|
36
|
+
* Deliberately does NOT exclude rows already marked
|
|
37
|
+
* `content_items.dedupe_cap_event_id` (the post-hoc marking column) —
|
|
38
|
+
* unlike `body_hash`, that column is only backfilled during a
|
|
39
|
+
* `viewer-build`, not written during a live crawl, so filtering on it here
|
|
40
|
+
* would silently diverge from what the live crawl-time gate actually saw.
|
|
41
|
+
* `DedupeCapTracker#observe` is an O(1) no-op for a shape already in its
|
|
42
|
+
* sticky set regardless, so replaying an already-capped shape's rows costs
|
|
43
|
+
* a discarded observation, never an incorrect one.
|
|
44
|
+
*
|
|
45
|
+
* Rows are read in `ci.id` order (insertion / discovery order) via
|
|
46
|
+
* `keysetPaginateById` — Misra-Gries counting is order-dependent, so
|
|
47
|
+
* replaying in the archive's original discovery order reproduces what the
|
|
48
|
+
* tracker's state would look like had the process never restarted, subject
|
|
49
|
+
* to the same `mapCap` LRU eviction.
|
|
50
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
51
|
+
* @param onProgress - Called after each chunk, with the highest `ci.id`
|
|
52
|
+
* scanned so far and the max `ci.id` in the table — mirrors
|
|
53
|
+
* `getResourceUrlList`'s progress shape (`SetupProgressCallbacks.onChunkProgress`).
|
|
54
|
+
* Omit for no reporting (tests, and callers that don't need it).
|
|
55
|
+
* @returns Every qualifying page's raw fields, in `ci.id` order.
|
|
56
|
+
*/
|
|
57
|
+
export async function listDedupeCapObservations(knex, onProgress) {
|
|
58
|
+
return keysetPaginateById(knex, 'content_items', (lastId) => knex('content_items as ci')
|
|
59
|
+
.join('url_refs as ur', 'ur.id', 'ci.url_id')
|
|
60
|
+
.join('page_meta as pm', 'pm.page_id', 'ci.id')
|
|
61
|
+
.leftJoin('text_refs as title_ref', 'title_ref.id', 'pm.title_text_id')
|
|
62
|
+
.leftJoin('text_refs as description_ref', 'description_ref.id', 'pm.description_text_id')
|
|
63
|
+
.leftJoin('text_refs as og_title_ref', 'og_title_ref.id', 'pm.og_title_text_id')
|
|
64
|
+
.leftJoin('url_refs as og_url_ur', 'og_url_ur.id', 'pm.og_url_id')
|
|
65
|
+
.where('ci.id', '>', lastId)
|
|
66
|
+
.andWhere('ci.scraped', 1)
|
|
67
|
+
.andWhere('ci.is_external', 0)
|
|
68
|
+
.andWhere('ci.is_target', 1)
|
|
69
|
+
.whereNull('ci.redirect_dest_id')
|
|
70
|
+
.where((qb) => {
|
|
71
|
+
qb.whereNull('ci.is_skipped').orWhere('ci.is_skipped', 0);
|
|
72
|
+
})
|
|
73
|
+
.whereNotNull('pm.body_hash')
|
|
74
|
+
.orderBy('ci.id', 'asc')
|
|
75
|
+
.limit(READ_CHUNK_SIZE)
|
|
76
|
+
.select('ci.id as id', 'ur.url as url', 'title_ref.text as title', 'description_ref.text as description', 'og_title_ref.text as ogTitle', 'og_url_ur.url as ogUrl', 'pm.body_hash as bodyHash'), (row) => ({
|
|
77
|
+
url: row.url,
|
|
78
|
+
title: row.title,
|
|
79
|
+
description: row.description,
|
|
80
|
+
ogTitle: row.ogTitle,
|
|
81
|
+
ogUrl: row.ogUrl,
|
|
82
|
+
// libsql returns BLOB columns as `Uint8Array`, not `Buffer` —
|
|
83
|
+
// `DedupeCapTracker#observe` compares hashes via `Buffer#equals`,
|
|
84
|
+
// so this must be a real `Buffer`.
|
|
85
|
+
bodyHash: Buffer.from(row.bodyHash),
|
|
86
|
+
}), onProgress);
|
|
87
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Every distinct `dedupe_cap_events.shape_key` recorded in this archive —
|
|
4
|
+
* used by `CrawlerOrchestrator` to preload `DedupeCapTracker`'s sticky set
|
|
5
|
+
* on `--resume` / `--append` / `--retry-failed` / `--inventory`, so a trap
|
|
6
|
+
* this crawl already paid the cost of discovering once is not re-admitted
|
|
7
|
+
* in a later session. Fresh (non-resuming) crawls do not call this — there
|
|
8
|
+
* is no archive history to seed from.
|
|
9
|
+
*
|
|
10
|
+
* Unlike `listDnsBurnedHostCandidates`, no additional exclusion logic is
|
|
11
|
+
* needed: once `DedupeCapTracker` confirms a shape as a trap, it stays
|
|
12
|
+
* confirmed — there is no equivalent of "the host might have recovered
|
|
13
|
+
* since".
|
|
14
|
+
*
|
|
15
|
+
* Returns `[]` on legacy archives that pre-date the `dedupe_cap_events`
|
|
16
|
+
* table (self-healed on next writer open, so this is never a permanent
|
|
17
|
+
* state) or that have recorded no capped shapes.
|
|
18
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
19
|
+
* @returns Distinct shape keys already confirmed capped.
|
|
20
|
+
*/
|
|
21
|
+
export declare function listDedupeCapShapeKeys(knex: Knex): Promise<string[]>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every distinct `dedupe_cap_events.shape_key` recorded in this archive —
|
|
3
|
+
* used by `CrawlerOrchestrator` to preload `DedupeCapTracker`'s sticky set
|
|
4
|
+
* on `--resume` / `--append` / `--retry-failed` / `--inventory`, so a trap
|
|
5
|
+
* this crawl already paid the cost of discovering once is not re-admitted
|
|
6
|
+
* in a later session. Fresh (non-resuming) crawls do not call this — there
|
|
7
|
+
* is no archive history to seed from.
|
|
8
|
+
*
|
|
9
|
+
* Unlike `listDnsBurnedHostCandidates`, no additional exclusion logic is
|
|
10
|
+
* needed: once `DedupeCapTracker` confirms a shape as a trap, it stays
|
|
11
|
+
* confirmed — there is no equivalent of "the host might have recovered
|
|
12
|
+
* since".
|
|
13
|
+
*
|
|
14
|
+
* Returns `[]` on legacy archives that pre-date the `dedupe_cap_events`
|
|
15
|
+
* table (self-healed on next writer open, so this is never a permanent
|
|
16
|
+
* state) or that have recorded no capped shapes.
|
|
17
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
18
|
+
* @returns Distinct shape keys already confirmed capped.
|
|
19
|
+
*/
|
|
20
|
+
export async function listDedupeCapShapeKeys(knex) {
|
|
21
|
+
const hasTable = await knex.schema.hasTable('dedupe_cap_events');
|
|
22
|
+
if (!hasTable) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const rows = await knex('dedupe_cap_events').distinct('shape_key');
|
|
26
|
+
return rows.map((row) => row.shape_key);
|
|
27
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Records a crawler-level (`error` channel) failure into `crawl_errors`.
|
|
4
|
+
*
|
|
5
|
+
* Unlike `insertPageError` this is not tied to a scraped page: `url`
|
|
6
|
+
* may be an external link that never became a page row, or `null` for a
|
|
7
|
+
* process-level error. The cause is intentionally not stored — it is derived
|
|
8
|
+
* on read so that older archives (which only have `error.log`) and freshly
|
|
9
|
+
* captured rows classify identically.
|
|
10
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
11
|
+
* @param url - The URL the error is about, or `null` for a process-level error.
|
|
12
|
+
* @param message - The error message (one line is enough for classification).
|
|
13
|
+
* @param isExternal - Whether the URL is external to the crawl scope.
|
|
14
|
+
*/
|
|
15
|
+
export declare function insertCrawlError(knex: Knex, url: string | null, message: string, isExternal?: boolean): Promise<void>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Records a crawler-level (`error` channel) failure into `crawl_errors`.
|
|
3
|
+
*
|
|
4
|
+
* Unlike `insertPageError` this is not tied to a scraped page: `url`
|
|
5
|
+
* may be an external link that never became a page row, or `null` for a
|
|
6
|
+
* process-level error. The cause is intentionally not stored — it is derived
|
|
7
|
+
* on read so that older archives (which only have `error.log`) and freshly
|
|
8
|
+
* captured rows classify identically.
|
|
9
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
10
|
+
* @param url - The URL the error is about, or `null` for a process-level error.
|
|
11
|
+
* @param message - The error message (one line is enough for classification).
|
|
12
|
+
* @param isExternal - Whether the URL is external to the crawl scope.
|
|
13
|
+
*/
|
|
14
|
+
export async function insertCrawlError(knex, url, message, isExternal = false) {
|
|
15
|
+
await knex('crawl_errors').insert({
|
|
16
|
+
url,
|
|
17
|
+
isExternal: isExternal ? 1 : 0,
|
|
18
|
+
message,
|
|
19
|
+
createdAt: Date.now(),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WriteRefCaches } from '../_shared/types.js';
|
|
2
|
+
import type { Knex } from 'knex';
|
|
3
|
+
/**
|
|
4
|
+
* Records a partial scrape failure against the page identified by `url`.
|
|
5
|
+
*
|
|
6
|
+
* The page row is resolved (or inserted as a stub) via
|
|
7
|
+
* {@link resolveContentItemId} so the error can be recorded even before
|
|
8
|
+
* `setPage` has run — useful when the failure fires during scraping
|
|
9
|
+
* (e.g. mid-`scrapeStart`) and the orchestrator enqueues this write
|
|
10
|
+
* before the success write for the same URL.
|
|
11
|
+
*
|
|
12
|
+
* A single page can have multiple `page_errors` rows (e.g. both
|
|
13
|
+
* `desktop-compact` and `mobile-small` viewports failing).
|
|
14
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
15
|
+
* @param caches - The connection's write-side id caches.
|
|
16
|
+
* @param url - URL of the page being scraped.
|
|
17
|
+
* @param phase - Scrape phase name (typically `'retryExhausted'`).
|
|
18
|
+
* @param message - Human-readable failure message.
|
|
19
|
+
* @param isExternal - Whether the URL is external. Defaults to `false`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function insertPageError(knex: Knex, caches: WriteRefCaches, url: string, phase: string, message: string, isExternal?: boolean): Promise<void>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { resolveContentItemId } from '../_shared/resolve-content-item-id.js';
|
|
2
|
+
/**
|
|
3
|
+
* Records a partial scrape failure against the page identified by `url`.
|
|
4
|
+
*
|
|
5
|
+
* The page row is resolved (or inserted as a stub) via
|
|
6
|
+
* {@link resolveContentItemId} so the error can be recorded even before
|
|
7
|
+
* `setPage` has run — useful when the failure fires during scraping
|
|
8
|
+
* (e.g. mid-`scrapeStart`) and the orchestrator enqueues this write
|
|
9
|
+
* before the success write for the same URL.
|
|
10
|
+
*
|
|
11
|
+
* A single page can have multiple `page_errors` rows (e.g. both
|
|
12
|
+
* `desktop-compact` and `mobile-small` viewports failing).
|
|
13
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
14
|
+
* @param caches - The connection's write-side id caches.
|
|
15
|
+
* @param url - URL of the page being scraped.
|
|
16
|
+
* @param phase - Scrape phase name (typically `'retryExhausted'`).
|
|
17
|
+
* @param message - Human-readable failure message.
|
|
18
|
+
* @param isExternal - Whether the URL is external. Defaults to `false`.
|
|
19
|
+
*/
|
|
20
|
+
export async function insertPageError(knex, caches, url, phase, message, isExternal = false) {
|
|
21
|
+
const pageId = await resolveContentItemId(knex, caches, url, {
|
|
22
|
+
isExternal: isExternal ? 1 : 0,
|
|
23
|
+
});
|
|
24
|
+
await knex('page_errors').insert({
|
|
25
|
+
pageId,
|
|
26
|
+
phase,
|
|
27
|
+
message,
|
|
28
|
+
createdAt: Date.now(),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Hostnames whose `crawl_errors` history is consistently DNS failures and
|
|
4
|
+
* for which no recent 2xx-3xx page or resource is recorded — i.e. hosts
|
|
5
|
+
* the previous crawl already proved unreachable. Returned in lower-cased
|
|
6
|
+
* form. Used by `CrawlerOrchestrator.#preloadDnsBurnedHostCache` so the
|
|
7
|
+
* next session short-circuits HEAD pre-flight on these hosts.
|
|
8
|
+
*
|
|
9
|
+
* Implementation: a coarse `LIKE` filter over `crawl_errors.message`
|
|
10
|
+
* narrows the row set, then `classifyErrorKind` confirms `'dns'` in JS
|
|
11
|
+
* (the regex is the single truth source — DB-side filters never narrow
|
|
12
|
+
* it). Exclusion bags are built from a single `pages` and a single
|
|
13
|
+
* `resources` scan: any host with a 2xx-3xx page, a 2xx-3xx resource, or
|
|
14
|
+
* a `pages.lastCrawledAt` newer than its latest DNS error is dropped
|
|
15
|
+
* (the host probably recovered between the failure and the last crawl).
|
|
16
|
+
*
|
|
17
|
+
* Returns `[]` on legacy archives that pre-date the `crawl_errors`
|
|
18
|
+
* table — the `hasTable` guard keeps the call non-destructive.
|
|
19
|
+
*
|
|
20
|
+
* **Outage exclusion**: a host whose latest DNS error's `createdAt` falls
|
|
21
|
+
* inside a recorded `network_outages` window is dropped from the result
|
|
22
|
+
* regardless of the other checks. A host with no prior success this
|
|
23
|
+
* archive has ever seen (the case this whole exclusion-bag scheme cannot
|
|
24
|
+
* otherwise catch) would, without this check, get preload-seeded into
|
|
25
|
+
* `dnsBurnedHostCache` and short-circuit on EVERY subsequent session
|
|
26
|
+
* forever — the exact "damage 3" this function's caller
|
|
27
|
+
* (`#preloadDnsBurnedHostCache`) exists to prevent for hosts genuinely
|
|
28
|
+
* proven dead, not to inflict on hosts merely unlucky enough to be first
|
|
29
|
+
* contacted during an operator-side network blip.
|
|
30
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
31
|
+
* @returns Lower-cased hostnames safe to short-circuit.
|
|
32
|
+
*/
|
|
33
|
+
export declare function listDnsBurnedHostCandidates(knex: Knex): Promise<string[]>;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { classifyErrorKind } from '../../error-kind/classify-error-kind.js';
|
|
2
|
+
import { isWithinOutageWindow } from '../../is-within-outage-window.js';
|
|
3
|
+
import { listNetworkOutages } from '../outages/list-network-outages.js';
|
|
4
|
+
/**
|
|
5
|
+
* Hostnames whose `crawl_errors` history is consistently DNS failures and
|
|
6
|
+
* for which no recent 2xx-3xx page or resource is recorded — i.e. hosts
|
|
7
|
+
* the previous crawl already proved unreachable. Returned in lower-cased
|
|
8
|
+
* form. Used by `CrawlerOrchestrator.#preloadDnsBurnedHostCache` so the
|
|
9
|
+
* next session short-circuits HEAD pre-flight on these hosts.
|
|
10
|
+
*
|
|
11
|
+
* Implementation: a coarse `LIKE` filter over `crawl_errors.message`
|
|
12
|
+
* narrows the row set, then `classifyErrorKind` confirms `'dns'` in JS
|
|
13
|
+
* (the regex is the single truth source — DB-side filters never narrow
|
|
14
|
+
* it). Exclusion bags are built from a single `pages` and a single
|
|
15
|
+
* `resources` scan: any host with a 2xx-3xx page, a 2xx-3xx resource, or
|
|
16
|
+
* a `pages.lastCrawledAt` newer than its latest DNS error is dropped
|
|
17
|
+
* (the host probably recovered between the failure and the last crawl).
|
|
18
|
+
*
|
|
19
|
+
* Returns `[]` on legacy archives that pre-date the `crawl_errors`
|
|
20
|
+
* table — the `hasTable` guard keeps the call non-destructive.
|
|
21
|
+
*
|
|
22
|
+
* **Outage exclusion**: a host whose latest DNS error's `createdAt` falls
|
|
23
|
+
* inside a recorded `network_outages` window is dropped from the result
|
|
24
|
+
* regardless of the other checks. A host with no prior success this
|
|
25
|
+
* archive has ever seen (the case this whole exclusion-bag scheme cannot
|
|
26
|
+
* otherwise catch) would, without this check, get preload-seeded into
|
|
27
|
+
* `dnsBurnedHostCache` and short-circuit on EVERY subsequent session
|
|
28
|
+
* forever — the exact "damage 3" this function's caller
|
|
29
|
+
* (`#preloadDnsBurnedHostCache`) exists to prevent for hosts genuinely
|
|
30
|
+
* proven dead, not to inflict on hosts merely unlucky enough to be first
|
|
31
|
+
* contacted during an operator-side network blip.
|
|
32
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
33
|
+
* @returns Lower-cased hostnames safe to short-circuit.
|
|
34
|
+
*/
|
|
35
|
+
export async function listDnsBurnedHostCandidates(knex) {
|
|
36
|
+
const hasCrawlErrors = await knex.schema.hasTable('crawl_errors');
|
|
37
|
+
if (!hasCrawlErrors) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
// Coarse SQL filter: cheap LIKE OR-chain over `message`. The dns regex
|
|
41
|
+
// truth source lives in `classifyErrorKind`, so we only need to feed it
|
|
42
|
+
// rows that COULD match a DNS token. Each LIKE is anchored on a known
|
|
43
|
+
// substring of the regex so future additions to the regex (without
|
|
44
|
+
// matching new SQL terms) widen the JS-side filter only — never narrow it.
|
|
45
|
+
//
|
|
46
|
+
// `%EAI_AGAIN%` is deliberately NOT in the SQL filter: it now classifies
|
|
47
|
+
// as `dns-transient` (local resolver hiccup), not `dns`, so it must not
|
|
48
|
+
// reach this candidate set. The `%getaddrinfo%` term still pulls
|
|
49
|
+
// `getaddrinfo EAI_AGAIN ...` rows but the JS-side `classifyErrorKind`
|
|
50
|
+
// check (first-match-wins) routes them to `dns-transient` and they
|
|
51
|
+
// silently drop out — keeping the cache focused on real NXDOMAIN.
|
|
52
|
+
const dnsLikeRows = (await knex('crawl_errors')
|
|
53
|
+
.select('url', 'message', 'createdAt')
|
|
54
|
+
.whereNotNull('url')
|
|
55
|
+
.where((qb) => {
|
|
56
|
+
qb.where('message', 'like', '%ENOTFOUND%')
|
|
57
|
+
.orWhere('message', 'like', '%getaddrinfo%')
|
|
58
|
+
.orWhere('message', 'like', '%ERR_NAME_NOT_RESOLVED%')
|
|
59
|
+
.orWhere('message', 'like', '%ERR_NAME_RESOLUTION_FAILED%');
|
|
60
|
+
}));
|
|
61
|
+
if (dnsLikeRows.length === 0) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
// Map<hostname, latestErrorCreatedAt> for hosts whose error message
|
|
65
|
+
// confidently classifies as DNS (LIKE matched but classifyErrorKind says
|
|
66
|
+
// e.g. `unknown` → drop).
|
|
67
|
+
const candidateLatestErrorAt = new Map();
|
|
68
|
+
for (const row of dnsLikeRows) {
|
|
69
|
+
if (classifyErrorKind(row.message) !== 'dns') {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
let host;
|
|
73
|
+
try {
|
|
74
|
+
host = new URL(row.url).hostname.toLowerCase();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (!host) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const createdAt = typeof row.createdAt === 'number' ? row.createdAt : 0;
|
|
83
|
+
const previous = candidateLatestErrorAt.get(host) ?? 0;
|
|
84
|
+
if (createdAt > previous) {
|
|
85
|
+
candidateLatestErrorAt.set(host, createdAt);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (candidateLatestErrorAt.size === 0) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
// Exclusion-bag #1: pages with a 2xx-3xx status anywhere on the host.
|
|
92
|
+
// Tracking the latest `last_crawled_at` per host lets us additionally
|
|
93
|
+
// drop hosts whose last successful contact post-dates the most recent
|
|
94
|
+
// DNS error (the host probably came back after a transient outage).
|
|
95
|
+
const pageOkRows = (await knex('content_items')
|
|
96
|
+
.join('url_refs', 'content_items.url_id', 'url_refs.id')
|
|
97
|
+
.select('url_refs.url as url', 'content_items.last_crawled_at as lastCrawledAt')
|
|
98
|
+
.whereBetween('content_items.status', [200, 399]));
|
|
99
|
+
const pageOkHosts = new Set();
|
|
100
|
+
const latestPageOkAt = new Map();
|
|
101
|
+
for (const row of pageOkRows) {
|
|
102
|
+
let host;
|
|
103
|
+
try {
|
|
104
|
+
host = new URL(row.url).hostname.toLowerCase();
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
pageOkHosts.add(host);
|
|
110
|
+
if (typeof row.lastCrawledAt === 'number') {
|
|
111
|
+
const previous = latestPageOkAt.get(host) ?? 0;
|
|
112
|
+
if (row.lastCrawledAt > previous) {
|
|
113
|
+
latestPageOkAt.set(host, row.lastCrawledAt);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Exclusion-bag #2: non-HTML resources with a 2xx-3xx status. resources
|
|
118
|
+
// have no timestamp column so this is presence-only.
|
|
119
|
+
const resourceOkRows = (await knex('resource_items')
|
|
120
|
+
.join('url_refs', 'resource_items.url_id', 'url_refs.id')
|
|
121
|
+
.select('url_refs.url as url')
|
|
122
|
+
.whereBetween('resource_items.status', [200, 399]));
|
|
123
|
+
const resourceOkHosts = new Set();
|
|
124
|
+
for (const row of resourceOkRows) {
|
|
125
|
+
let host;
|
|
126
|
+
try {
|
|
127
|
+
host = new URL(row.url).hostname.toLowerCase();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
resourceOkHosts.add(host);
|
|
133
|
+
}
|
|
134
|
+
const outageWindows = await listNetworkOutages(knex);
|
|
135
|
+
// A candidate host is burned only if neither pages nor resources hold a
|
|
136
|
+
// 2xx-3xx for it, its latest 2xx page (if any) is not newer than the
|
|
137
|
+
// latest DNS error (guards against re-burning a host that recovered
|
|
138
|
+
// between the last DNS failure and the most recent crawl), AND that
|
|
139
|
+
// latest DNS error did not happen during a recorded network outage.
|
|
140
|
+
const burned = [];
|
|
141
|
+
for (const [host, latestErrorAt] of candidateLatestErrorAt) {
|
|
142
|
+
if (pageOkHosts.has(host)) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (resourceOkHosts.has(host)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const latestOkAt = latestPageOkAt.get(host);
|
|
149
|
+
if (typeof latestOkAt === 'number' && latestOkAt > latestErrorAt) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (isWithinOutageWindow(latestErrorAt, outageWindows)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
burned.push(host);
|
|
156
|
+
}
|
|
157
|
+
return burned;
|
|
158
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Reads the stored HTML snapshot row of a page (`page_html_ref` →
|
|
4
|
+
* `page_html_blobs`) without decoding it.
|
|
5
|
+
*
|
|
6
|
+
* Kept apart from the decode so that a caller can retry the read (a
|
|
7
|
+
* transient database failure) without retrying the decode (a corrupt or
|
|
8
|
+
* oversized blob fails the same way every time).
|
|
9
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
10
|
+
* @param pageId - The database ID of the page.
|
|
11
|
+
* @returns The blob's hash, stored bytes and codec, or `null` if no snapshot is stored.
|
|
12
|
+
*/
|
|
13
|
+
export declare function readPageHtmlBlob(knex: Knex, pageId: number): Promise<{
|
|
14
|
+
hash: Uint8Array;
|
|
15
|
+
body: Uint8Array;
|
|
16
|
+
codec: string;
|
|
17
|
+
} | null>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads the stored HTML snapshot row of a page (`page_html_ref` →
|
|
3
|
+
* `page_html_blobs`) without decoding it.
|
|
4
|
+
*
|
|
5
|
+
* Kept apart from the decode so that a caller can retry the read (a
|
|
6
|
+
* transient database failure) without retrying the decode (a corrupt or
|
|
7
|
+
* oversized blob fails the same way every time).
|
|
8
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
9
|
+
* @param pageId - The database ID of the page.
|
|
10
|
+
* @returns The blob's hash, stored bytes and codec, or `null` if no snapshot is stored.
|
|
11
|
+
*/
|
|
12
|
+
export async function readPageHtmlBlob(knex, pageId) {
|
|
13
|
+
const row = await knex
|
|
14
|
+
.from('page_html_ref')
|
|
15
|
+
.join('page_html_blobs', 'page_html_ref.hash', '=', 'page_html_blobs.hash')
|
|
16
|
+
.select('page_html_blobs.hash as hash', 'page_html_blobs.body as body', 'page_html_blobs.codec as codec')
|
|
17
|
+
.where('page_html_ref.page_id', pageId)
|
|
18
|
+
.first();
|
|
19
|
+
return row ?? null;
|
|
20
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Knex } from 'knex';
|
|
2
|
+
/**
|
|
3
|
+
* Forces a WAL checkpoint, writing all pending WAL data back to the main database file.
|
|
4
|
+
* Uses TRUNCATE mode to reset the WAL file to zero bytes after checkpointing.
|
|
5
|
+
* This ensures the database is fully self-contained in `db.sqlite` before archiving.
|
|
6
|
+
* @param knex - Knex query builder connected to the archive DB.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkpoint(knex: Knex): Promise<void>;
|