Skip to content

Instantly share code, notes, and snippets.

@untoldone
Created April 3, 2023 16:20
Show Gist options
  • Save untoldone/e1d19ec73702a09dcbc2555a8bda0a2e to your computer and use it in GitHub Desktop.
Save untoldone/e1d19ec73702a09dcbc2555a8bda0a2e to your computer and use it in GitHub Desktop.
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