From e07af507674a78a054ed9fb402dc7d7b358353d5 Mon Sep 17 00:00:00 2001 From: Prashant Pandey Date: Wed, 5 Jun 2024 13:52:11 -0400 Subject: [PATCH 1/4] fixed length message from magic header --- lib/transformers.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/transformers.dart b/lib/transformers.dart index 0b36dbb..3b8b4e6 100644 --- a/lib/transformers.dart +++ b/lib/transformers.dart @@ -341,7 +341,8 @@ class MagicHeaderAndLengthByteTransformer return; } - int len = _partial[header!.length]; + // int len = _partial[header!.length]; + int len = 75; if (_partial.length < len + header!.length + 1) { // not completely arrived yet. return; From d5e82a6c58a4d2f3abb27200c82ef5c6d0533385 Mon Sep 17 00:00:00 2001 From: Prashant Pandey Date: Wed, 5 Jun 2024 13:55:56 -0400 Subject: [PATCH 2/4] test changing length param --- lib/transformers.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/transformers.dart b/lib/transformers.dart index 3b8b4e6..1a1a014 100644 --- a/lib/transformers.dart +++ b/lib/transformers.dart @@ -342,7 +342,7 @@ class MagicHeaderAndLengthByteTransformer } // int len = _partial[header!.length]; - int len = 75; + int len = 74; if (_partial.length < len + header!.length + 1) { // not completely arrived yet. return; From b7299851a83e173e3e01e27d429afa7c874182e6 Mon Sep 17 00:00:00 2001 From: Prashant Pandey Date: Wed, 5 Jun 2024 14:33:22 -0400 Subject: [PATCH 3/4] new class MagicHeaderFixedLength which does not rely on the stream itself to determine message length, rather it accepts a fixed length integer as the message length --- lib/transaction.dart | 14 +++++++++ lib/transformers.dart | 66 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/lib/transaction.dart b/lib/transaction.dart index f136970..e7747d7 100644 --- a/lib/transaction.dart +++ b/lib/transaction.dart @@ -65,6 +65,20 @@ class Transaction { header: header, maxLen: maxLen)); } + /// Create a transaction that uses MagicHeaderFixedLengthByteTransformer + /// + /// ```dart + /// Transaction.magicHeaderFixedLength(p.inputStream, Uint8List.fromList([65,65,65]), len: 10); // expects magic header AAA and fixed length 10. + /// ``` + static Transaction magicHeaderFixedLength( + Stream stream, List header, int len, + {int maxLen = 1024}) { + return Transaction( + stream, + MagicHeaderFixedLengthByteTransformer.broadcast( + header: header, len: len, maxLen: maxLen)); + } + /// Create a transaction that transforms the incoming stream into /// events delimited by 'terminator', returning Strings. /// diff --git a/lib/transformers.dart b/lib/transformers.dart index 1a1a014..58466ac 100644 --- a/lib/transformers.dart +++ b/lib/transformers.dart @@ -341,8 +341,7 @@ class MagicHeaderAndLengthByteTransformer return; } - // int len = _partial[header!.length]; - int len = 74; + int len = _partial[header!.length]; if (_partial.length < len + header!.length + 1) { // not completely arrived yet. return; @@ -386,3 +385,66 @@ class MagicHeaderAndLengthByteTransformer _controller.close(); } } + +class MagicHeaderFixedLengthByteTransformer + extends MagicHeaderAndLengthByteTransformer { + final int len; + + MagicHeaderFixedLengthByteTransformer( + {bool sync = false, + bool? cancelOnError, + List? header, + required this.len, + int maxLen = 1024, + Duration clearTimeout = const Duration(seconds: 1)}) + : super( + sync: sync, + cancelOnError: cancelOnError, + header: header, + maxLen: maxLen, + clearTimeout: clearTimeout); + + MagicHeaderFixedLengthByteTransformer.broadcast( + {bool sync = false, + bool? cancelOnError, + List? header, + required this.len, + int maxLen = 1024, + Duration clearTimeout = const Duration(seconds: 1)}) + : super.broadcast( + sync: sync, + cancelOnError: cancelOnError, + header: header, + maxLen: maxLen, + clearTimeout: clearTimeout); + + @override + void onData(Uint8List data) { + _dataSinceLastTick = true; + if (_partial.length > maxLen) { + _partial = _partial.sublist(_partial.length - maxLen); + } + + _partial.addAll(data); + + while (_partial.length > 0) { + int index = wildcardFind(header, _partial); + if (index < 0) { + return; + } + + if (index > 0) { + _partial = _partial.sublist(index); + } + + if (_partial.length < header!.length + len) { + // not completely arrived yet. + return; + } + + _controller + .add(Uint8List.fromList(_partial.sublist(0, len + header!.length))); + _partial = _partial.sublist(len + header!.length); + } + } +} \ No newline at end of file From d0c95ae9fe2e325cb6bff2b96914104113e7461a Mon Sep 17 00:00:00 2001 From: Prashant Pandey Date: Wed, 5 Jun 2024 15:13:25 -0400 Subject: [PATCH 4/4] was off by one --- lib/transformers.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/transformers.dart b/lib/transformers.dart index 58466ac..bb70f6e 100644 --- a/lib/transformers.dart +++ b/lib/transformers.dart @@ -437,14 +437,14 @@ class MagicHeaderFixedLengthByteTransformer _partial = _partial.sublist(index); } - if (_partial.length < header!.length + len) { + if (_partial.length < header!.length + len + 1) { // not completely arrived yet. return; } _controller - .add(Uint8List.fromList(_partial.sublist(0, len + header!.length))); - _partial = _partial.sublist(len + header!.length); + .add(Uint8List.fromList(_partial.sublist(0, len + header!.length + 1))); + _partial = _partial.sublist(len + header!.length + 1); } } } \ No newline at end of file