unshared-clientjs-sdk 2.0.0-rc.21 → 2.0.0-rc.23
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/client.d.ts +29 -0
- package/dist/client.js +1 -1
- package/dist/esm/client.d.mts +29 -0
- package/dist/esm/client.mjs +1 -1
- package/dist/esm/index.d.mts +2 -0
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/middleware/dispatch-dedupe.d.mts +11 -0
- package/dist/esm/middleware/dispatch-dedupe.mjs +1 -0
- package/dist/esm/middleware/index.d.mts +26 -11
- package/dist/esm/middleware/index.mjs +1 -1
- package/dist/esm/middleware/injection/fingerprint-script.mjs +1 -1
- package/dist/esm/middleware/response-interceptor.d.mts +2 -2
- package/dist/esm/middleware/routes/submit-fp.d.mts +14 -7
- package/dist/esm/middleware/routes/submit-fp.mjs +1 -1
- package/dist/esm/middleware/routes/verify.d.mts +11 -6
- package/dist/esm/middleware/routes/verify.mjs +1 -1
- package/dist/esm/middleware/utils/client-ip.d.mts +4 -4
- package/dist/esm/middleware/utils/client-ip.mjs +1 -1
- package/dist/esm/middleware/utils/cookies.d.mts +2 -2
- package/dist/esm/middleware/utils/device-id.d.mts +17 -3
- package/dist/esm/middleware/utils/device-id.mjs +1 -1
- package/dist/esm/middleware/utils/http-helpers.d.mts +21 -0
- package/dist/esm/middleware/utils/http-helpers.mjs +1 -0
- package/dist/esm/middleware/utils/include-path.d.mts +6 -0
- package/dist/esm/middleware/utils/include-path.mjs +1 -0
- package/dist/esm/middleware/utils/is-bot.mjs +1 -1
- package/dist/esm/middleware/utils/secure.d.mts +2 -2
- package/dist/esm/middleware/utils/secure.mjs +1 -1
- package/dist/esm/middleware/utils/sentinel-user-id.d.mts +10 -0
- package/dist/esm/middleware/utils/sentinel-user-id.mjs +1 -0
- package/dist/esm/middleware.d.mts +11 -8
- package/dist/esm/middleware.mjs +1 -1
- package/dist/esm/types.d.mts +44 -0
- package/dist/esm/types.mjs +1 -0
- package/dist/esm/web/index.d.mts +17 -0
- package/dist/esm/web/index.mjs +1 -0
- package/dist/esm/web/protection-handler.d.mts +28 -0
- package/dist/esm/web/protection-handler.mjs +1 -0
- package/dist/esm/web/submit-handler.d.mts +27 -0
- package/dist/esm/web/submit-handler.mjs +1 -0
- package/dist/esm/web/types.d.mts +110 -0
- package/dist/esm/web/types.mjs +1 -0
- package/dist/esm/web/web-helpers.d.mts +55 -0
- package/dist/esm/web/web-helpers.mjs +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/middleware/dispatch-dedupe.d.ts +11 -0
- package/dist/middleware/dispatch-dedupe.js +1 -0
- package/dist/middleware/index.d.ts +26 -11
- package/dist/middleware/index.js +1 -1
- package/dist/middleware/injection/fingerprint-script.js +1 -1
- package/dist/middleware/response-interceptor.d.ts +2 -2
- package/dist/middleware/routes/submit-fp.d.ts +14 -7
- package/dist/middleware/routes/submit-fp.js +1 -1
- package/dist/middleware/routes/verify.d.ts +11 -6
- package/dist/middleware/routes/verify.js +1 -1
- package/dist/middleware/utils/client-ip.d.ts +4 -4
- package/dist/middleware/utils/client-ip.js +1 -1
- package/dist/middleware/utils/cookies.d.ts +2 -2
- package/dist/middleware/utils/device-id.d.ts +17 -3
- package/dist/middleware/utils/device-id.js +1 -1
- package/dist/middleware/utils/http-helpers.d.ts +21 -0
- package/dist/middleware/utils/http-helpers.js +1 -0
- package/dist/middleware/utils/include-path.d.ts +6 -0
- package/dist/middleware/utils/include-path.js +1 -0
- package/dist/middleware/utils/is-bot.js +1 -1
- package/dist/middleware/utils/secure.d.ts +2 -2
- package/dist/middleware/utils/secure.js +1 -1
- package/dist/middleware/utils/sentinel-user-id.d.ts +10 -0
- package/dist/middleware/utils/sentinel-user-id.js +1 -0
- package/dist/middleware.d.ts +11 -8
- package/dist/middleware.js +1 -1
- package/dist/types.d.ts +44 -0
- package/dist/types.js +1 -0
- package/dist/web/index.d.ts +17 -0
- package/dist/web/index.js +1 -0
- package/dist/web/protection-handler.d.ts +28 -0
- package/dist/web/protection-handler.js +1 -0
- package/dist/web/submit-handler.d.ts +27 -0
- package/dist/web/submit-handler.js +1 -0
- package/dist/web/types.d.ts +110 -0
- package/dist/web/types.js +1 -0
- package/dist/web/web-helpers.d.ts +55 -0
- package/dist/web/web-helpers.js +1 -0
- package/package.json +7 -10
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Standard Request/Response handler types for serverless/edge environments.
|
|
3
|
+
*
|
|
4
|
+
* These types use the global `Request` and `Response` from the Fetch API,
|
|
5
|
+
* available in: Next.js App Router Route Handlers, Vercel Edge Functions,
|
|
6
|
+
* Cloudflare Workers, Deno Deploy, Bun, and Node.js 18+.
|
|
7
|
+
*
|
|
8
|
+
* The DOM lib reference above scopes the Fetch API globals to this file only,
|
|
9
|
+
* avoiding `window`/`document` pollution in the Node.js middleware code.
|
|
10
|
+
*/
|
|
11
|
+
import type { Verdict } from '../middleware/verdict-cache';
|
|
12
|
+
/** A downstream handler that returns a Response. */
|
|
13
|
+
export type WebHandler = (request: Request) => Response | Promise<Response>;
|
|
14
|
+
/** Middleware that wraps a downstream handler, optionally intercepting the response. */
|
|
15
|
+
export type WebMiddleware = (request: Request, next: WebHandler) => Response | Promise<Response>;
|
|
16
|
+
export interface WebSubmitOptions {
|
|
17
|
+
/** Override userId extractor. Falls back to body.user_id. */
|
|
18
|
+
userIdExtractor?: (req: Request) => string | undefined;
|
|
19
|
+
/** Override eventType extractor. Falls back to body.event_type. */
|
|
20
|
+
eventTypeExtractor?: (req: Request) => string | undefined;
|
|
21
|
+
/** Override sessionId extractor. Falls back to X-Session-Id header, then body.session_id. */
|
|
22
|
+
sessionIdExtractor?: (req: Request) => string | undefined;
|
|
23
|
+
/** Override IP address extractor. Falls back to CF-Connecting-IP / X-Real-IP / X-Forwarded-For headers. */
|
|
24
|
+
ipAddressExtractor?: (req: Request) => string | undefined;
|
|
25
|
+
/** Default event type when none is extractable. @default "browser_event" */
|
|
26
|
+
defaultEventType?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Route prefix the handler responds under.
|
|
29
|
+
* @default "/unshared"
|
|
30
|
+
*/
|
|
31
|
+
routePrefix?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Allowed CORS origins for the fingerprint route.
|
|
34
|
+
* Use `"*"` to allow all origins, or pass a specific origin / array of origins.
|
|
35
|
+
* The handler handles OPTIONS preflight automatically when this is set.
|
|
36
|
+
*/
|
|
37
|
+
corsOrigins?: string | string[];
|
|
38
|
+
}
|
|
39
|
+
export interface WebProtectionConfig {
|
|
40
|
+
/**
|
|
41
|
+
* Required. Resolves the current user's ID from the request.
|
|
42
|
+
* Return undefined for anonymous/logged-out visitors.
|
|
43
|
+
*/
|
|
44
|
+
userId: (req: Request) => string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Resolves the current user's email address from the request.
|
|
47
|
+
* Falls back to HttpOnly cookie → request body when not configured.
|
|
48
|
+
*/
|
|
49
|
+
emailAddress?: (req: Request) => string | undefined;
|
|
50
|
+
/** Route prefix for internal routes. @default "/__unshared" */
|
|
51
|
+
routePrefix?: string;
|
|
52
|
+
/** Allowed CORS origins for /__unshared/* routes. */
|
|
53
|
+
corsOrigins?: string | string[];
|
|
54
|
+
/** Verdict cache TTL in ms. @default 60000 */
|
|
55
|
+
cacheTTL?: number;
|
|
56
|
+
/** Paths to skip entirely (static assets, health checks). */
|
|
57
|
+
skipPaths?: string[];
|
|
58
|
+
/** When set, only paths matching one of these prefixes get events dispatched and checkUser called. */
|
|
59
|
+
includePathPrefix?: string[];
|
|
60
|
+
/** Resolves a custom session ID. Falls back to __unshared_sid cookie. */
|
|
61
|
+
sessionId?: (req: Request) => string | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Resolves a device ID from the request.
|
|
64
|
+
* Falls back to X-Device-Id header → __unshared_fp_id cookie.
|
|
65
|
+
*/
|
|
66
|
+
deviceId?: (req: Request) => string | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Inline JavaScript bundle for the frontend SDK, served at /__unshared/fp.js.
|
|
69
|
+
*
|
|
70
|
+
* In Node.js environments the middleware reads this from node_modules via
|
|
71
|
+
* `require.resolve('unshared-frontend-sdk/dist/index.umd.js')`. Edge runtimes
|
|
72
|
+
* do not have filesystem access, so the bundle must be passed as a string
|
|
73
|
+
* (typically imported via a bundler):
|
|
74
|
+
*
|
|
75
|
+
* ```typescript
|
|
76
|
+
* import fingerprintSdkBundle from 'unshared-frontend-sdk/dist/index.umd.js?raw';
|
|
77
|
+
* createWebProtectionMiddleware(client, { ..., fingerprintSdkBundle });
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* If omitted, the fp.js route returns 404. The inline script degrades
|
|
81
|
+
* gracefully — the cached-fingerprint path still works.
|
|
82
|
+
*/
|
|
83
|
+
fingerprintSdkBundle?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Called when a flagged, unverified user makes a request.
|
|
86
|
+
*
|
|
87
|
+
* Return a `Response` to block/redirect, or `null` to pass through (injection
|
|
88
|
+
* still happens). Exceptions are caught — the request passes through on error.
|
|
89
|
+
*
|
|
90
|
+
* This differs from the Node.js middleware: in Web Standard environments
|
|
91
|
+
* Response objects are immutable, so the callback returns a new Response
|
|
92
|
+
* rather than mutating an existing one.
|
|
93
|
+
*/
|
|
94
|
+
onFlagged?: (context: {
|
|
95
|
+
userId: string;
|
|
96
|
+
emailAddress: string;
|
|
97
|
+
verdict: Verdict;
|
|
98
|
+
request: Request;
|
|
99
|
+
}) => Response | Promise<Response> | null;
|
|
100
|
+
/**
|
|
101
|
+
* Called when a background SDK operation fails (fire-and-forget API calls,
|
|
102
|
+
* verdict refreshes, etc.). Use this to pipe errors to your logging or
|
|
103
|
+
* monitoring system for observability.
|
|
104
|
+
*/
|
|
105
|
+
onError?: (error: unknown, context: {
|
|
106
|
+
operation: 'processUserEvent' | 'submitFingerprintEvent' | 'checkUser' | 'verifyTrigger' | 'verify';
|
|
107
|
+
userId?: string;
|
|
108
|
+
emailAddress?: string;
|
|
109
|
+
}) => void;
|
|
110
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"t",{value:!0});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin adapter functions that bridge Web Standard `Request`/`Response` to the
|
|
3
|
+
* data shapes the rest of the SDK expects. These mirror the Node.js
|
|
4
|
+
* `src/middleware/utils/*` functions but read from Web Standard Headers
|
|
5
|
+
* instead of Node.js `req.headers` objects.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Reads a single cookie value from the raw Cookie header.
|
|
9
|
+
* Mirrors `parseCookie(req, name)` in src/middleware/utils/cookies.ts.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseCookieFromRequest(request: Request, name: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Extract the real client IP from proxy headers. Web Standard has no
|
|
14
|
+
* equivalent of `req.ip` or `req.socket.remoteAddress`, so we rely entirely
|
|
15
|
+
* on standard proxy headers (which all edge platforms populate).
|
|
16
|
+
*
|
|
17
|
+
* Priority: CF-Connecting-IP → X-Real-IP → X-Forwarded-For (first entry).
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractClientIpFromRequest(request: Request): string;
|
|
20
|
+
/**
|
|
21
|
+
* Resolves device ID from: custom resolver → X-Device-Id header → __unshared_fp_id cookie.
|
|
22
|
+
* Mirrors `extractDeviceIdOrUndefined` in src/middleware/utils/device-id.ts.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractDeviceIdFromRequest(request: Request, resolveDeviceId?: (req: Request) => string | undefined): string | undefined;
|
|
25
|
+
/** Same as extractDeviceIdFromRequest but returns "unknown" when nothing is available. */
|
|
26
|
+
export declare function extractDeviceIdFromRequestOrUnknown(request: Request, resolveDeviceId?: (req: Request) => string | undefined): string;
|
|
27
|
+
/**
|
|
28
|
+
* Returns true if the request arrived over HTTPS.
|
|
29
|
+
*
|
|
30
|
+
* Web Standard has no `socket.encrypted`, so this checks:
|
|
31
|
+
* 1. The `x-forwarded-proto` header (set by reverse proxies / load balancers)
|
|
32
|
+
* 2. The URL protocol (for direct HTTPS requests)
|
|
33
|
+
*/
|
|
34
|
+
export declare function isSecureWebRequest(request: Request): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Build a JSON response. Mirrors `sendJson(res, status, data)` in
|
|
37
|
+
* src/middleware/utils/http-helpers.ts, but returns a new Response instead
|
|
38
|
+
* of mutating one.
|
|
39
|
+
*/
|
|
40
|
+
export declare function jsonResponse(statusCode: number, data: unknown, extraHeaders?: HeadersInit): Response;
|
|
41
|
+
/** Build a status-only response with no body. */
|
|
42
|
+
export declare function emptyResponse(statusCode: number, extraHeaders?: HeadersInit): Response;
|
|
43
|
+
/** Build a raw-body response (for the fp.js bundle). */
|
|
44
|
+
export declare function bodyResponse(statusCode: number, body: string, extraHeaders?: HeadersInit): Response;
|
|
45
|
+
/**
|
|
46
|
+
* Append a Set-Cookie header to a Headers object. Web Standard `Headers`
|
|
47
|
+
* supports multiple Set-Cookie values via `.append()`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function appendCookieToHeaders(headers: Headers, cookieValue: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Merge a downstream Response's headers with additional Set-Cookie entries
|
|
52
|
+
* and overrides. Preserves multiple Set-Cookie values from the source
|
|
53
|
+
* response via `getSetCookie()` (Node 20+, all modern edge runtimes).
|
|
54
|
+
*/
|
|
55
|
+
export declare function mergeResponseHeaders(source: Headers, overrides?: Record<string, string>, extraCookies?: string[]): Headers;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function parseCookieFromRequest(e,t){const o=e.headers.get("cookie");if(!o)return;const n=o.match(new RegExp(`(?:^|; )${t}=([^;]*)`));return n?decodeURIComponent(n[1]):void 0}function extractClientIpFromRequest(e){const t=e.headers.get("cf-connecting-ip");if(t)return t;const o=e.headers.get("x-real-ip");if(o)return o;const n=e.headers.get("x-forwarded-for");if(n){const e=n.split(",")[0]?.trim();if(e)return e}return""}function extractDeviceIdFromRequest(e,t){if(t)try{const o=t(e);if(o)return o}catch{}const o=e.headers.get("x-device-id");if(o)return o;return parseCookieFromRequest(e,"__unshared_fp_id")||void 0}function extractDeviceIdFromRequestOrUnknown(e,t){return extractDeviceIdFromRequest(e,t)??"unknown"}function isSecureWebRequest(e){if("https"===e.headers.get("x-forwarded-proto"))return!0;try{return"https:"===new URL(e.url).protocol}catch{return!1}}function jsonResponse(e,t,o){const n=new Headers(o);return n.set("Content-Type","application/json"),new Response(JSON.stringify(t),{status:e,headers:n})}function emptyResponse(e,t){return new Response(null,{status:e,headers:new Headers(t)})}function bodyResponse(e,t,o){return new Response(t,{status:e,headers:new Headers(o)})}function appendCookieToHeaders(e,t){e.append("Set-Cookie",t)}function mergeResponseHeaders(e,t,o){const n=new Headers;e.forEach((e,t)=>{"set-cookie"!==t.toLowerCase()&&n.set(t,e)});const r="function"==typeof e.getSetCookie?e.getSetCookie():[];for(const e of r)n.append("Set-Cookie",e);if(o)for(const e of o)n.append("Set-Cookie",e);if(t)for(const[e,o]of Object.entries(t))n.set(e,o);return n}Object.defineProperty(exports,"t",{value:!0}),exports.parseCookieFromRequest=parseCookieFromRequest,exports.extractClientIpFromRequest=extractClientIpFromRequest,exports.extractDeviceIdFromRequest=extractDeviceIdFromRequest,exports.extractDeviceIdFromRequestOrUnknown=extractDeviceIdFromRequestOrUnknown,exports.isSecureWebRequest=isSecureWebRequest,exports.jsonResponse=jsonResponse,exports.emptyResponse=emptyResponse,exports.bodyResponse=bodyResponse,exports.appendCookieToHeaders=appendCookieToHeaders,exports.mergeResponseHeaders=mergeResponseHeaders;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unshared-clientjs-sdk",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.23",
|
|
4
4
|
"description": "Server-side Node.js SDK for the Unshared Labs V2 API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.mjs",
|
|
@@ -38,6 +38,11 @@
|
|
|
38
38
|
"import": "./dist/esm/middleware/index.mjs",
|
|
39
39
|
"require": "./dist/middleware/index.js",
|
|
40
40
|
"types": "./dist/middleware/index.d.ts"
|
|
41
|
+
},
|
|
42
|
+
"./web": {
|
|
43
|
+
"import": "./dist/esm/web/index.mjs",
|
|
44
|
+
"require": "./dist/web/index.js",
|
|
45
|
+
"types": "./dist/web/index.d.ts"
|
|
41
46
|
}
|
|
42
47
|
},
|
|
43
48
|
"engines": {
|
|
@@ -46,16 +51,8 @@
|
|
|
46
51
|
"keywords": [],
|
|
47
52
|
"author": "",
|
|
48
53
|
"license": "MIT",
|
|
49
|
-
"peerDependencies": {
|
|
50
|
-
"@types/express": ">=4"
|
|
51
|
-
},
|
|
52
|
-
"peerDependenciesMeta": {
|
|
53
|
-
"@types/express": {
|
|
54
|
-
"optional": true
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
54
|
"dependencies": {
|
|
58
|
-
"unshared-frontend-sdk": "2.0.0-rc.
|
|
55
|
+
"unshared-frontend-sdk": "2.0.0-rc.23"
|
|
59
56
|
},
|
|
60
57
|
"devDependencies": {
|
|
61
58
|
"@types/express": "^4.17.21",
|