| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| define("mojo/public/js/lib/control_message_proxy", [ |
| "mojo/public/interfaces/bindings/interface_control_messages.mojom", |
| "mojo/public/js/codec", |
| "mojo/public/js/validator", |
| ], function(controlMessages, codec, validator) { |
| |
| var Validator = validator.Validator; |
| |
| function constructRunOrClosePipeMessage(runOrClosePipeInput) { |
| var runOrClosePipeMessageParams = new |
| controlMessages.RunOrClosePipeMessageParams(); |
| runOrClosePipeMessageParams.input = runOrClosePipeInput; |
| |
| var messageName = controlMessages.kRunOrClosePipeMessageId; |
| var payloadSize = controlMessages.RunOrClosePipeMessageParams.encodedSize; |
| var builder = new codec.MessageV0Builder(messageName, payloadSize); |
| builder.encodeStruct(controlMessages.RunOrClosePipeMessageParams, |
| runOrClosePipeMessageParams); |
| var message = builder.finish(); |
| return message; |
| } |
| |
| function validateControlResponse(message) { |
| var messageValidator = new Validator(message); |
| var error = messageValidator.validateMessageIsResponse(); |
| if (error != validator.validationError.NONE) { |
| throw error; |
| } |
| |
| if (message.getName() != controlMessages.kRunMessageId) { |
| throw new Error("Control message name is not kRunMessageId"); |
| } |
| |
| // Validate payload. |
| error = controlMessages.RunResponseMessageParams.validate( |
| messageValidator, message.getHeaderNumBytes()); |
| if (error != validator.validationError.NONE) { |
| throw error; |
| } |
| } |
| |
| function acceptRunResponse(message) { |
| validateControlResponse(message); |
| |
| var reader = new codec.MessageReader(message); |
| var runResponseMessageParams = reader.decodeStruct( |
| controlMessages.RunResponseMessageParams); |
| |
| return Promise.resolve(runResponseMessageParams); |
| } |
| |
| /** |
| * Sends the given run message through the receiver. |
| * Accepts the response message from the receiver and decodes the message |
| * struct to RunResponseMessageParams. |
| * |
| * @param {Router} receiver. |
| * @param {RunMessageParams} runMessageParams to be sent via a message. |
| * @return {Promise} that resolves to a RunResponseMessageParams. |
| */ |
| function sendRunMessage(receiver, runMessageParams) { |
| var messageName = controlMessages.kRunMessageId; |
| var payloadSize = controlMessages.RunMessageParams.encodedSize; |
| // |requestID| is set to 0, but is later properly set by Router. |
| var builder = new codec.MessageV1Builder(messageName, |
| payloadSize, codec.kMessageExpectsResponse, 0); |
| builder.encodeStruct(controlMessages.RunMessageParams, runMessageParams); |
| var message = builder.finish(); |
| |
| return receiver.acceptAndExpectResponse(message).then(acceptRunResponse); |
| } |
| |
| function ControlMessageProxy(receiver) { |
| this.receiver_ = receiver; |
| } |
| |
| ControlMessageProxy.prototype.queryVersion = function() { |
| var runMessageParams = new controlMessages.RunMessageParams(); |
| runMessageParams.input = new controlMessages.RunInput(); |
| runMessageParams.input.query_version = new controlMessages.QueryVersion(); |
| |
| return sendRunMessage(this.receiver_, runMessageParams).then(function( |
| runResponseMessageParams) { |
| return runResponseMessageParams.output.query_version_result.version; |
| }); |
| }; |
| |
| ControlMessageProxy.prototype.requireVersion = function(version) { |
| var runOrClosePipeInput = new controlMessages.RunOrClosePipeInput(); |
| runOrClosePipeInput.require_version = new controlMessages.RequireVersion({ |
| 'version': version}); |
| var message = constructRunOrClosePipeMessage(runOrClosePipeInput); |
| this.receiver_.accept(message); |
| }; |
| |
| var exports = {}; |
| exports.ControlMessageProxy = ControlMessageProxy; |
| |
| return exports; |
| }); |