sendMessageDirect method

  1. @override
Future<void> sendMessageDirect(
  1. Message message, [
  2. String? pluginId,
  3. PluginInformation? plugin
])
override

Send a message to a another plugin without waiting for previous dispatches to finish.

If plugin is not provided, pluginId or alternatively message.targetId is used to retrieve the registered plugin information.

Implementation

@override
Future<void> sendMessageDirect(Message message,
    [String? pluginId, PluginInformation? plugin]) async {
  pluginId ??= message.targetId;
  plugin ??= plugins[StorableString(pluginId)] ??
      PluginInformation(
          pluginId!,
          GeigerApi.masterExecutor,
          pluginId == GeigerApi.masterId ? GeigerCommunicator.masterPort : 0,
          Declaration.doNotShareData,
          null);
  if (id == plugin.id) {
    unawaited(receivedMessage(message, skipAuth: true));
    return;
  }

  final inBackground = message.type != MessageType.returningControl;
  GeigerApi.logger.log(
      Level.INFO, '## Sending message to plugin ${plugin.id} ($message)');
  if (plugin.port == 0) {
    await PluginStarter.startPlugin(plugin, inBackground, this);
    // wait for startup
    await _StartupWaiter(this, plugin.id).wait();
    plugin = plugins[StorableString(plugin.id)]!;
  } else if (!inBackground && (Platform.isAndroid || Platform.isIOS)) {
    // On mobile devices an app cannot refocus itself
    await PluginStarter.startPlugin(plugin, inBackground, this);
  }

  var tries = 1;
  while (true) {
    try {
      await _communicator.sendMessage(plugin!, message);
      break;
    } on SocketException catch (e) {
      if (tries == maxSendTries ||
          e.osError?.message
                  .contains(RegExp('refused', caseSensitive: false)) !=
              true) {
        rethrow;
      }
      tries++;
      await PluginStarter.startPlugin(plugin!, inBackground, this);
      if (pluginId == GeigerApi.masterId) {
        await Future.delayed(masterStartWaitTime);
        // At start the master marks all plugins as inactive.
        // First need to reactivate this plugin.
        if (message.type != MessageType.activatePlugin &&
            message.type != MessageType.registerPlugin) {
          await _activatePlugin(true);
          // Activate plugin already waits max tries.
          tries = maxSendTries;
        }
      } else {
        await _StartupWaiter(this, plugin.id).wait();
        plugin = plugins[StorableString(plugin.id)]!;
      }
    }
  }
}