@arcblock/analytics-js
Version:
Analytics Javascript SDK for API Service by ArcBlock
160 lines (131 loc) • 4.14 kB
JavaScript
;
const BaseSDK = require('@arcblock/sdk-util');
const schema = require('./schema.json');
class AnalyticsBaseSDK extends BaseSDK {
constructor(source) {
super({
dataSource: 'analytics',
httpEndpoint: 'https://api.arcblock.io/analytics/playground',
enableQuery: false,
enableSubscription: false,
enableMutation: true
});
if (!source) {
throw new Error('AnalyticsSDK constructor require `source` param');
}
this._eventAttrs = {
source: underscore(source)
};
this._createEvent = this.createEvent;
this._createEvents = this.createEvents;
delete this.createEvent;
delete this.createEvents;
}
static set(key, value) {
if (this.client) {
return this.client.setEventAttr(key, value);
}
}
static getDeviceId() {
if (this.client) {
return this.client._getDeviceId();
}
}
static async event(args) {
if (this.client) {
return this.client.event(args);
}
return Promise.resolve(false);
}
static async pageview(url) {
if (this.client) {
return this.client.pageview(url);
}
return Promise.resolve(false);
}
event(args) {
return this.createEvent({
eventType: args.category,
objectId: args.label,
objectType: args.type,
operation: args.action,
eventContent: args.data
});
}
pageview(url) {
return this.createEvent({
eventType: 'activity',
objectId: url,
objectType: 'url',
operation: 'pageview',
eventContent: {}
});
}
setEventAttr(key, value) {
const allowedKeys = ['deviceId', 'userId', 'ip', 'country', 'city', 'postalCode', 'latitude', 'longitude', 'language', 'userAgent'];
if (allowedKeys.indexOf(key) > -1 && typeof value !== 'undefined') {
this._eventAttrs[key] = value;
}
return this;
}
getEventAttr(key) {
return this._eventAttrs[key];
}
/**
* - **eventType**, **required**, Specifies the type of this event. Examples:interaction, activity
* - **objectId**, **required**, Specifies the object ID of this activity
* - **objectType**, **required**, Specifies the type of the object
* - **operation**, **required**, Specifies the operation of this event
*/
async createEvent({ eventType, objectId, objectType, operation, eventContent = {} }) {
if (['activity', 'interaction'].includes(eventType) === false) {
throw new Error('event category must be one of `activity` or `interaction`');
}
const eventAttrs = Object.assign(this._getEventAttrs(), {
eventType: underscore(eventType),
operation: underscore(operation),
objectId,
objectType: underscore(objectType),
eventContent: escapeDoubleQuotes(JSON.stringify(eventContent))
}, this._eventAttrs);
if (!eventAttrs.clientTimestamp) {
eventAttrs.clientTimestamp = new Date().toISOString();
}
try {
const result = await this._createEvent(eventAttrs);
return result;
} catch (err) {
if (typeof process !== 'undefined' && process.env && process.env.DEBUG) {
// eslint-disable-next-line
console.error(err);
}
return null;
}
}
_getDeviceId() {
throw new Error('_getDeviceId must be implemented in sub class');
}
_getEventAttrs() {
throw new Error('_getEventAttrs must be implemented in sub class');
}
_genUUID() {
return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c === 'x' ? r : r & 0x3 | 0x8;
return v.toString(16);
});
}
_getSchema() {
return schema;
}
_getIgnoreFields() {
return [];
}
}
// Converts a camelized or dasherized string into an underscored one
const underscore = str => str.trim().replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/[-\s]+/g, '_').toLowerCase();
const escapeDoubleQuotes = str => str.replace(/\\([\s\S])|(")/g, '\\$1$2');
module.exports = AnalyticsBaseSDK;
module.exports.underscore = underscore;
module.exports.escapeDoubleQuotes = escapeDoubleQuotes;
//# sourceMappingURL=base.js.map