github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/gen/javascript/templates/server.js.tmpl (about)

     1  {{define "server"}}
     2  
     3  {{- if .Services}}
     4  //
     5  // Server
     6  //
     7  
     8  class WebRPCError extends Error {
     9      constructor(msg = "error", statusCode) {
    10          super("webrpc eror: " + msg);
    11  
    12          this.statusCode = statusCode
    13      }
    14  }
    15  
    16  import express from 'express'
    17  
    18      {{- range .Services}}
    19          {{$name := .Name}}
    20          {{$serviceName := .Name | serviceInterfaceName}}
    21  
    22          export const create{{$serviceName}}App = (serviceImplementation) => {
    23              const app = express();
    24  
    25              app.use(express.json())
    26  
    27              app.post('/*', async (req, res) => {
    28                  const requestPath = req.baseUrl + req.path
    29  
    30                  if (!req.body) {
    31                      res.status(400).send("webrpc error: missing body");
    32  
    33                      return
    34                  }
    35  
    36                  switch(requestPath) {
    37                      {{range .Methods}}
    38  
    39                      case "/rpc/{{$name}}/{{.Name}}": {                        
    40                          try {
    41                              {{ range .Inputs }}
    42                                  {{- if not .Optional}}
    43                                      if (!("{{ .Name }}" in req.body)) {
    44                                          throw new WebRPCError("Missing Argument `{{ .Name }}`")
    45                                      }
    46                                  {{end -}}
    47  
    48                                  if (typeof req.body["{{.Name}}"] !== "{{ .Type | jsFieldType }}") {
    49                                      throw new WebRPCError("Invalid arg: {{ .Name }}, got type " + typeof req.body["{{ .Name }}"] + " expected " + "{{ .Type | jsFieldType }}", 400);
    50                                  }
    51                              {{end}}
    52  
    53                              const response = await serviceImplementation["{{.Name}}"](req.body);
    54  
    55                              {{ range .Outputs}}
    56                                  if (!("{{ .Name }}" in response)) {
    57                                      throw new WebRPCError("internal", 500);
    58                                  }
    59                              {{end}}
    60  
    61                              res.status(200).json(response);
    62                          } catch (err) {
    63                              if (err instanceof WebRPCError) {
    64                                  const statusCode = err.statusCode || 400
    65                                  const message = err.message
    66  
    67                                  res.status(statusCode).json({
    68                                      msg: message,
    69                                      status: statusCode,
    70                                      code: ""
    71                                  });
    72  
    73                                  return
    74                              }
    75  
    76                              if (err.message) {
    77                                  res.status(400).send(err.message);
    78  
    79                                  return;
    80                              }
    81  
    82                              res.status(400).end();
    83                          }
    84                      }
    85  
    86                      return;
    87                      {{end}}
    88  
    89                      default: {
    90                          res.status(404).end()
    91                      }
    92                  }
    93              });
    94  
    95              return app;
    96          };
    97      {{- end}}
    98  {{end -}}
    99  {{end}}