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');

  final isolate = await Isolate.spawn(
    _isolateMain,
    debugName: 'Shard #$id runner',
    _IsolateSpawnData(
      totalShards: totalShards,
      id: id,
      apiOptions: apiOptions,
      originalConnectionUri: connectionUri,
      sendPort: receivePort.sendPort,
    ),
  );

  final exitPort = ReceivePort('Shard #$id exit listener');
  isolate.addOnExitListener(exitPort.sendPort);
  exitPort.listen((_) {
    logger.info('Shard exited');

    receivePort.close();
    exitPort.close();
  });

  final sendPort = await receiveStream.first as SendPort;

  logger.fine('Shard runner ready');

  return Shard(id, isolate, receiveStream, sendPort, client);
}