# The stream verb: atProtocol

## Introduction

The stream verb in the atPlatform is used to send and receive files between two atSigns. A secure socket is created between the sender and receiver atSign to transfer a file. Once the file transfer is complete, the stream verb makes use of the notification verb to inform the sender when the file transfer is done.

## Description

### 1\. Sample Stream Sender:

```plaintext
await AtClientImpl.createClient(
   '@alice', '@mosphere', preference);
var atClient = await AtClientImpl.getClient('@alice');
var streamResult =
   await atClient.stream('@bob', 'sample_image.jpg');
```

### 2\. Sample Stream Receiver:

The receiver app or client makes use of the monitor verb to receive file transfer notifications. The receiver accepts the stream transfer by sending an ack back to the sender.

#### 2.1 Initiate receiver with monitor:

```plaintext
await AtClientImpl.createClient(
   '@bob', '@mosphere', preference);
var atClient = await AtClientImpl.getClient('@bob’);
await atClient.startMonitor(preference.privateKey, _notificationCallBack)
```

#### 2.2 Implement the callback to send ack to receiver:

```plaintext
Future<void> _notificationCallBack(var notification) async {
 response = notification.replaceFirst('notification:', '');
 var responseJson = jsonDecode(response);
 var notificationKey = responseJson['key'];
 var senderAtSign = responseJson['from'];
 var atKey = notificationKey.split(':')[1];
 atKey = atKey.replaceFirst(senderAtSign, '').trim();
 if (atKey == 'stream_id') {
   var valueObject = responseJson['value'];
   var streamId = valueObject.split(':')[0];
   var fileName = valueObject.split(':')[1];
   var fileLength = int.parse(valueObject.split(':')[2]);
   fileName = utf8.decode(base64.decode(fileName));     
   print('user accepted transfer.Sending ack back');
   await atClient.sendStreamAck(streamId, fileName, fileLength, fromAtSign,
         _streamCompletionCallBack, _streamReceiveCallBack);
   } 
}

void _streamReceiveCallBack(var bytesReceived) {
 print('Receive callback bytes received: ${bytesReceived}');
}

void _streamCompletionCallBack(var streamId) {
 print('Transfer done for stream: ${streamId}');
}
```

Refer to the [StreamVerbHandler](https://github.com/atsign-foundation/at_server/blob/master/at_secondary/at_secondary_server/lib/src/verb/handler/stream_verb_handler.dart) to learn more.

### Coming Soon

In the future, we will implement a store and forward approach to transfer files when the stream receiver is offline. We are changing the Internet for good. Join us on

%%\[discord\]

and code with us.
