stream method

  1. @override
Future<AtStreamResponse> stream(
  1. String sharedWith,
  2. String filePath, {
  3. String? namespace,
})
override

Streams the file in filePath to sharedWith atSign.

Implementation

@override
Future<AtStreamResponse> stream(String sharedWith, String filePath,
    {String? namespace}) async {
  var streamResponse = AtStreamResponse();
  var streamId = Uuid().v4();
  var file = File(filePath);
  var data = file.readAsBytesSync();
  var fileName = basename(filePath);
  fileName = base64.encode(utf8.encode(fileName));
  var encryptedData =
      await _encryptionService!.encryptStream(data, sharedWith);
  var command =
      'stream:init$sharedWith namespace:$namespace $streamId $fileName ${encryptedData.length}\n';
  _logger.finer('sending stream init:$command');
  var remoteSecondary =
      RemoteSecondary(_atSign, _preference!, atChops: atChops);
  var result = await remoteSecondary.executeCommand(command, auth: true);
  _logger.finer('ack message:$result');
  if (result != null && result.startsWith('stream:ack')) {
    result = result.replaceAll('stream:ack ', '');
    result = result.trim();
    _logger.finer('ack received for streamId:$streamId');
    remoteSecondary.atLookUp.connection!.getSocket().add(encryptedData);
    var streamResult = await remoteSecondary.atLookUp.messageListener
        .read(maxWaitMilliSeconds: _preference!.outboundConnectionTimeout);
    if (streamResult.startsWith('stream:done')) {
      await remoteSecondary.atLookUp.connection!.close();
      streamResponse.status = AtStreamStatus.complete;
    }
  } else if (result != null && result.startsWith('error:')) {
    result = result.replaceAll('error:', '');
    streamResponse.errorCode = result.split('-')[0];
    streamResponse.errorMessage = result.split('-')[1];
    streamResponse.status = AtStreamStatus.error;
  } else {
    streamResponse.status = AtStreamStatus.noAck;
  }
  return streamResponse;
}