npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@kano/kbc-telemetry

v5.0.14

Published

Telemetry module for boilerplate apps, using react-tracking

Downloads

32

Readme

kbc-telemetry

Telemetry module for boilerplate apps, using react-tracking. For more information, see NYTimes React Tracking.

kbc-telemetry also handles when the application goes offline, and refreshes the session (default: set to 1 minute interval checks and ends session after 10 minutes of inactivity).

Usage

Setup

Import and use TelemetryProvider component as a wrapper for your app:

import { TelemetryProvider } from '@kano/kbc-telemetry';

Wrap your app in <TelemetryProvider> (IMPORTANT: this should be a top level wrapper only second to <Router>) and pass config information. To start tracking you will need to pass the trackUser function as props to your App component. If the app is user-less, you can set this to null on app first load.

const config = {
    app: app.name,
    appVersion: app.version
    url: app.url,
    env: app.env,
    trackingInterval?: 1000, // Check and send tracking data to database - Optional
    refreshIdleSessionInterval?: 30 * 1000, // Check if user is still active but not sending events - Optional
    sessionSoftTimeout?: 1 * 60 * 1000, // Soft session timeout default with possibility of a resume_session - Optional
    sessionHardTimeout?: 3 * 60 * 1000, // End the session without possibility of a resume_session event unless another tab has been updating the cookie session - Optional
    refreshCookieInterval?: 1 * 60 * 1000, // Refresh any available cookie session - Optional
    hasCrossDomainStorage?: boolean, //  cross-domain storage opt in/out - Optional
}

render() {
    return (
        <Router>
            <TelemetryProvider config={config}>
                {(trackUser) => (
                    <App trackUser={(userId) => trackUser(userId)} />
                )}
            </TelemetryProvider>
        </Router>
    );
}

Within components

Tracking data can be sent in multiple ways:

Decorators

Either on component level or at method level.

import { track } from '@kano/kbc-telemetry';

@track({ event: 'name_of_your_event' })
class MyComponent extends Component {

    @track({ event: 'I_did_something', action: 'click' })
    handleSomething() {
        // I run something
    }
}

Above shows the initial parameter as an object. But it can also be sent as a function, which accesses 3 parameters component props, component state, function arguments as an array, for example:

@track((props, state, args) => ({ event: props.event, data: { something: state.something, args: args[0] } })
handleSomething(iAmArgsZero) {
    // I run something
}

For decorators, there are explict fields that can be set as follows:

| Decorator | Field Options | | --------------------------- | ---------------- | | @track() | event?: String data?: Any action?: String module?: String | | @trackError() | error: { name: String, stack: String, message: String } |

Props

You can also use as props: this.props.tracking.trackEvent({}). This currently doesn't enforce the field options above.

To use tracking in props, the component must be wrapped using one of the 3 options below:

Opt 1) export / track()(Comp)

Wrapping it in track(), as follows (NOTE: the decorator must be passed an event object, the most common way to do this is by passing a module property - if you do not wish to pass anything please see Opt 3):

import { track, ITrackingProps } from '@kano/kbc-telemetry';

const FooComp = (props: ITrackingProps) => {
	return <div onClick={() => props.tracking.trackEvent({ action: 'click' })} />;
}

export default track({
  module: 'FooComp',
})(FooComp);
Opt 2) decorator / @track()class

Wrapping it with the @track({ }) decorator (NOTE: the decorator must be passed an event object, the most common way to do this is by passing a module property - if you do not wish to pass anything please see Opt 3):

import { track, ITrackingProps } from '@kano/kbc-telemetry';

@track({ module: 'MyComponent' })
class MyComponent extends Component<any, ITrackingProps> {
	handleSomething() {
	    this.props.tracking.trackEvent({ event: 'i_handle_something' })
	}
}
Opt 3) HOC / withTracking

Wrapping your exported component using the withTracking higher order component:

import { withTracking, ITrackingProps } from '@kano/kbc-telemetry';

class MyComponent extends Component<any, ITrackingProps> {
	handleSomething() {
	    this.props.tracking.trackEvent({ event: 'i_handle_something' })
	}
}

export default withTracking(FooComp);

Hooks

You can also gain access to the tracking.trackEvent({}) using the useTracking react hook:

import { useTracking } from '@kano/kbc-telemetry';

const MyComp = () => {
    const tracking = useTracking();

    const handleTrackedClick = () => {
        tracking.trackEvent({ event: 'omg' });
    }

    return {
        <button onClick={handleTrackedClick}>Omg please track me</button>
    }
}

Tracking Errors

Currently trackError can only be used as a decorator. See below and see field options in the table above.

@trackError({ error: { name: 'handle_error', stack: 'stack', message: 'message' } })
handleError() {
    // I handle an error
}

If you want to track errors using props, you can follow the same principles as above (using trackEvent as the function) but just pass an error event:

handleSomething() {
        this.props.tracking.trackEvent({ error: { name: 'handle_error', stack: 'stack', message: 'message' } })
}

Offline Client

The TelemetryProvider is wrapped with the OfflineClientProvider, this will pass down the status of online when the application changes from online to offline and vice versa. If all apps are wrapped with the TelemetryProvider, a hoc withOfflineClient can be used on any component of the application, for example:

const Editor = withOfflineClient(EditorComponent);
export Editor;

You can either listen to changes in componentDidUpdate for the offlineClient.online or to check the current status you can call offlineClient.getOnlineStatus.

Alternatively, if the application is not wrapped in the TelemetryProvider, you can use the OfflineClientProvider as a standalone component:

<OfflineClientProvider>
    {({ offlineClient: { online } }: IOfflineClientAPI) => {
        <App {...offlineClient} />
    }}
</OfflineClientProvider>