UNPKG

react-native-avo-inspector

Version:

[![npm version](https://badge.fury.io/js/react-native-avo-inspector.svg)](https://badge.fury.io/js/react-native-avo-inspector)

230 lines (229 loc) 11.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AvoNetworkCallsHandler = void 0; var AvoGuid_1 = require("./AvoGuid"); var AvoInspector_1 = require("./AvoInspector"); var AvoStreamId_1 = require("./AvoStreamId"); var AvoEncryption_1 = require("./AvoEncryption"); var AvoNetworkCallsHandler = /** @class */ (function () { function AvoNetworkCallsHandler(apiKey, envName, appName, appVersion, libVersion, publicEncryptionKey) { this.samplingRate = 1.0; this.sending = false; this.apiKey = apiKey; this.envName = envName; this.appName = appName; this.appVersion = appVersion; this.libVersion = libVersion; this.publicEncryptionKey = publicEncryptionKey; } AvoNetworkCallsHandler.prototype.callInspectorWithBatchBody = function (inEvents, onCompleted) { var _this = this; if (this.sending) { onCompleted("Batch sending cancelled because another batch sending is in progress. Your events will be sent with next batch."); return; } var events = inEvents.filter(function (x) { return x != null; }); if (events.length === 0) { return; } if (Math.random() > this.samplingRate) { if (AvoInspector_1.AvoInspector.shouldLog) { console.log("Avo Inspector: last event schema dropped due to sampling rate."); } return; } if (AvoInspector_1.AvoInspector.shouldLog) { console.log("Avo Inspector: events", events); events.forEach(function (event) { if (event.type === "event") { var schemaEvent = event; console.log("Avo Inspector: sending event " + schemaEvent.eventName + " with schema " + JSON.stringify(schemaEvent.eventProperties)); } }); } this.sending = true; var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", AvoNetworkCallsHandler.trackingEndpoint, true); xmlhttp.setRequestHeader("Content-Type", "application/json"); xmlhttp.setRequestHeader("Accept", "application/json"); xmlhttp.timeout = 10000; xmlhttp.onload = function () { _this.sending = false; if (xmlhttp.status != 200) { onCompleted("Error ".concat(xmlhttp.status, ": ").concat(xmlhttp.statusText)); } else { try { var samplingRate = JSON.parse(xmlhttp.response).samplingRate; if (samplingRate !== undefined) { _this.samplingRate = samplingRate; } } catch (_) { // Ignore malformed response — sampling rate stays unchanged } onCompleted(null); } }; xmlhttp.onerror = function () { _this.sending = false; onCompleted("Request failed"); }; xmlhttp.ontimeout = function () { _this.sending = false; onCompleted("Request timed out"); }; xmlhttp.send(JSON.stringify(events)); }; AvoNetworkCallsHandler.prototype.bodyForEventSchemaCall = function (eventName, eventProperties, eventId, eventHash, eventProps, metadata) { return __awaiter(this, void 0, void 0, function () { var anonymousId, eventSchemaBody; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, AvoStreamId_1.AvoStreamId.initialize()]; case 1: anonymousId = _a.sent(); eventSchemaBody = this.createBaseCallBody(anonymousId); eventSchemaBody.type = "event"; eventSchemaBody.eventName = eventName; // Encrypt property values when encryption is enabled if ((0, AvoEncryption_1.shouldEncrypt)(this.envName, this.publicEncryptionKey) && eventProps) { eventSchemaBody.eventProperties = (0, AvoEncryption_1.encryptEventProperties)(eventProperties, eventProps, this.publicEncryptionKey); } else { eventSchemaBody.eventProperties = eventProperties; } if (eventId != null) { eventSchemaBody.avoFunction = true; eventSchemaBody.eventId = eventId; eventSchemaBody.eventHash = eventHash; } else { eventSchemaBody.avoFunction = false; eventSchemaBody.eventId = null; eventSchemaBody.eventHash = null; } // Add streamId and event spec metadata for validated events if (metadata) { eventSchemaBody.streamId = anonymousId; eventSchemaBody.eventSpecMetadata = {}; if (metadata.schemaId) { eventSchemaBody.eventSpecMetadata.schemaId = metadata.schemaId; } if (metadata.branchId) { eventSchemaBody.eventSpecMetadata.branchId = metadata.branchId; } if (metadata.latestActionId) { eventSchemaBody.eventSpecMetadata.latestActionId = metadata.latestActionId; } if (metadata.sourceId) { eventSchemaBody.eventSpecMetadata.sourceId = metadata.sourceId; } } return [2 /*return*/, eventSchemaBody]; } }); }); }; /** * Sends a validated event immediately, bypassing the batcher. * Matches Android SDK's reportValidatedEvent behavior. */ AvoNetworkCallsHandler.prototype.reportValidatedEvent = function (eventBody) { if (Math.random() > this.samplingRate) { if (AvoInspector_1.AvoInspector.shouldLog) { console.log("Avo Inspector: validated event dropped due to sampling rate."); } return; } if (AvoInspector_1.AvoInspector.shouldLog) { console.log("Avo Inspector: sending validated event " + eventBody.eventName + " with schema " + JSON.stringify(eventBody.eventProperties)); } var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", AvoNetworkCallsHandler.trackingEndpoint, true); xmlhttp.setRequestHeader("Content-Type", "application/json"); xmlhttp.setRequestHeader("Accept", "application/json"); xmlhttp.timeout = 10000; xmlhttp.onload = function () { if (xmlhttp.status !== 200 && AvoInspector_1.AvoInspector.shouldLog) { console.warn("Avo Inspector: validated event response status ".concat(xmlhttp.status)); } }; xmlhttp.onerror = function () { if (AvoInspector_1.AvoInspector.shouldLog) { console.warn("Avo Inspector: failed to send validated event"); } }; xmlhttp.ontimeout = function () { if (AvoInspector_1.AvoInspector.shouldLog) { console.warn("Avo Inspector: validated event report timed out"); } }; xmlhttp.send(JSON.stringify([eventBody])); }; AvoNetworkCallsHandler.prototype.createBaseCallBody = function (anonymousId) { var body = { apiKey: this.apiKey, appName: this.appName, appVersion: this.appVersion, libVersion: this.libVersion, env: this.envName, libPlatform: "react-native", messageId: AvoGuid_1.default.newGuid(), trackingId: "", sessionId: "", anonymousId: anonymousId, createdAt: new Date().toISOString(), samplingRate: this.samplingRate, }; if (this.publicEncryptionKey !== null && this.publicEncryptionKey !== undefined && this.publicEncryptionKey.trim().length > 0) { body.publicEncryptionKey = this.publicEncryptionKey; } return body; }; AvoNetworkCallsHandler.trackingEndpoint = "https://api.avo.app/inspector/v1/track"; return AvoNetworkCallsHandler; }()); exports.AvoNetworkCallsHandler = AvoNetworkCallsHandler;