stream method
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;
}