github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/_examples/node-ts/server/server.gen.ts (about) 1 /* tslint:disable */ 2 // node-ts v1.0.0 4d2858fa129683e5775e9b863ceceb740e7e09b1 3 // -- 4 // This file has been generated by https://github.com/webrpc/webrpc using gen/typescript 5 // Do not edit by hand. Update your webrpc schema and re-generate. 6 7 // WebRPC description and code-gen version 8 export const WebRPCVersion = "v1" 9 10 // Schema version of your RIDL schema 11 export const WebRPCSchemaVersion = "v1.0.0" 12 13 // Schema hash generated from your RIDL schema 14 export const WebRPCSchemaHash = "4d2858fa129683e5775e9b863ceceb740e7e09b1" 15 16 17 // 18 // Types 19 // 20 export enum Kind { 21 USER = 'USER', 22 ADMIN = 'ADMIN' 23 } 24 25 export interface User { 26 id: number 27 USERNAME: string 28 role: Kind 29 meta: {[key: string]: any} 30 31 createdAt?: string 32 } 33 34 export interface Page { 35 num: number 36 } 37 38 export interface ExampleService { 39 ping(headers?: object): Promise<PingReturn> 40 getUser(args: GetUserArgs, headers?: object): Promise<GetUserReturn> 41 } 42 43 export interface PingArgs { 44 } 45 46 export interface PingReturn { 47 status: boolean 48 } 49 export interface GetUserArgs { 50 userID: number 51 } 52 53 export interface GetUserReturn { 54 code: number 55 user: User 56 } 57 58 59 60 // 61 // Server 62 // 63 export class WebRPCError extends Error { 64 statusCode?: number 65 66 constructor(msg: string = "error", statusCode?: number) { 67 super("webrpc error: " + msg); 68 69 Object.setPrototypeOf(this, WebRPCError.prototype); 70 71 this.statusCode = statusCode; 72 } 73 } 74 75 import express from 'express' 76 77 78 79 export type ExampleServiceService = { 80 81 Ping: (args: PingArgs) => PingReturn | Promise<PingReturn> 82 83 GetUser: (args: GetUserArgs) => GetUserReturn | Promise<GetUserReturn> 84 85 } 86 87 export const createExampleServiceApp = (serviceImplementation: ExampleServiceService) => { 88 const app = express(); 89 90 app.use(express.json()) 91 92 app.post('/*', async (req, res) => { 93 const requestPath = req.baseUrl + req.path 94 95 if (!req.body) { 96 res.status(400).send("webrpc error: missing body"); 97 98 return 99 } 100 101 switch(requestPath) { 102 103 104 case "/rpc/ExampleService/Ping": { 105 try { 106 107 108 const response = await serviceImplementation["Ping"](req.body); 109 110 111 if (!("status" in response)) { 112 throw new WebRPCError("internal", 500); 113 } 114 115 116 res.status(200).json(response); 117 } catch (err) { 118 if (err instanceof WebRPCError) { 119 const statusCode = err.statusCode || 400 120 const message = err.message 121 122 res.status(statusCode).json({ 123 msg: message, 124 status: statusCode, 125 code: "" 126 }); 127 128 return 129 } 130 131 if (err.message) { 132 res.status(400).send(err.message); 133 134 return; 135 } 136 137 res.status(400).end(); 138 } 139 } 140 141 return; 142 143 144 case "/rpc/ExampleService/GetUser": { 145 try { 146 147 if (!("userID" in req.body)) { 148 throw new WebRPCError("Missing Argument `userID`") 149 } 150 if ("userID" in req.body && !validateType(req.body["userID"], "number")) { 151 throw new WebRPCError("Invalid Argument: userID") 152 } 153 154 155 const response = await serviceImplementation["GetUser"](req.body); 156 157 158 if (!("code" in response)) { 159 throw new WebRPCError("internal", 500); 160 } 161 162 if (!("user" in response)) { 163 throw new WebRPCError("internal", 500); 164 } 165 166 167 res.status(200).json(response); 168 } catch (err) { 169 if (err instanceof WebRPCError) { 170 const statusCode = err.statusCode || 400 171 const message = err.message 172 173 res.status(statusCode).json({ 174 msg: message, 175 status: statusCode, 176 code: "" 177 }); 178 179 return 180 } 181 182 if (err.message) { 183 res.status(400).send(err.message); 184 185 return; 186 } 187 188 res.status(400).end(); 189 } 190 } 191 192 return; 193 194 195 default: { 196 res.status(404).end() 197 } 198 } 199 }); 200 201 return app; 202 }; 203 204 205 206 const JS_TYPES = [ 207 "bigint", 208 "boolean", 209 "function", 210 "number", 211 "object", 212 "string", 213 "symbol", 214 "undefined" 215 ] 216 217 218 const validateKind = (value: any) => { 219 220 221 if (!("USER" in value) || !validateType(value["USER"], "number")) { 222 return false 223 } 224 225 226 227 if (!("ADMIN" in value) || !validateType(value["ADMIN"], "number")) { 228 return false 229 } 230 231 232 233 return true 234 } 235 236 const validateUser = (value: any) => { 237 238 239 if (!("id" in value) || !validateType(value["id"], "number")) { 240 return false 241 } 242 243 244 245 if (!("USERNAME" in value) || !validateType(value["USERNAME"], "string")) { 246 return false 247 } 248 249 250 251 if (!("role" in value) || !validateType(value["role"], "Kind")) { 252 return false 253 } 254 255 256 257 if (!("meta" in value) || !validateType(value["meta"], "object")) { 258 return false 259 } 260 261 262 263 if (!("-" in value) || !validateType(value["-"], "number")) { 264 return false 265 } 266 267 268 269 if ("createdAt" in value && !validateType(value["createdAt"], "string")) { 270 return false 271 } 272 273 274 275 return true 276 } 277 278 const validatePage = (value: any) => { 279 280 281 if (!("num" in value) || !validateType(value["num"], "number")) { 282 return false 283 } 284 285 286 287 return true 288 } 289 290 291 const TYPE_VALIDATORS: { [type: string]: (value: any) => boolean } = { 292 293 Kind: validateKind, 294 295 User: validateUser, 296 297 Page: validatePage, 298 299 } 300 301 const validateType = (value: any, type: string) => { 302 if (JS_TYPES.indexOf(type) > -1) { 303 return typeof value === type; 304 } 305 306 const validator = TYPE_VALIDATORS[type]; 307 308 if (!validator) { 309 return false; 310 } 311 312 return validator(value); 313 } 314