123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /**
- * @fileoverview Provides ByteString as a basic data type for protos.
- */
- goog.module('protobuf.ByteString');
- const base64 = goog.require('goog.crypt.base64');
- const {arrayBufferSlice, cloneArrayBufferView, hashUint8Array, uint8ArrayEqual} = goog.require('protobuf.binary.typedArrays');
- /**
- * Immutable sequence of bytes.
- *
- * Bytes can be obtained as an ArrayBuffer or a base64 encoded string.
- * @final
- */
- class ByteString {
- /**
- * @param {?Uint8Array} bytes
- * @param {?string} base64
- * @private
- */
- constructor(bytes, base64) {
- /** @private {?Uint8Array}*/
- this.bytes_ = bytes;
- /** @private {?string} */
- this.base64_ = base64;
- /** @private {number} */
- this.hashCode_ = 0;
- }
- /**
- * Constructs a ByteString instance from a base64 string.
- * @param {string} value
- * @return {!ByteString}
- */
- static fromBase64String(value) {
- if (value == null) {
- throw new Error('value must not be null');
- }
- return new ByteString(/* bytes */ null, value);
- }
- /**
- * Constructs a ByteString from an array buffer.
- * @param {!ArrayBuffer} bytes
- * @param {number=} start
- * @param {number=} end
- * @return {!ByteString}
- */
- static fromArrayBuffer(bytes, start = 0, end = undefined) {
- return new ByteString(
- new Uint8Array(arrayBufferSlice(bytes, start, end)), /* base64 */ null);
- }
- /**
- * Constructs a ByteString from any ArrayBufferView (e.g. DataView,
- * TypedArray, Uint8Array, etc.).
- * @param {!ArrayBufferView} bytes
- * @return {!ByteString}
- */
- static fromArrayBufferView(bytes) {
- return new ByteString(cloneArrayBufferView(bytes), /* base64 */ null);
- }
- /**
- * Constructs a ByteString from an Uint8Array. DON'T MODIFY the underlying
- * ArrayBuffer, since the ByteString directly uses it without making a copy.
- *
- * This method exists so that internal APIs can construct a ByteString without
- * paying the penalty of copying an ArrayBuffer when that ArrayBuffer is not
- * supposed to change. It is exposed to a limited number of internal classes
- * through bytestring_internal.js.
- *
- * @param {!Uint8Array} bytes
- * @return {!ByteString}
- * @package
- */
- static fromUint8ArrayUnsafe(bytes) {
- return new ByteString(bytes, /* base64 */ null);
- }
- /**
- * Returns this ByteString as an ArrayBuffer.
- * @return {!ArrayBuffer}
- */
- toArrayBuffer() {
- const bytes = this.ensureBytes_();
- return arrayBufferSlice(
- bytes.buffer, bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
- }
- /**
- * Returns this ByteString as an Uint8Array. DON'T MODIFY the returned array,
- * since the ByteString holds the reference to the same array.
- *
- * This method exists so that internal APIs can get contents of a ByteString
- * without paying the penalty of copying an ArrayBuffer. It is exposed to a
- * limited number of internal classes through bytestring_internal.js.
- * @return {!Uint8Array}
- * @package
- */
- toUint8ArrayUnsafe() {
- return this.ensureBytes_();
- }
- /**
- * Returns this ByteString as a base64 encoded string.
- * @return {string}
- */
- toBase64String() {
- return this.ensureBase64String_();
- }
- /**
- * Returns true for Bytestrings that contain identical values.
- * @param {*} other
- * @return {boolean}
- */
- equals(other) {
- if (this === other) {
- return true;
- }
- if (!(other instanceof ByteString)) {
- return false;
- }
- const otherByteString = /** @type {!ByteString} */ (other);
- return uint8ArrayEqual(this.ensureBytes_(), otherByteString.ensureBytes_());
- }
- /**
- * Returns a number (int32) that is suitable for using in hashed structures.
- * @return {number}
- */
- hashCode() {
- if (this.hashCode_ == 0) {
- this.hashCode_ = hashUint8Array(this.ensureBytes_());
- }
- return this.hashCode_;
- }
- /**
- * Returns true if the bytestring is empty.
- * @return {boolean}
- */
- isEmpty() {
- if (this.bytes_ != null && this.bytes_.byteLength == 0) {
- return true;
- }
- if (this.base64_ != null && this.base64_.length == 0) {
- return true;
- }
- return false;
- }
- /**
- * @return {!Uint8Array}
- * @private
- */
- ensureBytes_() {
- if (this.bytes_) {
- return this.bytes_;
- }
- return this.bytes_ = base64.decodeStringToUint8Array(
- /** @type {string} */ (this.base64_));
- }
- /**
- * @return {string}
- * @private
- */
- ensureBase64String_() {
- if (this.base64_ == null) {
- this.base64_ = base64.encodeByteArray(this.bytes_);
- }
- return this.base64_;
- }
- }
- /** @const {!ByteString} */
- ByteString.EMPTY = new ByteString(new Uint8Array(0), null);
- exports = ByteString;
|