connect static method

Future<Shard> connect(
  1. int id,
  2. int totalShards,
  3. GatewayApiOptions apiOptions,
  4. Uri connectionUri,
  5. 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);
}