Skip to content

Commit

Permalink
[Analytics] Unify client analytics (#2224)
Browse files Browse the repository at this point in the history
Co-authored-by: ikethirdweb <[email protected]>
  • Loading branch information
0xFirekeeper and ikethirdweb authored Jan 31, 2024
1 parent 771bd1e commit 3ba1536
Show file tree
Hide file tree
Showing 34 changed files with 1,450 additions and 146 deletions.
10 changes: 10 additions & 0 deletions .changeset/lemon-numbers-knock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@thirdweb-dev/unity-js-bridge": patch
"@thirdweb-dev/react-native": patch
"@thirdweb-dev/storage": patch
"@thirdweb-dev/wallets": patch
"@thirdweb-dev/react": patch
"@thirdweb-dev/sdk": patch
---

Adds correct reporing headers
7 changes: 7 additions & 0 deletions .changeset/silly-dolphins-fly.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@thirdweb-dev/unity-js-bridge": patch
"@thirdweb-dev/react-native": patch
"@thirdweb-dev/react": patch
---

Adds global sdk vars
16 changes: 3 additions & 13 deletions packages/react-native/src/core/storage/uploader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ import {
TW_UPLOAD_SERVER_URL,
} from "@thirdweb-dev/storage";
import { IpfsUploaderOptions, UploadDataValue } from "./types";
import { appBundleId, packageVersion } from "../../evm/utils/version";
import { BUNDLE_ID_HEADER } from "../../evm/constants/headers";
import { getAnalyticsHeaders, setAnalyticsHeaders } from "./utils";

const METADATA_NAME = "Storage React Native SDK";

Expand Down Expand Up @@ -38,9 +37,6 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
keyvalues: { ...options?.metadata },
};

const { version, name: packageName } = packageVersion;
const platform = "react-native";

if ("uri" in data[0] && "type" in data[0] && "name" in data[0]) {
// then it's an array of files
return new Promise(async (resolve, reject) => {
Expand Down Expand Up @@ -140,14 +136,11 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
});

xhr.open("POST", `${TW_UPLOAD_SERVER_URL}/ipfs/upload`);
xhr.setRequestHeader(BUNDLE_ID_HEADER, appBundleId || ""); // only empty on web
if (this.clientId) {
xhr.setRequestHeader("x-client-id", this.clientId);
}

xhr.setRequestHeader("x-sdk-version", version);
xhr.setRequestHeader("x-sdk-name", packageName);
xhr.setRequestHeader("x-sdk-platform", platform);
setAnalyticsHeaders(xhr);

xhr.send(form);
});
Expand All @@ -165,12 +158,9 @@ export class IpfsUploader implements IStorageUploader<IpfsUploadBatchOptions> {
{
method: "POST",
headers: {
[BUNDLE_ID_HEADER]: appBundleId || "", // only empty on web
...(this.clientId ? { "x-client-id": this.clientId } : {}),
"Content-Type": "application/json",
"x-sdk-version": version,
"x-sdk-name": packageName,
"x-sdk-platform": platform,
...getAnalyticsHeaders(),
},
body: fetchBody,
},
Expand Down
50 changes: 50 additions & 0 deletions packages/react-native/src/core/storage/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { DEFAULT_GATEWAY_URLS, GatewayUrls } from "@thirdweb-dev/storage";
import { Platform } from "react-native";
import { appBundleId, packageVersion } from "../../evm/utils/version";

/**
* @internal
Expand Down Expand Up @@ -32,3 +34,51 @@ export function prepareGatewayUrls(

return allGatewayUrls;
}

export function setAnalyticsHeaders(xhr: XMLHttpRequest) {
const globals = getAnalyticsGlobals();
xhr.setRequestHeader("x-sdk-version", globals.x_sdk_version);
xhr.setRequestHeader("x-sdk-os", globals.x_sdk_os);
xhr.setRequestHeader("x-sdk-name", globals.x_sdk_name);
xhr.setRequestHeader("x-sdk-platform", globals.x_sdk_platform);
xhr.setRequestHeader("x-bundle-id", globals.app_bundle_id);
}

export function getAnalyticsHeaders() {
const globals = getAnalyticsGlobals();
return {
"x-sdk-version": globals.x_sdk_version,
"x-sdk-os": globals.x_sdk_os,
"x-sdk-name": globals.x_sdk_name,
"x-sdk-platform": globals.x_sdk_platform,
"x-bundle-id": globals.app_bundle_id,
};
}

export function getAnalyticsGlobals() {
if (typeof globalThis === "undefined") {
return {
x_sdk_name: packageVersion.name,
x_sdk_platform: "mobile",
x_sdk_version: packageVersion.version,
x_sdk_os: Platform.OS,
app_bundle_id: appBundleId,
};
}

if ((globalThis as any).X_SDK_NAME === undefined) {
(globalThis as any).X_SDK_NAME = packageVersion.name;
(globalThis as any).X_SDK_PLATFORM = "mobile";
(globalThis as any).X_SDK_VERSION = packageVersion.version;
(globalThis as any).X_SDK_OS = Platform.OS;
(globalThis as any).APP_BUNDLE_ID = appBundleId;
}

return {
x_sdk_name: (globalThis as any).X_SDK_NAME,
x_sdk_platform: (globalThis as any).X_SDK_PLATFORM,
x_sdk_version: (globalThis as any).X_SDK_VERSION,
x_sdk_os: (globalThis as any).X_SDK_OS,
app_bundle_id: (globalThis as any).APP_BUNDLE_ID,
};
}
1 change: 0 additions & 1 deletion packages/react-native/src/evm/constants/headers.ts

This file was deleted.

3 changes: 3 additions & 0 deletions packages/react-native/src/evm/providers/thirdweb-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { SafeAreaProvider } from "react-native-safe-area-context";
import { walletIds } from "@thirdweb-dev/wallets";
import { ThirdwebStorage } from "../../core/storage/storage";
import type { Locale } from "../i18n/types";
import { getAnalyticsGlobals } from "../../core/storage/utils";

export interface ThirdwebProviderProps<TChains extends Chain[]>
extends Omit<
Expand Down Expand Up @@ -148,6 +149,8 @@ export const ThirdwebProvider = <TChains extends Chain[] = DefaultChains>(
...restProps
} = props;

getAnalyticsGlobals();

const coinbaseWalletObj = supportedWallets.find(
(w) => w.id === walletIds.coinbase,
);
Expand Down
7 changes: 0 additions & 7 deletions packages/react-native/src/evm/utils/global.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,14 @@ import {
} from "../types";
import { InAppBrowser } from "react-native-inappbrowser-reborn";
import { createErrorMessage } from "./helpers/errors";
import {
appBundleId,
reactNativePackageVersion,
} from "../../../../utils/version";
import { BUNDLE_ID_HEADER } from "../../../../constants/headers";
import { ANALYTICS } from "./helpers/analytics";
import { getAnalyticsHeaders } from "../../../../../core/storage/utils";

const HEADERS = {
[EWS_VERSION_HEADER]: (globalThis as any).X_SDK_VERSION,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...getAnalyticsHeaders(),
};

export async function sendVerificationEmail(options: {
email: string;
Expand Down Expand Up @@ -196,9 +198,7 @@ export async function socialLogin(oauthOptions: OauthOption, clientId: string) {

const resp = await fetch(headlessLoginLinkWithParams, {
headers: {
[EWS_VERSION_HEADER]: reactNativePackageVersion,
[BUNDLE_ID_HEADER]: appBundleId,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...HEADERS,
},
});

Expand Down Expand Up @@ -279,9 +279,7 @@ export async function customJwt(authOptions: AuthOptions, clientId: string) {
method: "POST",
headers: {
"Content-Type": "application/json",
[EWS_VERSION_HEADER]: reactNativePackageVersion,
[BUNDLE_ID_HEADER]: appBundleId,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...HEADERS,
},
body: JSON.stringify({
jwt: jwt,
Expand Down Expand Up @@ -329,9 +327,7 @@ export async function authEndpoint(
method: "POST",
headers: {
"Content-Type": "application/json",
[EWS_VERSION_HEADER]: reactNativePackageVersion,
[BUNDLE_ID_HEADER]: appBundleId,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...HEADERS,
},
body: JSON.stringify({
payload: payload,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,17 @@ import {
VerifiedTokenResponse,
} from "../../../types";
import { createErrorMessage } from "../errors";
import {
appBundleId,
reactNativePackageVersion,
} from "../../../../../../utils/version";
import { BUNDLE_ID_HEADER } from "../../../../../../constants/headers";
import { ANALYTICS } from "../analytics";
import { getAnalyticsHeaders } from "../../../../../../../core/storage/utils";

const EMBEDDED_WALLET_TOKEN_HEADER = "embedded-wallet-token";
const PAPER_CLIENT_ID_HEADER = "x-thirdweb-client-id";

const HEADERS = {
"Content-Type": "application/json",
[BUNDLE_ID_HEADER]: appBundleId,
[EWS_VERSION_HEADER]: reactNativePackageVersion,
[EWS_VERSION_HEADER]: (globalThis as any).X_SDK_VERSION,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...getAnalyticsHeaders(),
};

export const verifyClientId = async (clientId: string) => {
Expand Down Expand Up @@ -68,19 +65,15 @@ export const authFetchEmbeddedWalletUser = async (
Authorization: `Bearer ${EMBEDDED_WALLET_TOKEN_HEADER}:${
authTokenClient || ""
}`,
[BUNDLE_ID_HEADER]: appBundleId,
[PAPER_CLIENT_ID_HEADER]: clientId,
[EWS_VERSION_HEADER]: reactNativePackageVersion,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...HEADERS,
}
: {
Authorization: `Bearer ${EMBEDDED_WALLET_TOKEN_HEADER}:${
authTokenClient || ""
}`,
[BUNDLE_ID_HEADER]: appBundleId,
[PAPER_CLIENT_ID_HEADER]: clientId,
[EWS_VERSION_HEADER]: reactNativePackageVersion,
[THIRDWEB_SESSION_NONCE_HEADER]: ANALYTICS.nonce,
...HEADERS,
};
return fetch(url, params);
};
Expand Down
7 changes: 0 additions & 7 deletions packages/react-native/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1 @@
import { isGlobalThisPresent } from "./evm/utils/global";
import { appBundleId } from "./evm/utils/version";

export * from "./evm";

if (isGlobalThisPresent()) {
(globalThis as any).APP_BUNDLE_ID = appBundleId;
}
3 changes: 3 additions & 0 deletions packages/react/src/evm/providers/thirdweb-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { en } from "../locales/en";
import { ThirdwebLocaleContext } from "./locale-provider";
import { walletIds } from "@thirdweb-dev/wallets";
import { ThirdwebLocale } from "../locales/types";
import { getAnalyticsGlobals } from "../utils/headers";

export interface ThirdwebProviderProps<TChains extends Chain[]>
extends Omit<
Expand Down Expand Up @@ -479,6 +480,8 @@ export const ThirdwebProvider = <TChains extends Chain[] = DefaultChains>(
...restProps
} = props;

getAnalyticsGlobals();

const wallets: WalletConfig[] = supportedWallets || defaultWallets;
const theme = _theme || "dark";

Expand Down
30 changes: 30 additions & 0 deletions packages/react/src/evm/utils/headers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import packageJson from "../../../package.json";
import { detectOS } from "./isMobile";

export function getAnalyticsGlobals() {
if (typeof globalThis === "undefined") {
return {
x_sdk_name: packageJson.name,
x_sdk_platform: "browser",
x_sdk_version: packageJson.version,
x_sdk_os: detectOS(),
app_bundle_id: undefined,
};
}

if ((globalThis as any).X_SDK_NAME === undefined) {
(globalThis as any).X_SDK_NAME = packageJson.name;
(globalThis as any).X_SDK_PLATFORM = "browser";
(globalThis as any).X_SDK_VERSION = packageJson.version;
(globalThis as any).X_SDK_OS = detectOS();
(globalThis as any).APP_BUNDLE_ID = undefined;
}

return {
x_sdk_name: (globalThis as any).X_SDK_NAME,
x_sdk_platform: (globalThis as any).X_SDK_PLATFORM,
x_sdk_version: (globalThis as any).X_SDK_VERSION,
x_sdk_os: (globalThis as any).X_SDK_OS,
app_bundle_id: (globalThis as any).APP_BUNDLE_ID,
};
}
2 changes: 1 addition & 1 deletion packages/react/src/evm/utils/isMobile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export function isIOS(): boolean {
/**
* @internal
*/
function detectOS() {
export function detectOS() {
const env = detectEnv();
return env?.os ? env.os : undefined;
}
Expand Down
Loading

0 comments on commit 3ba1536

Please sign in to comment.