acquire method

Future<JavascriptRuntime> acquire({
  1. Duration? timeout,
})

Borrow an engine. Blocks (async) if all engines are in use until one is released, unless timeout elapses.

Implementation

Future<JavascriptRuntime> acquire({Duration? timeout}) async {
  if (_disposed) throw StateError('JsEnginePool is disposed');

  if (_idle.isNotEmpty) {
    final engine = _idle.removeFirst();
    _leased.add(engine);
    return engine;
  }
  if (_all.length < maxSize) {
    final eng = _create();
    _all.add(eng);
    _leased.add(eng);
    return eng;
  }

  final c = Completer<JavascriptRuntime>();
  _waiters.add(c);
  if (timeout != null) {
    return c.future.timeout(
      timeout,
      onTimeout: () {
        _waiters.remove(c);
        throw TimeoutException('JsEnginePool.acquire', timeout);
      },
    );
  }
  return c.future;
}