145 lines
4.8 KiB
JavaScript
145 lines
4.8 KiB
JavaScript
// 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;
|
|
};
|
|
|
|
});
|