function processOrCacheAsync(sourceText, moduleId, options, opt_url, callback) {
  if (ENABLE_CACHING) {
    var sourceHash = stringHash(sourceText);
    var resultText = loadFromCache(sourceHash);
    if (resultText) {
      callback(fixupModuleIds(moduleId, resultText));
      return;
    }
  }

  var blobUrl = options['wtf.instrumentation.blob'];
  var worker = new Worker(blobUrl);
  worker.onmessage = function(e) {
    var resultText = e.data.transformedText;
    if (ENABLE_CACHING) {
      saveToCache(sourceHash, resultText);
    }
    callback(fixupModuleIds(moduleId, resultText));
    worker.terminate();
  };
  worker.postMessage({
    sourceText: sourceText,
    moduleId: moduleId,
    options: options,
    url: opt_url
  });
}
Processes source code for instrumentation, with caching if possible.
@param {string} sourceText Input source text.
@param {number} moduleId Unique module ID.
@param {!Object} options Instrumentation options.
@param {string=} opt_url Source URL.
@param {function(string)} callback Completion callback.