mcp-scraper 0.43.4 → 0.43.6
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/README.md +3 -2
- package/dist/bin/api-server.cjs +124 -42
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +3 -3
- package/dist/bin/mcp-scraper-cli.cjs +1 -1
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-install.cjs +1 -1
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.cjs +26 -8
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +6 -4
- package/dist/bin/mcp-stdio-server.js.map +1 -1
- package/dist/bin/paa-harvest.cjs.map +1 -1
- package/dist/bin/paa-harvest.js +3 -3
- package/dist/{chunk-6WLNXYRG.js → chunk-27FMOD6S.js} +1 -2
- package/dist/chunk-27FMOD6S.js.map +1 -0
- package/dist/{chunk-SXLQZKWC.js → chunk-3FKUKMNE.js} +30 -11
- package/dist/chunk-3FKUKMNE.js.map +1 -0
- package/dist/chunk-4FQDZ2T7.js +7 -0
- package/dist/chunk-4FQDZ2T7.js.map +1 -0
- package/dist/{chunk-FCFQ634B.js → chunk-5X7CJEK3.js} +25 -8
- package/dist/chunk-5X7CJEK3.js.map +1 -0
- package/dist/{chunk-ZBQ6EXZW.js → chunk-OVD4E4AP.js} +2 -2
- package/dist/{chunk-6TAQ2MXK.js → chunk-RJMOOII7.js} +2 -2
- package/dist/{chunk-ZDVQARDQ.js → chunk-T5AFM4G5.js} +2 -2
- package/dist/{chunk-QOWBJ4YY.js → chunk-WT2UHDSE.js} +2 -2
- package/dist/{chunk-GUI33Q27.js → chunk-WWIJ2NID.js} +2 -2
- package/dist/{db-C5ELI55I.js → db-4ABEYNDM.js} +4 -2
- package/dist/{extract-bundle-IOM45SFL.js → extract-bundle-U3MNYDKC.js} +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/{location-data-repository-SHEOIBTL.js → location-data-repository-HDNCU4Z4.js} +3 -3
- package/dist/{server-K76DL4S7.js → server-ZCX5X3N4.js} +76 -38
- package/dist/server-ZCX5X3N4.js.map +1 -0
- package/dist/{site-extract-repository-XNI4ZK2M.js → site-extract-repository-CKCJDP7N.js} +3 -3
- package/dist/{worker-OB6WSWOD.js → worker-73AYU4IK.js} +5 -5
- package/package.json +2 -1
- package/dist/chunk-6WLNXYRG.js.map +0 -1
- package/dist/chunk-FCFQ634B.js.map +0 -1
- package/dist/chunk-SXLQZKWC.js.map +0 -1
- package/dist/chunk-XQIVXIAL.js +0 -7
- package/dist/chunk-XQIVXIAL.js.map +0 -1
- package/dist/server-K76DL4S7.js.map +0 -1
- /package/dist/{chunk-ZBQ6EXZW.js.map → chunk-OVD4E4AP.js.map} +0 -0
- /package/dist/{chunk-6TAQ2MXK.js.map → chunk-RJMOOII7.js.map} +0 -0
- /package/dist/{chunk-ZDVQARDQ.js.map → chunk-T5AFM4G5.js.map} +0 -0
- /package/dist/{chunk-QOWBJ4YY.js.map → chunk-WT2UHDSE.js.map} +0 -0
- /package/dist/{chunk-GUI33Q27.js.map → chunk-WWIJ2NID.js.map} +0 -0
- /package/dist/{db-C5ELI55I.js.map → db-4ABEYNDM.js.map} +0 -0
- /package/dist/{extract-bundle-IOM45SFL.js.map → extract-bundle-U3MNYDKC.js.map} +0 -0
- /package/dist/{location-data-repository-SHEOIBTL.js.map → location-data-repository-HDNCU4Z4.js.map} +0 -0
- /package/dist/{site-extract-repository-XNI4ZK2M.js.map → site-extract-repository-CKCJDP7N.js.map} +0 -0
- /package/dist/{worker-OB6WSWOD.js.map → worker-73AYU4IK.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
harvest
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RJMOOII7.js";
|
|
4
4
|
import {
|
|
5
5
|
recordVendorUsage
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-T5AFM4G5.js";
|
|
7
7
|
import "./chunk-3ZUBQQPQ.js";
|
|
8
8
|
import "./chunk-5UN33CGU.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-5X7CJEK3.js";
|
|
10
10
|
|
|
11
11
|
// src/video/VideoGenerator.ts
|
|
12
12
|
import { execSync as execSync2 } from "child_process";
|
|
@@ -13,9 +13,9 @@ import {
|
|
|
13
13
|
parseHostedCensusPlacesCsv,
|
|
14
14
|
parseHostedZipGroupsCsv,
|
|
15
15
|
queryHostedLocationMarkets
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-WT2UHDSE.js";
|
|
17
17
|
import "./chunk-G3P3ZDB4.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-5X7CJEK3.js";
|
|
19
19
|
export {
|
|
20
20
|
HOSTED_CENSUS_DATASET_PREFIX,
|
|
21
21
|
HOSTED_ZIP_DATASET_KIND,
|
|
@@ -32,4 +32,4 @@ export {
|
|
|
32
32
|
parseHostedZipGroupsCsv,
|
|
33
33
|
queryHostedLocationMarkets
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=location-data-repository-
|
|
35
|
+
//# sourceMappingURL=location-data-repository-HDNCU4Z4.js.map
|
|
@@ -4,20 +4,20 @@ import {
|
|
|
4
4
|
harvestPageMedia,
|
|
5
5
|
readOwnedSiteExtractArtifactBuffer,
|
|
6
6
|
renewSiteExtractArtifactDownload
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-27FMOD6S.js";
|
|
8
8
|
import {
|
|
9
9
|
REQUIRED_LOCATION_STATE_CODES,
|
|
10
10
|
importHostedCensusPlacesCsv,
|
|
11
11
|
importHostedZipGroupsCsv,
|
|
12
12
|
listActiveHostedLocationDatasets
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-WT2UHDSE.js";
|
|
14
14
|
import {
|
|
15
15
|
classifyHarvestProblem,
|
|
16
16
|
createHarvestAttemptRecorder,
|
|
17
17
|
deliverWebhook,
|
|
18
18
|
harvestProblemResponse,
|
|
19
19
|
serializeHarvestProblem
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-OVD4E4AP.js";
|
|
21
21
|
import {
|
|
22
22
|
AIModeSelectors,
|
|
23
23
|
AIOverviewSelectors,
|
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
resolveKernelProxyId,
|
|
45
45
|
serpArrivalUrl,
|
|
46
46
|
withRuntimeUserAgent
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-RJMOOII7.js";
|
|
48
48
|
import {
|
|
49
49
|
ApiErrorResponseSchema,
|
|
50
50
|
ArtifactTemplateConfigSchema,
|
|
@@ -86,7 +86,7 @@ import {
|
|
|
86
86
|
renewDirectoryArtifactDownload,
|
|
87
87
|
resolveDeploymentProfile,
|
|
88
88
|
transcribeMediaUrl
|
|
89
|
-
} from "./chunk-
|
|
89
|
+
} from "./chunk-3FKUKMNE.js";
|
|
90
90
|
import {
|
|
91
91
|
auditImageUrls,
|
|
92
92
|
auditImages,
|
|
@@ -114,7 +114,7 @@ import {
|
|
|
114
114
|
recordKernelSession,
|
|
115
115
|
recordVendorUsage,
|
|
116
116
|
runWithCostContext
|
|
117
|
-
} from "./chunk-
|
|
117
|
+
} from "./chunk-T5AFM4G5.js";
|
|
118
118
|
import {
|
|
119
119
|
listWorkflowDefinitions,
|
|
120
120
|
runWorkflow,
|
|
@@ -142,7 +142,7 @@ import {
|
|
|
142
142
|
} from "./chunk-3ZUBQQPQ.js";
|
|
143
143
|
import {
|
|
144
144
|
PACKAGE_VERSION
|
|
145
|
-
} from "./chunk-
|
|
145
|
+
} from "./chunk-4FQDZ2T7.js";
|
|
146
146
|
import {
|
|
147
147
|
abandonExtractSettlement,
|
|
148
148
|
countSuccessfulPages,
|
|
@@ -165,7 +165,7 @@ import {
|
|
|
165
165
|
setExtractJobTotal,
|
|
166
166
|
settleExtractJob,
|
|
167
167
|
terminalExtractJobStatus
|
|
168
|
-
} from "./chunk-
|
|
168
|
+
} from "./chunk-WWIJ2NID.js";
|
|
169
169
|
import {
|
|
170
170
|
BROWSER_OPEN_MIN_BALANCE_MC,
|
|
171
171
|
CONCURRENCY_PRICE_ID,
|
|
@@ -321,7 +321,7 @@ import {
|
|
|
321
321
|
startHarvestAttempt,
|
|
322
322
|
upsertPageSnapshot,
|
|
323
323
|
verifyPassword
|
|
324
|
-
} from "./chunk-
|
|
324
|
+
} from "./chunk-5X7CJEK3.js";
|
|
325
325
|
|
|
326
326
|
// src/blog/registry.ts
|
|
327
327
|
var posts = [
|
|
@@ -3775,6 +3775,9 @@ async function fetchWithKernel(url) {
|
|
|
3775
3775
|
}
|
|
3776
3776
|
}
|
|
3777
3777
|
|
|
3778
|
+
// src/lib/http-user-agent.ts
|
|
3779
|
+
var MCP_SCRAPER_CRAWLER_USER_AGENT = "MCPScraperBot/1.0 (+https://mcpscraper.dev)";
|
|
3780
|
+
|
|
3778
3781
|
// src/api/kpo-extractor.ts
|
|
3779
3782
|
async function extractKpo(opts) {
|
|
3780
3783
|
const start = Date.now();
|
|
@@ -3784,7 +3787,7 @@ async function extractKpo(opts) {
|
|
|
3784
3787
|
let target = parsed.href;
|
|
3785
3788
|
for (let redirects = 0; redirects < 5; redirects++) {
|
|
3786
3789
|
const res = await fetch(target, {
|
|
3787
|
-
headers: { "User-Agent":
|
|
3790
|
+
headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT },
|
|
3788
3791
|
signal: AbortSignal.timeout(15e3),
|
|
3789
3792
|
redirect: "manual"
|
|
3790
3793
|
});
|
|
@@ -4505,7 +4508,6 @@ var SKIP_PATH_PREFIXES = [
|
|
|
4505
4508
|
];
|
|
4506
4509
|
var SKIP_QUERY_PARAMS = ["replytocom", "p", "preview", "ver", "v"];
|
|
4507
4510
|
var KERNEL_RETRY_LIMIT = 15;
|
|
4508
|
-
var UA = "Mozilla/5.0 (compatible; ThorbitBot/1.0; +https://thorbit.ai)";
|
|
4509
4511
|
var MAX_DISCOVERED_URL_CHARS = 4096;
|
|
4510
4512
|
var MAX_DISCOVERY_FRONTIER_BYTES = 4 * 1024 * 1024;
|
|
4511
4513
|
function boundedDiscoveredUrl(value) {
|
|
@@ -4557,7 +4559,7 @@ async function fetchText(url, auditedHost, timeoutMs = 1e4) {
|
|
|
4557
4559
|
const checked = await validatePublicHttpUrl(target, { field: "sitemap URL" });
|
|
4558
4560
|
if (checked.error || !checked.parsed || !sameAuditedHost(checked.parsed, auditedHost)) return null;
|
|
4559
4561
|
const res = await fetch(checked.parsed.href, {
|
|
4560
|
-
headers: { "User-Agent":
|
|
4562
|
+
headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT },
|
|
4561
4563
|
signal: AbortSignal.timeout(timeoutMs),
|
|
4562
4564
|
redirect: "manual"
|
|
4563
4565
|
});
|
|
@@ -4675,7 +4677,7 @@ async function fetchPage(url, timeoutMs) {
|
|
|
4675
4677
|
const checked = await validatePublicHttpUrl(target, { field: "page URL" });
|
|
4676
4678
|
if (checked.error || !checked.parsed || !sameAuditedHost(checked.parsed, auditedHost)) return { html: null, status: null };
|
|
4677
4679
|
const res = await fetch(checked.parsed.href, {
|
|
4678
|
-
headers: { "User-Agent":
|
|
4680
|
+
headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT, "Accept": "text/html,application/xhtml+xml" },
|
|
4679
4681
|
signal: AbortSignal.timeout(timeoutMs),
|
|
4680
4682
|
redirect: "manual"
|
|
4681
4683
|
});
|
|
@@ -5621,7 +5623,6 @@ function makeSeedSpider(startUrl, urls) {
|
|
|
5621
5623
|
sitemapUrls: []
|
|
5622
5624
|
};
|
|
5623
5625
|
}
|
|
5624
|
-
var UA2 = "Mozilla/5.0 (compatible; ThorbitBot/1.0; +https://thorbit.ai)";
|
|
5625
5626
|
var EXTRACT_CONCURRENCY = 6;
|
|
5626
5627
|
var MAX_PAGE_MARKDOWN = 4e4;
|
|
5627
5628
|
var PAGE_DATA_LIMITS = {
|
|
@@ -5983,7 +5984,7 @@ async function fetchPagePlain(url) {
|
|
|
5983
5984
|
try {
|
|
5984
5985
|
for (let redirects = 0; redirects <= 5; redirects++) {
|
|
5985
5986
|
const res = await fetch(target, {
|
|
5986
|
-
headers: { "User-Agent":
|
|
5987
|
+
headers: { "User-Agent": MCP_SCRAPER_CRAWLER_USER_AGENT, "Accept": "text/html,application/xhtml+xml" },
|
|
5987
5988
|
signal: AbortSignal.timeout(15e3),
|
|
5988
5989
|
redirect: "manual"
|
|
5989
5990
|
});
|
|
@@ -8666,7 +8667,7 @@ var siteExtractFn = inngest.createFunction(
|
|
|
8666
8667
|
});
|
|
8667
8668
|
}) : null;
|
|
8668
8669
|
const finalized = await step.run("finalize", async () => {
|
|
8669
|
-
const { assembleExtractArtifacts } = await import("./extract-bundle-
|
|
8670
|
+
const { assembleExtractArtifacts } = await import("./extract-bundle-U3MNYDKC.js");
|
|
8670
8671
|
const current = await getExtractJob(jobId2);
|
|
8671
8672
|
if (!current) throw new Error("extract job disappeared before finalization");
|
|
8672
8673
|
const stored = await assembleExtractArtifacts(current, { branding, imageAudit });
|
|
@@ -9608,7 +9609,7 @@ async function resolveUsZipsPath(requestedPath) {
|
|
|
9608
9609
|
async function loadZipGroups(stateAbbr, requestedPath, warnings, sourceMode) {
|
|
9609
9610
|
const mode = resolvedLocationDataMode({ zipSource: sourceMode });
|
|
9610
9611
|
if (mode === "hosted") {
|
|
9611
|
-
const { getHostedZipGroups } = await import("./location-data-repository-
|
|
9612
|
+
const { getHostedZipGroups } = await import("./location-data-repository-HDNCU4Z4.js");
|
|
9612
9613
|
const hosted = await getHostedZipGroups(stateAbbr);
|
|
9613
9614
|
if (!hosted.dataset) {
|
|
9614
9615
|
throw new DirectoryLocationError(
|
|
@@ -9671,7 +9672,7 @@ async function resolveDirectoryMarkets(options, config = {}) {
|
|
|
9671
9672
|
const sourceUrl = censusStateUrl(state.fips);
|
|
9672
9673
|
const warnings = [];
|
|
9673
9674
|
if (resolvedLocationDataMode(config) === "hosted") {
|
|
9674
|
-
const { queryHostedLocationMarkets } = await import("./location-data-repository-
|
|
9675
|
+
const { queryHostedLocationMarkets } = await import("./location-data-repository-HDNCU4Z4.js");
|
|
9675
9676
|
const hosted = await queryHostedLocationMarkets({
|
|
9676
9677
|
state: state.abbr,
|
|
9677
9678
|
minPopulation: options.minPopulation,
|
|
@@ -25549,6 +25550,31 @@ var ACCESS_TTL_SECONDS = 3600;
|
|
|
25549
25550
|
var REFRESH_TTL_SECONDS = 60 * 60 * 24 * 30;
|
|
25550
25551
|
var CODE_TTL_SECONDS = 60;
|
|
25551
25552
|
var ROTATION_GRACE_SECONDS = 120;
|
|
25553
|
+
var OAUTH_DATABASE_TIMEOUT_MS = 5e3;
|
|
25554
|
+
var OAuthDatabaseUnavailableError = class extends Error {
|
|
25555
|
+
stage;
|
|
25556
|
+
constructor(stage) {
|
|
25557
|
+
super("The authorization service database is temporarily unavailable.");
|
|
25558
|
+
this.name = "OAuthDatabaseUnavailableError";
|
|
25559
|
+
this.stage = stage;
|
|
25560
|
+
}
|
|
25561
|
+
};
|
|
25562
|
+
async function withOAuthDatabaseDeadline(stage, operation, timeoutMs = OAUTH_DATABASE_TIMEOUT_MS) {
|
|
25563
|
+
const startedAt = Date.now();
|
|
25564
|
+
let timeout;
|
|
25565
|
+
try {
|
|
25566
|
+
const value = await Promise.race([
|
|
25567
|
+
operation,
|
|
25568
|
+
new Promise((_, reject) => {
|
|
25569
|
+
timeout = setTimeout(() => reject(new OAuthDatabaseUnavailableError(stage)), timeoutMs);
|
|
25570
|
+
})
|
|
25571
|
+
]);
|
|
25572
|
+
console.log("[oauth-db] stage=%s status=ok duration_ms=%d", stage, Date.now() - startedAt);
|
|
25573
|
+
return value;
|
|
25574
|
+
} finally {
|
|
25575
|
+
if (timeout) clearTimeout(timeout);
|
|
25576
|
+
}
|
|
25577
|
+
}
|
|
25552
25578
|
var secureCookies = process.env.NODE_ENV === "production" || process.env.VERCEL === "1";
|
|
25553
25579
|
var sessionCookieOptions = {
|
|
25554
25580
|
httpOnly: true,
|
|
@@ -25611,7 +25637,7 @@ async function sessionUser(token4) {
|
|
|
25611
25637
|
if (!token4) return null;
|
|
25612
25638
|
const userId = verifySession(token4);
|
|
25613
25639
|
if (!userId) return null;
|
|
25614
|
-
const user = await getUserById(userId);
|
|
25640
|
+
const user = await withOAuthDatabaseDeadline("session-user", getUserById(userId));
|
|
25615
25641
|
return user ?? null;
|
|
25616
25642
|
}
|
|
25617
25643
|
function escapeHtml(value) {
|
|
@@ -25701,6 +25727,18 @@ function redirectWithError(redirectUri, state, error) {
|
|
|
25701
25727
|
return new Response(null, { status: 302, headers: { Location: u.toString() } });
|
|
25702
25728
|
}
|
|
25703
25729
|
var oauthApp = new Hono23();
|
|
25730
|
+
oauthApp.onError((error, c) => {
|
|
25731
|
+
if (error instanceof OAuthDatabaseUnavailableError) {
|
|
25732
|
+
console.error("[oauth-db] stage=%s status=timeout timeout_ms=%d", error.stage, OAUTH_DATABASE_TIMEOUT_MS);
|
|
25733
|
+
c.header("Retry-After", "5");
|
|
25734
|
+
return c.json({
|
|
25735
|
+
error: "temporarily_unavailable",
|
|
25736
|
+
error_description: "Authorization is temporarily unavailable. Please retry shortly."
|
|
25737
|
+
}, 503);
|
|
25738
|
+
}
|
|
25739
|
+
console.error("[oauth] unhandled error:", error);
|
|
25740
|
+
return c.json({ error: "server_error", error_description: "Authorization could not be completed." }, 500);
|
|
25741
|
+
});
|
|
25704
25742
|
oauthApp.use("*", async (c, next) => {
|
|
25705
25743
|
c.header("Access-Control-Allow-Origin", "*");
|
|
25706
25744
|
c.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
@@ -25783,7 +25821,7 @@ oauthApp.post("/oauth/register", async (c) => {
|
|
|
25783
25821
|
}
|
|
25784
25822
|
const clientName = typeof body.client_name === "string" ? body.client_name : null;
|
|
25785
25823
|
const clientId = `client_${randomBytes2(16).toString("hex")}`;
|
|
25786
|
-
await registerClient(clientId, redirectUris, clientName);
|
|
25824
|
+
await withOAuthDatabaseDeadline("register-client", registerClient(clientId, redirectUris, clientName));
|
|
25787
25825
|
console.log("[oauth-dcr] register OK client_id=%s redirect_uris=%s", clientId, JSON.stringify(redirectUris));
|
|
25788
25826
|
return c.json({
|
|
25789
25827
|
client_id: clientId,
|
|
@@ -25810,7 +25848,7 @@ function parseAuthParams(get) {
|
|
|
25810
25848
|
async function validateAuthRequest(p) {
|
|
25811
25849
|
if (p.response_type !== "code") return { ok: false, status: 400, message: "response_type must be code" };
|
|
25812
25850
|
if (!p.client_id) return { ok: false, status: 400, message: "client_id is required" };
|
|
25813
|
-
const client2 = await getClient(p.client_id);
|
|
25851
|
+
const client2 = await withOAuthDatabaseDeadline("get-client", getClient(p.client_id));
|
|
25814
25852
|
if (!client2) return { ok: false, status: 400, message: "unknown client_id" };
|
|
25815
25853
|
if (!p.redirect_uri || !client2.redirect_uris.includes(p.redirect_uri)) return { ok: false, status: 400, message: "redirect_uri does not match the registered set" };
|
|
25816
25854
|
if (!isAllowedRedirect(p.redirect_uri)) return { ok: false, status: 400, message: "redirect_uri host not allowed" };
|
|
@@ -25843,7 +25881,7 @@ oauthApp.post("/oauth/authorize", async (c) => {
|
|
|
25843
25881
|
if (action === "login") {
|
|
25844
25882
|
const email = (get("email") ?? "").trim().toLowerCase();
|
|
25845
25883
|
const password = get("password") ?? "";
|
|
25846
|
-
const user2 = email ? await getUserByEmail(email) : void 0;
|
|
25884
|
+
const user2 = email ? await withOAuthDatabaseDeadline("login-user", getUserByEmail(email)) : void 0;
|
|
25847
25885
|
const okPw = !!(user2 && user2.password_hash && verifyPassword(password, user2.password_hash));
|
|
25848
25886
|
console.log("[oauth-dcr] LOGIN email=%s found=%s hasHash=%s pwLen=%d ok=%s", email, !!user2, !!(user2 && user2.password_hash), password.length, okPw);
|
|
25849
25887
|
if (!okPw) {
|
|
@@ -25859,7 +25897,7 @@ oauthApp.post("/oauth/authorize", async (c) => {
|
|
|
25859
25897
|
const scope = negotiateScope(p.scope, user, p.resource);
|
|
25860
25898
|
const code = `code_${randomBytes2(32).toString("base64url")}`;
|
|
25861
25899
|
const expiresAt = new Date(Date.now() + CODE_TTL_SECONDS * 1e3).toISOString();
|
|
25862
|
-
await putCode({
|
|
25900
|
+
await withOAuthDatabaseDeadline("put-authorization-code", putCode({
|
|
25863
25901
|
code,
|
|
25864
25902
|
client_id: p.client_id,
|
|
25865
25903
|
redirect_uri: p.redirect_uri,
|
|
@@ -25868,7 +25906,7 @@ oauthApp.post("/oauth/authorize", async (c) => {
|
|
|
25868
25906
|
scope,
|
|
25869
25907
|
resource: p.resource || RESOURCE(),
|
|
25870
25908
|
expires_at: expiresAt
|
|
25871
|
-
});
|
|
25909
|
+
}));
|
|
25872
25910
|
const u = new URL(p.redirect_uri);
|
|
25873
25911
|
u.searchParams.set("code", code);
|
|
25874
25912
|
if (p.state) u.searchParams.set("state", p.state);
|
|
@@ -25898,18 +25936,18 @@ oauthApp.post("/oauth/token", async (c) => {
|
|
|
25898
25936
|
const clientId = get("client_id") ?? "";
|
|
25899
25937
|
const redirectUri = get("redirect_uri") ?? "";
|
|
25900
25938
|
const verifier = get("code_verifier") ?? "";
|
|
25901
|
-
const record = await consumeCode(code);
|
|
25939
|
+
const record = await withOAuthDatabaseDeadline("consume-authorization-code", consumeCode(code));
|
|
25902
25940
|
if (!record) return tokenErrorResponse(c, "invalid_grant", "Authorization code is invalid or already used", 400);
|
|
25903
25941
|
if (new Date(record.expires_at).getTime() < Date.now()) return tokenErrorResponse(c, "invalid_grant", "Authorization code has expired", 400);
|
|
25904
25942
|
if (record.client_id !== clientId) return tokenErrorResponse(c, "invalid_grant", "client_id mismatch", 400);
|
|
25905
25943
|
if (record.redirect_uri !== redirectUri) return tokenErrorResponse(c, "invalid_grant", "redirect_uri mismatch", 400);
|
|
25906
25944
|
if (!pkceMatches(verifier, record.code_challenge)) return tokenErrorResponse(c, "invalid_grant", "PKCE verification failed", 400);
|
|
25907
|
-
const user = await getUserByEmail(record.identity);
|
|
25945
|
+
const user = await withOAuthDatabaseDeadline("token-user", getUserByEmail(record.identity));
|
|
25908
25946
|
const plan = user ? resolvePlan(user) : "free";
|
|
25909
25947
|
const audience = record.resource ?? RESOURCE();
|
|
25910
25948
|
const accessToken = await mintAccessToken(record.identity, record.scope, plan, audience);
|
|
25911
25949
|
const refreshToken = `rt_${randomBytes2(40).toString("base64url")}`;
|
|
25912
|
-
await putRefresh({
|
|
25950
|
+
await withOAuthDatabaseDeadline("put-refresh-token", putRefresh({
|
|
25913
25951
|
refresh_token: refreshToken,
|
|
25914
25952
|
client_id: clientId,
|
|
25915
25953
|
identity: record.identity,
|
|
@@ -25917,15 +25955,15 @@ oauthApp.post("/oauth/token", async (c) => {
|
|
|
25917
25955
|
resource: audience,
|
|
25918
25956
|
expires_at: new Date(Date.now() + REFRESH_TTL_SECONDS * 1e3).toISOString(),
|
|
25919
25957
|
revoked: 0
|
|
25920
|
-
});
|
|
25958
|
+
}));
|
|
25921
25959
|
return c.json({ access_token: accessToken, token_type: "Bearer", expires_in: ACCESS_TTL_SECONDS, refresh_token: refreshToken, scope: record.scope });
|
|
25922
25960
|
}
|
|
25923
25961
|
if (grantType === "refresh_token") {
|
|
25924
25962
|
const refreshToken = get("refresh_token") ?? "";
|
|
25925
25963
|
const clientId = get("client_id") ?? "";
|
|
25926
|
-
const record = await getRefresh(refreshToken);
|
|
25964
|
+
const record = await withOAuthDatabaseDeadline("get-refresh-token", getRefresh(refreshToken));
|
|
25927
25965
|
if (record && record.revoked && record.replaced_by && record.rotated_at && Date.now() - new Date(record.rotated_at).getTime() < ROTATION_GRACE_SECONDS * 1e3 && (!clientId || record.client_id === clientId)) {
|
|
25928
|
-
const graceUser = await getUserByEmail(record.identity);
|
|
25966
|
+
const graceUser = await withOAuthDatabaseDeadline("refresh-grace-user", getUserByEmail(record.identity));
|
|
25929
25967
|
const gracePlan = graceUser ? resolvePlan(graceUser) : "free";
|
|
25930
25968
|
const graceAudience = record.resource ?? RESOURCE();
|
|
25931
25969
|
const graceAccess = await mintAccessToken(record.identity, record.scope, gracePlan, graceAudience);
|
|
@@ -25934,12 +25972,12 @@ oauthApp.post("/oauth/token", async (c) => {
|
|
|
25934
25972
|
if (!record || record.revoked) return tokenErrorResponse(c, "invalid_grant", "Refresh token is invalid or revoked", 400);
|
|
25935
25973
|
if (new Date(record.expires_at).getTime() < Date.now()) return tokenErrorResponse(c, "invalid_grant", "Refresh token has expired", 400);
|
|
25936
25974
|
if (clientId && record.client_id !== clientId) return tokenErrorResponse(c, "invalid_grant", "client_id mismatch", 400);
|
|
25937
|
-
const user = await getUserByEmail(record.identity);
|
|
25975
|
+
const user = await withOAuthDatabaseDeadline("refresh-user", getUserByEmail(record.identity));
|
|
25938
25976
|
const plan = user ? resolvePlan(user) : "free";
|
|
25939
25977
|
const audience = record.resource ?? RESOURCE();
|
|
25940
25978
|
const accessToken = await mintAccessToken(record.identity, record.scope, plan, audience);
|
|
25941
25979
|
const nextRefresh = `rt_${randomBytes2(40).toString("base64url")}`;
|
|
25942
|
-
await rotateRefresh(refreshToken, {
|
|
25980
|
+
await withOAuthDatabaseDeadline("rotate-refresh-token", rotateRefresh(refreshToken, {
|
|
25943
25981
|
refresh_token: nextRefresh,
|
|
25944
25982
|
client_id: record.client_id,
|
|
25945
25983
|
identity: record.identity,
|
|
@@ -25947,7 +25985,7 @@ oauthApp.post("/oauth/token", async (c) => {
|
|
|
25947
25985
|
resource: audience,
|
|
25948
25986
|
expires_at: new Date(Date.now() + REFRESH_TTL_SECONDS * 1e3).toISOString(),
|
|
25949
25987
|
revoked: 0
|
|
25950
|
-
});
|
|
25988
|
+
}));
|
|
25951
25989
|
return c.json({ access_token: accessToken, token_type: "Bearer", expires_in: ACCESS_TTL_SECONDS, refresh_token: nextRefresh, scope: record.scope });
|
|
25952
25990
|
}
|
|
25953
25991
|
return tokenErrorResponse(c, "unsupported_grant_type", "grant_type must be authorization_code or refresh_token", 400);
|
|
@@ -37172,7 +37210,7 @@ app.get("/cron/tick", async (c) => {
|
|
|
37172
37210
|
if (!process.env.CRON_SECRET || secret2 !== `Bearer ${process.env.CRON_SECRET}`) {
|
|
37173
37211
|
return c.json({ error: "Unauthorized" }, 401);
|
|
37174
37212
|
}
|
|
37175
|
-
const { drainQueue } = await import("./worker-
|
|
37213
|
+
const { drainQueue } = await import("./worker-73AYU4IK.js");
|
|
37176
37214
|
const budget = { maxJobs: 10, deadlineMs: Date.now() + 28e4 };
|
|
37177
37215
|
const workflowDispatchResult = await dispatchDueWorkflowSchedules(`${new URL(c.req.url).protocol}//${new URL(c.req.url).host}`);
|
|
37178
37216
|
const [results, sweepResult, reapResult, expiredResult, blobCleanup, connectedDataArtifactCleanup, connectedAccountBilling, directoryWorkflowDispatch, directoryWorkflowReconciliation, directoryArtifactCleanup, siteExtractArtifactCleanup, siteExtractRedispatch, siteExtractReconciliation, paaHarvestRedispatch, paaHarvestReconciliation] = await Promise.all([
|
|
@@ -37225,8 +37263,8 @@ app.post("/api/internal/extract-refinalize/:id", async (c) => {
|
|
|
37225
37263
|
finishExtractJob: finishExtractJob2,
|
|
37226
37264
|
terminalExtractJobStatus: terminalExtractJobStatus2,
|
|
37227
37265
|
extractJobLimitInfo: extractJobLimitInfo2
|
|
37228
|
-
} = await import("./site-extract-repository-
|
|
37229
|
-
const { assembleExtractArtifacts } = await import("./extract-bundle-
|
|
37266
|
+
} = await import("./site-extract-repository-CKCJDP7N.js");
|
|
37267
|
+
const { assembleExtractArtifacts } = await import("./extract-bundle-U3MNYDKC.js");
|
|
37230
37268
|
const existing = await getExtractJob2(jobId2);
|
|
37231
37269
|
if (!existing) return c.json({ error: "job not found" }, 404);
|
|
37232
37270
|
if (existing.status !== "failed") {
|
|
@@ -37253,7 +37291,7 @@ app.post("/api/internal/extract-refinalize/:id", async (c) => {
|
|
|
37253
37291
|
if (!updated) return c.json({ error: "job state changed during re-finalization" }, 409);
|
|
37254
37292
|
let settlement = "already_settled_or_refunded";
|
|
37255
37293
|
if (job.billedMc == null && job.userId != null) {
|
|
37256
|
-
const { settleExtractJob: settleExtractJob3, countSuccessfulPages: countSuccessfulPages2 } = await import("./site-extract-repository-
|
|
37294
|
+
const { settleExtractJob: settleExtractJob3, countSuccessfulPages: countSuccessfulPages2 } = await import("./site-extract-repository-CKCJDP7N.js");
|
|
37257
37295
|
const heldMc = Number(job.options.heldMc ?? 0);
|
|
37258
37296
|
const successful = await countSuccessfulPages2(jobId2);
|
|
37259
37297
|
const usedMc = Math.min(successful * MC_COSTS.page_scrape, heldMc);
|
|
@@ -37432,4 +37470,4 @@ app.get("/blog/:slug/", (c) => {
|
|
|
37432
37470
|
export {
|
|
37433
37471
|
app
|
|
37434
37472
|
};
|
|
37435
|
-
//# sourceMappingURL=server-
|
|
37473
|
+
//# sourceMappingURL=server-ZCX5X3N4.js.map
|