// Copyright (c) 2016, 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.

part of models;

abstract class IsolateRef {
  /// The id which is passed to the getIsolate RPC to reload this
  /// isolate.
  String? get id;

  /// A numeric id for this isolate, represented as a string. Unique.
  int? get number;

  /// A name identifying this isolate. Not guaranteed to be unique.
  String? get name;

  /// True if the isolate is a system isolate which is not running user code.
  bool? get isSystemIsolate;

  /// Trigger a full GC, collecting all unreachable or weakly reachable objects.
  Future collectAllGarbage();
}

enum IsolateStatus { loading, idle, running, paused }

abstract class Isolate extends IsolateRef {
  /// The time that the VM started in milliseconds since the epoch.
  DateTime? get startTime;

  /// Is the isolate in a runnable state?
  bool get runnable;

  /// The number of live ports for this isolate.
  //int get livePorts;

  /// Will this isolate pause when exiting?
  //bool get pauseOnExit;

  /// The last pause event delivered to the isolate. If the isolate is
  /// running, this will be a resume event.
  Event? get pauseEvent;

  /// [optional] The root library for this isolate.
  ///
  /// Guaranteed to be initialized when the IsolateRunnable event fires.
  LibraryRef? get rootLibrary;

  /// A list of all libraries for this isolate.
  ///
  /// Guaranteed to be initialized when the IsolateRunnable event fires.
  Iterable<LibraryRef>? get libraries;

  /// A list of all breakpoints for this isolate.
  //Iterable<Breakpoint> get breakpoints;

  /// [optional] The error that is causing this isolate to exit, if applicable.
  Error? get error;

  /// The list of threads associated with this isolate.
  Iterable<Thread>? get threads;

  /// The maximum amount of zone memory in bytes allocated by the isolate in
  /// all threads at a given time. Calculated using the high watermarks of each
  /// thread alive when a thread is unscheduled.
  int? get zoneHighWatermark;

  /// The number of zone handles currently held by this isolate.
  int? get numZoneHandles;

  /// The number of scoped handles currently held by this isolate.
  int? get numScopedHandles;

  /// The current pause on exception mode for this isolate.
  //ExceptionPauseMode get exceptionPauseMode;

  /// [optional] The list of service extension RPCs that are registered for this
  /// isolate, if any.
  Iterable<String>? get extensionRPCs;

  Map? get counters;
  HeapSpace? get newSpace;
  HeapSpace? get oldSpace;

  IsolateStatus? get status;

  /// [optional]
  FunctionRef? get entry;
}
