| 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 library pub.asset.serialize.transform; | |
| 6 | |
| 7 import 'dart:async'; | |
| 8 import 'dart:isolate'; | |
| 9 | |
| 10 import 'package:barback/barback.dart'; | |
| 11 // TODO(nweiz): don't import from "src" once issue 14966 is fixed. | |
| 12 import 'package:barback/src/internal_asset.dart'; | |
| 13 | |
| 14 import '../serialize.dart'; | |
| 15 import 'get_input_transform.dart'; | |
| 16 | |
| 17 /// Serialize the methods shared between [Transform] and [DeclaringTransform]. | |
| 18 /// | |
| 19 /// [additionalFields] contains additional serialized fields to add to the | |
| 20 /// serialized transform. [methodHandlers] is a set of additional methods. Each | |
| 21 /// value should take a JSON message and return the response (which may be a | |
| 22 /// Future). | |
| 23 Map _serializeBaseTransform(transform, Map additionalFields, | |
| 24 Map<String, Function> methodHandlers) { | |
| 25 var receivePort = new ReceivePort(); | |
| 26 receivePort.listen((wrappedMessage) { | |
| 27 respond(wrappedMessage, (message) { | |
| 28 var handler = methodHandlers[message['type']]; | |
| 29 if (handler != null) return handler(message); | |
| 30 | |
| 31 if (message['type'] == 'consumePrimary') { | |
| 32 transform.consumePrimary(); | |
| 33 return null; | |
| 34 } | |
| 35 | |
| 36 assert(message['type'] == 'log'); | |
| 37 var method = { | |
| 38 'Info': transform.logger.info, | |
| 39 'Fine': transform.logger.fine, | |
| 40 'Warning': transform.logger.warning, | |
| 41 'Error': transform.logger.error | |
| 42 }[message['level']]; | |
| 43 assert(method != null); | |
| 44 | |
| 45 var assetId = message['assetId'] == null ? null : | |
| 46 deserializeId(message['assetId']); | |
| 47 var span = message['span'] == null ? null : | |
| 48 deserializeSpan(message['span']); | |
| 49 method(message['message'], asset: assetId, span: span); | |
| 50 }); | |
| 51 }); | |
| 52 | |
| 53 return {'port': receivePort.sendPort}..addAll(additionalFields); | |
| 54 } | |
| 55 | |
| 56 /// Converts [transform] into a serializable map. | |
| 57 Map serializeTransform(Transform transform) { | |
| 58 return _serializeBaseTransform(transform, { | |
| 59 'primaryInput': serializeAsset(transform.primaryInput) | |
| 60 }, { | |
| 61 'getInput': (message) => transform.getInput(deserializeId(message['id'])) | |
| 62 .then((asset) => serializeAsset(asset)), | |
| 63 'addOutput': (message) => | |
| 64 transform.addOutput(deserializeAsset(message['output'])) | |
| 65 }); | |
| 66 } | |
| 67 | |
| 68 /// Converts [transform] into a serializable map. | |
| 69 Map serializeDeclaringTransform(DeclaringTransform transform) { | |
| 70 return _serializeBaseTransform(transform, { | |
| 71 'primaryId': serializeId(transform.primaryId) | |
| 72 }, { | |
| 73 'declareOutput': (message) => | |
| 74 transform.declareOutput(deserializeId(message['output'])) | |
| 75 }); | |
| 76 } | |
| 77 | |
| 78 /// The base class for wrappers for [Transform]s that are in the host isolate. | |
| 79 class _ForeignBaseTransform { | |
| 80 /// The port with which we communicate with the host isolate. | |
| 81 /// | |
| 82 /// This port and all messages sent across it are specific to this transform. | |
| 83 final SendPort _port; | |
| 84 | |
| 85 TransformLogger get logger => _logger; | |
| 86 TransformLogger _logger; | |
| 87 | |
| 88 _ForeignBaseTransform(Map transform) | |
| 89 : _port = transform['port'] { | |
| 90 _logger = new TransformLogger((assetId, level, message, span) { | |
| 91 call(_port, { | |
| 92 'type': 'log', | |
| 93 'level': level.name, | |
| 94 'message': message, | |
| 95 'assetId': assetId == null ? null : serializeId(assetId), | |
| 96 'span': span == null ? null : serializeSpan(span) | |
| 97 }); | |
| 98 }); | |
| 99 } | |
| 100 | |
| 101 void consumePrimary() { | |
| 102 call(_port, {'type': 'consumePrimary'}); | |
| 103 } | |
| 104 } | |
| 105 | |
| 106 /// A wrapper for a [Transform] that's in the host isolate. | |
| 107 /// | |
| 108 /// This retrieves inputs from and sends outputs and logs to the host isolate. | |
| 109 class ForeignTransform extends _ForeignBaseTransform | |
| 110 with GetInputTransform implements Transform { | |
| 111 final Asset primaryInput; | |
| 112 | |
| 113 /// Creates a transform from a serialized map sent from the host isolate. | |
| 114 ForeignTransform(Map transform) | |
| 115 : primaryInput = deserializeAsset(transform['primaryInput']), | |
| 116 super(transform); | |
| 117 | |
| 118 Future<Asset> getInput(AssetId id) { | |
| 119 return call(_port, { | |
| 120 'type': 'getInput', | |
| 121 'id': serializeId(id) | |
| 122 }).then(deserializeAsset); | |
| 123 } | |
| 124 | |
| 125 void addOutput(Asset output) { | |
| 126 call(_port, { | |
| 127 'type': 'addOutput', | |
| 128 'output': serializeAsset(output) | |
| 129 }); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 /// A wrapper for a [DeclaringTransform] that's in the host isolate. | |
| 134 class ForeignDeclaringTransform extends _ForeignBaseTransform | |
| 135 implements DeclaringTransform { | |
| 136 final AssetId primaryId; | |
| 137 | |
| 138 /// Creates a transform from a serializable map sent from the host isolate. | |
| 139 ForeignDeclaringTransform(Map transform) | |
| 140 : primaryId = deserializeId(transform['primaryId']), | |
| 141 super(transform); | |
| 142 | |
| 143 void declareOutput(AssetId id) { | |
| 144 call(_port, { | |
| 145 'type': 'declareOutput', | |
| 146 'output': serializeId(id) | |
| 147 }); | |
| 148 } | |
| 149 } | |
| OLD | NEW |