sendMessageDirect method
Future<void>
sendMessageDirect(
- Message message, [
- String? pluginId,
- 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)]!;
}
}
}
}