connect static method
Future<Shard>
connect(
- int id,
- int totalShards,
- GatewayApiOptions apiOptions,
- Uri connectionUri,
- NyxxGateway client,
Connect to the Gateway using the provided parameters.
Implementation
static Future<Shard> connect(
int id,
int totalShards,
GatewayApiOptions apiOptions,
Uri connectionUri,
NyxxGateway client) async {
final logger = Logger('${client.options.loggerName}.Shards[$id]');
final receivePort = ReceivePort('Shard #$id message stream (main)');
final receiveStream = receivePort.asBroadcastStream();
logger.fine('Spawning shard runner');
Isolate? isolate;
if (!isWeb) {
isolate = await Isolate.spawn(
_isolateMain,
debugName: 'Shard #$id runner',
_IsolateSpawnData(
totalShards: totalShards,
id: id,
apiOptions: apiOptions,
originalConnectionUri: connectionUri,
sendPort: receivePort.sendPort,
),
);
}
ReceivePort? exitPort;
if (!isWeb) {
exitPort = ReceivePort('Shard #$id exit listener');
isolate!.addOnExitListener(exitPort.sendPort);
exitPort.listen((_) {
logger.info('Shard exited');
receivePort.close();
exitPort!.close();
});
} else {
final sendSink = StreamController<dynamic>();
final receiveStream = sendSink.stream.asBroadcastStream();
final exitFuture = _isolateMainWeb(_IsolateSpawnData(
totalShards: totalShards,
id: id,
apiOptions: apiOptions,
originalConnectionUri: connectionUri,
sendSink: sendSink,
));
exitFuture.then((_) {
logger.info('Shard exited');
receivePort.close();
exitPort!.close();
sendSink.close();
});
}
final sendPort = await receiveStream.first as SendPort;
logger.fine('Shard runner ready');
return Shard(id, receiveStream, sendPort, client, isolate, null, null);
}