// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
#define RUNTIME_INCLUDE_DART_EMBEDDER_API_H_

#include "dart_api.h"
#include "dart_tools_api.h"

namespace dart {
namespace embedder {

// Initialize all subsystems of the embedder.
// Returns true on success and false otherwise, in which case error would
// contain error message.
DART_WARN_UNUSED_RESULT bool InitOnce(char** error);

// Common arguments that are passed to isolate creation callback and to
// API methods that create isolates.
struct IsolateCreationData {
  // URI for the main script that will be running in the isolate.
  const char* script_uri;

  // Advisory name of the main method that will be run by isolate.
  // Only used for error messages.
  const char* main;

  // Isolate creation flags. Might be absent.
  Dart_IsolateFlags* flags;

  // Isolate callback data.
  void* callback_data;
};

// Create and initialize kernel-service isolate. This method should be used
// when VM invokes isolate creation callback with DART_KERNEL_ISOLATE_NAME as
// script_uri.
// The isolate is created from the given snapshot (might be kernel data or
// app-jit snapshot).
DART_WARN_UNUSED_RESULT Dart_Isolate
CreateKernelServiceIsolate(const IsolateCreationData& data,
                           const uint8_t* buffer,
                           intptr_t buffer_size,
                           char** error);

// Service isolate configuration.
struct VmServiceConfiguration {
  enum {
    kBindHttpServerToAFreePort = 0,
    kDoNotAutoStartHttpServer = -1
  };

  // Address to which HTTP server will be bound.
  const char* ip;

  // Default port. See enum above for special values.
  int port;

  // TODO(vegorov) document these ones.
  bool dev_mode;
  bool deterministic;
};

// Create and initialize vm-service isolate. This method should be used
// when VM invokes isolate creation callback with DART_VM_SERVICE_ISOLATE_NAME
// as script_uri.
// The isolate is created from the given kernel binary that is expected to
// contain all necessary vmservice libraries.
DART_WARN_UNUSED_RESULT Dart_Isolate
CreateVmServiceIsolate(const IsolateCreationData& data,
                       const VmServiceConfiguration& config,
                       const uint8_t* kernel_buffer,
                       intptr_t kernel_buffer_size,
                       char** error);

}  // namespace embedder
}  // namespace dart

#endif  // RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
