{%- for method in interface.methods %}
{%-   set interface_method_id =
          interface.mojom_name ~ "_" ~ method.mojom_name %}
  var k{{interface_method_id}}_Name = {{method.ordinal}};
{%- endfor %}

  function {{interface.name}}Ptr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController({{interface.name}},
                                                   handleOrPtrInfo);
  }

  function {{interface.name}}AssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        {{interface.name}}, associatedInterfacePtrInfo);
  }

  {{interface.name}}AssociatedPtr.prototype =
      Object.create({{interface.name}}Ptr.prototype);
  {{interface.name}}AssociatedPtr.prototype.constructor =
      {{interface.name}}AssociatedPtr;

  function {{interface.name}}Proxy(receiver) {
    this.receiver_ = receiver;
  }

{%- for method in interface.methods %}
{%-   set interface_method_id =
          interface.mojom_name ~ "_" ~ method.mojom_name %}
  {{interface.name}}Ptr.prototype.{{method.name}} = function() {
    return {{interface.name}}Proxy.prototype.{{method.name}}
        .apply(this.ptr.getProxy(), arguments);
  };

  {{interface.name}}Proxy.prototype.{{method.name}} = function(
{%- for parameter in method.parameters -%}
{{parameter.name}}{% if not loop.last %}, {% endif %}
{%- endfor -%}
) {
    var params = new {{interface_method_id}}_Params();
{%- for parameter in method.parameters %}
    params.{{parameter.name}} = {{parameter.name}};
{%- endfor %}

{%- if method.response_parameters == None %}
{%-   if method|method_passes_associated_kinds %}
    var builder = new codec.MessageV2Builder(
        k{{interface_method_id}}_Name,
        codec.align({{interface_method_id}}_Params.encodedSize));
    builder.setPayload({{interface_method_id}}_Params, params);
{%-   else %}
    var builder = new codec.MessageV0Builder(
        k{{interface_method_id}}_Name,
        codec.align({{interface_method_id}}_Params.encodedSize));
    builder.encodeStruct({{interface_method_id}}_Params, params);
{%-   endif %}
    var message = builder.finish();
    this.receiver_.accept(message);
{%- else %}
    return new Promise(function(resolve, reject) {
{%-   if method|method_passes_associated_kinds %}
      var builder = new codec.MessageV2Builder(
          k{{interface_method_id}}_Name,
          codec.align({{interface_method_id}}_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.setPayload({{interface_method_id}}_Params, params);
{%-   else %}
      var builder = new codec.MessageV1Builder(
          k{{interface_method_id}}_Name,
          codec.align({{interface_method_id}}_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct({{interface_method_id}}_Params, params);
{%-   endif %}
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct({{interface_method_id}}_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
{%- endif %}
  };
{%- endfor %}

  function {{interface.name}}Stub(delegate) {
    this.delegate_ = delegate;
  }

{%- for method in interface.methods %}
  {{interface.name}}Stub.prototype.{{method.name}} = function({{method.parameters|map(attribute='name')|join(', ')}}) {
    return this.delegate_ && this.delegate_.{{method.name}} && this.delegate_.{{method.name}}({{method.parameters|map(attribute='name')|join(', ')}});
  }
{%- endfor %}

  {{interface.name}}Stub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
{%- for method in interface.methods %}
{%-   set interface_method_id =
          interface.mojom_name ~ "_" ~ method.mojom_name %}
{%- if method.response_parameters == None %}
    case k{{interface_method_id}}_Name:
      var params = reader.decodeStruct({{interface_method_id}}_Params);
      this.{{method.name}}(
{%- for parameter in method.parameters -%}
  params.{{parameter.name}}{% if not loop.last %}, {% endif %}
{%- endfor %});
      return true;
{%- endif %}
{%- endfor %}
    default:
      return false;
    }
  };

  {{interface.name}}Stub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
{%- for method in interface.methods %}
{%-   set interface_method_id =
          interface.mojom_name ~ "_" ~ method.mojom_name %}
{%- if method.response_parameters != None %}
    case k{{interface_method_id}}_Name:
      var params = reader.decodeStruct({{interface_method_id}}_Params);
      this.{{method.name}}(
{%- for parameter in method.parameters -%}
params.{{parameter.name}}{% if not loop.last %}, {% endif -%}
{%- endfor %}).then(function(response) {
        var responseParams =
            new {{interface_method_id}}_ResponseParams();
{%-     for parameter in method.response_parameters %}
        responseParams.{{parameter.name}} = response.{{parameter.name}};
{%-     endfor %}
{%- if method|method_passes_associated_kinds %}
        var builder = new codec.MessageV2Builder(
            k{{interface_method_id}}_Name,
            codec.align({{interface_method_id}}_ResponseParams
                .encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.setPayload({{interface_method_id}}_ResponseParams,
                             responseParams);
{%- else %}
        var builder = new codec.MessageV1Builder(
            k{{interface_method_id}}_Name,
            codec.align({{interface_method_id}}_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct({{interface_method_id}}_ResponseParams,
                             responseParams);
{%- endif %}
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
{%- endif %}
{%- endfor %}
    default:
      return false;
    }
  };

{#--- Validation #}

  function validate{{interface.name}}Request(messageValidator) {
{%- if not(interface.methods) %}
    return validator.validationError.NONE;
{%- else %}
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
{%-   for method in interface.methods %}
{%-     set interface_method_id =
            interface.mojom_name ~ "_" ~ method.mojom_name %}
      case k{{interface_method_id}}_Name:
{%-     if method.response_parameters == None %}
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = {{interface_method_id}}_Params;
{%-     else %}
        if (message.expectsResponse())
          paramsClass = {{interface_method_id}}_Params;
{%-     endif %}
      break;
{%-   endfor %}
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
{%- endif %}
  }

  function validate{{interface.name}}Response(messageValidator) {
{%- if not(interface|has_callbacks) %}
    return validator.validationError.NONE;
{%- else %}
   var message = messageValidator.message;
   var paramsClass = null;
   switch (message.getName()) {
{%-   for method in interface.methods %}
{%-     set interface_method_id =
            interface.mojom_name ~ "_" ~ method.mojom_name %}
{%-     if method.response_parameters != None %}
      case k{{interface_method_id}}_Name:
        if (message.isResponse())
          paramsClass = {{interface_method_id}}_ResponseParams;
        break;
{%-     endif %}
{%-   endfor %}
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
{%- endif %}
  }

  var {{interface.name}} = {
    name: '{{module.mojom_namespace|replace(".","::")}}::{{interface.mojom_name}}',
    kVersion: {{interface.version}},
    ptrClass: {{interface.name}}Ptr,
    proxyClass: {{interface.name}}Proxy,
    stubClass: {{interface.name}}Stub,
    validateRequest: validate{{interface.name}}Request,
{%- if interface|has_callbacks %}
    validateResponse: validate{{interface.name}}Response,
{%- else %}
    validateResponse: null,
{%- endif %}
  };
{#--- Interface Constants #}
{%- for constant in interface.constants %}
  {{interface.name}}.{{constant.name}} = {{constant.value|expression_to_text}},
{%-   endfor %}
{#--- Interface Enums #}
{%- from "enum_definition.tmpl" import enum_def -%}
{%- for enum in interface.enums %}
  {{ enum_def("%s.%s"|format(interface.name, enum.name), enum) }}
{%-  endfor %}
  {{interface.name}}Stub.prototype.validator = validate{{interface.name}}Request;
{%- if interface|has_callbacks %}
  {{interface.name}}Proxy.prototype.validator = validate{{interface.name}}Response;
{%- else %}
  {{interface.name}}Proxy.prototype.validator = null;
{%- endif %}
