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