zubbl-sdk 1.1.29 → 1.1.31
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/types/client.d.ts +1 -1
- package/dist/types/core/config.d.ts +5 -1
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.min.d.ts +1 -0
- package/dist/zubbl-sdk.cjs.js +53 -9
- package/dist/zubbl-sdk.cjs.js.map +1 -1
- package/dist/zubbl-sdk.esm.js +53 -9
- package/dist/zubbl-sdk.esm.js.map +1 -1
- package/package.json +6 -6
- package/dist/types/core/http.original.d.ts +0 -4
- package/dist/zubbl-sdk.umd.js +0 -636
- package/dist/zubbl-sdk.umd.js.map +0 -1
package/dist/types/client.d.ts
CHANGED
|
@@ -13,4 +13,8 @@ export interface ZubblConfig {
|
|
|
13
13
|
* Creates an isolated configuration store.
|
|
14
14
|
* Each ZubblClient instance owns its own store.
|
|
15
15
|
*/
|
|
16
|
-
export declare function createConfigStore(initial?: Partial<ZubblConfig>):
|
|
16
|
+
export declare function createConfigStore(initial?: Partial<ZubblConfig>): {
|
|
17
|
+
init: (partial: Partial<ZubblConfig>) => void;
|
|
18
|
+
get: () => Readonly<ZubblConfig>;
|
|
19
|
+
buildHeaders: (extra?: Record<string, string>) => Record<string, string>;
|
|
20
|
+
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from "./core/config
|
|
2
|
-
export * from "./core/context
|
|
3
|
-
export * from "./core/storage
|
|
4
|
-
export * from "./core/geo
|
|
5
|
-
export
|
|
6
|
-
export * from "./features/identifyUser
|
|
7
|
-
export * from "./features/getTiles
|
|
1
|
+
export * from "./core/config";
|
|
2
|
+
export * from "./core/context";
|
|
3
|
+
export * from "./core/storage";
|
|
4
|
+
export * from "./core/geo";
|
|
5
|
+
export { createZubblClient, } from "./client";
|
|
6
|
+
export * from "./features/identifyUser";
|
|
7
|
+
export * from "./features/getTiles";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./client";
|
package/dist/zubbl-sdk.cjs.js
CHANGED
|
@@ -13,14 +13,53 @@ const isNode = typeof process !== "undefined" &&
|
|
|
13
13
|
const isWorker = typeof self !== "undefined" &&
|
|
14
14
|
typeof self.importScripts === "function" &&
|
|
15
15
|
!isNode;
|
|
16
|
+
function assertBrowserSafety(cfg) {
|
|
17
|
+
if (isBrowser || isWorker) {
|
|
18
|
+
const key = cfg.apiKey ?? "";
|
|
19
|
+
const looksSecret = key.startsWith("sk_") || key.length > 40;
|
|
20
|
+
if (looksSecret) {
|
|
21
|
+
throw new Error("[Zubbl SDK] Secret or server key detected in browser environment. " +
|
|
22
|
+
"Use a public SDK key instead (prefix pk_).");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
16
26
|
/**
|
|
17
27
|
* Creates an isolated configuration store.
|
|
18
28
|
* Each ZubblClient instance owns its own store.
|
|
19
29
|
*/
|
|
20
30
|
function createConfigStore(initial) {
|
|
21
|
-
|
|
31
|
+
let current = {
|
|
32
|
+
apiKey: null,
|
|
33
|
+
tenantId: null,
|
|
34
|
+
appId: null,
|
|
35
|
+
baseUrl: "https://api.zubbl.com/api",
|
|
36
|
+
injectWorkerHeaders: false,
|
|
37
|
+
workerSecret: null,
|
|
22
38
|
...initial,
|
|
23
|
-
}
|
|
39
|
+
};
|
|
40
|
+
function init(partial) {
|
|
41
|
+
current = { ...current, ...partial };
|
|
42
|
+
assertBrowserSafety(current);
|
|
43
|
+
}
|
|
44
|
+
function get() {
|
|
45
|
+
return current;
|
|
46
|
+
}
|
|
47
|
+
function buildHeaders(extra = {}) {
|
|
48
|
+
if (!current.tenantId || !current.appId) {
|
|
49
|
+
throw new Error("[Zubbl SDK] Not initialized – call init() first.");
|
|
50
|
+
}
|
|
51
|
+
const headers = {
|
|
52
|
+
"X-Tenant-Id": current.tenantId,
|
|
53
|
+
"X-App-Id": current.appId,
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
...extra,
|
|
56
|
+
};
|
|
57
|
+
if (current.apiKey) {
|
|
58
|
+
headers.Authorization = `Bearer ${current.apiKey}`;
|
|
59
|
+
}
|
|
60
|
+
return headers;
|
|
61
|
+
}
|
|
62
|
+
return { init, get, buildHeaders };
|
|
24
63
|
}
|
|
25
64
|
|
|
26
65
|
// src/core/context.ts
|
|
@@ -413,7 +452,7 @@ async function httpRequest(url, options = {}) {
|
|
|
413
452
|
signal: controller.signal,
|
|
414
453
|
};
|
|
415
454
|
// Record adaptive context sample
|
|
416
|
-
recordContextSample();
|
|
455
|
+
recordContextSample("/http", "GET", 200, 123);
|
|
417
456
|
const response = await fetch(url, finalOptions);
|
|
418
457
|
if (!response.ok) {
|
|
419
458
|
console.warn(`[Zubbl SDK][HTTP] ${response.status} on ${url}`);
|
|
@@ -491,12 +530,17 @@ async function getTilesFeature(store, { external_user_id, app_id = null, ttlSeco
|
|
|
491
530
|
...adaptiveHeaders,
|
|
492
531
|
...geoHeaders,
|
|
493
532
|
});
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
533
|
+
// Modern endpoint: POST /api/sdk/policies with body (per architecture docs)
|
|
534
|
+
const payload = {
|
|
535
|
+
tenant_id: config.tenantId,
|
|
536
|
+
app_id: app_id || config.appId,
|
|
537
|
+
external_user_id,
|
|
538
|
+
};
|
|
539
|
+
const resp = await httpRequest(`${config.baseUrl.replace(/\/$/, "")}/api/sdk/policies`, {
|
|
540
|
+
method: "POST",
|
|
541
|
+
headers,
|
|
542
|
+
body: JSON.stringify(payload),
|
|
543
|
+
});
|
|
500
544
|
if (resp.status === 304 && cached?.data) {
|
|
501
545
|
cached.expiresAt = Date.now() + ttlSeconds * 1000;
|
|
502
546
|
storage.set(TILE_CACHE_KEY, cached, ttlSeconds);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zubbl-sdk.cjs.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/core/storage.ts","../src/core/geo.ts","../src/core/signing.ts","../src/core/http.ts","../src/features/identifyUser.ts","../src/features/getTiles.ts","../src/client.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zubbl-sdk.cjs.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/core/storage.ts","../src/core/geo.ts","../src/core/signing.ts","../src/core/http.ts","../src/features/identifyUser.ts","../src/features/getTiles.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["// src/core/config.ts\n// -----------------------------------------------------------\n// Universal environment detection + SDK configuration\n// -----------------------------------------------------------\n\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n\nexport const isNode =\n typeof process !== \"undefined\" &&\n !!process.versions?.node &&\n !isBrowser;\n\nexport const isWorker =\n typeof self !== \"undefined\" &&\n typeof (self as any).importScripts === \"function\" &&\n !isNode;\n\n// -----------------------------------------------------------\n// Config store factory (no module-scoped state)\n// -----------------------------------------------------------\n\nexport interface ZubblConfig {\n apiKey: string | null;\n tenantId: string | null;\n appId: string | null;\n baseUrl: string;\n injectWorkerHeaders?: boolean;\n workerSecret?: string | null;\n}\n\nfunction assertBrowserSafety(cfg: ZubblConfig) {\n if (isBrowser || isWorker) {\n const key = cfg.apiKey ?? \"\";\n const looksSecret = key.startsWith(\"sk_\") || key.length > 40;\n if (looksSecret) {\n throw new Error(\n \"[Zubbl SDK] Secret or server key detected in browser environment. \" +\n \"Use a public SDK key instead (prefix pk_).\"\n );\n }\n }\n}\n\n/**\n * Creates an isolated configuration store.\n * Each ZubblClient instance owns its own store.\n */\nexport function createConfigStore(initial?: Partial<ZubblConfig>) {\n let current: ZubblConfig = {\n apiKey: null,\n tenantId: null,\n appId: null,\n baseUrl: \"https://api.zubbl.com/api\",\n injectWorkerHeaders: false,\n workerSecret: null,\n ...initial,\n };\n\n function init(partial: Partial<ZubblConfig>) {\n current = { ...current, ...partial };\n assertBrowserSafety(current);\n }\n\n function get(): Readonly<ZubblConfig> {\n return current;\n }\n\n function buildHeaders(extra: Record<string, string> = {}): Record<string, string> {\n if (!current.tenantId || !current.appId) {\n throw new Error(\"[Zubbl SDK] Not initialized – call init() first.\");\n }\n\n const headers: Record<string, string> = {\n \"X-Tenant-Id\": current.tenantId,\n \"X-App-Id\": current.appId,\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n\n if (current.apiKey) {\n headers.Authorization = `Bearer ${current.apiKey}`;\n }\n\n return headers;\n}\n\n return { init, get, buildHeaders };\n}\n\n","// src/core/context.ts\n// -----------------------------------------------------------\n// Adaptive Context Engine — Geo + Stability Enrichment + Persistence\n// -----------------------------------------------------------\n\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// -----------------------------------------------------------\n// Types\n// -----------------------------------------------------------\ninterface ContextSample {\n path: string;\n method: string;\n ts: number;\n status: number;\n latency: number;\n}\n\ninterface AdaptiveState {\n routes: ContextSample[];\n geo: string;\n stability: number;\n lastGeoChange: number;\n}\n\nconst MAX_HISTORY = 100;\nconst CACHE_KEY = \"zubbl-stability\";\n\nlet state: AdaptiveState = loadStability() ?? {\n routes: [],\n geo: \"unknown\",\n stability: 1.0,\n lastGeoChange: Date.now(),\n};\n\n// -----------------------------------------------------------\n// 💾 Persistence Helpers\n// -----------------------------------------------------------\nfunction loadStability(): AdaptiveState | null {\n if (!isBrowser || typeof localStorage === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!parsed.geo || !parsed.stability) return null;\n return { ...parsed, routes: [] };\n } catch {\n return null;\n }\n}\n\nfunction saveStability() {\n if (!isBrowser || typeof localStorage === \"undefined\") return;\n try {\n const payload = {\n geo: state.geo,\n stability: state.stability,\n lastGeoChange: state.lastGeoChange,\n };\n localStorage.setItem(CACHE_KEY, JSON.stringify(payload));\n } catch {\n /* ignore */\n }\n}\n\n// -----------------------------------------------------------\n// 🌍 Geo Detection (Node, Browser, Worker)\n// -----------------------------------------------------------\nexport function detectGeo(): string {\n try {\n if (isBrowser && typeof window !== \"undefined\" && window.navigator?.language) {\n return window.navigator.language.split(\"-\")[1] || \"unknown\";\n }\n\n if (isWorker && typeof self !== \"undefined\" && (self as any).navigator?.language) {\n return (self as any).navigator.language.split(\"-\")[1] || \"unknown\";\n }\n\n if (isNode && typeof process !== \"undefined\") {\n const envGeo = process.env.ZUBBL_GEO || process.env.GEO;\n if (envGeo && /^[A-Z]{2}$/i.test(envGeo)) return envGeo.toUpperCase();\n return \"GB\";\n }\n\n return \"unknown\";\n } catch (err) {\n console.warn(\"[Zubbl SDK][Geo Detect] Failed:\", err);\n return \"unknown\";\n }\n}\n\n// -----------------------------------------------------------\n// 🧭 Update Geo & Stability (with persistence)\n// -----------------------------------------------------------\nexport function updateGeo(geoHint?: string) {\n const newGeo = geoHint || detectGeo();\n if (newGeo !== state.geo) {\n const now = Date.now();\n const elapsed = (now - state.lastGeoChange) / 1000;\n state.stability = Math.max(0.5, Math.min(1.0, elapsed / 3600));\n state.geo = newGeo;\n state.lastGeoChange = now;\n saveStability();\n } else {\n state.stability = Math.min(1.0, state.stability + 0.01);\n saveStability();\n }\n}\n\n// -----------------------------------------------------------\n// 🧮 Record Context Samples\n// -----------------------------------------------------------\nexport function recordContextSample(\n path: string,\n method: string,\n status: number,\n latency: number\n) {\n state.routes.push({ path, method, ts: Date.now(), status, latency });\n if (state.routes.length > MAX_HISTORY) state.routes.shift();\n updateGeo(); // auto-refresh geo info\n}\n\n// -----------------------------------------------------------\n// 📦 Get Adaptive Headers\n// -----------------------------------------------------------\nexport function getAdaptiveHeaders(): Record<string, string> {\n const currentGeo = detectGeo();\n updateGeo(currentGeo);\n\n const summary = btoa(\n JSON.stringify({\n env: isNode ? \"node\" : isBrowser ? \"browser\" : \"worker\",\n routeCount: state.routes.length,\n lastGeo: state.geo,\n avgLatency:\n state.routes.reduce((a, b) => a + b.latency, 0) /\n Math.max(1, state.routes.length),\n })\n );\n\n return {\n \"X-Zubbl-Context-Summary\": summary,\n \"X-Zubbl-Geo-Stability\": `${state.geo}/${state.stability.toFixed(2)}`,\n };\n}\n\n// -----------------------------------------------------------\n// 🌍 Initialize Geo Context Immediately\n// -----------------------------------------------------------\nupdateGeo(process.env.ZUBBL_GEO);\n\n","// src/core/storage.ts\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// Generic storage interface\nexport interface IStorage {\n get<T>(key: string): T | null;\n set<T>(key: string, value: T, ttlSeconds?: number): void;\n remove(key: string): void;\n}\n\n// ------------------------------------------------------\n// Node (in-memory) implementation\n// ------------------------------------------------------\n\nclass NodeStorage implements IStorage {\n private store = new Map<string, { value: any; expiresAt?: number }>();\n\n get<T>(key: string): T | null {\n const entry = this.store.get(key);\n if (!entry) return null;\n if (entry.expiresAt && entry.expiresAt < Date.now()) {\n this.store.delete(key);\n return null;\n }\n return entry.value as T;\n }\n\n set<T>(key: string, value: T, ttlSeconds?: number): void {\n const expiresAt = ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined;\n this.store.set(key, { value, expiresAt });\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n}\n\n// ------------------------------------------------------\n// Browser (localStorage) implementation\n// ------------------------------------------------------\n\nclass BrowserStorage implements IStorage {\n private prefix = \"zubbl_sdk_\";\n\n get<T>(key: string): T | null {\n try {\n const raw = localStorage.getItem(this.prefix + key);\n if (!raw) return null;\n const { value, expiresAt } = JSON.parse(raw);\n if (expiresAt && expiresAt < Date.now()) {\n localStorage.removeItem(this.prefix + key);\n return null;\n }\n return value as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T, ttlSeconds?: number): void {\n try {\n const expiresAt = ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined;\n localStorage.setItem(\n this.prefix + key,\n JSON.stringify({ value, expiresAt })\n );\n } catch (err) {\n // localStorage quota exceeded → silently ignore\n console.warn(\"[Zubbl SDK][Storage] Failed to persist item:\", err);\n }\n }\n\n remove(key: string): void {\n localStorage.removeItem(this.prefix + key);\n }\n}\n\n// ------------------------------------------------------\n// Factory\n// ------------------------------------------------------\n\nexport function createStorage(): IStorage {\n if (isNode) return new NodeStorage();\n if (isBrowser) return new BrowserStorage();\n\n // Fallback: safe no-op storage for tests / fake environments\n return {\n get: () => null,\n set: () => {},\n remove: () => {},\n };\n}\n\n","// -----------------------------------------------------------\n// 🌍 Zubbl Geo Engine — Multi-Provider Fallback + 15min Cache\n// -----------------------------------------------------------\n// Fully typed, aligns with Zubbl GEO Enforcement Policy\n// -----------------------------------------------------------\n\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// -----------------------------------------------------------\n// Types\n// -----------------------------------------------------------\nexport interface GeoPrivacy {\n vpn: boolean;\n hosting: boolean;\n}\n\nexport interface GeoInfo {\n ip: string | null;\n country: string;\n asn: string | null;\n privacy: GeoPrivacy;\n}\n\nconst GEO_CACHE_KEY = \"zubbl-geo-cache\";\nconst GEO_TTL_MS = 15 * 60 * 1000; // 15 minutes\n\n// -----------------------------------------------------------\n// 🗃 Cache Helpers\n// -----------------------------------------------------------\nfunction loadGeoCache(): GeoInfo | null {\n try {\n if (!isBrowser || typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(GEO_CACHE_KEY);\n if (!raw) return null;\n\n const parsed = JSON.parse(raw) as { data: GeoInfo; timestamp: number };\n if (!parsed.data?.ip || Date.now() - parsed.timestamp > GEO_TTL_MS) return null;\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nfunction saveGeoCache(data: GeoInfo): void {\n try {\n if (!isBrowser || typeof localStorage === \"undefined\") return;\n localStorage.setItem(GEO_CACHE_KEY, JSON.stringify({ data, timestamp: Date.now() }));\n } catch {}\n}\n\n// -----------------------------------------------------------\n// 🌐 Provider Wrappers\n// -----------------------------------------------------------\nasync function fetchJSON(url: string, timeoutMs = 3000): Promise<any> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const resp = await fetch(url, { signal: controller.signal });\n clearTimeout(timeout);\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n return await resp.json();\n } catch (err) {\n clearTimeout(timeout);\n throw err;\n }\n}\n\nasync function providerIpInfo(): Promise<GeoInfo> {\n const d = await fetchJSON(\"https://ipinfo.io/json?token=public\");\n return {\n ip: d.ip || null,\n country: d.country || \"unknown\",\n asn: d.org?.replace(/^AS/, \"\") || null,\n privacy: { vpn: false, hosting: false },\n };\n}\n\nasync function providerIpApi(): Promise<GeoInfo> {\n const d = await fetchJSON(\"https://ipapi.co/json/\");\n return {\n ip: d.ip || null,\n country: d.country_code || \"unknown\",\n asn: d.asn?.replace(/^AS/, \"\") || null,\n privacy: { vpn: false, hosting: false },\n };\n}\n\nasync function providerGeoJs(): Promise<GeoInfo> {\n const d = await fetchJSON(\"https://get.geojs.io/v1/ip/geo.json\");\n return {\n ip: d.ip || null,\n country: d.country_code || \"unknown\",\n asn: null,\n privacy: { vpn: false, hosting: false },\n };\n}\n\n// -----------------------------------------------------------\n// 🧠 Fallback Resolver\n// -----------------------------------------------------------\nexport async function getGeoInfo(): Promise<GeoInfo> {\n const cached = loadGeoCache();\n if (cached) return cached;\n\n const providers = [providerIpInfo, providerIpApi, providerGeoJs];\n for (const fn of providers) {\n try {\n const result = await fn();\n if (result?.country && result.country !== \"unknown\") {\n saveGeoCache(result);\n return result;\n }\n } catch (err: any) {\n console.warn(\"[Zubbl SDK][Geo] Provider failed:\", fn.name, \"-\", err.message);\n }\n }\n\n const fallback: GeoInfo = {\n ip: null,\n country: \"unknown\",\n asn: null,\n privacy: { vpn: false, hosting: false },\n };\n saveGeoCache(fallback);\n return fallback;\n}\n\n// -----------------------------------------------------------\n// 🧩 Exported Helpers\n// -----------------------------------------------------------\nexport function clearGeoCache(): void {\n try {\n if (isBrowser && typeof localStorage !== \"undefined\") {\n localStorage.removeItem(GEO_CACHE_KEY);\n }\n } catch {}\n}\n\nexport async function getGeoHeaders(): Promise<Record<string, string>> {\n const geo = await getGeoInfo();\n return {\n \"X-Zubbl-Geo-Country\": geo.country || \"unknown\",\n \"X-Zubbl-ASN\": geo.asn || \"unknown\",\n \"X-Zubbl-IP\": geo.ip || \"\",\n \"X-Zubbl-Privacy-VPN\": String(geo.privacy?.vpn ?? false),\n \"X-Zubbl-Privacy-Hosting\": String(geo.privacy?.hosting ?? false),\n };\n}\n","// -----------------------------------------------------------\n// 🔐 Secure Signing & Nonce Generator\n// -----------------------------------------------------------\n\nimport crypto from \"crypto\";\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// -----------------------------------------------------------\n// Generate UUIDv4 Nonce\n// -----------------------------------------------------------\nexport function generateNonce(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// -----------------------------------------------------------\n// Compute SHA256 HMAC signature\n// -----------------------------------------------------------\nexport async function signPayload(payload: string, secret: string): Promise<string> {\n if (isNode) {\n // ✅ Node.js native HMAC\n return crypto.createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n }\n\n // ✅ Browser / Worker using WebCrypto\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n const key = await window.crypto.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n );\n\n const sig = await window.crypto.subtle.sign(\n \"HMAC\",\n key,\n new TextEncoder().encode(payload)\n );\n\n return Array.from(new Uint8Array(sig))\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n throw new Error(\"No crypto implementation available in this environment\");\n}\n\n// -----------------------------------------------------------\n// Attach signing headers to a request (corrected for SDK-12)\n// -----------------------------------------------------------\nexport function attachSigningHeaders(\n url: string,\n method: string,\n headers: Record<string, string> = {},\n body?: any,\n secretKey?: string | null\n): void {\n const nonce = generateNonce();\n\n // Normalize body to a string before hashing\n const normalizedBody =\n typeof body === \"string\"\n ? body\n : body && typeof body === \"object\"\n ? JSON.stringify(body)\n : \"\";\n\n const bodyHash = normalizedBody\n ? crypto.createHash(\"sha256\").update(normalizedBody).digest(\"hex\")\n : \"\";\n\n // Compute canonical string (deterministic)\n const canonical = `${method.toUpperCase()}\\n${url}\\n${nonce}\\n${bodyHash}`;\n\n // Attach nonce and signature headers (in-place)\n headers[\"X-Zubbl-Nonce\"] = nonce;\n\n if (secretKey) {\n const signature = crypto\n .createHmac(\"sha256\", secretKey)\n .update(canonical)\n .digest(\"hex\");\n headers[\"X-Zubbl-Signature\"] = signature;\n }\n}\n","// src/core/http.ts\n// -----------------------------------------------------------\n// HTTP utility (instance-safe)\n// -----------------------------------------------------------\n\nimport { recordContextSample, getAdaptiveHeaders } from \"./context\";\nimport { attachSigningHeaders } from \"./signing\";\n\n\n/**\n * Performs a safe HTTP request with adaptive + signing headers.\n * NOTE: no global getConfig() dependency — caller must provide fully resolved URL + headers.\n */\nexport async function httpRequest(url: string, options: RequestInit = {}): Promise<Response> {\n // 🔧 Default timeout lowered for SDK-12 hardening\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n try {\n const method = (options.method || \"GET\").toUpperCase();\n const body = options.body;\n const headers: Record<string, string> = {\n ...(options.headers as Record<string, string>),\n ...getAdaptiveHeaders(),\n };\n\n // ✅ FIX: include url, method, headers, body\n attachSigningHeaders(url, method, headers, body);\n\n const finalOptions: RequestInit = {\n ...options,\n method,\n headers,\n signal: controller.signal,\n };\n\n // Record adaptive context sample\n recordContextSample(\"/http\", \"GET\", 200, 123);\n\n const response = await fetch(url, finalOptions);\n\n if (!response.ok) {\n console.warn(`[Zubbl SDK][HTTP] ${response.status} on ${url}`);\n }\n\n return response;\n } catch (err: any) {\n console.error(\"[Zubbl SDK][HTTP] Request failed:\", err?.message);\n throw err;\n } finally {\n clearTimeout(timeout);\n }\n}\n","// src/features/identifyUser.ts\n// -----------------------------------------------------------\n// Zubbl SDK — Instance-safe identifyUser feature\n// -----------------------------------------------------------\n\nimport { httpRequest } from \"../core/http\";\nimport { createStorage } from \"../core/storage\";\nimport { getAdaptiveHeaders } from \"../core/context\";\nimport { getGeoHeaders } from \"../core/geo\";\n\nconst USER_CACHE_KEY = \"external_user_id\";\nconst USER_TTL = 24 * 60 * 60; // 24h\n\nexport async function identifyUserFeature(\n store: any,\n { email, name }: { email: string; name?: string }\n) {\n if (!email) throw new Error(\"email is required\");\n\n const config = store.get();\n const storage = createStorage();\n\n // Check cache\n const cached = storage.get<{ id: string }>(USER_CACHE_KEY);\n if (cached?.id) {\n return { external_user_id: cached.id, cached: true };\n }\n\n const adaptiveHeaders = getAdaptiveHeaders();\n const geoHeaders = await getGeoHeaders();\n\n // ✅ Use per-instance config store, not global buildHeaders()\n const headers = store.buildHeaders({\n \"Content-Type\": \"application/json\",\n ...adaptiveHeaders,\n ...geoHeaders,\n });\n\n const resp = await httpRequest(`${config.baseUrl}/sdk/identify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ email, name }),\n });\n\n const data = await resp.json().catch(() => ({}));\n const { external_user_id } = data;\n\n if (!external_user_id) {\n throw new Error(\"Backend did not return external_user_id\");\n }\n\n storage.set(USER_CACHE_KEY, { id: external_user_id }, USER_TTL);\n return { external_user_id, cached: false };\n}\n","// src/features/getTiles.ts\n// -----------------------------------------------------------\n// Zubbl SDK — Instance-safe getTiles feature\n// -----------------------------------------------------------\n\nimport { httpRequest } from \"../core/http\";\nimport { createStorage } from \"../core/storage\";\nimport { getAdaptiveHeaders } from \"../core/context\";\nimport { getGeoHeaders } from \"../core/geo\";\n\n\nconst TILE_CACHE_KEY = \"tiles_cache\";\nconst TILE_TTL_DEFAULT = 10 * 60; // 10 min\n\ninterface TileCacheEntry {\n data: any;\n etag?: string;\n expiresAt: number;\n}\n\nexport async function getTilesFeature(\n store: any,\n { external_user_id, app_id = null, ttlSeconds = TILE_TTL_DEFAULT }: any\n) {\n const config = store.get();\n const storage = createStorage();\n\n const cached = storage.get<TileCacheEntry>(TILE_CACHE_KEY);\n const isFresh = cached && cached.expiresAt > Date.now();\n\n if (isFresh) {\n backgroundRefresh(store, external_user_id, app_id, ttlSeconds);\n return { data: cached.data, fromCache: true };\n }\n\n try {\n const adaptiveHeaders = getAdaptiveHeaders();\n const geoHeaders = await getGeoHeaders();\n\n // ✅ Use instance store, not global buildHeaders()\n const headers = store.buildHeaders({\n \"X-External-User-Id\": external_user_id,\n ...adaptiveHeaders,\n ...geoHeaders,\n });\n\n // Modern endpoint: POST /api/sdk/policies with body (per architecture docs)\nconst payload = {\n tenant_id: config.tenantId,\n app_id: app_id || config.appId!,\n external_user_id,\n};\n\nconst resp = await httpRequest(`${config.baseUrl.replace(/\\/$/, \"\")}/api/sdk/policies`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n});\n\n if (resp.status === 304 && cached?.data) {\n cached.expiresAt = Date.now() + ttlSeconds * 1000;\n storage.set(TILE_CACHE_KEY, cached, ttlSeconds);\n return { data: cached.data, fromCache: true, status: 304 };\n }\n\n const data = await resp.json();\n const etag = resp.headers.get(\"ETag\") || undefined;\n\n const entry: TileCacheEntry = {\n data,\n etag,\n expiresAt: Date.now() + ttlSeconds * 1000,\n };\n storage.set(TILE_CACHE_KEY, entry, ttlSeconds);\n\n return { data, fromCache: false, status: resp.status };\n } catch (err) {\n if (cached?.data) {\n return { data: cached.data, fromCache: true, error: String(err) };\n }\n throw err;\n }\n}\n\nasync function backgroundRefresh(store: any, external_user_id: string, app_id: string | null, ttlSeconds: number) {\n try {\n await getTilesFeature(store, { external_user_id, app_id, ttlSeconds });\n } catch {\n // Silent background failure\n }\n}\n","// src/client.ts\n// -----------------------------------------------------------\n// Zubbl SDK — Final Instance-based Client (Feature Delegation)\n// -----------------------------------------------------------\n\nimport * as ConfigModule from \"./core/config\";\nimport { createStorage } from \"./core/storage\";\nimport { getGeoInfo } from \"./core/geo\";\n\n// Feature modules\nimport { identifyUserFeature } from \"./features/identifyUser\";\nimport { getTilesFeature } from \"./features/getTiles\";\n\n\nexport type ZubblConfig = {\n apiKey: string;\n tenantId: string;\n appId: string;\n baseUrl?: string;\n injectWorkerHeaders?: boolean;\n workerSecret?: string | null;\n};\n\n/**\n * Creates a self-contained, instance-based Zubbl client.\n * Each instance owns its own config store and initialization state.\n */\nexport function createZubblClient(cfg: ZubblConfig) {\n const store = ConfigModule.createConfigStore();\n const storage = createStorage();\n let initialized = false;\n\n async function init() {\n if (initialized) return;\n\n // ✅ Validate UUIDs before initializing\n const UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n if (!UUID_PATTERN.test(cfg.tenantId)) {\n throw new Error(`[Zubbl SDK] Invalid tenantId: expected UUID, got \"${cfg.tenantId}\"`);\n }\n\n if (!UUID_PATTERN.test(cfg.appId)) {\n throw new Error(`[Zubbl SDK] Invalid appId: expected UUID, got \"${cfg.appId}\"`);\n }\n\n // Initialize per-client config\n store.init(cfg);\n\n // Optional: GEO bootstrap\n try {\n const geo = await getGeoInfo();\n console.log(`[Zubbl SDK] 🌍 GEO detected: ${geo.country} (ASN ${geo.asn || \"?\"})`);\n } catch (err: any) {\n console.warn(\"[Zubbl SDK] GEO init failed:\", err?.message);\n }\n\n initialized = true;\n }\n\n function assertInitialized() {\n if (!initialized) {\n throw new Error(\"Zubbl client not initialized — call client.init() first\");\n }\n }\n\n // ---------------------------------------------------------\n // User + Tile Operations (delegated to feature modules)\n // ---------------------------------------------------------\n async function identifyUser({ email, name }: { email: string; name?: string }) {\n assertInitialized();\n return identifyUserFeature(store, { email, name });\n }\n\n async function getTiles({\n external_user_id,\n app_id = null,\n ttlSeconds,\n }: {\n external_user_id: string;\n app_id?: string | null;\n ttlSeconds?: number;\n }) {\n assertInitialized();\n return getTilesFeature(store, { external_user_id, app_id, ttlSeconds });\n }\n\n // ---------------------------------------------------------\n // Enforcement API (kept inline)\n // ---------------------------------------------------------\n async function enforce({\n external_user_id,\n app_id = null,\n }: {\n external_user_id: string;\n app_id?: string | null;\n }) {\n assertInitialized();\n\n const config = store.get();\n const headers = store.buildHeaders({\n \"X-External-User-Id\": external_user_id,\n });\n\n const resp = await fetch(`${config.baseUrl?.replace(/\\/$/, \"\")}/sdk/test-enforcement`, {\n method: \"POST\",\n headers,\n });\n\n const json = await resp.json().catch(() => ({}));\n return { decision: \"allow\", status: resp.status, data: json };\n }\n\n // ---------------------------------------------------------\n // Public API\n // ---------------------------------------------------------\n return {\n init,\n identifyUser,\n getTiles,\n enforce,\n storage,\n };\n}\n","// src/index.ts\n// -----------------------------------------------------------\n// Zubbl SDK Entry Point — Public Exports\n// -----------------------------------------------------------\n\n// Core factory + environment\nexport * from \"./core/config\";\nexport * from \"./core/context\";\nexport * from \"./core/storage\";\nexport * from \"./core/geo\";\n\n// Avoid duplicate export of ZubblConfig\nexport {\n createZubblClient, // 🔁 change this if your client.ts exports something else\n} from \"./client\";\n\n// Feature modules (optional direct access)\nexport * from \"./features/identifyUser\";\nexport * from \"./features/getTiles\";\n\nconsole.log(\"[Zubbl SDK] ✅ Entry point loaded\");\n"],"names":["ConfigModule.createConfigStore"],"mappings":"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"}
|
package/dist/zubbl-sdk.esm.js
CHANGED
|
@@ -11,14 +11,53 @@ const isNode = typeof process !== "undefined" &&
|
|
|
11
11
|
const isWorker = typeof self !== "undefined" &&
|
|
12
12
|
typeof self.importScripts === "function" &&
|
|
13
13
|
!isNode;
|
|
14
|
+
function assertBrowserSafety(cfg) {
|
|
15
|
+
if (isBrowser || isWorker) {
|
|
16
|
+
const key = cfg.apiKey ?? "";
|
|
17
|
+
const looksSecret = key.startsWith("sk_") || key.length > 40;
|
|
18
|
+
if (looksSecret) {
|
|
19
|
+
throw new Error("[Zubbl SDK] Secret or server key detected in browser environment. " +
|
|
20
|
+
"Use a public SDK key instead (prefix pk_).");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
14
24
|
/**
|
|
15
25
|
* Creates an isolated configuration store.
|
|
16
26
|
* Each ZubblClient instance owns its own store.
|
|
17
27
|
*/
|
|
18
28
|
function createConfigStore(initial) {
|
|
19
|
-
|
|
29
|
+
let current = {
|
|
30
|
+
apiKey: null,
|
|
31
|
+
tenantId: null,
|
|
32
|
+
appId: null,
|
|
33
|
+
baseUrl: "https://api.zubbl.com/api",
|
|
34
|
+
injectWorkerHeaders: false,
|
|
35
|
+
workerSecret: null,
|
|
20
36
|
...initial,
|
|
21
|
-
}
|
|
37
|
+
};
|
|
38
|
+
function init(partial) {
|
|
39
|
+
current = { ...current, ...partial };
|
|
40
|
+
assertBrowserSafety(current);
|
|
41
|
+
}
|
|
42
|
+
function get() {
|
|
43
|
+
return current;
|
|
44
|
+
}
|
|
45
|
+
function buildHeaders(extra = {}) {
|
|
46
|
+
if (!current.tenantId || !current.appId) {
|
|
47
|
+
throw new Error("[Zubbl SDK] Not initialized – call init() first.");
|
|
48
|
+
}
|
|
49
|
+
const headers = {
|
|
50
|
+
"X-Tenant-Id": current.tenantId,
|
|
51
|
+
"X-App-Id": current.appId,
|
|
52
|
+
"Content-Type": "application/json",
|
|
53
|
+
...extra,
|
|
54
|
+
};
|
|
55
|
+
if (current.apiKey) {
|
|
56
|
+
headers.Authorization = `Bearer ${current.apiKey}`;
|
|
57
|
+
}
|
|
58
|
+
return headers;
|
|
59
|
+
}
|
|
60
|
+
return { init, get, buildHeaders };
|
|
22
61
|
}
|
|
23
62
|
|
|
24
63
|
// src/core/context.ts
|
|
@@ -411,7 +450,7 @@ async function httpRequest(url, options = {}) {
|
|
|
411
450
|
signal: controller.signal,
|
|
412
451
|
};
|
|
413
452
|
// Record adaptive context sample
|
|
414
|
-
recordContextSample();
|
|
453
|
+
recordContextSample("/http", "GET", 200, 123);
|
|
415
454
|
const response = await fetch(url, finalOptions);
|
|
416
455
|
if (!response.ok) {
|
|
417
456
|
console.warn(`[Zubbl SDK][HTTP] ${response.status} on ${url}`);
|
|
@@ -489,12 +528,17 @@ async function getTilesFeature(store, { external_user_id, app_id = null, ttlSeco
|
|
|
489
528
|
...adaptiveHeaders,
|
|
490
529
|
...geoHeaders,
|
|
491
530
|
});
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
531
|
+
// Modern endpoint: POST /api/sdk/policies with body (per architecture docs)
|
|
532
|
+
const payload = {
|
|
533
|
+
tenant_id: config.tenantId,
|
|
534
|
+
app_id: app_id || config.appId,
|
|
535
|
+
external_user_id,
|
|
536
|
+
};
|
|
537
|
+
const resp = await httpRequest(`${config.baseUrl.replace(/\/$/, "")}/api/sdk/policies`, {
|
|
538
|
+
method: "POST",
|
|
539
|
+
headers,
|
|
540
|
+
body: JSON.stringify(payload),
|
|
541
|
+
});
|
|
498
542
|
if (resp.status === 304 && cached?.data) {
|
|
499
543
|
cached.expiresAt = Date.now() + ttlSeconds * 1000;
|
|
500
544
|
storage.set(TILE_CACHE_KEY, cached, ttlSeconds);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zubbl-sdk.esm.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/core/storage.ts","../src/core/geo.ts","../src/core/signing.ts","../src/core/http.ts","../src/features/identifyUser.ts","../src/features/getTiles.ts","../src/client.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zubbl-sdk.esm.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/core/storage.ts","../src/core/geo.ts","../src/core/signing.ts","../src/core/http.ts","../src/features/identifyUser.ts","../src/features/getTiles.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["// src/core/config.ts\n// -----------------------------------------------------------\n// Universal environment detection + SDK configuration\n// -----------------------------------------------------------\n\nexport const isBrowser =\n typeof window !== \"undefined\" && typeof window.document !== \"undefined\";\n\nexport const isNode =\n typeof process !== \"undefined\" &&\n !!process.versions?.node &&\n !isBrowser;\n\nexport const isWorker =\n typeof self !== \"undefined\" &&\n typeof (self as any).importScripts === \"function\" &&\n !isNode;\n\n// -----------------------------------------------------------\n// Config store factory (no module-scoped state)\n// -----------------------------------------------------------\n\nexport interface ZubblConfig {\n apiKey: string | null;\n tenantId: string | null;\n appId: string | null;\n baseUrl: string;\n injectWorkerHeaders?: boolean;\n workerSecret?: string | null;\n}\n\nfunction assertBrowserSafety(cfg: ZubblConfig) {\n if (isBrowser || isWorker) {\n const key = cfg.apiKey ?? \"\";\n const looksSecret = key.startsWith(\"sk_\") || key.length > 40;\n if (looksSecret) {\n throw new Error(\n \"[Zubbl SDK] Secret or server key detected in browser environment. \" +\n \"Use a public SDK key instead (prefix pk_).\"\n );\n }\n }\n}\n\n/**\n * Creates an isolated configuration store.\n * Each ZubblClient instance owns its own store.\n */\nexport function createConfigStore(initial?: Partial<ZubblConfig>) {\n let current: ZubblConfig = {\n apiKey: null,\n tenantId: null,\n appId: null,\n baseUrl: \"https://api.zubbl.com/api\",\n injectWorkerHeaders: false,\n workerSecret: null,\n ...initial,\n };\n\n function init(partial: Partial<ZubblConfig>) {\n current = { ...current, ...partial };\n assertBrowserSafety(current);\n }\n\n function get(): Readonly<ZubblConfig> {\n return current;\n }\n\n function buildHeaders(extra: Record<string, string> = {}): Record<string, string> {\n if (!current.tenantId || !current.appId) {\n throw new Error(\"[Zubbl SDK] Not initialized – call init() first.\");\n }\n\n const headers: Record<string, string> = {\n \"X-Tenant-Id\": current.tenantId,\n \"X-App-Id\": current.appId,\n \"Content-Type\": \"application/json\",\n ...extra,\n };\n\n if (current.apiKey) {\n headers.Authorization = `Bearer ${current.apiKey}`;\n }\n\n return headers;\n}\n\n return { init, get, buildHeaders };\n}\n\n","// src/core/context.ts\n// -----------------------------------------------------------\n// Adaptive Context Engine — Geo + Stability Enrichment + Persistence\n// -----------------------------------------------------------\n\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// -----------------------------------------------------------\n// Types\n// -----------------------------------------------------------\ninterface ContextSample {\n path: string;\n method: string;\n ts: number;\n status: number;\n latency: number;\n}\n\ninterface AdaptiveState {\n routes: ContextSample[];\n geo: string;\n stability: number;\n lastGeoChange: number;\n}\n\nconst MAX_HISTORY = 100;\nconst CACHE_KEY = \"zubbl-stability\";\n\nlet state: AdaptiveState = loadStability() ?? {\n routes: [],\n geo: \"unknown\",\n stability: 1.0,\n lastGeoChange: Date.now(),\n};\n\n// -----------------------------------------------------------\n// 💾 Persistence Helpers\n// -----------------------------------------------------------\nfunction loadStability(): AdaptiveState | null {\n if (!isBrowser || typeof localStorage === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!parsed.geo || !parsed.stability) return null;\n return { ...parsed, routes: [] };\n } catch {\n return null;\n }\n}\n\nfunction saveStability() {\n if (!isBrowser || typeof localStorage === \"undefined\") return;\n try {\n const payload = {\n geo: state.geo,\n stability: state.stability,\n lastGeoChange: state.lastGeoChange,\n };\n localStorage.setItem(CACHE_KEY, JSON.stringify(payload));\n } catch {\n /* ignore */\n }\n}\n\n// -----------------------------------------------------------\n// 🌍 Geo Detection (Node, Browser, Worker)\n// -----------------------------------------------------------\nexport function detectGeo(): string {\n try {\n if (isBrowser && typeof window !== \"undefined\" && window.navigator?.language) {\n return window.navigator.language.split(\"-\")[1] || \"unknown\";\n }\n\n if (isWorker && typeof self !== \"undefined\" && (self as any).navigator?.language) {\n return (self as any).navigator.language.split(\"-\")[1] || \"unknown\";\n }\n\n if (isNode && typeof process !== \"undefined\") {\n const envGeo = process.env.ZUBBL_GEO || process.env.GEO;\n if (envGeo && /^[A-Z]{2}$/i.test(envGeo)) return envGeo.toUpperCase();\n return \"GB\";\n }\n\n return \"unknown\";\n } catch (err) {\n console.warn(\"[Zubbl SDK][Geo Detect] Failed:\", err);\n return \"unknown\";\n }\n}\n\n// -----------------------------------------------------------\n// 🧭 Update Geo & Stability (with persistence)\n// -----------------------------------------------------------\nexport function updateGeo(geoHint?: string) {\n const newGeo = geoHint || detectGeo();\n if (newGeo !== state.geo) {\n const now = Date.now();\n const elapsed = (now - state.lastGeoChange) / 1000;\n state.stability = Math.max(0.5, Math.min(1.0, elapsed / 3600));\n state.geo = newGeo;\n state.lastGeoChange = now;\n saveStability();\n } else {\n state.stability = Math.min(1.0, state.stability + 0.01);\n saveStability();\n }\n}\n\n// -----------------------------------------------------------\n// 🧮 Record Context Samples\n// -----------------------------------------------------------\nexport function recordContextSample(\n path: string,\n method: string,\n status: number,\n latency: number\n) {\n state.routes.push({ path, method, ts: Date.now(), status, latency });\n if (state.routes.length > MAX_HISTORY) state.routes.shift();\n updateGeo(); // auto-refresh geo info\n}\n\n// -----------------------------------------------------------\n// 📦 Get Adaptive Headers\n// -----------------------------------------------------------\nexport function getAdaptiveHeaders(): Record<string, string> {\n const currentGeo = detectGeo();\n updateGeo(currentGeo);\n\n const summary = btoa(\n JSON.stringify({\n env: isNode ? \"node\" : isBrowser ? \"browser\" : \"worker\",\n routeCount: state.routes.length,\n lastGeo: state.geo,\n avgLatency:\n state.routes.reduce((a, b) => a + b.latency, 0) /\n Math.max(1, state.routes.length),\n })\n );\n\n return {\n \"X-Zubbl-Context-Summary\": summary,\n \"X-Zubbl-Geo-Stability\": `${state.geo}/${state.stability.toFixed(2)}`,\n };\n}\n\n// -----------------------------------------------------------\n// 🌍 Initialize Geo Context Immediately\n// -----------------------------------------------------------\nupdateGeo(process.env.ZUBBL_GEO);\n\n","// src/core/storage.ts\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// Generic storage interface\nexport interface IStorage {\n get<T>(key: string): T | null;\n set<T>(key: string, value: T, ttlSeconds?: number): void;\n remove(key: string): void;\n}\n\n// ------------------------------------------------------\n// Node (in-memory) implementation\n// ------------------------------------------------------\n\nclass NodeStorage implements IStorage {\n private store = new Map<string, { value: any; expiresAt?: number }>();\n\n get<T>(key: string): T | null {\n const entry = this.store.get(key);\n if (!entry) return null;\n if (entry.expiresAt && entry.expiresAt < Date.now()) {\n this.store.delete(key);\n return null;\n }\n return entry.value as T;\n }\n\n set<T>(key: string, value: T, ttlSeconds?: number): void {\n const expiresAt = ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined;\n this.store.set(key, { value, expiresAt });\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n}\n\n// ------------------------------------------------------\n// Browser (localStorage) implementation\n// ------------------------------------------------------\n\nclass BrowserStorage implements IStorage {\n private prefix = \"zubbl_sdk_\";\n\n get<T>(key: string): T | null {\n try {\n const raw = localStorage.getItem(this.prefix + key);\n if (!raw) return null;\n const { value, expiresAt } = JSON.parse(raw);\n if (expiresAt && expiresAt < Date.now()) {\n localStorage.removeItem(this.prefix + key);\n return null;\n }\n return value as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T, ttlSeconds?: number): void {\n try {\n const expiresAt = ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined;\n localStorage.setItem(\n this.prefix + key,\n JSON.stringify({ value, expiresAt })\n );\n } catch (err) {\n // localStorage quota exceeded → silently ignore\n console.warn(\"[Zubbl SDK][Storage] Failed to persist item:\", err);\n }\n }\n\n remove(key: string): void {\n localStorage.removeItem(this.prefix + key);\n }\n}\n\n// ------------------------------------------------------\n// Factory\n// ------------------------------------------------------\n\nexport function createStorage(): IStorage {\n if (isNode) return new NodeStorage();\n if (isBrowser) return new BrowserStorage();\n\n // Fallback: safe no-op storage for tests / fake environments\n return {\n get: () => null,\n set: () => {},\n remove: () => {},\n };\n}\n\n","// -----------------------------------------------------------\n// 🌍 Zubbl Geo Engine — Multi-Provider Fallback + 15min Cache\n// -----------------------------------------------------------\n// Fully typed, aligns with Zubbl GEO Enforcement Policy\n// -----------------------------------------------------------\n\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// -----------------------------------------------------------\n// Types\n// -----------------------------------------------------------\nexport interface GeoPrivacy {\n vpn: boolean;\n hosting: boolean;\n}\n\nexport interface GeoInfo {\n ip: string | null;\n country: string;\n asn: string | null;\n privacy: GeoPrivacy;\n}\n\nconst GEO_CACHE_KEY = \"zubbl-geo-cache\";\nconst GEO_TTL_MS = 15 * 60 * 1000; // 15 minutes\n\n// -----------------------------------------------------------\n// 🗃 Cache Helpers\n// -----------------------------------------------------------\nfunction loadGeoCache(): GeoInfo | null {\n try {\n if (!isBrowser || typeof localStorage === \"undefined\") return null;\n const raw = localStorage.getItem(GEO_CACHE_KEY);\n if (!raw) return null;\n\n const parsed = JSON.parse(raw) as { data: GeoInfo; timestamp: number };\n if (!parsed.data?.ip || Date.now() - parsed.timestamp > GEO_TTL_MS) return null;\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nfunction saveGeoCache(data: GeoInfo): void {\n try {\n if (!isBrowser || typeof localStorage === \"undefined\") return;\n localStorage.setItem(GEO_CACHE_KEY, JSON.stringify({ data, timestamp: Date.now() }));\n } catch {}\n}\n\n// -----------------------------------------------------------\n// 🌐 Provider Wrappers\n// -----------------------------------------------------------\nasync function fetchJSON(url: string, timeoutMs = 3000): Promise<any> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const resp = await fetch(url, { signal: controller.signal });\n clearTimeout(timeout);\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n return await resp.json();\n } catch (err) {\n clearTimeout(timeout);\n throw err;\n }\n}\n\nasync function providerIpInfo(): Promise<GeoInfo> {\n const d = await fetchJSON(\"https://ipinfo.io/json?token=public\");\n return {\n ip: d.ip || null,\n country: d.country || \"unknown\",\n asn: d.org?.replace(/^AS/, \"\") || null,\n privacy: { vpn: false, hosting: false },\n };\n}\n\nasync function providerIpApi(): Promise<GeoInfo> {\n const d = await fetchJSON(\"https://ipapi.co/json/\");\n return {\n ip: d.ip || null,\n country: d.country_code || \"unknown\",\n asn: d.asn?.replace(/^AS/, \"\") || null,\n privacy: { vpn: false, hosting: false },\n };\n}\n\nasync function providerGeoJs(): Promise<GeoInfo> {\n const d = await fetchJSON(\"https://get.geojs.io/v1/ip/geo.json\");\n return {\n ip: d.ip || null,\n country: d.country_code || \"unknown\",\n asn: null,\n privacy: { vpn: false, hosting: false },\n };\n}\n\n// -----------------------------------------------------------\n// 🧠 Fallback Resolver\n// -----------------------------------------------------------\nexport async function getGeoInfo(): Promise<GeoInfo> {\n const cached = loadGeoCache();\n if (cached) return cached;\n\n const providers = [providerIpInfo, providerIpApi, providerGeoJs];\n for (const fn of providers) {\n try {\n const result = await fn();\n if (result?.country && result.country !== \"unknown\") {\n saveGeoCache(result);\n return result;\n }\n } catch (err: any) {\n console.warn(\"[Zubbl SDK][Geo] Provider failed:\", fn.name, \"-\", err.message);\n }\n }\n\n const fallback: GeoInfo = {\n ip: null,\n country: \"unknown\",\n asn: null,\n privacy: { vpn: false, hosting: false },\n };\n saveGeoCache(fallback);\n return fallback;\n}\n\n// -----------------------------------------------------------\n// 🧩 Exported Helpers\n// -----------------------------------------------------------\nexport function clearGeoCache(): void {\n try {\n if (isBrowser && typeof localStorage !== \"undefined\") {\n localStorage.removeItem(GEO_CACHE_KEY);\n }\n } catch {}\n}\n\nexport async function getGeoHeaders(): Promise<Record<string, string>> {\n const geo = await getGeoInfo();\n return {\n \"X-Zubbl-Geo-Country\": geo.country || \"unknown\",\n \"X-Zubbl-ASN\": geo.asn || \"unknown\",\n \"X-Zubbl-IP\": geo.ip || \"\",\n \"X-Zubbl-Privacy-VPN\": String(geo.privacy?.vpn ?? false),\n \"X-Zubbl-Privacy-Hosting\": String(geo.privacy?.hosting ?? false),\n };\n}\n","// -----------------------------------------------------------\n// 🔐 Secure Signing & Nonce Generator\n// -----------------------------------------------------------\n\nimport crypto from \"crypto\";\nimport { isNode, isBrowser, isWorker } from \"./config\";\n\n// -----------------------------------------------------------\n// Generate UUIDv4 Nonce\n// -----------------------------------------------------------\nexport function generateNonce(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// -----------------------------------------------------------\n// Compute SHA256 HMAC signature\n// -----------------------------------------------------------\nexport async function signPayload(payload: string, secret: string): Promise<string> {\n if (isNode) {\n // ✅ Node.js native HMAC\n return crypto.createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n }\n\n // ✅ Browser / Worker using WebCrypto\n if (typeof window !== \"undefined\" && window.crypto?.subtle) {\n const key = await window.crypto.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n );\n\n const sig = await window.crypto.subtle.sign(\n \"HMAC\",\n key,\n new TextEncoder().encode(payload)\n );\n\n return Array.from(new Uint8Array(sig))\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n throw new Error(\"No crypto implementation available in this environment\");\n}\n\n// -----------------------------------------------------------\n// Attach signing headers to a request (corrected for SDK-12)\n// -----------------------------------------------------------\nexport function attachSigningHeaders(\n url: string,\n method: string,\n headers: Record<string, string> = {},\n body?: any,\n secretKey?: string | null\n): void {\n const nonce = generateNonce();\n\n // Normalize body to a string before hashing\n const normalizedBody =\n typeof body === \"string\"\n ? body\n : body && typeof body === \"object\"\n ? JSON.stringify(body)\n : \"\";\n\n const bodyHash = normalizedBody\n ? crypto.createHash(\"sha256\").update(normalizedBody).digest(\"hex\")\n : \"\";\n\n // Compute canonical string (deterministic)\n const canonical = `${method.toUpperCase()}\\n${url}\\n${nonce}\\n${bodyHash}`;\n\n // Attach nonce and signature headers (in-place)\n headers[\"X-Zubbl-Nonce\"] = nonce;\n\n if (secretKey) {\n const signature = crypto\n .createHmac(\"sha256\", secretKey)\n .update(canonical)\n .digest(\"hex\");\n headers[\"X-Zubbl-Signature\"] = signature;\n }\n}\n","// src/core/http.ts\n// -----------------------------------------------------------\n// HTTP utility (instance-safe)\n// -----------------------------------------------------------\n\nimport { recordContextSample, getAdaptiveHeaders } from \"./context\";\nimport { attachSigningHeaders } from \"./signing\";\n\n\n/**\n * Performs a safe HTTP request with adaptive + signing headers.\n * NOTE: no global getConfig() dependency — caller must provide fully resolved URL + headers.\n */\nexport async function httpRequest(url: string, options: RequestInit = {}): Promise<Response> {\n // 🔧 Default timeout lowered for SDK-12 hardening\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n try {\n const method = (options.method || \"GET\").toUpperCase();\n const body = options.body;\n const headers: Record<string, string> = {\n ...(options.headers as Record<string, string>),\n ...getAdaptiveHeaders(),\n };\n\n // ✅ FIX: include url, method, headers, body\n attachSigningHeaders(url, method, headers, body);\n\n const finalOptions: RequestInit = {\n ...options,\n method,\n headers,\n signal: controller.signal,\n };\n\n // Record adaptive context sample\n recordContextSample(\"/http\", \"GET\", 200, 123);\n\n const response = await fetch(url, finalOptions);\n\n if (!response.ok) {\n console.warn(`[Zubbl SDK][HTTP] ${response.status} on ${url}`);\n }\n\n return response;\n } catch (err: any) {\n console.error(\"[Zubbl SDK][HTTP] Request failed:\", err?.message);\n throw err;\n } finally {\n clearTimeout(timeout);\n }\n}\n","// src/features/identifyUser.ts\n// -----------------------------------------------------------\n// Zubbl SDK — Instance-safe identifyUser feature\n// -----------------------------------------------------------\n\nimport { httpRequest } from \"../core/http\";\nimport { createStorage } from \"../core/storage\";\nimport { getAdaptiveHeaders } from \"../core/context\";\nimport { getGeoHeaders } from \"../core/geo\";\n\nconst USER_CACHE_KEY = \"external_user_id\";\nconst USER_TTL = 24 * 60 * 60; // 24h\n\nexport async function identifyUserFeature(\n store: any,\n { email, name }: { email: string; name?: string }\n) {\n if (!email) throw new Error(\"email is required\");\n\n const config = store.get();\n const storage = createStorage();\n\n // Check cache\n const cached = storage.get<{ id: string }>(USER_CACHE_KEY);\n if (cached?.id) {\n return { external_user_id: cached.id, cached: true };\n }\n\n const adaptiveHeaders = getAdaptiveHeaders();\n const geoHeaders = await getGeoHeaders();\n\n // ✅ Use per-instance config store, not global buildHeaders()\n const headers = store.buildHeaders({\n \"Content-Type\": \"application/json\",\n ...adaptiveHeaders,\n ...geoHeaders,\n });\n\n const resp = await httpRequest(`${config.baseUrl}/sdk/identify`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ email, name }),\n });\n\n const data = await resp.json().catch(() => ({}));\n const { external_user_id } = data;\n\n if (!external_user_id) {\n throw new Error(\"Backend did not return external_user_id\");\n }\n\n storage.set(USER_CACHE_KEY, { id: external_user_id }, USER_TTL);\n return { external_user_id, cached: false };\n}\n","// src/features/getTiles.ts\n// -----------------------------------------------------------\n// Zubbl SDK — Instance-safe getTiles feature\n// -----------------------------------------------------------\n\nimport { httpRequest } from \"../core/http\";\nimport { createStorage } from \"../core/storage\";\nimport { getAdaptiveHeaders } from \"../core/context\";\nimport { getGeoHeaders } from \"../core/geo\";\n\n\nconst TILE_CACHE_KEY = \"tiles_cache\";\nconst TILE_TTL_DEFAULT = 10 * 60; // 10 min\n\ninterface TileCacheEntry {\n data: any;\n etag?: string;\n expiresAt: number;\n}\n\nexport async function getTilesFeature(\n store: any,\n { external_user_id, app_id = null, ttlSeconds = TILE_TTL_DEFAULT }: any\n) {\n const config = store.get();\n const storage = createStorage();\n\n const cached = storage.get<TileCacheEntry>(TILE_CACHE_KEY);\n const isFresh = cached && cached.expiresAt > Date.now();\n\n if (isFresh) {\n backgroundRefresh(store, external_user_id, app_id, ttlSeconds);\n return { data: cached.data, fromCache: true };\n }\n\n try {\n const adaptiveHeaders = getAdaptiveHeaders();\n const geoHeaders = await getGeoHeaders();\n\n // ✅ Use instance store, not global buildHeaders()\n const headers = store.buildHeaders({\n \"X-External-User-Id\": external_user_id,\n ...adaptiveHeaders,\n ...geoHeaders,\n });\n\n // Modern endpoint: POST /api/sdk/policies with body (per architecture docs)\nconst payload = {\n tenant_id: config.tenantId,\n app_id: app_id || config.appId!,\n external_user_id,\n};\n\nconst resp = await httpRequest(`${config.baseUrl.replace(/\\/$/, \"\")}/api/sdk/policies`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n});\n\n if (resp.status === 304 && cached?.data) {\n cached.expiresAt = Date.now() + ttlSeconds * 1000;\n storage.set(TILE_CACHE_KEY, cached, ttlSeconds);\n return { data: cached.data, fromCache: true, status: 304 };\n }\n\n const data = await resp.json();\n const etag = resp.headers.get(\"ETag\") || undefined;\n\n const entry: TileCacheEntry = {\n data,\n etag,\n expiresAt: Date.now() + ttlSeconds * 1000,\n };\n storage.set(TILE_CACHE_KEY, entry, ttlSeconds);\n\n return { data, fromCache: false, status: resp.status };\n } catch (err) {\n if (cached?.data) {\n return { data: cached.data, fromCache: true, error: String(err) };\n }\n throw err;\n }\n}\n\nasync function backgroundRefresh(store: any, external_user_id: string, app_id: string | null, ttlSeconds: number) {\n try {\n await getTilesFeature(store, { external_user_id, app_id, ttlSeconds });\n } catch {\n // Silent background failure\n }\n}\n","// src/client.ts\n// -----------------------------------------------------------\n// Zubbl SDK — Final Instance-based Client (Feature Delegation)\n// -----------------------------------------------------------\n\nimport * as ConfigModule from \"./core/config\";\nimport { createStorage } from \"./core/storage\";\nimport { getGeoInfo } from \"./core/geo\";\n\n// Feature modules\nimport { identifyUserFeature } from \"./features/identifyUser\";\nimport { getTilesFeature } from \"./features/getTiles\";\n\n\nexport type ZubblConfig = {\n apiKey: string;\n tenantId: string;\n appId: string;\n baseUrl?: string;\n injectWorkerHeaders?: boolean;\n workerSecret?: string | null;\n};\n\n/**\n * Creates a self-contained, instance-based Zubbl client.\n * Each instance owns its own config store and initialization state.\n */\nexport function createZubblClient(cfg: ZubblConfig) {\n const store = ConfigModule.createConfigStore();\n const storage = createStorage();\n let initialized = false;\n\n async function init() {\n if (initialized) return;\n\n // ✅ Validate UUIDs before initializing\n const UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n if (!UUID_PATTERN.test(cfg.tenantId)) {\n throw new Error(`[Zubbl SDK] Invalid tenantId: expected UUID, got \"${cfg.tenantId}\"`);\n }\n\n if (!UUID_PATTERN.test(cfg.appId)) {\n throw new Error(`[Zubbl SDK] Invalid appId: expected UUID, got \"${cfg.appId}\"`);\n }\n\n // Initialize per-client config\n store.init(cfg);\n\n // Optional: GEO bootstrap\n try {\n const geo = await getGeoInfo();\n console.log(`[Zubbl SDK] 🌍 GEO detected: ${geo.country} (ASN ${geo.asn || \"?\"})`);\n } catch (err: any) {\n console.warn(\"[Zubbl SDK] GEO init failed:\", err?.message);\n }\n\n initialized = true;\n }\n\n function assertInitialized() {\n if (!initialized) {\n throw new Error(\"Zubbl client not initialized — call client.init() first\");\n }\n }\n\n // ---------------------------------------------------------\n // User + Tile Operations (delegated to feature modules)\n // ---------------------------------------------------------\n async function identifyUser({ email, name }: { email: string; name?: string }) {\n assertInitialized();\n return identifyUserFeature(store, { email, name });\n }\n\n async function getTiles({\n external_user_id,\n app_id = null,\n ttlSeconds,\n }: {\n external_user_id: string;\n app_id?: string | null;\n ttlSeconds?: number;\n }) {\n assertInitialized();\n return getTilesFeature(store, { external_user_id, app_id, ttlSeconds });\n }\n\n // ---------------------------------------------------------\n // Enforcement API (kept inline)\n // ---------------------------------------------------------\n async function enforce({\n external_user_id,\n app_id = null,\n }: {\n external_user_id: string;\n app_id?: string | null;\n }) {\n assertInitialized();\n\n const config = store.get();\n const headers = store.buildHeaders({\n \"X-External-User-Id\": external_user_id,\n });\n\n const resp = await fetch(`${config.baseUrl?.replace(/\\/$/, \"\")}/sdk/test-enforcement`, {\n method: \"POST\",\n headers,\n });\n\n const json = await resp.json().catch(() => ({}));\n return { decision: \"allow\", status: resp.status, data: json };\n }\n\n // ---------------------------------------------------------\n // Public API\n // ---------------------------------------------------------\n return {\n init,\n identifyUser,\n getTiles,\n enforce,\n storage,\n };\n}\n","// src/index.ts\n// -----------------------------------------------------------\n// Zubbl SDK Entry Point — Public Exports\n// -----------------------------------------------------------\n\n// Core factory + environment\nexport * from \"./core/config\";\nexport * from \"./core/context\";\nexport * from \"./core/storage\";\nexport * from \"./core/geo\";\n\n// Avoid duplicate export of ZubblConfig\nexport {\n createZubblClient, // 🔁 change this if your client.ts exports something else\n} from \"./client\";\n\n// Feature modules (optional direct access)\nexport * from \"./features/identifyUser\";\nexport * from \"./features/getTiles\";\n\nconsole.log(\"[Zubbl SDK] ✅ Entry point loaded\");\n"],"names":["ConfigModule.createConfigStore"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zubbl-sdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.31",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Zubbl SDK for secure policy enforcement (browser, Node, universal)",
|
|
6
6
|
"main": "dist/zubbl-sdk.cjs.js",
|
|
7
7
|
"module": "dist/zubbl-sdk.esm.js",
|
|
8
|
-
"
|
|
9
|
-
"types": "src/index.d.ts",
|
|
8
|
+
"types": "dist/types/index.d.ts",
|
|
10
9
|
"exports": {
|
|
11
10
|
".": {
|
|
12
11
|
"import": "./dist/zubbl-sdk.esm.js",
|
|
@@ -28,10 +27,11 @@
|
|
|
28
27
|
"author": "Zubbl",
|
|
29
28
|
"license": "MIT",
|
|
30
29
|
"devDependencies": {
|
|
31
|
-
"@rollup/plugin-
|
|
32
|
-
"@rollup/plugin-
|
|
30
|
+
"@rollup/plugin-commonjs": "^29.0.0",
|
|
31
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
33
32
|
"jest": "^30.1.3",
|
|
34
|
-
"rollup": "^4.
|
|
33
|
+
"rollup": "^4.55.1",
|
|
34
|
+
"rollup-plugin-typescript2": "^0.36.0",
|
|
35
35
|
"typescript": "^5.9.3"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
package/dist/zubbl-sdk.umd.js
DELETED
|
@@ -1,636 +0,0 @@
|
|
|
1
|
-
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('crypto')) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', 'crypto'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ZubblSdk = {}, global.crypto));
|
|
5
|
-
})(this, (function (exports, crypto) { 'use strict';
|
|
6
|
-
|
|
7
|
-
// src/core/config.ts
|
|
8
|
-
// -----------------------------------------------------------
|
|
9
|
-
// Universal environment detection + SDK configuration
|
|
10
|
-
// -----------------------------------------------------------
|
|
11
|
-
const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
|
|
12
|
-
const isNode = typeof process !== "undefined" &&
|
|
13
|
-
!!process.versions?.node &&
|
|
14
|
-
!isBrowser;
|
|
15
|
-
const isWorker = typeof self !== "undefined" &&
|
|
16
|
-
typeof self.importScripts === "function" &&
|
|
17
|
-
!isNode;
|
|
18
|
-
/**
|
|
19
|
-
* Creates an isolated configuration store.
|
|
20
|
-
* Each ZubblClient instance owns its own store.
|
|
21
|
-
*/
|
|
22
|
-
function createConfigStore(initial) {
|
|
23
|
-
({
|
|
24
|
-
...initial,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// src/core/context.ts
|
|
29
|
-
// -----------------------------------------------------------
|
|
30
|
-
// Adaptive Context Engine — Geo + Stability Enrichment + Persistence
|
|
31
|
-
// -----------------------------------------------------------
|
|
32
|
-
const MAX_HISTORY = 100;
|
|
33
|
-
const CACHE_KEY = "zubbl-stability";
|
|
34
|
-
let state = loadStability() ?? {
|
|
35
|
-
routes: [],
|
|
36
|
-
geo: "unknown",
|
|
37
|
-
stability: 1.0,
|
|
38
|
-
lastGeoChange: Date.now(),
|
|
39
|
-
};
|
|
40
|
-
// -----------------------------------------------------------
|
|
41
|
-
// 💾 Persistence Helpers
|
|
42
|
-
// -----------------------------------------------------------
|
|
43
|
-
function loadStability() {
|
|
44
|
-
if (!isBrowser || typeof localStorage === "undefined")
|
|
45
|
-
return null;
|
|
46
|
-
try {
|
|
47
|
-
const raw = localStorage.getItem(CACHE_KEY);
|
|
48
|
-
if (!raw)
|
|
49
|
-
return null;
|
|
50
|
-
const parsed = JSON.parse(raw);
|
|
51
|
-
if (!parsed.geo || !parsed.stability)
|
|
52
|
-
return null;
|
|
53
|
-
return { ...parsed, routes: [] };
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function saveStability() {
|
|
60
|
-
if (!isBrowser || typeof localStorage === "undefined")
|
|
61
|
-
return;
|
|
62
|
-
try {
|
|
63
|
-
const payload = {
|
|
64
|
-
geo: state.geo,
|
|
65
|
-
stability: state.stability,
|
|
66
|
-
lastGeoChange: state.lastGeoChange,
|
|
67
|
-
};
|
|
68
|
-
localStorage.setItem(CACHE_KEY, JSON.stringify(payload));
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
/* ignore */
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// -----------------------------------------------------------
|
|
75
|
-
// 🌍 Geo Detection (Node, Browser, Worker)
|
|
76
|
-
// -----------------------------------------------------------
|
|
77
|
-
function detectGeo() {
|
|
78
|
-
try {
|
|
79
|
-
if (isBrowser && typeof window !== "undefined" && window.navigator?.language) {
|
|
80
|
-
return window.navigator.language.split("-")[1] || "unknown";
|
|
81
|
-
}
|
|
82
|
-
if (isWorker && typeof self !== "undefined" && self.navigator?.language) {
|
|
83
|
-
return self.navigator.language.split("-")[1] || "unknown";
|
|
84
|
-
}
|
|
85
|
-
if (isNode && typeof process !== "undefined") {
|
|
86
|
-
const envGeo = process.env.ZUBBL_GEO || process.env.GEO;
|
|
87
|
-
if (envGeo && /^[A-Z]{2}$/i.test(envGeo))
|
|
88
|
-
return envGeo.toUpperCase();
|
|
89
|
-
return "GB";
|
|
90
|
-
}
|
|
91
|
-
return "unknown";
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
console.warn("[Zubbl SDK][Geo Detect] Failed:", err);
|
|
95
|
-
return "unknown";
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
// -----------------------------------------------------------
|
|
99
|
-
// 🧭 Update Geo & Stability (with persistence)
|
|
100
|
-
// -----------------------------------------------------------
|
|
101
|
-
function updateGeo(geoHint) {
|
|
102
|
-
const newGeo = geoHint || detectGeo();
|
|
103
|
-
if (newGeo !== state.geo) {
|
|
104
|
-
const now = Date.now();
|
|
105
|
-
const elapsed = (now - state.lastGeoChange) / 1000;
|
|
106
|
-
state.stability = Math.max(0.5, Math.min(1.0, elapsed / 3600));
|
|
107
|
-
state.geo = newGeo;
|
|
108
|
-
state.lastGeoChange = now;
|
|
109
|
-
saveStability();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
state.stability = Math.min(1.0, state.stability + 0.01);
|
|
113
|
-
saveStability();
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// -----------------------------------------------------------
|
|
117
|
-
// 🧮 Record Context Samples
|
|
118
|
-
// -----------------------------------------------------------
|
|
119
|
-
function recordContextSample(path, method, status, latency) {
|
|
120
|
-
state.routes.push({ path, method, ts: Date.now(), status, latency });
|
|
121
|
-
if (state.routes.length > MAX_HISTORY)
|
|
122
|
-
state.routes.shift();
|
|
123
|
-
updateGeo(); // auto-refresh geo info
|
|
124
|
-
}
|
|
125
|
-
// -----------------------------------------------------------
|
|
126
|
-
// 📦 Get Adaptive Headers
|
|
127
|
-
// -----------------------------------------------------------
|
|
128
|
-
function getAdaptiveHeaders() {
|
|
129
|
-
const currentGeo = detectGeo();
|
|
130
|
-
updateGeo(currentGeo);
|
|
131
|
-
const summary = btoa(JSON.stringify({
|
|
132
|
-
env: isNode ? "node" : isBrowser ? "browser" : "worker",
|
|
133
|
-
routeCount: state.routes.length,
|
|
134
|
-
lastGeo: state.geo,
|
|
135
|
-
avgLatency: state.routes.reduce((a, b) => a + b.latency, 0) /
|
|
136
|
-
Math.max(1, state.routes.length),
|
|
137
|
-
}));
|
|
138
|
-
return {
|
|
139
|
-
"X-Zubbl-Context-Summary": summary,
|
|
140
|
-
"X-Zubbl-Geo-Stability": `${state.geo}/${state.stability.toFixed(2)}`,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
// -----------------------------------------------------------
|
|
144
|
-
// 🌍 Initialize Geo Context Immediately
|
|
145
|
-
// -----------------------------------------------------------
|
|
146
|
-
updateGeo(process.env.ZUBBL_GEO);
|
|
147
|
-
|
|
148
|
-
// src/core/storage.ts
|
|
149
|
-
// ------------------------------------------------------
|
|
150
|
-
// Node (in-memory) implementation
|
|
151
|
-
// ------------------------------------------------------
|
|
152
|
-
class NodeStorage {
|
|
153
|
-
constructor() {
|
|
154
|
-
this.store = new Map();
|
|
155
|
-
}
|
|
156
|
-
get(key) {
|
|
157
|
-
const entry = this.store.get(key);
|
|
158
|
-
if (!entry)
|
|
159
|
-
return null;
|
|
160
|
-
if (entry.expiresAt && entry.expiresAt < Date.now()) {
|
|
161
|
-
this.store.delete(key);
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
return entry.value;
|
|
165
|
-
}
|
|
166
|
-
set(key, value, ttlSeconds) {
|
|
167
|
-
const expiresAt = ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined;
|
|
168
|
-
this.store.set(key, { value, expiresAt });
|
|
169
|
-
}
|
|
170
|
-
remove(key) {
|
|
171
|
-
this.store.delete(key);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// ------------------------------------------------------
|
|
175
|
-
// Browser (localStorage) implementation
|
|
176
|
-
// ------------------------------------------------------
|
|
177
|
-
class BrowserStorage {
|
|
178
|
-
constructor() {
|
|
179
|
-
this.prefix = "zubbl_sdk_";
|
|
180
|
-
}
|
|
181
|
-
get(key) {
|
|
182
|
-
try {
|
|
183
|
-
const raw = localStorage.getItem(this.prefix + key);
|
|
184
|
-
if (!raw)
|
|
185
|
-
return null;
|
|
186
|
-
const { value, expiresAt } = JSON.parse(raw);
|
|
187
|
-
if (expiresAt && expiresAt < Date.now()) {
|
|
188
|
-
localStorage.removeItem(this.prefix + key);
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
return value;
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
return null;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
set(key, value, ttlSeconds) {
|
|
198
|
-
try {
|
|
199
|
-
const expiresAt = ttlSeconds ? Date.now() + ttlSeconds * 1000 : undefined;
|
|
200
|
-
localStorage.setItem(this.prefix + key, JSON.stringify({ value, expiresAt }));
|
|
201
|
-
}
|
|
202
|
-
catch (err) {
|
|
203
|
-
// localStorage quota exceeded → silently ignore
|
|
204
|
-
console.warn("[Zubbl SDK][Storage] Failed to persist item:", err);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
remove(key) {
|
|
208
|
-
localStorage.removeItem(this.prefix + key);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// ------------------------------------------------------
|
|
212
|
-
// Factory
|
|
213
|
-
// ------------------------------------------------------
|
|
214
|
-
function createStorage() {
|
|
215
|
-
if (isNode)
|
|
216
|
-
return new NodeStorage();
|
|
217
|
-
if (isBrowser)
|
|
218
|
-
return new BrowserStorage();
|
|
219
|
-
// Fallback: safe no-op storage for tests / fake environments
|
|
220
|
-
return {
|
|
221
|
-
get: () => null,
|
|
222
|
-
set: () => { },
|
|
223
|
-
remove: () => { },
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// -----------------------------------------------------------
|
|
228
|
-
// 🌍 Zubbl Geo Engine — Multi-Provider Fallback + 15min Cache
|
|
229
|
-
// -----------------------------------------------------------
|
|
230
|
-
// Fully typed, aligns with Zubbl GEO Enforcement Policy
|
|
231
|
-
// -----------------------------------------------------------
|
|
232
|
-
const GEO_CACHE_KEY = "zubbl-geo-cache";
|
|
233
|
-
const GEO_TTL_MS = 15 * 60 * 1000; // 15 minutes
|
|
234
|
-
// -----------------------------------------------------------
|
|
235
|
-
// 🗃 Cache Helpers
|
|
236
|
-
// -----------------------------------------------------------
|
|
237
|
-
function loadGeoCache() {
|
|
238
|
-
try {
|
|
239
|
-
if (!isBrowser || typeof localStorage === "undefined")
|
|
240
|
-
return null;
|
|
241
|
-
const raw = localStorage.getItem(GEO_CACHE_KEY);
|
|
242
|
-
if (!raw)
|
|
243
|
-
return null;
|
|
244
|
-
const parsed = JSON.parse(raw);
|
|
245
|
-
if (!parsed.data?.ip || Date.now() - parsed.timestamp > GEO_TTL_MS)
|
|
246
|
-
return null;
|
|
247
|
-
return parsed.data;
|
|
248
|
-
}
|
|
249
|
-
catch {
|
|
250
|
-
return null;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
function saveGeoCache(data) {
|
|
254
|
-
try {
|
|
255
|
-
if (!isBrowser || typeof localStorage === "undefined")
|
|
256
|
-
return;
|
|
257
|
-
localStorage.setItem(GEO_CACHE_KEY, JSON.stringify({ data, timestamp: Date.now() }));
|
|
258
|
-
}
|
|
259
|
-
catch { }
|
|
260
|
-
}
|
|
261
|
-
// -----------------------------------------------------------
|
|
262
|
-
// 🌐 Provider Wrappers
|
|
263
|
-
// -----------------------------------------------------------
|
|
264
|
-
async function fetchJSON(url, timeoutMs = 3000) {
|
|
265
|
-
const controller = new AbortController();
|
|
266
|
-
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
267
|
-
try {
|
|
268
|
-
const resp = await fetch(url, { signal: controller.signal });
|
|
269
|
-
clearTimeout(timeout);
|
|
270
|
-
if (!resp.ok)
|
|
271
|
-
throw new Error(`HTTP ${resp.status}`);
|
|
272
|
-
return await resp.json();
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
clearTimeout(timeout);
|
|
276
|
-
throw err;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
async function providerIpInfo() {
|
|
280
|
-
const d = await fetchJSON("https://ipinfo.io/json?token=public");
|
|
281
|
-
return {
|
|
282
|
-
ip: d.ip || null,
|
|
283
|
-
country: d.country || "unknown",
|
|
284
|
-
asn: d.org?.replace(/^AS/, "") || null,
|
|
285
|
-
privacy: { vpn: false, hosting: false },
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
async function providerIpApi() {
|
|
289
|
-
const d = await fetchJSON("https://ipapi.co/json/");
|
|
290
|
-
return {
|
|
291
|
-
ip: d.ip || null,
|
|
292
|
-
country: d.country_code || "unknown",
|
|
293
|
-
asn: d.asn?.replace(/^AS/, "") || null,
|
|
294
|
-
privacy: { vpn: false, hosting: false },
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
async function providerGeoJs() {
|
|
298
|
-
const d = await fetchJSON("https://get.geojs.io/v1/ip/geo.json");
|
|
299
|
-
return {
|
|
300
|
-
ip: d.ip || null,
|
|
301
|
-
country: d.country_code || "unknown",
|
|
302
|
-
asn: null,
|
|
303
|
-
privacy: { vpn: false, hosting: false },
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
// -----------------------------------------------------------
|
|
307
|
-
// 🧠 Fallback Resolver
|
|
308
|
-
// -----------------------------------------------------------
|
|
309
|
-
async function getGeoInfo() {
|
|
310
|
-
const cached = loadGeoCache();
|
|
311
|
-
if (cached)
|
|
312
|
-
return cached;
|
|
313
|
-
const providers = [providerIpInfo, providerIpApi, providerGeoJs];
|
|
314
|
-
for (const fn of providers) {
|
|
315
|
-
try {
|
|
316
|
-
const result = await fn();
|
|
317
|
-
if (result?.country && result.country !== "unknown") {
|
|
318
|
-
saveGeoCache(result);
|
|
319
|
-
return result;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
catch (err) {
|
|
323
|
-
console.warn("[Zubbl SDK][Geo] Provider failed:", fn.name, "-", err.message);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
const fallback = {
|
|
327
|
-
ip: null,
|
|
328
|
-
country: "unknown",
|
|
329
|
-
asn: null,
|
|
330
|
-
privacy: { vpn: false, hosting: false },
|
|
331
|
-
};
|
|
332
|
-
saveGeoCache(fallback);
|
|
333
|
-
return fallback;
|
|
334
|
-
}
|
|
335
|
-
// -----------------------------------------------------------
|
|
336
|
-
// 🧩 Exported Helpers
|
|
337
|
-
// -----------------------------------------------------------
|
|
338
|
-
function clearGeoCache() {
|
|
339
|
-
try {
|
|
340
|
-
if (isBrowser && typeof localStorage !== "undefined") {
|
|
341
|
-
localStorage.removeItem(GEO_CACHE_KEY);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
catch { }
|
|
345
|
-
}
|
|
346
|
-
async function getGeoHeaders() {
|
|
347
|
-
const geo = await getGeoInfo();
|
|
348
|
-
return {
|
|
349
|
-
"X-Zubbl-Geo-Country": geo.country || "unknown",
|
|
350
|
-
"X-Zubbl-ASN": geo.asn || "unknown",
|
|
351
|
-
"X-Zubbl-IP": geo.ip || "",
|
|
352
|
-
"X-Zubbl-Privacy-VPN": String(geo.privacy?.vpn ?? false),
|
|
353
|
-
"X-Zubbl-Privacy-Hosting": String(geo.privacy?.hosting ?? false),
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// -----------------------------------------------------------
|
|
358
|
-
// 🔐 Secure Signing & Nonce Generator
|
|
359
|
-
// -----------------------------------------------------------
|
|
360
|
-
// -----------------------------------------------------------
|
|
361
|
-
// Generate UUIDv4 Nonce
|
|
362
|
-
// -----------------------------------------------------------
|
|
363
|
-
function generateNonce() {
|
|
364
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
|
|
365
|
-
const r = (Math.random() * 16) | 0;
|
|
366
|
-
const v = c === "x" ? r : (r & 0x3) | 0x8;
|
|
367
|
-
return v.toString(16);
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
// -----------------------------------------------------------
|
|
371
|
-
// Attach signing headers to a request (corrected for SDK-12)
|
|
372
|
-
// -----------------------------------------------------------
|
|
373
|
-
function attachSigningHeaders(url, method, headers = {}, body, secretKey) {
|
|
374
|
-
const nonce = generateNonce();
|
|
375
|
-
// Normalize body to a string before hashing
|
|
376
|
-
const normalizedBody = typeof body === "string"
|
|
377
|
-
? body
|
|
378
|
-
: body && typeof body === "object"
|
|
379
|
-
? JSON.stringify(body)
|
|
380
|
-
: "";
|
|
381
|
-
const bodyHash = normalizedBody
|
|
382
|
-
? crypto.createHash("sha256").update(normalizedBody).digest("hex")
|
|
383
|
-
: "";
|
|
384
|
-
// Compute canonical string (deterministic)
|
|
385
|
-
`${method.toUpperCase()}\n${url}\n${nonce}\n${bodyHash}`;
|
|
386
|
-
// Attach nonce and signature headers (in-place)
|
|
387
|
-
headers["X-Zubbl-Nonce"] = nonce;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// src/core/http.ts
|
|
391
|
-
// -----------------------------------------------------------
|
|
392
|
-
// HTTP utility (instance-safe)
|
|
393
|
-
// -----------------------------------------------------------
|
|
394
|
-
/**
|
|
395
|
-
* Performs a safe HTTP request with adaptive + signing headers.
|
|
396
|
-
* NOTE: no global getConfig() dependency — caller must provide fully resolved URL + headers.
|
|
397
|
-
*/
|
|
398
|
-
async function httpRequest(url, options = {}) {
|
|
399
|
-
// 🔧 Default timeout lowered for SDK-12 hardening
|
|
400
|
-
const controller = new AbortController();
|
|
401
|
-
const timeout = setTimeout(() => controller.abort(), 8000);
|
|
402
|
-
try {
|
|
403
|
-
const method = (options.method || "GET").toUpperCase();
|
|
404
|
-
const body = options.body;
|
|
405
|
-
const headers = {
|
|
406
|
-
...options.headers,
|
|
407
|
-
...getAdaptiveHeaders(),
|
|
408
|
-
};
|
|
409
|
-
// ✅ FIX: include url, method, headers, body
|
|
410
|
-
attachSigningHeaders(url, method, headers, body);
|
|
411
|
-
const finalOptions = {
|
|
412
|
-
...options,
|
|
413
|
-
method,
|
|
414
|
-
headers,
|
|
415
|
-
signal: controller.signal,
|
|
416
|
-
};
|
|
417
|
-
// Record adaptive context sample
|
|
418
|
-
recordContextSample();
|
|
419
|
-
const response = await fetch(url, finalOptions);
|
|
420
|
-
if (!response.ok) {
|
|
421
|
-
console.warn(`[Zubbl SDK][HTTP] ${response.status} on ${url}`);
|
|
422
|
-
}
|
|
423
|
-
return response;
|
|
424
|
-
}
|
|
425
|
-
catch (err) {
|
|
426
|
-
console.error("[Zubbl SDK][HTTP] Request failed:", err?.message);
|
|
427
|
-
throw err;
|
|
428
|
-
}
|
|
429
|
-
finally {
|
|
430
|
-
clearTimeout(timeout);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
// src/features/identifyUser.ts
|
|
435
|
-
// -----------------------------------------------------------
|
|
436
|
-
// Zubbl SDK — Instance-safe identifyUser feature
|
|
437
|
-
// -----------------------------------------------------------
|
|
438
|
-
const USER_CACHE_KEY = "external_user_id";
|
|
439
|
-
const USER_TTL = 24 * 60 * 60; // 24h
|
|
440
|
-
async function identifyUserFeature(store, { email, name }) {
|
|
441
|
-
if (!email)
|
|
442
|
-
throw new Error("email is required");
|
|
443
|
-
const config = store.get();
|
|
444
|
-
const storage = createStorage();
|
|
445
|
-
// Check cache
|
|
446
|
-
const cached = storage.get(USER_CACHE_KEY);
|
|
447
|
-
if (cached?.id) {
|
|
448
|
-
return { external_user_id: cached.id, cached: true };
|
|
449
|
-
}
|
|
450
|
-
const adaptiveHeaders = getAdaptiveHeaders();
|
|
451
|
-
const geoHeaders = await getGeoHeaders();
|
|
452
|
-
// ✅ Use per-instance config store, not global buildHeaders()
|
|
453
|
-
const headers = store.buildHeaders({
|
|
454
|
-
"Content-Type": "application/json",
|
|
455
|
-
...adaptiveHeaders,
|
|
456
|
-
...geoHeaders,
|
|
457
|
-
});
|
|
458
|
-
const resp = await httpRequest(`${config.baseUrl}/sdk/identify`, {
|
|
459
|
-
method: "POST",
|
|
460
|
-
headers,
|
|
461
|
-
body: JSON.stringify({ email, name }),
|
|
462
|
-
});
|
|
463
|
-
const data = await resp.json().catch(() => ({}));
|
|
464
|
-
const { external_user_id } = data;
|
|
465
|
-
if (!external_user_id) {
|
|
466
|
-
throw new Error("Backend did not return external_user_id");
|
|
467
|
-
}
|
|
468
|
-
storage.set(USER_CACHE_KEY, { id: external_user_id }, USER_TTL);
|
|
469
|
-
return { external_user_id, cached: false };
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
// src/features/getTiles.ts
|
|
473
|
-
// -----------------------------------------------------------
|
|
474
|
-
// Zubbl SDK — Instance-safe getTiles feature
|
|
475
|
-
// -----------------------------------------------------------
|
|
476
|
-
const TILE_CACHE_KEY = "tiles_cache";
|
|
477
|
-
const TILE_TTL_DEFAULT = 10 * 60; // 10 min
|
|
478
|
-
async function getTilesFeature(store, { external_user_id, app_id = null, ttlSeconds = TILE_TTL_DEFAULT }) {
|
|
479
|
-
const config = store.get();
|
|
480
|
-
const storage = createStorage();
|
|
481
|
-
const cached = storage.get(TILE_CACHE_KEY);
|
|
482
|
-
const isFresh = cached && cached.expiresAt > Date.now();
|
|
483
|
-
if (isFresh) {
|
|
484
|
-
backgroundRefresh(store, external_user_id, app_id, ttlSeconds);
|
|
485
|
-
return { data: cached.data, fromCache: true };
|
|
486
|
-
}
|
|
487
|
-
try {
|
|
488
|
-
const adaptiveHeaders = getAdaptiveHeaders();
|
|
489
|
-
const geoHeaders = await getGeoHeaders();
|
|
490
|
-
// ✅ Use instance store, not global buildHeaders()
|
|
491
|
-
const headers = store.buildHeaders({
|
|
492
|
-
"X-External-User-Id": external_user_id,
|
|
493
|
-
...adaptiveHeaders,
|
|
494
|
-
...geoHeaders,
|
|
495
|
-
});
|
|
496
|
-
if (cached?.etag)
|
|
497
|
-
headers["If-None-Match"] = cached.etag;
|
|
498
|
-
const params = new URLSearchParams({ external_user_id });
|
|
499
|
-
params.set("app_id", app_id || config.appId);
|
|
500
|
-
const url = `${config.baseUrl.replace(/\/$/, "")}/tiles/effective?${params.toString()}`;
|
|
501
|
-
const resp = await httpRequest(url, { headers });
|
|
502
|
-
if (resp.status === 304 && cached?.data) {
|
|
503
|
-
cached.expiresAt = Date.now() + ttlSeconds * 1000;
|
|
504
|
-
storage.set(TILE_CACHE_KEY, cached, ttlSeconds);
|
|
505
|
-
return { data: cached.data, fromCache: true, status: 304 };
|
|
506
|
-
}
|
|
507
|
-
const data = await resp.json();
|
|
508
|
-
const etag = resp.headers.get("ETag") || undefined;
|
|
509
|
-
const entry = {
|
|
510
|
-
data,
|
|
511
|
-
etag,
|
|
512
|
-
expiresAt: Date.now() + ttlSeconds * 1000,
|
|
513
|
-
};
|
|
514
|
-
storage.set(TILE_CACHE_KEY, entry, ttlSeconds);
|
|
515
|
-
return { data, fromCache: false, status: resp.status };
|
|
516
|
-
}
|
|
517
|
-
catch (err) {
|
|
518
|
-
if (cached?.data) {
|
|
519
|
-
return { data: cached.data, fromCache: true, error: String(err) };
|
|
520
|
-
}
|
|
521
|
-
throw err;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
async function backgroundRefresh(store, external_user_id, app_id, ttlSeconds) {
|
|
525
|
-
try {
|
|
526
|
-
await getTilesFeature(store, { external_user_id, app_id, ttlSeconds });
|
|
527
|
-
}
|
|
528
|
-
catch {
|
|
529
|
-
// Silent background failure
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
// src/client.ts
|
|
534
|
-
// -----------------------------------------------------------
|
|
535
|
-
// Zubbl SDK — Final Instance-based Client (Feature Delegation)
|
|
536
|
-
// -----------------------------------------------------------
|
|
537
|
-
/**
|
|
538
|
-
* Creates a self-contained, instance-based Zubbl client.
|
|
539
|
-
* Each instance owns its own config store and initialization state.
|
|
540
|
-
*/
|
|
541
|
-
function createZubblClient(cfg) {
|
|
542
|
-
const store = createConfigStore();
|
|
543
|
-
const storage = createStorage();
|
|
544
|
-
let initialized = false;
|
|
545
|
-
async function init() {
|
|
546
|
-
if (initialized)
|
|
547
|
-
return;
|
|
548
|
-
// ✅ Validate UUIDs before initializing
|
|
549
|
-
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
550
|
-
if (!UUID_PATTERN.test(cfg.tenantId)) {
|
|
551
|
-
throw new Error(`[Zubbl SDK] Invalid tenantId: expected UUID, got "${cfg.tenantId}"`);
|
|
552
|
-
}
|
|
553
|
-
if (!UUID_PATTERN.test(cfg.appId)) {
|
|
554
|
-
throw new Error(`[Zubbl SDK] Invalid appId: expected UUID, got "${cfg.appId}"`);
|
|
555
|
-
}
|
|
556
|
-
// Initialize per-client config
|
|
557
|
-
store.init(cfg);
|
|
558
|
-
// Optional: GEO bootstrap
|
|
559
|
-
try {
|
|
560
|
-
const geo = await getGeoInfo();
|
|
561
|
-
console.log(`[Zubbl SDK] 🌍 GEO detected: ${geo.country} (ASN ${geo.asn || "?"})`);
|
|
562
|
-
}
|
|
563
|
-
catch (err) {
|
|
564
|
-
console.warn("[Zubbl SDK] GEO init failed:", err?.message);
|
|
565
|
-
}
|
|
566
|
-
initialized = true;
|
|
567
|
-
}
|
|
568
|
-
function assertInitialized() {
|
|
569
|
-
if (!initialized) {
|
|
570
|
-
throw new Error("Zubbl client not initialized — call client.init() first");
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
// ---------------------------------------------------------
|
|
574
|
-
// User + Tile Operations (delegated to feature modules)
|
|
575
|
-
// ---------------------------------------------------------
|
|
576
|
-
async function identifyUser({ email, name }) {
|
|
577
|
-
assertInitialized();
|
|
578
|
-
return identifyUserFeature(store, { email, name });
|
|
579
|
-
}
|
|
580
|
-
async function getTiles({ external_user_id, app_id = null, ttlSeconds, }) {
|
|
581
|
-
assertInitialized();
|
|
582
|
-
return getTilesFeature(store, { external_user_id, app_id, ttlSeconds });
|
|
583
|
-
}
|
|
584
|
-
// ---------------------------------------------------------
|
|
585
|
-
// Enforcement API (kept inline)
|
|
586
|
-
// ---------------------------------------------------------
|
|
587
|
-
async function enforce({ external_user_id, app_id = null, }) {
|
|
588
|
-
assertInitialized();
|
|
589
|
-
const config = store.get();
|
|
590
|
-
const headers = store.buildHeaders({
|
|
591
|
-
"X-External-User-Id": external_user_id,
|
|
592
|
-
});
|
|
593
|
-
const resp = await fetch(`${config.baseUrl?.replace(/\/$/, "")}/sdk/test-enforcement`, {
|
|
594
|
-
method: "POST",
|
|
595
|
-
headers,
|
|
596
|
-
});
|
|
597
|
-
const json = await resp.json().catch(() => ({}));
|
|
598
|
-
return { decision: "allow", status: resp.status, data: json };
|
|
599
|
-
}
|
|
600
|
-
// ---------------------------------------------------------
|
|
601
|
-
// Public API
|
|
602
|
-
// ---------------------------------------------------------
|
|
603
|
-
return {
|
|
604
|
-
init,
|
|
605
|
-
identifyUser,
|
|
606
|
-
getTiles,
|
|
607
|
-
enforce,
|
|
608
|
-
storage,
|
|
609
|
-
};
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
// src/index.ts
|
|
613
|
-
// -----------------------------------------------------------
|
|
614
|
-
// Zubbl SDK Entry Point — Public Exports
|
|
615
|
-
// -----------------------------------------------------------
|
|
616
|
-
// Core factory + environment
|
|
617
|
-
console.log("[Zubbl SDK] ✅ Entry point loaded");
|
|
618
|
-
|
|
619
|
-
exports.clearGeoCache = clearGeoCache;
|
|
620
|
-
exports.createConfigStore = createConfigStore;
|
|
621
|
-
exports.createStorage = createStorage;
|
|
622
|
-
exports.createZubblClient = createZubblClient;
|
|
623
|
-
exports.detectGeo = detectGeo;
|
|
624
|
-
exports.getAdaptiveHeaders = getAdaptiveHeaders;
|
|
625
|
-
exports.getGeoHeaders = getGeoHeaders;
|
|
626
|
-
exports.getGeoInfo = getGeoInfo;
|
|
627
|
-
exports.getTilesFeature = getTilesFeature;
|
|
628
|
-
exports.identifyUserFeature = identifyUserFeature;
|
|
629
|
-
exports.isBrowser = isBrowser;
|
|
630
|
-
exports.isNode = isNode;
|
|
631
|
-
exports.isWorker = isWorker;
|
|
632
|
-
exports.recordContextSample = recordContextSample;
|
|
633
|
-
exports.updateGeo = updateGeo;
|
|
634
|
-
|
|
635
|
-
}));
|
|
636
|
-
//# sourceMappingURL=zubbl-sdk.umd.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zubbl-sdk.umd.js","sources":["../src/core/config.ts","../src/core/context.ts","../src/core/storage.ts","../src/core/geo.ts","../src/core/signing.ts","../src/core/http.ts","../src/features/identifyUser.ts","../src/features/getTiles.ts","../src/client.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|