diff --git a/lib/controllers/client.dart b/lib/controllers/client.dart index 0ba29d5..7d9604b 100644 --- a/lib/controllers/client.dart +++ b/lib/controllers/client.dart @@ -108,7 +108,7 @@ class ClientController extends AsyncNotifier { () => callback(handle, bufferPointer.ref), ); - final json = response.buf.toJson(); + final json = response.buf.toJsonAndFree(); if (response.command.cast().toDartString() == "error") { throw json; diff --git a/lib/controllers/gomuks_listener.dart b/lib/controllers/gomuks_listener.dart index 489af72..2a43676 100644 --- a/lib/controllers/gomuks_listener.dart +++ b/lib/controllers/gomuks_listener.dart @@ -35,7 +35,7 @@ class GomuksListenerController extends AsyncNotifier { try { final muksEventType = command.cast().toDartString(); debugPrint("Handling $muksEventType..."); - final decodedMuksEvent = data.toJson(); + final decodedMuksEvent = data.toJsonAndFree(); switch (muksEventType) { case "client_state": diff --git a/lib/helpers/extensions/gomuks_buffer.dart b/lib/helpers/extensions/gomuks_buffer.dart index cc16b46..10a273a 100644 --- a/lib/helpers/extensions/gomuks_buffer.dart +++ b/lib/helpers/extensions/gomuks_buffer.dart @@ -1,20 +1,21 @@ import "dart:convert"; import "dart:ffi"; import "dart:typed_data"; + import "package:ffi/ffi.dart"; import "package:nexus/src/third_party/gomuks.g.dart"; extension GomuksOwnedBufferToX on GomuksOwnedBuffer { - Uint8List toBytes() { + Uint8List toBytesAndFree() { try { if (base == nullptr || length <= 0) return .new(0); return .fromList(base.asTypedList(length)); } finally { - calloc.free(base); + GomuksFreeBuffer(this); } } - dynamic toJson() => jsonDecode(utf8.decode(toBytes())); + dynamic toJsonAndFree() => jsonDecode(utf8.decode(toBytesAndFree())); } extension JsonToGomuksBuffer on Map {