// 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});
    }
  }
}
