Files
shaka-player/lib/util/destroyer.js
T
Joey Parrish 64896d70b0 Use shorter license header
This reflects changes in Google's policy on JavaScript license
headers, which should be smaller to avoid increasing the size of the
binary unnecessarily.

This also updates the company name from "Google, Inc" to "Google LLC".

Change-Id: I3f8b9ed3700b6351f43173d50c94d35c333e82b4
2019-11-22 18:18:36 +00:00

93 lines
2.2 KiB
JavaScript

/** @license
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
goog.provide('shaka.util.Destroyer');
goog.require('shaka.util.PublicPromise');
/**
* @summary
* A utility class to help work with |shaka.util.IDestroyable| objects.
*
* @final
*/
shaka.util.Destroyer = class {
/**
* @param {function():!Promise} callback
* A callback to destroy an object. This callback will only be called once
* regardless of how many times |destroy| is called.
*/
constructor(callback) {
/** @private {boolean} */
this.destroyed_ = false;
/** @private {!shaka.util.PublicPromise} */
this.waitOnDestroy_ = new shaka.util.PublicPromise();
/** @private {function():!Promise} */
this.onDestroy_ = callback;
}
/**
* Check if |destroy| has been called. This returning |true| does not mean
* that the promise returned by |destroy| has resolved yet.
*
* @return {boolean}
* @final
*/
destroyed() {
return this.destroyed_;
}
/**
* Request that the destroy callback be called. Will return a promise that
* will resolve once the callback terminates. The promise will never be
* rejected.
*
* @return {!Promise}
* @final
*/
destroy() {
if (this.destroyed_) {
return this.waitOnDestroy_;
}
// We have started destroying this object, so we should never get here
// again.
this.destroyed_ = true;
return this.onDestroy_().then(
() => { this.waitOnDestroy_.resolve(); },
() => { this.waitOnDestroy_.resolve(); });
}
/**
* Checks if the object is destroyed and throws an error if it is.
* @param {*=} error The inner error, if any.
*/
ensureNotDestroyed(error) {
if (this.destroyed_) {
if (error && error.code == shaka.util.Error.Code.OBJECT_DESTROYED) {
throw error;
} else {
throw shaka.util.Destroyer.destroyedError(error);
}
}
}
/**
* @param {*=} error The inner error, if any.
* @return {!shaka.util.Error}
*/
static destroyedError(error) {
return new shaka.util.Error(
shaka.util.Error.Severity.CRITICAL,
shaka.util.Error.Category.PLAYER,
shaka.util.Error.Code.OBJECT_DESTROYED,
error);
}
};