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