OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 /// Functions go in this file as opposed to lib/src/utils.dart if they need to | |
6 /// be accessible to the transformer-loading isolate. | |
7 library pub.asset.utils; | |
8 | |
9 import 'dart:async'; | |
10 | |
11 /// A regular expression to match the exception prefix that some exceptions' | |
12 /// [Object.toString] values contain. | |
13 final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): '); | |
14 | |
15 /// Get a string description of an exception. | |
16 /// | |
17 /// Many exceptions include the exception class name at the beginning of their | |
18 /// [toString], so we remove that if it exists. | |
19 String getErrorMessage(error) => | |
20 error.toString().replaceFirst(_exceptionPrefix, ''); | |
21 | |
22 /// Returns a buffered stream that will emit the same values as the stream | |
23 /// returned by [future] once [future] completes. | |
24 /// | |
25 /// If [future] completes to an error, the return value will emit that error and | |
26 /// then close. | |
27 /// | |
28 /// If [broadcast] is true, a broadcast stream is returned. This assumes that | |
29 /// the stream returned by [future] will be a broadcast stream as well. | |
30 /// [broadcast] defaults to false. | |
31 Stream futureStream(Future<Stream> future, {bool broadcast: false}) { | |
32 var subscription; | |
33 var controller; | |
34 | |
35 future = future.catchError((e, stackTrace) { | |
36 // Since [controller] is synchronous, it's likely that emitting an error | |
37 // will cause it to be cancelled before we call close. | |
38 if (controller != null) controller.addError(e, stackTrace); | |
39 if (controller != null) controller.close(); | |
40 controller = null; | |
41 }); | |
42 | |
43 onListen() { | |
44 future.then((stream) { | |
45 if (controller == null) return; | |
46 subscription = stream.listen( | |
47 controller.add, | |
48 onError: controller.addError, | |
49 onDone: controller.close); | |
50 }); | |
51 } | |
52 | |
53 onCancel() { | |
54 if (subscription != null) subscription.cancel(); | |
55 subscription = null; | |
56 controller = null; | |
57 } | |
58 | |
59 if (broadcast) { | |
60 controller = new StreamController.broadcast( | |
61 sync: true, onListen: onListen, onCancel: onCancel); | |
62 } else { | |
63 controller = new StreamController( | |
64 sync: true, onListen: onListen, onCancel: onCancel); | |
65 } | |
66 return controller.stream; | |
67 } | |
68 | |
69 /// Returns a [Stream] that will emit the same values as the stream returned by | |
70 /// [callback]. | |
71 /// | |
72 /// [callback] will only be called when the returned [Stream] gets a subscriber. | |
73 Stream callbackStream(Stream callback()) { | |
74 var subscription; | |
75 var controller; | |
76 controller = new StreamController(onListen: () { | |
77 subscription = callback().listen(controller.add, | |
78 onError: controller.addError, | |
79 onDone: controller.close); | |
80 }, | |
81 onCancel: () => subscription.cancel(), | |
82 onPause: () => subscription.pause(), | |
83 onResume: () => subscription.resume(), | |
84 sync: true); | |
85 return controller.stream; | |
86 } | |
OLD | NEW |