// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_WORKLET_PROCESSOR_DEFINITION_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_WORKLET_PROCESSOR_DEFINITION_H_

#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/webaudio/audio_param_descriptor.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "v8/include/v8.h"

namespace blink {

class V8BlinkAudioWorkletProcessCallback;
class V8BlinkAudioWorkletProcessorConstructor;

// Represents a JavaScript class definition registered in the
// AudioWorkletGlobalScope. After the registration, a definition class contains
// the V8 representation of class components (constructor, process callback,
// prototypes and parameter descriptors).
//
// This is constructed and destroyed on a worker thread, and all methods also
// must be called on the worker thread.
class MODULES_EXPORT AudioWorkletProcessorDefinition final
    : public GarbageCollected<AudioWorkletProcessorDefinition>,
      public NameClient {
 public:
  static AudioWorkletProcessorDefinition* Create(
      const String& name,
      V8BlinkAudioWorkletProcessorConstructor* constructor,
      V8BlinkAudioWorkletProcessCallback* process);

  explicit AudioWorkletProcessorDefinition(
      const String& name,
      V8BlinkAudioWorkletProcessorConstructor* constructor,
      V8BlinkAudioWorkletProcessCallback* process);
  ~AudioWorkletProcessorDefinition();

  const String& GetName() const { return name_; }
  V8BlinkAudioWorkletProcessorConstructor* ConstructorFunction() const {
    return constructor_;
  }
  V8BlinkAudioWorkletProcessCallback* ProcessFunction() const {
    return process_;
  }
  void SetAudioParamDescriptors(
      const HeapVector<Member<AudioParamDescriptor>>&);
  const Vector<String> GetAudioParamDescriptorNames() const;
  const AudioParamDescriptor* GetAudioParamDescriptor(const String& key) const;

  // Flag for data synchronization of definition between
  // AudioWorkletMessagingProxy and AudioWorkletGlobalScope.
  bool IsSynchronized() const { return is_synchronized_; }
  void MarkAsSynchronized() { is_synchronized_ = true; }

  void Trace(blink::Visitor* visitor);

  const char* NameInHeapSnapshot() const override {
    return "AudioWorkletProcessorDefinition";
  }

 private:
  const String name_;
  bool is_synchronized_ = false;

  // The definition is per global scope. The active instance of
  // |AudioProcessorWorklet| should be passed into these to perform JS function.
  Member<V8BlinkAudioWorkletProcessorConstructor> constructor_;
  Member<V8BlinkAudioWorkletProcessCallback> process_;

  HeapVector<Member<AudioParamDescriptor>> audio_param_descriptors_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_WORKLET_PROCESSOR_DEFINITION_H_
