55import 'dart:async' ;
66import 'dart:convert' ;
77import 'dart:io' ;
8+ import 'dart:typed_data' ;
89
910import 'package:dart_runtime_service/dart_runtime_service.dart' ;
1011import 'package:file/local.dart' ;
1112
13+ Future <List <int >> _collectBytes (Stream <List <int >> stream) async {
14+ final builder = BytesBuilder (copy: false );
15+ await for (final chunk in stream) {
16+ builder.add (chunk);
17+ }
18+ return builder.takeBytes ();
19+ }
20+
1221/// An outstanding write request managed by [_WriteLimiter] .
1322class _PendingWrite {
1423 _PendingWrite ({
@@ -20,7 +29,7 @@ class _PendingWrite {
2029
2130 final LocalFileSystem _localFs;
2231 final Uri uri;
23- final Stream < List <int > > bytes;
32+ final List <int > bytes;
2433
2534 Future <void > write () async {
2635 final file = _localFs.file (uri);
@@ -29,9 +38,7 @@ class _PendingWrite {
2938 if (await file.exists ()) {
3039 await file.delete ();
3140 }
32- final sink = file.openWrite ();
33- await sink.addStream (bytes);
34- await sink.close ();
41+ await file.writeAsBytes (bytes, flush: true );
3542 completer.complete ();
3643 _WriteLimiter ._writeCompleted ();
3744 }
@@ -51,19 +58,20 @@ abstract class _WriteLimiter {
5158 required LocalFileSystem localFs,
5259 required Uri uri,
5360 required List <int > bytes,
54- }) => scheduleWriteStream (
55- localFs: localFs,
56- uri: uri,
57- bytes: Stream .fromIterable ([bytes]),
58- );
61+ }) {
62+ final pw = _PendingWrite (localFs: localFs, uri: uri, bytes: bytes);
63+ pendingWrites.add (pw);
64+ _maybeWriteFiles ();
65+ return pw.completer.future;
66+ }
5967
6068 static Future <void > scheduleWriteStream ({
6169 required LocalFileSystem localFs,
6270 required Uri uri,
6371 required Stream <List <int >> bytes,
64- }) {
65- // Create a new pending write.
66- final pw = _PendingWrite (localFs: localFs, uri: uri, bytes: bytes );
72+ }) async {
73+ final collectedBytes = await _collectBytes (bytes);
74+ final pw = _PendingWrite (localFs: localFs, uri: uri, bytes: collectedBytes );
6775 pendingWrites.add (pw);
6876 _maybeWriteFiles ();
6977 return pw.completer.future;
@@ -150,7 +158,7 @@ final class VMDevelopmentFileSystem extends DevelopmentFileSystem {
150158 @override
151159 Future <RpcResponse > listFiles () async {
152160 final dir = _localFs.directory (rootUri);
153- final dirPathStr = dir.path;
161+ final dirPathStr = Uri . file ( dir.path) .path;
154162 final stream = dir.list (recursive: true );
155163 final files = < Map <String , Object ?>> [];
156164 await for (final fileEntity in stream) {
@@ -160,7 +168,7 @@ final class VMDevelopmentFileSystem extends DevelopmentFileSystem {
160168 filePath.startsWith (dirPathStr)) {
161169 files.add (< String , Object ? > {
162170 // Remove any url-encoding in the filenames.
163- 'name' : Uri .decodeFull ('/${ filePath .substring (dirPathStr .length )}' ),
171+ 'name' : Uri .decodeFull (filePath.substring (dirPathStr.length)),
164172 'size' : stat.size,
165173 'modified' : stat.modified.millisecondsSinceEpoch,
166174 });
0 commit comments