Blog
Telemetry in Refine source code.

Telemetry in Refine source code.

In this article, we will review the Telemetry component in Refine source code.

...
<UnsavedWarnContextProvider>
  <RouterComponent>
    {children}
    {!disableTelemetryWithDefault && (
      <Telemetry />
    )}
  <RouteChangeHandler />
  </RouterComponent>
...

This above code snippet is picked from /packages/core/src/components/containers/refine/index.tsx#L196

Telemetry

In the Refine component, Telemetry is imported as shown below

import { Telemetry } from "@components/telemetry";

To find the Telemetry code, we should look at @components/telemetry in Refine repository.

export const Telemetry: React.FC<{}> = () => {
  const payload = useTelemetryData();
  const sent = React.useRef(false);

  React.useEffect(() => {
    if (sent.current) {
      return;
    }
    const encoded = encode(payload);

    if (!encoded) {
      return;
    }

    transport(`https://telemetry.refine.dev/telemetry?payload=${encoded}`);
    sent.current = true;
  }, []);

  return null;
};

Firstly, you will get the payload returned by calling useTelemetryData.

const payload = useTelemetryData();

useTelemetryData

useTelemetryData uses context and computes some values that are returned.

export const useTelemetryData = (): ITelemetryData => {
  const auth = useIsExistAuthentication();
  const auditLogContext = useContext(AuditLogContext);
  const { liveProvider } = useContext(LiveContext);
  ...
  const auditLog =
    !!auditLogContext.create ||
    !!auditLogContext.get ||
    !!auditLogContext.update;

  const live =
    !!liveProvider?.publish ||
    !!liveProvider?.subscribe ||
    !!liveProvider?.unsubscribe;
  ...
  return {
    providers: {
      auth,
      auditLog,
      live,
      router,
      data,
      i18n,
      notification,
      accessControl,
    },
    version: REFINE_VERSION,
    resourceCount: resources.length,
    projectId,
  };

This returned value is computed based on values available in contexts such as auditContext or liveContext for example.

This payload gets encoded

const encoded = encode(payload);

encode

encode is a function defined in the same file and has the below code

const encode = (payload: ITelemetryData): string | undefined => {
  try {
    const stringifiedPayload = JSON.stringify(payload || {});

    if (typeof btoa !== "undefined") {
      return btoa(stringifiedPayload);
    }

    return Buffer.from(stringifiedPayload).toString("base64");
  } catch (err) {
    return undefined;
  }
};

JSON is stringified, Buffer is created using this stringified JSON and is converted to string using base64.

transport is another interesting function I found in the same file.

transport(`https://telemetry.refine.dev/telemetry?payload=${encoded}`);

transport

const throughImage = (src: string) => {
  const img = new Image();

  img.src = src;
};

const throughFetch = (src: string) => {
  fetch(src);
};

const transport = (src: string) => {
  if (typeof Image !== "undefined") {
    throughImage(src);
  } else if (typeof fetch !== "undefined") {
    throughFetch(src);
  }
};

This above code snippet has two more methods called conditionally, throughImage and throughFetch.

About me:

Hey, my name is Ramu Narasinga. I study large open-source projects and create content about their codebase architecture and best practices, sharing it through articles, videos.

I am open to work on interesting projects. Send me an email at ramu.narasinga@gmail.com

My Github —  https://github.com/ramu-narasinga

My website —  https://ramunarasinga.com

My Youtube channel —  https://www.youtube.com/@thinkthroo

Learning platform —  https://thinkthroo.com

Codebase Architecture —  https://app.thinkthroo.com/architecture

Best practices —  https://app.thinkthroo.com/best-practices

Production-grade projects —  https://app.thinkthroo.com/production-grade-projects

References:

  1. https://github.com/refinedev/refine/blob/main/packages/core/src/components/telemetry/index.tsx#L39

  2. https://github.com/refinedev/refine/blob/main/packages/core/src/hooks/useTelemetryData/index.ts#L18