webpeel 0.12.1 → 0.12.2
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/middleware/auth.d.ts +4 -0
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js +31 -0
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/server/routes/activity.d.ts.map +1 -1
- package/dist/server/routes/activity.js +4 -4
- package/dist/server/routes/activity.js.map +1 -1
- package/dist/server/routes/stats.d.ts.map +1 -1
- package/dist/server/routes/stats.js +4 -4
- package/dist/server/routes/stats.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* Philosophy: Never fully block users. When weekly limits are exceeded,
|
|
5
5
|
* degrade to HTTP-only mode instead of returning 429.
|
|
6
6
|
* BURST limits (hourly) are HARD limits and return 429.
|
|
7
|
+
*
|
|
8
|
+
* Dual auth: Accepts both API keys AND JWT session tokens.
|
|
9
|
+
* API keys are validated via the auth store; JWTs are verified with JWT_SECRET.
|
|
10
|
+
* Dashboard pages use JWT tokens; CLI/SDK users use API keys.
|
|
7
11
|
*/
|
|
8
12
|
import { Request, Response, NextFunction } from 'express';
|
|
9
13
|
import { AuthStore, ApiKeyInfo } from '../auth-store.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE;gBACL,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;gBAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,YAAY,GAAG,KAAK,CAAC;gBACxD,SAAS,EAAE,MAAM,CAAC;gBAClB,WAAW,EAAE,OAAO,CAAC;gBACrB,mBAAmB,EAAE,OAAO,CAAC;aAC9B,CAAC;SACH;KACF;CACF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,IACzC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBAiM9D"}
|
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
* Philosophy: Never fully block users. When weekly limits are exceeded,
|
|
5
5
|
* degrade to HTTP-only mode instead of returning 429.
|
|
6
6
|
* BURST limits (hourly) are HARD limits and return 429.
|
|
7
|
+
*
|
|
8
|
+
* Dual auth: Accepts both API keys AND JWT session tokens.
|
|
9
|
+
* API keys are validated via the auth store; JWTs are verified with JWT_SECRET.
|
|
10
|
+
* Dashboard pages use JWT tokens; CLI/SDK users use API keys.
|
|
7
11
|
*/
|
|
12
|
+
import jwt from 'jsonwebtoken';
|
|
8
13
|
import { PostgresAuthStore } from '../pg-auth-store.js';
|
|
9
14
|
export function createAuthMiddleware(authStore) {
|
|
10
15
|
return async (req, res, next) => {
|
|
@@ -57,6 +62,32 @@ export function createAuthMiddleware(authStore) {
|
|
|
57
62
|
if (apiKey) {
|
|
58
63
|
keyInfo = await authStore.validateKey(apiKey);
|
|
59
64
|
if (!keyInfo) {
|
|
65
|
+
// API key not found — try JWT session token as fallback.
|
|
66
|
+
// Dashboard uses JWT tokens (from /v1/auth/login or /v1/auth/oauth),
|
|
67
|
+
// while CLI/SDK users use API keys. Support both seamlessly.
|
|
68
|
+
const jwtSecret = process.env.JWT_SECRET;
|
|
69
|
+
if (jwtSecret) {
|
|
70
|
+
try {
|
|
71
|
+
const payload = jwt.verify(apiKey, jwtSecret);
|
|
72
|
+
if (payload.userId) {
|
|
73
|
+
// Valid JWT — treat as authenticated session user.
|
|
74
|
+
// Set req.auth with null keyInfo (no API key) and attach
|
|
75
|
+
// the JWT payload so routes can use req.user.userId.
|
|
76
|
+
req.auth = {
|
|
77
|
+
keyInfo: null,
|
|
78
|
+
tier: payload.tier || 'free',
|
|
79
|
+
rateLimit: 25,
|
|
80
|
+
softLimited: false,
|
|
81
|
+
extraUsageAvailable: false,
|
|
82
|
+
};
|
|
83
|
+
req.user = payload;
|
|
84
|
+
return next();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Not a valid JWT either — fall through to 401
|
|
89
|
+
}
|
|
90
|
+
}
|
|
60
91
|
res.status(401).json({
|
|
61
92
|
error: 'invalid_key',
|
|
62
93
|
message: 'Invalid or expired API key. Check your key at https://app.webpeel.dev/keys or generate a new one.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/server/routes/activity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/server/routes/activity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAkEjE"}
|
|
@@ -7,15 +7,15 @@ export function createActivityRouter(authStore) {
|
|
|
7
7
|
const router = Router();
|
|
8
8
|
router.get('/v1/activity', async (req, res) => {
|
|
9
9
|
try {
|
|
10
|
-
// Require authentication
|
|
11
|
-
|
|
10
|
+
// Require authentication (API key or JWT session token)
|
|
11
|
+
const userId = req.auth?.keyInfo?.accountId || req.user?.userId;
|
|
12
|
+
if (!userId) {
|
|
12
13
|
res.status(401).json({
|
|
13
14
|
error: 'unauthorized',
|
|
14
|
-
message: '
|
|
15
|
+
message: 'Authentication required',
|
|
15
16
|
});
|
|
16
17
|
return;
|
|
17
18
|
}
|
|
18
|
-
const userId = req.auth.keyInfo.accountId; // accountId maps to user_id in DB
|
|
19
19
|
// Only works with PostgreSQL backend
|
|
20
20
|
if (!(authStore instanceof PostgresAuthStore)) {
|
|
21
21
|
res.status(501).json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/server/routes/activity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/server/routes/activity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,UAAU,oBAAoB,CAAC,SAAoB;IACvD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,wDAAwD;YACxD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,IAAK,GAAW,CAAC,IAAI,EAAE,MAAM,CAAC;YACzE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE,yBAAyB;iBACnC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,qCAAqC;YACrC,IAAI,CAAC,CAAC,SAAS,YAAY,iBAAiB,CAAC,EAAE,CAAC;gBAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,+CAA+C;iBACzD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,0EAA0E;YAC1E,MAAM,OAAO,GAAG,SAAgB,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAe,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvE,sCAAsC;YACtC,MAAM,aAAa,GAAG;;;;;;;;;;;;OAYrB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAExE,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;gBAC9C,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK;gBACrB,MAAM,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gBAC/E,YAAY,EAAE,GAAG,CAAC,kBAAkB,IAAI,CAAC;gBACzC,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,OAAO;gBAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;aAC1B,CAAC,CAAC,CAAC;YAEJ,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACxC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/server/routes/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/server/routes/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAkE9D"}
|
|
@@ -7,15 +7,15 @@ export function createStatsRouter(authStore) {
|
|
|
7
7
|
const router = Router();
|
|
8
8
|
router.get('/v1/stats', async (req, res) => {
|
|
9
9
|
try {
|
|
10
|
-
// Require authentication
|
|
11
|
-
|
|
10
|
+
// Require authentication (API key or JWT session token)
|
|
11
|
+
const userId = req.auth?.keyInfo?.accountId || req.user?.userId;
|
|
12
|
+
if (!userId) {
|
|
12
13
|
res.status(401).json({
|
|
13
14
|
error: 'unauthorized',
|
|
14
|
-
message: '
|
|
15
|
+
message: 'Authentication required',
|
|
15
16
|
});
|
|
16
17
|
return;
|
|
17
18
|
}
|
|
18
|
-
const userId = req.auth.keyInfo.accountId; // accountId maps to user_id in DB
|
|
19
19
|
// Only works with PostgreSQL backend
|
|
20
20
|
if (!(authStore instanceof PostgresAuthStore)) {
|
|
21
21
|
res.status(501).json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/server/routes/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/server/routes/stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,UAAU,iBAAiB,CAAC,SAAoB;IACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,wDAAwD;YACxD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,IAAK,GAAW,CAAC,IAAI,EAAE,MAAM,CAAC;YACzE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,cAAc;oBACrB,OAAO,EAAE,yBAAyB;iBACnC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,qCAAqC;YACrC,IAAI,CAAC,CAAC,SAAS,YAAY,iBAAiB,CAAC,EAAE,CAAC;gBAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,OAAO,EAAE,4CAA4C;iBACtD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,0EAA0E;YAC1E,MAAM,OAAO,GAAG,SAAgB,CAAC;YAEjC,kCAAkC;YAClC,MAAM,UAAU,GAAG;;;;;;;OAOlB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,gCAAgC;gBAChC,GAAG,CAAC,IAAI,CAAC;oBACP,aAAa,EAAE,CAAC;oBAChB,WAAW,EAAE,GAAG;oBAChB,eAAe,EAAE,CAAC;iBACnB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3B,GAAG,CAAC,IAAI,CAAC;gBACP,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC;gBAChD,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG;gBAChD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC;aACpE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "webpeel",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.2",
|
|
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",
|