UNPKG

@microsoft/applicationinsights-core-js

Version:

Microsoft Application Insights Core Javascript SDK

135 lines (133 loc) 5.41 kB
/* * Application Insights JavaScript SDK - Core, 3.3.9 * Copyright (c) Microsoft and contributors. All rights reserved. */ import { mathFloor, utcNow } from "@nevware21/ts-utils"; import { _DYN_LENGTH } from "../__DynamicConstants"; import { getCrypto, getMsCrypto, isIE } from "./EnvUtils"; import { STR_EMPTY } from "./InternalConstants"; var UInt32Mask = 0x100000000; var MaxUInt32 = 0xffffffff; var SEED1 = 123456789; var SEED2 = 987654321; // MWC based Random generator (for IE) var _mwcSeeded = false; var _mwcW = SEED1; var _mwcZ = SEED2; // Takes any integer function _mwcSeed(seedValue) { if (seedValue < 0) { // Make sure we end up with a positive number and not -ve one. seedValue >>>= 0; } _mwcW = (SEED1 + seedValue) & MaxUInt32; _mwcZ = (SEED2 - seedValue) & MaxUInt32; _mwcSeeded = true; } function _autoSeedMwc() { // Simple initialization using default Math.random() - So we inherit any entropy from the browser // and bitwise XOR with the current milliseconds try { var now = utcNow() & 0x7fffffff; _mwcSeed(((Math.random() * UInt32Mask) ^ now) + now); } catch (e) { // Don't crash if something goes wrong } } /** * Generate a random value between 0 and maxValue, max value should be limited to a 32-bit maximum. * So maxValue(16) will produce a number from 0..16 (range of 17) * @param maxValue - The max value for the range */ export function randomValue(maxValue) { if (maxValue > 0) { return mathFloor((random32() / MaxUInt32) * (maxValue + 1)) >>> 0; } return 0; } /** * generate a random 32-bit number (0x000000..0xFFFFFFFF) or (-0x80000000..0x7FFFFFFF), defaults un-unsigned. * @param signed - True to return a signed 32-bit number (-0x80000000..0x7FFFFFFF) otherwise an unsigned one (0x000000..0xFFFFFFFF) */ export function random32(signed) { var value = 0; var c = getCrypto() || getMsCrypto(); if (c && c.getRandomValues) { // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF) value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32; } if (value === 0 && isIE()) { // For IE 6, 7, 8 (especially on XP) Math.random is not very random if (!_mwcSeeded) { // Set the seed for the Mwc algorithm _autoSeedMwc(); } // Don't use Math.random for IE // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF) value = mwcRandom32() & MaxUInt32; } if (value === 0) { // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF) value = mathFloor((UInt32Mask * Math.random()) | 0); } if (!signed) { // Make sure we end up with a positive number and not -ve one. value >>>= 0; } return value; } /** * Seed the MWC random number generator with the specified seed or a random value * @param value - optional the number to used as the seed, if undefined, null or zero a random value will be chosen */ export function mwcRandomSeed(value) { if (!value) { _autoSeedMwc(); } else { _mwcSeed(value); } } /** * Generate a random 32-bit number between (0x000000..0xFFFFFFFF) or (-0x80000000..0x7FFFFFFF), using MWC (Multiply with carry) * instead of Math.random() defaults to un-signed. * Used as a replacement random generator for IE to avoid issues with older IE instances. * @param signed - True to return a signed 32-bit number (-0x80000000..0x7FFFFFFF) otherwise an unsigned one (0x000000..0xFFFFFFFF) */ export function mwcRandom32(signed) { _mwcZ = (36969 * (_mwcZ & 0xFFFF) + (_mwcZ >> 16)) & MaxUInt32; _mwcW = (18000 * (_mwcW & 0xFFFF) + (_mwcW >> 16)) & MaxUInt32; var value = (((_mwcZ << 16) + (_mwcW & 0xFFFF)) >>> 0) & MaxUInt32 | 0; if (!signed) { // Make sure we end up with a positive number and not -ve one. value >>>= 0; } return value; } /** * Generate random base64 id string. * The default length is 22 which is 132-bits so almost the same as a GUID but as base64 (the previous default was 5) * @param maxLength - Optional value to specify the length of the id to be generated, defaults to 22 */ export function newId(maxLength) { if (maxLength === void 0) { maxLength = 22; } var base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Start with an initial random number, consuming the value in reverse byte order var number = random32() >>> 0; // Make sure it's a +ve number var chars = 0; var result = STR_EMPTY; while (result[_DYN_LENGTH /* @min:%2elength */] < maxLength) { chars++; result += base64chars.charAt(number & 0x3F); number >>>= 6; // Zero fill with right shift if (chars === 5) { // 5 base64 characters === 30 bits so we don't have enough bits for another base64 char // So add on another 30 bits and make sure it's +ve number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0; chars = 0; // We need to reset the number every 5 chars (30 bits) } } return result; } //# sourceMappingURL=RandomHelper.js.map