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}}