Skip to content

Commit

Permalink
perf(dynamite_runtime,nextcloud): BytesStreamExtension add stream bas…
Browse files Browse the repository at this point in the history
…ed xml decoding

Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
  • Loading branch information
Leptopoda committed Nov 20, 2023
1 parent 284666c commit 34ea5ed
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 4 deletions.
18 changes: 16 additions & 2 deletions packages/dynamite/dynamite_runtime/lib/src/http_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@ import 'dart:convert';
import 'dart:typed_data';

import 'package:universal_io/io.dart';
import 'package:xml/xml.dart';
import 'package:xml/xml_events.dart';

/// A stream of bytes.
///
/// Usually a `Stream<Uint8List>`.
typedef BytesStream = Stream<List<int>>;

final _utf8JsonDecoder = utf8.decoder.fuse(json.decoder);
final _xmlConverter =
utf8.decoder.fuse(XmlEventDecoder()).fuse(const XmlNormalizeEvents()).fuse(const XmlNodeDecoder());

final _jsonBytesConverter = utf8.decoder.fuse(json.decoder);

/// Extension on byte streams that enable efficient transformations.
extension BytesStreamExtension on BytesStream {
Expand All @@ -26,7 +31,16 @@ extension BytesStreamExtension on BytesStream {
Future<String> get string => transform(utf8.decoder).join();

/// Converts the stream into a JSON using the [utf8] encoding.
Future<Object?> get json => transform(_utf8JsonDecoder).first;
Future<Object?> get json => transform(_jsonBytesConverter).first;

/// Converts the stream into XML using the [utf8] encoding.
Future<XmlElement> get xml async {
final element = await transform(_xmlConverter)
.expand((final events) => events)
.firstWhere((final element) => element is XmlElement);

return element as XmlElement;
}
}

/// Extension on a http responses.
Expand Down
2 changes: 2 additions & 0 deletions packages/dynamite/dynamite_runtime/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ environment:
dependencies:
built_collection: ^5.0.0
built_value: ^8.0.1
collection: ^1.0.0
cookie_jar: ^4.0.7
meta: ^1.0.0
universal_io: ^2.0.0
xml: ^6.0.0

dev_dependencies:
build_runner: ^2.4.6
Expand Down
3 changes: 1 addition & 2 deletions packages/nextcloud/lib/src/webdav/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:nextcloud/src/webdav/path_uri.dart';
import 'package:nextcloud/src/webdav/props.dart';
import 'package:nextcloud/src/webdav/webdav.dart';
import 'package:universal_io/io.dart';
import 'package:xml/xml.dart' as xml;

/// Base path used on the server
final webdavBase = PathUri.parse('/remote.php/webdav');
Expand Down Expand Up @@ -73,7 +72,7 @@ class WebDavClient {
}

Future<WebDavMultistatus> _parseResponse(final HttpClientResponse response) async =>
WebDavMultistatus.fromXmlElement(xml.XmlDocument.parse(await response.string).rootElement);
WebDavMultistatus.fromXmlElement(await response.xml);

Map<String, String> _getUploadHeaders({
required final DateTime? lastModified,
Expand Down

0 comments on commit 34ea5ed

Please sign in to comment.