Skip to main content

MTE Relay Client for Flutter (CocoaPods)

Latest Release

Introduction​

This Flutter plugin provides the Eclypses MteRelay Mobile Client for iOS and Android. It enables secure, encrypted HTTP(S) communication between your Flutter app and your backend via an MteRelay server. You must have licensed access to an MteRelay server instance. More Info

Purpose of MteRelay:

  • Securely relay HTTP requests to your server
  • Protect sensitive headers and data with MTE encryption
  • Stream large files efficiently
Comprehensive Documentation

This guide provides a quick-start for experienced developers. For detailed examples, troubleshooting, and in-depth explanations, see the complete documentation on GitHub.

Prerequisites​

  • Flutter SDK (stable channel)
  • iOS 16.0+ / Android SDK
  • CocoaPods (for iOS)
  • Access to a licensed MteRelay server instance

Installation​

Add to your pubspec.yaml:

dependencies:
mte_relay_client_plugin:
git:
url: https://github.com/Eclypses/mte-relay-client-flutter-pod.git
ref: 4.3.1

Run flutter pub get.

iOS Setup (CocoaPods)​

Update your ios/Podfile:

platform :ios, '16.0'

target 'Runner' do
use_frameworks!
pod 'MteRelay', :git => 'https://github.com/Eclypses/mte-relay-client-ios.git', :tag => '4.4.7'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

Then run:

cd ios && pod install --repo-update && cd ..

Android Setup​

No additional configuration required.

Setup​

Import and initialize the plugin:

import 'package:mte_relay_client_plugin/mte_relay_client_plugin.dart';
import 'package:mte_relay_client_plugin/mte_relay_response_model.dart';

class YourClass {
final _relay = MteRelayClientPlugin();

Future<void> init() async {
// Set up callbacks
_relay.relayResponseStream.listen((message) {
// Handle relay messages
});

_relay.relayStreamResponseStream.listen((args) {
// Handle file stream responses
bool success = args['success'];
int statusCode = args['statusCode'];
Uint8List? data = args['data'];
});

// Initialize relay
await _relay.initializeRelay();
}
}

Usage​

Standard HTTP Request​

final args = {
'url': 'https://your-relay-server.com',
'route': '/api/endpoint', // Encrypted
'method': 'POST',
'headers': {'Content-Type': 'application/json'},
'headersToEncrypt': ['Content-Type'],
'pathnamePrefix': null, // Optional unencrypted prefix
'body': jsonEncode({'key': 'value'}),
};

Map response = await _relay.relayDataTask(args);
final result = Result.fromMap(response);

if (result.isSuccess) {
final json = result.bodyAsJsonObject;
}

Streamed File Upload​

// Set up chunk streaming callback
_relay.relayRequestChunksStream.listen((streamID) async {
final fileStream = file.openRead();
await for (final chunk in fileStream) {
await _relay.sendChunk({'streamID': streamID, 'data': Uint8List.fromList(chunk)});
}
await _relay.closeStream({'streamID': streamID});
});

// Progress callback
_relay.relayStreamCompletionStream.listen((progress) {
double percent = double.parse(progress);
});

// Start upload
final args = {
'url': relayServerUrl,
'route': '/api/upload',
'method': 'POST',
'headers': {'Content-Type': 'multipart/form-data; boundary=...', 'Content-Length': '...'},
'headersToEncrypt': ['Content-Type'],
};
await _relay.relayUploadFile(args);

Streamed File Download​

final args = {
'url': relayServerUrl,
'route': '/api/download/filename.pdf',
'method': 'GET',
'headers': {'Content-Type': 'application/json'},
'headersToEncrypt': ['Content-Type'],
'downloadLocation': '/path/to/save/file.pdf',
};
await _relay.relayDownloadFile(args);
// Response via relayStreamResponseStream

Re-pair with Server​

await _relay.rePair({'url': relayServerUrl, 'pathnamePrefix': null});

Adjust Relay Settings​

await _relay.adjustRelaySettings({
'url': relayServerUrl,
'pathnamePrefix': null,
'streamChunkSize': 1024 * 1024, // 1MB
'pairPoolSize': 3,
'persistPairs': false,
});

Logging​

await _relay.enableFileLogging({'url': relayServerUrl, 'isEnabled': true});

String logs = await _relay.readLogFile({'url': relayServerUrl});
await _relay.clearLogFile({'url': relayServerUrl});

API Reference​

See the source code and inline documentation for full API details. Key classes:

  • MteRelayClientPlugin: Main entry point for secure requests and file streaming
  • Result<T>: Response wrapper with typed data
  • NativeHttpResponse: Response wrapper with raw Uint8List body

Support​

Email: info@eclypses.com
Web: www.eclypses.com

Additional Resources​


All trademarks of Eclypses Inc. may not be used without Eclypses Inc.'s prior written consent.