Index: sdk/lib/_internal/pub/asset/dart/serialize.dart |
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43328e141be23978bfacfb1d36d320ec860f8992 |
--- /dev/null |
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.dart |
@@ -0,0 +1,100 @@ |
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library pub.asset.serialize; |
+ |
+import 'dart:async'; |
+import 'dart:isolate'; |
+ |
+import 'package:barback/barback.dart'; |
+import 'package:source_maps/span.dart'; |
+ |
+import 'serialize/exception.dart'; |
+ |
+export 'serialize/exception.dart'; |
+export 'serialize/transform.dart'; |
+export 'serialize/transformer.dart'; |
+ |
+/// Converts [id] into a serializable map. |
+Map serializeId(AssetId id) => {'package': id.package, 'path': id.path}; |
+ |
+/// Converts a serializable map into an [AssetId]. |
+AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']); |
+ |
+/// Converts [span] into a serializable map. |
+Map serializeSpan(Span span) { |
+ // TODO(nweiz): convert FileSpans to FileSpans. |
+ return { |
+ 'type': 'fixed', |
+ 'sourceUrl': span.sourceUrl, |
+ 'start': serializeLocation(span.start), |
+ 'text': span.text, |
+ 'isIdentifier': span.isIdentifier |
+ }; |
+} |
+ |
+/// Converts a serializable map into a [Span]. |
+Span deserializeSpan(Map span) { |
+ assert(span['type'] == 'fixed'); |
+ var location = deserializeLocation(span['start']); |
+ return new FixedSpan(span['sourceUrl'], location.offset, location.line, |
+ location.column, text: span['text'], isIdentifier: span['isIdentifier']); |
+} |
+ |
+/// Converts [location] into a serializable map. |
+Map serializeLocation(Location location) { |
+ // TODO(nweiz): convert FileLocations to FileLocations. |
+ return { |
+ 'type': 'fixed', |
+ 'sourceUrl': location.sourceUrl, |
+ 'offset': location.offset, |
+ 'line': location.line, |
+ 'column': location.column |
+ }; |
+} |
+ |
+/// Converts a serializable map into a [Location]. |
+Location deserializeLocation(Map location) { |
+ assert(location['type'] == 'fixed'); |
+ return new FixedLocation(location['offset'], location['sourceUrl'], |
+ location['line'], location['column']); |
+} |
+ |
+/// Wraps [message] and sends it across [port], then waits for a response which |
+/// should be sent using [respond]. |
+/// |
+/// The returned Future will complete to the value or error returned by |
+/// [respond]. |
+Future call(SendPort port, message) { |
+ var receivePort = new ReceivePort(); |
+ port.send({ |
+ 'message': message, |
+ 'replyTo': receivePort.sendPort |
+ }); |
+ |
+ return receivePort.first.then((response) { |
+ if (response['type'] == 'success') return response['value']; |
+ assert(response['type'] == 'error'); |
+ var exception = deserializeException(response['error']); |
+ return new Future.error(exception, exception.stackTrace); |
+ }); |
+} |
+ |
+/// Responds to a message sent by [call]. |
+/// |
+/// [wrappedMessage] is the raw message sent by [call]. This unwraps it and |
+/// passes the contents of the message to [callback], then sends the return |
+/// value of [callback] back to [call]. If [callback] returns a Future or |
+/// throws an error, that will also be sent. |
+void respond(wrappedMessage, callback(message)) { |
+ var replyTo = wrappedMessage['replyTo']; |
+ new Future.sync(() => callback(wrappedMessage['message'])) |
+ .then((result) => replyTo.send({'type': 'success', 'value': result})) |
+ .catchError((error, stackTrace) { |
+ replyTo.send({ |
+ 'type': 'error', |
+ 'error': serializeException(error, stackTrace) |
+ }); |
+ }); |
+} |