OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library pub.load_transformers; | 5 library pub.load_transformers; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 import 'dart:isolate'; | 9 import 'dart:isolate'; |
10 | 10 |
11 import 'package:barback/barback.dart'; | 11 import 'package:barback/barback.dart'; |
12 // TODO(nweiz): don't import from "src" once issue 14966 is fixed. | 12 // TODO(nweiz): don't import from "src" once issue 14966 is fixed. |
13 import 'package:barback/src/internal_asset.dart'; | 13 import 'package:barback/src/internal_asset.dart'; |
14 import 'package:source_maps/source_maps.dart'; | 14 import 'package:source_maps/source_maps.dart'; |
| 15 import 'package:stack_trace/stack_trace.dart'; |
15 | 16 |
16 import '../barback.dart'; | 17 import '../barback.dart'; |
17 import '../dart.dart' as dart; | 18 import '../dart.dart' as dart; |
18 import '../log.dart' as log; | 19 import '../log.dart' as log; |
19 import '../utils.dart'; | 20 import '../utils.dart'; |
20 import 'server.dart'; | 21 import 'server.dart'; |
21 | 22 |
22 /// A Dart script to run in an isolate. | 23 /// A Dart script to run in an isolate. |
23 /// | 24 /// |
24 /// This script serializes one or more transformers defined in a Dart library | 25 /// This script serializes one or more transformers defined in a Dart library |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path}; | 536 Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path}; |
536 | 537 |
537 /// Responds to a message sent by [_call]. | 538 /// Responds to a message sent by [_call]. |
538 /// | 539 /// |
539 /// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and | 540 /// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and |
540 /// passes the contents of the message to [callback], then sends the return | 541 /// passes the contents of the message to [callback], then sends the return |
541 /// value of [callback] back to [_call]. If [callback] returns a Future or | 542 /// value of [callback] back to [_call]. If [callback] returns a Future or |
542 /// throws an error, that will also be sent. | 543 /// throws an error, that will also be sent. |
543 void _respond(wrappedMessage, callback(message)) { | 544 void _respond(wrappedMessage, callback(message)) { |
544 var replyTo = wrappedMessage['replyTo']; | 545 var replyTo = wrappedMessage['replyTo']; |
545 new Future.sync(() => callback(wrappedMessage['message'])) | 546 syncFuture(() => callback(wrappedMessage['message'])) |
546 .then((result) => replyTo.send({'type': 'success', 'value': result})) | 547 .then((result) => replyTo.send({'type': 'success', 'value': result})) |
547 .catchError((error, stackTrace) { | 548 .catchError((error, stackTrace) { |
548 // TODO(nweiz): at least MissingInputException should be preserved here. | 549 // TODO(nweiz): at least MissingInputException should be preserved here. |
549 replyTo.send({ | 550 replyTo.send({ |
550 'type': 'error', | 551 'type': 'error', |
551 'error': dart.CrossIsolateException.serialize(error, stackTrace) | 552 'error': dart.CrossIsolateException.serialize(error, stackTrace) |
552 }); | 553 }); |
553 }); | 554 }); |
554 } | 555 } |
555 | 556 |
556 /// Wraps [message] and sends it across [port], then waits for a response which | 557 /// Wraps [message] and sends it across [port], then waits for a response which |
557 /// should be sent using [_respond]. | 558 /// should be sent using [_respond]. |
558 /// | 559 /// |
559 /// The returned Future will complete to the value or error returned by | 560 /// The returned Future will complete to the value or error returned by |
560 /// [_respond]. | 561 /// [_respond]. |
561 Future _call(SendPort port, message) { | 562 Future _call(SendPort port, message) { |
562 var receivePort = new ReceivePort(); | 563 var receivePort = new ReceivePort(); |
563 port.send({ | 564 port.send({ |
564 'message': message, | 565 'message': message, |
565 'replyTo': receivePort.sendPort | 566 'replyTo': receivePort.sendPort |
566 }); | 567 }); |
567 | 568 |
568 return receivePort.first.then((response) { | 569 return Chain.track(receivePort.first).then((response) { |
569 if (response['type'] == 'success') return response['value']; | 570 if (response['type'] == 'success') return response['value']; |
570 assert(response['type'] == 'error'); | 571 assert(response['type'] == 'error'); |
571 return new Future.error( | 572 return new Future.error( |
572 new dart.CrossIsolateException.deserialize(response['error'])); | 573 new dart.CrossIsolateException.deserialize(response['error']), |
| 574 new Chain.current()); |
573 }); | 575 }); |
574 } | 576 } |
OLD | NEW |