webpeel 0.20.2 → 0.20.3
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/dist/server/app.d.ts +14 -0
- package/dist/server/app.js +384 -0
- package/dist/server/auth-store.d.ts +27 -0
- package/dist/server/auth-store.js +88 -0
- package/dist/server/email-service.d.ts +21 -0
- package/dist/server/email-service.js +79 -0
- package/dist/server/job-queue.d.ts +100 -0
- package/dist/server/job-queue.js +145 -0
- package/dist/server/logger.d.ts +10 -0
- package/dist/server/logger.js +37 -0
- package/dist/server/middleware/auth.d.ts +28 -0
- package/dist/server/middleware/auth.js +221 -0
- package/dist/server/middleware/rate-limit.d.ts +24 -0
- package/dist/server/middleware/rate-limit.js +167 -0
- package/dist/server/middleware/url-validator.d.ts +15 -0
- package/dist/server/middleware/url-validator.js +186 -0
- package/dist/server/openapi.yaml +6418 -0
- package/dist/server/pg-auth-store.d.ts +132 -0
- package/dist/server/pg-auth-store.js +472 -0
- package/dist/server/pg-job-queue.d.ts +59 -0
- package/dist/server/pg-job-queue.js +375 -0
- package/dist/server/premium/domain-intel.d.ts +16 -0
- package/dist/server/premium/domain-intel.js +133 -0
- package/dist/server/premium/index.d.ts +17 -0
- package/dist/server/premium/index.js +35 -0
- package/dist/server/premium/swr-cache.d.ts +14 -0
- package/dist/server/premium/swr-cache.js +34 -0
- package/dist/server/routes/activity.d.ts +6 -0
- package/dist/server/routes/activity.js +74 -0
- package/dist/server/routes/answer.d.ts +5 -0
- package/dist/server/routes/answer.js +125 -0
- package/dist/server/routes/ask.d.ts +28 -0
- package/dist/server/routes/ask.js +229 -0
- package/dist/server/routes/batch.d.ts +6 -0
- package/dist/server/routes/batch.js +493 -0
- package/dist/server/routes/cli-usage.d.ts +6 -0
- package/dist/server/routes/cli-usage.js +127 -0
- package/dist/server/routes/compat.d.ts +23 -0
- package/dist/server/routes/compat.js +652 -0
- package/dist/server/routes/deep-fetch.d.ts +8 -0
- package/dist/server/routes/deep-fetch.js +57 -0
- package/dist/server/routes/demo.d.ts +24 -0
- package/dist/server/routes/demo.js +517 -0
- package/dist/server/routes/do.d.ts +8 -0
- package/dist/server/routes/do.js +72 -0
- package/dist/server/routes/extract.d.ts +8 -0
- package/dist/server/routes/extract.js +235 -0
- package/dist/server/routes/fetch.d.ts +7 -0
- package/dist/server/routes/fetch.js +999 -0
- package/dist/server/routes/health.d.ts +7 -0
- package/dist/server/routes/health.js +19 -0
- package/dist/server/routes/jobs.d.ts +7 -0
- package/dist/server/routes/jobs.js +573 -0
- package/dist/server/routes/mcp.d.ts +14 -0
- package/dist/server/routes/mcp.js +141 -0
- package/dist/server/routes/oauth.d.ts +9 -0
- package/dist/server/routes/oauth.js +396 -0
- package/dist/server/routes/playground.d.ts +17 -0
- package/dist/server/routes/playground.js +283 -0
- package/dist/server/routes/screenshot.d.ts +22 -0
- package/dist/server/routes/screenshot.js +816 -0
- package/dist/server/routes/search.d.ts +6 -0
- package/dist/server/routes/search.js +303 -0
- package/dist/server/routes/session.d.ts +15 -0
- package/dist/server/routes/session.js +397 -0
- package/dist/server/routes/stats.d.ts +6 -0
- package/dist/server/routes/stats.js +71 -0
- package/dist/server/routes/stripe.d.ts +15 -0
- package/dist/server/routes/stripe.js +294 -0
- package/dist/server/routes/users.d.ts +8 -0
- package/dist/server/routes/users.js +1671 -0
- package/dist/server/routes/watch.d.ts +15 -0
- package/dist/server/routes/watch.js +309 -0
- package/dist/server/routes/webhooks.d.ts +26 -0
- package/dist/server/routes/webhooks.js +170 -0
- package/dist/server/routes/youtube.d.ts +6 -0
- package/dist/server/routes/youtube.js +130 -0
- package/dist/server/sentry.d.ts +13 -0
- package/dist/server/sentry.js +38 -0
- package/dist/server/types.d.ts +15 -0
- package/dist/server/types.js +7 -0
- package/dist/server/utils/response.d.ts +44 -0
- package/dist/server/utils/response.js +69 -0
- package/dist/server/utils/sse.d.ts +22 -0
- package/dist/server/utils/sse.js +38 -0
- package/package.json +2 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional Sentry integration for the API server.
|
|
3
|
+
*
|
|
4
|
+
* Enabled only when SENTRY_DSN is set.
|
|
5
|
+
* This keeps local/self-hosted setups dependency-light by default.
|
|
6
|
+
*/
|
|
7
|
+
import * as Sentry from '@sentry/node';
|
|
8
|
+
function parseSampleRate(value) {
|
|
9
|
+
if (!value)
|
|
10
|
+
return undefined;
|
|
11
|
+
const parsed = Number(value);
|
|
12
|
+
if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
|
|
13
|
+
console.warn(`Ignoring invalid SENTRY_TRACES_SAMPLE_RATE="${value}" (expected 0.0 - 1.0)`);
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return parsed;
|
|
17
|
+
}
|
|
18
|
+
export function createSentryHooks() {
|
|
19
|
+
const dsn = process.env.SENTRY_DSN?.trim();
|
|
20
|
+
if (!dsn) {
|
|
21
|
+
return { enabled: false };
|
|
22
|
+
}
|
|
23
|
+
const environment = process.env.SENTRY_ENVIRONMENT || process.env.NODE_ENV || 'production';
|
|
24
|
+
const tracesSampleRate = parseSampleRate(process.env.SENTRY_TRACES_SAMPLE_RATE);
|
|
25
|
+
Sentry.init({
|
|
26
|
+
dsn,
|
|
27
|
+
enabled: true,
|
|
28
|
+
environment,
|
|
29
|
+
release: process.env.SENTRY_RELEASE,
|
|
30
|
+
tracesSampleRate,
|
|
31
|
+
});
|
|
32
|
+
console.log(`Sentry enabled (environment: ${environment})`);
|
|
33
|
+
return {
|
|
34
|
+
enabled: true,
|
|
35
|
+
requestHandler: Sentry.Handlers.requestHandler(),
|
|
36
|
+
errorHandler: Sentry.Handlers.errorHandler(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side type augmentations for Express Request.
|
|
3
|
+
*
|
|
4
|
+
* Import this file (or the middleware that uses it) to get the augmented
|
|
5
|
+
* Express.Request type in scope throughout the server package.
|
|
6
|
+
*/
|
|
7
|
+
declare global {
|
|
8
|
+
namespace Express {
|
|
9
|
+
interface Request {
|
|
10
|
+
/** UUID v4 generated by the requestId middleware. Present on every request. */
|
|
11
|
+
requestId: string;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response helpers — consistent API envelope formatting.
|
|
3
|
+
*
|
|
4
|
+
* errorResponse — always emits the standard error envelope.
|
|
5
|
+
* successResponse — emits the wrapped success envelope (use only when the
|
|
6
|
+
* client opts-in via ?envelope=true or
|
|
7
|
+
* Accept: application/json+envelope).
|
|
8
|
+
*/
|
|
9
|
+
import type { Response } from 'express';
|
|
10
|
+
/**
|
|
11
|
+
* Send a uniform error response.
|
|
12
|
+
*
|
|
13
|
+
* Shape:
|
|
14
|
+
* ```json
|
|
15
|
+
* {
|
|
16
|
+
* "success": false,
|
|
17
|
+
* "error": { "type", "message", "hint"?, "docs" },
|
|
18
|
+
* "metadata": { "requestId" }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function errorResponse(res: Response, statusCode: number, type: string, message: string, hint?: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Send a success response with the standard data/metadata envelope.
|
|
25
|
+
*
|
|
26
|
+
* Shape:
|
|
27
|
+
* ```json
|
|
28
|
+
* {
|
|
29
|
+
* "success": true,
|
|
30
|
+
* "data": { ...peelResult },
|
|
31
|
+
* "metadata": { "requestId", ...extra }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function successResponse(res: Response, data: any, extra?: Record<string, any>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Return true when the incoming request opts in to the success envelope.
|
|
38
|
+
* Clients signal this via `?envelope=true` or the `Accept` header value
|
|
39
|
+
* `application/json+envelope`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function wantsEnvelope(req: {
|
|
42
|
+
query: Record<string, any>;
|
|
43
|
+
headers: Record<string, any>;
|
|
44
|
+
}): boolean;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response helpers — consistent API envelope formatting.
|
|
3
|
+
*
|
|
4
|
+
* errorResponse — always emits the standard error envelope.
|
|
5
|
+
* successResponse — emits the wrapped success envelope (use only when the
|
|
6
|
+
* client opts-in via ?envelope=true or
|
|
7
|
+
* Accept: application/json+envelope).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Send a uniform error response.
|
|
11
|
+
*
|
|
12
|
+
* Shape:
|
|
13
|
+
* ```json
|
|
14
|
+
* {
|
|
15
|
+
* "success": false,
|
|
16
|
+
* "error": { "type", "message", "hint"?, "docs" },
|
|
17
|
+
* "metadata": { "requestId" }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function errorResponse(res, statusCode, type, message, hint) {
|
|
22
|
+
const requestId = res.req.requestId || 'unknown';
|
|
23
|
+
res.status(statusCode).json({
|
|
24
|
+
success: false,
|
|
25
|
+
error: {
|
|
26
|
+
type,
|
|
27
|
+
message,
|
|
28
|
+
...(hint ? { hint } : {}),
|
|
29
|
+
docs: 'https://webpeel.dev/docs/api-reference#errors',
|
|
30
|
+
},
|
|
31
|
+
metadata: { requestId },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Send a success response with the standard data/metadata envelope.
|
|
36
|
+
*
|
|
37
|
+
* Shape:
|
|
38
|
+
* ```json
|
|
39
|
+
* {
|
|
40
|
+
* "success": true,
|
|
41
|
+
* "data": { ...peelResult },
|
|
42
|
+
* "metadata": { "requestId", ...extra }
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function successResponse(res, data, extra) {
|
|
47
|
+
const requestId = res.req.requestId || 'unknown';
|
|
48
|
+
res.json({
|
|
49
|
+
success: true,
|
|
50
|
+
data,
|
|
51
|
+
metadata: {
|
|
52
|
+
requestId,
|
|
53
|
+
...(extra ?? {}),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Return true when the incoming request opts in to the success envelope.
|
|
59
|
+
* Clients signal this via `?envelope=true` or the `Accept` header value
|
|
60
|
+
* `application/json+envelope`.
|
|
61
|
+
*/
|
|
62
|
+
export function wantsEnvelope(req) {
|
|
63
|
+
if (req.query['envelope'] === 'true')
|
|
64
|
+
return true;
|
|
65
|
+
const accept = req.headers['accept'];
|
|
66
|
+
if (accept && accept.includes('application/json+envelope'))
|
|
67
|
+
return true;
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-Sent Events (SSE) utility helpers.
|
|
3
|
+
*/
|
|
4
|
+
import type { Request, Response } from 'express';
|
|
5
|
+
/**
|
|
6
|
+
* Initialize an SSE response stream.
|
|
7
|
+
* Must be called before any writes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function initSSE(res: Response): void;
|
|
10
|
+
/**
|
|
11
|
+
* Send a named SSE event with JSON-serialised data.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sendSSE(res: Response, event: string, data: unknown): void;
|
|
14
|
+
/**
|
|
15
|
+
* Close an SSE stream.
|
|
16
|
+
*/
|
|
17
|
+
export declare function endSSE(res: Response): void;
|
|
18
|
+
/**
|
|
19
|
+
* Returns true when the request opts-in to SSE streaming via
|
|
20
|
+
* `?stream=true` or `Accept: text/event-stream`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function wantsSSE(req: Request): boolean;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-Sent Events (SSE) utility helpers.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Initialize an SSE response stream.
|
|
6
|
+
* Must be called before any writes.
|
|
7
|
+
*/
|
|
8
|
+
export function initSSE(res) {
|
|
9
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
10
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
11
|
+
res.setHeader('Connection', 'keep-alive');
|
|
12
|
+
res.setHeader('X-Accel-Buffering', 'no'); // nginx compatibility
|
|
13
|
+
res.flushHeaders();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Send a named SSE event with JSON-serialised data.
|
|
17
|
+
*/
|
|
18
|
+
export function sendSSE(res, event, data) {
|
|
19
|
+
res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Close an SSE stream.
|
|
23
|
+
*/
|
|
24
|
+
export function endSSE(res) {
|
|
25
|
+
res.end();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns true when the request opts-in to SSE streaming via
|
|
29
|
+
* `?stream=true` or `Accept: text/event-stream`.
|
|
30
|
+
*/
|
|
31
|
+
export function wantsSSE(req) {
|
|
32
|
+
if (req.query['stream'] === 'true')
|
|
33
|
+
return true;
|
|
34
|
+
const accept = req.headers['accept'];
|
|
35
|
+
if (accept && accept.includes('text/event-stream'))
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webpeel",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.3",
|
|
4
4
|
"description": "Fast web fetcher for AI agents - stealth mode, crawl mode, page actions, structured extraction, PDF parsing, smart escalation from simple HTTP to headless browser",
|
|
5
5
|
"author": "Jake Liu",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"dist/core",
|
|
40
40
|
"dist/integrations",
|
|
41
41
|
"dist/mcp",
|
|
42
|
+
"dist/server",
|
|
42
43
|
"dist/cli/",
|
|
43
44
|
"README.md",
|
|
44
45
|
"LICENSE",
|