webrpc is a schema-driven approach to writing backend services for modern Web apps and networks

webrpc

webrpc is a schema-driven approach to writing backend servers for the Web. Write your server's api interface in a schema format of RIDL or JSON, and then run webrpc-gen to generate the networking source code for your server and client apps. From the schema, webrpc-gen will generate application base class types/interfaces, JSON encoders, and networking code. In doing so, it's able to generate fully functioning and typed client libraries to communicate with your server. Enjoy strongly-typed Web services and never having to write an API client library again.

Under the hood, webrpc is a Web service meta-protocol, schema and code-generator tool for simplifying the development of backend services for modern Web applications.

Current code-generation language targets:

Quick example

Here is an example webrpc schema in RIDL format (a new documentation-like format introduced by webrpc)

webrpc = v1

name = your-app
version = v0.1.0

message User
  - id: uint64
  - username: string
  - createdAt?: timestamp

message UsersQueryFilter
  - page?: uint32
  - name?: string
  - location?: string

service ExampleService
  - Ping()
  - Status() => (status: bool)
  - GetUserByID(userID: uint64) => (user: User)
  - IsOnline(user: User) => (online: bool)
  - ListUsers(q?: UsersQueryFilter) => (page: uint32, users: []User)

WebRPC is a design/schema-driven approach to writing backend servers. Write your server's api interface in a schema format of RIDL or JSON format and run webrpc-gen to generate source code for your target language.

For example, to generate webrpc server+client code -- run:

bin/webrpc-gen -schema=example.ridl -target=go -pkg=main -server -client -out=./example.gen.go

and see the generated ./example.gen.go file of types, server and client in Go. This is essentially how the golang-basics example was built.

More example apps

  • hello-webrpc - webrpc service with Go server and Javascript webapp
  • hello-webrpc-ts - webrpc service with Go server and Typescript webapp
  • golang-basics - webrpc service with Go server and Go client
  • golang-nodejs - webrpc service with Go server and nodejs (Javascript ES6) client
  • node-ts - webrpc service with nodejs server and Typescript webapp client

Why

TLDR; its much simpler + faster to write and consume a webrpc service than traditional approaches like a REST api or gRPC service.

  1. Code-generate your client libraries in full -- never write another API client again
  2. Compatible with the Web. A Webrpc server is just a HTTP/HTTPS server that speaks JSON, and thus all existing browsers, http clients, load balancers, proxies, caches, and tools work out of the box (versus gRPC). cURL "just works".
  3. Be more productive, write more correct systems.

Writing a Web service / microservice takes a lot of work and time. REST is making me tired. There are many pieces to build -- designing the routes of your service, agreeing on conventions for the routes with your team, the request payloads, the response payloads, writing the actual server logic, routing the methods and requests to the server handlers, implementing the handlers, and then writing a client library for your desired language so it can speak to your Web service. Yikes, it's a lot of work. Want to add an additional field or handler? yea, you have to go through the entire cycle. And what about type-safety across the wire?

webrpc automates a lot the work for you. Now from a single webrpc schema file, you can use the webrpc-gen cli to generate source code for:

  • Strongly-typed request / response data payloads for your target language
  • Strongly-typed server interface and methods on the service, aka the RPC methods
  • Complete client library to communicate with the web service

Design / architecture

webrpc services speak JSON, as our goals are to build services that communicate with webapps. We optimize for developer experience, ease of use and productivity when building backends for modern webapps. However, webrpc also works great for service<->service communication, but it won't be as fast as gRPC in that scenario, but I'd be surprised to hear if for the majority of cases that this would be a bottleneck or costly tradeoff.

webrpc is heavily inspired by gRPC and Twirp. It is architecturally the same and has a similar workflow, but simpler. In fact, the webrpc schema is similar in design to protobuf, as in we have messages and rpc methods, but the type system is arguably more flexible and code-gen tooling is simpler. The webrpc schema is a documentation-like language for describing a server's api interface and the type system within is inspired by Go, Typescript and WASM.

We've been thinking about webrpc's design for years, and were happy to see gRPC and Twirp come onto the scene and pave the way with some great patterns. Over the years and after writing dozens of backends for Javascript-based Webapps and native mobile apps, and even built prior libraries like chi, a HTTP router for Go -- we asked ourselves:

Why have "Rails" and "Django" been such productive frameworks for writing webapps? And the answer we came to is that its productive because the server and client are the same program, running in the same process on the same computer. Rails/Django/others like it, when rendering client-state can just call a function in the same program, the client and the server are within the same domain and same state -- everything is a function-call away. Compare this to modern app development such as writing a React.js SPA or a native iOS mobile app, where the app speaks to an external API server with now the huge added effort to bridge data/runtime from one namespace (the app) to an entirely other namespace (the server). It's too much work and takes too much time, and is too brittle. There is a better way! instead of writing the code.. just generate it. If we generate all of the code to native objects in both app/server, suddenly, we can make a remote service once again feel like calling a method on the same program running on the same computer/process. Remote-Procedure-Call works!

Finally, we'd like to compare generated RPC services (gRPC/Twirp/webrpc/other) to the most common pattern to writing services by "making a RESTful API", where the machinery is similar to RPC services. Picture the flow of data when a client calls out to a server -- from a client runtime proxy-object, we encode that object, send it over the wire, the server decodes it into a server runtime proxy-object, the server handler queries the db, returns a proxy object, encodes it, and sends the function return data over the wire again. That is a ton of work, especially if you have to write it by hand and then maintain robust code in both the client and the server. Ahh, I just want to call a function on my server from my app! Save yourself the work and time, and code-generate it instead - Enter gRPC / Twirp .. and now, webrpc :)

Future goals/work:

  1. Add RPC streaming support for client/server
  2. More code generators.. for Rust, Python, ..

Getting started

  1. go get -u github.com/webrpc/webrpc/cmd/webrpc-gen
  2. Write+design a webrpc schema file for your Web service
  3. Run the code-generator to create your server interface and client, ie.
  • webrpc-gen -schema=example.ridl -target=go -pkg=service -server -client -out=./service/proto.gen.go
  • webrpc-gen -schema=example.ridl -target=ts -pkg=client -client -out=./web/client.ts
  1. Implement the handlers for your server -- of course, it can't guess the server logic :)

another option is to copy the hello-webrpc example, and adapt for your own webapp and server.

Schema

The webrpc schema type system is inspired by Go and TypeScript, and is simple and flexible enough to cover the wide variety of language targets, designed to target RPC communication with Web applications and other Web services.

High-level features:

  • RIDL, aka RPC IDL, aka "RPC interface design language", format - a documentation-like schema format for describing a server application.
  • JSON schema format is also supported if you prefer to write tools to target webrpc's code-gen tools
  • Type system inspired by Go + Typescript
    • integers, floats, byte, bool, any, null, date/time
    • lists (multi-dimensional arrays supported too)
    • maps (with nesting / complex structures)
    • structs / objects
      • optional fields, default values, and pluggable code-generation for a language target
    • enums

For more information please see the schema readme.

Building from source / making your own code-generator

Dev

  1. Install Go 1.11+
  2. $ go get -u github.com/webrpc/webrpc/...
  3. $ make tools
  4. $ make build
  5. $ make test
  6. $ go install ./cmd/webrpc-gen

Writing your own code-generator

Some tips..

  1. Copy gen/golang to gen/<yourtargetlang> and start writing templates
  2. Write an example service and use make build to regenerate
  3. Write tests, TDD is a great approach to confirm things work

Authors

Credits

  • Twirp authors for making twirp. Much of the webrpc-go library comes from the twirp project.
  • gRPC authors, for coming up with the overall architecture and patterns for code-generating the bindings between client and server from a common IDL.

We're hiring!

Our team at https://horizon.io is building Arcadeum.net, a distributed network and platform for blockchain based video games :) built for Ethereum.

If you're passionate about distributed systems, cryptography, privacy, and writing awesome network infrastructure to help power the Arcadeum network, please write to us, hello at arcadeum.net

License

MIT

Comments
  • Tag value with colons and parenthesis doesn't parse anymore

    Tag value with colons and parenthesis doesn't parse anymore

    Hi, I've been evaluating this project and noticed that this kind of tag value doesn't parse anymore:

        - CreatedAt: timestamp
            + go.tag.pg = default**:**now**()**,use_zero
    

    The code seems to be:

    https://github.com/webrpc/webrpc/blob/3a0c9f0ee2f9eeda68b5fade4454c1a11791e94b/schema/ridl/parser.go#L342

    and gives

    parse error: "unexpected token" near ":" (line: 14, col: 30)

  • [WIP] Implement Go language schema parser: webrpc-gen -schema=contract.go

    [WIP] Implement Go language schema parser: webrpc-gen -schema=contract.go

    Goal: Allow WebRPC to parse schema from a Go source file instead of RIDL/JSON.

    I'm seeking early feedback on this from @pkieltyka. I'll start adding test cases and examples in the upcoming days.

    Based on work at https://github.com/vcilabs/webrpc/pull/2

  • []*Users vs. []Users

    []*Users vs. []Users

    This post might me more appropriate for a discussions tab in GitHub, but this project does not have one. My question is if the return type is configurable? Currently, it seems like all slices of structs/message are mapped to slices of pointers? Is this by design? Any way to create slices of structs instead?

  • IDL for webrpc schema

    IDL for webrpc schema

    save this one for v2, but some ideas below.

    for v1, we will just use a json file like: https://github.com/webrpc/webrpc-go/blob/master/_example/proto/example.webrpc.json

    implementing the schema at https://github.com/webrpc/webrpc-go/blob/master/schema/README.md

    note, the data types of webrpc are inspired by protobuf's, Go, TypeScript and WASM :) intended to be serialized as JSON

  • With go1.17+ panic behavior is broken

    With go1.17+ panic behavior is broken

    Discovered an issue today when the webrpc handler has code that panic's or you manually add a panic("stop") the stack trace is wrong/broken and not helpful in debugging.

    I tested today with one of your example apps, running latest webrpc generator.

    With go1.16 or lower, the panic stack trace looks correct with:

     panic: stop
     
     -> main.(*ExampleServiceRPC).GetUser
     ->   /Users/johneberly/go/src/github.com/jeberly/webrpc-golang-basics/main.go:57
    
        main.(*exampleServiceServer).serveGetUserJSON.func1
          /Users/johneberly/go/src/github.com/jeberly/webrpc-golang-basics/example.gen.go:374
    .... <snip>
    

    With go1.17 or higher, panic stack trace seems broken:

    2022/09/28 15:51:06 http: panic serving 127.0.0.1:50847: runtime error: slice bounds out of range [-1:]
    goroutine 4 [running]:
    net/http.(*conn).serve.func1(0x14000117d60)
    	/Users/johneberly/sdk/go1.17/src/net/http/server.go:1801 +0xdc
    panic({0x1027e35a0, 0x1400001a210})
    	/Users/johneberly/sdk/go1.17/src/runtime/panic.go:1052 +0x2ac
    github.com/go-chi/chi/middleware.prettyStack.decorateFuncCallLine({}, {0x1400019c321, 0x21}, 0x1, 0x8)
    	/Users/johneberly/go/src/github.com/jeberly/webrpc-golang-basics/vendor/github.com/go-chi/chi/middleware/recoverer.go:130 +0x508
    github.com/go-chi/chi/middleware.prettyStack.decorateLine({}, {0x1400019c321, 0x21}, 0x1, 0x8)
    ... <snip>
    

    Steps to reproduce:

    1. install and run this example https://github.com/webrpc/webrpc/tree/master/_examples/golang-basics
    2. install go version 1.16 via these instructions https://go.dev/doc/manage-install
    3. run go1.16 run . and then curl -X POST -H"Content-Type: application/json" -d '{"userID":1234}' http://localhost:4242/rpc/ExampleService/GetUser and verify 200 response
    4. add panic("stop") to first line inGetUser` handler, call curl again, verify panic("stop") included in output
    5. install go version 1.17 via these instructions https://go.dev/doc/manage-install
    6. run go1.17 run . and then curl -X POST -H"Content-Type: application/json" -d '{"userID":1234}' http://localhost:4242/rpc/ExampleService/GetUser and verify incorrect panic stack trace with http: panic serving 127.0.0.1:50847: runtime error: slice bounds out of range [-1:]

    Thanks in advance and let me know if I can test anything or I am just missing something.

  • Approach to documentation generator?

    Approach to documentation generator?

    First off, huge thanks to this library!! It looks like exactly what I was looking for after evaluating Twirp, et al. I love that it is simple, and right to the point with little dependencies and easy to grep the source. Keep up the good work.

    Although RIDL is fairly self documenting (good job), has there been any thought into a doc generator with outputs eg. swagger, etc? Just interested in your thoughts/recommendations as I was thinking about potentially writing a generator to build docs we could publish for our API.

  • go.field.type not working as intended?

    go.field.type not working as intended?

    This ridl-code:

    message AlertL
      - alerts: []Alert
        + go.field.type = []AlertDetails
    
    service AppService
      - ListAlerts(limit: int) => (alerts: AlertL)
    

    generates the following go-code:

    type AlertL struct {
    	Alerts []*AlertDetails `json:"alerts"`
    }
    

    I thought it was supposed to result in the the forced "go type" []AlertDetails, but it inserts an extra "*" here. The whole purpose of using the AlertLstructure was to avoid the "slice of pointers" problem, but that was unsuccessful.

    I believe webrpc behaved different in v0.6 with -target=go

    webrpc-gen -schema=./rpc/app.ridl -target=golang -pkg=rpc -server -out=./rpc/app.gen.go

  • gen/ts always fails on empty response

    gen/ts always fails on empty response

    If I have an rpc method like this...

      - Delete(id: string) => ()
    

    ... then the client always fails (after actually succeeding server-side) because the generated code looks like this:

          return buildResponse(res).then(_data => {
            return {
            }
          })
    

    And buildResponse always tries parse the JSON body, which is empty.

    An easy workaround is to just return something from the rpc call:

      - Delete(id: string) => (ok: boolean)
    

    note: My server-side is Go and my client is TS.

  • gen/golang: error on json unmarshalling

    gen/golang: error on json unmarshalling

    I got this error on my program when using a struct as function parameter and then I saw the same situation in the golang-basics example.

    You can reproduce the error by running the example:

    cd _examples/golang-basics
    go run .
    

    And when you try to find a user, it issues a fatal error:

    curl -v -X POST -H"Content-Type: application/json" -v -d '{"q":"123"}' http://localhost:4244/rpc/ExampleService/FindUser
    

    I figured out that the error is in the serveFindUserJSON function on the generated Go file example.gen.go:

    // line 350
    reqContent := struct {
      Arg0 *SearchFilter `json:"s"`
    }{}
    
    // line 362
    err = json.Unmarshal(reqBody, &reqContent)
    

    It's trying to unmarshall Arg0 from the received json, that's why it's crashing.

    To fix it I just added .Arg0 to reqContent:

    err = json.Unmarshal(reqBody, &reqContent.Arg0)
    

    (The crash itself is not caused by this error, it's due to the lack of proper checking on the received parameters at the FindUser function.)

  • webrpc-gen cli v2

    webrpc-gen cli v2

    As part of webrpc v2, I'd like to remove the templates inside of gen/ and instead have them as part of their own repos which would be fetched during the time of code-generation. The webrpc v2 cli would offer just the schema / RPC object tree, and a "gen" sub-package for the methods available for the templates.

    Currently in v1 to generate webrpc code we call: webrpc-gen -schema=example.ridl -target=go -pkg=main -server -client -out=./example.gen.go

    In v2, the -target=X flag can receive a uri (assuming https) to a git repo where it would look for client.tmpl and server.tmpl.

    The command would be: webrpc-gen -schema=example.ridl -target=github.com/webrpc/gen-golang -pkg=main -server -client -out=./example.gen.go

    As a short-hand, we will support -target=X as -target=golang, -target=typescript, etc. and it will by default search https://github.com/webrpc/gen-X for example: https://github.com/webrpc/gen-golang

    The logic for parsing the target would be to check for "/", and if we have any "/"'s we assume this is a URI as otherwise it would just be a webrpc-default target which we'll just prepend the "github.com/webrpc/gen-" to the target and continue. Otherwise we will use the remote target.

    This will be really cool because anyone can fork a generator and tweak it as they like, it it would be very easy for them to add new support for another language.


    TODO

    • [x] Add remote git support for -target flag
    • [x] Pull/fetch git repos remotely, and also cache them locally somewhere, perhaps in ~/.webrpc/
    • [x] Update webrpc/gen package to use a well-defined set of function maps used by the templates
    • [x] Copy golang/typescript/javascript templates and push to respective new repos under github.com/webrpc/gen-XXX
  • gen go/ts: rpc methods with no response value

    gen go/ts: rpc methods with no response value

    presently rpc methods with no response will return a 0 byte body, which is annoying. it should either return an empty object, ie. {}, or we return always a response value..

    ie.

    - SomeMethod(in: string)
    

    or

    - SomeMethod(in: string) => ()
    

    will cause a 0 byte response body..

    for now, the fix is to always return a value.. like - SomeMethod(in: string) => (ok: bool) .. and perhaps we should enforce that, but another approach is to just return an empty body which is okay too I think

  • Flatten request/response arguments (short-hand RIDL syntax)

    Flatten request/response arguments (short-hand RIDL syntax)

    Introduced in Peter's "v2" branch

    • https://github.com/webrpc/webrpc/tree/schema-v2
    • https://github.com/webrpc/webrpc/pull/134
    • https://github.com/webrpc/webrpc/pull/123
    struct FlattenRequest
      - name: string
        + go.tag.db = name
      - amount?: Balance
        + go.tag.db = amount
    
    struct FlattenResponse
      - id: uint64
        + go.field.name = ID
      - count: uint64
        + json = counter
    
    service Another
      - Flatten(FlattenRequest) => (FlattenResponse)
    
  • Alias type

    Alias type

    Introduced in Peter's "v2" branch

    • https://github.com/webrpc/webrpc/tree/schema-v2
    • https://github.com/webrpc/webrpc/pull/134
    • https://github.com/webrpc/webrpc/pull/123
    alias Balance: string
      + go.field.type = BigInt
      + go.tag.db = balance
      + json = b_a_l_a_n_c_e
      
    struct User
      - id: uint64
      - username: string
      - amount: Balance
    
  • webrpc-gen fails to load templates with unknown template function(s)

    webrpc-gen fails to load templates with unknown template function(s)

    failed to load templates from ../webrpc/gen-golang: template: struct.go.tmpl:23: function "trimPrefix" not defined
    

    I thought we'd be able to require specific Template Functions API from within the templates & that's why we have introduced minVersion .WebrpcGenVersion "v0.7.0" function. However, it looks like Go templates look up all the functions up-front and fail early before even executing the template (no matter if the missing function would be executed or not).

    We'll need to support this in some other way, so we have better & user-friendly errors.

  • Proposal: Represent int64 as BigInt in JavaScript/TypeScript

    Proposal: Represent int64 as BigInt in JavaScript/TypeScript

    int64 is too big for JavaScript's Number type (IEEE-754 double-precision floating point).

    JavaScript looses precision on values higher than Number.MAX_SAFE_INTEGER (9007199254740991) and rounds them up. Technically, we could error out in JS runtime, if we notice values bigger than that if we decide to keep Number in JS/TS generators.

    Current workarounds:

    message User
      - id: string
        + go.field.type = int64
        + go.tag.json = id,string
    
    message User
      - id: string
        + go.field.type = prototyp.BigInt # sequence prototyp
    

    Proposal - switch to BigInt

    I think it would make sense to represent int64 as BigInt in JavaScript and TypeScript generators. BigInt looks to be well supported.

    Screen Shot 2022-11-20 at 4 34 17 PM

  • Proposal: Remove

    Proposal: Remove "json" meta for webrpc@v2

    I propose we remove the + json = {CUSTOM_JSON_FIELD_NAME} meta for webrpc v2.

    JSON is the core of webrpc and thus I don't see why we'd need different field names in RIDL vs. in JSON.

    1. Field names over the wire (JSON)

    Instead of being able to "overwrite" RIDL field names with json meta, why don't we simply rely on the RIDL field name itself?

    Example:

    struct User
      - id: uint64
      - FIELD_name: string
    

    would send

    { "user": {"id": 0, "FIELD_name": ""} }
    

    2. Custom field names in TypeScript/JavaScript

    • not supported (aka, same as with json meta)
    • RIDL field name is what you see in JSON, and what you get in TS/JS

    3. A special + json = - value

    See https://github.com/webrpc/webrpc/issues/66 for a related bug report about + json = -

    I believe this special value was added because of Go's json:"-" struct tag, which means "hide" this field in JSON. I think it could be replaced by some new option to "hide" server fields from the API clients.

    Example:

    struct User
      - id: uint64
      - FIELD_name: string
      - privateID: string
        + private = true
    

    would still send

    { "user": {"id": 0, "FIELD_name": ""} }
    

    since the privateID field was "hidden", it would not make it to the generated code for clients. However, the generated server code would still have the privateID field available (Go, Node.js or any other server).

  • v0.8 with schema updates

    v0.8 with schema updates

    new PR replacing https://github.com/webrpc/webrpc/tree/schema-v2

    this is easier then rebasing, but its missing updates in _examples/ which we should copy over from schema-v2 once we update the generator

Package event-driven makes it easy for you to drive events between services
Package event-driven makes it easy for you to drive events between services

Event-Driven Event-driven architecture is a software architecture and model for application design. With an event-driven system, the capture, communic

Apr 20, 2022
Mob-code-server - Mob programming - a software development approach where the whole team works on the same thing
Mob-code-server - Mob programming - a software development approach where the whole team works on the same thing

For those times when you need a ready to use server with a little more horse pow

Feb 2, 2022
The Swiss Army knife for 802.11, BLE and Ethernet networks reconnaissance and MITM attacks.
The Swiss Army knife for 802.11, BLE and Ethernet networks reconnaissance and MITM attacks.

bettercap is a powerful, easily extensible and portable framework written in Go which aims to offer to security researchers, red teamers and reverse e

Jan 3, 2023
A library for working with IP addresses and networks in Go

IPLib I really enjoy Python's ipaddress library and Ruby's ipaddr, I think you can write a lot of neat software if some of the little problems around

Dec 20, 2022
Netmaker is a tool for creating and managing virtual networks
Netmaker is a tool for creating and managing virtual networks

Netmaker is a tool for creating and managing virtual networks. The goal is to make virtual/overlay/mesh networking easy for non-networking people. It should be like clicking a button. Netmaker consists of a server, an agent, and a UI.

Jan 2, 2023
A flexible configuration manager for Wireguard networks
A flexible configuration manager for Wireguard networks

Drago A flexible configuration manager for WireGuard networks Drago is a flexible configuration manager for WireGuard networks which is designed to ma

Jan 7, 2023
Transfer 10Gbps http traffic over 1Gbps networks :)

httpteleport Teleports 10Gbps http traffic over 1Gbps networks. Built on top of fastrpc. Use cases httpteleport may significantly reduce inter-server

Nov 30, 2022
A Lightweight VPN Built on top of Libp2p for Truly Distributed Networks.
A Lightweight VPN Built on top of Libp2p for Truly Distributed Networks.

Hyprspace A Lightweight VPN Built on top of Libp2p for Truly Distributed Networks. demo.mp4 Table of Contents A Bit of Backstory Use Cases A Digital N

Dec 29, 2022
Data source provider for Terraform that interacts with the Solana networks

Terraform Solana Provider Registry Page Requirements Terraform >= 0.13.x Go 1.16.x (for building from source) Example Usage Full provider documentatio

Aug 6, 2022
Mount your podman container into WireGuard networks on spawn

wg-pod A tool to quickly join your podman container/pod into a WireGuard network. Explanation wg-pod wires up the tools ip,route,wg and podman. It cre

Aug 14, 2022
A memory-safe SSH server, focused on listening only on VPN networks such as Tailscale

Features Is tested to work with SCP Integrates well with systemd Quickstart Download binary for your architecture. We only support Linux. If you don't

Jun 10, 2022
Overlay networks based on WebRTC.
Overlay networks based on WebRTC.

weron Overlay networks based on WebRTC. ⚠️ weron has not yet been audited! While we try to make weron as secure as possible, it has not yet undergone

Jan 4, 2023
A sample web API in GO (with GIn) under a domain driven architecture.

Golang Sample API Domain Driven Design Pattern 1. About This sample project presents a custom made domain driven API architecture in Golang using the

Jan 10, 2022
Schema-free, document-oriented streaming database that optimized for monitoring network traffic in real-time

Basenine Schema-free, document-oriented streaming database that optimized for monitoring network traffic in real-time. Featured Aspects Has the fastes

Nov 2, 2022
Mortar is a GO framework/library for building gRPC (and REST) web services.
Mortar is a GO framework/library for building gRPC (and REST) web services.

Mortar Mortar is a GO framework/library for building gRPC (and REST) web services. Mortar has out-of-the-box support for configuration, application me

Dec 26, 2022
A basic sample web-services application using Go and Gin.

Sample application for Go Web Services A very basic web-services application built with go-lang and the Gin Web Framework. Based on https://github.com

Jan 13, 2022
protoc-gen-grpc-gateway-ts is a Typescript client generator for the grpc-gateway project. It generates idiomatic Typescript clients that connect the web frontend and golang backend fronted by grpc-gateway.

protoc-gen-grpc-gateway-ts protoc-gen-grpc-gateway-ts is a Typescript client generator for the grpc-gateway project. It generates idiomatic Typescript

Dec 19, 2022
Jezziki-webapp - Discontinued but finished web app utilizing a golang backend and reactjs frontend

jezziki-webapp discontinued but finished web app utilizing a golang backend and

Feb 12, 2022
Fake server, Consumer Driven Contracts and help with testing performance from one configuration file with zero system dependencies and no coding whatsoever
Fake server, Consumer Driven Contracts and help with testing performance from one configuration file with zero system dependencies and no coding whatsoever

mockingjay server Mockingjay lets you define the contract between a consumer and producer and with just a configuration file you get: A fast to launch

Jan 6, 2023