1 {%- for method in interface.methods %} 2 var k{{interface.name}}_{{method.name}}_Name = {{method.ordinal}}; 3 {%- endfor %} 4 5 function {{interface.name}}Proxy(receiver) { 6 bindings.ProxyBase.call(this, receiver); 7 } 8 {{interface.name}}Proxy.prototype = Object.create(bindings.ProxyBase.prototype); 9 10 {%- for method in interface.methods %} 11 {{interface.name}}Proxy.prototype.{{method.name|stylize_method}} = function( 12 {%- for parameter in method.parameters -%} 13 {{parameter.name}}{% if not loop.last %}, {% endif %} 14 {%- endfor -%} 15 ) { 16 var params = new {{interface.name}}_{{method.name}}_Params(); 17 {%- for parameter in method.parameters %} 18 params.{{parameter.name}} = {{parameter|js_proxy_method_parameter_value}}; 19 {%- endfor %} 20 21 {%- if method.response_parameters == None %} 22 var builder = new codec.MessageBuilder( 23 k{{interface.name}}_{{method.name}}_Name, 24 codec.align({{interface.name}}_{{method.name}}_Params.encodedSize)); 25 builder.encodeStruct({{interface.name}}_{{method.name}}_Params, params); 26 var message = builder.finish(); 27 this.receiver_.accept(message); 28 {%- else %} 29 return new Promise(function(resolve, reject) { 30 var builder = new codec.MessageWithRequestIDBuilder( 31 k{{interface.name}}_{{method.name}}_Name, 32 codec.align({{interface.name}}_{{method.name}}_Params.encodedSize), 33 codec.kMessageExpectsResponse, 0); 34 builder.encodeStruct({{interface.name}}_{{method.name}}_Params, params); 35 var message = builder.finish(); 36 this.receiver_.acceptAndExpectResponse(message).then(function(message) { 37 var reader = new codec.MessageReader(message); 38 var responseParams = 39 reader.decodeStruct({{interface.name}}_{{method.name}}_ResponseParams); 40 resolve(responseParams); 41 }).catch(function(result) { 42 reject(Error("Connection error: " + result)); 43 }); 44 }.bind(this)); 45 {%- endif %} 46 }; 47 {%- endfor %} 48 49 function {{interface.name}}Stub(delegate) { 50 bindings.StubBase.call(this, delegate); 51 } 52 {{interface.name}}Stub.prototype = Object.create(bindings.StubBase.prototype); 53 54 {%- for method in interface.methods %} 55 {%- set js_method_name = method.name|stylize_method %} 56 {%- set delegate_expr = "bindings.StubBindings(this).delegate" %} 57 {{interface.name}}Stub.prototype.{{js_method_name}} = function({{method.parameters|map(attribute='name')|join(', ')}}) { 58 return {{delegate_expr}} && {{delegate_expr}}.{{js_method_name}} && {{delegate_expr}}.{{js_method_name}}({{method.parameters|map('js_stub_method_parameter_value')|join(', ')}}); 59 } 60 {%- endfor %} 61 62 {{interface.name}}Stub.prototype.accept = function(message) { 63 var reader = new codec.MessageReader(message); 64 switch (reader.messageName) { 65 {%- for method in interface.methods %} 66 {%- if method.response_parameters == None %} 67 case k{{interface.name}}_{{method.name}}_Name: 68 var params = reader.decodeStruct({{interface.name}}_{{method.name}}_Params); 69 this.{{method.name|stylize_method}}( 70 {%- for parameter in method.parameters -%} 71 params.{{parameter.name}}{% if not loop.last %}, {% endif %} 72 {%- endfor %}); 73 return true; 74 {%- endif %} 75 {%- endfor %} 76 default: 77 return false; 78 } 79 }; 80 81 {{interface.name}}Stub.prototype.acceptWithResponder = 82 function(message, responder) { 83 var reader = new codec.MessageReader(message); 84 switch (reader.messageName) { 85 {%- for method in interface.methods %} 86 {%- if method.response_parameters != None %} 87 case k{{interface.name}}_{{method.name}}_Name: 88 var params = reader.decodeStruct({{interface.name}}_{{method.name}}_Params); 89 return this.{{method.name|stylize_method}}( 90 {%- for parameter in method.parameters -%} 91 params.{{parameter.name}}{% if not loop.last %}, {% endif -%} 92 {%- endfor %}).then(function(response) { 93 var responseParams = 94 new {{interface.name}}_{{method.name}}_ResponseParams(); 95 {%- for parameter in method.response_parameters %} 96 responseParams.{{parameter.name}} = response.{{parameter.name}}; 97 {%- endfor %} 98 var builder = new codec.MessageWithRequestIDBuilder( 99 k{{interface.name}}_{{method.name}}_Name, 100 codec.align({{interface.name}}_{{method.name}}_ResponseParams.encodedSize), 101 codec.kMessageIsResponse, reader.requestID); 102 builder.encodeStruct({{interface.name}}_{{method.name}}_ResponseParams, 103 responseParams); 104 var message = builder.finish(); 105 responder.accept(message); 106 }); 107 {%- endif %} 108 {%- endfor %} 109 default: 110 return Promise.reject(Error("Unhandled message: " + reader.messageName)); 111 } 112 }; 113 114 {#--- Validation #} 115 116 function validate{{interface.name}}Request(messageValidator) { 117 {%- if not(interface.methods) %} 118 return validator.validationError.NONE; 119 {%- else %} 120 var message = messageValidator.message; 121 var paramsClass = null; 122 switch (message.getName()) { 123 {%- for method in interface.methods %} 124 case k{{interface.name}}_{{method.name}}_Name: 125 {%- if method.response_parameters == None %} 126 if (!message.expectsResponse() && !message.isResponse()) 127 paramsClass = {{interface.name}}_{{method.name}}_Params; 128 {%- else %} 129 if (message.expectsResponse()) 130 paramsClass = {{interface.name}}_{{method.name}}_Params; 131 {%- endif %} 132 break; 133 {%- endfor %} 134 } 135 if (paramsClass === null) 136 return validator.validationError.NONE; 137 return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); 138 {%- endif %} 139 } 140 141 function validate{{interface.name}}Response(messageValidator) { 142 {%- if not(interface|has_callbacks) %} 143 return validator.validationError.NONE; 144 {%- else %} 145 var message = messageValidator.message; 146 var paramsClass = null; 147 switch (message.getName()) { 148 {%- for method in interface.methods %} 149 {%- if method.response_parameters != None %} 150 case k{{interface.name}}_{{method.name}}_Name: 151 if (message.isResponse()) 152 paramsClass = {{interface.name}}_{{method.name}}_ResponseParams; 153 break; 154 {%- endif %} 155 {%- endfor %} 156 } 157 if (paramsClass === null) 158 return validator.validationError.NONE; 159 return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); 160 {%- endif %} 161 } 162 163 var {{interface.name}} = { 164 name: '{{namespace|replace(".","::")}}::{{interface.name}}', 165 proxyClass: {{interface.name}}Proxy, 166 stubClass: {{interface.name}}Stub, 167 validateRequest: validate{{interface.name}}Request, 168 {%- if interface|has_callbacks %} 169 validateResponse: validate{{interface.name}}Response, 170 {%- else %} 171 validateResponse: null, 172 {%- endif %} 173 }; 174 {#--- Interface Constants #} 175 {%- for constant in interface.constants %} 176 {{interface.name}}.{{constant.name}} = {{constant.value|expression_to_text}}, 177 {%- endfor %} 178 {#--- Interface Enums #} 179 {%- from "enum_definition.tmpl" import enum_def -%} 180 {%- for enum in interface.enums %} 181 {{ enum_def("%s.%s"|format(interface.name, enum.name), enum) }} 182 {%- endfor %} 183 {{interface.name}}Stub.prototype.validator = validate{{interface.name}}Request; 184 {%- if interface|has_callbacks %} 185 {{interface.name}}Proxy.prototype.validator = validate{{interface.name}}Response; 186 {%- else %} 187 {{interface.name}}Proxy.prototype.validator = null; 188 {%- endif %} 189