mixpa
TypeScript icon, indicating that this package has built-in type declarations

0.4.0 • Public • Published

mixpa

npm Bundle size Code style: Prettier Donate

Tiny, isomorphic client for Mixpanel

Usage

import { create } from 'mixpa'

export const mp = create({
  token: '2418e6a0238911541536b590a76e2b01',
  debug: false,
})

Options

  • token: string
    Your project token.

  • baseUrl?: string
    The domain to send requests to.

  • debug?: 0 | 1 | 2 | 3
    Debug your requests. Higher values inherit the effects of lower values.

    • 1: Log requests to the console.
    • 2: Enable verbose error messages.
    • 3: Skip sending requests entirely.
  • onError?: (error: Error, req: MixpaRequest) => void
    Control what happens when a request fails. You can rethrow the error to force the original caller to handle it, but rethrown errors for non-critical requests are just logged to the console.

  • queueSend?: (send: () => void, method: string, data: object) => void
    Control when each request is sent. For example, you might wait for a network connection.
    By default, requests are sent immediately.

 

Event Types

Tracked events can be strongly typed.

type Events = {
  openApp: void
  sharePost: { postId: string }
}

export const mp = create<Events>({ ... })

mp.track('sharePost') // Error: "sharePost" is not assignable to "openApp"

 

Automatic Retries

Using the onError option, you can implement logic for automatically retrying a failed request.

Here's an example that uses backo2 for exponential backoff:

import { MixpaRequest, noRetryStatus } from 'mixpa'
import Backoff from 'backo2'

function onError(error: Error, req: MixpaRequest) {
  // If this error is from a retried request, rethrow it so the retry
  // handler is notified. Otherwise, rethrow it only when it's obviously
  // not a network disconnection.
  if (req.isRetry || (req.status == noRetryStatus && navigator.onLine)) {
    throw error
  }
  return new Promise<void>((resolve, reject) => {
    const backoff = new Backoff()

    function scheduleRetry() {
      if (backoff.attempts == 10) {
        // For critical requests, this will reject their promise.
        // Otherwise, the error is just logged to console.
        return reject(error)
      }
      setTimeout(() => {
        req.retry().then(resolve, scheduleRetry)
      }, backoff.duration())
    }

    scheduleRetry()
  })
}

 

Notes

  • No properties are ever set automatically.
  • You'll want to call setState with "reserved" properties (eg: $device_id) before you track any events.
  • You must've called setUser with a string before you can call setUserProps.

 

API

To track an event:

mp.track('My Event', { ... })

 

To identify the user:

mp.setUser('6ab86a11-9958-4afd-bf01-7a06d8d3f8a4')

 

To forget the user:

mp.setUser(null)

 

To update user-specific properties:

mp.setUserProps({ ... })

 

To send properties with every track call:

mp.setState({ ... })

Package Sidebar

Install

npm i mixpa

Weekly Downloads

0

Version

0.4.0

License

MIT

Unpacked Size

49 kB

Total Files

9

Last publish

Collaborators

  • aleclarson