Created
April 3, 2023 16:20
-
-
Save untoldone/e1d19ec73702a09dcbc2555a8bda0a2e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:io'; | |
import 'dart:convert'; | |
import 'dart:math'; | |
import 'dart:typed_data'; | |
import 'package:http/http.dart' as http; | |
// Upload | |
// 1MB | |
const MaxUploadSize = 1 << 20; | |
// 8KB | |
const InitUploadSize = 1 << 13; | |
var bytesSoFar = 0; | |
var lastMessageSize = InitUploadSize; | |
Uint8List randomMessage = Uint8List(MaxUploadSize); | |
Stream<Uint8List> uploadMessageStream() async* { | |
var rand = Random(); | |
for (var i = 0; i < MaxUploadSize; i++) { | |
randomMessage[i] = rand.nextInt(256); | |
} | |
while (true) { | |
if (lastMessageSize >= MaxUploadSize || | |
lastMessageSize >= (bytesSoFar / 16)) { | |
bytesSoFar += lastMessageSize; | |
yield randomMessage.sublist(0, lastMessageSize); | |
} else { | |
var nextMessageSize = lastMessageSize * 2; | |
lastMessageSize = nextMessageSize; | |
bytesSoFar += nextMessageSize; | |
yield randomMessage.sublist(0, nextMessageSize); | |
} | |
} | |
} | |
Uint8List nextUploadMessage() { | |
if (bytesSoFar == 0) { | |
var rand = Random(); | |
for (var i = 0; i < MaxUploadSize; i++) { | |
randomMessage[i] = rand.nextInt(256); | |
} | |
} | |
if (lastMessageSize >= MaxUploadSize || | |
lastMessageSize >= (bytesSoFar / 16)) { | |
bytesSoFar += lastMessageSize; | |
return randomMessage.sublist(0, lastMessageSize); | |
} else { | |
var nextMessageSize = lastMessageSize * 2; | |
lastMessageSize = nextMessageSize; | |
bytesSoFar += nextMessageSize; | |
return randomMessage.sublist(0, nextMessageSize); | |
} | |
} | |
upload(String url) async { | |
final socket = | |
await WebSocket.connect(url, protocols: ['net.measurementlab.ndt.v7']); | |
DateTime startTime = DateTime.now(); | |
socket.listen( | |
(event) { | |
print("here"); | |
if (event is String) { | |
print(event); | |
} else { | |
print("Unexpected type while uploading: ${event.runtimeType}"); | |
} | |
}, | |
onDone: () { | |
DateTime endTime = DateTime.now(); | |
var took = endTime.difference(startTime); | |
print("Took ${took}"); | |
}, | |
onError: (error) => print(error), | |
cancelOnError: false, | |
); | |
//while (socket.closeCode == null) { | |
//var message = nextUploadMessage(); | |
//socket.add(message); | |
//print(socket.length); | |
var stream = uploadMessageStream(); | |
socket.addStream(stream); | |
//} | |
} | |
// Download | |
download(String url) async { | |
DateTime startTime = DateTime.now(); | |
final socket = | |
await WebSocket.connect(url, protocols: ['net.measurementlab.ndt.v7']); | |
socket.listen( | |
(event) { | |
if (event is Uint8List) { | |
} else if (event is String) { | |
//print(event); | |
} else { | |
//print(event.runtimeType); | |
} | |
}, | |
onDone: () { | |
DateTime endTime = DateTime.now(); | |
var took = endTime.difference(startTime); | |
print("Took ${took}"); | |
}, | |
onError: (error) => print(error), | |
cancelOnError: false, | |
); | |
} | |
Future<List<String>> locate() async { | |
var client = http.Client(); | |
var url = Uri.parse( | |
'https://locate.measurementlab.net/v2/nearest/ndt/ndt7?client_name=dart-client&client_library_name=ndt7-dart&client_library_version=0.0.1'); | |
var rawResponse = await client.get(url); | |
print(rawResponse.body); | |
print('Response status: ${rawResponse.statusCode}'); | |
var response = jsonDecode(rawResponse.body); | |
var downloadUrl = response['results'][0]['urls']['ws:///ndt/v7/download']; | |
var uploadUrl = response['results'][0]['urls']['ws:///ndt/v7/upload']; | |
return [downloadUrl, uploadUrl]; | |
} | |
void main() async { | |
var results = await locate(); | |
await download(results[0]); | |
await upload(results[1]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment