UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

108 lines (94 loc) 2.94 kB
/*! * OpenUI5 * (c) Copyright 2009-2023 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ /*global Blob*/ sap.ui.define([], function () { "use strict"; /** * A helper for buffering and sending BeaconRequests to a certain URL * * @param {object} option Options for beacon API initialization * @param {string} option.url beacon URL * @param {string} option.maxBufferLength Number of entries in the stack before the beacon is send * @private * @ui5-restricted sap.ui.core */ var BeaconRequest = function (option) { option = option || {}; if (!BeaconRequest.isSupported()) { throw Error("Beacon API is not supported"); } if (typeof option.url !== "string") { throw Error("Beacon url must be valid"); } this._nMaxBufferLength = option.maxBufferLength || 10; this._aBuffer = []; this._sUrl = option.url; /** * Send data if the browser has been closed * * The "visibilitychange" event is not fired in Safari when the browser tab is closed. */ document.addEventListener("visibilitychange", function () { if (document.visibilityState === "hidden") { this.send(); } }.bind(this)); /** * Ensure that the date is sent if the "visibilitychange" event was not fired. */ window.addEventListener("beforeunload", function () { this.send(); }.bind(this)); }; /** * Check if Beacon API is supported by the currently used browser * @return {boolean} true if supported */ BeaconRequest.isSupported = function() { return "navigator" in window && "sendBeacon" in window.navigator && "Blob" in window; }; /** * Append form data to buffer and send request automatically if max buffer length * has been reacherd * @param {string} key Form data key * @param {string} value Form data value */ BeaconRequest.prototype.append = function(key, value) { this._aBuffer.push({key: key, value: value}); // Send data if queue limit has been reached if (this.getBufferLength() === this._nMaxBufferLength) { this.send(); } }; BeaconRequest.prototype.getBufferLength = function() { return this._aBuffer.length; }; /** * Send all data stored in buffer and clear the buffer afterwards */ BeaconRequest.prototype.send = function() { if (this.getBufferLength()) { // prepare the content to be x-www-form-urlencoded var sBody = this._aBuffer.reduce(function(sResult, oEntry) { sResult += "&" + oEntry.key + "=" + oEntry.value; return sResult; }, "sap-fesr-only=1"); //blobs are supported in all browsers using sendBeacon var oBeaconDataToSend = new Blob([sBody], { type: "application/x-www-form-urlencoded;charset=UTF-8" }); window.navigator.sendBeacon(this._sUrl, oBeaconDataToSend); this.clear(); } }; /** * Clears the buffer */ BeaconRequest.prototype.clear = function() { this._aBuffer = []; }; return BeaconRequest; });