Files
medusa-store/packages/medusa-telemetry/src/util/telemetry-dispatcher.js
T
Sebastian Rindom cfe19f7f9d feat: medusa-telemetry (#328)
* feat: adds a telemetry package to collect anonymous usage data

* fix: update telemetry host

* fix: adds medusa telemetry --disable

* fix: add tracking of link,login,new

* fix: interactively collect db credentials

* fix: require seed file

* fix: removes tracking from reporter
2021-08-05 12:23:05 +02:00

116 lines
2.7 KiB
JavaScript

import removeSlash from "remove-trailing-slash"
import axios from "axios"
import axiosRetry from "axios-retry"
import showAnalyticsNotification from "./show-notification"
import Store from "../store"
import isTruthy from "./is-truthy"
const MEDUSA_TELEMETRY_VERBOSE = process.env.MEDUSA_TELEMETRY_VERBOSE || false
class TelemetryDispatcher {
constructor(options) {
this.store_ = new Store()
this.host = removeSlash(
options.host || "https://telemetry.medusa-commerce.com"
)
this.path = removeSlash(options.path || "/batch")
let axiosInstance = options.axiosInstance
if (!axiosInstance) {
axiosInstance = axios.create()
}
this.axiosInstance = axiosInstance
this.timeout = options.timeout || false
this.flushed = false
axiosRetry(this.axiosInstance, {
retries: 3,
retryDelay: axiosRetry.exponentialDelay,
retryCondition: this.isErrorRetryable_,
})
}
isTrackingEnabled() {
// Cache the result
if (this.trackingEnabled !== undefined) {
return this.trackingEnabled
}
let enabled = this.store_.getConfig(`telemetry.enabled`)
if (enabled === undefined || enabled === null) {
showAnalyticsNotification()
enabled = true
this.store_.setConfig(`telemetry.enabled`, enabled)
}
this.trackingEnabled = enabled
return enabled
}
async dispatch() {
if (!this.isTrackingEnabled()) {
return
}
await this.store_.flushEvents(async events => {
if (!events.length) {
if (isTruthy(MEDUSA_TELEMETRY_VERBOSE)) {
console.log("No events to POST - skipping")
}
return true
}
const data = {
batch: events,
timestamp: new Date(),
}
const req = {
headers: {},
}
return await this.axiosInstance
.post(`${this.host}${this.path}`, data, req)
.then(() => {
if (isTruthy(MEDUSA_TELEMETRY_VERBOSE)) {
console.log("POSTing batch succeeded")
}
return true
})
.catch(e => {
if (isTruthy(MEDUSA_TELEMETRY_VERBOSE)) {
console.error("Failed to POST event batch", e)
}
return false
})
})
}
isErrorRetryable_(error) {
// Retry Network Errors.
if (axiosRetry.isNetworkError(error)) {
return true
}
if (!error.response) {
// Cannot determine if the request can be retried
return false
}
// Retry Server Errors (5xx).
if (error.response.status >= 500 && error.response.status <= 599) {
return true
}
// Retry if rate limited.
if (error.response.status === 429) {
return true
}
return false
}
}
export default TelemetryDispatcher