// 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 repositories;

class IsolateRepository extends M.IsolateRepository {
  final S.VM _vm;

  Iterable<M.Service> get reloadSourcesServices =>
      _vm.services.where((S.Service s) => s.service == 'reloadSources');

  IsolateRepository(this._vm) {
    assert(_vm != null);
  }

  Future<M.Isolate> get(M.IsolateRef i) async {
    S.Isolate isolate = i as S.Isolate;
    assert(isolate != null);
    try {
      await isolate.reload();
    } on SC.NetworkRpcException catch (_) {
      /* ignore */
    }
    return isolate;
  }

  Future reloadSources(M.IsolateRef i, {M.Service? service}) async {
    if (service == null) {
      S.Isolate isolate = i as S.Isolate;
      assert(isolate != null);
      await isolate.reloadSources();
    } else {
      S.Service srv = service as S.Service;
      assert(srv != null);
      await _vm.invokeRpcNoUpgrade(srv.method, {'isolateId': i.id});
    }
  }
}
