blob: 00e9b911c7bedfaae6de95c594f72a98ae6ebf5b [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
const lib = {};
/**
* List of functions that need to be invoked during library initialization.
*
* Each element in the initCallbacks_ array is itself a two-element array.
* Element 0 is a short string describing the owner of the init routine, useful
* for debugging. Element 1 is the callback function.
*/
lib.initCallbacks_ = [];
/**
* Register an initialization function.
*
* The initialization functions are invoked in registration order when
* lib.init() is invoked. Each function will receive a single parameter, which
* is a function to be invoked when it completes its part of the initialization.
*
* @param {string} name A short descriptive name of the init routine useful for
* debugging.
* @param {function()} callback The initialization function to register.
*/
lib.registerInit = function(name, callback) {
lib.initCallbacks_.push([name, callback]);
};
/**
* Initialize the library.
*
* This will ensure that all registered runtime dependencies are met, and
* invoke any registered initialization functions.
*
* Initialization is asynchronous. The library is not ready for use until
* the returned promise resolves.
*
* @param {function(*)=} logFunction An optional function to send initialization
* related log messages to.
* @return {!Promise<void>} Promise that resolves once all inits finish.
*/
lib.init = async function(logFunction = undefined) {
const ary = lib.initCallbacks_;
while (ary.length) {
const [name, init] = ary.shift();
if (logFunction) {
logFunction(`init: ${name}`);
}
const ret = init();
if (ret && typeof ret.then === 'function') {
await ret;
}
}
};
/**
* Verify |condition| is truthy else throw Error.
*
* This function is primarily for satisfying the JS compiler and should be
* used only when you are certain that your condition is true. The function is
* designed to have a version that throws Errors in tests if condition fails,
* and a nop version for production code. It configures itself the first time
* it runs.
*
* @param {boolean} condition A condition to check.
* @closurePrimitive {asserts.truthy}
*/
lib.assert = function(condition) {
if (window.chai) {
lib.assert = window.chai.assert;
} else {
lib.assert = function(condition) {};
}
lib.assert(condition);
};
/**
* Verify |value| is not null and return |value| if so, else throw Error.
* See lib.assert.
*
* @template T
* @param {T} value A value to check for null.
* @return {T} A non-null |value|.
* @closurePrimitive {asserts.truthy}
*/
lib.notNull = function(value) {
lib.assert(value !== null);
return value;
};
/**
* Verify |value| is not undefined and return |value| if so, else throw Error.
* See lib.assert.
*
* @template T
* @param {T} value A value to check for null.
* @return {T} A non-undefined |value|.
* @closurePrimitive {asserts.truthy}
*/
lib.notUndefined = function(value) {
lib.assert(value !== undefined);
return value;
};