Files
shaka-player/lib/util/uint8array_utils.js
T
Joey Parrish e7587cc361 Add a test util for dumping and restoring from IDB
This makes it easy to dump and restore databases from IndexedDB. This,
in turn, makes it easy for us to test that all database versions can
be read. Before we close the backward compatibility issue that has
plagued v2.3, we will add tests that use this utility to load DB
snapshots from various older schemas and prove that they can still be
read.

This also adds dumps of all database versions to the assets folder,
including a snapshot of a what our broken upgrade in v2.3.0 did to the
v2 database schema.

Issue #1248

Change-Id: If7e8995f50abbdee67e3fa93e79f07a49582c5e8
2018-04-09 19:06:35 +00:00

136 lines
3.6 KiB
JavaScript

/**
* @license
* Copyright 2016 Google Inc.
*
* 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('shaka.util.Uint8ArrayUtils');
goog.require('shaka.util.StringUtils');
/**
* @namespace shaka.util.Uint8ArrayUtils
* @summary A set of Uint8Array utility functions.
* @exportDoc
*/
/**
* Convert a Uint8Array to a base64 string. The output will always use the
* alternate encoding/alphabet also known as "base64url".
* @param {!Uint8Array} arr
* @param {boolean=} opt_padding If true, pad the output with equals signs.
* Defaults to true.
* @return {string}
* @export
*/
shaka.util.Uint8ArrayUtils.toBase64 = function(arr, opt_padding) {
// btoa expects a "raw string" where each character is interpreted as a byte.
let bytes = shaka.util.StringUtils.fromCharCode(arr);
let padding = (opt_padding == undefined) ? true : opt_padding;
let base64 = window.btoa(bytes).replace(/\+/g, '-').replace(/\//g, '_');
return padding ? base64 : base64.replace(/=*$/, '');
};
/**
* Convert a base64 string to a Uint8Array. Accepts either the standard
* alphabet or the alternate "base64url" alphabet.
* @param {string} str
* @return {!Uint8Array}
* @export
*/
shaka.util.Uint8ArrayUtils.fromBase64 = function(str) {
// atob creates a "raw string" where each character is interpreted as a byte.
let bytes = window.atob(str.replace(/-/g, '+').replace(/_/g, '/'));
let result = new Uint8Array(bytes.length);
for (let i = 0; i < bytes.length; ++i) {
result[i] = bytes.charCodeAt(i);
}
return result;
};
/**
* Convert a hex string to a Uint8Array.
* @param {string} str
* @return {!Uint8Array}
* @export
*/
shaka.util.Uint8ArrayUtils.fromHex = function(str) {
let arr = new Uint8Array(str.length / 2);
for (let i = 0; i < str.length; i += 2) {
arr[i / 2] = window.parseInt(str.substr(i, 2), 16);
}
return arr;
};
/**
* Convert a Uint8Array to a hex string.
* @param {!Uint8Array} arr
* @return {string}
* @export
*/
shaka.util.Uint8ArrayUtils.toHex = function(arr) {
let hex = '';
for (let i = 0; i < arr.length; ++i) {
let value = arr[i].toString(16);
if (value.length == 1) value = '0' + value;
hex += value;
}
return hex;
};
/**
* Compare two Uint8Arrays for equality.
* @param {Uint8Array} arr1
* @param {Uint8Array} arr2
* @return {boolean}
* @export
*/
shaka.util.Uint8ArrayUtils.equal = function(arr1, arr2) {
if (!arr1 && !arr2) return true;
if (!arr1 || !arr2) return false;
if (arr1.length != arr2.length) return false;
for (let i = 0; i < arr1.length; ++i) {
if (arr1[i] != arr2[i]) return false;
}
return true;
};
/**
* Concatenate Uint8Arrays.
* @param {...Uint8Array} var_args
* @return {Uint8Array}
* @export
*/
shaka.util.Uint8ArrayUtils.concat = function(var_args) {
let totalLength = 0;
for (let i = 0; i < arguments.length; ++i) {
totalLength += arguments[i].length;
}
let result = new Uint8Array(totalLength);
let offset = 0;
for (let i = 0; i < arguments.length; ++i) {
result.set(arguments[i], offset);
offset += arguments[i].length;
}
return result;
};