| // Copyright 2014 Cognitect. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS-IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| goog.provide("com.cognitect.transit.util"); |
| goog.require("goog.object"); |
| |
| goog.scope(function () { |
| |
| var util = com.cognitect.transit.util, |
| gobject = goog.object; |
| |
| if (typeof Object.keys != "undefined") { |
| util.objectKeys = function (obj) { |
| return Object.keys(obj); |
| }; |
| } else { |
| util.objectKeys = function (obj) { |
| return gobject.getKeys(obj); |
| }; |
| } |
| |
| if (typeof Array.isArray != "undefined") { |
| util.isArray = function (obj) { |
| return Array.isArray(obj); |
| }; |
| } else { |
| util.isArray = function (obj) { |
| return goog.typeOf(obj) === "array"; |
| }; |
| } |
| |
| /** |
| * @const |
| * @type {string} |
| */ |
| util.chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
| |
| util.randInt = function (ub) { |
| return Math.round(Math.random() * ub); |
| }; |
| |
| util.randHex = function () { |
| return util.randInt(15).toString(16); |
| }; |
| |
| util.randomUUID = function () { |
| var rhex = (0x8 | (0x3 & util.randInt(14))).toString(16), |
| ret = util.randHex() + util.randHex() + util.randHex() + util.randHex() + |
| util.randHex() + util.randHex() + util.randHex() + util.randHex() + "-" + |
| util.randHex() + util.randHex() + util.randHex() + util.randHex() + "-" + |
| "4" + util.randHex() + util.randHex() + util.randHex() + "-" + |
| rhex + util.randHex() + util.randHex() + util.randHex() + "-" + |
| util.randHex() + util.randHex() + util.randHex() + util.randHex() + |
| util.randHex() + util.randHex() + util.randHex() + util.randHex() + |
| util.randHex() + util.randHex() + util.randHex() + util.randHex(); |
| return ret; |
| }; |
| |
| // https://github.com/davidchambers/Base64.js |
| |
| util.btoa = function (input) { |
| if (typeof btoa != "undefined") { |
| return btoa(input); |
| } else { |
| var str = String(input); |
| for ( |
| var block, charCode, idx = 0, map = util.chars, output = ''; |
| str.charAt(idx | 0) || (map = '=', idx % 1); |
| output += map.charAt(63 & block >> 8 - idx % 1 * 8) |
| ) { |
| charCode = str.charCodeAt(idx += 3 / 4); |
| if (charCode > 0xFF) { |
| throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); |
| } |
| block = block << 8 | charCode; |
| } |
| return output; |
| } |
| }; |
| |
| /** |
| * @suppress {uselessCode} |
| */ |
| util.atob = function (input) { |
| if (typeof atob != "undefined") { |
| return atob(input); |
| } else { |
| var str = String(input).replace(/=+$/, ''); |
| if (str.length % 4 == 1) { |
| throw new Error("'atob' failed: The string to be decoded is not correctly encoded."); |
| } |
| for ( |
| var bc = 0, bs, buffer, idx = 0, output = ''; |
| buffer = str.charAt(idx++); |
| ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, |
| bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 |
| ) { |
| buffer = util.chars.indexOf(buffer); |
| } |
| return output; |
| } |
| }; |
| |
| util.Uint8ToBase64 = function (u8Arr) { |
| var CHUNK_SIZE = 0x8000, |
| index = 0, |
| length = u8Arr.length, |
| result = '', |
| slice = null; |
| |
| while (index < length) { |
| slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length)); |
| result += String.fromCharCode.apply(null, slice); |
| index += CHUNK_SIZE; |
| } |
| |
| return util.btoa(result); |
| }; |
| |
| util.Base64ToUint8 = function (base64) { |
| var binary_string = util.atob(base64), |
| len = binary_string.length, |
| bytes = new Uint8Array(len); |
| |
| for (var i = 0; i < len; i++) { |
| var ascii = binary_string.charCodeAt(i); |
| bytes[i] = ascii; |
| } |
| |
| return bytes; |
| }; |
| |
| }); |