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