unshared-clientjs-sdk 2.3.0 → 3.0.0-rc.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -151
- package/dist/client.d.ts +54 -25
- package/dist/client.js +1 -1
- package/dist/esm/client.d.mts +54 -25
- package/dist/esm/client.mjs +1 -1
- package/dist/esm/index.d.mts +8 -8
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/middleware/dispatch-processing.d.mts +6 -3
- package/dist/esm/middleware/dispatch-processing.mjs +1 -1
- package/dist/esm/middleware/index.d.mts +7 -5
- package/dist/esm/middleware/index.mjs +1 -1
- package/dist/esm/middleware/injection/fingerprint-script.d.mts +7 -0
- package/dist/esm/middleware/injection/fingerprint-script.mjs +1 -1
- package/dist/esm/middleware/injection/fp-bundle-source.d.mts +5 -4
- package/dist/esm/middleware/injection/fp-bundle-source.mjs +1 -1
- package/dist/esm/middleware/response-interceptor.d.mts +1 -1
- package/dist/esm/middleware/routes/interstitial.d.mts +2 -2
- package/dist/esm/middleware/routes/interstitial.mjs +1 -1
- package/dist/esm/middleware/routes/submit-fp.d.mts +5 -5
- package/dist/esm/middleware/routes/submit-fp.mjs +1 -1
- package/dist/esm/middleware/routes/verify.d.mts +3 -3
- package/dist/esm/middleware/routes/verify.mjs +1 -1
- package/dist/esm/middleware/utils/client-ip.d.mts +1 -1
- package/dist/esm/middleware/utils/cookies.d.mts +1 -1
- package/dist/esm/middleware/utils/device-id.d.mts +1 -1
- package/dist/esm/middleware/utils/device-id.mjs +1 -1
- package/dist/esm/middleware/utils/flagged-response.mjs +1 -1
- package/dist/esm/middleware/utils/http-helpers.d.mts +1 -1
- package/dist/esm/middleware/utils/permanent-device-id.d.mts +7 -0
- package/dist/esm/middleware/utils/permanent-device-id.mjs +1 -0
- package/dist/esm/middleware/utils/read-json-body.d.mts +3 -0
- package/dist/esm/middleware/utils/read-json-body.mjs +1 -0
- package/dist/esm/middleware/utils/secure.d.mts +1 -1
- package/dist/esm/middleware.d.mts +5 -6
- package/dist/esm/middleware.mjs +1 -1
- package/dist/esm/shared-types.d.mts +148 -0
- package/dist/esm/web/index.d.mts +6 -6
- package/dist/esm/web/index.mjs +1 -1
- package/dist/esm/web/protection-handler.d.mts +5 -5
- package/dist/esm/web/protection-handler.mjs +1 -1
- package/dist/esm/web/submit-handler.d.mts +2 -2
- package/dist/esm/web/submit-handler.mjs +1 -1
- package/dist/esm/web/types.d.mts +1 -1
- package/dist/esm/web/web-helpers.d.mts +11 -0
- package/dist/esm/web/web-helpers.mjs +1 -1
- package/dist/middleware/dispatch-processing.d.ts +3 -0
- package/dist/middleware/dispatch-processing.js +1 -1
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.js +1 -1
- package/dist/middleware/injection/fingerprint-script.d.ts +7 -0
- package/dist/middleware/injection/fingerprint-script.js +1 -1
- package/dist/middleware/injection/fp-bundle-source.d.ts +5 -4
- package/dist/middleware/injection/fp-bundle-source.js +1 -1
- package/dist/middleware/routes/submit-fp.js +1 -1
- package/dist/middleware/routes/verify.js +1 -1
- package/dist/middleware/utils/permanent-device-id.d.ts +7 -0
- package/dist/middleware/utils/permanent-device-id.js +1 -0
- package/dist/middleware/utils/read-json-body.d.ts +3 -0
- package/dist/middleware/utils/read-json-body.js +1 -0
- package/dist/middleware.d.ts +3 -4
- package/dist/middleware.js +1 -1
- package/dist/shared-types.d.ts +148 -0
- package/dist/web/protection-handler.d.ts +1 -1
- package/dist/web/protection-handler.js +1 -1
- package/dist/web/submit-handler.js +1 -1
- package/dist/web/web-helpers.d.ts +11 -0
- package/dist/web/web-helpers.js +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"t",{value:!0}),exports.createWebSubmitHandler=createWebSubmitHandler;const web_helpers_1=require("./web-helpers");function createWebSubmitHandler(e,r){const{userIdExtractor:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"t",{value:!0}),exports.createWebSubmitHandler=createWebSubmitHandler;const web_helpers_1=require("./web-helpers");function createWebSubmitHandler(e,r){const{userIdExtractor:t,eventTypeExtractor:s,sessionIdExtractor:o,ipAddressExtractor:c,defaultEventType:n="browser_event",routePrefix:i="/unshared",corsOrigins:a}=r??{},d=`${i}/submit-fingerprint-event`,p=a?Array.isArray(a)?a:[a]:null;return async r=>{let i;try{i=new URL(r.url).pathname}catch{return(0,web_helpers_1.jsonResponse)(400,{success:!1,error:{code:"INVALID_URL",message:"Unable to parse request URL"}})}const a=p&&i===d?function(e){if(!p)return{};const r=e.headers.get("origin")??"",t=p.includes("*");return t||p.includes(r)?{"Access-Control-Allow-Origin":t?"*":r,"Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, X-Idempotency-Key, X-Session-Id, X-Permanent-Device-Id"}:{}}(r):{};if("OPTIONS"===r.method&&i===d)return(0,web_helpers_1.emptyResponse)(204,a);if("POST"!==r.method||i!==d)return(0,web_helpers_1.jsonResponse)(404,{success:!1,error:{code:"NOT_FOUND",message:"Unknown route"}},a);try{const i=await(0,web_helpers_1.readJsonRequest)(r);if(!i.success)return(0,web_helpers_1.jsonResponse)(i.status,{success:!1,error:i.error},a);const d=i.data;if(!d||"object"!=typeof d||Array.isArray(d))return(0,web_helpers_1.jsonResponse)(400,{success:!1,error:{code:"VALIDATION_ERROR",message:"Request body must be a JSON object"}},a);const p=d.context&&"object"==typeof d.context?d.context:{},y=p.identity&&"object"==typeof p.identity?p.identity:{},u=p.identifiers&&"object"==typeof p.identifiers?p.identifiers:{},b=p.event&&"object"==typeof p.event?p.event:{};let _,l,f,h;try{_=(t?t(r):void 0)??y.user_id}catch{_=y.user_id}try{l=(s?s(r):void 0)??b.type??n}catch{l=b.type??n}try{f=(o?o(r):void 0)??r.headers.get("x-session-id")??u.session_hash}catch{f=r.headers.get("x-session-id")??u.session_hash}const w=(0,web_helpers_1.extractClientIpFromRequest)(r);try{h=(c?c(r):void 0)??w}catch{h=w}const A=r.headers.get("x-permanent-device-id")??u.unshared_device_id,O=p.sdk&&"object"==typeof p.sdk?p.sdk.name:void 0,g="string"==typeof O&&O.startsWith("unshared-")&&d.fingerprint&&"object"==typeof d.fingerprint&&d.context&&"object"==typeof d.context&&!Array.isArray(d.context)&&d.context.identity&&"object"==typeof d.context.identity&&!Array.isArray(d.context.identity)&&d.context.identifiers&&"object"==typeof d.context.identifiers&&!Array.isArray(d.context.identifiers)&&d.context.event&&"object"==typeof d.context.event&&!Array.isArray(d.context.event),j=!Object.prototype.hasOwnProperty.call(d,"context")&&"string"==typeof d.hash&&"string"==typeof d.stable_hash&&"string"==typeof d.collected_at&&d.components&&"object"==typeof d.components&&!Array.isArray(d.components),m=g||j?{...d,context:{...p,identity:{...y,..._?{user_id:_}:{}},identifiers:{...u,...f?{session_hash:f}:{},...A?{unshared_device_id:A}:{}},event:{...b,type:l,...h?{ip_address:h}:{},user_agent:r.headers.get("user-agent")??""}}}:d,v=await e.submitFingerprint(m,{idempotencyKey:r.headers.get("x-idempotency-key")??void 0});return v.success?(0,web_helpers_1.jsonResponse)(202,{success:!0,data:v.data},a):(0,web_helpers_1.jsonResponse)(200,{success:!1,error:v.error??{code:"UPSTREAM_ERROR",message:"Upstream request failed"}},a)}catch(e){return(0,web_helpers_1.jsonResponse)(200,{success:!1,error:{code:"MIDDLEWARE_ERROR",message:e instanceof Error?e.message:"Handler error"}},a)}}}
|
|
@@ -32,6 +32,17 @@ export declare function extractDeviceIdFromRequestOrUnknown(request: Request, re
|
|
|
32
32
|
* 2. The URL protocol (for direct HTTPS requests)
|
|
33
33
|
*/
|
|
34
34
|
export declare function isSecureWebRequest(request: Request): boolean;
|
|
35
|
+
export declare function readJsonRequest(request: Request, maxBytes?: number): Promise<{
|
|
36
|
+
success: true;
|
|
37
|
+
data: unknown;
|
|
38
|
+
} | {
|
|
39
|
+
success: false;
|
|
40
|
+
status: 400 | 413;
|
|
41
|
+
error: {
|
|
42
|
+
code: string;
|
|
43
|
+
message: string;
|
|
44
|
+
};
|
|
45
|
+
}>;
|
|
35
46
|
/**
|
|
36
47
|
* Build a JSON response. Mirrors `sendJson(res, status, data)` in
|
|
37
48
|
* src/middleware/utils/http-helpers.ts, but returns a new Response instead
|
package/dist/web/web-helpers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function parseCookieFromRequest(e,t){const o=e.headers.get("cookie");if(!o)return;const
|
|
1
|
+
"use strict";function parseCookieFromRequest(e,t){const o=e.headers.get("cookie");if(!o)return;const s=o.match(new RegExp(`(?:^|; )${t}=([^;]*)`));if(s)try{return decodeURIComponent(s[1])}catch{return s[1]}}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 s=e.headers.get("x-forwarded-for");if(s){const e=s.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}}async function readJsonRequest(e,t=1<<20){const o=Number(e.headers.get("content-length"));if(Number.isFinite(o)&&o>t)return{success:!1,status:413,error:{code:"REQUEST_TOO_LARGE",message:"Request body exceeds 1 MiB"}};try{if(!e.body)throw new Error("Missing body");const o=e.body.getReader(),s=[];let r=0;for(;;){const{done:e,value:n}=await o.read();if(e)break;if(r+=n.byteLength,r>t)return o.cancel().catch(()=>{}),{success:!1,status:413,error:{code:"REQUEST_TOO_LARGE",message:"Request body exceeds 1 MiB"}};s.push(n)}const n=new Uint8Array(r);let c=0;for(const e of s)n.set(e,c),c+=e.byteLength;return{success:!0,data:JSON.parse((new TextDecoder).decode(n))}}catch{return{success:!1,status:400,error:{code:"INVALID_JSON",message:"Request body is not valid JSON."}}}}function jsonResponse(e,t,o){const s=new Headers(o);return s.set("Content-Type","application/json"),new Response(JSON.stringify(t),{status:e,headers:s})}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 s=new Headers;e.forEach((e,t)=>{"set-cookie"!==t.toLowerCase()&&s.set(t,e)});const r="function"==typeof e.getSetCookie?e.getSetCookie():[];for(const e of r)s.append("Set-Cookie",e);if(o)for(const e of o)s.append("Set-Cookie",e);if(t)for(const[e,o]of Object.entries(t))s.set(e,o);return s}Object.defineProperty(exports,"t",{value:!0}),exports.parseCookieFromRequest=parseCookieFromRequest,exports.extractClientIpFromRequest=extractClientIpFromRequest,exports.extractDeviceIdFromRequest=extractDeviceIdFromRequest,exports.extractDeviceIdFromRequestOrUnknown=extractDeviceIdFromRequestOrUnknown,exports.isSecureWebRequest=isSecureWebRequest,exports.readJsonRequest=readJsonRequest,exports.jsonResponse=jsonResponse,exports.emptyResponse=emptyResponse,exports.bodyResponse=bodyResponse,exports.appendCookieToHeaders=appendCookieToHeaders,exports.mergeResponseHeaders=mergeResponseHeaders;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unshared-clientjs-sdk",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Server-side Node.js SDK for the Unshared Labs
|
|
3
|
+
"version": "3.0.0-rc.14",
|
|
4
|
+
"description": "Server-side Node.js SDK for the Unshared Labs API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -52,12 +52,12 @@
|
|
|
52
52
|
"author": "",
|
|
53
53
|
"license": "MIT",
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"unshared-frontend-sdk": "
|
|
55
|
+
"unshared-frontend-sdk": "3.0.0-rc.14"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@unshared-labs/shared-types": "file:../../../shared/types",
|
|
59
58
|
"@types/express": "^4.17.21",
|
|
60
59
|
"@types/node": "^24.10.1",
|
|
60
|
+
"@unshared-labs/shared-types": "file:../../../shared/types",
|
|
61
61
|
"express": "^4.18.2",
|
|
62
62
|
"terser": "^5.44.1",
|
|
63
63
|
"ts-node": "^10.9.2",
|