UNPKG

@arcblock/analytics-js

Version:

Analytics Javascript SDK for API Service by ArcBlock

160 lines (131 loc) 4.14 kB
'use strict'; 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