init method
Public APIs to be implemented by any Persistor extension like FilePersistor.
Implementation
@override
Future<void> init() async {
final [encrypter, directory] = await Future.wait([
initEncrypter(),
initDirectory(),
]);
// Create a receive port on the main isolate to receive messages from the worker.
receivePort = ReceivePort();
receivePort.listen(_onMessage);
// The initial message request to the worker contains three necessary values:
// 1. The persistor's send port that will allow for message passing from the worker.
// 2. The directory that the worker uses to persist file data stores.
// 3. The encrypter used by file data stores that have encryption enabled.
final initMessage = InitMessageRequest(
sendPort: receivePort.sendPort,
directory: directory as Directory,
encrypter: encrypter as Encrypter?,
);
final completer =
_messageRequestIndex[initMessage.id] = Completer<InitMessageResponse>();
try {
await measureDuration('Worker spawn', () async {
return Isolate.spawn(
FilePersistorWorker.init,
initMessage,
debugName: 'Loon worker',
);
});
final response = await completer.future;
sendPort = response.sendPort;
} catch (e) {
printDebug("Failed to initialize file persistor worker");
receivePort.close();
rethrow;
}
}