createContext method

Future<JsContext> createContext({
  1. JsModuleLoader? moduleLoader,
  2. List<JsScript> scripts = const <JsScript>[],
  3. List<JsModule> modules = const <JsModule>[],
  4. List<JsHostMethod> methods = const <JsHostMethod>[],
  5. List<JsFeatures> features = const <JsFeatures>[],
  6. List<JsPlugin> plugins = const <JsPlugin>[],
  7. JsConsoleSink? onConsole,
})

Creates a context with an independent global object and module registry.

Implementation

Future<JsContext> createContext({
  JsModuleLoader? moduleLoader,
  List<JsScript> scripts = const <JsScript>[],
  List<JsModule> modules = const <JsModule>[],
  List<JsHostMethod> methods = const <JsHostMethod>[],
  List<JsFeatures> features = const <JsFeatures>[],
  List<JsPlugin> plugins = const <JsPlugin>[],

  /// 接收当前 context 的 JavaScript console 事件;未设置时不会向 Dart 转发。
  JsConsoleSink? onConsole,
}) async {
  _ensureOpen();
  final contextRuntimeOptions = JsOptions(
    memoryLimitBytes: options.memoryLimitBytes,
    stackLimitBytes: options.stackLimitBytes,
    maxPendingTasks: options.maxPendingTasks,
  );
  late final _JsContextRuntimeAdapter adapter;
  if (_root case final JsMultiContextRuntimeBase multi) {
    final id = await multi.createContext();
    adapter = _JsContextRuntimeAdapter.shared(this, multi, id);
  } else {
    final isolated = await _backend.createRuntime(contextRuntimeOptions);
    adapter = _JsContextRuntimeAdapter.isolated(this, isolated);
  }
  final context = JsContext._(this, adapter);
  _contexts.add(context);
  try {
    context._engine = await createJsContextEngine(
      _backend,
      adapter,
      options: contextRuntimeOptions,
      moduleLoader: moduleLoader,
      scripts: scripts,
      modules: modules,
      methods: methods,
      features: features,
      plugins: plugins,
      onConsole: onConsole,
    );
  } catch (_) {
    _contexts.remove(context);
    rethrow;
  }
  if (_closed) {
    await context.dispose();
    throw JsRuntimeClosedException();
  }
  return context;
}