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