@protegoprotect/middleware-next 2.0.0

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/auto.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { createProtegoMiddleware } from './middleware.js';
2
+ import type { ProtegoNextConfig, ProtegoScriptProps } from './types.js';
3
+ export interface ProtegoAutoOptions extends Partial<ProtegoNextConfig> {
4
+ matcher?: string[];
5
+ }
6
+ export declare function createProtego(options?: ProtegoAutoOptions): {
7
+ middleware: ReturnType<typeof createProtegoMiddleware>;
8
+ config: {
9
+ matcher: string[];
10
+ };
11
+ scriptProps: ProtegoScriptProps;
12
+ protegoConfig: ProtegoNextConfig;
13
+ };
14
+ //# sourceMappingURL=auto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.d.ts","sourceRoot":"","sources":["../src/auto.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKxE,MAAM,WAAW,kBAAmB,SAAQ,OAAO,CAAC,iBAAiB,CAAC;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAQD,wBAAgB,aAAa,CAAC,OAAO,GAAE,kBAAuB,GAAG;IAC/D,UAAU,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;IACvD,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9B,WAAW,EAAE,kBAAkB,CAAC;IAChC,aAAa,EAAE,iBAAiB,CAAC;CAClC,CA2CA"}
package/dist/auto.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProtego = createProtego;
4
+ const protocol_1 = require("@protegoprotect/core/protocol");
5
+ const middleware_js_1 = require("./middleware.js");
6
+ const DEFAULT_EXCLUDE_ROUTES = ['/_next', '/favicon.ico', '/robots.txt', '/sitemap.xml'];
7
+ const DEFAULT_MATCHER = ['/((?!_next/static|_next/image|favicon.ico|robots.txt|sitemap.xml).*)'];
8
+ function getRequiredEnv(name, fallback) {
9
+ const value = process.env[name] ?? fallback;
10
+ if (!value)
11
+ throw new Error(`[protego] Missing required environment variable: ${name}`);
12
+ return value;
13
+ }
14
+ function createProtego(options = {}) {
15
+ const attestationUrl = options.attestationUrl
16
+ ?? process.env.NEXT_PUBLIC_PROTEGO_ATTESTATION_URL
17
+ ?? '';
18
+ const audience = options.audience
19
+ ?? process.env.NEXT_PUBLIC_PROTEGO_AUDIENCE
20
+ ?? process.env.PROTEGO_AUDIENCE
21
+ ?? 'protego-site';
22
+ const sensorScriptUrl = options.sensorScriptUrl
23
+ ?? (attestationUrl ? `${attestationUrl.replace(/\/$/, '')}/_protego/sensor.js` : '/_protego/sensor.js');
24
+ const protegoConfig = {
25
+ attestationUrl,
26
+ signingKey: options.signingKey ?? getRequiredEnv('PROTEGO_SIGNING_KEY'),
27
+ audience,
28
+ ipSalt: options.ipSalt ?? getRequiredEnv('PROTEGO_IP_SALT'),
29
+ policies: options.policies ?? [],
30
+ defaultMode: options.defaultMode ?? protocol_1.EnforcementMode.Monitor,
31
+ defaultTrustLevel: options.defaultTrustLevel ?? protocol_1.TrustLevel.Untrusted,
32
+ protectedRoutes: options.protectedRoutes,
33
+ excludeRoutes: options.excludeRoutes ?? DEFAULT_EXCLUDE_ROUTES,
34
+ sensorScriptUrl,
35
+ scriptNonce: options.scriptNonce,
36
+ scriptAsync: options.scriptAsync ?? true,
37
+ scriptDefer: options.scriptDefer ?? false,
38
+ log: options.log,
39
+ };
40
+ return {
41
+ middleware: (0, middleware_js_1.createProtegoMiddleware)(protegoConfig),
42
+ config: { matcher: options.matcher ?? DEFAULT_MATCHER },
43
+ scriptProps: {
44
+ attestationUrl: protegoConfig.attestationUrl,
45
+ audience: protegoConfig.audience,
46
+ sensorScriptUrl: protegoConfig.sensorScriptUrl,
47
+ nonce: protegoConfig.scriptNonce,
48
+ async: protegoConfig.scriptAsync,
49
+ defer: protegoConfig.scriptDefer,
50
+ },
51
+ protegoConfig,
52
+ };
53
+ }
54
+ //# sourceMappingURL=auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.js","sourceRoot":"","sources":["../src/auto.ts"],"names":[],"mappings":";;AAiBA,sCAgDC;AAjED,4DAA4E;AAC5E,mDAA0D;AAG1D,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;AACzF,MAAM,eAAe,GAAG,CAAC,sEAAsE,CAAC,CAAC;AAMjG,SAAS,cAAc,CAAC,IAAY,EAAE,QAAiB;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;IACxF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,aAAa,CAAC,UAA8B,EAAE;IAM5D,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc;WACxC,OAAO,CAAC,GAAG,CAAC,mCAAmC;WAC/C,EAAE,CAAC;IAER,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ;WAC5B,OAAO,CAAC,GAAG,CAAC,4BAA4B;WACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB;WAC5B,cAAc,CAAC;IAEpB,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe;WAC1C,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAE1G,MAAM,aAAa,GAAsB;QACvC,cAAc;QACd,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC,qBAAqB,CAAC;QACvE,QAAQ;QACR,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,iBAAiB,CAAC;QAC3D,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,0BAAe,CAAC,OAAO;QAC3D,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,qBAAU,CAAC,SAAS;QACpE,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,sBAAsB;QAC9D,eAAe;QACf,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,IAAA,uCAAuB,EAAC,aAAa,CAAC;QAClD,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe,EAAE;QACvD,WAAW,EAAE;YACX,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,QAAQ,EAAE,aAAa,CAAC,QAAQ;YAChC,eAAe,EAAE,aAAa,CAAC,eAAe;YAC9C,KAAK,EAAE,aAAa,CAAC,WAAW;YAChC,KAAK,EAAE,aAAa,CAAC,WAAW;YAChC,KAAK,EAAE,aAAa,CAAC,WAAW;SACjC;QACD,aAAa;KACd,CAAC;AACJ,CAAC"}
package/dist/edge.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { shouldSkip, matchPolicy, verifyTokenEdge, evaluateEdgeEnforcement } from './logic.js';
2
+ export type { EdgeEnforcementInput, EdgeEnforcementOutput } from './logic.js';
3
+ export type { ProtegoNextConfig, ProtegoScriptProps, EdgeVerifyResult, } from './types.js';
4
+ //# sourceMappingURL=edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC/F,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/edge.js ADDED
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateEdgeEnforcement = exports.verifyTokenEdge = exports.matchPolicy = exports.shouldSkip = void 0;
4
+ var logic_js_1 = require("./logic.js");
5
+ Object.defineProperty(exports, "shouldSkip", { enumerable: true, get: function () { return logic_js_1.shouldSkip; } });
6
+ Object.defineProperty(exports, "matchPolicy", { enumerable: true, get: function () { return logic_js_1.matchPolicy; } });
7
+ Object.defineProperty(exports, "verifyTokenEdge", { enumerable: true, get: function () { return logic_js_1.verifyTokenEdge; } });
8
+ Object.defineProperty(exports, "evaluateEdgeEnforcement", { enumerable: true, get: function () { return logic_js_1.evaluateEdgeEnforcement; } });
9
+ //# sourceMappingURL=edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":";;;AAAA,uCAA+F;AAAtF,sGAAA,UAAU,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,mHAAA,uBAAuB,OAAA"}
@@ -0,0 +1,24 @@
1
+ import type { SessionStore } from '@protegoprotect/attestation/store';
2
+ import { NextResponse } from 'next/server';
3
+ /**
4
+ * Returns an encrypted NextResponse if the request carries a valid trust token
5
+ * with an active session that has derived keys. Gracefully falls back to plain
6
+ * JSON when no valid token or session exists, so unauthenticated requests still
7
+ * receive a response (the middleware layer should gate access upstream).
8
+ *
9
+ * Usage in a Next.js API route:
10
+ *
11
+ * import { protegoJsonResponse } from '@protegoprotect/middleware-next';
12
+ * import { getProtegoRuntime } from '@/lib/protego';
13
+ *
14
+ * const SIGNING_KEY = Buffer.from(process.env.PROTEGO_SIGNING_KEY!, 'hex');
15
+ *
16
+ * export async function GET(request: NextRequest) {
17
+ * // ... build data ...
18
+ * const trustToken = request.cookies.get('ptg_trust')?.value ?? null;
19
+ * const { store } = getProtegoRuntime();
20
+ * return protegoJsonResponse({ data }, store, SIGNING_KEY, trustToken);
21
+ * }
22
+ */
23
+ export declare function protegoJsonResponse(data: unknown, store: SessionStore, signingKey: Buffer, trustToken: string | null, status?: number): Promise<NextResponse>;
24
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../src/encrypt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,MAAM,SAAM,GACX,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.protegoJsonResponse = protegoJsonResponse;
4
+ const core_1 = require("@protegoprotect/core");
5
+ const server_1 = require("next/server");
6
+ /**
7
+ * Returns an encrypted NextResponse if the request carries a valid trust token
8
+ * with an active session that has derived keys. Gracefully falls back to plain
9
+ * JSON when no valid token or session exists, so unauthenticated requests still
10
+ * receive a response (the middleware layer should gate access upstream).
11
+ *
12
+ * Usage in a Next.js API route:
13
+ *
14
+ * import { protegoJsonResponse } from '@protegoprotect/middleware-next';
15
+ * import { getProtegoRuntime } from '@/lib/protego';
16
+ *
17
+ * const SIGNING_KEY = Buffer.from(process.env.PROTEGO_SIGNING_KEY!, 'hex');
18
+ *
19
+ * export async function GET(request: NextRequest) {
20
+ * // ... build data ...
21
+ * const trustToken = request.cookies.get('ptg_trust')?.value ?? null;
22
+ * const { store } = getProtegoRuntime();
23
+ * return protegoJsonResponse({ data }, store, SIGNING_KEY, trustToken);
24
+ * }
25
+ */
26
+ async function protegoJsonResponse(data, store, signingKey, trustToken, status = 200) {
27
+ // Graceful fallback: no token → plain JSON
28
+ if (!trustToken) {
29
+ return server_1.NextResponse.json(data, { status });
30
+ }
31
+ const claims = (0, core_1.verifyTrustToken)(trustToken, signingKey);
32
+ if (!claims) {
33
+ return server_1.NextResponse.json(data, { status });
34
+ }
35
+ const session = await store.get(claims.sid);
36
+ if (!session?.derivedKeys?.responseEncKey) {
37
+ return server_1.NextResponse.json(data, { status });
38
+ }
39
+ const plaintext = Buffer.from(JSON.stringify(data), 'utf-8');
40
+ // AAD binds the ciphertext to this specific session to prevent cross-session replay
41
+ const aad = `${claims.sid}:response`;
42
+ const encrypted = (0, core_1.encrypt)(session.derivedKeys.responseEncKey, plaintext, aad);
43
+ return server_1.NextResponse.json(encrypted, {
44
+ status,
45
+ headers: {
46
+ 'X-Protego-Encrypted': '1',
47
+ 'Content-Type': 'application/json',
48
+ },
49
+ });
50
+ }
51
+ //# sourceMappingURL=encrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../src/encrypt.ts"],"names":[],"mappings":";;AAwBA,kDAkCC;AA1DD,+CAAiE;AAEjE,wCAA2C;AAE3C;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,mBAAmB,CACvC,IAAa,EACb,KAAmB,EACnB,UAAkB,EAClB,UAAyB,EACzB,MAAM,GAAG,GAAG;IAEZ,2CAA2C;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,qBAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,uBAAgB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,qBAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;QAC1C,OAAO,qBAAY,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,oFAAoF;IACpF,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,WAAW,CAAC;IACrC,MAAM,SAAS,GAAG,IAAA,cAAO,EAAC,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAE9E,OAAO,qBAAY,CAAC,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM;QACN,OAAO,EAAE;YACP,qBAAqB,EAAE,GAAG;YAC1B,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,79 @@
1
+ export interface EncryptedPayload {
2
+ iv: string;
3
+ ciphertext: string;
4
+ tag: string;
5
+ aad: string;
6
+ }
7
+ /**
8
+ * Crypto context for encrypted fetch operations.
9
+ * Typically obtained from ProtegoClient.getSession().
10
+ */
11
+ export interface ProtegoFetchContext {
12
+ sessionId: string;
13
+ trustToken: string | null;
14
+ derivedKeys: {
15
+ responseEncKey: CryptoKey;
16
+ pathSignKey: CryptoKey;
17
+ payloadEncKey: CryptoKey;
18
+ } | null;
19
+ /** Mutable counter for HMAC path rotation. Incremented on each rotated request. */
20
+ pathCounter: number;
21
+ /** ECDSA P-256 key pair for DPoP proof-of-possession signing. */
22
+ dpopKeyPair: {
23
+ publicKey: CryptoKey;
24
+ privateKey: CryptoKey;
25
+ } | null;
26
+ }
27
+ export interface ProtegoFetchOptions {
28
+ /** Attach trust token as Authorization header. Default true. */
29
+ includeTrustToken?: boolean;
30
+ /** Set credentials to 'include'. Default true. */
31
+ includeSessionCookie?: boolean;
32
+ /** Encrypt the request body. Requires derivedKeys. Default false. */
33
+ encryptRequest?: boolean;
34
+ /** Decrypt the response body if server sends encrypted response. Default true when context has keys. */
35
+ decryptResponse?: boolean;
36
+ /** Rotate the path using HMAC. Requires derivedKeys. Default false. */
37
+ rotate?: boolean;
38
+ /** Attach DPoP proof-of-possession header. Requires dpopKeyPair + trustToken. Default false. */
39
+ includeDPoP?: boolean;
40
+ }
41
+ declare function generateNonce(): string;
42
+ declare function signDPoPProof(method: string, url: string, trustToken: string, sessionId: string, signingKey: CryptoKey): Promise<string>;
43
+ declare function encryptPayload(key: CryptoKey, plaintext: BufferSource, aad: string): Promise<EncryptedPayload>;
44
+ declare function decryptPayload(key: CryptoKey, payload: EncryptedPayload): Promise<Uint8Array>;
45
+ declare function generateRotatedPath(key: CryptoKey, endpointId: string, counter: number): Promise<string>;
46
+ declare global {
47
+ interface Window {
48
+ __protego_client?: {
49
+ getTrustToken(): string | null;
50
+ getSession(): {
51
+ sessionId: string;
52
+ derivedKeys: {
53
+ responseEncKey: CryptoKey;
54
+ pathSignKey: CryptoKey;
55
+ payloadEncKey: CryptoKey;
56
+ };
57
+ dpopKeyPair: {
58
+ publicKey: CryptoKey;
59
+ privateKey: CryptoKey;
60
+ };
61
+ } | null;
62
+ };
63
+ /** Resolves when Protego attestation completes (set by init script). */
64
+ __protego_ready?: Promise<void>;
65
+ /** Resolver function for __protego_ready (internal use by init script). */
66
+ __protego_ready_resolve?: () => void;
67
+ }
68
+ }
69
+ /**
70
+ * Authenticated and optionally encrypted fetch.
71
+ * If no explicit context is provided, attempts to get context from window.__protego_client.
72
+ */
73
+ export declare function protegoFetch(input: RequestInfo | URL, init?: RequestInit, options?: ProtegoFetchOptions, context?: ProtegoFetchContext | null): Promise<Response>;
74
+ /**
75
+ * Create a bound fetch function with a fixed base URL and optional crypto context.
76
+ */
77
+ export declare function createProtegoFetch(baseUrl: string, contextOrOptions?: ProtegoFetchContext | ProtegoFetchOptions, defaultOptions?: ProtegoFetchOptions): (path: string, init?: RequestInit, options?: ProtegoFetchOptions) => Promise<Response>;
78
+ export { encryptPayload, decryptPayload, generateRotatedPath, generateNonce, signDPoPProof };
79
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
package/dist/fetch.js ADDED
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.protegoFetch = protegoFetch;
4
+ exports.createProtegoFetch = createProtegoFetch;
5
+ exports.encryptPayload = encryptPayload;
6
+ exports.decryptPayload = decryptPayload;
7
+ exports.generateRotatedPath = generateRotatedPath;
8
+ exports.generateNonce = generateNonce;
9
+ exports.signDPoPProof = signDPoPProof;
10
+ const AES_GCM_IV_BYTES = 12;
11
+ const HMAC_PATH_BYTES = 16;
12
+ const ROTATED_PATH_PREFIX = '/_protego/r/';
13
+ // ─── Encoding Helpers ──────────────────────────────────────────────
14
+ function bufToBase64url(buf) {
15
+ const bytes = new Uint8Array(buf);
16
+ let binary = '';
17
+ for (let i = 0; i < bytes.length; i++) {
18
+ binary += String.fromCharCode(bytes[i]);
19
+ }
20
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
21
+ }
22
+ function base64urlToBuf(b64) {
23
+ const padded = b64.replace(/-/g, '+').replace(/_/g, '/');
24
+ const pad = (4 - (padded.length % 4)) % 4;
25
+ const str = atob(padded + '='.repeat(pad));
26
+ const buf = new Uint8Array(str.length);
27
+ for (let i = 0; i < str.length; i++) {
28
+ buf[i] = str.charCodeAt(i);
29
+ }
30
+ return buf.buffer;
31
+ }
32
+ function generateNonce() {
33
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
34
+ let hex = '';
35
+ for (let i = 0; i < bytes.length; i++) {
36
+ hex += bytes[i].toString(16).padStart(2, '0');
37
+ }
38
+ return hex;
39
+ }
40
+ // ─── Crypto Helpers ────────────────────────────────────────────────
41
+ async function sha256Hex(data) {
42
+ const enc = new TextEncoder();
43
+ const hash = await crypto.subtle.digest('SHA-256', enc.encode(data));
44
+ const bytes = new Uint8Array(hash);
45
+ let hex = '';
46
+ for (let i = 0; i < bytes.length; i++) {
47
+ hex += bytes[i].toString(16).padStart(2, '0');
48
+ }
49
+ return hex;
50
+ }
51
+ function generateDPoPJti() {
52
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
53
+ let hex = '';
54
+ for (let i = 0; i < bytes.length; i++) {
55
+ hex += bytes[i].toString(16).padStart(2, '0');
56
+ }
57
+ return hex;
58
+ }
59
+ async function signDPoPProof(method, url, trustToken, sessionId, signingKey) {
60
+ const ath = await sha256Hex(trustToken);
61
+ const claims = {
62
+ jti: generateDPoPJti(),
63
+ htm: method.toUpperCase(),
64
+ htu: url,
65
+ iat: Math.floor(Date.now() / 1000),
66
+ sid: sessionId,
67
+ ath,
68
+ };
69
+ const payload = btoa(JSON.stringify(claims))
70
+ .replace(/\+/g, '-')
71
+ .replace(/\//g, '_')
72
+ .replace(/=+$/, '');
73
+ const payloadBytes = new TextEncoder().encode(payload);
74
+ const signature = await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, signingKey, payloadBytes);
75
+ return `${payload}.${bufToBase64url(signature)}`;
76
+ }
77
+ async function encryptPayload(key, plaintext, aad) {
78
+ const iv = crypto.getRandomValues(new Uint8Array(AES_GCM_IV_BYTES));
79
+ const enc = new TextEncoder();
80
+ const aadBuf = enc.encode(aad);
81
+ const encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv, additionalData: aadBuf, tagLength: 128 }, key, plaintext);
82
+ const combined = new Uint8Array(encrypted);
83
+ const ciphertextBytes = combined.slice(0, combined.length - 16);
84
+ const tagBytes = combined.slice(combined.length - 16);
85
+ return {
86
+ iv: bufToBase64url(iv.buffer),
87
+ ciphertext: bufToBase64url(ciphertextBytes.buffer),
88
+ tag: bufToBase64url(tagBytes.buffer),
89
+ aad,
90
+ };
91
+ }
92
+ async function decryptPayload(key, payload) {
93
+ const iv = new Uint8Array(base64urlToBuf(payload.iv));
94
+ const ciphertext = new Uint8Array(base64urlToBuf(payload.ciphertext));
95
+ const tag = new Uint8Array(base64urlToBuf(payload.tag));
96
+ const enc = new TextEncoder();
97
+ const aadBuf = enc.encode(payload.aad);
98
+ const combined = new Uint8Array(ciphertext.length + tag.length);
99
+ combined.set(ciphertext, 0);
100
+ combined.set(tag, ciphertext.length);
101
+ const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv, additionalData: aadBuf, tagLength: 128 }, key, combined);
102
+ return new Uint8Array(decrypted);
103
+ }
104
+ async function generateRotatedPath(key, endpointId, counter) {
105
+ const enc = new TextEncoder();
106
+ const data = enc.encode(`${endpointId}:${counter}`);
107
+ const sig = await crypto.subtle.sign('HMAC', key, data);
108
+ const truncated = new Uint8Array(sig).slice(0, HMAC_PATH_BYTES);
109
+ return bufToBase64url(truncated.buffer);
110
+ }
111
+ const PATH_MASK_LABEL = 'protego-path-mask';
112
+ async function encryptPathHeader(key, endpointId) {
113
+ const enc = new TextEncoder();
114
+ const keystream = new Uint8Array(await crypto.subtle.sign('HMAC', key, enc.encode(PATH_MASK_LABEL)));
115
+ const pathBytes = enc.encode(endpointId);
116
+ const masked = new Uint8Array(pathBytes.length);
117
+ for (let i = 0; i < pathBytes.length; i++) {
118
+ masked[i] = pathBytes[i] ^ keystream[i % keystream.length];
119
+ }
120
+ return bufToBase64url(masked.buffer);
121
+ }
122
+ /** Shared context cached after first successful read so all calls share one counter. */
123
+ let cachedContext = null;
124
+ function getContextFromWindow() {
125
+ if (typeof window === 'undefined')
126
+ return null;
127
+ if (cachedContext)
128
+ return cachedContext;
129
+ const client = window.__protego_client;
130
+ if (!client)
131
+ return null;
132
+ const session = client.getSession();
133
+ if (!session)
134
+ return null;
135
+ cachedContext = {
136
+ sessionId: session.sessionId,
137
+ trustToken: client.getTrustToken(),
138
+ derivedKeys: session.derivedKeys,
139
+ pathCounter: 0,
140
+ dpopKeyPair: session.dpopKeyPair ?? null,
141
+ };
142
+ return cachedContext;
143
+ }
144
+ const ATTESTATION_TIMEOUT_MS = 8000;
145
+ const POLL_INTERVAL_MS = 100;
146
+ async function waitForContext() {
147
+ const immediate = getContextFromWindow();
148
+ if (immediate)
149
+ return immediate;
150
+ if (typeof window === 'undefined')
151
+ return null;
152
+ if (window.__protego_ready) {
153
+ try {
154
+ await Promise.race([
155
+ window.__protego_ready,
156
+ new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), ATTESTATION_TIMEOUT_MS)),
157
+ ]);
158
+ }
159
+ catch {
160
+ }
161
+ return getContextFromWindow();
162
+ }
163
+ return new Promise((resolve) => {
164
+ const start = Date.now();
165
+ const timer = setInterval(() => {
166
+ const ctx = getContextFromWindow();
167
+ if (ctx) {
168
+ clearInterval(timer);
169
+ resolve(ctx);
170
+ return;
171
+ }
172
+ if (Date.now() - start >= ATTESTATION_TIMEOUT_MS) {
173
+ clearInterval(timer);
174
+ resolve(null);
175
+ }
176
+ }, POLL_INTERVAL_MS);
177
+ });
178
+ }
179
+ // ─── Core Fetch ────────────────────────────────────────────────────
180
+ /**
181
+ * Authenticated and optionally encrypted fetch.
182
+ * If no explicit context is provided, attempts to get context from window.__protego_client.
183
+ */
184
+ async function protegoFetch(input, init, options, context) {
185
+ const opts = {
186
+ includeTrustToken: true,
187
+ includeSessionCookie: true,
188
+ encryptRequest: false,
189
+ decryptResponse: true,
190
+ rotate: false,
191
+ includeDPoP: false,
192
+ ...options,
193
+ };
194
+ const ctx = context ?? (opts.rotate ? await waitForContext() : getContextFromWindow());
195
+ const headers = new Headers(init?.headers);
196
+ // Attach trust token
197
+ if (opts.includeTrustToken && ctx?.trustToken) {
198
+ headers.set('Authorization', `Protego ${ctx.trustToken}`);
199
+ }
200
+ // Attach session ID
201
+ if (ctx?.sessionId) {
202
+ headers.set('X-Protego-Session', ctx.sessionId);
203
+ }
204
+ let url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
205
+ const originalUrl = url;
206
+ // Path rotation
207
+ if (opts.rotate && ctx?.derivedKeys?.pathSignKey) {
208
+ const urlObj = new URL(url, typeof window !== 'undefined' ? window.location.origin : undefined);
209
+ const endpointId = urlObj.pathname;
210
+ const segment = await generateRotatedPath(ctx.derivedKeys.pathSignKey, endpointId, ctx.pathCounter);
211
+ // Send HMAC of the path instead of the plaintext path — hides real API routes from DevTools
212
+ const pathId = await encryptPathHeader(ctx.derivedKeys.pathSignKey, endpointId);
213
+ headers.set('X-Protego-Path', pathId);
214
+ urlObj.pathname = `${ROTATED_PATH_PREFIX}${segment}`;
215
+ url = urlObj.href;
216
+ ctx.pathCounter++;
217
+ }
218
+ // Build the request init
219
+ let finalBody = init?.body;
220
+ // Request encryption
221
+ if (opts.encryptRequest && ctx?.derivedKeys?.payloadEncKey && init?.body != null) {
222
+ const nonce = generateNonce();
223
+ const timestamp = Math.floor(Date.now() / 1000);
224
+ const aad = `${ctx.sessionId}:${nonce}:${timestamp}`;
225
+ let bodyBuf;
226
+ if (typeof init.body === 'string') {
227
+ bodyBuf = new TextEncoder().encode(init.body).buffer;
228
+ }
229
+ else if (init.body instanceof ArrayBuffer) {
230
+ bodyBuf = init.body;
231
+ }
232
+ else if (init.body instanceof Uint8Array) {
233
+ bodyBuf = init.body.buffer.slice(init.body.byteOffset, init.body.byteOffset + init.body.byteLength);
234
+ }
235
+ else {
236
+ bodyBuf = new TextEncoder().encode(String(init.body)).buffer;
237
+ }
238
+ const encrypted = await encryptPayload(ctx.derivedKeys.payloadEncKey, bodyBuf, aad);
239
+ finalBody = JSON.stringify(encrypted);
240
+ headers.set('Content-Type', 'application/x-protego-encrypted');
241
+ headers.set('X-Protego-Nonce', nonce);
242
+ headers.set('X-Protego-Timestamp', String(timestamp));
243
+ }
244
+ // DPoP proof-of-possession
245
+ if (opts.includeDPoP && ctx?.dpopKeyPair?.privateKey && ctx.trustToken && ctx.sessionId) {
246
+ const method = init?.method?.toUpperCase() ?? 'GET';
247
+ const dpopProof = await signDPoPProof(method, url, ctx.trustToken, ctx.sessionId, ctx.dpopKeyPair.privateKey);
248
+ headers.set('X-Protego-DPoP', dpopProof);
249
+ }
250
+ const response = await fetch(url, {
251
+ ...init,
252
+ body: finalBody,
253
+ headers,
254
+ credentials: init?.credentials ?? 'include',
255
+ });
256
+ // If a rotated request failed, retry with the original unrotated URL.
257
+ if (opts.rotate && !response.ok && originalUrl !== url) {
258
+ const fallbackHeaders = new Headers(init?.headers);
259
+ if (ctx?.trustToken) {
260
+ fallbackHeaders.set('Authorization', `Protego ${ctx.trustToken}`);
261
+ }
262
+ if (ctx?.sessionId) {
263
+ fallbackHeaders.set('X-Protego-Session', ctx.sessionId);
264
+ }
265
+ return fetch(originalUrl, {
266
+ ...init,
267
+ headers: fallbackHeaders,
268
+ credentials: init?.credentials ?? 'include',
269
+ });
270
+ }
271
+ // Response decryption
272
+ if (opts.decryptResponse && ctx?.derivedKeys?.responseEncKey) {
273
+ const isEncrypted = response.headers.get('X-Protego-Encrypted') === '1' ||
274
+ response.headers.get('Content-Type')?.includes('application/x-protego-encrypted');
275
+ if (isEncrypted) {
276
+ const encBody = (await response.json());
277
+ if (!encBody.iv || !encBody.ciphertext || !encBody.tag || !encBody.aad) {
278
+ throw new Error('Protego: invalid encrypted response payload');
279
+ }
280
+ const decrypted = await decryptPayload(ctx.derivedKeys.responseEncKey, encBody);
281
+ const decryptedText = new TextDecoder().decode(decrypted);
282
+ return new Response(decryptedText, {
283
+ status: response.status,
284
+ statusText: response.statusText,
285
+ headers: new Headers({
286
+ 'Content-Type': 'application/json',
287
+ }),
288
+ });
289
+ }
290
+ }
291
+ return response;
292
+ }
293
+ /**
294
+ * Create a bound fetch function with a fixed base URL and optional crypto context.
295
+ */
296
+ function createProtegoFetch(baseUrl, contextOrOptions, defaultOptions) {
297
+ // Determine if second arg is context or options
298
+ let fixedContext;
299
+ let fixedOpts;
300
+ if (contextOrOptions && 'sessionId' in contextOrOptions) {
301
+ fixedContext = contextOrOptions;
302
+ fixedOpts = defaultOptions;
303
+ }
304
+ else {
305
+ fixedOpts = contextOrOptions;
306
+ }
307
+ const normalizedBase = baseUrl.replace(/\/$/, '');
308
+ return function boundProtegoFetch(path, init, options) {
309
+ const url = path.startsWith('http') ? path : `${normalizedBase}${path}`;
310
+ return protegoFetch(url, init, { ...fixedOpts, ...options }, fixedContext ?? null);
311
+ };
312
+ }
313
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { ProtegoScript } from './script.js';
2
+ export { createProtegoMiddleware } from './middleware.js';
3
+ export { createProtego, type ProtegoAutoOptions } from './auto.js';
4
+ export { protegoFetch, createProtegoFetch, encryptPayload, decryptPayload, generateRotatedPath, generateNonce, signDPoPProof, type ProtegoFetchOptions, type ProtegoFetchContext, type EncryptedPayload, } from './fetch.js';
5
+ export { shouldSkip, matchPolicy, verifyTokenEdge, evaluateEdgeEnforcement } from './logic.js';
6
+ export { protegoJsonResponse } from './encrypt.js';
7
+ export type { ProtegoNextConfig, ProtegoScriptProps, EdgeVerifyResult, } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.protegoJsonResponse = exports.evaluateEdgeEnforcement = exports.verifyTokenEdge = exports.matchPolicy = exports.shouldSkip = exports.signDPoPProof = exports.generateNonce = exports.generateRotatedPath = exports.decryptPayload = exports.encryptPayload = exports.createProtegoFetch = exports.protegoFetch = exports.createProtego = exports.createProtegoMiddleware = exports.ProtegoScript = void 0;
4
+ var script_js_1 = require("./script.js");
5
+ Object.defineProperty(exports, "ProtegoScript", { enumerable: true, get: function () { return script_js_1.ProtegoScript; } });
6
+ var middleware_js_1 = require("./middleware.js");
7
+ Object.defineProperty(exports, "createProtegoMiddleware", { enumerable: true, get: function () { return middleware_js_1.createProtegoMiddleware; } });
8
+ var auto_js_1 = require("./auto.js");
9
+ Object.defineProperty(exports, "createProtego", { enumerable: true, get: function () { return auto_js_1.createProtego; } });
10
+ var fetch_js_1 = require("./fetch.js");
11
+ Object.defineProperty(exports, "protegoFetch", { enumerable: true, get: function () { return fetch_js_1.protegoFetch; } });
12
+ Object.defineProperty(exports, "createProtegoFetch", { enumerable: true, get: function () { return fetch_js_1.createProtegoFetch; } });
13
+ Object.defineProperty(exports, "encryptPayload", { enumerable: true, get: function () { return fetch_js_1.encryptPayload; } });
14
+ Object.defineProperty(exports, "decryptPayload", { enumerable: true, get: function () { return fetch_js_1.decryptPayload; } });
15
+ Object.defineProperty(exports, "generateRotatedPath", { enumerable: true, get: function () { return fetch_js_1.generateRotatedPath; } });
16
+ Object.defineProperty(exports, "generateNonce", { enumerable: true, get: function () { return fetch_js_1.generateNonce; } });
17
+ Object.defineProperty(exports, "signDPoPProof", { enumerable: true, get: function () { return fetch_js_1.signDPoPProof; } });
18
+ var logic_js_1 = require("./logic.js");
19
+ Object.defineProperty(exports, "shouldSkip", { enumerable: true, get: function () { return logic_js_1.shouldSkip; } });
20
+ Object.defineProperty(exports, "matchPolicy", { enumerable: true, get: function () { return logic_js_1.matchPolicy; } });
21
+ Object.defineProperty(exports, "verifyTokenEdge", { enumerable: true, get: function () { return logic_js_1.verifyTokenEdge; } });
22
+ Object.defineProperty(exports, "evaluateEdgeEnforcement", { enumerable: true, get: function () { return logic_js_1.evaluateEdgeEnforcement; } });
23
+ var encrypt_js_1 = require("./encrypt.js");
24
+ Object.defineProperty(exports, "protegoJsonResponse", { enumerable: true, get: function () { return encrypt_js_1.protegoJsonResponse; } });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA4C;AAAnC,0GAAA,aAAa,OAAA;AACtB,iDAA0D;AAAjD,wHAAA,uBAAuB,OAAA;AAChC,qCAAmE;AAA1D,wGAAA,aAAa,OAAA;AACtB,uCAWoB;AAVlB,wGAAA,YAAY,OAAA;AACZ,8GAAA,kBAAkB,OAAA;AAClB,0GAAA,cAAc,OAAA;AACd,0GAAA,cAAc,OAAA;AACd,+GAAA,mBAAmB,OAAA;AACnB,yGAAA,aAAa,OAAA;AACb,yGAAA,aAAa,OAAA;AAKf,uCAA+F;AAAtF,sGAAA,UAAU,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,mHAAA,uBAAuB,OAAA;AAC1E,2CAAmD;AAA1C,iHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,28 @@
1
+ import { EnforcementMode, type EnforcementPolicy, type TrustLevel } from '@protegoprotect/core/protocol';
2
+ import type { ProtegoNextConfig, EdgeVerifyResult } from './types.js';
3
+ export declare function matchPolicy(policies: EnforcementPolicy[], path: string): EnforcementPolicy | null;
4
+ export declare function shouldSkip(pathname: string, config: Pick<ProtegoNextConfig, 'excludeRoutes' | 'protectedRoutes'>): boolean;
5
+ export declare function verifyTokenEdge(token: string): {
6
+ valid: boolean;
7
+ claims: Record<string, unknown> | null;
8
+ };
9
+ export declare function buildVerifyResult(trusted: boolean, mode: EnforcementMode, sessionId: string | null, trustLevel: TrustLevel | null, errorCode: string | null): EdgeVerifyResult;
10
+ export interface EdgeEnforcementInput {
11
+ pathname: string;
12
+ trustToken: string | null;
13
+ dpopHeader: string | null;
14
+ config: ProtegoNextConfig;
15
+ }
16
+ export interface EdgeEnforcementOutput {
17
+ action: 'skip' | 'allow' | 'block';
18
+ result?: EdgeVerifyResult;
19
+ responseBody?: {
20
+ error: string;
21
+ code: string;
22
+ };
23
+ responseStatus?: number;
24
+ sessionId?: string | null;
25
+ trustLevel?: TrustLevel | null;
26
+ }
27
+ export declare function evaluateEdgeEnforcement(input: EdgeEnforcementInput): EdgeEnforcementOutput;
28
+ //# sourceMappingURL=logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.d.ts","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,+BAA+B,CAAC;AACnH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKtE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CASjG;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,eAAe,GAAG,iBAAiB,CAAC,GAAG,OAAO,CAwB1H;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,CAmBzG;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,UAAU,EAAE,UAAU,GAAG,IAAI,EAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,gBAAgB,CAElB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACnC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CA+E1F"}
package/dist/logic.js ADDED
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.matchPolicy = matchPolicy;
4
+ exports.shouldSkip = shouldSkip;
5
+ exports.verifyTokenEdge = verifyTokenEdge;
6
+ exports.buildVerifyResult = buildVerifyResult;
7
+ exports.evaluateEdgeEnforcement = evaluateEdgeEnforcement;
8
+ const protocol_1 = require("@protegoprotect/core/protocol");
9
+ const STATIC_EXTENSIONS = /\.(ico|png|jpg|jpeg|gif|svg|webp|avif|css|js|map|woff|woff2|ttf|eot|json|txt|xml|webmanifest)$/;
10
+ const NEXT_INTERNALS = /^\/_next\//;
11
+ function matchPolicy(policies, path) {
12
+ for (const policy of policies) {
13
+ if (typeof policy.path === 'string') {
14
+ if (path === policy.path || path.startsWith(policy.path + '/'))
15
+ return policy;
16
+ }
17
+ else if (policy.path instanceof RegExp) {
18
+ if (policy.path.test(path))
19
+ return policy;
20
+ }
21
+ }
22
+ return null;
23
+ }
24
+ function shouldSkip(pathname, config) {
25
+ if (STATIC_EXTENSIONS.test(pathname))
26
+ return true;
27
+ if (NEXT_INTERNALS.test(pathname))
28
+ return true;
29
+ if (pathname === protocol_1.Protocol.PATH_HANDSHAKE || pathname === protocol_1.Protocol.PATH_ATTEST)
30
+ return true;
31
+ if (config.excludeRoutes) {
32
+ for (const pattern of config.excludeRoutes) {
33
+ if (pathname === pattern || pathname.startsWith(pattern + '/'))
34
+ return true;
35
+ }
36
+ }
37
+ if (config.protectedRoutes && config.protectedRoutes.length > 0) {
38
+ let matched = false;
39
+ for (const pattern of config.protectedRoutes) {
40
+ if (pathname === pattern || pathname.startsWith(pattern + '/')) {
41
+ matched = true;
42
+ break;
43
+ }
44
+ }
45
+ if (!matched)
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ // Token format: base64url(JSON).base64url(HMAC-SHA256)
51
+ // Edge runtime does structural + expiry check synchronously.
52
+ // Full HMAC verification happens in the backend (defense-in-depth).
53
+ function verifyTokenEdge(token) {
54
+ const dotIndex = token.indexOf('.');
55
+ if (dotIndex === -1)
56
+ return { valid: false, claims: null };
57
+ const payloadB64 = token.substring(0, dotIndex);
58
+ try {
59
+ const payloadJson = Buffer.from(payloadB64, 'base64url').toString('utf-8');
60
+ const claims = JSON.parse(payloadJson);
61
+ const now = Math.floor(Date.now() / 1000);
62
+ if (typeof claims['exp'] === 'number' && claims['exp'] < now) {
63
+ return { valid: false, claims };
64
+ }
65
+ return { valid: true, claims };
66
+ }
67
+ catch {
68
+ return { valid: false, claims: null };
69
+ }
70
+ }
71
+ function buildVerifyResult(trusted, mode, sessionId, trustLevel, errorCode) {
72
+ return { trusted, mode, sessionId, trustLevel, errorCode };
73
+ }
74
+ function evaluateEdgeEnforcement(input) {
75
+ const { pathname, trustToken, config } = input;
76
+ if (shouldSkip(pathname, config)) {
77
+ return { action: 'skip' };
78
+ }
79
+ const policy = matchPolicy(config.policies, pathname);
80
+ const mode = policy?.mode ?? config.defaultMode;
81
+ const requiredLevel = policy?.requiredTrustLevel ?? config.defaultTrustLevel;
82
+ if (!trustToken) {
83
+ if (mode === protocol_1.EnforcementMode.Hard) {
84
+ return {
85
+ action: 'block',
86
+ result: buildVerifyResult(false, mode, null, null, 'PTG_NO_TOKEN'),
87
+ responseBody: { error: 'Trust token required', code: 'PTG_NO_TOKEN' },
88
+ responseStatus: 401,
89
+ };
90
+ }
91
+ return { action: 'allow' };
92
+ }
93
+ const { valid, claims } = verifyTokenEdge(trustToken);
94
+ if (!valid) {
95
+ if (mode === protocol_1.EnforcementMode.Hard) {
96
+ return {
97
+ action: 'block',
98
+ result: buildVerifyResult(false, mode, null, null, 'PTG_TOKEN_INVALID'),
99
+ responseBody: { error: 'Invalid trust token', code: 'PTG_TOKEN_INVALID' },
100
+ responseStatus: 403,
101
+ };
102
+ }
103
+ return { action: 'allow' };
104
+ }
105
+ const sessionId = claims?.['sid'] ?? null;
106
+ const trustLevel = claims?.['lvl'] ?? null;
107
+ const tokenAudience = claims?.['aud'];
108
+ if (tokenAudience && tokenAudience !== config.audience) {
109
+ if (mode === protocol_1.EnforcementMode.Hard) {
110
+ return {
111
+ action: 'block',
112
+ result: buildVerifyResult(false, mode, sessionId, trustLevel, 'PTG_TOKEN_INVALID'),
113
+ responseBody: { error: 'Audience mismatch', code: 'PTG_TOKEN_INVALID' },
114
+ responseStatus: 403,
115
+ };
116
+ }
117
+ return { action: 'allow' };
118
+ }
119
+ if (trustLevel !== null && trustLevel < requiredLevel) {
120
+ if (mode === protocol_1.EnforcementMode.Hard) {
121
+ return {
122
+ action: 'block',
123
+ result: buildVerifyResult(false, mode, sessionId, trustLevel, 'PTG_TOKEN_INVALID'),
124
+ responseBody: { error: 'Insufficient trust level', code: 'PTG_TOKEN_INVALID' },
125
+ responseStatus: 403,
126
+ };
127
+ }
128
+ return { action: 'allow' };
129
+ }
130
+ const requireDPoP = policy?.requireDPoP ?? false;
131
+ if (requireDPoP && !input.dpopHeader) {
132
+ if (mode === protocol_1.EnforcementMode.Hard) {
133
+ return {
134
+ action: 'block',
135
+ result: buildVerifyResult(false, mode, sessionId, trustLevel, 'PTG_DPOP_INVALID'),
136
+ responseBody: { error: 'DPoP proof required', code: 'PTG_DPOP_INVALID' },
137
+ responseStatus: 403,
138
+ };
139
+ }
140
+ return { action: 'allow' };
141
+ }
142
+ return { action: 'allow', sessionId, trustLevel };
143
+ }
144
+ //# sourceMappingURL=logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logic.js","sourceRoot":"","sources":["../src/logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { NextResponse, type NextRequest } from 'next/server';
2
+ import type { ProtegoNextConfig } from './types.js';
3
+ export declare function createProtegoMiddleware(config: ProtegoNextConfig): (request: NextRequest) => NextResponse | undefined;
4
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,IAG7B,SAAS,WAAW,KAAG,YAAY,GAAG,SAAS,CAgClF"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProtegoMiddleware = createProtegoMiddleware;
4
+ const server_1 = require("next/server");
5
+ const protocol_1 = require("@protegoprotect/core/protocol");
6
+ const logic_js_1 = require("./logic.js");
7
+ function defaultLog(level, message, _meta) {
8
+ if (level === 'error')
9
+ console.error(`[protego-edge] ${message}`);
10
+ else if (level === 'warn')
11
+ console.warn(`[protego-edge] ${message}`);
12
+ }
13
+ function createProtegoMiddleware(config) {
14
+ const log = config.log ?? defaultLog;
15
+ return function protegoMiddleware(request) {
16
+ const pathname = request.nextUrl.pathname;
17
+ const trustToken = request.cookies.get(protocol_1.Protocol.COOKIE_TRUST)?.value ?? null;
18
+ const dpopHeader = request.headers.get('X-Protego-DPoP') ?? null;
19
+ const result = (0, logic_js_1.evaluateEdgeEnforcement)({ pathname, trustToken, dpopHeader, config });
20
+ if (result.action === 'skip') {
21
+ return undefined;
22
+ }
23
+ if (result.action === 'block') {
24
+ log('warn', `Blocked: ${pathname} — ${result.responseBody?.code ?? 'unknown'}`);
25
+ const response = server_1.NextResponse.json(result.responseBody, { status: result.responseStatus ?? 403 });
26
+ if (result.result) {
27
+ response.headers.set('X-Protego-Result', JSON.stringify(result.result));
28
+ }
29
+ return response;
30
+ }
31
+ if (result.sessionId) {
32
+ const response = server_1.NextResponse.next();
33
+ response.headers.set('X-Protego-Session', result.sessionId);
34
+ response.headers.set('X-Protego-Trust-Level', String(result.trustLevel ?? ''));
35
+ return response;
36
+ }
37
+ return undefined;
38
+ };
39
+ }
40
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":";;AAUA,0DAmCC;AA7CD,wCAA6D;AAC7D,4DAAyD;AAEzD,yCAAqD;AAErD,SAAS,UAAU,CAAC,KAAgC,EAAE,OAAe,EAAE,KAA+B;IACpG,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;SAC7D,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAyB;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC;IAErC,OAAO,SAAS,iBAAiB,CAAC,OAAoB;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;QAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;QAEjE,MAAM,MAAM,GAAG,IAAA,kCAAuB,EAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAErF,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,GAAG,CAAC,MAAM,EAAE,YAAY,QAAQ,MAAM,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,qBAAY,CAAC,IAAI,CAChC,MAAM,CAAC,YAAY,EACnB,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,IAAI,GAAG,EAAE,CACzC,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,qBAAY,CAAC,IAAI,EAAE,CAAC;YACrC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { ProtegoScriptProps } from './types.js';
3
+ export declare function ProtegoScript(props: ProtegoScriptProps): React.JSX.Element;
4
+ //# sourceMappingURL=script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../src/script.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyD1E"}
package/dist/script.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ProtegoScript = ProtegoScript;
7
+ const react_1 = __importDefault(require("react"));
8
+ function ProtegoScript(props) {
9
+ const { attestationUrl, audience, sensorScriptUrl, nonce, async: asyncLoad = true, defer: deferLoad = false, behaviorDelayMs = 2000, autoRefresh = true, } = props;
10
+ const configJson = JSON.stringify({
11
+ baseUrl: attestationUrl,
12
+ audience,
13
+ behaviorDelayMs,
14
+ autoRefresh,
15
+ });
16
+ const initScript = `
17
+ (function(){
18
+ if(window.__protego_init) return;
19
+ window.__protego_init = true;
20
+ window.__protego_ready = new Promise(function(resolve){ window.__protego_ready_resolve = resolve; });
21
+ var s = document.createElement('script');
22
+ s.src = ${JSON.stringify(sensorScriptUrl)};
23
+ s.onload = function(){
24
+ var P = (window.Protego && window.Protego.ProtegoClient) || (window.__protego_sensor && window.__protego_sensor.ProtegoClient);
25
+ if(P){
26
+ var c = new P(${configJson});
27
+ window.__protego_client = c;
28
+ c.attest().then(function(session){
29
+ if(session && session.trustToken){
30
+ document.cookie = 'ptg_trust=' + session.trustToken + '; path=/; SameSite=Lax; max-age=1800';
31
+ }
32
+ if(window.__protego_sensor && window.__protego_sensor.startDevToolsProtection){
33
+ window.__protego_sensor.startDevToolsProtection();
34
+ } else if(window.Protego && window.Protego.startDevToolsProtection){
35
+ window.Protego.startDevToolsProtection();
36
+ }
37
+ }).catch(function(e){ console.warn('[protego] attestation failed:', e); })
38
+ .finally(function(){ if(window.__protego_ready_resolve) window.__protego_ready_resolve(); });
39
+ } else {
40
+ if(window.__protego_ready_resolve) window.__protego_ready_resolve();
41
+ }
42
+ };
43
+ s.onerror = function(){ if(window.__protego_ready_resolve) window.__protego_ready_resolve(); };
44
+ document.head.appendChild(s);
45
+ })();
46
+ `.trim();
47
+ return react_1.default.createElement('script', {
48
+ dangerouslySetInnerHTML: { __html: initScript },
49
+ nonce: nonce ?? undefined,
50
+ async: asyncLoad || undefined,
51
+ defer: deferLoad || undefined,
52
+ });
53
+ }
54
+ //# sourceMappingURL=script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../src/script.tsx"],"names":[],"mappings":";;;;;AAGA,sCAyDC;AA5DD,kDAA0B;AAG1B,SAAgB,aAAa,CAAC,KAAyB;IACrD,MAAM,EACJ,cAAc,EACd,QAAQ,EACR,eAAe,EACf,KAAK,EACL,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,KAAK,EAAE,SAAS,GAAG,KAAK,EACxB,eAAe,GAAG,IAAI,EACtB,WAAW,GAAG,IAAI,GACnB,GAAG,KAAK,CAAC;IAEV,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,OAAO,EAAE,cAAc;QACvB,QAAQ;QACR,eAAe;QACf,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG;;;;;;YAMT,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;;sBAIrB,UAAU;;;;;;;;;;;;;;;;;;;;CAoB/B,CAAC,IAAI,EAAE,CAAC;IAEP,OAAO,eAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;QACnC,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;QAC/C,KAAK,EAAE,KAAK,IAAI,SAAS;QACzB,KAAK,EAAE,SAAS,IAAI,SAAS;QAC7B,KAAK,EAAE,SAAS,IAAI,SAAS;KAC9B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,71 @@
1
+ import type { EnforcementMode, EnforcementPolicy, TrustLevel } from '@protegoprotect/core/protocol';
2
+ /**
3
+ * Configuration for the Protego Next.js middleware.
4
+ */
5
+ export interface ProtegoNextConfig {
6
+ /** URL of the attestation server (e.g. "https://api.example.com" or same-origin ""). */
7
+ attestationUrl: string;
8
+ /** HMAC-SHA256 signing key for trust token verification (hex or Buffer). Used in edge middleware. */
9
+ signingKey: string | Buffer;
10
+ /** Audience identifier for this project (e.g. "seatlabs"). */
11
+ audience: string;
12
+ /** Salt for IP hashing (same as attestation server). */
13
+ ipSalt: string;
14
+ /** Enforcement policies per-route. Evaluated in order, first match wins. */
15
+ policies: EnforcementPolicy[];
16
+ /** Default enforcement mode when no policy matches. */
17
+ defaultMode: EnforcementMode;
18
+ /** Default required trust level when no policy matches. */
19
+ defaultTrustLevel: TrustLevel;
20
+ /** Route patterns to protect with edge middleware. Default: all routes. */
21
+ protectedRoutes?: string[];
22
+ /** Route patterns to exclude from middleware (e.g. static assets). */
23
+ excludeRoutes?: string[];
24
+ /** URL path to the sensor SDK script (hosted or bundled). */
25
+ sensorScriptUrl: string;
26
+ /** Optional nonce for CSP compliance. */
27
+ scriptNonce?: string;
28
+ /** Whether to load the sensor script with async attribute. Default: true. */
29
+ scriptAsync?: boolean;
30
+ /** Whether to load the sensor script with defer attribute. Default: false. */
31
+ scriptDefer?: boolean;
32
+ /** Custom logging function for edge middleware. */
33
+ log?: (level: 'info' | 'warn' | 'error', message: string, meta?: Record<string, unknown>) => void;
34
+ }
35
+ /**
36
+ * Configuration for the ProtegoScript React component.
37
+ */
38
+ export interface ProtegoScriptProps {
39
+ /** URL of the attestation server. */
40
+ attestationUrl: string;
41
+ /** Audience identifier for this project. */
42
+ audience: string;
43
+ /** URL path to the sensor SDK script. */
44
+ sensorScriptUrl: string;
45
+ /** Optional nonce for CSP compliance. */
46
+ nonce?: string;
47
+ /** Whether to load async. Default: true. */
48
+ async?: boolean;
49
+ /** Whether to load deferred. Default: false. */
50
+ defer?: boolean;
51
+ /** Minimum milliseconds for behavior collection before attesting. Default: 2000. */
52
+ behaviorDelayMs?: number;
53
+ /** Whether to auto-refresh trust tokens. Default: true. */
54
+ autoRefresh?: boolean;
55
+ }
56
+ /**
57
+ * Result of the edge middleware trust verification.
58
+ */
59
+ export interface EdgeVerifyResult {
60
+ /** Whether the request passed enforcement. */
61
+ trusted: boolean;
62
+ /** The enforcement mode applied. */
63
+ mode: EnforcementMode;
64
+ /** Session ID from the trust token (null if no valid token). */
65
+ sessionId: string | null;
66
+ /** Trust level from the token (null if no valid token). */
67
+ trustLevel: TrustLevel | null;
68
+ /** Error code if verification failed. */
69
+ errorCode: string | null;
70
+ }
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEpG;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IAEvB,qGAAqG;IACrG,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IAEjB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IAEf,4EAA4E;IAC5E,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAE9B,uDAAuD;IACvD,WAAW,EAAE,eAAe,CAAC;IAE7B,2DAA2D;IAC3D,iBAAiB,EAAE,UAAU,CAAC;IAE9B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IAExB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,mDAAmD;IACnD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACnG;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IAEvB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IAEjB,yCAAyC;IACzC,eAAe,EAAE,MAAM,CAAC;IAExB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IAEjB,oCAAoC;IACpC,IAAI,EAAE,eAAe,CAAC;IAEtB,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,2DAA2D;IAC3D,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAE9B,yCAAyC;IACzC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@protegoprotect/middleware-next",
3
+ "version": "2.0.0",
4
+ "description": "Protego Next.js middleware — script injection, trust enforcement, protegoFetch",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./script": {
13
+ "types": "./dist/script.d.ts",
14
+ "default": "./dist/script.js"
15
+ },
16
+ "./middleware": {
17
+ "types": "./dist/middleware.d.ts",
18
+ "default": "./dist/middleware.js"
19
+ },
20
+ "./fetch": {
21
+ "types": "./dist/fetch.d.ts",
22
+ "default": "./dist/fetch.js"
23
+ },
24
+ "./edge": {
25
+ "types": "./dist/edge.d.ts",
26
+ "default": "./dist/edge.js"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "test": "npx tsx --test tests/middleware.test.ts tests/script.test.ts tests/fetch.test.ts tests/auto.test.ts tests/encrypt.test.ts"
32
+ },
33
+ "files": ["dist", "README.md"],
34
+ "keywords": ["antibot", "nextjs", "middleware", "bot-detection"],
35
+ "license": "ISC",
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "@protegoprotect/core": "2.0.0",
41
+ "@protegoprotect/attestation": "2.0.0"
42
+ },
43
+ "peerDependencies": {
44
+ "next": ">=13.0.0",
45
+ "react": ">=18.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "typescript": "^5.7.0",
49
+ "@types/node": "^22.0.0",
50
+ "@types/react": "^19.0.0"
51
+ }
52
+ }