1cb93a386Sopenharmony_ci 2cb93a386Sopenharmony_ci// General purpose utility functions go in this file. 3cb93a386Sopenharmony_ci 4cb93a386Sopenharmony_ci 5cb93a386Sopenharmony_cifunction allAreFinite(args) { 6cb93a386Sopenharmony_ci for (var i = 0; i < args.length; i++) { 7cb93a386Sopenharmony_ci if (args[i] !== undefined && !Number.isFinite(args[i])) { 8cb93a386Sopenharmony_ci return false; 9cb93a386Sopenharmony_ci } 10cb93a386Sopenharmony_ci } 11cb93a386Sopenharmony_ci return true; 12cb93a386Sopenharmony_ci} 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cifunction toBase64String(bytes) { 15cb93a386Sopenharmony_ci if (typeof Buffer !== 'undefined') { // Are we on node? 16cb93a386Sopenharmony_ci return Buffer.from(bytes).toString('base64'); 17cb93a386Sopenharmony_ci } else { 18cb93a386Sopenharmony_ci // From https://stackoverflow.com/a/25644409 19cb93a386Sopenharmony_ci // because the naive solution of 20cb93a386Sopenharmony_ci // btoa(String.fromCharCode.apply(null, bytes)); 21cb93a386Sopenharmony_ci // would occasionally throw "Maximum call stack size exceeded" 22cb93a386Sopenharmony_ci var CHUNK_SIZE = 0x8000; //arbitrary number 23cb93a386Sopenharmony_ci var index = 0; 24cb93a386Sopenharmony_ci var length = bytes.length; 25cb93a386Sopenharmony_ci var result = ''; 26cb93a386Sopenharmony_ci var slice; 27cb93a386Sopenharmony_ci while (index < length) { 28cb93a386Sopenharmony_ci slice = bytes.slice(index, Math.min(index + CHUNK_SIZE, length)); 29cb93a386Sopenharmony_ci result += String.fromCharCode.apply(null, slice); 30cb93a386Sopenharmony_ci index += CHUNK_SIZE; 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci return btoa(result); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci} 35cb93a386Sopenharmony_ci 36