load method
Implementation
Future<model_pb.ModelLoadResult> load(
model_pb.ModelLoadRequest request,
) async {
final fn = RacNative.bindings.rac_model_lifecycle_load_proto;
if (fn == null) {
return model_pb.ModelLoadResult(
success: false,
modelId: request.modelId,
category: request.category,
framework: request.framework,
errorMessage: 'Model lifecycle load proto API is unavailable',
);
}
final registry = DartBridgeModelRegistry.instance.nativeHandle;
if (registry == null || registry == nullptr) {
return model_pb.ModelLoadResult(
success: false,
modelId: request.modelId,
category: request.category,
framework: request.framework,
errorMessage: 'Model registry is not initialized',
);
}
// Main-isolate FFI call (reverts an earlier `Isolate.run` wrap).
// See class-level note: synchronous platform-adapter callbacks are still
// main-isolate callbacks. We accept the main-isolate cost until those
// adapter services are bridged through a cross-thread-safe design.
final bytes = request.writeToBuffer();
final requestPtr = calloc<Uint8>(bytes.isEmpty ? 1 : bytes.length);
final out = calloc<RacProtoBuffer>();
final bindings = RacNative.bindings;
try {
if (bytes.isNotEmpty) {
requestPtr.asTypedList(bytes.length).setAll(0, bytes);
}
bindings.rac_proto_buffer_init(out);
final code = fn(registry, requestPtr, bytes.length, out);
if (code != RacResultCode.success ||
out.ref.status != RacResultCode.success) {
_logger.debug(
'rac_model_lifecycle_load_proto failed: '
'${_protoBufferError(out, code)}',
);
return model_pb.ModelLoadResult(
success: false,
modelId: request.modelId,
category: request.category,
framework: request.framework,
errorMessage: _protoBufferError(out, code),
);
}
return _decodeBuffer(out, model_pb.ModelLoadResult.fromBuffer);
} catch (e) {
_logger.debug('rac_model_lifecycle_load_proto error: $e');
return model_pb.ModelLoadResult(
success: false,
modelId: request.modelId,
category: request.category,
framework: request.framework,
errorMessage: 'rac_model_lifecycle_load_proto threw: $e',
);
} finally {
bindings.rac_proto_buffer_free(out);
calloc.free(requestPtr);
calloc.free(out);
}
}